xref: /sqlite-3.40.0/src/expr.c (revision 8f619ccd)
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*8f619ccdSdrh ** $Id: expr.c,v 1.81 2002/09/08 00:04:52 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 ){
29a76b5dfcSdrh     sqliteExprDelete(pLeft);
30a76b5dfcSdrh     sqliteExprDelete(pRight);
31a76b5dfcSdrh     return 0;
32a76b5dfcSdrh   }
33a76b5dfcSdrh   pNew->op = op;
34a76b5dfcSdrh   pNew->pLeft = pLeft;
35a76b5dfcSdrh   pNew->pRight = pRight;
36a76b5dfcSdrh   if( pToken ){
374b59ab5eSdrh     assert( pToken->dyn==0 );
38a76b5dfcSdrh     pNew->token = *pToken;
394b59ab5eSdrh     pNew->token.base = 1;
404b59ab5eSdrh   }else if( pLeft && pRight ){
414b59ab5eSdrh     sqliteExprSpan(pNew, &pLeft->token, &pRight->token);
42a76b5dfcSdrh   }else{
434b59ab5eSdrh     pNew->token.dyn = 0;
444b59ab5eSdrh     pNew->token.base = 1;
45a76b5dfcSdrh     pNew->token.z = 0;
46a76b5dfcSdrh     pNew->token.n = 0;
47a76b5dfcSdrh   }
48a76b5dfcSdrh   return pNew;
49a76b5dfcSdrh }
50a76b5dfcSdrh 
51a76b5dfcSdrh /*
52a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all
53a76b5dfcSdrh ** text between the two given tokens.
54a76b5dfcSdrh */
55a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
56a76b5dfcSdrh   if( pExpr ){
574b59ab5eSdrh     assert( pExpr->token.dyn==0 );
584b59ab5eSdrh     if( pLeft->dyn==0 && pRight->dyn==0 ){
594b59ab5eSdrh       pExpr->token.z = pLeft->z;
604b59ab5eSdrh       pExpr->token.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
614b59ab5eSdrh       pExpr->token.base = 0;
624b59ab5eSdrh     }else{
634b59ab5eSdrh       pExpr->token.z = 0;
644b59ab5eSdrh       pExpr->token.n = 0;
654b59ab5eSdrh       pExpr->token.dyn = 0;
664b59ab5eSdrh       pExpr->token.base = 0;
674b59ab5eSdrh     }
68a76b5dfcSdrh   }
69a76b5dfcSdrh }
70a76b5dfcSdrh 
71a76b5dfcSdrh /*
72a76b5dfcSdrh ** Construct a new expression node for a function with multiple
73a76b5dfcSdrh ** arguments.
74a76b5dfcSdrh */
75a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){
76a76b5dfcSdrh   Expr *pNew;
77a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
78a76b5dfcSdrh   if( pNew==0 ){
79a76b5dfcSdrh     sqliteExprListDelete(pList);
80a76b5dfcSdrh     return 0;
81a76b5dfcSdrh   }
82a76b5dfcSdrh   pNew->op = TK_FUNCTION;
83a76b5dfcSdrh   pNew->pList = pList;
844b59ab5eSdrh 
854b59ab5eSdrh   /* Expr.token.n is the length of the entire function
864b59ab5eSdrh   ** call, including the function arguments.  The parser
874b59ab5eSdrh   ** will extend token.n to cover the either length of the string.
884b59ab5eSdrh   ** Expr.nFuncName is the length of just the function name.
894b59ab5eSdrh   */
904b59ab5eSdrh   pNew->token.dyn = 0;
914b59ab5eSdrh   pNew->token.base = 1;
92a76b5dfcSdrh   if( pToken ){
934b59ab5eSdrh     assert( pToken->dyn==0 );
94a76b5dfcSdrh     pNew->token = *pToken;
954b59ab5eSdrh     pNew->nFuncName = pToken->n>255 ? 255 : pToken->n;
96a76b5dfcSdrh   }else{
97a76b5dfcSdrh     pNew->token.z = 0;
98a76b5dfcSdrh     pNew->token.n = 0;
99a76b5dfcSdrh   }
100a76b5dfcSdrh   return pNew;
101a76b5dfcSdrh }
102a76b5dfcSdrh 
103a76b5dfcSdrh /*
104a2e00042Sdrh ** Recursively delete an expression tree.
105a2e00042Sdrh */
106a2e00042Sdrh void sqliteExprDelete(Expr *p){
107a2e00042Sdrh   if( p==0 ) return;
1084b59ab5eSdrh   if( p->token.dyn && p->token.z ) sqliteFree((char*)p->token.z);
109a2e00042Sdrh   if( p->pLeft ) sqliteExprDelete(p->pLeft);
110a2e00042Sdrh   if( p->pRight ) sqliteExprDelete(p->pRight);
111a2e00042Sdrh   if( p->pList ) sqliteExprListDelete(p->pList);
112a2e00042Sdrh   if( p->pSelect ) sqliteSelectDelete(p->pSelect);
113a2e00042Sdrh   sqliteFree(p);
114a2e00042Sdrh }
115a2e00042Sdrh 
116a76b5dfcSdrh 
117a76b5dfcSdrh /*
118ff78bd2fSdrh ** The following group of routines make deep copies of expressions,
119ff78bd2fSdrh ** expression lists, ID lists, and select statements.  The copies can
120ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines)
121ff78bd2fSdrh ** without effecting the originals.
122ff78bd2fSdrh **
123ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(),
124ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded
125ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines.
126ff78bd2fSdrh **
127ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated.
128ff78bd2fSdrh */
129ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){
130ff78bd2fSdrh   Expr *pNew;
131ff78bd2fSdrh   if( p==0 ) return 0;
132ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
133ff78bd2fSdrh   if( pNew==0 ) return 0;
1343b167c75Sdrh   memcpy(pNew, p, sizeof(*pNew));
1354b59ab5eSdrh   /* Only make a copy of the token if it is a base token (meaning that
1364b59ab5eSdrh   ** it covers a single term of an expression - not two or more terms)
1374b59ab5eSdrh   ** or if it is already dynamically allocated.  So, for example, in
1384b59ab5eSdrh   ** a complex expression like "a+b+c", the token "b" would be duplicated
1394b59ab5eSdrh   ** but "a+b" would not be. */
1404b59ab5eSdrh   if( p->token.z!=0 && (p->token.base || p->token.dyn) ){
1414b59ab5eSdrh     pNew->token.z = sqliteStrDup(p->token.z);
1424b59ab5eSdrh     pNew->token.dyn = 1;
1434b59ab5eSdrh   }else{
1444b59ab5eSdrh     pNew->token.z = 0;
1454b59ab5eSdrh     pNew->token.n = 0;
1464b59ab5eSdrh     pNew->token.dyn = 0;
1474b59ab5eSdrh   }
148ff78bd2fSdrh   pNew->pLeft = sqliteExprDup(p->pLeft);
149ff78bd2fSdrh   pNew->pRight = sqliteExprDup(p->pRight);
150ff78bd2fSdrh   pNew->pList = sqliteExprListDup(p->pList);
151ff78bd2fSdrh   pNew->pSelect = sqliteSelectDup(p->pSelect);
152ff78bd2fSdrh   return pNew;
153ff78bd2fSdrh }
1544b59ab5eSdrh void sqliteTokenCopy(Token *pTo, Token *pFrom){
1554b59ab5eSdrh   if( pTo->dyn ) sqliteFree((char*)pTo->z);
1564b59ab5eSdrh   pTo->base = pFrom->base;
1574b59ab5eSdrh   if( pFrom->z ){
1584b59ab5eSdrh     pTo->n = pFrom->n;
1594b59ab5eSdrh     pTo->z = sqliteStrNDup(pFrom->z, pFrom->n);
1604b59ab5eSdrh     pTo->dyn = 1;
1614b59ab5eSdrh   }else{
1624b59ab5eSdrh     pTo->n = 0;
1634b59ab5eSdrh     pTo->z = 0;
1644b59ab5eSdrh     pTo->dyn = 0;
1654b59ab5eSdrh   }
1664b59ab5eSdrh }
167ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){
168ff78bd2fSdrh   ExprList *pNew;
169ff78bd2fSdrh   int i;
170ff78bd2fSdrh   if( p==0 ) return 0;
171ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
172ff78bd2fSdrh   if( pNew==0 ) return 0;
173ff78bd2fSdrh   pNew->nExpr = p->nExpr;
174ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
175e4697f5eSdrh   if( pNew->a==0 ) return 0;
176ff78bd2fSdrh   for(i=0; i<p->nExpr; i++){
1774b59ab5eSdrh     Expr *pNewExpr, *pOldExpr;
1784b59ab5eSdrh     pNew->a[i].pExpr = pNewExpr = sqliteExprDup(pOldExpr = p->a[i].pExpr);
1794b59ab5eSdrh     if( pOldExpr->token.z!=0 && pNewExpr && pNewExpr->token.z==0 ){
1804b59ab5eSdrh       /* Always make a copy of the token for top-level expressions in the
1814b59ab5eSdrh       ** expression list.  The logic in SELECT processing that determines
1824b59ab5eSdrh       ** the names of columns in the result set needs this information */
1834b59ab5eSdrh       sqliteTokenCopy(&pNew->a[i].pExpr->token, &p->a[i].pExpr->token);
1844b59ab5eSdrh     }
185ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
186ff78bd2fSdrh     pNew->a[i].sortOrder = p->a[i].sortOrder;
187ff78bd2fSdrh     pNew->a[i].isAgg = p->a[i].isAgg;
188ff78bd2fSdrh     pNew->a[i].done = 0;
189ff78bd2fSdrh   }
190ff78bd2fSdrh   return pNew;
191ff78bd2fSdrh }
192ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){
193ad3cab52Sdrh   SrcList *pNew;
194ad3cab52Sdrh   int i;
195ad3cab52Sdrh   if( p==0 ) return 0;
196ad3cab52Sdrh   pNew = sqliteMalloc( sizeof(*pNew) );
197ad3cab52Sdrh   if( pNew==0 ) return 0;
198ad3cab52Sdrh   pNew->nSrc = p->nSrc;
199ad3cab52Sdrh   pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) );
2006f34903eSdanielk1977   if( pNew->a==0 && p->nSrc != 0 ) return 0;
201ad3cab52Sdrh   for(i=0; i<p->nSrc; i++){
202ad3cab52Sdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
203ad3cab52Sdrh     pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias);
204ad3cab52Sdrh     pNew->a[i].jointype = p->a[i].jointype;
205ad3cab52Sdrh     pNew->a[i].pTab = 0;
206ad3cab52Sdrh     pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect);
207ad3cab52Sdrh     pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn);
208ad3cab52Sdrh     pNew->a[i].pUsing = sqliteIdListDup(p->a[i].pUsing);
209ad3cab52Sdrh   }
210ad3cab52Sdrh   return pNew;
211ad3cab52Sdrh }
212ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){
213ff78bd2fSdrh   IdList *pNew;
214ff78bd2fSdrh   int i;
215ff78bd2fSdrh   if( p==0 ) return 0;
216ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
217ff78bd2fSdrh   if( pNew==0 ) return 0;
218ff78bd2fSdrh   pNew->nId = p->nId;
219ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) );
220e4697f5eSdrh   if( pNew->a==0 ) return 0;
221ff78bd2fSdrh   for(i=0; i<p->nId; i++){
222ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
223ff78bd2fSdrh     pNew->a[i].idx = p->a[i].idx;
224ff78bd2fSdrh   }
225ff78bd2fSdrh   return pNew;
226ff78bd2fSdrh }
227ff78bd2fSdrh Select *sqliteSelectDup(Select *p){
228ff78bd2fSdrh   Select *pNew;
229ff78bd2fSdrh   if( p==0 ) return 0;
230ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
231ff78bd2fSdrh   if( pNew==0 ) return 0;
232ff78bd2fSdrh   pNew->isDistinct = p->isDistinct;
233ff78bd2fSdrh   pNew->pEList = sqliteExprListDup(p->pEList);
234ad3cab52Sdrh   pNew->pSrc = sqliteSrcListDup(p->pSrc);
235ff78bd2fSdrh   pNew->pWhere = sqliteExprDup(p->pWhere);
236ff78bd2fSdrh   pNew->pGroupBy = sqliteExprListDup(p->pGroupBy);
237ff78bd2fSdrh   pNew->pHaving = sqliteExprDup(p->pHaving);
238ff78bd2fSdrh   pNew->pOrderBy = sqliteExprListDup(p->pOrderBy);
239ff78bd2fSdrh   pNew->op = p->op;
240ff78bd2fSdrh   pNew->pPrior = sqliteSelectDup(p->pPrior);
241ff78bd2fSdrh   pNew->nLimit = p->nLimit;
242ff78bd2fSdrh   pNew->nOffset = p->nOffset;
243ff78bd2fSdrh   pNew->zSelect = 0;
244ff78bd2fSdrh   return pNew;
245ff78bd2fSdrh }
246ff78bd2fSdrh 
247ff78bd2fSdrh 
248ff78bd2fSdrh /*
249a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
250a76b5dfcSdrh ** initially NULL, then create a new expression list.
251a76b5dfcSdrh */
252a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
253a76b5dfcSdrh   int i;
254a76b5dfcSdrh   if( pList==0 ){
255a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
256a76b5dfcSdrh     if( pList==0 ){
257a76b5dfcSdrh       sqliteExprDelete(pExpr);
258a76b5dfcSdrh       return 0;
259a76b5dfcSdrh     }
260a76b5dfcSdrh   }
261a76b5dfcSdrh   if( (pList->nExpr & 7)==0 ){
262a76b5dfcSdrh     int n = pList->nExpr + 8;
263a76b5dfcSdrh     struct ExprList_item *a;
264a76b5dfcSdrh     a = sqliteRealloc(pList->a, n*sizeof(pList->a[0]));
265a76b5dfcSdrh     if( a==0 ){
266a76b5dfcSdrh       sqliteExprDelete(pExpr);
267a76b5dfcSdrh       return pList;
268a76b5dfcSdrh     }
269a76b5dfcSdrh     pList->a = a;
270a76b5dfcSdrh   }
271a76b5dfcSdrh   if( pExpr || pName ){
272a76b5dfcSdrh     i = pList->nExpr++;
273a76b5dfcSdrh     pList->a[i].pExpr = pExpr;
274a76b5dfcSdrh     pList->a[i].zName = 0;
275a76b5dfcSdrh     if( pName ){
276a76b5dfcSdrh       sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0);
277a76b5dfcSdrh       sqliteDequote(pList->a[i].zName);
278a76b5dfcSdrh     }
279a76b5dfcSdrh   }
280a76b5dfcSdrh   return pList;
281a76b5dfcSdrh }
282a76b5dfcSdrh 
283a76b5dfcSdrh /*
284a76b5dfcSdrh ** Delete an entire expression list.
285a76b5dfcSdrh */
286a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){
287a76b5dfcSdrh   int i;
288a76b5dfcSdrh   if( pList==0 ) return;
289a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
290a76b5dfcSdrh     sqliteExprDelete(pList->a[i].pExpr);
291a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
292a76b5dfcSdrh   }
293a76b5dfcSdrh   sqliteFree(pList->a);
294a76b5dfcSdrh   sqliteFree(pList);
295a76b5dfcSdrh }
296a76b5dfcSdrh 
297a76b5dfcSdrh /*
298fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
299fef5208cSdrh ** and 0 if it involves variables.
3002398937bSdrh **
3012398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc")
3022398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is
3032398937bSdrh ** a constant.
304fef5208cSdrh */
3059208643dSdrh int sqliteExprIsConstant(Expr *p){
306fef5208cSdrh   switch( p->op ){
307fef5208cSdrh     case TK_ID:
308967e8b73Sdrh     case TK_COLUMN:
309fef5208cSdrh     case TK_DOT:
310fef5208cSdrh       return 0;
3112398937bSdrh     case TK_STRING:
3122398937bSdrh       return p->token.z[0]=='\'';
3139208643dSdrh     case TK_INTEGER:
3149208643dSdrh     case TK_FLOAT:
3159208643dSdrh       return 1;
316fef5208cSdrh     default: {
3179208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
3189208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
319fef5208cSdrh       if( p->pList ){
320fef5208cSdrh         int i;
321fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
3229208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
323fef5208cSdrh         }
324fef5208cSdrh       }
3259208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
326fef5208cSdrh     }
327fef5208cSdrh   }
3289208643dSdrh   return 0;
329fef5208cSdrh }
330fef5208cSdrh 
331fef5208cSdrh /*
332e4de1febSdrh ** If the given expression codes a constant integer, return 1 and put
333e4de1febSdrh ** the value of the integer in *pValue.  If the expression is not an
334e4de1febSdrh ** integer, return 0 and leave *pValue unchanged.
335e4de1febSdrh */
336e4de1febSdrh int sqliteExprIsInteger(Expr *p, int *pValue){
337e4de1febSdrh   switch( p->op ){
338e4de1febSdrh     case TK_INTEGER: {
339e4de1febSdrh       *pValue = atoi(p->token.z);
340e4de1febSdrh       return 1;
341e4de1febSdrh     }
342e4de1febSdrh     case TK_STRING: {
343bd790ee3Sdrh       const char *z = p->token.z;
344e4de1febSdrh       int n = p->token.n;
345bd790ee3Sdrh       if( n>0 && z[0]=='-' ){ z++; n--; }
346e4de1febSdrh       while( n>0 && *z && isdigit(*z) ){ z++; n--; }
347e4de1febSdrh       if( n==0 ){
348e4de1febSdrh         *pValue = atoi(p->token.z);
349e4de1febSdrh         return 1;
350e4de1febSdrh       }
351e4de1febSdrh       break;
352e4de1febSdrh     }
3534b59ab5eSdrh     case TK_UPLUS: {
3544b59ab5eSdrh       return sqliteExprIsInteger(p->pLeft, pValue);
3554b59ab5eSdrh     }
356e4de1febSdrh     case TK_UMINUS: {
357e4de1febSdrh       int v;
358e4de1febSdrh       if( sqliteExprIsInteger(p->pLeft, &v) ){
359e4de1febSdrh         *pValue = -v;
360e4de1febSdrh         return 1;
361e4de1febSdrh       }
362e4de1febSdrh       break;
363e4de1febSdrh     }
364e4de1febSdrh     default: break;
365e4de1febSdrh   }
366e4de1febSdrh   return 0;
367e4de1febSdrh }
368e4de1febSdrh 
369e4de1febSdrh /*
370c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
371c4a3c779Sdrh */
372a9f9d1c0Sdrh int sqliteIsRowid(const char *z){
373c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
374c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
375c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
376c4a3c779Sdrh   return 0;
377c4a3c779Sdrh }
378c4a3c779Sdrh 
379c4a3c779Sdrh /*
380cce7d176Sdrh ** This routine walks an expression tree and resolves references to
381967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
382aacc543eSdrh ** index to the table in the table list and a column offset.  The
383aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
384aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
385832508b7Sdrh ** plus the "base" value.  The base value will ultimately become the
386aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
387aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
388aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
389aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
390aacc543eSdrh ** alias for ROWID.
39119a775c2Sdrh **
392fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
393fef5208cSdrh ** forms:
394fef5208cSdrh **
395fef5208cSdrh **           expr IN (exprlist)
396fef5208cSdrh ** and
397fef5208cSdrh **           expr IN (SELECT ...)
398fef5208cSdrh **
399fef5208cSdrh ** The first form is handled by creating a set holding the list
400fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
401fef5208cSdrh ** a temporary table.
402fef5208cSdrh **
403fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
40419a775c2Sdrh ** If it finds any, it generates code to write the value of that select
40519a775c2Sdrh ** into a memory cell.
406cce7d176Sdrh **
407967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
408cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
409cce7d176Sdrh */
410a2e00042Sdrh int sqliteExprResolveIds(
411a2e00042Sdrh   Parse *pParse,     /* The parser context */
412832508b7Sdrh   int base,          /* VDBE cursor number for first entry in pTabList */
413ad3cab52Sdrh   SrcList *pTabList, /* List of tables used to resolve column names */
414a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
415a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
416a2e00042Sdrh ){
417daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
418ad3cab52Sdrh   assert( base+pTabList->nSrc<=pParse->nTab );
419cce7d176Sdrh   switch( pExpr->op ){
4202398937bSdrh     /* Double-quoted strings (ex: "abc") are used as identifiers if
4212398937bSdrh     ** possible.  Otherwise they remain as strings.  Single-quoted
4222398937bSdrh     ** strings (ex: 'abc') are always string literals.
4232398937bSdrh     */
4242398937bSdrh     case TK_STRING: {
4252398937bSdrh       if( pExpr->token.z[0]=='\'' ) break;
4262398937bSdrh       /* Fall thru into the TK_ID case if this is a double-quoted string */
4272398937bSdrh     }
428a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
429a2e00042Sdrh     **
430a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
431a2e00042Sdrh     **
432a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
433a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
434a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
435a2e00042Sdrh     **
436a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
437a2e00042Sdrh     */
438cce7d176Sdrh     case TK_ID: {
439cce7d176Sdrh       int cnt = 0;      /* Number of matches */
440cce7d176Sdrh       int i;            /* Loop counter */
441a76b5dfcSdrh       char *z;
442a76b5dfcSdrh       assert( pExpr->token.z );
443a76b5dfcSdrh       z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
4442f4392ffSdrh       sqliteDequote(z);
445daffd0e5Sdrh       if( z==0 ) return 1;
446ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
447cce7d176Sdrh         int j;
448cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
449cce7d176Sdrh         if( pTab==0 ) continue;
450417be79cSdrh         assert( pTab->nCol>0 );
451cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
4527020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
453cce7d176Sdrh             cnt++;
454832508b7Sdrh             pExpr->iTable = i + base;
4554a32431cSdrh             if( j==pTab->iPKey ){
4564a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
4574a32431cSdrh               pExpr->iColumn = -1;
458c9b84a1fSdrh               pExpr->dataType = SQLITE_SO_NUM;
4594a32431cSdrh             }else{
460967e8b73Sdrh               pExpr->iColumn = j;
461c9b84a1fSdrh               pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
462cce7d176Sdrh             }
463a2e00042Sdrh             pExpr->op = TK_COLUMN;
464a2e00042Sdrh           }
465a2e00042Sdrh         }
466a2e00042Sdrh       }
467a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
468a2e00042Sdrh         int j;
469a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
470a2e00042Sdrh           char *zAs = pEList->a[j].zName;
471a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
472a2e00042Sdrh             cnt++;
473a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
474a2e00042Sdrh             pExpr->op = TK_AS;
475a2e00042Sdrh             pExpr->iColumn = j;
47675148a27Sdrh             pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr);
477cce7d176Sdrh           }
478cce7d176Sdrh         }
4794a32431cSdrh       }
480c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
481c4a3c779Sdrh         pExpr->iColumn = -1;
482832508b7Sdrh         pExpr->iTable = base;
483ad3cab52Sdrh         cnt = 1 + (pTabList->nSrc>1);
484a2e00042Sdrh         pExpr->op = TK_COLUMN;
485c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
486c4a3c779Sdrh       }
487cce7d176Sdrh       sqliteFree(z);
4882398937bSdrh       if( cnt==0 && pExpr->token.z[0]!='"' ){
489967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
490cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
491cce7d176Sdrh         pParse->nErr++;
492cce7d176Sdrh         return 1;
493cce7d176Sdrh       }else if( cnt>1 ){
494967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
495cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
496cce7d176Sdrh         pParse->nErr++;
497cce7d176Sdrh         return 1;
498cce7d176Sdrh       }
499cce7d176Sdrh       break;
500cce7d176Sdrh     }
501cce7d176Sdrh 
502967e8b73Sdrh     /* A table name and column name:  ID.ID */
503cce7d176Sdrh     case TK_DOT: {
504cce7d176Sdrh       int cnt = 0;             /* Number of matches */
505c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
506cce7d176Sdrh       int i;                   /* Loop counter */
507cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
508cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
509cce7d176Sdrh 
510cce7d176Sdrh       pLeft = pExpr->pLeft;
511cce7d176Sdrh       pRight = pExpr->pRight;
512a76b5dfcSdrh       assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );
513a76b5dfcSdrh       assert( pRight && pRight->op==TK_ID && pRight->token.z );
5146e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
5156e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
516daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
517daffd0e5Sdrh         sqliteFree(zLeft);
518daffd0e5Sdrh         sqliteFree(zRight);
519daffd0e5Sdrh         return 1;
520daffd0e5Sdrh       }
52187c40e88Sdrh       sqliteDequote(zLeft);
52287c40e88Sdrh       sqliteDequote(zRight);
523c4a3c779Sdrh       pExpr->iTable = -1;
524ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
525cce7d176Sdrh         int j;
526cce7d176Sdrh         char *zTab;
527cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
528cce7d176Sdrh         if( pTab==0 ) continue;
529417be79cSdrh         assert( pTab->nCol>0 );
530cce7d176Sdrh         if( pTabList->a[i].zAlias ){
531cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
532cce7d176Sdrh         }else{
533cce7d176Sdrh           zTab = pTab->zName;
534cce7d176Sdrh         }
535094b2bbfSdrh         if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue;
536832508b7Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + base;
537cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
5387020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
539cce7d176Sdrh             cnt++;
540832508b7Sdrh             pExpr->iTable = i + base;
5414a32431cSdrh             if( j==pTab->iPKey ){
5424a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
5434a32431cSdrh               pExpr->iColumn = -1;
5444a32431cSdrh             }else{
545967e8b73Sdrh               pExpr->iColumn = j;
546cce7d176Sdrh             }
547c9b84a1fSdrh             pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
548cce7d176Sdrh           }
549cce7d176Sdrh         }
5504a32431cSdrh       }
551c3f9bad2Sdanielk1977 
552c3f9bad2Sdanielk1977       /* If we have not already resolved this *.* expression, then maybe
553c3f9bad2Sdanielk1977        * it is a new.* or old.* trigger argument reference */
554c3f9bad2Sdanielk1977       if( cnt == 0 && pParse->trigStack != 0 ){
555f29ce559Sdanielk1977         TriggerStack *pTriggerStack = pParse->trigStack;
556c3f9bad2Sdanielk1977         int t = 0;
557f29ce559Sdanielk1977         if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){
558f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->newIdx;
559c3f9bad2Sdanielk1977           cntTab++;
560c3f9bad2Sdanielk1977           t = 1;
561c3f9bad2Sdanielk1977         }
562f29ce559Sdanielk1977         if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){
563f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->oldIdx;
564c3f9bad2Sdanielk1977           cntTab++;
565c3f9bad2Sdanielk1977           t = 1;
566c3f9bad2Sdanielk1977         }
567c3f9bad2Sdanielk1977 
568f29ce559Sdanielk1977         if( t ){
569f29ce559Sdanielk1977 	  int j;
570c9b84a1fSdrh           Table *pTab = pTriggerStack->pTab;
571c9b84a1fSdrh           for(j=0; j < pTab->nCol; j++) {
572c9b84a1fSdrh             if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
573c3f9bad2Sdanielk1977               cnt++;
574c3f9bad2Sdanielk1977               pExpr->iColumn = j;
575c9b84a1fSdrh               pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
576c3f9bad2Sdanielk1977             }
577c3f9bad2Sdanielk1977           }
578c3f9bad2Sdanielk1977 	}
579f29ce559Sdanielk1977       }
580c3f9bad2Sdanielk1977 
581c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
582c4a3c779Sdrh         cnt = 1;
583c4a3c779Sdrh         pExpr->iColumn = -1;
584c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
585c4a3c779Sdrh       }
586cce7d176Sdrh       sqliteFree(zLeft);
587cce7d176Sdrh       sqliteFree(zRight);
588cce7d176Sdrh       if( cnt==0 ){
589967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
590cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
591cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
592cce7d176Sdrh         pParse->nErr++;
593cce7d176Sdrh         return 1;
594cce7d176Sdrh       }else if( cnt>1 ){
595967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
596cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
597cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
598cce7d176Sdrh         pParse->nErr++;
599cce7d176Sdrh         return 1;
600cce7d176Sdrh       }
601cce7d176Sdrh       sqliteExprDelete(pLeft);
602cce7d176Sdrh       pExpr->pLeft = 0;
603cce7d176Sdrh       sqliteExprDelete(pRight);
604cce7d176Sdrh       pExpr->pRight = 0;
605967e8b73Sdrh       pExpr->op = TK_COLUMN;
606cce7d176Sdrh       break;
607cce7d176Sdrh     }
608cce7d176Sdrh 
609fef5208cSdrh     case TK_IN: {
610d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
611fef5208cSdrh       if( v==0 ) return 1;
612832508b7Sdrh       if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
613cfab11bcSdrh         return 1;
614cfab11bcSdrh       }
615fef5208cSdrh       if( pExpr->pSelect ){
616fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
617fef5208cSdrh         **
618fef5208cSdrh         ** Generate code to write the results of the select into a temporary
6194794b980Sdrh         ** table.  The cursor number of the temporary table has already
6204794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
621fef5208cSdrh         */
622832508b7Sdrh         pExpr->iTable = pParse->nTab++;
623c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
624832508b7Sdrh         sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0);
625fef5208cSdrh       }else if( pExpr->pList ){
626fef5208cSdrh         /* Case 2:     expr IN (exprlist)
627fef5208cSdrh         **
628fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
629fef5208cSdrh         ** in iTable.
630fef5208cSdrh         */
631fef5208cSdrh         int i, iSet;
632fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
633fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
6349208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
635fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
636fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
637fef5208cSdrh             pParse->nErr++;
638fef5208cSdrh             return 1;
639fef5208cSdrh           }
6404794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
6414794b980Sdrh             return 1;
6424794b980Sdrh           }
643fef5208cSdrh         }
644fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
645fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
646fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
647fef5208cSdrh           switch( pE2->op ){
648fef5208cSdrh             case TK_FLOAT:
649fef5208cSdrh             case TK_INTEGER:
650fef5208cSdrh             case TK_STRING: {
65199fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
652a76b5dfcSdrh               assert( pE2->token.z );
653fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
654fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
655fef5208cSdrh               break;
656fef5208cSdrh             }
657fef5208cSdrh             default: {
658fef5208cSdrh               sqliteExprCode(pParse, pE2);
65999fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
660fef5208cSdrh               break;
661fef5208cSdrh             }
662fef5208cSdrh           }
663fef5208cSdrh         }
664fef5208cSdrh       }
665cfab11bcSdrh       break;
666fef5208cSdrh     }
667fef5208cSdrh 
66819a775c2Sdrh     case TK_SELECT: {
669fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
670fef5208cSdrh       ** value of this select in a memory cell and record the number
671967e8b73Sdrh       ** of the memory cell in iColumn.
672fef5208cSdrh       */
673967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
674832508b7Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
67519a775c2Sdrh         return 1;
67619a775c2Sdrh       }
67719a775c2Sdrh       break;
67819a775c2Sdrh     }
67919a775c2Sdrh 
680cce7d176Sdrh     /* For all else, just recursively walk the tree */
681cce7d176Sdrh     default: {
682cce7d176Sdrh       if( pExpr->pLeft
683832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
684cce7d176Sdrh         return 1;
685cce7d176Sdrh       }
686cce7d176Sdrh       if( pExpr->pRight
687832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){
688cce7d176Sdrh         return 1;
689cce7d176Sdrh       }
690cce7d176Sdrh       if( pExpr->pList ){
691cce7d176Sdrh         int i;
692cce7d176Sdrh         ExprList *pList = pExpr->pList;
693cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
694832508b7Sdrh           Expr *pArg = pList->a[i].pExpr;
695832508b7Sdrh           if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){
696cce7d176Sdrh             return 1;
697cce7d176Sdrh           }
698cce7d176Sdrh         }
699cce7d176Sdrh       }
700cce7d176Sdrh     }
701cce7d176Sdrh   }
702cce7d176Sdrh   return 0;
703cce7d176Sdrh }
704cce7d176Sdrh 
705cce7d176Sdrh /*
7064b59ab5eSdrh ** pExpr is a node that defines a function of some kind.  It might
7074b59ab5eSdrh ** be a syntactic function like "count(x)" or it might be a function
7084b59ab5eSdrh ** that implements an operator, like "a LIKE b".
7094b59ab5eSdrh **
7104b59ab5eSdrh ** This routine makes *pzName point to the name of the function and
7114b59ab5eSdrh ** *pnName hold the number of characters in the function name.
7124b59ab5eSdrh */
7134b59ab5eSdrh static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){
7144b59ab5eSdrh   switch( pExpr->op ){
7154b59ab5eSdrh     case TK_FUNCTION: {
7164b59ab5eSdrh       *pzName = pExpr->token.z;
7174b59ab5eSdrh       *pnName = pExpr->nFuncName;
7184b59ab5eSdrh       break;
7194b59ab5eSdrh     }
7204b59ab5eSdrh     case TK_LIKE: {
7214b59ab5eSdrh       *pzName = "like";
7224b59ab5eSdrh       *pnName = 4;
7234b59ab5eSdrh       break;
7244b59ab5eSdrh     }
7254b59ab5eSdrh     case TK_GLOB: {
7264b59ab5eSdrh       *pzName = "glob";
7274b59ab5eSdrh       *pnName = 4;
7284b59ab5eSdrh       break;
7294b59ab5eSdrh     }
7304b59ab5eSdrh     default: {
7314b59ab5eSdrh       *pzName = "can't happen";
7324b59ab5eSdrh       *pnName = 12;
7334b59ab5eSdrh       break;
7344b59ab5eSdrh     }
7354b59ab5eSdrh   }
7364b59ab5eSdrh }
7374b59ab5eSdrh 
7384b59ab5eSdrh /*
739cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
740cce7d176Sdrh ** function names are recognized and all functions have the correct
741cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
742cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
743cce7d176Sdrh **
744cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
745cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
746cce7d176Sdrh */
747cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
748cce7d176Sdrh   int nErr = 0;
749cce7d176Sdrh   if( pExpr==0 ) return 0;
750cce7d176Sdrh   switch( pExpr->op ){
7514b59ab5eSdrh     case TK_GLOB:
7524b59ab5eSdrh     case TK_LIKE:
753cce7d176Sdrh     case TK_FUNCTION: {
754c9b84a1fSdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;  /* Number of arguments */
755c9b84a1fSdrh       int no_such_func = 0;       /* True if no such function exists */
756c9b84a1fSdrh       int is_type_of = 0;         /* True if is the special TypeOf() function */
757c9b84a1fSdrh       int wrong_num_args = 0;     /* True if wrong number of arguments */
758c9b84a1fSdrh       int is_agg = 0;             /* True if is an aggregate function */
759cce7d176Sdrh       int i;
7604b59ab5eSdrh       int nId;                    /* Number of characters in function name */
7614b59ab5eSdrh       const char *zId;            /* The function name. */
7620bce8354Sdrh       FuncDef *pDef;
7630bce8354Sdrh 
7644b59ab5eSdrh       getFunctionName(pExpr, &zId, &nId);
7654b59ab5eSdrh       pDef = sqliteFindFunction(pParse->db, zId, nId, n, 0);
7660bce8354Sdrh       if( pDef==0 ){
7674b59ab5eSdrh         pDef = sqliteFindFunction(pParse->db, zId, nId, -1, 0);
7680bce8354Sdrh         if( pDef==0 ){
7694b59ab5eSdrh           if( n==1 && nId==6 && sqliteStrNICmp(zId, "typeof", 6)==0 ){
770c9b84a1fSdrh             is_type_of = 1;
771c9b84a1fSdrh           }else {
772cce7d176Sdrh             no_such_func = 1;
773c9b84a1fSdrh           }
7748e0a2f90Sdrh         }else{
7758e0a2f90Sdrh           wrong_num_args = 1;
7768e0a2f90Sdrh         }
7778e0a2f90Sdrh       }else{
7780bce8354Sdrh         is_agg = pDef->xFunc==0;
779cce7d176Sdrh       }
7808e0a2f90Sdrh       if( is_agg && !allowAgg ){
7818e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1,
7824b59ab5eSdrh            zId, nId, "()", 2, 0);
7838e0a2f90Sdrh         pParse->nErr++;
7848e0a2f90Sdrh         nErr++;
7858e0a2f90Sdrh         is_agg = 0;
7868e0a2f90Sdrh       }else if( no_such_func ){
7874b59ab5eSdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, zId,nId,0);
788cce7d176Sdrh         pParse->nErr++;
789cce7d176Sdrh         nErr++;
7908e0a2f90Sdrh       }else if( wrong_num_args ){
7918e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg,
7924b59ab5eSdrh            "wrong number of arguments to function ", -1, zId, nId, "()", 2, 0);
7938e0a2f90Sdrh         pParse->nErr++;
7948e0a2f90Sdrh         nErr++;
795cce7d176Sdrh       }
7962282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
797cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
798cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
7994cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
8004cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
801cce7d176Sdrh       }
802c9b84a1fSdrh       if( pDef==0 ){
803c9b84a1fSdrh         if( is_type_of ){
804c9b84a1fSdrh           pExpr->op = TK_STRING;
805c9b84a1fSdrh           if( sqliteExprType(pExpr->pList->a[0].pExpr)==SQLITE_SO_NUM ){
806c9b84a1fSdrh             pExpr->token.z = "numeric";
807c9b84a1fSdrh             pExpr->token.n = 7;
808c9b84a1fSdrh           }else{
809c9b84a1fSdrh             pExpr->token.z = "text";
810c9b84a1fSdrh             pExpr->token.n = 4;
811c9b84a1fSdrh           }
812c9b84a1fSdrh         }
813c9b84a1fSdrh       }else if( pDef->dataType>=0 ){
814c9b84a1fSdrh         if( pDef->dataType<n ){
815c9b84a1fSdrh           pExpr->dataType =
816c9b84a1fSdrh              sqliteExprType(pExpr->pList->a[pDef->dataType].pExpr);
817c9b84a1fSdrh         }else{
818c9b84a1fSdrh           pExpr->dataType = SQLITE_SO_NUM;
819c9b84a1fSdrh         }
820c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_ARGS ){
821c9b84a1fSdrh         pDef->dataType = SQLITE_SO_TEXT;
822c9b84a1fSdrh         for(i=0; i<n; i++){
823c9b84a1fSdrh           if( sqliteExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){
824c9b84a1fSdrh             pExpr->dataType = SQLITE_SO_NUM;
825c9b84a1fSdrh             break;
826c9b84a1fSdrh           }
827c9b84a1fSdrh         }
828c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_NUMERIC ){
829c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
830c9b84a1fSdrh       }else{
831c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_TEXT;
832c9b84a1fSdrh       }
833cce7d176Sdrh     }
834cce7d176Sdrh     default: {
835cce7d176Sdrh       if( pExpr->pLeft ){
8362282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
837cce7d176Sdrh       }
838cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
8392282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
840cce7d176Sdrh       }
841fef5208cSdrh       if( nErr==0 && pExpr->pList ){
842fef5208cSdrh         int n = pExpr->pList->nExpr;
843fef5208cSdrh         int i;
844fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
8452282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
8462282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
847fef5208cSdrh         }
848fef5208cSdrh       }
849cce7d176Sdrh       break;
850cce7d176Sdrh     }
851cce7d176Sdrh   }
852cce7d176Sdrh   return nErr;
853cce7d176Sdrh }
854cce7d176Sdrh 
855cce7d176Sdrh /*
856c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the
857c9b84a1fSdrh ** given expression should sort as numeric values or as text.
858c9b84a1fSdrh **
859c9b84a1fSdrh ** The sqliteExprResolveIds() and sqliteExprCheck() routines must have
860c9b84a1fSdrh ** both been called on the expression before it is passed to this routine.
861c9b84a1fSdrh */
862c9b84a1fSdrh int sqliteExprType(Expr *p){
863c9b84a1fSdrh   if( p==0 ) return SQLITE_SO_NUM;
864c9b84a1fSdrh   while( p ) switch( p->op ){
865c9b84a1fSdrh     case TK_PLUS:
866c9b84a1fSdrh     case TK_MINUS:
867c9b84a1fSdrh     case TK_STAR:
868c9b84a1fSdrh     case TK_SLASH:
869c9b84a1fSdrh     case TK_AND:
870c9b84a1fSdrh     case TK_OR:
871c9b84a1fSdrh     case TK_ISNULL:
872c9b84a1fSdrh     case TK_NOTNULL:
873c9b84a1fSdrh     case TK_NOT:
874c9b84a1fSdrh     case TK_UMINUS:
8754b59ab5eSdrh     case TK_UPLUS:
876c9b84a1fSdrh     case TK_BITAND:
877c9b84a1fSdrh     case TK_BITOR:
878c9b84a1fSdrh     case TK_BITNOT:
879c9b84a1fSdrh     case TK_LSHIFT:
880c9b84a1fSdrh     case TK_RSHIFT:
881c9b84a1fSdrh     case TK_REM:
882c9b84a1fSdrh     case TK_INTEGER:
883c9b84a1fSdrh     case TK_FLOAT:
884c9b84a1fSdrh     case TK_IN:
885c9b84a1fSdrh     case TK_BETWEEN:
8864b59ab5eSdrh     case TK_GLOB:
8874b59ab5eSdrh     case TK_LIKE:
888c9b84a1fSdrh       return SQLITE_SO_NUM;
889c9b84a1fSdrh 
890c9b84a1fSdrh     case TK_STRING:
891c9b84a1fSdrh     case TK_NULL:
892c9b84a1fSdrh     case TK_CONCAT:
893c9b84a1fSdrh       return SQLITE_SO_TEXT;
894c9b84a1fSdrh 
895c9b84a1fSdrh     case TK_LT:
896c9b84a1fSdrh     case TK_LE:
897c9b84a1fSdrh     case TK_GT:
898c9b84a1fSdrh     case TK_GE:
899c9b84a1fSdrh     case TK_NE:
900c9b84a1fSdrh     case TK_EQ:
901c9b84a1fSdrh       if( sqliteExprType(p->pLeft)==SQLITE_SO_NUM ){
902c9b84a1fSdrh         return SQLITE_SO_NUM;
903c9b84a1fSdrh       }
904c9b84a1fSdrh       p = p->pRight;
905c9b84a1fSdrh       break;
906c9b84a1fSdrh 
907c9b84a1fSdrh     case TK_AS:
908c9b84a1fSdrh       p = p->pLeft;
909c9b84a1fSdrh       break;
910c9b84a1fSdrh 
911c9b84a1fSdrh     case TK_COLUMN:
912c9b84a1fSdrh     case TK_FUNCTION:
913c9b84a1fSdrh     case TK_AGG_FUNCTION:
914c9b84a1fSdrh       return p->dataType;
915c9b84a1fSdrh 
916c9b84a1fSdrh     case TK_SELECT:
917c9b84a1fSdrh       assert( p->pSelect );
918c9b84a1fSdrh       assert( p->pSelect->pEList );
919c9b84a1fSdrh       assert( p->pSelect->pEList->nExpr>0 );
920c9b84a1fSdrh       p = p->pSelect->pEList->a[0].pExpr;
921c9b84a1fSdrh       break;
922c9b84a1fSdrh 
923b1363206Sdrh     case TK_CASE: {
924b1363206Sdrh       if( p->pRight && sqliteExprType(p->pRight)==SQLITE_SO_NUM ){
925b1363206Sdrh         return SQLITE_SO_NUM;
926b1363206Sdrh       }
927b1363206Sdrh       if( p->pList ){
928b1363206Sdrh         int i;
929b1363206Sdrh         ExprList *pList = p->pList;
930b1363206Sdrh         for(i=1; i<pList->nExpr; i+=2){
931b1363206Sdrh           if( sqliteExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){
932b1363206Sdrh             return SQLITE_SO_NUM;
933b1363206Sdrh           }
934b1363206Sdrh         }
935b1363206Sdrh       }
936b1363206Sdrh       return SQLITE_SO_TEXT;
937b1363206Sdrh     }
938b1363206Sdrh 
939c9b84a1fSdrh     default:
940c9b84a1fSdrh       assert( p->op==TK_ABORT );  /* Can't Happen */
941c9b84a1fSdrh       break;
942c9b84a1fSdrh   }
943c9b84a1fSdrh   return SQLITE_SO_NUM;
944c9b84a1fSdrh }
945c9b84a1fSdrh 
946c9b84a1fSdrh /*
947cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
9481ccde15dSdrh ** expression and leave the result on the top of stack.
949cce7d176Sdrh */
950cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
951cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
952cce7d176Sdrh   int op;
953daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
954cce7d176Sdrh   switch( pExpr->op ){
955cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
956cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
957cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
958cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
959cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
960cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
961cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
962cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
963cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
964cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
965cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
966cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
967cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
968cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
969cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
970cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
971bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
972bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
973bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
974bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
975bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
976bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
977cce7d176Sdrh     default: break;
978cce7d176Sdrh   }
979cce7d176Sdrh   switch( pExpr->op ){
980967e8b73Sdrh     case TK_COLUMN: {
9812282792aSdrh       if( pParse->useAgg ){
98299fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
983c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
98499fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
985c4a3c779Sdrh       }else{
98699fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
9872282792aSdrh       }
988cce7d176Sdrh       break;
989cce7d176Sdrh     }
990cce7d176Sdrh     case TK_INTEGER: {
991d9e30930Sdrh       int iVal = atoi(pExpr->token.z);
992d9e30930Sdrh       char zBuf[30];
993d9e30930Sdrh       sprintf(zBuf,"%d",iVal);
994d9e30930Sdrh       if( strlen(zBuf)!=pExpr->token.n
995d9e30930Sdrh             || strncmp(pExpr->token.z,zBuf,pExpr->token.n)!=0 ){
996d9e30930Sdrh         /* If the integer value cannot be represented exactly in 32 bits,
997d9e30930Sdrh         ** then code it as a string instead. */
998d9e30930Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
999d9e30930Sdrh       }else{
1000d9e30930Sdrh         sqliteVdbeAddOp(v, OP_Integer, iVal, 0);
1001d9e30930Sdrh       }
1002e6840900Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
1003e6840900Sdrh       break;
1004e6840900Sdrh     }
1005e6840900Sdrh     case TK_FLOAT: {
10067a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
1007a76b5dfcSdrh       assert( pExpr->token.z );
10087a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
1009cce7d176Sdrh       break;
1010cce7d176Sdrh     }
1011cce7d176Sdrh     case TK_STRING: {
101299fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
1013a76b5dfcSdrh       assert( pExpr->token.z );
1014cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
1015cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
1016cce7d176Sdrh       break;
1017cce7d176Sdrh     }
1018cce7d176Sdrh     case TK_NULL: {
101999fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
1020cce7d176Sdrh       break;
1021cce7d176Sdrh     }
1022c9b84a1fSdrh     case TK_LT:
1023c9b84a1fSdrh     case TK_LE:
1024c9b84a1fSdrh     case TK_GT:
1025c9b84a1fSdrh     case TK_GE:
1026c9b84a1fSdrh     case TK_NE:
1027c9b84a1fSdrh     case TK_EQ: {
1028491791a8Sdrh       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
1029c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1030c9b84a1fSdrh       }
1031c9b84a1fSdrh       /* Fall through into the next case */
1032c9b84a1fSdrh     }
1033cce7d176Sdrh     case TK_AND:
1034cce7d176Sdrh     case TK_OR:
1035cce7d176Sdrh     case TK_PLUS:
1036cce7d176Sdrh     case TK_STAR:
1037cce7d176Sdrh     case TK_MINUS:
1038bf4133cbSdrh     case TK_REM:
1039bf4133cbSdrh     case TK_BITAND:
1040bf4133cbSdrh     case TK_BITOR:
1041c9b84a1fSdrh     case TK_SLASH: {
1042cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1043cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
104499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
1045cce7d176Sdrh       break;
1046cce7d176Sdrh     }
1047bf4133cbSdrh     case TK_LSHIFT:
1048bf4133cbSdrh     case TK_RSHIFT: {
1049bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
1050bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1051bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
1052bf4133cbSdrh       break;
1053bf4133cbSdrh     }
10540040077dSdrh     case TK_CONCAT: {
10550040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
10560040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
105799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
10580040077dSdrh       break;
10590040077dSdrh     }
10604b59ab5eSdrh     case TK_UPLUS: {
10614b59ab5eSdrh       Expr *pLeft = pExpr->pLeft;
10624b59ab5eSdrh       if( pLeft && pLeft->op==TK_INTEGER ){
10634b59ab5eSdrh         sqliteVdbeAddOp(v, OP_Integer, atoi(pLeft->token.z), 0);
10644b59ab5eSdrh         sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n);
10654b59ab5eSdrh       }else if( pLeft && pLeft->op==TK_FLOAT ){
10664b59ab5eSdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
10674b59ab5eSdrh         sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n);
10684b59ab5eSdrh       }else{
10694b59ab5eSdrh         sqliteExprCode(pParse, pExpr->pLeft);
10704b59ab5eSdrh       }
10714b59ab5eSdrh       break;
10724b59ab5eSdrh     }
1073cce7d176Sdrh     case TK_UMINUS: {
10746e142f54Sdrh       assert( pExpr->pLeft );
10757a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
10766e142f54Sdrh         Token *p = &pExpr->pLeft->token;
10776e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
10786e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
1079e6840900Sdrh         if( pExpr->pLeft->op==TK_INTEGER ){
1080e6840900Sdrh           sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0);
1081e6840900Sdrh         }else{
108299fcd718Sdrh           sqliteVdbeAddOp(v, OP_String, 0, 0);
1083e6840900Sdrh         }
108499fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
10856e142f54Sdrh         sqliteFree(z);
10866e142f54Sdrh         break;
10876e142f54Sdrh       }
10881ccde15dSdrh       /* Fall through into TK_NOT */
10896e142f54Sdrh     }
1090bf4133cbSdrh     case TK_BITNOT:
10916e142f54Sdrh     case TK_NOT: {
1092cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
109399fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
1094cce7d176Sdrh       break;
1095cce7d176Sdrh     }
1096cce7d176Sdrh     case TK_ISNULL:
1097cce7d176Sdrh     case TK_NOTNULL: {
1098cce7d176Sdrh       int dest;
109999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
1100cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1101cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
1102f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
110399fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
1104cce7d176Sdrh       break;
1105cce7d176Sdrh     }
11062282792aSdrh     case TK_AGG_FUNCTION: {
110799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
11082282792aSdrh       break;
11092282792aSdrh     }
11104b59ab5eSdrh     case TK_GLOB:
11114b59ab5eSdrh     case TK_LIKE:
1112cce7d176Sdrh     case TK_FUNCTION: {
1113cce7d176Sdrh       int i;
1114cce7d176Sdrh       ExprList *pList = pExpr->pList;
111589425d5eSdrh       int nExpr = pList ? pList->nExpr : 0;
11160bce8354Sdrh       FuncDef *pDef;
11174b59ab5eSdrh       int nId;
11184b59ab5eSdrh       const char *zId;
11194b59ab5eSdrh       getFunctionName(pExpr, &zId, &nId);
11204b59ab5eSdrh       pDef = sqliteFindFunction(pParse->db, zId, nId, nExpr, 0);
11210bce8354Sdrh       assert( pDef!=0 );
112289425d5eSdrh       for(i=0; i<nExpr; i++){
11238e0a2f90Sdrh         sqliteExprCode(pParse, pList->a[i].pExpr);
11248e0a2f90Sdrh       }
112589425d5eSdrh       sqliteVdbeAddOp(v, OP_Function, nExpr, 0);
11260bce8354Sdrh       sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER);
11276ec2733bSdrh       break;
11286ec2733bSdrh     }
112919a775c2Sdrh     case TK_SELECT: {
113099fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
113119a775c2Sdrh       break;
113219a775c2Sdrh     }
1133fef5208cSdrh     case TK_IN: {
1134fef5208cSdrh       int addr;
113599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
1136fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1137fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1138f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4);
1139f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1140f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
1141f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, addr+6);
1142fef5208cSdrh       if( pExpr->pSelect ){
1143f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6);
1144fef5208cSdrh       }else{
1145f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6);
1146fef5208cSdrh       }
114799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
1148fef5208cSdrh       break;
1149fef5208cSdrh     }
1150fef5208cSdrh     case TK_BETWEEN: {
1151f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1152f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1153f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1154f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, 0);
1155f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pull, 1, 0);
1156f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1157f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, 0);
1158f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_And, 0, 0);
1159fef5208cSdrh       break;
1160fef5208cSdrh     }
1161a2e00042Sdrh     case TK_AS: {
1162a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1163a2e00042Sdrh       break;
1164a2e00042Sdrh     }
116517a7f8ddSdrh     case TK_CASE: {
116617a7f8ddSdrh       int expr_end_label;
1167f5905aa7Sdrh       int jumpInst;
1168f5905aa7Sdrh       int addr;
1169f5905aa7Sdrh       int nExpr;
117017a7f8ddSdrh       int i;
117117a7f8ddSdrh 
117217a7f8ddSdrh       assert(pExpr->pList);
117317a7f8ddSdrh       assert((pExpr->pList->nExpr % 2) == 0);
117417a7f8ddSdrh       assert(pExpr->pList->nExpr > 0);
1175f5905aa7Sdrh       nExpr = pExpr->pList->nExpr;
1176f5905aa7Sdrh       expr_end_label = sqliteVdbeMakeLabel(v);
117717a7f8ddSdrh       if( pExpr->pLeft ){
117817a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pLeft);
1179cce7d176Sdrh       }
1180f5905aa7Sdrh       for(i=0; i<nExpr; i=i+2){
118117a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i].pExpr);
118217a7f8ddSdrh         if( pExpr->pLeft ){
1183f5905aa7Sdrh           sqliteVdbeAddOp(v, OP_Dup, 1, 1);
1184f570f011Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_Ne, 1, 0);
1185f570f011Sdrh           sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1186f5905aa7Sdrh         }else{
1187f570f011Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 1, 0);
118817a7f8ddSdrh         }
118917a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr);
1190f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label);
1191f5905aa7Sdrh         addr = sqliteVdbeCurrentAddr(v);
1192f5905aa7Sdrh         sqliteVdbeChangeP2(v, jumpInst, addr);
119317a7f8ddSdrh       }
1194f570f011Sdrh       if( pExpr->pLeft ){
1195f570f011Sdrh         sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1196f570f011Sdrh       }
119717a7f8ddSdrh       if( pExpr->pRight ){
119817a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pRight);
119917a7f8ddSdrh       }else{
1200f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
120117a7f8ddSdrh       }
1202f5905aa7Sdrh       sqliteVdbeResolveLabel(v, expr_end_label);
12036f34903eSdanielk1977       break;
12046f34903eSdanielk1977     }
12056f34903eSdanielk1977     case TK_RAISE: {
12066f34903eSdanielk1977       if( !pParse->trigStack ){
12076f34903eSdanielk1977         sqliteSetNString(&pParse->zErrMsg,
12086f34903eSdanielk1977 		"RAISE() may only be used within a trigger-program", -1, 0);
12096f34903eSdanielk1977         pParse->nErr++;
12106f34903eSdanielk1977 	return;
12116f34903eSdanielk1977       }
12126f34903eSdanielk1977       if( pExpr->iColumn == OE_Rollback ||
12136f34903eSdanielk1977 	  pExpr->iColumn == OE_Abort ||
12146f34903eSdanielk1977 	  pExpr->iColumn == OE_Fail ){
12156f34903eSdanielk1977 	  char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
12166f34903eSdanielk1977 	  sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn);
12176f34903eSdanielk1977 	  sqliteDequote(msg);
12186f34903eSdanielk1977 	  sqliteVdbeChangeP3(v, -1, msg, 0);
12196f34903eSdanielk1977 	  sqliteFree(msg);
12206f34903eSdanielk1977       } else {
12216f34903eSdanielk1977 	  assert( pExpr->iColumn == OE_Ignore );
12226f34903eSdanielk1977 	  sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump);
12236f34903eSdanielk1977 	  sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", -1);
12246f34903eSdanielk1977       }
122517a7f8ddSdrh     }
122617a7f8ddSdrh     break;
122717a7f8ddSdrh   }
1228cce7d176Sdrh }
1229cce7d176Sdrh 
1230cce7d176Sdrh /*
1231cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
1232cce7d176Sdrh ** to the label "dest" if the expression is true but execution
1233cce7d176Sdrh ** continues straight thru if the expression is false.
1234f5905aa7Sdrh **
1235f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then
1236f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true.
1237cce7d176Sdrh */
1238f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1239cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1240cce7d176Sdrh   int op = 0;
1241daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1242cce7d176Sdrh   switch( pExpr->op ){
1243cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
1244cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
1245cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
1246cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
1247cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
1248cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
1249cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
1250cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
1251cce7d176Sdrh     default:  break;
1252cce7d176Sdrh   }
1253cce7d176Sdrh   switch( pExpr->op ){
1254cce7d176Sdrh     case TK_AND: {
1255cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1256f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);
1257f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1258cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1259cce7d176Sdrh       break;
1260cce7d176Sdrh     }
1261cce7d176Sdrh     case TK_OR: {
1262f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1263f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1264cce7d176Sdrh       break;
1265cce7d176Sdrh     }
1266cce7d176Sdrh     case TK_NOT: {
1267f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1268cce7d176Sdrh       break;
1269cce7d176Sdrh     }
1270cce7d176Sdrh     case TK_LT:
1271cce7d176Sdrh     case TK_LE:
1272cce7d176Sdrh     case TK_GT:
1273cce7d176Sdrh     case TK_GE:
1274cce7d176Sdrh     case TK_NE:
12750ac65892Sdrh     case TK_EQ: {
1276cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1277cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1278491791a8Sdrh       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
1279c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1280c9b84a1fSdrh       }
1281f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1282cce7d176Sdrh       break;
1283cce7d176Sdrh     }
1284cce7d176Sdrh     case TK_ISNULL:
1285cce7d176Sdrh     case TK_NOTNULL: {
1286cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1287f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1288cce7d176Sdrh       break;
1289cce7d176Sdrh     }
1290fef5208cSdrh     case TK_IN: {
1291f5905aa7Sdrh       int addr;
1292cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1293f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1294f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1295f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1296f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1297fef5208cSdrh       if( pExpr->pSelect ){
129899fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
1299fef5208cSdrh       }else{
130099fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
1301fef5208cSdrh       }
1302fef5208cSdrh       break;
1303fef5208cSdrh     }
1304fef5208cSdrh     case TK_BETWEEN: {
1305f5905aa7Sdrh       int addr;
1306fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
130799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1308fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1309f5905aa7Sdrh       addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0);
1310fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1311f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest);
131299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
1313f5905aa7Sdrh       sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v));
131499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1315fef5208cSdrh       break;
1316fef5208cSdrh     }
1317cce7d176Sdrh     default: {
1318cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1319f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest);
1320cce7d176Sdrh       break;
1321cce7d176Sdrh     }
1322cce7d176Sdrh   }
1323cce7d176Sdrh }
1324cce7d176Sdrh 
1325cce7d176Sdrh /*
132666b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
1327cce7d176Sdrh ** to the label "dest" if the expression is false but execution
1328cce7d176Sdrh ** continues straight thru if the expression is true.
1329f5905aa7Sdrh **
1330f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then
1331f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false.
1332cce7d176Sdrh */
1333f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1334cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1335cce7d176Sdrh   int op = 0;
1336daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1337cce7d176Sdrh   switch( pExpr->op ){
1338cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
1339cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
1340cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
1341cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
1342cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
1343cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
1344cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
1345cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
1346cce7d176Sdrh     default:  break;
1347cce7d176Sdrh   }
1348cce7d176Sdrh   switch( pExpr->op ){
1349cce7d176Sdrh     case TK_AND: {
1350f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1351f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1352cce7d176Sdrh       break;
1353cce7d176Sdrh     }
1354cce7d176Sdrh     case TK_OR: {
1355cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1356f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);
1357f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1358cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1359cce7d176Sdrh       break;
1360cce7d176Sdrh     }
1361cce7d176Sdrh     case TK_NOT: {
1362f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1363cce7d176Sdrh       break;
1364cce7d176Sdrh     }
1365cce7d176Sdrh     case TK_LT:
1366cce7d176Sdrh     case TK_LE:
1367cce7d176Sdrh     case TK_GT:
1368cce7d176Sdrh     case TK_GE:
1369cce7d176Sdrh     case TK_NE:
1370cce7d176Sdrh     case TK_EQ: {
1371491791a8Sdrh       if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
1372*8f619ccdSdrh         /* Convert numeric comparison opcodes into text comparison opcodes.
1373*8f619ccdSdrh         ** This step depends on the fact that the text comparision opcodes are
1374*8f619ccdSdrh         ** always 6 greater than their corresponding numeric comparison
1375*8f619ccdSdrh         ** opcodes.
1376*8f619ccdSdrh         */
1377*8f619ccdSdrh         assert( OP_Eq+6 == OP_StrEq );
1378*8f619ccdSdrh         op += 6;
1379c9b84a1fSdrh       }
1380cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1381cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1382f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1383cce7d176Sdrh       break;
1384cce7d176Sdrh     }
1385cce7d176Sdrh     case TK_ISNULL:
1386cce7d176Sdrh     case TK_NOTNULL: {
1387cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1388f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1389cce7d176Sdrh       break;
1390cce7d176Sdrh     }
1391fef5208cSdrh     case TK_IN: {
1392f5905aa7Sdrh       int addr;
1393cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1394f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1395f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1396f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1397f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1398fef5208cSdrh       if( pExpr->pSelect ){
139999fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1400fef5208cSdrh       }else{
140199fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1402fef5208cSdrh       }
1403fef5208cSdrh       break;
1404fef5208cSdrh     }
1405fef5208cSdrh     case TK_BETWEEN: {
1406fef5208cSdrh       int addr;
1407fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
140899fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1409fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1410fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1411f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3);
141299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
141399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
1414fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1415f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest);
1416fef5208cSdrh       break;
1417fef5208cSdrh     }
1418cce7d176Sdrh     default: {
1419cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1420461c281aSdrh       sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest);
1421cce7d176Sdrh       break;
1422cce7d176Sdrh     }
1423cce7d176Sdrh   }
1424cce7d176Sdrh }
14252282792aSdrh 
14262282792aSdrh /*
14272282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
14282282792aSdrh ** if they are identical and return FALSE if they differ in any way.
14292282792aSdrh */
1430d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
14312282792aSdrh   int i;
14322282792aSdrh   if( pA==0 ){
14332282792aSdrh     return pB==0;
14342282792aSdrh   }else if( pB==0 ){
14352282792aSdrh     return 0;
14362282792aSdrh   }
14372282792aSdrh   if( pA->op!=pB->op ) return 0;
1438d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1439d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
14402282792aSdrh   if( pA->pList ){
14412282792aSdrh     if( pB->pList==0 ) return 0;
14422282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
14432282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1444d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
14452282792aSdrh         return 0;
14462282792aSdrh       }
14472282792aSdrh     }
14482282792aSdrh   }else if( pB->pList ){
14492282792aSdrh     return 0;
14502282792aSdrh   }
14512282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
14522f2c01e5Sdrh   if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;
14532282792aSdrh   if( pA->token.z ){
14544b59ab5eSdrh     int n;
14552282792aSdrh     if( pB->token.z==0 ) return 0;
14564b59ab5eSdrh     if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){
14574b59ab5eSdrh       n = pA->nFuncName;
14584b59ab5eSdrh       if( pB->nFuncName!=n ) return 0;
14594b59ab5eSdrh     }else{
14604b59ab5eSdrh       n = pA->token.n;
14614b59ab5eSdrh       if( pB->token.n!=n ) return 0;
14624b59ab5eSdrh     }
14634b59ab5eSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, n)!=0 ) return 0;
14642282792aSdrh   }
14652282792aSdrh   return 1;
14662282792aSdrh }
14672282792aSdrh 
14682282792aSdrh /*
14692282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
14702282792aSdrh */
14712282792aSdrh static int appendAggInfo(Parse *pParse){
14722282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
14732282792aSdrh     int amt = pParse->nAgg + 8;
14746d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
14756d4abfbeSdrh     if( aAgg==0 ){
14762282792aSdrh       return -1;
14772282792aSdrh     }
14786d4abfbeSdrh     pParse->aAgg = aAgg;
14792282792aSdrh   }
14802282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
14812282792aSdrh   return pParse->nAgg++;
14822282792aSdrh }
14832282792aSdrh 
14842282792aSdrh /*
14852282792aSdrh ** Analyze the given expression looking for aggregate functions and
14862282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
14872282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
14882282792aSdrh **
14892282792aSdrh ** This routine should only be called after the expression has been
14902282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
14912282792aSdrh **
14922282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
14932282792aSdrh ** the number of errors.
14942282792aSdrh */
14952282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
14962282792aSdrh   int i;
14972282792aSdrh   AggExpr *aAgg;
14982282792aSdrh   int nErr = 0;
14992282792aSdrh 
15002282792aSdrh   if( pExpr==0 ) return 0;
15012282792aSdrh   switch( pExpr->op ){
1502967e8b73Sdrh     case TK_COLUMN: {
15032282792aSdrh       aAgg = pParse->aAgg;
15042282792aSdrh       for(i=0; i<pParse->nAgg; i++){
15052282792aSdrh         if( aAgg[i].isAgg ) continue;
15062282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1507967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
15082282792aSdrh           break;
15092282792aSdrh         }
15102282792aSdrh       }
15112282792aSdrh       if( i>=pParse->nAgg ){
15122282792aSdrh         i = appendAggInfo(pParse);
15132282792aSdrh         if( i<0 ) return 1;
15142282792aSdrh         pParse->aAgg[i].isAgg = 0;
15152282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
15162282792aSdrh       }
1517aaf88729Sdrh       pExpr->iAgg = i;
15182282792aSdrh       break;
15192282792aSdrh     }
15202282792aSdrh     case TK_AGG_FUNCTION: {
15212282792aSdrh       aAgg = pParse->aAgg;
15222282792aSdrh       for(i=0; i<pParse->nAgg; i++){
15232282792aSdrh         if( !aAgg[i].isAgg ) continue;
1524d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
15252282792aSdrh           break;
15262282792aSdrh         }
15272282792aSdrh       }
15282282792aSdrh       if( i>=pParse->nAgg ){
15292282792aSdrh         i = appendAggInfo(pParse);
15302282792aSdrh         if( i<0 ) return 1;
15312282792aSdrh         pParse->aAgg[i].isAgg = 1;
15322282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
15330bce8354Sdrh         pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db,
15344b59ab5eSdrh              pExpr->token.z, pExpr->nFuncName,
1535f55f25f0Sdrh              pExpr->pList ? pExpr->pList->nExpr : 0, 0);
15362282792aSdrh       }
15372282792aSdrh       pExpr->iAgg = i;
15382282792aSdrh       break;
15392282792aSdrh     }
15402282792aSdrh     default: {
15412282792aSdrh       if( pExpr->pLeft ){
15422282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
15432282792aSdrh       }
15442282792aSdrh       if( nErr==0 && pExpr->pRight ){
15452282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
15462282792aSdrh       }
15472282792aSdrh       if( nErr==0 && pExpr->pList ){
15482282792aSdrh         int n = pExpr->pList->nExpr;
15492282792aSdrh         int i;
15502282792aSdrh         for(i=0; nErr==0 && i<n; i++){
15512282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
15522282792aSdrh         }
15532282792aSdrh       }
15542282792aSdrh       break;
15552282792aSdrh     }
15562282792aSdrh   }
15572282792aSdrh   return nErr;
15582282792aSdrh }
15598e0a2f90Sdrh 
15608e0a2f90Sdrh /*
15618e0a2f90Sdrh ** Locate a user function given a name and a number of arguments.
15620bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that
15638e0a2f90Sdrh ** function, or return NULL if the function does not exist.
15648e0a2f90Sdrh **
15650bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef
15668e0a2f90Sdrh ** structure is created and liked into the "db" structure if a
15678e0a2f90Sdrh ** no matching function previously existed.  When createFlag is true
15688e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts
15698e0a2f90Sdrh ** any number of arguments will be returned.
15708e0a2f90Sdrh **
15718e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid
15728e0a2f90Sdrh ** function found is returned.  A function is valid if either xFunc
15738e0a2f90Sdrh ** or xStep is non-zero.
15748e0a2f90Sdrh */
15750bce8354Sdrh FuncDef *sqliteFindFunction(
15768e0a2f90Sdrh   sqlite *db,        /* An open database */
15778e0a2f90Sdrh   const char *zName, /* Name of the function.  Not null-terminated */
15788e0a2f90Sdrh   int nName,         /* Number of characters in the name */
15798e0a2f90Sdrh   int nArg,          /* Number of arguments.  -1 means any number */
15808e0a2f90Sdrh   int createFlag     /* Create new entry if true and does not otherwise exist */
15818e0a2f90Sdrh ){
15820bce8354Sdrh   FuncDef *pFirst, *p, *pMaybe;
15830bce8354Sdrh   pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName);
15841350b030Sdrh   if( p && !createFlag && nArg<0 ){
15858e0a2f90Sdrh     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
15868e0a2f90Sdrh     return p;
15878e0a2f90Sdrh   }
15888e0a2f90Sdrh   pMaybe = 0;
15898e0a2f90Sdrh   while( p && p->nArg!=nArg ){
15908e0a2f90Sdrh     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
15918e0a2f90Sdrh     p = p->pNext;
15928e0a2f90Sdrh   }
15938e0a2f90Sdrh   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
15948e0a2f90Sdrh     return 0;
15958e0a2f90Sdrh   }
15968e0a2f90Sdrh   if( p==0 && pMaybe ){
15978e0a2f90Sdrh     assert( createFlag==0 );
15988e0a2f90Sdrh     return pMaybe;
15998e0a2f90Sdrh   }
160089425d5eSdrh   if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
16018e0a2f90Sdrh     p->nArg = nArg;
16028e0a2f90Sdrh     p->pNext = pFirst;
1603c9b84a1fSdrh     p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC;
16040bce8354Sdrh     sqliteHashInsert(&db->aFunc, zName, nName, (void*)p);
16058e0a2f90Sdrh   }
16068e0a2f90Sdrh   return p;
16078e0a2f90Sdrh }
1608