xref: /sqlite-3.40.0/src/expr.c (revision 4efc4754)
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*4efc4754Sdrh ** $Id: expr.c,v 1.105 2004/01/16 15:55:38 drh 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 */
25a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
26a76b5dfcSdrh   Expr *pNew;
27a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
28a76b5dfcSdrh   if( pNew==0 ){
29*4efc4754Sdrh     /* 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{
40*4efc4754Sdrh     assert( pNew->token.dyn==0 );
41*4efc4754Sdrh     assert( pNew->token.z==0 );
42*4efc4754Sdrh     assert( pNew->token.n==0 );
436977fea8Sdrh     if( pLeft && pRight ){
446977fea8Sdrh       sqliteExprSpan(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 */
56a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
57*4efc4754Sdrh   assert( pRight!=0 );
58*4efc4754Sdrh   assert( pLeft!=0 );
59*4efc4754Sdrh   /* Note: pExpr might be NULL due to a prior malloc failure */
60*4efc4754Sdrh   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 */
74a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){
75a76b5dfcSdrh   Expr *pNew;
76a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
77a76b5dfcSdrh   if( pNew==0 ){
78*4efc4754Sdrh     /* sqliteExprListDelete(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 */
96a2e00042Sdrh void sqliteExprDelete(Expr *p){
97a2e00042Sdrh   if( p==0 ) return;
98*4efc4754Sdrh   if( p->span.dyn ) sqliteFree((char*)p->span.z);
99*4efc4754Sdrh   if( p->token.dyn ) sqliteFree((char*)p->token.z);
100*4efc4754Sdrh   sqliteExprDelete(p->pLeft);
101*4efc4754Sdrh   sqliteExprDelete(p->pRight);
102*4efc4754Sdrh   sqliteExprListDelete(p->pList);
103*4efc4754Sdrh   sqliteSelectDelete(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 **
114ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(),
115ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() 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 */
120ff78bd2fSdrh Expr *sqliteExprDup(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{
130*4efc4754Sdrh     assert( pNew->token.z==0 );
1314b59ab5eSdrh   }
1326977fea8Sdrh   pNew->span.z = 0;
133ff78bd2fSdrh   pNew->pLeft = sqliteExprDup(p->pLeft);
134ff78bd2fSdrh   pNew->pRight = sqliteExprDup(p->pRight);
135ff78bd2fSdrh   pNew->pList = sqliteExprListDup(p->pList);
136ff78bd2fSdrh   pNew->pSelect = sqliteSelectDup(p->pSelect);
137ff78bd2fSdrh   return pNew;
138ff78bd2fSdrh }
1394b59ab5eSdrh void sqliteTokenCopy(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 }
149ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){
150ff78bd2fSdrh   ExprList *pNew;
151ff78bd2fSdrh   int i;
152ff78bd2fSdrh   if( p==0 ) return 0;
153ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
154ff78bd2fSdrh   if( pNew==0 ) return 0;
1554305d103Sdrh   pNew->nExpr = pNew->nAlloc = p->nExpr;
156ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
157e4697f5eSdrh   if( pNew->a==0 ) return 0;
158ff78bd2fSdrh   for(i=0; i<p->nExpr; i++){
1594b59ab5eSdrh     Expr *pNewExpr, *pOldExpr;
1604b59ab5eSdrh     pNew->a[i].pExpr = pNewExpr = sqliteExprDup(pOldExpr = p->a[i].pExpr);
1616977fea8Sdrh     if( pOldExpr->span.z!=0 && pNewExpr ){
1626977fea8Sdrh       /* Always make a copy of the span for top-level expressions in the
1634b59ab5eSdrh       ** expression list.  The logic in SELECT processing that determines
1644b59ab5eSdrh       ** the names of columns in the result set needs this information */
1656977fea8Sdrh       sqliteTokenCopy(&pNewExpr->span, &pOldExpr->span);
1664b59ab5eSdrh     }
1671f3e905cSdrh     assert( pNewExpr==0 || pNewExpr->span.z!=0
1681f3e905cSdrh             || pOldExpr->span.z==0 || sqlite_malloc_failed );
169ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
170ff78bd2fSdrh     pNew->a[i].sortOrder = p->a[i].sortOrder;
171ff78bd2fSdrh     pNew->a[i].isAgg = p->a[i].isAgg;
172ff78bd2fSdrh     pNew->a[i].done = 0;
173ff78bd2fSdrh   }
174ff78bd2fSdrh   return pNew;
175ff78bd2fSdrh }
176ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){
177ad3cab52Sdrh   SrcList *pNew;
178ad3cab52Sdrh   int i;
179113088ecSdrh   int nByte;
180ad3cab52Sdrh   if( p==0 ) return 0;
181113088ecSdrh   nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0);
182*4efc4754Sdrh   pNew = sqliteMallocRaw( nByte );
183ad3cab52Sdrh   if( pNew==0 ) return 0;
1844305d103Sdrh   pNew->nSrc = pNew->nAlloc = p->nSrc;
185ad3cab52Sdrh   for(i=0; i<p->nSrc; i++){
186*4efc4754Sdrh     struct SrcList_item *pNewItem = &pNew->a[i];
187*4efc4754Sdrh     struct SrcList_item *pOldItem = &p->a[i];
188*4efc4754Sdrh     pNewItem->zDatabase = sqliteStrDup(pOldItem->zDatabase);
189*4efc4754Sdrh     pNewItem->zName = sqliteStrDup(pOldItem->zName);
190*4efc4754Sdrh     pNewItem->zAlias = sqliteStrDup(pOldItem->zAlias);
191*4efc4754Sdrh     pNewItem->jointype = pOldItem->jointype;
192*4efc4754Sdrh     pNewItem->iCursor = pOldItem->iCursor;
193*4efc4754Sdrh     pNewItem->pTab = 0;
194*4efc4754Sdrh     pNewItem->pSelect = sqliteSelectDup(pOldItem->pSelect);
195*4efc4754Sdrh     pNewItem->pOn = sqliteExprDup(pOldItem->pOn);
196*4efc4754Sdrh     pNewItem->pUsing = sqliteIdListDup(pOldItem->pUsing);
197ad3cab52Sdrh   }
198ad3cab52Sdrh   return pNew;
199ad3cab52Sdrh }
200ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){
201ff78bd2fSdrh   IdList *pNew;
202ff78bd2fSdrh   int i;
203ff78bd2fSdrh   if( p==0 ) return 0;
204*4efc4754Sdrh   pNew = sqliteMallocRaw( sizeof(*pNew) );
205ff78bd2fSdrh   if( pNew==0 ) return 0;
2064305d103Sdrh   pNew->nId = pNew->nAlloc = p->nId;
207*4efc4754Sdrh   pNew->a = sqliteMallocRaw( p->nId*sizeof(p->a[0]) );
208e4697f5eSdrh   if( pNew->a==0 ) return 0;
209ff78bd2fSdrh   for(i=0; i<p->nId; i++){
210*4efc4754Sdrh     struct IdList_item *pNewItem = &pNew->a[i];
211*4efc4754Sdrh     struct IdList_item *pOldItem = &p->a[i];
212*4efc4754Sdrh     pNewItem->zName = sqliteStrDup(pOldItem->zName);
213*4efc4754Sdrh     pNewItem->idx = pOldItem->idx;
214ff78bd2fSdrh   }
215ff78bd2fSdrh   return pNew;
216ff78bd2fSdrh }
217ff78bd2fSdrh Select *sqliteSelectDup(Select *p){
218ff78bd2fSdrh   Select *pNew;
219ff78bd2fSdrh   if( p==0 ) return 0;
220*4efc4754Sdrh   pNew = sqliteMallocRaw( sizeof(*p) );
221ff78bd2fSdrh   if( pNew==0 ) return 0;
222ff78bd2fSdrh   pNew->isDistinct = p->isDistinct;
223ff78bd2fSdrh   pNew->pEList = sqliteExprListDup(p->pEList);
224ad3cab52Sdrh   pNew->pSrc = sqliteSrcListDup(p->pSrc);
225ff78bd2fSdrh   pNew->pWhere = sqliteExprDup(p->pWhere);
226ff78bd2fSdrh   pNew->pGroupBy = sqliteExprListDup(p->pGroupBy);
227ff78bd2fSdrh   pNew->pHaving = sqliteExprDup(p->pHaving);
228ff78bd2fSdrh   pNew->pOrderBy = sqliteExprListDup(p->pOrderBy);
229ff78bd2fSdrh   pNew->op = p->op;
230ff78bd2fSdrh   pNew->pPrior = sqliteSelectDup(p->pPrior);
231ff78bd2fSdrh   pNew->nLimit = p->nLimit;
232ff78bd2fSdrh   pNew->nOffset = p->nOffset;
233ff78bd2fSdrh   pNew->zSelect = 0;
2347b58daeaSdrh   pNew->iLimit = -1;
2357b58daeaSdrh   pNew->iOffset = -1;
236ff78bd2fSdrh   return pNew;
237ff78bd2fSdrh }
238ff78bd2fSdrh 
239ff78bd2fSdrh 
240ff78bd2fSdrh /*
241a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
242a76b5dfcSdrh ** initially NULL, then create a new expression list.
243a76b5dfcSdrh */
244a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
245a76b5dfcSdrh   int i;
246a76b5dfcSdrh   if( pList==0 ){
247a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
248a76b5dfcSdrh     if( pList==0 ){
249*4efc4754Sdrh       /* sqliteExprDelete(pExpr); // Leak memory if malloc fails */
250a76b5dfcSdrh       return 0;
251a76b5dfcSdrh     }
252*4efc4754Sdrh     assert( pList->nAlloc==0 );
253a76b5dfcSdrh   }
2544305d103Sdrh   if( pList->nAlloc<=pList->nExpr ){
2554305d103Sdrh     pList->nAlloc = pList->nAlloc*2 + 4;
256*4efc4754Sdrh     pList->a = sqliteRealloc(pList->a, pList->nAlloc*sizeof(pList->a[0]));
257*4efc4754Sdrh     if( pList->a==0 ){
258*4efc4754Sdrh       /* sqliteExprDelete(pExpr); // Leak memory if malloc fails */
259*4efc4754Sdrh       pList->nExpr = pList->nAlloc = 0;
260a76b5dfcSdrh       return pList;
261a76b5dfcSdrh     }
262a76b5dfcSdrh   }
263*4efc4754Sdrh   assert( pList->a!=0 );
264*4efc4754Sdrh   if( pExpr || pName ){
265*4efc4754Sdrh     struct ExprList_item *pItem = &pList->a[pList->nExpr++];
266*4efc4754Sdrh     memset(pItem, 0, sizeof(*pItem));
267*4efc4754Sdrh     pItem->pExpr = pExpr;
268a76b5dfcSdrh     if( pName ){
269*4efc4754Sdrh       sqliteSetNString(&pItem->zName, pName->z, pName->n, 0);
270*4efc4754Sdrh       sqliteDequote(pItem->zName);
271a76b5dfcSdrh     }
272a76b5dfcSdrh   }
273a76b5dfcSdrh   return pList;
274a76b5dfcSdrh }
275a76b5dfcSdrh 
276a76b5dfcSdrh /*
277a76b5dfcSdrh ** Delete an entire expression list.
278a76b5dfcSdrh */
279a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){
280a76b5dfcSdrh   int i;
281a76b5dfcSdrh   if( pList==0 ) return;
282a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
283a76b5dfcSdrh     sqliteExprDelete(pList->a[i].pExpr);
284a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
285a76b5dfcSdrh   }
286a76b5dfcSdrh   sqliteFree(pList->a);
287a76b5dfcSdrh   sqliteFree(pList);
288a76b5dfcSdrh }
289a76b5dfcSdrh 
290a76b5dfcSdrh /*
291fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
292fef5208cSdrh ** and 0 if it involves variables.
2932398937bSdrh **
2942398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc")
2952398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is
2962398937bSdrh ** a constant.
297fef5208cSdrh */
2989208643dSdrh int sqliteExprIsConstant(Expr *p){
299fef5208cSdrh   switch( p->op ){
300fef5208cSdrh     case TK_ID:
301967e8b73Sdrh     case TK_COLUMN:
302fef5208cSdrh     case TK_DOT:
3037bdc0c1dSdrh     case TK_FUNCTION:
304fef5208cSdrh       return 0;
3057bdc0c1dSdrh     case TK_NULL:
3062398937bSdrh     case TK_STRING:
3079208643dSdrh     case TK_INTEGER:
3089208643dSdrh     case TK_FLOAT:
30950457896Sdrh     case TK_VARIABLE:
3109208643dSdrh       return 1;
311fef5208cSdrh     default: {
3129208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
3139208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
314fef5208cSdrh       if( p->pList ){
315fef5208cSdrh         int i;
316fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
3179208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
318fef5208cSdrh         }
319fef5208cSdrh       }
3209208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
321fef5208cSdrh     }
322fef5208cSdrh   }
3239208643dSdrh   return 0;
324fef5208cSdrh }
325fef5208cSdrh 
326fef5208cSdrh /*
327202b2df7Sdrh ** If the given expression codes a constant integer that is small enough
328202b2df7Sdrh ** to fit in a 32-bit integer, return 1 and put the value of the integer
329202b2df7Sdrh ** in *pValue.  If the expression is not an integer or if it is too big
330202b2df7Sdrh ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
331e4de1febSdrh */
332e4de1febSdrh int sqliteExprIsInteger(Expr *p, int *pValue){
333e4de1febSdrh   switch( p->op ){
334e4de1febSdrh     case TK_INTEGER: {
335202b2df7Sdrh       if( sqliteFitsIn32Bits(p->token.z) ){
336e4de1febSdrh         *pValue = atoi(p->token.z);
337e4de1febSdrh         return 1;
338e4de1febSdrh       }
339202b2df7Sdrh       break;
340202b2df7Sdrh     }
341e4de1febSdrh     case TK_STRING: {
342bd790ee3Sdrh       const char *z = p->token.z;
343e4de1febSdrh       int n = p->token.n;
344bd790ee3Sdrh       if( n>0 && z[0]=='-' ){ z++; n--; }
345e4de1febSdrh       while( n>0 && *z && isdigit(*z) ){ z++; n--; }
346202b2df7Sdrh       if( n==0 && sqliteFitsIn32Bits(p->token.z) ){
347e4de1febSdrh         *pValue = atoi(p->token.z);
348e4de1febSdrh         return 1;
349e4de1febSdrh       }
350e4de1febSdrh       break;
351e4de1febSdrh     }
3524b59ab5eSdrh     case TK_UPLUS: {
3534b59ab5eSdrh       return sqliteExprIsInteger(p->pLeft, pValue);
3544b59ab5eSdrh     }
355e4de1febSdrh     case TK_UMINUS: {
356e4de1febSdrh       int v;
357e4de1febSdrh       if( sqliteExprIsInteger(p->pLeft, &v) ){
358e4de1febSdrh         *pValue = -v;
359e4de1febSdrh         return 1;
360e4de1febSdrh       }
361e4de1febSdrh       break;
362e4de1febSdrh     }
363e4de1febSdrh     default: break;
364e4de1febSdrh   }
365e4de1febSdrh   return 0;
366e4de1febSdrh }
367e4de1febSdrh 
368e4de1febSdrh /*
369c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
370c4a3c779Sdrh */
371a9f9d1c0Sdrh int sqliteIsRowid(const char *z){
372c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
373c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
374c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
375c4a3c779Sdrh   return 0;
376c4a3c779Sdrh }
377c4a3c779Sdrh 
378c4a3c779Sdrh /*
379cce7d176Sdrh ** This routine walks an expression tree and resolves references to
380967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
381aacc543eSdrh ** index to the table in the table list and a column offset.  The
382aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
383aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
384832508b7Sdrh ** plus the "base" value.  The base value will ultimately become the
385aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
386aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
387aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
388aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
389aacc543eSdrh ** alias for ROWID.
39019a775c2Sdrh **
391fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
392fef5208cSdrh ** forms:
393fef5208cSdrh **
394fef5208cSdrh **           expr IN (exprlist)
395fef5208cSdrh ** and
396fef5208cSdrh **           expr IN (SELECT ...)
397fef5208cSdrh **
398fef5208cSdrh ** The first form is handled by creating a set holding the list
399fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
400fef5208cSdrh ** a temporary table.
401fef5208cSdrh **
402fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
40319a775c2Sdrh ** If it finds any, it generates code to write the value of that select
40419a775c2Sdrh ** into a memory cell.
405cce7d176Sdrh **
406967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
407cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
408cce7d176Sdrh */
409a2e00042Sdrh int sqliteExprResolveIds(
410a2e00042Sdrh   Parse *pParse,     /* The parser context */
411ad3cab52Sdrh   SrcList *pTabList, /* List of tables used to resolve column names */
412a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
413a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
414a2e00042Sdrh ){
4156a3ea0e6Sdrh   int i;
4166a3ea0e6Sdrh 
417daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
4186a3ea0e6Sdrh   for(i=0; i<pTabList->nSrc; i++){
4196a3ea0e6Sdrh     assert( pTabList->a[i].iCursor>=0 && pTabList->a[i].iCursor<pParse->nTab );
4206a3ea0e6Sdrh   }
421cce7d176Sdrh   switch( pExpr->op ){
4222398937bSdrh     /* Double-quoted strings (ex: "abc") are used as identifiers if
4232398937bSdrh     ** possible.  Otherwise they remain as strings.  Single-quoted
4242398937bSdrh     ** strings (ex: 'abc') are always string literals.
4252398937bSdrh     */
4262398937bSdrh     case TK_STRING: {
4272398937bSdrh       if( pExpr->token.z[0]=='\'' ) break;
4282398937bSdrh       /* Fall thru into the TK_ID case if this is a double-quoted string */
4292398937bSdrh     }
430a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
431a2e00042Sdrh     **
432a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
433a2e00042Sdrh     **
434a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
435a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
436a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
437a2e00042Sdrh     **
438a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
439a2e00042Sdrh     */
440cce7d176Sdrh     case TK_ID: {
441cce7d176Sdrh       int cnt = 0;      /* Number of matches */
442a76b5dfcSdrh       char *z;
443e22a334bSdrh       int iDb = -1;
444e22a334bSdrh 
445a76b5dfcSdrh       assert( pExpr->token.z );
446a76b5dfcSdrh       z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
4472f4392ffSdrh       sqliteDequote(z);
448daffd0e5Sdrh       if( z==0 ) return 1;
449ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
450cce7d176Sdrh         int j;
451cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
452cce7d176Sdrh         if( pTab==0 ) continue;
453e22a334bSdrh         iDb = pTab->iDb;
454417be79cSdrh         assert( pTab->nCol>0 );
455cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
4567020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
457cce7d176Sdrh             cnt++;
4586a3ea0e6Sdrh             pExpr->iTable = pTabList->a[i].iCursor;
459e22a334bSdrh             pExpr->iDb = pTab->iDb;
4604a32431cSdrh             if( j==pTab->iPKey ){
4614a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
4624a32431cSdrh               pExpr->iColumn = -1;
463c9b84a1fSdrh               pExpr->dataType = SQLITE_SO_NUM;
4644a32431cSdrh             }else{
465967e8b73Sdrh               pExpr->iColumn = j;
466c9b84a1fSdrh               pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
467cce7d176Sdrh             }
468a2e00042Sdrh             pExpr->op = TK_COLUMN;
469a2e00042Sdrh           }
470a2e00042Sdrh         }
471a2e00042Sdrh       }
472a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
473a2e00042Sdrh         int j;
474a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
475a2e00042Sdrh           char *zAs = pEList->a[j].zName;
476a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
477a2e00042Sdrh             cnt++;
478a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
479a2e00042Sdrh             pExpr->op = TK_AS;
480a2e00042Sdrh             pExpr->iColumn = j;
48175148a27Sdrh             pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr);
482cce7d176Sdrh           }
483cce7d176Sdrh         }
4844a32431cSdrh       }
485e22a334bSdrh       if( cnt==0 && iDb>=0 && sqliteIsRowid(z) ){
486c4a3c779Sdrh         pExpr->iColumn = -1;
4876a3ea0e6Sdrh         pExpr->iTable = pTabList->a[0].iCursor;
488e22a334bSdrh         pExpr->iDb = iDb;
489ad3cab52Sdrh         cnt = 1 + (pTabList->nSrc>1);
490a2e00042Sdrh         pExpr->op = TK_COLUMN;
491c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
492c4a3c779Sdrh       }
493cce7d176Sdrh       sqliteFree(z);
4942398937bSdrh       if( cnt==0 && pExpr->token.z[0]!='"' ){
495da93d238Sdrh         sqliteErrorMsg(pParse, "no such column: %T", &pExpr->token);
496cce7d176Sdrh         return 1;
497cce7d176Sdrh       }else if( cnt>1 ){
498da93d238Sdrh         sqliteErrorMsg(pParse, "ambiguous column name: %T", &pExpr->token);
499cce7d176Sdrh         return 1;
500cce7d176Sdrh       }
501ed6c8671Sdrh       if( pExpr->op==TK_COLUMN ){
5026a3ea0e6Sdrh         sqliteAuthRead(pParse, pExpr, pTabList);
503ed6c8671Sdrh       }
504cce7d176Sdrh       break;
505cce7d176Sdrh     }
506cce7d176Sdrh 
507d24cc427Sdrh     /* A table name and column name:     ID.ID
508d24cc427Sdrh     ** Or a database, table and column:  ID.ID.ID
509d24cc427Sdrh     */
510cce7d176Sdrh     case TK_DOT: {
511cce7d176Sdrh       int cnt = 0;             /* Number of matches */
512c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
513cce7d176Sdrh       int i;                   /* Loop counter */
514cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
515cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
516d24cc427Sdrh       char *zDb;               /* Name of database holding table */
517d24cc427Sdrh       sqlite *db = pParse->db;
518cce7d176Sdrh 
519cce7d176Sdrh       pRight = pExpr->pRight;
520d24cc427Sdrh       if( pRight->op==TK_ID ){
521d24cc427Sdrh         pLeft = pExpr->pLeft;
522d24cc427Sdrh         zDb = 0;
523d24cc427Sdrh       }else{
524d24cc427Sdrh         Expr *pDb = pExpr->pLeft;
525d24cc427Sdrh         assert( pDb && pDb->op==TK_ID && pDb->token.z );
526d24cc427Sdrh         zDb = sqliteStrNDup(pDb->token.z, pDb->token.n);
527d24cc427Sdrh         pLeft = pRight->pLeft;
528d24cc427Sdrh         pRight = pRight->pRight;
529d24cc427Sdrh       }
530a76b5dfcSdrh       assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );
531a76b5dfcSdrh       assert( pRight && pRight->op==TK_ID && pRight->token.z );
5326e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
5336e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
534daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
535daffd0e5Sdrh         sqliteFree(zLeft);
536daffd0e5Sdrh         sqliteFree(zRight);
537d24cc427Sdrh         sqliteFree(zDb);
538daffd0e5Sdrh         return 1;
539daffd0e5Sdrh       }
540d24cc427Sdrh       sqliteDequote(zDb);
54187c40e88Sdrh       sqliteDequote(zLeft);
54287c40e88Sdrh       sqliteDequote(zRight);
543c4a3c779Sdrh       pExpr->iTable = -1;
544ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
545cce7d176Sdrh         int j;
546cce7d176Sdrh         char *zTab;
547cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
548cce7d176Sdrh         if( pTab==0 ) continue;
549417be79cSdrh         assert( pTab->nCol>0 );
550cce7d176Sdrh         if( pTabList->a[i].zAlias ){
551cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
552d24cc427Sdrh           if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
553cce7d176Sdrh         }else{
554cce7d176Sdrh           zTab = pTab->zName;
555094b2bbfSdrh           if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue;
556d24cc427Sdrh           if( zDb!=0 && sqliteStrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){
557d24cc427Sdrh             continue;
558d24cc427Sdrh           }
559d24cc427Sdrh         }
560e22a334bSdrh         if( 0==(cntTab++) ){
5616a3ea0e6Sdrh           pExpr->iTable = pTabList->a[i].iCursor;
562e22a334bSdrh           pExpr->iDb = pTab->iDb;
563e22a334bSdrh         }
564cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
5657020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
566cce7d176Sdrh             cnt++;
5676a3ea0e6Sdrh             pExpr->iTable = pTabList->a[i].iCursor;
568e22a334bSdrh             pExpr->iDb = pTab->iDb;
56970ce3f0cSdrh             /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
57070ce3f0cSdrh             pExpr->iColumn = j==pTab->iPKey ? -1 : j;
571c9b84a1fSdrh             pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
572cce7d176Sdrh           }
573cce7d176Sdrh         }
5744a32431cSdrh       }
575c3f9bad2Sdanielk1977 
576c3f9bad2Sdanielk1977       /* If we have not already resolved this *.* expression, then maybe
577c3f9bad2Sdanielk1977        * it is a new.* or old.* trigger argument reference */
578c3f9bad2Sdanielk1977       if( cnt == 0 && pParse->trigStack != 0 ){
579f29ce559Sdanielk1977         TriggerStack *pTriggerStack = pParse->trigStack;
580c3f9bad2Sdanielk1977         int t = 0;
581f29ce559Sdanielk1977         if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){
582f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->newIdx;
583e22a334bSdrh           assert( pTriggerStack->pTab );
584e22a334bSdrh           pExpr->iDb = pTriggerStack->pTab->iDb;
585c3f9bad2Sdanielk1977           cntTab++;
586c3f9bad2Sdanielk1977           t = 1;
587c3f9bad2Sdanielk1977         }
588f29ce559Sdanielk1977         if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){
589f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->oldIdx;
590e22a334bSdrh           assert( pTriggerStack->pTab );
591e22a334bSdrh           pExpr->iDb = pTriggerStack->pTab->iDb;
592c3f9bad2Sdanielk1977           cntTab++;
593c3f9bad2Sdanielk1977           t = 1;
594c3f9bad2Sdanielk1977         }
595c3f9bad2Sdanielk1977 
596f29ce559Sdanielk1977         if( t ){
597f29ce559Sdanielk1977 	  int j;
598c9b84a1fSdrh           Table *pTab = pTriggerStack->pTab;
599c9b84a1fSdrh           for(j=0; j < pTab->nCol; j++) {
600c9b84a1fSdrh             if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
601c3f9bad2Sdanielk1977               cnt++;
60270ce3f0cSdrh               pExpr->iColumn = j==pTab->iPKey ? -1 : j;
603c9b84a1fSdrh               pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
604c3f9bad2Sdanielk1977             }
605c3f9bad2Sdanielk1977           }
606c3f9bad2Sdanielk1977 	}
607f29ce559Sdanielk1977       }
608c3f9bad2Sdanielk1977 
609c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
610c4a3c779Sdrh         cnt = 1;
611c4a3c779Sdrh         pExpr->iColumn = -1;
612c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
613c4a3c779Sdrh       }
614d24cc427Sdrh       sqliteFree(zDb);
615cce7d176Sdrh       sqliteFree(zLeft);
616cce7d176Sdrh       sqliteFree(zRight);
617cce7d176Sdrh       if( cnt==0 ){
618da93d238Sdrh         sqliteErrorMsg(pParse, "no such column: %T.%T",
619da93d238Sdrh                &pLeft->token, &pRight->token);
620cce7d176Sdrh         return 1;
621cce7d176Sdrh       }else if( cnt>1 ){
622da93d238Sdrh         sqliteErrorMsg(pParse, "ambiguous column name: %T.%T",
623da93d238Sdrh           &pLeft->token, &pRight->token);
624cce7d176Sdrh         return 1;
625cce7d176Sdrh       }
626d24cc427Sdrh       sqliteExprDelete(pExpr->pLeft);
627cce7d176Sdrh       pExpr->pLeft = 0;
628d24cc427Sdrh       sqliteExprDelete(pExpr->pRight);
629cce7d176Sdrh       pExpr->pRight = 0;
630967e8b73Sdrh       pExpr->op = TK_COLUMN;
6316a3ea0e6Sdrh       sqliteAuthRead(pParse, pExpr, pTabList);
632cce7d176Sdrh       break;
633cce7d176Sdrh     }
634cce7d176Sdrh 
635fef5208cSdrh     case TK_IN: {
636d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
637fef5208cSdrh       if( v==0 ) return 1;
6386a3ea0e6Sdrh       if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
639cfab11bcSdrh         return 1;
640cfab11bcSdrh       }
641fef5208cSdrh       if( pExpr->pSelect ){
642fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
643fef5208cSdrh         **
644fef5208cSdrh         ** Generate code to write the results of the select into a temporary
6454794b980Sdrh         ** table.  The cursor number of the temporary table has already
6464794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
647fef5208cSdrh         */
648832508b7Sdrh         pExpr->iTable = pParse->nTab++;
649c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
650832508b7Sdrh         sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0);
651fef5208cSdrh       }else if( pExpr->pList ){
652fef5208cSdrh         /* Case 2:     expr IN (exprlist)
653fef5208cSdrh         **
654fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
655fef5208cSdrh         ** in iTable.
656fef5208cSdrh         */
657fef5208cSdrh         int i, iSet;
658fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
659fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
6609208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
661da93d238Sdrh             sqliteErrorMsg(pParse,
662da93d238Sdrh               "right-hand side of IN operator must be constant");
663fef5208cSdrh             return 1;
664fef5208cSdrh           }
6654794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
6664794b980Sdrh             return 1;
6674794b980Sdrh           }
668fef5208cSdrh         }
669fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
670fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
671fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
672fef5208cSdrh           switch( pE2->op ){
673fef5208cSdrh             case TK_FLOAT:
674fef5208cSdrh             case TK_INTEGER:
675fef5208cSdrh             case TK_STRING: {
67699fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
677a76b5dfcSdrh               assert( pE2->token.z );
678fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
679fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
680fef5208cSdrh               break;
681fef5208cSdrh             }
682fef5208cSdrh             default: {
683fef5208cSdrh               sqliteExprCode(pParse, pE2);
68499fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
685fef5208cSdrh               break;
686fef5208cSdrh             }
687fef5208cSdrh           }
688fef5208cSdrh         }
689fef5208cSdrh       }
690cfab11bcSdrh       break;
691fef5208cSdrh     }
692fef5208cSdrh 
69319a775c2Sdrh     case TK_SELECT: {
694fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
695fef5208cSdrh       ** value of this select in a memory cell and record the number
696967e8b73Sdrh       ** of the memory cell in iColumn.
697fef5208cSdrh       */
698967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
699832508b7Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
70019a775c2Sdrh         return 1;
70119a775c2Sdrh       }
70219a775c2Sdrh       break;
70319a775c2Sdrh     }
70419a775c2Sdrh 
705cce7d176Sdrh     /* For all else, just recursively walk the tree */
706cce7d176Sdrh     default: {
707cce7d176Sdrh       if( pExpr->pLeft
7086a3ea0e6Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
709cce7d176Sdrh         return 1;
710cce7d176Sdrh       }
711cce7d176Sdrh       if( pExpr->pRight
7126a3ea0e6Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){
713cce7d176Sdrh         return 1;
714cce7d176Sdrh       }
715cce7d176Sdrh       if( pExpr->pList ){
716cce7d176Sdrh         int i;
717cce7d176Sdrh         ExprList *pList = pExpr->pList;
718cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
719832508b7Sdrh           Expr *pArg = pList->a[i].pExpr;
7206a3ea0e6Sdrh           if( sqliteExprResolveIds(pParse, pTabList, pEList, pArg) ){
721cce7d176Sdrh             return 1;
722cce7d176Sdrh           }
723cce7d176Sdrh         }
724cce7d176Sdrh       }
725cce7d176Sdrh     }
726cce7d176Sdrh   }
727cce7d176Sdrh   return 0;
728cce7d176Sdrh }
729cce7d176Sdrh 
730cce7d176Sdrh /*
7314b59ab5eSdrh ** pExpr is a node that defines a function of some kind.  It might
7324b59ab5eSdrh ** be a syntactic function like "count(x)" or it might be a function
7334b59ab5eSdrh ** that implements an operator, like "a LIKE b".
7344b59ab5eSdrh **
7354b59ab5eSdrh ** This routine makes *pzName point to the name of the function and
7364b59ab5eSdrh ** *pnName hold the number of characters in the function name.
7374b59ab5eSdrh */
7384b59ab5eSdrh static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){
7394b59ab5eSdrh   switch( pExpr->op ){
7404b59ab5eSdrh     case TK_FUNCTION: {
7414b59ab5eSdrh       *pzName = pExpr->token.z;
7426977fea8Sdrh       *pnName = pExpr->token.n;
7434b59ab5eSdrh       break;
7444b59ab5eSdrh     }
7454b59ab5eSdrh     case TK_LIKE: {
7464b59ab5eSdrh       *pzName = "like";
7474b59ab5eSdrh       *pnName = 4;
7484b59ab5eSdrh       break;
7494b59ab5eSdrh     }
7504b59ab5eSdrh     case TK_GLOB: {
7514b59ab5eSdrh       *pzName = "glob";
7524b59ab5eSdrh       *pnName = 4;
7534b59ab5eSdrh       break;
7544b59ab5eSdrh     }
7554b59ab5eSdrh     default: {
7564b59ab5eSdrh       *pzName = "can't happen";
7574b59ab5eSdrh       *pnName = 12;
7584b59ab5eSdrh       break;
7594b59ab5eSdrh     }
7604b59ab5eSdrh   }
7614b59ab5eSdrh }
7624b59ab5eSdrh 
7634b59ab5eSdrh /*
764cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
765cce7d176Sdrh ** function names are recognized and all functions have the correct
766cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
767cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
768cce7d176Sdrh **
769cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
770cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
771cce7d176Sdrh */
772cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
773cce7d176Sdrh   int nErr = 0;
774cce7d176Sdrh   if( pExpr==0 ) return 0;
775cce7d176Sdrh   switch( pExpr->op ){
7764b59ab5eSdrh     case TK_GLOB:
7774b59ab5eSdrh     case TK_LIKE:
778cce7d176Sdrh     case TK_FUNCTION: {
779c9b84a1fSdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;  /* Number of arguments */
780c9b84a1fSdrh       int no_such_func = 0;       /* True if no such function exists */
781c9b84a1fSdrh       int is_type_of = 0;         /* True if is the special TypeOf() function */
782c9b84a1fSdrh       int wrong_num_args = 0;     /* True if wrong number of arguments */
783c9b84a1fSdrh       int is_agg = 0;             /* True if is an aggregate function */
784cce7d176Sdrh       int i;
7854b59ab5eSdrh       int nId;                    /* Number of characters in function name */
7864b59ab5eSdrh       const char *zId;            /* The function name. */
7870bce8354Sdrh       FuncDef *pDef;
7880bce8354Sdrh 
7894b59ab5eSdrh       getFunctionName(pExpr, &zId, &nId);
7904b59ab5eSdrh       pDef = sqliteFindFunction(pParse->db, zId, nId, n, 0);
7910bce8354Sdrh       if( pDef==0 ){
7924b59ab5eSdrh         pDef = sqliteFindFunction(pParse->db, zId, nId, -1, 0);
7930bce8354Sdrh         if( pDef==0 ){
7944b59ab5eSdrh           if( n==1 && nId==6 && sqliteStrNICmp(zId, "typeof", 6)==0 ){
795c9b84a1fSdrh             is_type_of = 1;
796c9b84a1fSdrh           }else {
797cce7d176Sdrh             no_such_func = 1;
798c9b84a1fSdrh           }
7998e0a2f90Sdrh         }else{
8008e0a2f90Sdrh           wrong_num_args = 1;
8018e0a2f90Sdrh         }
8028e0a2f90Sdrh       }else{
8030bce8354Sdrh         is_agg = pDef->xFunc==0;
804cce7d176Sdrh       }
8058e0a2f90Sdrh       if( is_agg && !allowAgg ){
8068e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1,
8074b59ab5eSdrh            zId, nId, "()", 2, 0);
8088e0a2f90Sdrh         pParse->nErr++;
8098e0a2f90Sdrh         nErr++;
8108e0a2f90Sdrh         is_agg = 0;
8118e0a2f90Sdrh       }else if( no_such_func ){
8124b59ab5eSdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, zId,nId,0);
813cce7d176Sdrh         pParse->nErr++;
814cce7d176Sdrh         nErr++;
8158e0a2f90Sdrh       }else if( wrong_num_args ){
8168e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg,
8174b59ab5eSdrh            "wrong number of arguments to function ", -1, zId, nId, "()", 2, 0);
8188e0a2f90Sdrh         pParse->nErr++;
8198e0a2f90Sdrh         nErr++;
820cce7d176Sdrh       }
8212282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
822cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
823cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
8244cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
8254cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
826cce7d176Sdrh       }
827c9b84a1fSdrh       if( pDef==0 ){
828c9b84a1fSdrh         if( is_type_of ){
829c9b84a1fSdrh           pExpr->op = TK_STRING;
830c9b84a1fSdrh           if( sqliteExprType(pExpr->pList->a[0].pExpr)==SQLITE_SO_NUM ){
831c9b84a1fSdrh             pExpr->token.z = "numeric";
832c9b84a1fSdrh             pExpr->token.n = 7;
833c9b84a1fSdrh           }else{
834c9b84a1fSdrh             pExpr->token.z = "text";
835c9b84a1fSdrh             pExpr->token.n = 4;
836c9b84a1fSdrh           }
837c9b84a1fSdrh         }
838c9b84a1fSdrh       }else if( pDef->dataType>=0 ){
839c9b84a1fSdrh         if( pDef->dataType<n ){
840c9b84a1fSdrh           pExpr->dataType =
841c9b84a1fSdrh              sqliteExprType(pExpr->pList->a[pDef->dataType].pExpr);
842c9b84a1fSdrh         }else{
843c9b84a1fSdrh           pExpr->dataType = SQLITE_SO_NUM;
844c9b84a1fSdrh         }
845c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_ARGS ){
846c9b84a1fSdrh         pDef->dataType = SQLITE_SO_TEXT;
847c9b84a1fSdrh         for(i=0; i<n; i++){
848c9b84a1fSdrh           if( sqliteExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){
849c9b84a1fSdrh             pExpr->dataType = SQLITE_SO_NUM;
850c9b84a1fSdrh             break;
851c9b84a1fSdrh           }
852c9b84a1fSdrh         }
853c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_NUMERIC ){
854c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
855c9b84a1fSdrh       }else{
856c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_TEXT;
857c9b84a1fSdrh       }
858cce7d176Sdrh     }
859cce7d176Sdrh     default: {
860cce7d176Sdrh       if( pExpr->pLeft ){
8612282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
862cce7d176Sdrh       }
863cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
8642282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
865cce7d176Sdrh       }
866fef5208cSdrh       if( nErr==0 && pExpr->pList ){
867fef5208cSdrh         int n = pExpr->pList->nExpr;
868fef5208cSdrh         int i;
869fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
8702282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
8712282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
872fef5208cSdrh         }
873fef5208cSdrh       }
874cce7d176Sdrh       break;
875cce7d176Sdrh     }
876cce7d176Sdrh   }
877cce7d176Sdrh   return nErr;
878cce7d176Sdrh }
879cce7d176Sdrh 
880cce7d176Sdrh /*
881c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the
882c9b84a1fSdrh ** given expression should sort as numeric values or as text.
883c9b84a1fSdrh **
884c9b84a1fSdrh ** The sqliteExprResolveIds() and sqliteExprCheck() routines must have
885c9b84a1fSdrh ** both been called on the expression before it is passed to this routine.
886c9b84a1fSdrh */
887c9b84a1fSdrh int sqliteExprType(Expr *p){
888c9b84a1fSdrh   if( p==0 ) return SQLITE_SO_NUM;
889c9b84a1fSdrh   while( p ) switch( p->op ){
890c9b84a1fSdrh     case TK_PLUS:
891c9b84a1fSdrh     case TK_MINUS:
892c9b84a1fSdrh     case TK_STAR:
893c9b84a1fSdrh     case TK_SLASH:
894c9b84a1fSdrh     case TK_AND:
895c9b84a1fSdrh     case TK_OR:
896c9b84a1fSdrh     case TK_ISNULL:
897c9b84a1fSdrh     case TK_NOTNULL:
898c9b84a1fSdrh     case TK_NOT:
899c9b84a1fSdrh     case TK_UMINUS:
9004b59ab5eSdrh     case TK_UPLUS:
901c9b84a1fSdrh     case TK_BITAND:
902c9b84a1fSdrh     case TK_BITOR:
903c9b84a1fSdrh     case TK_BITNOT:
904c9b84a1fSdrh     case TK_LSHIFT:
905c9b84a1fSdrh     case TK_RSHIFT:
906c9b84a1fSdrh     case TK_REM:
907c9b84a1fSdrh     case TK_INTEGER:
908c9b84a1fSdrh     case TK_FLOAT:
909c9b84a1fSdrh     case TK_IN:
910c9b84a1fSdrh     case TK_BETWEEN:
9114b59ab5eSdrh     case TK_GLOB:
9124b59ab5eSdrh     case TK_LIKE:
913c9b84a1fSdrh       return SQLITE_SO_NUM;
914c9b84a1fSdrh 
915c9b84a1fSdrh     case TK_STRING:
916c9b84a1fSdrh     case TK_NULL:
917c9b84a1fSdrh     case TK_CONCAT:
91850457896Sdrh     case TK_VARIABLE:
919c9b84a1fSdrh       return SQLITE_SO_TEXT;
920c9b84a1fSdrh 
921c9b84a1fSdrh     case TK_LT:
922c9b84a1fSdrh     case TK_LE:
923c9b84a1fSdrh     case TK_GT:
924c9b84a1fSdrh     case TK_GE:
925c9b84a1fSdrh     case TK_NE:
926c9b84a1fSdrh     case TK_EQ:
927c9b84a1fSdrh       if( sqliteExprType(p->pLeft)==SQLITE_SO_NUM ){
928c9b84a1fSdrh         return SQLITE_SO_NUM;
929c9b84a1fSdrh       }
930c9b84a1fSdrh       p = p->pRight;
931c9b84a1fSdrh       break;
932c9b84a1fSdrh 
933c9b84a1fSdrh     case TK_AS:
934c9b84a1fSdrh       p = p->pLeft;
935c9b84a1fSdrh       break;
936c9b84a1fSdrh 
937c9b84a1fSdrh     case TK_COLUMN:
938c9b84a1fSdrh     case TK_FUNCTION:
939c9b84a1fSdrh     case TK_AGG_FUNCTION:
940c9b84a1fSdrh       return p->dataType;
941c9b84a1fSdrh 
942c9b84a1fSdrh     case TK_SELECT:
943c9b84a1fSdrh       assert( p->pSelect );
944c9b84a1fSdrh       assert( p->pSelect->pEList );
945c9b84a1fSdrh       assert( p->pSelect->pEList->nExpr>0 );
946c9b84a1fSdrh       p = p->pSelect->pEList->a[0].pExpr;
947c9b84a1fSdrh       break;
948c9b84a1fSdrh 
949b1363206Sdrh     case TK_CASE: {
950b1363206Sdrh       if( p->pRight && sqliteExprType(p->pRight)==SQLITE_SO_NUM ){
951b1363206Sdrh         return SQLITE_SO_NUM;
952b1363206Sdrh       }
953b1363206Sdrh       if( p->pList ){
954b1363206Sdrh         int i;
955b1363206Sdrh         ExprList *pList = p->pList;
956b1363206Sdrh         for(i=1; i<pList->nExpr; i+=2){
957b1363206Sdrh           if( sqliteExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){
958b1363206Sdrh             return SQLITE_SO_NUM;
959b1363206Sdrh           }
960b1363206Sdrh         }
961b1363206Sdrh       }
962b1363206Sdrh       return SQLITE_SO_TEXT;
963b1363206Sdrh     }
964b1363206Sdrh 
965c9b84a1fSdrh     default:
966c9b84a1fSdrh       assert( p->op==TK_ABORT );  /* Can't Happen */
967c9b84a1fSdrh       break;
968c9b84a1fSdrh   }
969c9b84a1fSdrh   return SQLITE_SO_NUM;
970c9b84a1fSdrh }
971c9b84a1fSdrh 
972c9b84a1fSdrh /*
973cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
9741ccde15dSdrh ** expression and leave the result on the top of stack.
975cce7d176Sdrh */
976cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
977cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
978cce7d176Sdrh   int op;
979daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
980cce7d176Sdrh   switch( pExpr->op ){
981cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
982cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
983cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
984cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
985cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
986cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
987cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
988cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
989cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
990cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
991cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
992cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
993cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
994cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
995cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
996cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
997bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
998bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
999bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
1000bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
1001bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
1002bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
1003cce7d176Sdrh     default: break;
1004cce7d176Sdrh   }
1005cce7d176Sdrh   switch( pExpr->op ){
1006967e8b73Sdrh     case TK_COLUMN: {
10072282792aSdrh       if( pParse->useAgg ){
100899fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
1009c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
101099fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
1011c4a3c779Sdrh       }else{
101299fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
10132282792aSdrh       }
1014cce7d176Sdrh       break;
1015cce7d176Sdrh     }
1016cce7d176Sdrh     case TK_INTEGER: {
1017202b2df7Sdrh       if( !sqliteFitsIn32Bits(pExpr->token.z) ){
1018d9e30930Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
1019d9e30930Sdrh       }else{
1020202b2df7Sdrh         sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0);
1021d9e30930Sdrh       }
1022e6840900Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
1023e6840900Sdrh       break;
1024e6840900Sdrh     }
1025e6840900Sdrh     case TK_FLOAT: {
10267a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
1027a76b5dfcSdrh       assert( pExpr->token.z );
10287a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
1029cce7d176Sdrh       break;
1030cce7d176Sdrh     }
1031cce7d176Sdrh     case TK_STRING: {
103299fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
1033a76b5dfcSdrh       assert( pExpr->token.z );
1034cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
1035cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
1036cce7d176Sdrh       break;
1037cce7d176Sdrh     }
1038cce7d176Sdrh     case TK_NULL: {
103999fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
1040cce7d176Sdrh       break;
1041cce7d176Sdrh     }
104250457896Sdrh     case TK_VARIABLE: {
10437c972decSdrh       sqliteVdbeAddOp(v, OP_Variable, pExpr->iTable, 0);
104450457896Sdrh       break;
104550457896Sdrh     }
1046c9b84a1fSdrh     case TK_LT:
1047c9b84a1fSdrh     case TK_LE:
1048c9b84a1fSdrh     case TK_GT:
1049c9b84a1fSdrh     case TK_GE:
1050c9b84a1fSdrh     case TK_NE:
1051c9b84a1fSdrh     case TK_EQ: {
1052491791a8Sdrh       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
1053c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1054c9b84a1fSdrh       }
1055c9b84a1fSdrh       /* Fall through into the next case */
1056c9b84a1fSdrh     }
1057cce7d176Sdrh     case TK_AND:
1058cce7d176Sdrh     case TK_OR:
1059cce7d176Sdrh     case TK_PLUS:
1060cce7d176Sdrh     case TK_STAR:
1061cce7d176Sdrh     case TK_MINUS:
1062bf4133cbSdrh     case TK_REM:
1063bf4133cbSdrh     case TK_BITAND:
1064bf4133cbSdrh     case TK_BITOR:
1065c9b84a1fSdrh     case TK_SLASH: {
1066cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1067cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
106899fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
1069cce7d176Sdrh       break;
1070cce7d176Sdrh     }
1071bf4133cbSdrh     case TK_LSHIFT:
1072bf4133cbSdrh     case TK_RSHIFT: {
1073bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
1074bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1075bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
1076bf4133cbSdrh       break;
1077bf4133cbSdrh     }
10780040077dSdrh     case TK_CONCAT: {
10790040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
10800040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
108199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
10820040077dSdrh       break;
10830040077dSdrh     }
10844b59ab5eSdrh     case TK_UPLUS: {
10854b59ab5eSdrh       Expr *pLeft = pExpr->pLeft;
10864b59ab5eSdrh       if( pLeft && pLeft->op==TK_INTEGER ){
1087202b2df7Sdrh         if( sqliteFitsIn32Bits(pLeft->token.z) ){
10884b59ab5eSdrh           sqliteVdbeAddOp(v, OP_Integer, atoi(pLeft->token.z), 0);
1089202b2df7Sdrh         }else{
1090202b2df7Sdrh           sqliteVdbeAddOp(v, OP_String, 0, 0);
1091202b2df7Sdrh         }
10924b59ab5eSdrh         sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n);
10934b59ab5eSdrh       }else if( pLeft && pLeft->op==TK_FLOAT ){
10944b59ab5eSdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
10954b59ab5eSdrh         sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n);
10964b59ab5eSdrh       }else{
10974b59ab5eSdrh         sqliteExprCode(pParse, pExpr->pLeft);
10984b59ab5eSdrh       }
10994b59ab5eSdrh       break;
11004b59ab5eSdrh     }
1101cce7d176Sdrh     case TK_UMINUS: {
11026e142f54Sdrh       assert( pExpr->pLeft );
11037a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
11046e142f54Sdrh         Token *p = &pExpr->pLeft->token;
11056e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
11066e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
1107202b2df7Sdrh         if( pExpr->pLeft->op==TK_INTEGER && sqliteFitsIn32Bits(z) ){
1108e6840900Sdrh           sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0);
1109e6840900Sdrh         }else{
111099fcd718Sdrh           sqliteVdbeAddOp(v, OP_String, 0, 0);
1111e6840900Sdrh         }
111299fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
11136e142f54Sdrh         sqliteFree(z);
11146e142f54Sdrh         break;
11156e142f54Sdrh       }
11161ccde15dSdrh       /* Fall through into TK_NOT */
11176e142f54Sdrh     }
1118bf4133cbSdrh     case TK_BITNOT:
11196e142f54Sdrh     case TK_NOT: {
1120cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
112199fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
1122cce7d176Sdrh       break;
1123cce7d176Sdrh     }
1124cce7d176Sdrh     case TK_ISNULL:
1125cce7d176Sdrh     case TK_NOTNULL: {
1126cce7d176Sdrh       int dest;
112799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
1128cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1129cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
1130f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
113199fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
1132cce7d176Sdrh       break;
1133cce7d176Sdrh     }
11342282792aSdrh     case TK_AGG_FUNCTION: {
113599fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
11362282792aSdrh       break;
11372282792aSdrh     }
11384b59ab5eSdrh     case TK_GLOB:
11394b59ab5eSdrh     case TK_LIKE:
1140cce7d176Sdrh     case TK_FUNCTION: {
1141cce7d176Sdrh       int i;
1142cce7d176Sdrh       ExprList *pList = pExpr->pList;
114389425d5eSdrh       int nExpr = pList ? pList->nExpr : 0;
11440bce8354Sdrh       FuncDef *pDef;
11454b59ab5eSdrh       int nId;
11464b59ab5eSdrh       const char *zId;
11474b59ab5eSdrh       getFunctionName(pExpr, &zId, &nId);
11484b59ab5eSdrh       pDef = sqliteFindFunction(pParse->db, zId, nId, nExpr, 0);
11490bce8354Sdrh       assert( pDef!=0 );
115089425d5eSdrh       for(i=0; i<nExpr; i++){
11518e0a2f90Sdrh         sqliteExprCode(pParse, pList->a[i].pExpr);
11528e0a2f90Sdrh       }
115389425d5eSdrh       sqliteVdbeAddOp(v, OP_Function, nExpr, 0);
11540bce8354Sdrh       sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER);
11556ec2733bSdrh       break;
11566ec2733bSdrh     }
115719a775c2Sdrh     case TK_SELECT: {
115899fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
115919a775c2Sdrh       break;
116019a775c2Sdrh     }
1161fef5208cSdrh     case TK_IN: {
1162fef5208cSdrh       int addr;
116399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
1164fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1165fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1166f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4);
1167f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1168f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
1169f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, addr+6);
1170fef5208cSdrh       if( pExpr->pSelect ){
1171f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6);
1172fef5208cSdrh       }else{
1173f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6);
1174fef5208cSdrh       }
117599fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
1176fef5208cSdrh       break;
1177fef5208cSdrh     }
1178fef5208cSdrh     case TK_BETWEEN: {
1179f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1180f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1181f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1182f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, 0);
1183f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pull, 1, 0);
1184f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1185f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, 0);
1186f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_And, 0, 0);
1187fef5208cSdrh       break;
1188fef5208cSdrh     }
1189a2e00042Sdrh     case TK_AS: {
1190a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1191a2e00042Sdrh       break;
1192a2e00042Sdrh     }
119317a7f8ddSdrh     case TK_CASE: {
119417a7f8ddSdrh       int expr_end_label;
1195f5905aa7Sdrh       int jumpInst;
1196f5905aa7Sdrh       int addr;
1197f5905aa7Sdrh       int nExpr;
119817a7f8ddSdrh       int i;
119917a7f8ddSdrh 
120017a7f8ddSdrh       assert(pExpr->pList);
120117a7f8ddSdrh       assert((pExpr->pList->nExpr % 2) == 0);
120217a7f8ddSdrh       assert(pExpr->pList->nExpr > 0);
1203f5905aa7Sdrh       nExpr = pExpr->pList->nExpr;
1204f5905aa7Sdrh       expr_end_label = sqliteVdbeMakeLabel(v);
120517a7f8ddSdrh       if( pExpr->pLeft ){
120617a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pLeft);
1207cce7d176Sdrh       }
1208f5905aa7Sdrh       for(i=0; i<nExpr; i=i+2){
120917a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i].pExpr);
121017a7f8ddSdrh         if( pExpr->pLeft ){
1211f5905aa7Sdrh           sqliteVdbeAddOp(v, OP_Dup, 1, 1);
1212f570f011Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_Ne, 1, 0);
1213f570f011Sdrh           sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1214f5905aa7Sdrh         }else{
1215f570f011Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 1, 0);
121617a7f8ddSdrh         }
121717a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr);
1218f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label);
1219f5905aa7Sdrh         addr = sqliteVdbeCurrentAddr(v);
1220f5905aa7Sdrh         sqliteVdbeChangeP2(v, jumpInst, addr);
122117a7f8ddSdrh       }
1222f570f011Sdrh       if( pExpr->pLeft ){
1223f570f011Sdrh         sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1224f570f011Sdrh       }
122517a7f8ddSdrh       if( pExpr->pRight ){
122617a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pRight);
122717a7f8ddSdrh       }else{
1228f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
122917a7f8ddSdrh       }
1230f5905aa7Sdrh       sqliteVdbeResolveLabel(v, expr_end_label);
12316f34903eSdanielk1977       break;
12326f34903eSdanielk1977     }
12336f34903eSdanielk1977     case TK_RAISE: {
12346f34903eSdanielk1977       if( !pParse->trigStack ){
1235da93d238Sdrh         sqliteErrorMsg(pParse,
1236da93d238Sdrh                        "RAISE() may only be used within a trigger-program");
12376f34903eSdanielk1977         pParse->nErr++;
12386f34903eSdanielk1977 	return;
12396f34903eSdanielk1977       }
12406f34903eSdanielk1977       if( pExpr->iColumn == OE_Rollback ||
12416f34903eSdanielk1977 	  pExpr->iColumn == OE_Abort ||
12426f34903eSdanielk1977 	  pExpr->iColumn == OE_Fail ){
12436f34903eSdanielk1977 	  char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
12446f34903eSdanielk1977 	  sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn);
12456f34903eSdanielk1977 	  sqliteDequote(msg);
12466f34903eSdanielk1977 	  sqliteVdbeChangeP3(v, -1, msg, 0);
12476f34903eSdanielk1977 	  sqliteFree(msg);
12486f34903eSdanielk1977       } else {
12496f34903eSdanielk1977 	  assert( pExpr->iColumn == OE_Ignore );
12506f34903eSdanielk1977 	  sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump);
1251483750baSdrh 	  sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", 0);
12526f34903eSdanielk1977       }
125317a7f8ddSdrh     }
125417a7f8ddSdrh     break;
125517a7f8ddSdrh   }
1256cce7d176Sdrh }
1257cce7d176Sdrh 
1258cce7d176Sdrh /*
1259cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
1260cce7d176Sdrh ** to the label "dest" if the expression is true but execution
1261cce7d176Sdrh ** continues straight thru if the expression is false.
1262f5905aa7Sdrh **
1263f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then
1264f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true.
1265cce7d176Sdrh */
1266f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1267cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1268cce7d176Sdrh   int op = 0;
1269daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1270cce7d176Sdrh   switch( pExpr->op ){
1271cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
1272cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
1273cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
1274cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
1275cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
1276cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
1277cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
1278cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
1279cce7d176Sdrh     default:  break;
1280cce7d176Sdrh   }
1281cce7d176Sdrh   switch( pExpr->op ){
1282cce7d176Sdrh     case TK_AND: {
1283cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1284f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);
1285f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1286cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1287cce7d176Sdrh       break;
1288cce7d176Sdrh     }
1289cce7d176Sdrh     case TK_OR: {
1290f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1291f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1292cce7d176Sdrh       break;
1293cce7d176Sdrh     }
1294cce7d176Sdrh     case TK_NOT: {
1295f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1296cce7d176Sdrh       break;
1297cce7d176Sdrh     }
1298cce7d176Sdrh     case TK_LT:
1299cce7d176Sdrh     case TK_LE:
1300cce7d176Sdrh     case TK_GT:
1301cce7d176Sdrh     case TK_GE:
1302cce7d176Sdrh     case TK_NE:
13030ac65892Sdrh     case TK_EQ: {
1304cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1305cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1306491791a8Sdrh       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
1307c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1308c9b84a1fSdrh       }
1309f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1310cce7d176Sdrh       break;
1311cce7d176Sdrh     }
1312cce7d176Sdrh     case TK_ISNULL:
1313cce7d176Sdrh     case TK_NOTNULL: {
1314cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1315f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1316cce7d176Sdrh       break;
1317cce7d176Sdrh     }
1318fef5208cSdrh     case TK_IN: {
1319f5905aa7Sdrh       int addr;
1320cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1321f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1322f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1323f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1324f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1325fef5208cSdrh       if( pExpr->pSelect ){
132699fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
1327fef5208cSdrh       }else{
132899fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
1329fef5208cSdrh       }
1330fef5208cSdrh       break;
1331fef5208cSdrh     }
1332fef5208cSdrh     case TK_BETWEEN: {
1333f5905aa7Sdrh       int addr;
1334fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
133599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1336fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1337f5905aa7Sdrh       addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0);
1338fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1339f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest);
134099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
1341f5905aa7Sdrh       sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v));
134299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1343fef5208cSdrh       break;
1344fef5208cSdrh     }
1345cce7d176Sdrh     default: {
1346cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1347f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest);
1348cce7d176Sdrh       break;
1349cce7d176Sdrh     }
1350cce7d176Sdrh   }
1351cce7d176Sdrh }
1352cce7d176Sdrh 
1353cce7d176Sdrh /*
135466b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
1355cce7d176Sdrh ** to the label "dest" if the expression is false but execution
1356cce7d176Sdrh ** continues straight thru if the expression is true.
1357f5905aa7Sdrh **
1358f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then
1359f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false.
1360cce7d176Sdrh */
1361f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1362cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1363cce7d176Sdrh   int op = 0;
1364daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1365cce7d176Sdrh   switch( pExpr->op ){
1366cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
1367cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
1368cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
1369cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
1370cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
1371cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
1372cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
1373cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
1374cce7d176Sdrh     default:  break;
1375cce7d176Sdrh   }
1376cce7d176Sdrh   switch( pExpr->op ){
1377cce7d176Sdrh     case TK_AND: {
1378f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1379f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1380cce7d176Sdrh       break;
1381cce7d176Sdrh     }
1382cce7d176Sdrh     case TK_OR: {
1383cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1384f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);
1385f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1386cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1387cce7d176Sdrh       break;
1388cce7d176Sdrh     }
1389cce7d176Sdrh     case TK_NOT: {
1390f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1391cce7d176Sdrh       break;
1392cce7d176Sdrh     }
1393cce7d176Sdrh     case TK_LT:
1394cce7d176Sdrh     case TK_LE:
1395cce7d176Sdrh     case TK_GT:
1396cce7d176Sdrh     case TK_GE:
1397cce7d176Sdrh     case TK_NE:
1398cce7d176Sdrh     case TK_EQ: {
1399491791a8Sdrh       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
14008f619ccdSdrh         /* Convert numeric comparison opcodes into text comparison opcodes.
14018f619ccdSdrh         ** This step depends on the fact that the text comparision opcodes are
14028f619ccdSdrh         ** always 6 greater than their corresponding numeric comparison
14038f619ccdSdrh         ** opcodes.
14048f619ccdSdrh         */
14058f619ccdSdrh         assert( OP_Eq+6 == OP_StrEq );
14068f619ccdSdrh         op += 6;
1407c9b84a1fSdrh       }
1408cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1409cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1410f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1411cce7d176Sdrh       break;
1412cce7d176Sdrh     }
1413cce7d176Sdrh     case TK_ISNULL:
1414cce7d176Sdrh     case TK_NOTNULL: {
1415cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1416f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1417cce7d176Sdrh       break;
1418cce7d176Sdrh     }
1419fef5208cSdrh     case TK_IN: {
1420f5905aa7Sdrh       int addr;
1421cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1422f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1423f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1424f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1425f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1426fef5208cSdrh       if( pExpr->pSelect ){
142799fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1428fef5208cSdrh       }else{
142999fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1430fef5208cSdrh       }
1431fef5208cSdrh       break;
1432fef5208cSdrh     }
1433fef5208cSdrh     case TK_BETWEEN: {
1434fef5208cSdrh       int addr;
1435fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
143699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1437fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1438fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1439f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3);
144099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
144199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
1442fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1443f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest);
1444fef5208cSdrh       break;
1445fef5208cSdrh     }
1446cce7d176Sdrh     default: {
1447cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1448461c281aSdrh       sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest);
1449cce7d176Sdrh       break;
1450cce7d176Sdrh     }
1451cce7d176Sdrh   }
1452cce7d176Sdrh }
14532282792aSdrh 
14542282792aSdrh /*
14552282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
14562282792aSdrh ** if they are identical and return FALSE if they differ in any way.
14572282792aSdrh */
1458d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
14592282792aSdrh   int i;
14602282792aSdrh   if( pA==0 ){
14612282792aSdrh     return pB==0;
14622282792aSdrh   }else if( pB==0 ){
14632282792aSdrh     return 0;
14642282792aSdrh   }
14652282792aSdrh   if( pA->op!=pB->op ) return 0;
1466d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1467d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
14682282792aSdrh   if( pA->pList ){
14692282792aSdrh     if( pB->pList==0 ) return 0;
14702282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
14712282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1472d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
14732282792aSdrh         return 0;
14742282792aSdrh       }
14752282792aSdrh     }
14762282792aSdrh   }else if( pB->pList ){
14772282792aSdrh     return 0;
14782282792aSdrh   }
14792282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
14802f2c01e5Sdrh   if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;
14812282792aSdrh   if( pA->token.z ){
14822282792aSdrh     if( pB->token.z==0 ) return 0;
14836977fea8Sdrh     if( pB->token.n!=pA->token.n ) return 0;
14846977fea8Sdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pB->token.n)!=0 ) return 0;
14852282792aSdrh   }
14862282792aSdrh   return 1;
14872282792aSdrh }
14882282792aSdrh 
14892282792aSdrh /*
14902282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
14912282792aSdrh */
14922282792aSdrh static int appendAggInfo(Parse *pParse){
14932282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
14942282792aSdrh     int amt = pParse->nAgg + 8;
14956d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
14966d4abfbeSdrh     if( aAgg==0 ){
14972282792aSdrh       return -1;
14982282792aSdrh     }
14996d4abfbeSdrh     pParse->aAgg = aAgg;
15002282792aSdrh   }
15012282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
15022282792aSdrh   return pParse->nAgg++;
15032282792aSdrh }
15042282792aSdrh 
15052282792aSdrh /*
15062282792aSdrh ** Analyze the given expression looking for aggregate functions and
15072282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
15082282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
15092282792aSdrh **
15102282792aSdrh ** This routine should only be called after the expression has been
15112282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
15122282792aSdrh **
15132282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
15142282792aSdrh ** the number of errors.
15152282792aSdrh */
15162282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
15172282792aSdrh   int i;
15182282792aSdrh   AggExpr *aAgg;
15192282792aSdrh   int nErr = 0;
15202282792aSdrh 
15212282792aSdrh   if( pExpr==0 ) return 0;
15222282792aSdrh   switch( pExpr->op ){
1523967e8b73Sdrh     case TK_COLUMN: {
15242282792aSdrh       aAgg = pParse->aAgg;
15252282792aSdrh       for(i=0; i<pParse->nAgg; i++){
15262282792aSdrh         if( aAgg[i].isAgg ) continue;
15272282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1528967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
15292282792aSdrh           break;
15302282792aSdrh         }
15312282792aSdrh       }
15322282792aSdrh       if( i>=pParse->nAgg ){
15332282792aSdrh         i = appendAggInfo(pParse);
15342282792aSdrh         if( i<0 ) return 1;
15352282792aSdrh         pParse->aAgg[i].isAgg = 0;
15362282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
15372282792aSdrh       }
1538aaf88729Sdrh       pExpr->iAgg = i;
15392282792aSdrh       break;
15402282792aSdrh     }
15412282792aSdrh     case TK_AGG_FUNCTION: {
15422282792aSdrh       aAgg = pParse->aAgg;
15432282792aSdrh       for(i=0; i<pParse->nAgg; i++){
15442282792aSdrh         if( !aAgg[i].isAgg ) continue;
1545d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
15462282792aSdrh           break;
15472282792aSdrh         }
15482282792aSdrh       }
15492282792aSdrh       if( i>=pParse->nAgg ){
15502282792aSdrh         i = appendAggInfo(pParse);
15512282792aSdrh         if( i<0 ) return 1;
15522282792aSdrh         pParse->aAgg[i].isAgg = 1;
15532282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
15540bce8354Sdrh         pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db,
15556977fea8Sdrh              pExpr->token.z, pExpr->token.n,
1556f55f25f0Sdrh              pExpr->pList ? pExpr->pList->nExpr : 0, 0);
15572282792aSdrh       }
15582282792aSdrh       pExpr->iAgg = i;
15592282792aSdrh       break;
15602282792aSdrh     }
15612282792aSdrh     default: {
15622282792aSdrh       if( pExpr->pLeft ){
15632282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
15642282792aSdrh       }
15652282792aSdrh       if( nErr==0 && pExpr->pRight ){
15662282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
15672282792aSdrh       }
15682282792aSdrh       if( nErr==0 && pExpr->pList ){
15692282792aSdrh         int n = pExpr->pList->nExpr;
15702282792aSdrh         int i;
15712282792aSdrh         for(i=0; nErr==0 && i<n; i++){
15722282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
15732282792aSdrh         }
15742282792aSdrh       }
15752282792aSdrh       break;
15762282792aSdrh     }
15772282792aSdrh   }
15782282792aSdrh   return nErr;
15792282792aSdrh }
15808e0a2f90Sdrh 
15818e0a2f90Sdrh /*
15828e0a2f90Sdrh ** Locate a user function given a name and a number of arguments.
15830bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that
15848e0a2f90Sdrh ** function, or return NULL if the function does not exist.
15858e0a2f90Sdrh **
15860bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef
15878e0a2f90Sdrh ** structure is created and liked into the "db" structure if a
15888e0a2f90Sdrh ** no matching function previously existed.  When createFlag is true
15898e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts
15908e0a2f90Sdrh ** any number of arguments will be returned.
15918e0a2f90Sdrh **
15928e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid
15938e0a2f90Sdrh ** function found is returned.  A function is valid if either xFunc
15948e0a2f90Sdrh ** or xStep is non-zero.
15958e0a2f90Sdrh */
15960bce8354Sdrh FuncDef *sqliteFindFunction(
15978e0a2f90Sdrh   sqlite *db,        /* An open database */
15988e0a2f90Sdrh   const char *zName, /* Name of the function.  Not null-terminated */
15998e0a2f90Sdrh   int nName,         /* Number of characters in the name */
16008e0a2f90Sdrh   int nArg,          /* Number of arguments.  -1 means any number */
16018e0a2f90Sdrh   int createFlag     /* Create new entry if true and does not otherwise exist */
16028e0a2f90Sdrh ){
16030bce8354Sdrh   FuncDef *pFirst, *p, *pMaybe;
16040bce8354Sdrh   pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName);
16051350b030Sdrh   if( p && !createFlag && nArg<0 ){
16068e0a2f90Sdrh     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
16078e0a2f90Sdrh     return p;
16088e0a2f90Sdrh   }
16098e0a2f90Sdrh   pMaybe = 0;
16108e0a2f90Sdrh   while( p && p->nArg!=nArg ){
16118e0a2f90Sdrh     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
16128e0a2f90Sdrh     p = p->pNext;
16138e0a2f90Sdrh   }
16148e0a2f90Sdrh   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
16158e0a2f90Sdrh     return 0;
16168e0a2f90Sdrh   }
16178e0a2f90Sdrh   if( p==0 && pMaybe ){
16188e0a2f90Sdrh     assert( createFlag==0 );
16198e0a2f90Sdrh     return pMaybe;
16208e0a2f90Sdrh   }
162189425d5eSdrh   if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
16228e0a2f90Sdrh     p->nArg = nArg;
16238e0a2f90Sdrh     p->pNext = pFirst;
1624c9b84a1fSdrh     p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC;
16250bce8354Sdrh     sqliteHashInsert(&db->aFunc, zName, nName, (void*)p);
16268e0a2f90Sdrh   }
16278e0a2f90Sdrh   return p;
16288e0a2f90Sdrh }
1629