xref: /sqlite-3.40.0/src/expr.c (revision 4adee20f)
1cce7d176Sdrh /*
2b19a2bc6Sdrh ** 2001 September 15
3cce7d176Sdrh **
4b19a2bc6Sdrh ** The author disclaims copyright to this source code.  In place of
5b19a2bc6Sdrh ** a legal notice, here is a blessing:
6cce7d176Sdrh **
7b19a2bc6Sdrh **    May you do good and not evil.
8b19a2bc6Sdrh **    May you find forgiveness for yourself and forgive others.
9b19a2bc6Sdrh **    May you share freely, never taking more than you give.
10cce7d176Sdrh **
11cce7d176Sdrh *************************************************************************
121ccde15dSdrh ** This file contains routines used for analyzing expressions and
13b19a2bc6Sdrh ** for generating VDBE code that evaluates expressions in SQLite.
14cce7d176Sdrh **
15*4adee20fSdanielk1977 ** $Id: expr.c,v 1.115 2004/05/08 08:23:24 danielk1977 Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
1804738cb9Sdrh #include <ctype.h>
19a2e00042Sdrh 
20a2e00042Sdrh /*
21a76b5dfcSdrh ** Construct a new expression node and return a pointer to it.  Memory
22a76b5dfcSdrh ** for this node is obtained from sqliteMalloc().  The calling function
23a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed.
24a76b5dfcSdrh */
25*4adee20fSdanielk1977 Expr *sqlite3Expr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
26a76b5dfcSdrh   Expr *pNew;
27a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
28a76b5dfcSdrh   if( pNew==0 ){
294efc4754Sdrh     /* When malloc fails, we leak memory from pLeft and pRight */
30a76b5dfcSdrh     return 0;
31a76b5dfcSdrh   }
32a76b5dfcSdrh   pNew->op = op;
33a76b5dfcSdrh   pNew->pLeft = pLeft;
34a76b5dfcSdrh   pNew->pRight = pRight;
35a76b5dfcSdrh   if( pToken ){
364b59ab5eSdrh     assert( pToken->dyn==0 );
37a76b5dfcSdrh     pNew->token = *pToken;
386977fea8Sdrh     pNew->span = *pToken;
39a76b5dfcSdrh   }else{
404efc4754Sdrh     assert( pNew->token.dyn==0 );
414efc4754Sdrh     assert( pNew->token.z==0 );
424efc4754Sdrh     assert( pNew->token.n==0 );
436977fea8Sdrh     if( pLeft && pRight ){
44*4adee20fSdanielk1977       sqlite3ExprSpan(pNew, &pLeft->span, &pRight->span);
456977fea8Sdrh     }else{
466977fea8Sdrh       pNew->span = pNew->token;
476977fea8Sdrh     }
48a76b5dfcSdrh   }
49a76b5dfcSdrh   return pNew;
50a76b5dfcSdrh }
51a76b5dfcSdrh 
52a76b5dfcSdrh /*
536977fea8Sdrh ** Set the Expr.span field of the given expression to span all
54a76b5dfcSdrh ** text between the two given tokens.
55a76b5dfcSdrh */
56*4adee20fSdanielk1977 void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
574efc4754Sdrh   assert( pRight!=0 );
584efc4754Sdrh   assert( pLeft!=0 );
594efc4754Sdrh   /* Note: pExpr might be NULL due to a prior malloc failure */
604efc4754Sdrh   if( pExpr && pRight->z && pLeft->z ){
614b59ab5eSdrh     if( pLeft->dyn==0 && pRight->dyn==0 ){
626977fea8Sdrh       pExpr->span.z = pLeft->z;
636977fea8Sdrh       pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
644b59ab5eSdrh     }else{
656977fea8Sdrh       pExpr->span.z = 0;
664b59ab5eSdrh     }
67a76b5dfcSdrh   }
68a76b5dfcSdrh }
69a76b5dfcSdrh 
70a76b5dfcSdrh /*
71a76b5dfcSdrh ** Construct a new expression node for a function with multiple
72a76b5dfcSdrh ** arguments.
73a76b5dfcSdrh */
74*4adee20fSdanielk1977 Expr *sqlite3ExprFunction(ExprList *pList, Token *pToken){
75a76b5dfcSdrh   Expr *pNew;
76a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
77a76b5dfcSdrh   if( pNew==0 ){
78*4adee20fSdanielk1977     /* sqlite3ExprListDelete(pList); // Leak pList when malloc fails */
79a76b5dfcSdrh     return 0;
80a76b5dfcSdrh   }
81a76b5dfcSdrh   pNew->op = TK_FUNCTION;
82a76b5dfcSdrh   pNew->pList = pList;
83a76b5dfcSdrh   if( pToken ){
844b59ab5eSdrh     assert( pToken->dyn==0 );
85a76b5dfcSdrh     pNew->token = *pToken;
86a76b5dfcSdrh   }else{
87a76b5dfcSdrh     pNew->token.z = 0;
88a76b5dfcSdrh   }
896977fea8Sdrh   pNew->span = pNew->token;
90a76b5dfcSdrh   return pNew;
91a76b5dfcSdrh }
92a76b5dfcSdrh 
93a76b5dfcSdrh /*
94a2e00042Sdrh ** Recursively delete an expression tree.
95a2e00042Sdrh */
96*4adee20fSdanielk1977 void sqlite3ExprDelete(Expr *p){
97a2e00042Sdrh   if( p==0 ) return;
984efc4754Sdrh   if( p->span.dyn ) sqliteFree((char*)p->span.z);
994efc4754Sdrh   if( p->token.dyn ) sqliteFree((char*)p->token.z);
100*4adee20fSdanielk1977   sqlite3ExprDelete(p->pLeft);
101*4adee20fSdanielk1977   sqlite3ExprDelete(p->pRight);
102*4adee20fSdanielk1977   sqlite3ExprListDelete(p->pList);
103*4adee20fSdanielk1977   sqlite3SelectDelete(p->pSelect);
104a2e00042Sdrh   sqliteFree(p);
105a2e00042Sdrh }
106a2e00042Sdrh 
107a76b5dfcSdrh 
108a76b5dfcSdrh /*
109ff78bd2fSdrh ** The following group of routines make deep copies of expressions,
110ff78bd2fSdrh ** expression lists, ID lists, and select statements.  The copies can
111ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines)
112ff78bd2fSdrh ** without effecting the originals.
113ff78bd2fSdrh **
114*4adee20fSdanielk1977 ** The expression list, ID, and source lists return by sqlite3ExprListDup(),
115*4adee20fSdanielk1977 ** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded
116ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines.
117ff78bd2fSdrh **
118ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated.
119ff78bd2fSdrh */
120*4adee20fSdanielk1977 Expr *sqlite3ExprDup(Expr *p){
121ff78bd2fSdrh   Expr *pNew;
122ff78bd2fSdrh   if( p==0 ) return 0;
123fcb78a49Sdrh   pNew = sqliteMallocRaw( sizeof(*p) );
124ff78bd2fSdrh   if( pNew==0 ) return 0;
1253b167c75Sdrh   memcpy(pNew, p, sizeof(*pNew));
1266977fea8Sdrh   if( p->token.z!=0 ){
1274b59ab5eSdrh     pNew->token.z = sqliteStrDup(p->token.z);
1284b59ab5eSdrh     pNew->token.dyn = 1;
1294b59ab5eSdrh   }else{
1304efc4754Sdrh     assert( pNew->token.z==0 );
1314b59ab5eSdrh   }
1326977fea8Sdrh   pNew->span.z = 0;
133*4adee20fSdanielk1977   pNew->pLeft = sqlite3ExprDup(p->pLeft);
134*4adee20fSdanielk1977   pNew->pRight = sqlite3ExprDup(p->pRight);
135*4adee20fSdanielk1977   pNew->pList = sqlite3ExprListDup(p->pList);
136*4adee20fSdanielk1977   pNew->pSelect = sqlite3SelectDup(p->pSelect);
137ff78bd2fSdrh   return pNew;
138ff78bd2fSdrh }
139*4adee20fSdanielk1977 void sqlite3TokenCopy(Token *pTo, Token *pFrom){
1404b59ab5eSdrh   if( pTo->dyn ) sqliteFree((char*)pTo->z);
1414b59ab5eSdrh   if( pFrom->z ){
1424b59ab5eSdrh     pTo->n = pFrom->n;
1434b59ab5eSdrh     pTo->z = sqliteStrNDup(pFrom->z, pFrom->n);
1444b59ab5eSdrh     pTo->dyn = 1;
1454b59ab5eSdrh   }else{
1464b59ab5eSdrh     pTo->z = 0;
1474b59ab5eSdrh   }
1484b59ab5eSdrh }
149*4adee20fSdanielk1977 ExprList *sqlite3ExprListDup(ExprList *p){
150ff78bd2fSdrh   ExprList *pNew;
1513e7bc9caSdrh   struct ExprList_item *pItem;
152ff78bd2fSdrh   int i;
153ff78bd2fSdrh   if( p==0 ) return 0;
154ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
155ff78bd2fSdrh   if( pNew==0 ) return 0;
1564305d103Sdrh   pNew->nExpr = pNew->nAlloc = p->nExpr;
1573e7bc9caSdrh   pNew->a = pItem = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
1581bdd9b57Sdrh   if( pItem==0 ) return 0;  /* Leaks memory after a malloc failure */
1591bdd9b57Sdrh   for(i=0; i<p->nExpr; i++, pItem++){
1604b59ab5eSdrh     Expr *pNewExpr, *pOldExpr;
161*4adee20fSdanielk1977     pItem->pExpr = pNewExpr = sqlite3ExprDup(pOldExpr = p->a[i].pExpr);
1626977fea8Sdrh     if( pOldExpr->span.z!=0 && pNewExpr ){
1636977fea8Sdrh       /* Always make a copy of the span for top-level expressions in the
1644b59ab5eSdrh       ** expression list.  The logic in SELECT processing that determines
1654b59ab5eSdrh       ** the names of columns in the result set needs this information */
166*4adee20fSdanielk1977       sqlite3TokenCopy(&pNewExpr->span, &pOldExpr->span);
1674b59ab5eSdrh     }
1681f3e905cSdrh     assert( pNewExpr==0 || pNewExpr->span.z!=0
1691f3e905cSdrh             || pOldExpr->span.z==0 || sqlite_malloc_failed );
1703e7bc9caSdrh     pItem->zName = sqliteStrDup(p->a[i].zName);
1713e7bc9caSdrh     pItem->sortOrder = p->a[i].sortOrder;
1723e7bc9caSdrh     pItem->isAgg = p->a[i].isAgg;
1733e7bc9caSdrh     pItem->done = 0;
174ff78bd2fSdrh   }
175ff78bd2fSdrh   return pNew;
176ff78bd2fSdrh }
177*4adee20fSdanielk1977 SrcList *sqlite3SrcListDup(SrcList *p){
178ad3cab52Sdrh   SrcList *pNew;
179ad3cab52Sdrh   int i;
180113088ecSdrh   int nByte;
181ad3cab52Sdrh   if( p==0 ) return 0;
182113088ecSdrh   nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0);
1834efc4754Sdrh   pNew = sqliteMallocRaw( nByte );
184ad3cab52Sdrh   if( pNew==0 ) return 0;
1854305d103Sdrh   pNew->nSrc = pNew->nAlloc = p->nSrc;
186ad3cab52Sdrh   for(i=0; i<p->nSrc; i++){
1874efc4754Sdrh     struct SrcList_item *pNewItem = &pNew->a[i];
1884efc4754Sdrh     struct SrcList_item *pOldItem = &p->a[i];
1894efc4754Sdrh     pNewItem->zDatabase = sqliteStrDup(pOldItem->zDatabase);
1904efc4754Sdrh     pNewItem->zName = sqliteStrDup(pOldItem->zName);
1914efc4754Sdrh     pNewItem->zAlias = sqliteStrDup(pOldItem->zAlias);
1924efc4754Sdrh     pNewItem->jointype = pOldItem->jointype;
1934efc4754Sdrh     pNewItem->iCursor = pOldItem->iCursor;
1944efc4754Sdrh     pNewItem->pTab = 0;
195*4adee20fSdanielk1977     pNewItem->pSelect = sqlite3SelectDup(pOldItem->pSelect);
196*4adee20fSdanielk1977     pNewItem->pOn = sqlite3ExprDup(pOldItem->pOn);
197*4adee20fSdanielk1977     pNewItem->pUsing = sqlite3IdListDup(pOldItem->pUsing);
198ad3cab52Sdrh   }
199ad3cab52Sdrh   return pNew;
200ad3cab52Sdrh }
201*4adee20fSdanielk1977 IdList *sqlite3IdListDup(IdList *p){
202ff78bd2fSdrh   IdList *pNew;
203ff78bd2fSdrh   int i;
204ff78bd2fSdrh   if( p==0 ) return 0;
2054efc4754Sdrh   pNew = sqliteMallocRaw( sizeof(*pNew) );
206ff78bd2fSdrh   if( pNew==0 ) return 0;
2074305d103Sdrh   pNew->nId = pNew->nAlloc = p->nId;
2084efc4754Sdrh   pNew->a = sqliteMallocRaw( p->nId*sizeof(p->a[0]) );
209e4697f5eSdrh   if( pNew->a==0 ) return 0;
210ff78bd2fSdrh   for(i=0; i<p->nId; i++){
2114efc4754Sdrh     struct IdList_item *pNewItem = &pNew->a[i];
2124efc4754Sdrh     struct IdList_item *pOldItem = &p->a[i];
2134efc4754Sdrh     pNewItem->zName = sqliteStrDup(pOldItem->zName);
2144efc4754Sdrh     pNewItem->idx = pOldItem->idx;
215ff78bd2fSdrh   }
216ff78bd2fSdrh   return pNew;
217ff78bd2fSdrh }
218*4adee20fSdanielk1977 Select *sqlite3SelectDup(Select *p){
219ff78bd2fSdrh   Select *pNew;
220ff78bd2fSdrh   if( p==0 ) return 0;
2214efc4754Sdrh   pNew = sqliteMallocRaw( sizeof(*p) );
222ff78bd2fSdrh   if( pNew==0 ) return 0;
223ff78bd2fSdrh   pNew->isDistinct = p->isDistinct;
224*4adee20fSdanielk1977   pNew->pEList = sqlite3ExprListDup(p->pEList);
225*4adee20fSdanielk1977   pNew->pSrc = sqlite3SrcListDup(p->pSrc);
226*4adee20fSdanielk1977   pNew->pWhere = sqlite3ExprDup(p->pWhere);
227*4adee20fSdanielk1977   pNew->pGroupBy = sqlite3ExprListDup(p->pGroupBy);
228*4adee20fSdanielk1977   pNew->pHaving = sqlite3ExprDup(p->pHaving);
229*4adee20fSdanielk1977   pNew->pOrderBy = sqlite3ExprListDup(p->pOrderBy);
230ff78bd2fSdrh   pNew->op = p->op;
231*4adee20fSdanielk1977   pNew->pPrior = sqlite3SelectDup(p->pPrior);
232ff78bd2fSdrh   pNew->nLimit = p->nLimit;
233ff78bd2fSdrh   pNew->nOffset = p->nOffset;
234ff78bd2fSdrh   pNew->zSelect = 0;
2357b58daeaSdrh   pNew->iLimit = -1;
2367b58daeaSdrh   pNew->iOffset = -1;
237ff78bd2fSdrh   return pNew;
238ff78bd2fSdrh }
239ff78bd2fSdrh 
240ff78bd2fSdrh 
241ff78bd2fSdrh /*
242a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
243a76b5dfcSdrh ** initially NULL, then create a new expression list.
244a76b5dfcSdrh */
245*4adee20fSdanielk1977 ExprList *sqlite3ExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
246a76b5dfcSdrh   if( pList==0 ){
247a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
248a76b5dfcSdrh     if( pList==0 ){
249*4adee20fSdanielk1977       /* sqlite3ExprDelete(pExpr); // Leak memory if malloc fails */
250a76b5dfcSdrh       return 0;
251a76b5dfcSdrh     }
2524efc4754Sdrh     assert( pList->nAlloc==0 );
253a76b5dfcSdrh   }
2544305d103Sdrh   if( pList->nAlloc<=pList->nExpr ){
2554305d103Sdrh     pList->nAlloc = pList->nAlloc*2 + 4;
2564efc4754Sdrh     pList->a = sqliteRealloc(pList->a, pList->nAlloc*sizeof(pList->a[0]));
2574efc4754Sdrh     if( pList->a==0 ){
258*4adee20fSdanielk1977       /* sqlite3ExprDelete(pExpr); // Leak memory if malloc fails */
2594efc4754Sdrh       pList->nExpr = pList->nAlloc = 0;
260a76b5dfcSdrh       return pList;
261a76b5dfcSdrh     }
262a76b5dfcSdrh   }
2634efc4754Sdrh   assert( pList->a!=0 );
2644efc4754Sdrh   if( pExpr || pName ){
2654efc4754Sdrh     struct ExprList_item *pItem = &pList->a[pList->nExpr++];
2664efc4754Sdrh     memset(pItem, 0, sizeof(*pItem));
2674efc4754Sdrh     pItem->pExpr = pExpr;
268a76b5dfcSdrh     if( pName ){
269*4adee20fSdanielk1977       sqlite3SetNString(&pItem->zName, pName->z, pName->n, 0);
270*4adee20fSdanielk1977       sqlite3Dequote(pItem->zName);
271a76b5dfcSdrh     }
272a76b5dfcSdrh   }
273a76b5dfcSdrh   return pList;
274a76b5dfcSdrh }
275a76b5dfcSdrh 
276a76b5dfcSdrh /*
277a76b5dfcSdrh ** Delete an entire expression list.
278a76b5dfcSdrh */
279*4adee20fSdanielk1977 void sqlite3ExprListDelete(ExprList *pList){
280a76b5dfcSdrh   int i;
281a76b5dfcSdrh   if( pList==0 ) return;
2821bdd9b57Sdrh   assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) );
2831bdd9b57Sdrh   assert( pList->nExpr<=pList->nAlloc );
284a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
285*4adee20fSdanielk1977     sqlite3ExprDelete(pList->a[i].pExpr);
286a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
287a76b5dfcSdrh   }
288a76b5dfcSdrh   sqliteFree(pList->a);
289a76b5dfcSdrh   sqliteFree(pList);
290a76b5dfcSdrh }
291a76b5dfcSdrh 
292a76b5dfcSdrh /*
293fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
294fef5208cSdrh ** and 0 if it involves variables.
2952398937bSdrh **
2962398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc")
2972398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is
2982398937bSdrh ** a constant.
299fef5208cSdrh */
300*4adee20fSdanielk1977 int sqlite3ExprIsConstant(Expr *p){
301fef5208cSdrh   switch( p->op ){
302fef5208cSdrh     case TK_ID:
303967e8b73Sdrh     case TK_COLUMN:
304fef5208cSdrh     case TK_DOT:
3057bdc0c1dSdrh     case TK_FUNCTION:
306fef5208cSdrh       return 0;
3077bdc0c1dSdrh     case TK_NULL:
3082398937bSdrh     case TK_STRING:
3099208643dSdrh     case TK_INTEGER:
3109208643dSdrh     case TK_FLOAT:
31150457896Sdrh     case TK_VARIABLE:
3129208643dSdrh       return 1;
313fef5208cSdrh     default: {
314*4adee20fSdanielk1977       if( p->pLeft && !sqlite3ExprIsConstant(p->pLeft) ) return 0;
315*4adee20fSdanielk1977       if( p->pRight && !sqlite3ExprIsConstant(p->pRight) ) return 0;
316fef5208cSdrh       if( p->pList ){
317fef5208cSdrh         int i;
318fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
319*4adee20fSdanielk1977           if( !sqlite3ExprIsConstant(p->pList->a[i].pExpr) ) return 0;
320fef5208cSdrh         }
321fef5208cSdrh       }
3229208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
323fef5208cSdrh     }
324fef5208cSdrh   }
3259208643dSdrh   return 0;
326fef5208cSdrh }
327fef5208cSdrh 
328fef5208cSdrh /*
329202b2df7Sdrh ** If the given expression codes a constant integer that is small enough
330202b2df7Sdrh ** to fit in a 32-bit integer, return 1 and put the value of the integer
331202b2df7Sdrh ** in *pValue.  If the expression is not an integer or if it is too big
332202b2df7Sdrh ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
333e4de1febSdrh */
334*4adee20fSdanielk1977 int sqlite3ExprIsInteger(Expr *p, int *pValue){
335e4de1febSdrh   switch( p->op ){
336e4de1febSdrh     case TK_INTEGER: {
337*4adee20fSdanielk1977       if( sqlite3FitsIn32Bits(p->token.z) ){
338e4de1febSdrh         *pValue = atoi(p->token.z);
339e4de1febSdrh         return 1;
340e4de1febSdrh       }
341202b2df7Sdrh       break;
342202b2df7Sdrh     }
343e4de1febSdrh     case TK_STRING: {
344bd790ee3Sdrh       const char *z = p->token.z;
345e4de1febSdrh       int n = p->token.n;
346bd790ee3Sdrh       if( n>0 && z[0]=='-' ){ z++; n--; }
347e4de1febSdrh       while( n>0 && *z && isdigit(*z) ){ z++; n--; }
348*4adee20fSdanielk1977       if( n==0 && sqlite3FitsIn32Bits(p->token.z) ){
349e4de1febSdrh         *pValue = atoi(p->token.z);
350e4de1febSdrh         return 1;
351e4de1febSdrh       }
352e4de1febSdrh       break;
353e4de1febSdrh     }
3544b59ab5eSdrh     case TK_UPLUS: {
355*4adee20fSdanielk1977       return sqlite3ExprIsInteger(p->pLeft, pValue);
3564b59ab5eSdrh     }
357e4de1febSdrh     case TK_UMINUS: {
358e4de1febSdrh       int v;
359*4adee20fSdanielk1977       if( sqlite3ExprIsInteger(p->pLeft, &v) ){
360e4de1febSdrh         *pValue = -v;
361e4de1febSdrh         return 1;
362e4de1febSdrh       }
363e4de1febSdrh       break;
364e4de1febSdrh     }
365e4de1febSdrh     default: break;
366e4de1febSdrh   }
367e4de1febSdrh   return 0;
368e4de1febSdrh }
369e4de1febSdrh 
370e4de1febSdrh /*
371c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
372c4a3c779Sdrh */
373*4adee20fSdanielk1977 int sqlite3IsRowid(const char *z){
374*4adee20fSdanielk1977   if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1;
375*4adee20fSdanielk1977   if( sqlite3StrICmp(z, "ROWID")==0 ) return 1;
376*4adee20fSdanielk1977   if( sqlite3StrICmp(z, "OID")==0 ) return 1;
377c4a3c779Sdrh   return 0;
378c4a3c779Sdrh }
379c4a3c779Sdrh 
380c4a3c779Sdrh /*
3818141f61eSdrh ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up
3828141f61eSdrh ** that name in the set of source tables in pSrcList and make the pExpr
3838141f61eSdrh ** expression node refer back to that source column.  The following changes
3848141f61eSdrh ** are made to pExpr:
3858141f61eSdrh **
3868141f61eSdrh **    pExpr->iDb           Set the index in db->aDb[] of the database holding
3878141f61eSdrh **                         the table.
3888141f61eSdrh **    pExpr->iTable        Set to the cursor number for the table obtained
3898141f61eSdrh **                         from pSrcList.
3908141f61eSdrh **    pExpr->iColumn       Set to the column number within the table.
3918141f61eSdrh **    pExpr->dataType      Set to the appropriate data type for the column.
3928141f61eSdrh **    pExpr->op            Set to TK_COLUMN.
3938141f61eSdrh **    pExpr->pLeft         Any expression this points to is deleted
3948141f61eSdrh **    pExpr->pRight        Any expression this points to is deleted.
3958141f61eSdrh **
3968141f61eSdrh ** The pDbToken is the name of the database (the "X").  This value may be
3978141f61eSdrh ** NULL meaning that name is of the form Y.Z or Z.  Any available database
3988141f61eSdrh ** can be used.  The pTableToken is the name of the table (the "Y").  This
3998141f61eSdrh ** value can be NULL if pDbToken is also NULL.  If pTableToken is NULL it
4008141f61eSdrh ** means that the form of the name is Z and that columns from any table
4018141f61eSdrh ** can be used.
4028141f61eSdrh **
4038141f61eSdrh ** If the name cannot be resolved unambiguously, leave an error message
4048141f61eSdrh ** in pParse and return non-zero.  Return zero on success.
4058141f61eSdrh */
4068141f61eSdrh static int lookupName(
4078141f61eSdrh   Parse *pParse,      /* The parsing context */
4088141f61eSdrh   Token *pDbToken,     /* Name of the database containing table, or NULL */
4098141f61eSdrh   Token *pTableToken,  /* Name of table containing column, or NULL */
4108141f61eSdrh   Token *pColumnToken, /* Name of the column. */
4118141f61eSdrh   SrcList *pSrcList,   /* List of tables used to resolve column names */
4128141f61eSdrh   ExprList *pEList,    /* List of expressions used to resolve "AS" */
4138141f61eSdrh   Expr *pExpr          /* Make this EXPR node point to the selected column */
4148141f61eSdrh ){
4158141f61eSdrh   char *zDb = 0;       /* Name of the database.  The "X" in X.Y.Z */
4168141f61eSdrh   char *zTab = 0;      /* Name of the table.  The "Y" in X.Y.Z or Y.Z */
4178141f61eSdrh   char *zCol = 0;      /* Name of the column.  The "Z" */
4188141f61eSdrh   int i, j;            /* Loop counters */
4198141f61eSdrh   int cnt = 0;         /* Number of matching column names */
4208141f61eSdrh   int cntTab = 0;      /* Number of matching table names */
4217e26d750Sdrh   sqlite *db = pParse->db;  /* The database */
4228141f61eSdrh 
4238141f61eSdrh   assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */
4248141f61eSdrh   if( pDbToken && pDbToken->z ){
4258141f61eSdrh     zDb = sqliteStrNDup(pDbToken->z, pDbToken->n);
426*4adee20fSdanielk1977     sqlite3Dequote(zDb);
4278141f61eSdrh   }else{
4288141f61eSdrh     zDb = 0;
4298141f61eSdrh   }
4308141f61eSdrh   if( pTableToken && pTableToken->z ){
4318141f61eSdrh     zTab = sqliteStrNDup(pTableToken->z, pTableToken->n);
432*4adee20fSdanielk1977     sqlite3Dequote(zTab);
4338141f61eSdrh   }else{
4348141f61eSdrh     assert( zDb==0 );
4358141f61eSdrh     zTab = 0;
4368141f61eSdrh   }
4378141f61eSdrh   zCol = sqliteStrNDup(pColumnToken->z, pColumnToken->n);
438*4adee20fSdanielk1977   sqlite3Dequote(zCol);
4398141f61eSdrh   if( sqlite_malloc_failed ){
4408141f61eSdrh     return 1;  /* Leak memory (zDb and zTab) if malloc fails */
4418141f61eSdrh   }
4428141f61eSdrh   assert( zTab==0 || pEList==0 );
4438141f61eSdrh 
4448141f61eSdrh   pExpr->iTable = -1;
4458141f61eSdrh   for(i=0; i<pSrcList->nSrc; i++){
4468141f61eSdrh     struct SrcList_item *pItem = &pSrcList->a[i];
4478141f61eSdrh     Table *pTab = pItem->pTab;
4488141f61eSdrh     Column *pCol;
4498141f61eSdrh 
4508141f61eSdrh     if( pTab==0 ) continue;
4518141f61eSdrh     assert( pTab->nCol>0 );
4528141f61eSdrh     if( zTab ){
4538141f61eSdrh       if( pItem->zAlias ){
4548141f61eSdrh         char *zTabName = pItem->zAlias;
455*4adee20fSdanielk1977         if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
4568141f61eSdrh       }else{
4578141f61eSdrh         char *zTabName = pTab->zName;
458*4adee20fSdanielk1977         if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
459*4adee20fSdanielk1977         if( zDb!=0 && sqlite3StrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){
4608141f61eSdrh           continue;
4618141f61eSdrh         }
4628141f61eSdrh       }
4638141f61eSdrh     }
4648141f61eSdrh     if( 0==(cntTab++) ){
4658141f61eSdrh       pExpr->iTable = pItem->iCursor;
4668141f61eSdrh       pExpr->iDb = pTab->iDb;
4678141f61eSdrh     }
4688141f61eSdrh     for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
469*4adee20fSdanielk1977       if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
4708141f61eSdrh         cnt++;
4718141f61eSdrh         pExpr->iTable = pItem->iCursor;
4728141f61eSdrh         pExpr->iDb = pTab->iDb;
4738141f61eSdrh         /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
4748141f61eSdrh         pExpr->iColumn = j==pTab->iPKey ? -1 : j;
4758141f61eSdrh         pExpr->dataType = pCol->sortOrder & SQLITE_SO_TYPEMASK;
4768141f61eSdrh         break;
4778141f61eSdrh       }
4788141f61eSdrh     }
4798141f61eSdrh   }
4808141f61eSdrh 
4818141f61eSdrh   /* If we have not already resolved the name, then maybe
4828141f61eSdrh   ** it is a new.* or old.* trigger argument reference
4838141f61eSdrh   */
4848141f61eSdrh   if( zDb==0 && zTab!=0 && cnt==0 && pParse->trigStack!=0 ){
4858141f61eSdrh     TriggerStack *pTriggerStack = pParse->trigStack;
4868141f61eSdrh     Table *pTab = 0;
487*4adee20fSdanielk1977     if( pTriggerStack->newIdx != -1 && sqlite3StrICmp("new", zTab) == 0 ){
4888141f61eSdrh       pExpr->iTable = pTriggerStack->newIdx;
4898141f61eSdrh       assert( pTriggerStack->pTab );
4908141f61eSdrh       pTab = pTriggerStack->pTab;
491*4adee20fSdanielk1977     }else if( pTriggerStack->oldIdx != -1 && sqlite3StrICmp("old", zTab) == 0 ){
4928141f61eSdrh       pExpr->iTable = pTriggerStack->oldIdx;
4938141f61eSdrh       assert( pTriggerStack->pTab );
4948141f61eSdrh       pTab = pTriggerStack->pTab;
4958141f61eSdrh     }
4968141f61eSdrh 
4978141f61eSdrh     if( pTab ){
4988141f61eSdrh       int j;
4998141f61eSdrh       Column *pCol = pTab->aCol;
5008141f61eSdrh 
5018141f61eSdrh       pExpr->iDb = pTab->iDb;
5028141f61eSdrh       cntTab++;
5038141f61eSdrh       for(j=0; j < pTab->nCol; j++, pCol++) {
504*4adee20fSdanielk1977         if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
5058141f61eSdrh           cnt++;
5068141f61eSdrh           pExpr->iColumn = j==pTab->iPKey ? -1 : j;
5078141f61eSdrh           pExpr->dataType = pCol->sortOrder & SQLITE_SO_TYPEMASK;
5088141f61eSdrh           break;
5098141f61eSdrh         }
5108141f61eSdrh       }
5118141f61eSdrh     }
5128141f61eSdrh   }
5138141f61eSdrh 
5148141f61eSdrh   /*
5158141f61eSdrh   ** Perhaps the name is a reference to the ROWID
5168141f61eSdrh   */
517*4adee20fSdanielk1977   if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){
5188141f61eSdrh     cnt = 1;
5198141f61eSdrh     pExpr->iColumn = -1;
5208141f61eSdrh     pExpr->dataType = SQLITE_SO_NUM;
5218141f61eSdrh   }
5228141f61eSdrh 
5238141f61eSdrh   /*
5248141f61eSdrh   ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z
5258141f61eSdrh   ** might refer to an result-set alias.  This happens, for example, when
5268141f61eSdrh   ** we are resolving names in the WHERE clause of the following command:
5278141f61eSdrh   **
5288141f61eSdrh   **     SELECT a+b AS x FROM table WHERE x<10;
5298141f61eSdrh   **
5308141f61eSdrh   ** In cases like this, replace pExpr with a copy of the expression that
5318141f61eSdrh   ** forms the result set entry ("a+b" in the example) and return immediately.
5328141f61eSdrh   ** Note that the expression in the result set should have already been
5338141f61eSdrh   ** resolved by the time the WHERE clause is resolved.
5348141f61eSdrh   */
5358141f61eSdrh   if( cnt==0 && pEList!=0 ){
5368141f61eSdrh     for(j=0; j<pEList->nExpr; j++){
5378141f61eSdrh       char *zAs = pEList->a[j].zName;
538*4adee20fSdanielk1977       if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
5398141f61eSdrh         assert( pExpr->pLeft==0 && pExpr->pRight==0 );
5408141f61eSdrh         pExpr->op = TK_AS;
5418141f61eSdrh         pExpr->iColumn = j;
542*4adee20fSdanielk1977         pExpr->pLeft = sqlite3ExprDup(pEList->a[j].pExpr);
5438141f61eSdrh         sqliteFree(zCol);
5448141f61eSdrh         assert( zTab==0 && zDb==0 );
5458141f61eSdrh         return 0;
5468141f61eSdrh       }
5478141f61eSdrh     }
5488141f61eSdrh   }
5498141f61eSdrh 
5508141f61eSdrh   /*
5518141f61eSdrh   ** If X and Y are NULL (in other words if only the column name Z is
5528141f61eSdrh   ** supplied) and the value of Z is enclosed in double-quotes, then
5538141f61eSdrh   ** Z is a string literal if it doesn't match any column names.  In that
5548141f61eSdrh   ** case, we need to return right away and not make any changes to
5558141f61eSdrh   ** pExpr.
5568141f61eSdrh   */
5578141f61eSdrh   if( cnt==0 && zTab==0 && pColumnToken->z[0]=='"' ){
5588141f61eSdrh     sqliteFree(zCol);
5598141f61eSdrh     return 0;
5608141f61eSdrh   }
5618141f61eSdrh 
5628141f61eSdrh   /*
5638141f61eSdrh   ** cnt==0 means there was not match.  cnt>1 means there were two or
5648141f61eSdrh   ** more matches.  Either way, we have an error.
5658141f61eSdrh   */
5668141f61eSdrh   if( cnt!=1 ){
5678141f61eSdrh     char *z = 0;
5688141f61eSdrh     char *zErr;
5698141f61eSdrh     zErr = cnt==0 ? "no such column: %s" : "ambiguous column name: %s";
5708141f61eSdrh     if( zDb ){
571*4adee20fSdanielk1977       sqlite3SetString(&z, zDb, ".", zTab, ".", zCol, 0);
5728141f61eSdrh     }else if( zTab ){
573*4adee20fSdanielk1977       sqlite3SetString(&z, zTab, ".", zCol, 0);
5748141f61eSdrh     }else{
5758141f61eSdrh       z = sqliteStrDup(zCol);
5768141f61eSdrh     }
577*4adee20fSdanielk1977     sqlite3ErrorMsg(pParse, zErr, z);
5788141f61eSdrh     sqliteFree(z);
5798141f61eSdrh   }
5808141f61eSdrh 
5818141f61eSdrh   /* Clean up and return
5828141f61eSdrh   */
5838141f61eSdrh   sqliteFree(zDb);
5848141f61eSdrh   sqliteFree(zTab);
5858141f61eSdrh   sqliteFree(zCol);
586*4adee20fSdanielk1977   sqlite3ExprDelete(pExpr->pLeft);
5878141f61eSdrh   pExpr->pLeft = 0;
588*4adee20fSdanielk1977   sqlite3ExprDelete(pExpr->pRight);
5898141f61eSdrh   pExpr->pRight = 0;
5908141f61eSdrh   pExpr->op = TK_COLUMN;
591*4adee20fSdanielk1977   sqlite3AuthRead(pParse, pExpr, pSrcList);
5928141f61eSdrh   return cnt!=1;
5938141f61eSdrh }
5948141f61eSdrh 
5958141f61eSdrh /*
596cce7d176Sdrh ** This routine walks an expression tree and resolves references to
597967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
598aacc543eSdrh ** index to the table in the table list and a column offset.  The
599aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
600aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
601832508b7Sdrh ** plus the "base" value.  The base value will ultimately become the
602aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
603aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
604aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
605aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
606aacc543eSdrh ** alias for ROWID.
60719a775c2Sdrh **
608fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
609fef5208cSdrh ** forms:
610fef5208cSdrh **
611fef5208cSdrh **           expr IN (exprlist)
612fef5208cSdrh ** and
613fef5208cSdrh **           expr IN (SELECT ...)
614fef5208cSdrh **
615fef5208cSdrh ** The first form is handled by creating a set holding the list
616fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
617fef5208cSdrh ** a temporary table.
618fef5208cSdrh **
619fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
62019a775c2Sdrh ** If it finds any, it generates code to write the value of that select
62119a775c2Sdrh ** into a memory cell.
622cce7d176Sdrh **
623967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
624cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
625cce7d176Sdrh */
626*4adee20fSdanielk1977 int sqlite3ExprResolveIds(
627a2e00042Sdrh   Parse *pParse,     /* The parser context */
6288141f61eSdrh   SrcList *pSrcList, /* List of tables used to resolve column names */
629a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
630a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
631a2e00042Sdrh ){
6326a3ea0e6Sdrh   int i;
6336a3ea0e6Sdrh 
6348141f61eSdrh   if( pExpr==0 || pSrcList==0 ) return 0;
6358141f61eSdrh   for(i=0; i<pSrcList->nSrc; i++){
6368141f61eSdrh     assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab );
6376a3ea0e6Sdrh   }
638cce7d176Sdrh   switch( pExpr->op ){
6392398937bSdrh     /* Double-quoted strings (ex: "abc") are used as identifiers if
6402398937bSdrh     ** possible.  Otherwise they remain as strings.  Single-quoted
6412398937bSdrh     ** strings (ex: 'abc') are always string literals.
6422398937bSdrh     */
6432398937bSdrh     case TK_STRING: {
6442398937bSdrh       if( pExpr->token.z[0]=='\'' ) break;
6452398937bSdrh       /* Fall thru into the TK_ID case if this is a double-quoted string */
6462398937bSdrh     }
6478141f61eSdrh     /* A lone identifier is the name of a columnd.
648a2e00042Sdrh     */
649cce7d176Sdrh     case TK_ID: {
6508141f61eSdrh       if( lookupName(pParse, 0, 0, &pExpr->token, pSrcList, pEList, pExpr) ){
651cce7d176Sdrh         return 1;
652ed6c8671Sdrh       }
653cce7d176Sdrh       break;
654cce7d176Sdrh     }
655cce7d176Sdrh 
656d24cc427Sdrh     /* A table name and column name:     ID.ID
657d24cc427Sdrh     ** Or a database, table and column:  ID.ID.ID
658d24cc427Sdrh     */
659cce7d176Sdrh     case TK_DOT: {
6608141f61eSdrh       Token *pColumn;
6618141f61eSdrh       Token *pTable;
6628141f61eSdrh       Token *pDb;
6638141f61eSdrh       Expr *pRight;
664cce7d176Sdrh 
665cce7d176Sdrh       pRight = pExpr->pRight;
666d24cc427Sdrh       if( pRight->op==TK_ID ){
6678141f61eSdrh         pDb = 0;
6688141f61eSdrh         pTable = &pExpr->pLeft->token;
6698141f61eSdrh         pColumn = &pRight->token;
670d24cc427Sdrh       }else{
6718141f61eSdrh         assert( pRight->op==TK_DOT );
6728141f61eSdrh         pDb = &pExpr->pLeft->token;
6738141f61eSdrh         pTable = &pRight->pLeft->token;
6748141f61eSdrh         pColumn = &pRight->pRight->token;
675d24cc427Sdrh       }
6768141f61eSdrh       if( lookupName(pParse, pDb, pTable, pColumn, pSrcList, 0, pExpr) ){
677daffd0e5Sdrh         return 1;
678daffd0e5Sdrh       }
679cce7d176Sdrh       break;
680cce7d176Sdrh     }
681cce7d176Sdrh 
682fef5208cSdrh     case TK_IN: {
683*4adee20fSdanielk1977       Vdbe *v = sqlite3GetVdbe(pParse);
684fef5208cSdrh       if( v==0 ) return 1;
685*4adee20fSdanielk1977       if( sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){
686cfab11bcSdrh         return 1;
687cfab11bcSdrh       }
688fef5208cSdrh       if( pExpr->pSelect ){
689fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
690fef5208cSdrh         **
691fef5208cSdrh         ** Generate code to write the results of the select into a temporary
6924794b980Sdrh         ** table.  The cursor number of the temporary table has already
693*4adee20fSdanielk1977         ** been put in iTable by sqlite3ExprResolveInSelect().
694fef5208cSdrh         */
695832508b7Sdrh         pExpr->iTable = pParse->nTab++;
696*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
697*4adee20fSdanielk1977         sqlite3Select(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0);
698fef5208cSdrh       }else if( pExpr->pList ){
699fef5208cSdrh         /* Case 2:     expr IN (exprlist)
700fef5208cSdrh         **
701fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
702fef5208cSdrh         ** in iTable.
703fef5208cSdrh         */
704fef5208cSdrh         int i, iSet;
705fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
706fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
707*4adee20fSdanielk1977           if( !sqlite3ExprIsConstant(pE2) ){
708*4adee20fSdanielk1977             sqlite3ErrorMsg(pParse,
709da93d238Sdrh               "right-hand side of IN operator must be constant");
710fef5208cSdrh             return 1;
711fef5208cSdrh           }
712*4adee20fSdanielk1977           if( sqlite3ExprCheck(pParse, pE2, 0, 0) ){
7134794b980Sdrh             return 1;
7144794b980Sdrh           }
715fef5208cSdrh         }
716fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
717fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
718fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
719fef5208cSdrh           switch( pE2->op ){
720fef5208cSdrh             case TK_FLOAT:
721fef5208cSdrh             case TK_INTEGER:
722fef5208cSdrh             case TK_STRING: {
723701a0aebSdrh               int addr;
724a76b5dfcSdrh               assert( pE2->token.z );
725*4adee20fSdanielk1977               addr = sqlite3VdbeOp3(v, OP_SetInsert, iSet, 0,
726701a0aebSdrh                                   pE2->token.z, pE2->token.n);
727*4adee20fSdanielk1977               sqlite3VdbeDequoteP3(v, addr);
728fef5208cSdrh               break;
729fef5208cSdrh             }
730fef5208cSdrh             default: {
731*4adee20fSdanielk1977               sqlite3ExprCode(pParse, pE2);
732*4adee20fSdanielk1977               sqlite3VdbeAddOp(v, OP_SetInsert, iSet, 0);
733fef5208cSdrh               break;
734fef5208cSdrh             }
735fef5208cSdrh           }
736fef5208cSdrh         }
737fef5208cSdrh       }
738cfab11bcSdrh       break;
739fef5208cSdrh     }
740fef5208cSdrh 
74119a775c2Sdrh     case TK_SELECT: {
742fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
743fef5208cSdrh       ** value of this select in a memory cell and record the number
744967e8b73Sdrh       ** of the memory cell in iColumn.
745fef5208cSdrh       */
746967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
747*4adee20fSdanielk1977       if( sqlite3Select(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
74819a775c2Sdrh         return 1;
74919a775c2Sdrh       }
75019a775c2Sdrh       break;
75119a775c2Sdrh     }
75219a775c2Sdrh 
753cce7d176Sdrh     /* For all else, just recursively walk the tree */
754cce7d176Sdrh     default: {
755cce7d176Sdrh       if( pExpr->pLeft
756*4adee20fSdanielk1977       && sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){
757cce7d176Sdrh         return 1;
758cce7d176Sdrh       }
759cce7d176Sdrh       if( pExpr->pRight
760*4adee20fSdanielk1977       && sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pRight) ){
761cce7d176Sdrh         return 1;
762cce7d176Sdrh       }
763cce7d176Sdrh       if( pExpr->pList ){
764cce7d176Sdrh         int i;
765cce7d176Sdrh         ExprList *pList = pExpr->pList;
766cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
767832508b7Sdrh           Expr *pArg = pList->a[i].pExpr;
768*4adee20fSdanielk1977           if( sqlite3ExprResolveIds(pParse, pSrcList, pEList, pArg) ){
769cce7d176Sdrh             return 1;
770cce7d176Sdrh           }
771cce7d176Sdrh         }
772cce7d176Sdrh       }
773cce7d176Sdrh     }
774cce7d176Sdrh   }
775cce7d176Sdrh   return 0;
776cce7d176Sdrh }
777cce7d176Sdrh 
778cce7d176Sdrh /*
7794b59ab5eSdrh ** pExpr is a node that defines a function of some kind.  It might
7804b59ab5eSdrh ** be a syntactic function like "count(x)" or it might be a function
7814b59ab5eSdrh ** that implements an operator, like "a LIKE b".
7824b59ab5eSdrh **
7834b59ab5eSdrh ** This routine makes *pzName point to the name of the function and
7844b59ab5eSdrh ** *pnName hold the number of characters in the function name.
7854b59ab5eSdrh */
7864b59ab5eSdrh static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){
7874b59ab5eSdrh   switch( pExpr->op ){
7884b59ab5eSdrh     case TK_FUNCTION: {
7894b59ab5eSdrh       *pzName = pExpr->token.z;
7906977fea8Sdrh       *pnName = pExpr->token.n;
7914b59ab5eSdrh       break;
7924b59ab5eSdrh     }
7934b59ab5eSdrh     case TK_LIKE: {
7944b59ab5eSdrh       *pzName = "like";
7954b59ab5eSdrh       *pnName = 4;
7964b59ab5eSdrh       break;
7974b59ab5eSdrh     }
7984b59ab5eSdrh     case TK_GLOB: {
7994b59ab5eSdrh       *pzName = "glob";
8004b59ab5eSdrh       *pnName = 4;
8014b59ab5eSdrh       break;
8024b59ab5eSdrh     }
8034b59ab5eSdrh     default: {
8044b59ab5eSdrh       *pzName = "can't happen";
8054b59ab5eSdrh       *pnName = 12;
8064b59ab5eSdrh       break;
8074b59ab5eSdrh     }
8084b59ab5eSdrh   }
8094b59ab5eSdrh }
8104b59ab5eSdrh 
8114b59ab5eSdrh /*
812cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
813cce7d176Sdrh ** function names are recognized and all functions have the correct
814cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
815cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
816cce7d176Sdrh **
817cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
818cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
819cce7d176Sdrh */
820*4adee20fSdanielk1977 int sqlite3ExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
821cce7d176Sdrh   int nErr = 0;
822cce7d176Sdrh   if( pExpr==0 ) return 0;
823cce7d176Sdrh   switch( pExpr->op ){
8244b59ab5eSdrh     case TK_GLOB:
8254b59ab5eSdrh     case TK_LIKE:
826cce7d176Sdrh     case TK_FUNCTION: {
827c9b84a1fSdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;  /* Number of arguments */
828c9b84a1fSdrh       int no_such_func = 0;       /* True if no such function exists */
829c9b84a1fSdrh       int wrong_num_args = 0;     /* True if wrong number of arguments */
830c9b84a1fSdrh       int is_agg = 0;             /* True if is an aggregate function */
831cce7d176Sdrh       int i;
8324b59ab5eSdrh       int nId;                    /* Number of characters in function name */
8334b59ab5eSdrh       const char *zId;            /* The function name. */
8340bce8354Sdrh       FuncDef *pDef;
8350bce8354Sdrh 
8364b59ab5eSdrh       getFunctionName(pExpr, &zId, &nId);
837*4adee20fSdanielk1977       pDef = sqlite3FindFunction(pParse->db, zId, nId, n, 0);
8380bce8354Sdrh       if( pDef==0 ){
839*4adee20fSdanielk1977         pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, 0);
8400bce8354Sdrh         if( pDef==0 ){
841cce7d176Sdrh           no_such_func = 1;
8428e0a2f90Sdrh         }else{
8438e0a2f90Sdrh           wrong_num_args = 1;
8448e0a2f90Sdrh         }
8458e0a2f90Sdrh       }else{
8460bce8354Sdrh         is_agg = pDef->xFunc==0;
847cce7d176Sdrh       }
8488e0a2f90Sdrh       if( is_agg && !allowAgg ){
849*4adee20fSdanielk1977         sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId, zId);
8508e0a2f90Sdrh         nErr++;
8518e0a2f90Sdrh         is_agg = 0;
8528e0a2f90Sdrh       }else if( no_such_func ){
853*4adee20fSdanielk1977         sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
854cce7d176Sdrh         nErr++;
8558e0a2f90Sdrh       }else if( wrong_num_args ){
856*4adee20fSdanielk1977         sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
857f7a9e1acSdrh              nId, zId);
8588e0a2f90Sdrh         nErr++;
859cce7d176Sdrh       }
860f7a9e1acSdrh       if( is_agg ){
861f7a9e1acSdrh         pExpr->op = TK_AGG_FUNCTION;
862f7a9e1acSdrh         if( pIsAgg ) *pIsAgg = 1;
863f7a9e1acSdrh       }
864cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
865*4adee20fSdanielk1977         nErr = sqlite3ExprCheck(pParse, pExpr->pList->a[i].pExpr,
8664cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
867cce7d176Sdrh       }
868c9b84a1fSdrh       if( pDef==0 ){
869268380caSdrh         /* Already reported an error */
870c9b84a1fSdrh       }else if( pDef->dataType>=0 ){
871c9b84a1fSdrh         if( pDef->dataType<n ){
872c9b84a1fSdrh           pExpr->dataType =
873*4adee20fSdanielk1977              sqlite3ExprType(pExpr->pList->a[pDef->dataType].pExpr);
874c9b84a1fSdrh         }else{
875c9b84a1fSdrh           pExpr->dataType = SQLITE_SO_NUM;
876c9b84a1fSdrh         }
877c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_ARGS ){
878c9b84a1fSdrh         pDef->dataType = SQLITE_SO_TEXT;
879c9b84a1fSdrh         for(i=0; i<n; i++){
880*4adee20fSdanielk1977           if( sqlite3ExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){
881c9b84a1fSdrh             pExpr->dataType = SQLITE_SO_NUM;
882c9b84a1fSdrh             break;
883c9b84a1fSdrh           }
884c9b84a1fSdrh         }
885c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_NUMERIC ){
886c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
887c9b84a1fSdrh       }else{
888c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_TEXT;
889c9b84a1fSdrh       }
890cce7d176Sdrh     }
891cce7d176Sdrh     default: {
892cce7d176Sdrh       if( pExpr->pLeft ){
893*4adee20fSdanielk1977         nErr = sqlite3ExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
894cce7d176Sdrh       }
895cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
896*4adee20fSdanielk1977         nErr = sqlite3ExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
897cce7d176Sdrh       }
898fef5208cSdrh       if( nErr==0 && pExpr->pList ){
899fef5208cSdrh         int n = pExpr->pList->nExpr;
900fef5208cSdrh         int i;
901fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
9022282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
903*4adee20fSdanielk1977           nErr = sqlite3ExprCheck(pParse, pE2, allowAgg, pIsAgg);
904fef5208cSdrh         }
905fef5208cSdrh       }
906cce7d176Sdrh       break;
907cce7d176Sdrh     }
908cce7d176Sdrh   }
909cce7d176Sdrh   return nErr;
910cce7d176Sdrh }
911cce7d176Sdrh 
912cce7d176Sdrh /*
913c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the
914c9b84a1fSdrh ** given expression should sort as numeric values or as text.
915c9b84a1fSdrh **
916*4adee20fSdanielk1977 ** The sqlite3ExprResolveIds() and sqlite3ExprCheck() routines must have
917c9b84a1fSdrh ** both been called on the expression before it is passed to this routine.
918c9b84a1fSdrh */
919*4adee20fSdanielk1977 int sqlite3ExprType(Expr *p){
920c9b84a1fSdrh   if( p==0 ) return SQLITE_SO_NUM;
921c9b84a1fSdrh   while( p ) switch( p->op ){
922c9b84a1fSdrh     case TK_PLUS:
923c9b84a1fSdrh     case TK_MINUS:
924c9b84a1fSdrh     case TK_STAR:
925c9b84a1fSdrh     case TK_SLASH:
926c9b84a1fSdrh     case TK_AND:
927c9b84a1fSdrh     case TK_OR:
928c9b84a1fSdrh     case TK_ISNULL:
929c9b84a1fSdrh     case TK_NOTNULL:
930c9b84a1fSdrh     case TK_NOT:
931c9b84a1fSdrh     case TK_UMINUS:
9324b59ab5eSdrh     case TK_UPLUS:
933c9b84a1fSdrh     case TK_BITAND:
934c9b84a1fSdrh     case TK_BITOR:
935c9b84a1fSdrh     case TK_BITNOT:
936c9b84a1fSdrh     case TK_LSHIFT:
937c9b84a1fSdrh     case TK_RSHIFT:
938c9b84a1fSdrh     case TK_REM:
939c9b84a1fSdrh     case TK_INTEGER:
940c9b84a1fSdrh     case TK_FLOAT:
941c9b84a1fSdrh     case TK_IN:
942c9b84a1fSdrh     case TK_BETWEEN:
9434b59ab5eSdrh     case TK_GLOB:
9444b59ab5eSdrh     case TK_LIKE:
945c9b84a1fSdrh       return SQLITE_SO_NUM;
946c9b84a1fSdrh 
947c9b84a1fSdrh     case TK_STRING:
948c9b84a1fSdrh     case TK_NULL:
949c9b84a1fSdrh     case TK_CONCAT:
95050457896Sdrh     case TK_VARIABLE:
951c9b84a1fSdrh       return SQLITE_SO_TEXT;
952c9b84a1fSdrh 
953c9b84a1fSdrh     case TK_LT:
954c9b84a1fSdrh     case TK_LE:
955c9b84a1fSdrh     case TK_GT:
956c9b84a1fSdrh     case TK_GE:
957c9b84a1fSdrh     case TK_NE:
958c9b84a1fSdrh     case TK_EQ:
959*4adee20fSdanielk1977       if( sqlite3ExprType(p->pLeft)==SQLITE_SO_NUM ){
960c9b84a1fSdrh         return SQLITE_SO_NUM;
961c9b84a1fSdrh       }
962c9b84a1fSdrh       p = p->pRight;
963c9b84a1fSdrh       break;
964c9b84a1fSdrh 
965c9b84a1fSdrh     case TK_AS:
966c9b84a1fSdrh       p = p->pLeft;
967c9b84a1fSdrh       break;
968c9b84a1fSdrh 
969c9b84a1fSdrh     case TK_COLUMN:
970c9b84a1fSdrh     case TK_FUNCTION:
971c9b84a1fSdrh     case TK_AGG_FUNCTION:
972c9b84a1fSdrh       return p->dataType;
973c9b84a1fSdrh 
974c9b84a1fSdrh     case TK_SELECT:
975c9b84a1fSdrh       assert( p->pSelect );
976c9b84a1fSdrh       assert( p->pSelect->pEList );
977c9b84a1fSdrh       assert( p->pSelect->pEList->nExpr>0 );
978c9b84a1fSdrh       p = p->pSelect->pEList->a[0].pExpr;
979c9b84a1fSdrh       break;
980c9b84a1fSdrh 
981b1363206Sdrh     case TK_CASE: {
982*4adee20fSdanielk1977       if( p->pRight && sqlite3ExprType(p->pRight)==SQLITE_SO_NUM ){
983b1363206Sdrh         return SQLITE_SO_NUM;
984b1363206Sdrh       }
985b1363206Sdrh       if( p->pList ){
986b1363206Sdrh         int i;
987b1363206Sdrh         ExprList *pList = p->pList;
988b1363206Sdrh         for(i=1; i<pList->nExpr; i+=2){
989*4adee20fSdanielk1977           if( sqlite3ExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){
990b1363206Sdrh             return SQLITE_SO_NUM;
991b1363206Sdrh           }
992b1363206Sdrh         }
993b1363206Sdrh       }
994b1363206Sdrh       return SQLITE_SO_TEXT;
995b1363206Sdrh     }
996b1363206Sdrh 
997c9b84a1fSdrh     default:
998c9b84a1fSdrh       assert( p->op==TK_ABORT );  /* Can't Happen */
999c9b84a1fSdrh       break;
1000c9b84a1fSdrh   }
1001c9b84a1fSdrh   return SQLITE_SO_NUM;
1002c9b84a1fSdrh }
1003c9b84a1fSdrh 
1004c9b84a1fSdrh /*
1005cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
10061ccde15dSdrh ** expression and leave the result on the top of stack.
1007cce7d176Sdrh */
1008*4adee20fSdanielk1977 void sqlite3ExprCode(Parse *pParse, Expr *pExpr){
1009cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1010cce7d176Sdrh   int op;
1011daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1012cce7d176Sdrh   switch( pExpr->op ){
1013cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
1014cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
1015cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
1016cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
1017cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
1018cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
1019cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
1020cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
1021cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
1022cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
1023cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
1024cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
1025cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
1026cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
1027cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
1028cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
1029bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
1030bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
1031bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
1032bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
1033bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
1034bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
1035cce7d176Sdrh     default: break;
1036cce7d176Sdrh   }
1037cce7d176Sdrh   switch( pExpr->op ){
1038967e8b73Sdrh     case TK_COLUMN: {
10392282792aSdrh       if( pParse->useAgg ){
1040*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
1041c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
1042*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
1043c4a3c779Sdrh       }else{
1044*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
10452282792aSdrh       }
1046cce7d176Sdrh       break;
1047cce7d176Sdrh     }
104851e9a445Sdrh     case TK_STRING:
104951e9a445Sdrh     case TK_FLOAT:
1050cce7d176Sdrh     case TK_INTEGER: {
1051*4adee20fSdanielk1977       if( pExpr->op==TK_INTEGER && sqlite3FitsIn32Bits(pExpr->token.z) ){
1052*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0);
105351e9a445Sdrh       }else{
1054*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_String, 0, 0);
105551e9a445Sdrh       }
1056a76b5dfcSdrh       assert( pExpr->token.z );
1057*4adee20fSdanielk1977       sqlite3VdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
1058*4adee20fSdanielk1977       sqlite3VdbeDequoteP3(v, -1);
1059cce7d176Sdrh       break;
1060cce7d176Sdrh     }
1061cce7d176Sdrh     case TK_NULL: {
1062*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_String, 0, 0);
1063cce7d176Sdrh       break;
1064cce7d176Sdrh     }
106550457896Sdrh     case TK_VARIABLE: {
1066*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Variable, pExpr->iTable, 0);
106750457896Sdrh       break;
106850457896Sdrh     }
1069c9b84a1fSdrh     case TK_LT:
1070c9b84a1fSdrh     case TK_LE:
1071c9b84a1fSdrh     case TK_GT:
1072c9b84a1fSdrh     case TK_GE:
1073c9b84a1fSdrh     case TK_NE:
1074c9b84a1fSdrh     case TK_EQ: {
1075*4adee20fSdanielk1977       if( pParse->db->file_format>=4 && sqlite3ExprType(pExpr)==SQLITE_SO_TEXT ){
1076c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1077c9b84a1fSdrh       }
1078c9b84a1fSdrh       /* Fall through into the next case */
1079c9b84a1fSdrh     }
1080cce7d176Sdrh     case TK_AND:
1081cce7d176Sdrh     case TK_OR:
1082cce7d176Sdrh     case TK_PLUS:
1083cce7d176Sdrh     case TK_STAR:
1084cce7d176Sdrh     case TK_MINUS:
1085bf4133cbSdrh     case TK_REM:
1086bf4133cbSdrh     case TK_BITAND:
1087bf4133cbSdrh     case TK_BITOR:
1088c9b84a1fSdrh     case TK_SLASH: {
1089*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1090*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pRight);
1091*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, 0, 0);
1092cce7d176Sdrh       break;
1093cce7d176Sdrh     }
1094bf4133cbSdrh     case TK_LSHIFT:
1095bf4133cbSdrh     case TK_RSHIFT: {
1096*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pRight);
1097*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1098*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, 0, 0);
1099bf4133cbSdrh       break;
1100bf4133cbSdrh     }
11010040077dSdrh     case TK_CONCAT: {
1102*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1103*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pRight);
1104*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Concat, 2, 0);
11050040077dSdrh       break;
11060040077dSdrh     }
1107cce7d176Sdrh     case TK_UMINUS: {
11086e142f54Sdrh       assert( pExpr->pLeft );
11097a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
11106e142f54Sdrh         Token *p = &pExpr->pLeft->token;
11116e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
11126e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
1113*4adee20fSdanielk1977         if( pExpr->pLeft->op==TK_INTEGER && sqlite3FitsIn32Bits(z) ){
1114*4adee20fSdanielk1977           sqlite3VdbeAddOp(v, OP_Integer, atoi(z), 0);
1115e6840900Sdrh         }else{
1116*4adee20fSdanielk1977           sqlite3VdbeAddOp(v, OP_String, 0, 0);
1117e6840900Sdrh         }
1118*4adee20fSdanielk1977         sqlite3VdbeChangeP3(v, -1, z, p->n+1);
11196e142f54Sdrh         sqliteFree(z);
11206e142f54Sdrh         break;
11216e142f54Sdrh       }
11221ccde15dSdrh       /* Fall through into TK_NOT */
11236e142f54Sdrh     }
1124bf4133cbSdrh     case TK_BITNOT:
11256e142f54Sdrh     case TK_NOT: {
1126*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1127*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, 0, 0);
1128cce7d176Sdrh       break;
1129cce7d176Sdrh     }
1130cce7d176Sdrh     case TK_ISNULL:
1131cce7d176Sdrh     case TK_NOTNULL: {
1132cce7d176Sdrh       int dest;
1133*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Integer, 1, 0);
1134*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1135*4adee20fSdanielk1977       dest = sqlite3VdbeCurrentAddr(v) + 2;
1136*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, 1, dest);
1137*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_AddImm, -1, 0);
1138cce7d176Sdrh       break;
1139cce7d176Sdrh     }
11402282792aSdrh     case TK_AGG_FUNCTION: {
1141*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
11422282792aSdrh       break;
11432282792aSdrh     }
11444b59ab5eSdrh     case TK_GLOB:
11454b59ab5eSdrh     case TK_LIKE:
1146cce7d176Sdrh     case TK_FUNCTION: {
1147cce7d176Sdrh       ExprList *pList = pExpr->pList;
114889425d5eSdrh       int nExpr = pList ? pList->nExpr : 0;
11490bce8354Sdrh       FuncDef *pDef;
11504b59ab5eSdrh       int nId;
11514b59ab5eSdrh       const char *zId;
11524b59ab5eSdrh       getFunctionName(pExpr, &zId, &nId);
1153*4adee20fSdanielk1977       pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, 0);
11540bce8354Sdrh       assert( pDef!=0 );
1155*4adee20fSdanielk1977       nExpr = sqlite3ExprCodeExprList(pParse, pList, pDef->includeTypes);
1156*4adee20fSdanielk1977       sqlite3VdbeOp3(v, OP_Function, nExpr, 0, (char*)pDef, P3_POINTER);
11576ec2733bSdrh       break;
11586ec2733bSdrh     }
115919a775c2Sdrh     case TK_SELECT: {
1160*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
116119a775c2Sdrh       break;
116219a775c2Sdrh     }
1163fef5208cSdrh     case TK_IN: {
1164fef5208cSdrh       int addr;
1165*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Integer, 1, 0);
1166*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1167*4adee20fSdanielk1977       addr = sqlite3VdbeCurrentAddr(v);
1168*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+4);
1169*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Pop, 2, 0);
1170*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_String, 0, 0);
1171*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Goto, 0, addr+6);
1172fef5208cSdrh       if( pExpr->pSelect ){
1173*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, addr+6);
1174fef5208cSdrh       }else{
1175*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6);
1176fef5208cSdrh       }
1177*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_AddImm, -1, 0);
1178fef5208cSdrh       break;
1179fef5208cSdrh     }
1180fef5208cSdrh     case TK_BETWEEN: {
1181*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1182*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
1183*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr);
1184*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Ge, 0, 0);
1185*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Pull, 1, 0);
1186*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr);
1187*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Le, 0, 0);
1188*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_And, 0, 0);
1189fef5208cSdrh       break;
1190fef5208cSdrh     }
119151e9a445Sdrh     case TK_UPLUS:
1192a2e00042Sdrh     case TK_AS: {
1193*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1194a2e00042Sdrh       break;
1195a2e00042Sdrh     }
119617a7f8ddSdrh     case TK_CASE: {
119717a7f8ddSdrh       int expr_end_label;
1198f5905aa7Sdrh       int jumpInst;
1199f5905aa7Sdrh       int addr;
1200f5905aa7Sdrh       int nExpr;
120117a7f8ddSdrh       int i;
120217a7f8ddSdrh 
120317a7f8ddSdrh       assert(pExpr->pList);
120417a7f8ddSdrh       assert((pExpr->pList->nExpr % 2) == 0);
120517a7f8ddSdrh       assert(pExpr->pList->nExpr > 0);
1206f5905aa7Sdrh       nExpr = pExpr->pList->nExpr;
1207*4adee20fSdanielk1977       expr_end_label = sqlite3VdbeMakeLabel(v);
120817a7f8ddSdrh       if( pExpr->pLeft ){
1209*4adee20fSdanielk1977         sqlite3ExprCode(pParse, pExpr->pLeft);
1210cce7d176Sdrh       }
1211f5905aa7Sdrh       for(i=0; i<nExpr; i=i+2){
1212*4adee20fSdanielk1977         sqlite3ExprCode(pParse, pExpr->pList->a[i].pExpr);
121317a7f8ddSdrh         if( pExpr->pLeft ){
1214*4adee20fSdanielk1977           sqlite3VdbeAddOp(v, OP_Dup, 1, 1);
1215*4adee20fSdanielk1977           jumpInst = sqlite3VdbeAddOp(v, OP_Ne, 1, 0);
1216*4adee20fSdanielk1977           sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
1217f5905aa7Sdrh         }else{
1218*4adee20fSdanielk1977           jumpInst = sqlite3VdbeAddOp(v, OP_IfNot, 1, 0);
121917a7f8ddSdrh         }
1220*4adee20fSdanielk1977         sqlite3ExprCode(pParse, pExpr->pList->a[i+1].pExpr);
1221*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_Goto, 0, expr_end_label);
1222*4adee20fSdanielk1977         addr = sqlite3VdbeCurrentAddr(v);
1223*4adee20fSdanielk1977         sqlite3VdbeChangeP2(v, jumpInst, addr);
122417a7f8ddSdrh       }
1225f570f011Sdrh       if( pExpr->pLeft ){
1226*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
1227f570f011Sdrh       }
122817a7f8ddSdrh       if( pExpr->pRight ){
1229*4adee20fSdanielk1977         sqlite3ExprCode(pParse, pExpr->pRight);
123017a7f8ddSdrh       }else{
1231*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_String, 0, 0);
123217a7f8ddSdrh       }
1233*4adee20fSdanielk1977       sqlite3VdbeResolveLabel(v, expr_end_label);
12346f34903eSdanielk1977       break;
12356f34903eSdanielk1977     }
12366f34903eSdanielk1977     case TK_RAISE: {
12376f34903eSdanielk1977       if( !pParse->trigStack ){
1238*4adee20fSdanielk1977         sqlite3ErrorMsg(pParse,
1239da93d238Sdrh                        "RAISE() may only be used within a trigger-program");
12406f34903eSdanielk1977         pParse->nErr++;
12416f34903eSdanielk1977 	return;
12426f34903eSdanielk1977       }
12436f34903eSdanielk1977       if( pExpr->iColumn == OE_Rollback ||
12446f34903eSdanielk1977 	  pExpr->iColumn == OE_Abort ||
12456f34903eSdanielk1977 	  pExpr->iColumn == OE_Fail ){
1246*4adee20fSdanielk1977 	  sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn,
1247701a0aebSdrh                            pExpr->token.z, pExpr->token.n);
1248*4adee20fSdanielk1977 	  sqlite3VdbeDequoteP3(v, -1);
12496f34903eSdanielk1977       } else {
12506f34903eSdanielk1977 	  assert( pExpr->iColumn == OE_Ignore );
1251*4adee20fSdanielk1977 	  sqlite3VdbeOp3(v, OP_Goto, 0, pParse->trigStack->ignoreJump,
1252701a0aebSdrh                            "(IGNORE jump)", 0);
12536f34903eSdanielk1977       }
125417a7f8ddSdrh     }
125517a7f8ddSdrh     break;
125617a7f8ddSdrh   }
1257cce7d176Sdrh }
1258cce7d176Sdrh 
1259cce7d176Sdrh /*
1260268380caSdrh ** Generate code that pushes the value of every element of the given
1261268380caSdrh ** expression list onto the stack.  If the includeTypes flag is true,
1262268380caSdrh ** then also push a string that is the datatype of each element onto
1263268380caSdrh ** the stack after the value.
1264268380caSdrh **
1265268380caSdrh ** Return the number of elements pushed onto the stack.
1266268380caSdrh */
1267*4adee20fSdanielk1977 int sqlite3ExprCodeExprList(
1268268380caSdrh   Parse *pParse,     /* Parsing context */
1269268380caSdrh   ExprList *pList,   /* The expression list to be coded */
1270268380caSdrh   int includeTypes   /* TRUE to put datatypes on the stack too */
1271268380caSdrh ){
1272268380caSdrh   struct ExprList_item *pItem;
1273268380caSdrh   int i, n;
1274268380caSdrh   Vdbe *v;
1275268380caSdrh   if( pList==0 ) return 0;
1276*4adee20fSdanielk1977   v = sqlite3GetVdbe(pParse);
1277268380caSdrh   n = pList->nExpr;
1278268380caSdrh   for(pItem=pList->a, i=0; i<n; i++, pItem++){
1279*4adee20fSdanielk1977     sqlite3ExprCode(pParse, pItem->pExpr);
1280268380caSdrh     if( includeTypes ){
1281*4adee20fSdanielk1977       sqlite3VdbeOp3(v, OP_String, 0, 0,
1282*4adee20fSdanielk1977          sqlite3ExprType(pItem->pExpr)==SQLITE_SO_NUM ? "numeric" : "text",
1283268380caSdrh          P3_STATIC);
1284268380caSdrh     }
1285268380caSdrh   }
1286268380caSdrh   return includeTypes ? n*2 : n;
1287268380caSdrh }
1288268380caSdrh 
1289268380caSdrh /*
1290cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
1291cce7d176Sdrh ** to the label "dest" if the expression is true but execution
1292cce7d176Sdrh ** continues straight thru if the expression is false.
1293f5905aa7Sdrh **
1294f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then
1295f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true.
1296cce7d176Sdrh */
1297*4adee20fSdanielk1977 void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1298cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1299cce7d176Sdrh   int op = 0;
1300daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1301cce7d176Sdrh   switch( pExpr->op ){
1302cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
1303cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
1304cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
1305cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
1306cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
1307cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
1308cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
1309cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
1310cce7d176Sdrh     default:  break;
1311cce7d176Sdrh   }
1312cce7d176Sdrh   switch( pExpr->op ){
1313cce7d176Sdrh     case TK_AND: {
1314*4adee20fSdanielk1977       int d2 = sqlite3VdbeMakeLabel(v);
1315*4adee20fSdanielk1977       sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);
1316*4adee20fSdanielk1977       sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1317*4adee20fSdanielk1977       sqlite3VdbeResolveLabel(v, d2);
1318cce7d176Sdrh       break;
1319cce7d176Sdrh     }
1320cce7d176Sdrh     case TK_OR: {
1321*4adee20fSdanielk1977       sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1322*4adee20fSdanielk1977       sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1323cce7d176Sdrh       break;
1324cce7d176Sdrh     }
1325cce7d176Sdrh     case TK_NOT: {
1326*4adee20fSdanielk1977       sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1327cce7d176Sdrh       break;
1328cce7d176Sdrh     }
1329cce7d176Sdrh     case TK_LT:
1330cce7d176Sdrh     case TK_LE:
1331cce7d176Sdrh     case TK_GT:
1332cce7d176Sdrh     case TK_GE:
1333cce7d176Sdrh     case TK_NE:
13340ac65892Sdrh     case TK_EQ: {
1335*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1336*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pRight);
1337*4adee20fSdanielk1977       if( pParse->db->file_format>=4 && sqlite3ExprType(pExpr)==SQLITE_SO_TEXT ){
1338c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1339c9b84a1fSdrh       }
1340*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, jumpIfNull, dest);
1341cce7d176Sdrh       break;
1342cce7d176Sdrh     }
1343cce7d176Sdrh     case TK_ISNULL:
1344cce7d176Sdrh     case TK_NOTNULL: {
1345*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1346*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, 1, dest);
1347cce7d176Sdrh       break;
1348cce7d176Sdrh     }
1349fef5208cSdrh     case TK_IN: {
1350f5905aa7Sdrh       int addr;
1351*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1352*4adee20fSdanielk1977       addr = sqlite3VdbeCurrentAddr(v);
1353*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+3);
1354*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
1355*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1356fef5208cSdrh       if( pExpr->pSelect ){
1357*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, dest);
1358fef5208cSdrh       }else{
1359*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
1360fef5208cSdrh       }
1361fef5208cSdrh       break;
1362fef5208cSdrh     }
1363fef5208cSdrh     case TK_BETWEEN: {
1364f5905aa7Sdrh       int addr;
1365*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1366*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
1367*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr);
1368*4adee20fSdanielk1977       addr = sqlite3VdbeAddOp(v, OP_Lt, !jumpIfNull, 0);
1369*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr);
1370*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Le, jumpIfNull, dest);
1371*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Integer, 0, 0);
1372*4adee20fSdanielk1977       sqlite3VdbeChangeP2(v, addr, sqlite3VdbeCurrentAddr(v));
1373*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
1374fef5208cSdrh       break;
1375fef5208cSdrh     }
1376cce7d176Sdrh     default: {
1377*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr);
1378*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_If, jumpIfNull, dest);
1379cce7d176Sdrh       break;
1380cce7d176Sdrh     }
1381cce7d176Sdrh   }
1382cce7d176Sdrh }
1383cce7d176Sdrh 
1384cce7d176Sdrh /*
138566b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
1386cce7d176Sdrh ** to the label "dest" if the expression is false but execution
1387cce7d176Sdrh ** continues straight thru if the expression is true.
1388f5905aa7Sdrh **
1389f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then
1390f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false.
1391cce7d176Sdrh */
1392*4adee20fSdanielk1977 void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1393cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1394cce7d176Sdrh   int op = 0;
1395daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1396cce7d176Sdrh   switch( pExpr->op ){
1397cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
1398cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
1399cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
1400cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
1401cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
1402cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
1403cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
1404cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
1405cce7d176Sdrh     default:  break;
1406cce7d176Sdrh   }
1407cce7d176Sdrh   switch( pExpr->op ){
1408cce7d176Sdrh     case TK_AND: {
1409*4adee20fSdanielk1977       sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1410*4adee20fSdanielk1977       sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1411cce7d176Sdrh       break;
1412cce7d176Sdrh     }
1413cce7d176Sdrh     case TK_OR: {
1414*4adee20fSdanielk1977       int d2 = sqlite3VdbeMakeLabel(v);
1415*4adee20fSdanielk1977       sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);
1416*4adee20fSdanielk1977       sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1417*4adee20fSdanielk1977       sqlite3VdbeResolveLabel(v, d2);
1418cce7d176Sdrh       break;
1419cce7d176Sdrh     }
1420cce7d176Sdrh     case TK_NOT: {
1421*4adee20fSdanielk1977       sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1422cce7d176Sdrh       break;
1423cce7d176Sdrh     }
1424cce7d176Sdrh     case TK_LT:
1425cce7d176Sdrh     case TK_LE:
1426cce7d176Sdrh     case TK_GT:
1427cce7d176Sdrh     case TK_GE:
1428cce7d176Sdrh     case TK_NE:
1429cce7d176Sdrh     case TK_EQ: {
1430*4adee20fSdanielk1977       if( pParse->db->file_format>=4 && sqlite3ExprType(pExpr)==SQLITE_SO_TEXT ){
14318f619ccdSdrh         /* Convert numeric comparison opcodes into text comparison opcodes.
14328f619ccdSdrh         ** This step depends on the fact that the text comparision opcodes are
14338f619ccdSdrh         ** always 6 greater than their corresponding numeric comparison
14348f619ccdSdrh         ** opcodes.
14358f619ccdSdrh         */
14368f619ccdSdrh         assert( OP_Eq+6 == OP_StrEq );
14378f619ccdSdrh         op += 6;
1438c9b84a1fSdrh       }
1439*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1440*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pRight);
1441*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, jumpIfNull, dest);
1442cce7d176Sdrh       break;
1443cce7d176Sdrh     }
1444cce7d176Sdrh     case TK_ISNULL:
1445cce7d176Sdrh     case TK_NOTNULL: {
1446*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1447*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, op, 1, dest);
1448cce7d176Sdrh       break;
1449cce7d176Sdrh     }
1450fef5208cSdrh     case TK_IN: {
1451f5905aa7Sdrh       int addr;
1452*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1453*4adee20fSdanielk1977       addr = sqlite3VdbeCurrentAddr(v);
1454*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+3);
1455*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
1456*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1457fef5208cSdrh       if( pExpr->pSelect ){
1458*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1459fef5208cSdrh       }else{
1460*4adee20fSdanielk1977         sqlite3VdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1461fef5208cSdrh       }
1462fef5208cSdrh       break;
1463fef5208cSdrh     }
1464fef5208cSdrh     case TK_BETWEEN: {
1465fef5208cSdrh       int addr;
1466*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pLeft);
1467*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
1468*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr);
1469*4adee20fSdanielk1977       addr = sqlite3VdbeCurrentAddr(v);
1470*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3);
1471*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
1472*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Goto, 0, dest);
1473*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr);
1474*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_Gt, jumpIfNull, dest);
1475fef5208cSdrh       break;
1476fef5208cSdrh     }
1477cce7d176Sdrh     default: {
1478*4adee20fSdanielk1977       sqlite3ExprCode(pParse, pExpr);
1479*4adee20fSdanielk1977       sqlite3VdbeAddOp(v, OP_IfNot, jumpIfNull, dest);
1480cce7d176Sdrh       break;
1481cce7d176Sdrh     }
1482cce7d176Sdrh   }
1483cce7d176Sdrh }
14842282792aSdrh 
14852282792aSdrh /*
14862282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
14872282792aSdrh ** if they are identical and return FALSE if they differ in any way.
14882282792aSdrh */
1489*4adee20fSdanielk1977 int sqlite3ExprCompare(Expr *pA, Expr *pB){
14902282792aSdrh   int i;
14912282792aSdrh   if( pA==0 ){
14922282792aSdrh     return pB==0;
14932282792aSdrh   }else if( pB==0 ){
14942282792aSdrh     return 0;
14952282792aSdrh   }
14962282792aSdrh   if( pA->op!=pB->op ) return 0;
1497*4adee20fSdanielk1977   if( !sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1498*4adee20fSdanielk1977   if( !sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 0;
14992282792aSdrh   if( pA->pList ){
15002282792aSdrh     if( pB->pList==0 ) return 0;
15012282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
15022282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1503*4adee20fSdanielk1977       if( !sqlite3ExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
15042282792aSdrh         return 0;
15052282792aSdrh       }
15062282792aSdrh     }
15072282792aSdrh   }else if( pB->pList ){
15082282792aSdrh     return 0;
15092282792aSdrh   }
15102282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
15112f2c01e5Sdrh   if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;
15122282792aSdrh   if( pA->token.z ){
15132282792aSdrh     if( pB->token.z==0 ) return 0;
15146977fea8Sdrh     if( pB->token.n!=pA->token.n ) return 0;
1515*4adee20fSdanielk1977     if( sqlite3StrNICmp(pA->token.z, pB->token.z, pB->token.n)!=0 ) return 0;
15162282792aSdrh   }
15172282792aSdrh   return 1;
15182282792aSdrh }
15192282792aSdrh 
15202282792aSdrh /*
15212282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
15222282792aSdrh */
15232282792aSdrh static int appendAggInfo(Parse *pParse){
15242282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
15252282792aSdrh     int amt = pParse->nAgg + 8;
15266d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
15276d4abfbeSdrh     if( aAgg==0 ){
15282282792aSdrh       return -1;
15292282792aSdrh     }
15306d4abfbeSdrh     pParse->aAgg = aAgg;
15312282792aSdrh   }
15322282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
15332282792aSdrh   return pParse->nAgg++;
15342282792aSdrh }
15352282792aSdrh 
15362282792aSdrh /*
15372282792aSdrh ** Analyze the given expression looking for aggregate functions and
15382282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
15392282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
15402282792aSdrh **
15412282792aSdrh ** This routine should only be called after the expression has been
1542*4adee20fSdanielk1977 ** analyzed by sqlite3ExprResolveIds() and sqlite3ExprCheck().
15432282792aSdrh **
15442282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
15452282792aSdrh ** the number of errors.
15462282792aSdrh */
1547*4adee20fSdanielk1977 int sqlite3ExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
15482282792aSdrh   int i;
15492282792aSdrh   AggExpr *aAgg;
15502282792aSdrh   int nErr = 0;
15512282792aSdrh 
15522282792aSdrh   if( pExpr==0 ) return 0;
15532282792aSdrh   switch( pExpr->op ){
1554967e8b73Sdrh     case TK_COLUMN: {
15552282792aSdrh       aAgg = pParse->aAgg;
15562282792aSdrh       for(i=0; i<pParse->nAgg; i++){
15572282792aSdrh         if( aAgg[i].isAgg ) continue;
15582282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1559967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
15602282792aSdrh           break;
15612282792aSdrh         }
15622282792aSdrh       }
15632282792aSdrh       if( i>=pParse->nAgg ){
15642282792aSdrh         i = appendAggInfo(pParse);
15652282792aSdrh         if( i<0 ) return 1;
15662282792aSdrh         pParse->aAgg[i].isAgg = 0;
15672282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
15682282792aSdrh       }
1569aaf88729Sdrh       pExpr->iAgg = i;
15702282792aSdrh       break;
15712282792aSdrh     }
15722282792aSdrh     case TK_AGG_FUNCTION: {
15732282792aSdrh       aAgg = pParse->aAgg;
15742282792aSdrh       for(i=0; i<pParse->nAgg; i++){
15752282792aSdrh         if( !aAgg[i].isAgg ) continue;
1576*4adee20fSdanielk1977         if( sqlite3ExprCompare(aAgg[i].pExpr, pExpr) ){
15772282792aSdrh           break;
15782282792aSdrh         }
15792282792aSdrh       }
15802282792aSdrh       if( i>=pParse->nAgg ){
15812282792aSdrh         i = appendAggInfo(pParse);
15822282792aSdrh         if( i<0 ) return 1;
15832282792aSdrh         pParse->aAgg[i].isAgg = 1;
15842282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
1585*4adee20fSdanielk1977         pParse->aAgg[i].pFunc = sqlite3FindFunction(pParse->db,
15866977fea8Sdrh              pExpr->token.z, pExpr->token.n,
1587f55f25f0Sdrh              pExpr->pList ? pExpr->pList->nExpr : 0, 0);
15882282792aSdrh       }
15892282792aSdrh       pExpr->iAgg = i;
15902282792aSdrh       break;
15912282792aSdrh     }
15922282792aSdrh     default: {
15932282792aSdrh       if( pExpr->pLeft ){
1594*4adee20fSdanielk1977         nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pLeft);
15952282792aSdrh       }
15962282792aSdrh       if( nErr==0 && pExpr->pRight ){
1597*4adee20fSdanielk1977         nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pRight);
15982282792aSdrh       }
15992282792aSdrh       if( nErr==0 && pExpr->pList ){
16002282792aSdrh         int n = pExpr->pList->nExpr;
16012282792aSdrh         int i;
16022282792aSdrh         for(i=0; nErr==0 && i<n; i++){
1603*4adee20fSdanielk1977           nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
16042282792aSdrh         }
16052282792aSdrh       }
16062282792aSdrh       break;
16072282792aSdrh     }
16082282792aSdrh   }
16092282792aSdrh   return nErr;
16102282792aSdrh }
16118e0a2f90Sdrh 
16128e0a2f90Sdrh /*
16138e0a2f90Sdrh ** Locate a user function given a name and a number of arguments.
16140bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that
16158e0a2f90Sdrh ** function, or return NULL if the function does not exist.
16168e0a2f90Sdrh **
16170bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef
16188e0a2f90Sdrh ** structure is created and liked into the "db" structure if a
16198e0a2f90Sdrh ** no matching function previously existed.  When createFlag is true
16208e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts
16218e0a2f90Sdrh ** any number of arguments will be returned.
16228e0a2f90Sdrh **
16238e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid
16248e0a2f90Sdrh ** function found is returned.  A function is valid if either xFunc
16258e0a2f90Sdrh ** or xStep is non-zero.
16268e0a2f90Sdrh */
1627*4adee20fSdanielk1977 FuncDef *sqlite3FindFunction(
16288e0a2f90Sdrh   sqlite *db,        /* An open database */
16298e0a2f90Sdrh   const char *zName, /* Name of the function.  Not null-terminated */
16308e0a2f90Sdrh   int nName,         /* Number of characters in the name */
16318e0a2f90Sdrh   int nArg,          /* Number of arguments.  -1 means any number */
16328e0a2f90Sdrh   int createFlag     /* Create new entry if true and does not otherwise exist */
16338e0a2f90Sdrh ){
16340bce8354Sdrh   FuncDef *pFirst, *p, *pMaybe;
1635*4adee20fSdanielk1977   pFirst = p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName, nName);
16361350b030Sdrh   if( p && !createFlag && nArg<0 ){
16378e0a2f90Sdrh     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
16388e0a2f90Sdrh     return p;
16398e0a2f90Sdrh   }
16408e0a2f90Sdrh   pMaybe = 0;
16418e0a2f90Sdrh   while( p && p->nArg!=nArg ){
16428e0a2f90Sdrh     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
16438e0a2f90Sdrh     p = p->pNext;
16448e0a2f90Sdrh   }
16458e0a2f90Sdrh   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
16468e0a2f90Sdrh     return 0;
16478e0a2f90Sdrh   }
16488e0a2f90Sdrh   if( p==0 && pMaybe ){
16498e0a2f90Sdrh     assert( createFlag==0 );
16508e0a2f90Sdrh     return pMaybe;
16518e0a2f90Sdrh   }
165289425d5eSdrh   if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
16538e0a2f90Sdrh     p->nArg = nArg;
16548e0a2f90Sdrh     p->pNext = pFirst;
1655c9b84a1fSdrh     p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC;
1656*4adee20fSdanielk1977     sqlite3HashInsert(&db->aFunc, zName, nName, (void*)p);
16578e0a2f90Sdrh   }
16588e0a2f90Sdrh   return p;
16598e0a2f90Sdrh }
1660*4adee20fSdanielk1977 
1661*4adee20fSdanielk1977 
1662*4adee20fSdanielk1977 
1663