xref: /sqlite-3.40.0/src/expr.c (revision 0bdaf62e)
1cce7d176Sdrh /*
2cce7d176Sdrh ** Copyright (c) 1999, 2000 D. Richard Hipp
3cce7d176Sdrh **
4cce7d176Sdrh ** This program is free software; you can redistribute it and/or
5cce7d176Sdrh ** modify it under the terms of the GNU General Public
6cce7d176Sdrh ** License as published by the Free Software Foundation; either
7cce7d176Sdrh ** version 2 of the License, or (at your option) any later version.
8cce7d176Sdrh **
9cce7d176Sdrh ** This program is distributed in the hope that it will be useful,
10cce7d176Sdrh ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11cce7d176Sdrh ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cce7d176Sdrh ** General Public License for more details.
13cce7d176Sdrh **
14cce7d176Sdrh ** You should have received a copy of the GNU General Public
15cce7d176Sdrh ** License along with this library; if not, write to the
16cce7d176Sdrh ** Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17cce7d176Sdrh ** Boston, MA  02111-1307, USA.
18cce7d176Sdrh **
19cce7d176Sdrh ** Author contact information:
20cce7d176Sdrh **   [email protected]
21cce7d176Sdrh **   http://www.hwaci.com/drh/
22cce7d176Sdrh **
23cce7d176Sdrh *************************************************************************
24cce7d176Sdrh ** This file contains C code routines used for processing expressions
25cce7d176Sdrh **
26*0bdaf62eSdrh ** $Id: expr.c,v 1.15 2000/06/11 23:50:13 drh Exp $
27cce7d176Sdrh */
28cce7d176Sdrh #include "sqliteInt.h"
29cce7d176Sdrh 
30cce7d176Sdrh /*
31fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
32fef5208cSdrh ** and 0 if it involves variables.
33fef5208cSdrh */
34fef5208cSdrh static int isConstant(Expr *p){
35fef5208cSdrh   switch( p->op ){
36fef5208cSdrh     case TK_ID:
37fef5208cSdrh     case TK_FIELD:
38fef5208cSdrh     case TK_DOT:
39fef5208cSdrh       return 0;
40fef5208cSdrh     default: {
41fef5208cSdrh       if( p->pLeft && !isConstant(p->pLeft) ) return 0;
42fef5208cSdrh       if( p->pRight && !isConstant(p->pRight) ) return 0;
43fef5208cSdrh       if( p->pList ){
44fef5208cSdrh         int i;
45fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
46fef5208cSdrh           if( !isConstant(p->pList->a[i].pExpr) ) return 0;
47fef5208cSdrh         }
48fef5208cSdrh       }
49fef5208cSdrh       break;
50fef5208cSdrh     }
51fef5208cSdrh   }
52fef5208cSdrh   return 1;
53fef5208cSdrh }
54fef5208cSdrh 
55fef5208cSdrh /*
564794b980Sdrh ** Walk the expression tree and process operators of the form:
574794b980Sdrh **
584794b980Sdrh **       expr IN (SELECT ...)
594794b980Sdrh **
604794b980Sdrh ** These operators have to be processed before field names are
614794b980Sdrh ** resolved because each such operator increments pParse->nTab
624794b980Sdrh ** to reserve a cursor number for its own use.  But pParse->nTab
634794b980Sdrh ** needs to be constant once we begin resolving field names.
644794b980Sdrh **
654794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this
664794b980Sdrh ** routine.  This routine allocates a cursor number to the IN-SELECT
674794b980Sdrh ** and then moves on.  The code generation is done by
684794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards.
694794b980Sdrh */
704794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
714794b980Sdrh   if( pExpr==0 ) return;
724794b980Sdrh   if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
734794b980Sdrh     pExpr->iTable = pParse->nTab++;
744794b980Sdrh   }else{
754794b980Sdrh     if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
764794b980Sdrh     if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
774794b980Sdrh     if( pExpr->pList ){
784794b980Sdrh       int i;
794794b980Sdrh       ExprList *pList = pExpr->pList;
804794b980Sdrh       for(i=0; i<pList->nExpr; i++){
814794b980Sdrh         sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
824794b980Sdrh       }
834794b980Sdrh     }
844794b980Sdrh   }
854794b980Sdrh }
864794b980Sdrh 
874794b980Sdrh /*
88cce7d176Sdrh ** This routine walks an expression tree and resolves references to
89cce7d176Sdrh ** table fields.  Nodes of the form ID.ID or ID resolve into an
90cce7d176Sdrh ** index to the table in the table list and a field offset.  The opcode
91cce7d176Sdrh ** for such nodes is changed to TK_FIELD.  The iTable value is changed
9219a775c2Sdrh ** to the index of the referenced table in pTabList plus the pParse->nTab
9319a775c2Sdrh ** value.  The iField value is changed to the index of the field of the
9419a775c2Sdrh ** referenced table.
9519a775c2Sdrh **
96fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
97fef5208cSdrh ** forms:
98fef5208cSdrh **
99fef5208cSdrh **           expr IN (exprlist)
100fef5208cSdrh ** and
101fef5208cSdrh **           expr IN (SELECT ...)
102fef5208cSdrh **
103fef5208cSdrh ** The first form is handled by creating a set holding the list
104fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
105fef5208cSdrh ** a temporary table.
106fef5208cSdrh **
107fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
10819a775c2Sdrh ** If it finds any, it generates code to write the value of that select
10919a775c2Sdrh ** into a memory cell.
110cce7d176Sdrh **
111cce7d176Sdrh ** Unknown fields or tables provoke an error.  The function returns
112cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
113cce7d176Sdrh */
114cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
115cce7d176Sdrh   if( pExpr==0 ) return 0;
116cce7d176Sdrh   switch( pExpr->op ){
117cce7d176Sdrh     /* A lone identifier */
118cce7d176Sdrh     case TK_ID: {
119cce7d176Sdrh       int cnt = 0;   /* Number of matches */
120cce7d176Sdrh       int i;         /* Loop counter */
1216e142f54Sdrh       char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
122cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
123cce7d176Sdrh         int j;
124cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
125cce7d176Sdrh         if( pTab==0 ) continue;
126cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
1277020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
128cce7d176Sdrh             cnt++;
12919a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
130cce7d176Sdrh             pExpr->iField = j;
131cce7d176Sdrh           }
132cce7d176Sdrh         }
133cce7d176Sdrh       }
134cce7d176Sdrh       sqliteFree(z);
135cce7d176Sdrh       if( cnt==0 ){
136cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
137cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
138cce7d176Sdrh         pParse->nErr++;
139cce7d176Sdrh         return 1;
140cce7d176Sdrh       }else if( cnt>1 ){
141cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
142cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
143cce7d176Sdrh         pParse->nErr++;
144cce7d176Sdrh         return 1;
145cce7d176Sdrh       }
146cce7d176Sdrh       pExpr->op = TK_FIELD;
147cce7d176Sdrh       break;
148cce7d176Sdrh     }
149cce7d176Sdrh 
150cce7d176Sdrh     /* A table name and field name:  ID.ID */
151cce7d176Sdrh     case TK_DOT: {
152cce7d176Sdrh       int cnt = 0;             /* Number of matches */
153cce7d176Sdrh       int i;                   /* Loop counter */
154cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
155cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
156cce7d176Sdrh 
157cce7d176Sdrh       pLeft = pExpr->pLeft;
158cce7d176Sdrh       pRight = pExpr->pRight;
159cce7d176Sdrh       assert( pLeft && pLeft->op==TK_ID );
160cce7d176Sdrh       assert( pRight && pRight->op==TK_ID );
1616e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
1626e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
163cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
164cce7d176Sdrh         int j;
165cce7d176Sdrh         char *zTab;
166cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
167cce7d176Sdrh         if( pTab==0 ) continue;
168cce7d176Sdrh         if( pTabList->a[i].zAlias ){
169cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
170cce7d176Sdrh         }else{
171cce7d176Sdrh           zTab = pTab->zName;
172cce7d176Sdrh         }
173cce7d176Sdrh         if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
174cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
1757020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
176cce7d176Sdrh             cnt++;
17719a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
178cce7d176Sdrh             pExpr->iField = j;
179cce7d176Sdrh           }
180cce7d176Sdrh         }
181cce7d176Sdrh       }
182cce7d176Sdrh       sqliteFree(zLeft);
183cce7d176Sdrh       sqliteFree(zRight);
184cce7d176Sdrh       if( cnt==0 ){
185cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
186cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
187cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
188cce7d176Sdrh         pParse->nErr++;
189cce7d176Sdrh         return 1;
190cce7d176Sdrh       }else if( cnt>1 ){
191cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
192cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
193cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
194cce7d176Sdrh         pParse->nErr++;
195cce7d176Sdrh         return 1;
196cce7d176Sdrh       }
197cce7d176Sdrh       sqliteExprDelete(pLeft);
198cce7d176Sdrh       pExpr->pLeft = 0;
199cce7d176Sdrh       sqliteExprDelete(pRight);
200cce7d176Sdrh       pExpr->pRight = 0;
201cce7d176Sdrh       pExpr->op = TK_FIELD;
202cce7d176Sdrh       break;
203cce7d176Sdrh     }
204cce7d176Sdrh 
205fef5208cSdrh     case TK_IN: {
206d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
207fef5208cSdrh       if( v==0 ) return 1;
208cfab11bcSdrh       if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
209cfab11bcSdrh         return 1;
210cfab11bcSdrh       }
211fef5208cSdrh       if( pExpr->pSelect ){
212fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
213fef5208cSdrh         **
214fef5208cSdrh         ** Generate code to write the results of the select into a temporary
2154794b980Sdrh         ** table.  The cursor number of the temporary table has already
2164794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
217fef5208cSdrh         */
2184794b980Sdrh         sqliteVdbeAddOp(v, OP_Open, pExpr->iTable, 1, 0, 0);
219fef5208cSdrh         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
220fef5208cSdrh       }else if( pExpr->pList ){
221fef5208cSdrh         /* Case 2:     expr IN (exprlist)
222fef5208cSdrh         **
223fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
224fef5208cSdrh         ** in iTable.
225fef5208cSdrh         */
226fef5208cSdrh         int i, iSet;
227fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
228fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
229fef5208cSdrh           if( !isConstant(pE2) ){
230fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
231fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
232fef5208cSdrh             pParse->nErr++;
233fef5208cSdrh             return 1;
234fef5208cSdrh           }
2354794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
2364794b980Sdrh             return 1;
2374794b980Sdrh           }
238fef5208cSdrh         }
239fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
240fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
241fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
242fef5208cSdrh           switch( pE2->op ){
243fef5208cSdrh             case TK_FLOAT:
244fef5208cSdrh             case TK_INTEGER:
245fef5208cSdrh             case TK_STRING: {
246fef5208cSdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
247fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
248fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
249fef5208cSdrh               break;
250fef5208cSdrh             }
251fef5208cSdrh             default: {
252fef5208cSdrh               sqliteExprCode(pParse, pE2);
253fef5208cSdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
254fef5208cSdrh               break;
255fef5208cSdrh             }
256fef5208cSdrh           }
257fef5208cSdrh         }
258fef5208cSdrh       }
259cfab11bcSdrh       break;
260fef5208cSdrh     }
261fef5208cSdrh 
26219a775c2Sdrh     case TK_SELECT: {
263fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
264fef5208cSdrh       ** value of this select in a memory cell and record the number
265fef5208cSdrh       ** of the memory cell in iField.
266fef5208cSdrh       */
26719a775c2Sdrh       pExpr->iField = pParse->nMem++;
268fef5208cSdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iField) ){
26919a775c2Sdrh         return 1;
27019a775c2Sdrh       }
27119a775c2Sdrh       break;
27219a775c2Sdrh     }
27319a775c2Sdrh 
274cce7d176Sdrh     /* For all else, just recursively walk the tree */
275cce7d176Sdrh     default: {
276cce7d176Sdrh       if( pExpr->pLeft
277cce7d176Sdrh       && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
278cce7d176Sdrh         return 1;
279cce7d176Sdrh       }
280cce7d176Sdrh       if( pExpr->pRight
281cce7d176Sdrh       && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){
282cce7d176Sdrh         return 1;
283cce7d176Sdrh       }
284cce7d176Sdrh       if( pExpr->pList ){
285cce7d176Sdrh         int i;
286cce7d176Sdrh         ExprList *pList = pExpr->pList;
287cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
288cce7d176Sdrh           if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){
289cce7d176Sdrh             return 1;
290cce7d176Sdrh           }
291cce7d176Sdrh         }
292cce7d176Sdrh       }
293cce7d176Sdrh     }
294cce7d176Sdrh   }
295cce7d176Sdrh   return 0;
296cce7d176Sdrh }
297cce7d176Sdrh 
298cce7d176Sdrh #if 0 /* NOT USED */
299cce7d176Sdrh /*
300cce7d176Sdrh ** Compare a token against a string.  Return TRUE if they match.
301cce7d176Sdrh */
302cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){
303cce7d176Sdrh   int n = strlen(zStr);
304cce7d176Sdrh   if( n!=pToken->n ) return 0;
305cce7d176Sdrh   return sqliteStrNICmp(pToken->z, zStr, n)==0;
306cce7d176Sdrh }
307cce7d176Sdrh #endif
308cce7d176Sdrh 
309cce7d176Sdrh /*
310cce7d176Sdrh ** Convert a function name into its integer identifier.  Return the
311cce7d176Sdrh ** identifier.  Return FN_Unknown if the function name is unknown.
312cce7d176Sdrh */
313cce7d176Sdrh int sqliteFuncId(Token *pToken){
314cce7d176Sdrh   static const struct {
315cce7d176Sdrh      char *zName;
316cce7d176Sdrh      int len;
317cce7d176Sdrh      int id;
318cce7d176Sdrh   } aFunc[] = {
319cce7d176Sdrh      { "count",  5, FN_Count },
320cce7d176Sdrh      { "min",    3, FN_Min   },
321cce7d176Sdrh      { "max",    3, FN_Max   },
322cce7d176Sdrh      { "sum",    3, FN_Sum   },
3232282792aSdrh      { "avg",    3, FN_Avg   },
324*0bdaf62eSdrh      { "fcnt",   4, FN_Fcnt  },  /* Used for testing only */
325cce7d176Sdrh   };
326cce7d176Sdrh   int i;
327cce7d176Sdrh   for(i=0; i<ArraySize(aFunc); i++){
328cce7d176Sdrh     if( aFunc[i].len==pToken->n
329cce7d176Sdrh      && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
330cce7d176Sdrh        return aFunc[i].id;
331cce7d176Sdrh     }
332cce7d176Sdrh   }
333cce7d176Sdrh   return FN_Unknown;
334cce7d176Sdrh }
335cce7d176Sdrh 
336cce7d176Sdrh /*
337cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
338cce7d176Sdrh ** function names are recognized and all functions have the correct
339cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
340cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
341cce7d176Sdrh **
342cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
343cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
344cce7d176Sdrh */
345cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
346cce7d176Sdrh   int nErr = 0;
347cce7d176Sdrh   if( pExpr==0 ) return 0;
348cce7d176Sdrh   switch( pExpr->op ){
349cce7d176Sdrh     case TK_FUNCTION: {
350cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
351cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
352cce7d176Sdrh       int no_such_func = 0;
353cce7d176Sdrh       int too_many_args = 0;
354cce7d176Sdrh       int too_few_args = 0;
355cce7d176Sdrh       int is_agg = 0;
356cce7d176Sdrh       int i;
3572282792aSdrh       pExpr->iField = id;
358cce7d176Sdrh       switch( id ){
359cce7d176Sdrh         case FN_Unknown: {
360cce7d176Sdrh           no_such_func = 1;
361cce7d176Sdrh           break;
362cce7d176Sdrh         }
363cce7d176Sdrh         case FN_Count: {
364cce7d176Sdrh           no_such_func = !allowAgg;
365cce7d176Sdrh           too_many_args = n>1;
366cce7d176Sdrh           is_agg = 1;
367cce7d176Sdrh           break;
368cce7d176Sdrh         }
369cce7d176Sdrh         case FN_Max:
370cce7d176Sdrh         case FN_Min: {
371cce7d176Sdrh           too_few_args = allowAgg ? n<1 : n<2;
372cce7d176Sdrh           is_agg = n==1;
373cce7d176Sdrh           break;
374cce7d176Sdrh         }
3752282792aSdrh         case FN_Avg:
376cce7d176Sdrh         case FN_Sum: {
377cce7d176Sdrh           no_such_func = !allowAgg;
378cce7d176Sdrh           too_many_args = n>1;
379cce7d176Sdrh           too_few_args = n<1;
380cce7d176Sdrh           is_agg = 1;
381cce7d176Sdrh           break;
382cce7d176Sdrh         }
383*0bdaf62eSdrh         /* The "fcnt(*)" function always returns the number of fetch
384*0bdaf62eSdrh         ** operations that have occurred so far while processing the
385*0bdaf62eSdrh         ** SQL statement.  This information can be used by test procedures
386*0bdaf62eSdrh         ** to verify that indices are being used properly to minimize
387*0bdaf62eSdrh         ** searching.  All arguments to fcnt() are ignored.  fcnt() has
388*0bdaf62eSdrh         ** no use (other than testing) that we are aware of.
389*0bdaf62eSdrh         */
390*0bdaf62eSdrh         case FN_Fcnt: {
391*0bdaf62eSdrh           n = 0;
392*0bdaf62eSdrh           break;
393*0bdaf62eSdrh         }
394cce7d176Sdrh         default: break;
395cce7d176Sdrh       }
396cce7d176Sdrh       if( no_such_func ){
397cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
398cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
399cce7d176Sdrh         pParse->nErr++;
400cce7d176Sdrh         nErr++;
401cce7d176Sdrh       }else if( too_many_args ){
402cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
403cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
404cce7d176Sdrh         pParse->nErr++;
405cce7d176Sdrh         nErr++;
406cce7d176Sdrh       }else if( too_few_args ){
407cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
408cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
409cce7d176Sdrh         pParse->nErr++;
410cce7d176Sdrh         nErr++;
411cce7d176Sdrh       }
4122282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
413cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
414cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
4154cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
4164cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
417cce7d176Sdrh       }
418cce7d176Sdrh     }
419cce7d176Sdrh     default: {
420cce7d176Sdrh       if( pExpr->pLeft ){
4212282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
422cce7d176Sdrh       }
423cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
4242282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
425cce7d176Sdrh       }
426fef5208cSdrh       if( nErr==0 && pExpr->pList ){
427fef5208cSdrh         int n = pExpr->pList->nExpr;
428fef5208cSdrh         int i;
429fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
4302282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
4312282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
432fef5208cSdrh         }
433fef5208cSdrh       }
434cce7d176Sdrh       break;
435cce7d176Sdrh     }
436cce7d176Sdrh   }
437cce7d176Sdrh   return nErr;
438cce7d176Sdrh }
439cce7d176Sdrh 
440cce7d176Sdrh /*
441cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
442cce7d176Sdrh ** expression and leave the result on the stack.
443cce7d176Sdrh */
444cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
445cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
446cce7d176Sdrh   int op;
447cce7d176Sdrh   switch( pExpr->op ){
448cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
449cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
450cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
451cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
452cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
453cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
454cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
455cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
456cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
457cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
458cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
459cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
460cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
461cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
462cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
463cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
464cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
465cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
466cce7d176Sdrh     default: break;
467cce7d176Sdrh   }
468cce7d176Sdrh   switch( pExpr->op ){
469cce7d176Sdrh     case TK_FIELD: {
4702282792aSdrh       if( pParse->useAgg ){
4712282792aSdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
4722282792aSdrh       }else{
473cce7d176Sdrh         sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iField, 0, 0);
4742282792aSdrh       }
475cce7d176Sdrh       break;
476cce7d176Sdrh     }
477cce7d176Sdrh     case TK_INTEGER: {
478cce7d176Sdrh       int i = atoi(pExpr->token.z);
479cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
480cce7d176Sdrh       break;
481cce7d176Sdrh     }
482cce7d176Sdrh     case TK_FLOAT: {
483cce7d176Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
484cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
485cce7d176Sdrh       break;
486cce7d176Sdrh     }
487cce7d176Sdrh     case TK_STRING: {
488cce7d176Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
489cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
490cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
491cce7d176Sdrh       break;
492cce7d176Sdrh     }
493cce7d176Sdrh     case TK_NULL: {
494c61053b7Sdrh       sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
495cce7d176Sdrh       break;
496cce7d176Sdrh     }
497cce7d176Sdrh     case TK_AND:
498cce7d176Sdrh     case TK_OR:
499cce7d176Sdrh     case TK_PLUS:
500cce7d176Sdrh     case TK_STAR:
501cce7d176Sdrh     case TK_MINUS:
502cce7d176Sdrh     case TK_SLASH: {
503cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
504cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
505cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
506cce7d176Sdrh       break;
507cce7d176Sdrh     }
508cce7d176Sdrh     case TK_LT:
509cce7d176Sdrh     case TK_LE:
510cce7d176Sdrh     case TK_GT:
511cce7d176Sdrh     case TK_GE:
512cce7d176Sdrh     case TK_NE:
513cce7d176Sdrh     case TK_EQ:
514cce7d176Sdrh     case TK_LIKE:
515cce7d176Sdrh     case TK_GLOB: {
516cce7d176Sdrh       int dest;
517cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
518cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
519cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
520cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
521cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
522cce7d176Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
523cce7d176Sdrh       break;
524cce7d176Sdrh     }
525cce7d176Sdrh     case TK_UMINUS: {
5266e142f54Sdrh       assert( pExpr->pLeft );
5276e142f54Sdrh       if( pExpr->pLeft->op==TK_INTEGER ){
5286e142f54Sdrh         int i = atoi(pExpr->pLeft->token.z);
5296e142f54Sdrh         sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0);
5306e142f54Sdrh         break;
5316e142f54Sdrh       }else if( pExpr->pLeft->op==TK_FLOAT ){
5326e142f54Sdrh         Token *p = &pExpr->pLeft->token;
5336e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
5346e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
5356e142f54Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0);
5366e142f54Sdrh         sqliteFree(z);
5376e142f54Sdrh         break;
5386e142f54Sdrh       }
5396e142f54Sdrh       /* Fall true into TK_NOT */
5406e142f54Sdrh     }
5416e142f54Sdrh     case TK_NOT: {
542cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
543cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
544cce7d176Sdrh       break;
545cce7d176Sdrh     }
546cce7d176Sdrh     case TK_ISNULL:
547cce7d176Sdrh     case TK_NOTNULL: {
548cce7d176Sdrh       int dest;
5498be51133Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
550cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
551cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
552cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
5538be51133Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
554cce7d176Sdrh       break;
555cce7d176Sdrh     }
5562282792aSdrh     case TK_AGG_FUNCTION: {
5572282792aSdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
5582282792aSdrh       if( pExpr->iField==FN_Avg ){
5592282792aSdrh         assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
5602282792aSdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0);
5612282792aSdrh         sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0);
5622282792aSdrh       }
5632282792aSdrh       break;
5642282792aSdrh     }
565cce7d176Sdrh     case TK_FUNCTION: {
5662282792aSdrh       int id = pExpr->iField;
567cce7d176Sdrh       int op;
568cce7d176Sdrh       int i;
569cce7d176Sdrh       ExprList *pList = pExpr->pList;
570*0bdaf62eSdrh       if( id==FN_Fcnt ){
571*0bdaf62eSdrh         sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0);
572*0bdaf62eSdrh         break;
573*0bdaf62eSdrh       }
574cce7d176Sdrh       op = id==FN_Min ? OP_Min : OP_Max;
575cce7d176Sdrh       for(i=0; i<pList->nExpr; i++){
576cce7d176Sdrh         sqliteExprCode(pParse, pList->a[i].pExpr);
577cce7d176Sdrh         if( i>0 ){
578cce7d176Sdrh           sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
579cce7d176Sdrh         }
580cce7d176Sdrh       }
581cce7d176Sdrh       break;
582cce7d176Sdrh     }
58319a775c2Sdrh     case TK_SELECT: {
58419a775c2Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iField, 0, 0, 0);
58519a775c2Sdrh       break;
58619a775c2Sdrh     }
587fef5208cSdrh     case TK_IN: {
588fef5208cSdrh       int addr;
5894794b980Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
590fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
591fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
592fef5208cSdrh       if( pExpr->pSelect ){
593fef5208cSdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0);
594fef5208cSdrh       }else{
595fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0);
596fef5208cSdrh       }
5974794b980Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
598fef5208cSdrh       break;
599fef5208cSdrh     }
600fef5208cSdrh     case TK_BETWEEN: {
601fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
602fef5208cSdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
603fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
604fef5208cSdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0);
605fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
606fef5208cSdrh       break;
607fef5208cSdrh     }
608cce7d176Sdrh   }
609cce7d176Sdrh   return;
610cce7d176Sdrh }
611cce7d176Sdrh 
612cce7d176Sdrh /*
613cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
614cce7d176Sdrh ** to the label "dest" if the expression is true but execution
615cce7d176Sdrh ** continues straight thru if the expression is false.
616cce7d176Sdrh */
617cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
618cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
619cce7d176Sdrh   int op = 0;
620cce7d176Sdrh   switch( pExpr->op ){
621cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
622cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
623cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
624cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
625cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
626cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
627cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
628cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
629cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
630cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
631cce7d176Sdrh     default:  break;
632cce7d176Sdrh   }
633cce7d176Sdrh   switch( pExpr->op ){
634cce7d176Sdrh     case TK_AND: {
635cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
636cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
637cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
638cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
639cce7d176Sdrh       break;
640cce7d176Sdrh     }
641cce7d176Sdrh     case TK_OR: {
642cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
643cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
644cce7d176Sdrh       break;
645cce7d176Sdrh     }
646cce7d176Sdrh     case TK_NOT: {
647cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
648cce7d176Sdrh       break;
649cce7d176Sdrh     }
650cce7d176Sdrh     case TK_LT:
651cce7d176Sdrh     case TK_LE:
652cce7d176Sdrh     case TK_GT:
653cce7d176Sdrh     case TK_GE:
654cce7d176Sdrh     case TK_NE:
655cce7d176Sdrh     case TK_EQ:
656cce7d176Sdrh     case TK_LIKE:
657cce7d176Sdrh     case TK_GLOB: {
658cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
659cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
660cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
661cce7d176Sdrh       break;
662cce7d176Sdrh     }
663cce7d176Sdrh     case TK_ISNULL:
664cce7d176Sdrh     case TK_NOTNULL: {
665cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
666cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
667cce7d176Sdrh       break;
668cce7d176Sdrh     }
669fef5208cSdrh     case TK_IN: {
670cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
671fef5208cSdrh       if( pExpr->pSelect ){
672fef5208cSdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0);
673fef5208cSdrh       }else{
674fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0);
675fef5208cSdrh       }
676fef5208cSdrh       break;
677fef5208cSdrh     }
678fef5208cSdrh     case TK_BETWEEN: {
679fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
680fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
681fef5208cSdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
682fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
683fef5208cSdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0);
684fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
685fef5208cSdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0);
686fef5208cSdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
687fef5208cSdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl);
688fef5208cSdrh       break;
689fef5208cSdrh     }
690cce7d176Sdrh     default: {
691cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
692cce7d176Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
693cce7d176Sdrh       break;
694cce7d176Sdrh     }
695cce7d176Sdrh   }
696cce7d176Sdrh }
697cce7d176Sdrh 
698cce7d176Sdrh /*
699cce7d176Sdrh ** Generate code for boolean expression such that a jump is made
700cce7d176Sdrh ** to the label "dest" if the expression is false but execution
701cce7d176Sdrh ** continues straight thru if the expression is true.
702cce7d176Sdrh */
703cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
704cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
705cce7d176Sdrh   int op = 0;
706cce7d176Sdrh   switch( pExpr->op ){
707cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
708cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
709cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
710cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
711cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
712cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
713cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
714cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
715cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
716cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
717cce7d176Sdrh     default:  break;
718cce7d176Sdrh   }
719cce7d176Sdrh   switch( pExpr->op ){
720cce7d176Sdrh     case TK_AND: {
721cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
722cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
723cce7d176Sdrh       break;
724cce7d176Sdrh     }
725cce7d176Sdrh     case TK_OR: {
726cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
727cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
728cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
729cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
730cce7d176Sdrh       break;
731cce7d176Sdrh     }
732cce7d176Sdrh     case TK_NOT: {
733cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
734cce7d176Sdrh       break;
735cce7d176Sdrh     }
736cce7d176Sdrh     case TK_LT:
737cce7d176Sdrh     case TK_LE:
738cce7d176Sdrh     case TK_GT:
739cce7d176Sdrh     case TK_GE:
740cce7d176Sdrh     case TK_NE:
741cce7d176Sdrh     case TK_EQ: {
742cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
743cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
744cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
745cce7d176Sdrh       break;
746cce7d176Sdrh     }
747cce7d176Sdrh     case TK_LIKE:
748cce7d176Sdrh     case TK_GLOB: {
749cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
750cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
751cce7d176Sdrh       sqliteVdbeAddOp(v, op, 1, dest, 0, 0);
752cce7d176Sdrh       break;
753cce7d176Sdrh     }
754cce7d176Sdrh     case TK_ISNULL:
755cce7d176Sdrh     case TK_NOTNULL: {
756cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
757cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
758cce7d176Sdrh       break;
759cce7d176Sdrh     }
760fef5208cSdrh     case TK_IN: {
761cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
762fef5208cSdrh       if( pExpr->pSelect ){
763fef5208cSdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0);
764fef5208cSdrh       }else{
765fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0);
766fef5208cSdrh       }
767fef5208cSdrh       break;
768fef5208cSdrh     }
769fef5208cSdrh     case TK_BETWEEN: {
770fef5208cSdrh       int addr;
771fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
772fef5208cSdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
773fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
774fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
775fef5208cSdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0);
776fef5208cSdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0);
777fef5208cSdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0);
778fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
779fef5208cSdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0);
780fef5208cSdrh       break;
781fef5208cSdrh     }
782cce7d176Sdrh     default: {
783cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
784cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0);
785cce7d176Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
786cce7d176Sdrh       break;
787cce7d176Sdrh     }
788cce7d176Sdrh   }
789cce7d176Sdrh }
7902282792aSdrh 
7912282792aSdrh /*
7922282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
7932282792aSdrh ** if they are identical and return FALSE if they differ in any way.
7942282792aSdrh */
795d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
7962282792aSdrh   int i;
7972282792aSdrh   if( pA==0 ){
7982282792aSdrh     return pB==0;
7992282792aSdrh   }else if( pB==0 ){
8002282792aSdrh     return 0;
8012282792aSdrh   }
8022282792aSdrh   if( pA->op!=pB->op ) return 0;
803d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
804d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
8052282792aSdrh   if( pA->pList ){
8062282792aSdrh     if( pB->pList==0 ) return 0;
8072282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
8082282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
809d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
8102282792aSdrh         return 0;
8112282792aSdrh       }
8122282792aSdrh     }
8132282792aSdrh   }else if( pB->pList ){
8142282792aSdrh     return 0;
8152282792aSdrh   }
8162282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
8172282792aSdrh   if( pA->token.z ){
8182282792aSdrh     if( pB->token.z==0 ) return 0;
8192282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
8202282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
8212282792aSdrh   }
8222282792aSdrh   return 1;
8232282792aSdrh }
8242282792aSdrh 
8252282792aSdrh /*
8262282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
8272282792aSdrh */
8282282792aSdrh static int appendAggInfo(Parse *pParse){
8292282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
8302282792aSdrh     int amt = pParse->nAgg + 8;
8312282792aSdrh     pParse->aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
8322282792aSdrh     if( pParse->aAgg==0 ){
8332282792aSdrh       sqliteSetString(&pParse->zErrMsg, "out of memory", 0);
8342282792aSdrh       pParse->nErr++;
8352282792aSdrh       return -1;
8362282792aSdrh     }
8372282792aSdrh   }
8382282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
8392282792aSdrh   return pParse->nAgg++;
8402282792aSdrh }
8412282792aSdrh 
8422282792aSdrh /*
8432282792aSdrh ** Analyze the given expression looking for aggregate functions and
8442282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
8452282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
8462282792aSdrh **
8472282792aSdrh ** This routine should only be called after the expression has been
8482282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
8492282792aSdrh **
8502282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
8512282792aSdrh ** the number of errors.
8522282792aSdrh */
8532282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
8542282792aSdrh   int i;
8552282792aSdrh   AggExpr *aAgg;
8562282792aSdrh   int nErr = 0;
8572282792aSdrh 
8582282792aSdrh   if( pExpr==0 ) return 0;
8592282792aSdrh   switch( pExpr->op ){
8602282792aSdrh     case TK_FIELD: {
8612282792aSdrh       aAgg = pParse->aAgg;
8622282792aSdrh       for(i=0; i<pParse->nAgg; i++){
8632282792aSdrh         if( aAgg[i].isAgg ) continue;
8642282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
8652282792aSdrh          && aAgg[i].pExpr->iField==pExpr->iField ){
8662282792aSdrh           break;
8672282792aSdrh         }
8682282792aSdrh       }
8692282792aSdrh       if( i>=pParse->nAgg ){
8702282792aSdrh         i = appendAggInfo(pParse);
8712282792aSdrh         if( i<0 ) return 1;
8722282792aSdrh         pParse->aAgg[i].isAgg = 0;
8732282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
8742282792aSdrh       }
875aaf88729Sdrh       pExpr->iAgg = i;
8762282792aSdrh       break;
8772282792aSdrh     }
8782282792aSdrh     case TK_AGG_FUNCTION: {
8792282792aSdrh       if( pExpr->iField==FN_Count || pExpr->iField==FN_Avg ){
8802282792aSdrh         if( pParse->iAggCount>=0 ){
8812282792aSdrh           i = pParse->iAggCount;
8822282792aSdrh         }else{
8832282792aSdrh           i = appendAggInfo(pParse);
8842282792aSdrh           if( i<0 ) return 1;
8852282792aSdrh           pParse->aAgg[i].isAgg = 1;
8862282792aSdrh           pParse->aAgg[i].pExpr = 0;
8872282792aSdrh           pParse->iAggCount = i;
8882282792aSdrh         }
8892282792aSdrh         if( pExpr->iField==FN_Count ){
8902282792aSdrh           pExpr->iAgg = i;
8912282792aSdrh           break;
8922282792aSdrh         }
8932282792aSdrh       }
8942282792aSdrh       aAgg = pParse->aAgg;
8952282792aSdrh       for(i=0; i<pParse->nAgg; i++){
8962282792aSdrh         if( !aAgg[i].isAgg ) continue;
897d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
8982282792aSdrh           break;
8992282792aSdrh         }
9002282792aSdrh       }
9012282792aSdrh       if( i>=pParse->nAgg ){
9022282792aSdrh         i = appendAggInfo(pParse);
9032282792aSdrh         if( i<0 ) return 1;
9042282792aSdrh         pParse->aAgg[i].isAgg = 1;
9052282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
9062282792aSdrh       }
9072282792aSdrh       pExpr->iAgg = i;
9082282792aSdrh       break;
9092282792aSdrh     }
9102282792aSdrh     default: {
9112282792aSdrh       if( pExpr->pLeft ){
9122282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
9132282792aSdrh       }
9142282792aSdrh       if( nErr==0 && pExpr->pRight ){
9152282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
9162282792aSdrh       }
9172282792aSdrh       if( nErr==0 && pExpr->pList ){
9182282792aSdrh         int n = pExpr->pList->nExpr;
9192282792aSdrh         int i;
9202282792aSdrh         for(i=0; nErr==0 && i<n; i++){
9212282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
9222282792aSdrh         }
9232282792aSdrh       }
9242282792aSdrh       break;
9252282792aSdrh     }
9262282792aSdrh   }
9272282792aSdrh   return nErr;
9282282792aSdrh }
929