xref: /sqlite-3.40.0/src/expr.c (revision daffd0e5)
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 *************************************************************************
241ccde15dSdrh ** This file contains routines used for analyzing expressions and
251ccde15dSdrh ** for generating VDBE code that evaluates expressions.
26cce7d176Sdrh **
27*daffd0e5Sdrh ** $Id: expr.c,v 1.24 2001/04/11 14:28:42 drh Exp $
28cce7d176Sdrh */
29cce7d176Sdrh #include "sqliteInt.h"
30cce7d176Sdrh 
31cce7d176Sdrh /*
32fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
33fef5208cSdrh ** and 0 if it involves variables.
34fef5208cSdrh */
35fef5208cSdrh static int isConstant(Expr *p){
36fef5208cSdrh   switch( p->op ){
37fef5208cSdrh     case TK_ID:
38967e8b73Sdrh     case TK_COLUMN:
39fef5208cSdrh     case TK_DOT:
40fef5208cSdrh       return 0;
41fef5208cSdrh     default: {
42fef5208cSdrh       if( p->pLeft && !isConstant(p->pLeft) ) return 0;
43fef5208cSdrh       if( p->pRight && !isConstant(p->pRight) ) return 0;
44fef5208cSdrh       if( p->pList ){
45fef5208cSdrh         int i;
46fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
47fef5208cSdrh           if( !isConstant(p->pList->a[i].pExpr) ) return 0;
48fef5208cSdrh         }
49fef5208cSdrh       }
50fef5208cSdrh       break;
51fef5208cSdrh     }
52fef5208cSdrh   }
53fef5208cSdrh   return 1;
54fef5208cSdrh }
55fef5208cSdrh 
56fef5208cSdrh /*
574794b980Sdrh ** Walk the expression tree and process operators of the form:
584794b980Sdrh **
594794b980Sdrh **       expr IN (SELECT ...)
604794b980Sdrh **
61967e8b73Sdrh ** These operators have to be processed before column names are
624794b980Sdrh ** resolved because each such operator increments pParse->nTab
631ccde15dSdrh ** to reserve cursor numbers for its own use.  But pParse->nTab
64967e8b73Sdrh ** needs to be constant once we begin resolving column names.
654794b980Sdrh **
664794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this
674794b980Sdrh ** routine.  This routine allocates a cursor number to the IN-SELECT
684794b980Sdrh ** and then moves on.  The code generation is done by
694794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards.
704794b980Sdrh */
714794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
724794b980Sdrh   if( pExpr==0 ) return;
734794b980Sdrh   if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
744794b980Sdrh     pExpr->iTable = pParse->nTab++;
754794b980Sdrh   }else{
764794b980Sdrh     if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
774794b980Sdrh     if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
784794b980Sdrh     if( pExpr->pList ){
794794b980Sdrh       int i;
804794b980Sdrh       ExprList *pList = pExpr->pList;
814794b980Sdrh       for(i=0; i<pList->nExpr; i++){
824794b980Sdrh         sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
834794b980Sdrh       }
844794b980Sdrh     }
854794b980Sdrh   }
864794b980Sdrh }
874794b980Sdrh 
884794b980Sdrh /*
89c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
90c4a3c779Sdrh */
91c4a3c779Sdrh static int sqliteIsRowid(const char *z){
92c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
93c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
94c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
95c4a3c779Sdrh   return 0;
96c4a3c779Sdrh }
97c4a3c779Sdrh 
98c4a3c779Sdrh /*
99cce7d176Sdrh ** This routine walks an expression tree and resolves references to
100967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
101967e8b73Sdrh ** index to the table in the table list and a column offset.  The opcode
102967e8b73Sdrh ** for such nodes is changed to TK_COLUMN.  The iTable value is changed
10319a775c2Sdrh ** to the index of the referenced table in pTabList plus the pParse->nTab
104967e8b73Sdrh ** value.  The iColumn value is changed to the index of the column of the
10519a775c2Sdrh ** referenced table.
10619a775c2Sdrh **
107fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
108fef5208cSdrh ** forms:
109fef5208cSdrh **
110fef5208cSdrh **           expr IN (exprlist)
111fef5208cSdrh ** and
112fef5208cSdrh **           expr IN (SELECT ...)
113fef5208cSdrh **
114fef5208cSdrh ** The first form is handled by creating a set holding the list
115fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
116fef5208cSdrh ** a temporary table.
117fef5208cSdrh **
118fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
11919a775c2Sdrh ** If it finds any, it generates code to write the value of that select
12019a775c2Sdrh ** into a memory cell.
121cce7d176Sdrh **
122967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
123cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
124cce7d176Sdrh */
125cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
126*daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
127cce7d176Sdrh   switch( pExpr->op ){
128cce7d176Sdrh     /* A lone identifier */
129cce7d176Sdrh     case TK_ID: {
130cce7d176Sdrh       int cnt = 0;      /* Number of matches */
131cce7d176Sdrh       int i;            /* Loop counter */
1326e142f54Sdrh       char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
133*daffd0e5Sdrh       if( z==0 ) return 1;
134cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
135cce7d176Sdrh         int j;
136cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
137cce7d176Sdrh         if( pTab==0 ) continue;
138cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
1397020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
140cce7d176Sdrh             cnt++;
14119a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
142967e8b73Sdrh             pExpr->iColumn = j;
143cce7d176Sdrh           }
144cce7d176Sdrh         }
145cce7d176Sdrh       }
146c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
147c4a3c779Sdrh         pExpr->iColumn = -1;
148c4a3c779Sdrh         pExpr->iTable = pParse->nTab;
149c4a3c779Sdrh         cnt = 1 + (pTabList->nId>1);
150c4a3c779Sdrh       }
151cce7d176Sdrh       sqliteFree(z);
152cce7d176Sdrh       if( cnt==0 ){
153967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
154cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
155cce7d176Sdrh         pParse->nErr++;
156cce7d176Sdrh         return 1;
157cce7d176Sdrh       }else if( cnt>1 ){
158967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
159cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
160cce7d176Sdrh         pParse->nErr++;
161cce7d176Sdrh         return 1;
162cce7d176Sdrh       }
163967e8b73Sdrh       pExpr->op = TK_COLUMN;
164cce7d176Sdrh       break;
165cce7d176Sdrh     }
166cce7d176Sdrh 
167967e8b73Sdrh     /* A table name and column name:  ID.ID */
168cce7d176Sdrh     case TK_DOT: {
169cce7d176Sdrh       int cnt = 0;             /* Number of matches */
170c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
171cce7d176Sdrh       int i;                   /* Loop counter */
172cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
173cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
174cce7d176Sdrh 
175cce7d176Sdrh       pLeft = pExpr->pLeft;
176cce7d176Sdrh       pRight = pExpr->pRight;
177cce7d176Sdrh       assert( pLeft && pLeft->op==TK_ID );
178cce7d176Sdrh       assert( pRight && pRight->op==TK_ID );
1796e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
1806e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
181*daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
182*daffd0e5Sdrh         sqliteFree(zLeft);
183*daffd0e5Sdrh         sqliteFree(zRight);
184*daffd0e5Sdrh         return 1;
185*daffd0e5Sdrh       }
186c4a3c779Sdrh       pExpr->iTable = -1;
187cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
188cce7d176Sdrh         int j;
189cce7d176Sdrh         char *zTab;
190cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
191cce7d176Sdrh         if( pTab==0 ) continue;
192cce7d176Sdrh         if( pTabList->a[i].zAlias ){
193cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
194cce7d176Sdrh         }else{
195cce7d176Sdrh           zTab = pTab->zName;
196cce7d176Sdrh         }
197cce7d176Sdrh         if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
198c4a3c779Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
199cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
2007020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
201cce7d176Sdrh             cnt++;
20219a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
203967e8b73Sdrh             pExpr->iColumn = j;
204cce7d176Sdrh           }
205cce7d176Sdrh         }
206cce7d176Sdrh       }
207c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
208c4a3c779Sdrh         cnt = 1;
209c4a3c779Sdrh         pExpr->iColumn = -1;
210c4a3c779Sdrh       }
211cce7d176Sdrh       sqliteFree(zLeft);
212cce7d176Sdrh       sqliteFree(zRight);
213cce7d176Sdrh       if( cnt==0 ){
214967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
215cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
216cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
217cce7d176Sdrh         pParse->nErr++;
218cce7d176Sdrh         return 1;
219cce7d176Sdrh       }else if( cnt>1 ){
220967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
221cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
222cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
223cce7d176Sdrh         pParse->nErr++;
224cce7d176Sdrh         return 1;
225cce7d176Sdrh       }
226cce7d176Sdrh       sqliteExprDelete(pLeft);
227cce7d176Sdrh       pExpr->pLeft = 0;
228cce7d176Sdrh       sqliteExprDelete(pRight);
229cce7d176Sdrh       pExpr->pRight = 0;
230967e8b73Sdrh       pExpr->op = TK_COLUMN;
231cce7d176Sdrh       break;
232cce7d176Sdrh     }
233cce7d176Sdrh 
234fef5208cSdrh     case TK_IN: {
235d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
236fef5208cSdrh       if( v==0 ) return 1;
237cfab11bcSdrh       if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
238cfab11bcSdrh         return 1;
239cfab11bcSdrh       }
240fef5208cSdrh       if( pExpr->pSelect ){
241fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
242fef5208cSdrh         **
243fef5208cSdrh         ** Generate code to write the results of the select into a temporary
2444794b980Sdrh         ** table.  The cursor number of the temporary table has already
2454794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
246fef5208cSdrh         */
247345fda3eSdrh         sqliteVdbeAddOp(v, OP_OpenIdx, pExpr->iTable, 1, 0, 0);
248fef5208cSdrh         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
249fef5208cSdrh       }else if( pExpr->pList ){
250fef5208cSdrh         /* Case 2:     expr IN (exprlist)
251fef5208cSdrh         **
252fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
253fef5208cSdrh         ** in iTable.
254fef5208cSdrh         */
255fef5208cSdrh         int i, iSet;
256fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
257fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
258fef5208cSdrh           if( !isConstant(pE2) ){
259fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
260fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
261fef5208cSdrh             pParse->nErr++;
262fef5208cSdrh             return 1;
263fef5208cSdrh           }
2644794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
2654794b980Sdrh             return 1;
2664794b980Sdrh           }
267fef5208cSdrh         }
268fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
269fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
270fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
271fef5208cSdrh           switch( pE2->op ){
272fef5208cSdrh             case TK_FLOAT:
273fef5208cSdrh             case TK_INTEGER:
274fef5208cSdrh             case TK_STRING: {
275fef5208cSdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
276fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
277fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
278fef5208cSdrh               break;
279fef5208cSdrh             }
280fef5208cSdrh             default: {
281fef5208cSdrh               sqliteExprCode(pParse, pE2);
282fef5208cSdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
283fef5208cSdrh               break;
284fef5208cSdrh             }
285fef5208cSdrh           }
286fef5208cSdrh         }
287fef5208cSdrh       }
288cfab11bcSdrh       break;
289fef5208cSdrh     }
290fef5208cSdrh 
29119a775c2Sdrh     case TK_SELECT: {
292fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
293fef5208cSdrh       ** value of this select in a memory cell and record the number
294967e8b73Sdrh       ** of the memory cell in iColumn.
295fef5208cSdrh       */
296967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
297967e8b73Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
29819a775c2Sdrh         return 1;
29919a775c2Sdrh       }
30019a775c2Sdrh       break;
30119a775c2Sdrh     }
30219a775c2Sdrh 
303cce7d176Sdrh     /* For all else, just recursively walk the tree */
304cce7d176Sdrh     default: {
305cce7d176Sdrh       if( pExpr->pLeft
306cce7d176Sdrh       && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
307cce7d176Sdrh         return 1;
308cce7d176Sdrh       }
309cce7d176Sdrh       if( pExpr->pRight
310cce7d176Sdrh       && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){
311cce7d176Sdrh         return 1;
312cce7d176Sdrh       }
313cce7d176Sdrh       if( pExpr->pList ){
314cce7d176Sdrh         int i;
315cce7d176Sdrh         ExprList *pList = pExpr->pList;
316cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
317cce7d176Sdrh           if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){
318cce7d176Sdrh             return 1;
319cce7d176Sdrh           }
320cce7d176Sdrh         }
321cce7d176Sdrh       }
322cce7d176Sdrh     }
323cce7d176Sdrh   }
324cce7d176Sdrh   return 0;
325cce7d176Sdrh }
326cce7d176Sdrh 
327cce7d176Sdrh #if 0 /* NOT USED */
328cce7d176Sdrh /*
329cce7d176Sdrh ** Compare a token against a string.  Return TRUE if they match.
330cce7d176Sdrh */
331cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){
332cce7d176Sdrh   int n = strlen(zStr);
333cce7d176Sdrh   if( n!=pToken->n ) return 0;
334cce7d176Sdrh   return sqliteStrNICmp(pToken->z, zStr, n)==0;
335cce7d176Sdrh }
336cce7d176Sdrh #endif
337cce7d176Sdrh 
338cce7d176Sdrh /*
339cce7d176Sdrh ** Convert a function name into its integer identifier.  Return the
340cce7d176Sdrh ** identifier.  Return FN_Unknown if the function name is unknown.
341cce7d176Sdrh */
342cce7d176Sdrh int sqliteFuncId(Token *pToken){
343cce7d176Sdrh   static const struct {
344cce7d176Sdrh      char *zName;
345cce7d176Sdrh      int len;
346cce7d176Sdrh      int id;
347cce7d176Sdrh   } aFunc[] = {
348cce7d176Sdrh      { "count",  5, FN_Count },
349cce7d176Sdrh      { "min",    3, FN_Min   },
350cce7d176Sdrh      { "max",    3, FN_Max   },
351cce7d176Sdrh      { "sum",    3, FN_Sum   },
3522282792aSdrh      { "avg",    3, FN_Avg   },
3530bdaf62eSdrh      { "fcnt",   4, FN_Fcnt  },  /* Used for testing only */
3546ec2733bSdrh      { "length", 6, FN_Length},
3556ec2733bSdrh      { "substr", 6, FN_Substr},
356cce7d176Sdrh   };
357cce7d176Sdrh   int i;
358cce7d176Sdrh   for(i=0; i<ArraySize(aFunc); i++){
359cce7d176Sdrh     if( aFunc[i].len==pToken->n
360cce7d176Sdrh      && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
361cce7d176Sdrh        return aFunc[i].id;
362cce7d176Sdrh     }
363cce7d176Sdrh   }
364cce7d176Sdrh   return FN_Unknown;
365cce7d176Sdrh }
366cce7d176Sdrh 
367cce7d176Sdrh /*
368cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
369cce7d176Sdrh ** function names are recognized and all functions have the correct
370cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
371cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
372cce7d176Sdrh **
373cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
374cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
375cce7d176Sdrh */
376cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
377cce7d176Sdrh   int nErr = 0;
378cce7d176Sdrh   if( pExpr==0 ) return 0;
379cce7d176Sdrh   switch( pExpr->op ){
380cce7d176Sdrh     case TK_FUNCTION: {
381cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
382cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
383cce7d176Sdrh       int no_such_func = 0;
384cce7d176Sdrh       int too_many_args = 0;
385cce7d176Sdrh       int too_few_args = 0;
386cce7d176Sdrh       int is_agg = 0;
387cce7d176Sdrh       int i;
388967e8b73Sdrh       pExpr->iColumn = id;
389cce7d176Sdrh       switch( id ){
390cce7d176Sdrh         case FN_Unknown: {
391cce7d176Sdrh           no_such_func = 1;
392cce7d176Sdrh           break;
393cce7d176Sdrh         }
394cce7d176Sdrh         case FN_Count: {
395cce7d176Sdrh           no_such_func = !allowAgg;
396cce7d176Sdrh           too_many_args = n>1;
397cce7d176Sdrh           is_agg = 1;
398cce7d176Sdrh           break;
399cce7d176Sdrh         }
400cce7d176Sdrh         case FN_Max:
401cce7d176Sdrh         case FN_Min: {
402cce7d176Sdrh           too_few_args = allowAgg ? n<1 : n<2;
403cce7d176Sdrh           is_agg = n==1;
404cce7d176Sdrh           break;
405cce7d176Sdrh         }
4062282792aSdrh         case FN_Avg:
407cce7d176Sdrh         case FN_Sum: {
408cce7d176Sdrh           no_such_func = !allowAgg;
409cce7d176Sdrh           too_many_args = n>1;
410cce7d176Sdrh           too_few_args = n<1;
411cce7d176Sdrh           is_agg = 1;
412cce7d176Sdrh           break;
413cce7d176Sdrh         }
4146ec2733bSdrh         case FN_Length: {
4156ec2733bSdrh           too_few_args = n<1;
4166ec2733bSdrh           too_many_args = n>1;
4176ec2733bSdrh           break;
4186ec2733bSdrh         }
4196ec2733bSdrh         case FN_Substr: {
4206ec2733bSdrh           too_few_args = n<3;
4216ec2733bSdrh           too_many_args = n>3;
4226ec2733bSdrh           break;
4236ec2733bSdrh         }
4240bdaf62eSdrh         /* The "fcnt(*)" function always returns the number of fetch
4250bdaf62eSdrh         ** operations that have occurred so far while processing the
4260bdaf62eSdrh         ** SQL statement.  This information can be used by test procedures
4270bdaf62eSdrh         ** to verify that indices are being used properly to minimize
4280bdaf62eSdrh         ** searching.  All arguments to fcnt() are ignored.  fcnt() has
4290bdaf62eSdrh         ** no use (other than testing) that we are aware of.
4300bdaf62eSdrh         */
4310bdaf62eSdrh         case FN_Fcnt: {
4320bdaf62eSdrh           n = 0;
4330bdaf62eSdrh           break;
4340bdaf62eSdrh         }
4356ec2733bSdrh 
436cce7d176Sdrh         default: break;
437cce7d176Sdrh       }
438cce7d176Sdrh       if( no_such_func ){
439cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
440cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
441cce7d176Sdrh         pParse->nErr++;
442cce7d176Sdrh         nErr++;
443cce7d176Sdrh       }else if( too_many_args ){
444cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
445cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
446cce7d176Sdrh         pParse->nErr++;
447cce7d176Sdrh         nErr++;
448cce7d176Sdrh       }else if( too_few_args ){
449cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
450cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
451cce7d176Sdrh         pParse->nErr++;
452cce7d176Sdrh         nErr++;
453cce7d176Sdrh       }
4542282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
455cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
456cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
4574cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
4584cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
459cce7d176Sdrh       }
460cce7d176Sdrh     }
461cce7d176Sdrh     default: {
462cce7d176Sdrh       if( pExpr->pLeft ){
4632282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
464cce7d176Sdrh       }
465cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
4662282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
467cce7d176Sdrh       }
468fef5208cSdrh       if( nErr==0 && pExpr->pList ){
469fef5208cSdrh         int n = pExpr->pList->nExpr;
470fef5208cSdrh         int i;
471fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
4722282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
4732282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
474fef5208cSdrh         }
475fef5208cSdrh       }
476cce7d176Sdrh       break;
477cce7d176Sdrh     }
478cce7d176Sdrh   }
479cce7d176Sdrh   return nErr;
480cce7d176Sdrh }
481cce7d176Sdrh 
482cce7d176Sdrh /*
483cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
4841ccde15dSdrh ** expression and leave the result on the top of stack.
485cce7d176Sdrh */
486cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
487cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
488cce7d176Sdrh   int op;
489*daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
490cce7d176Sdrh   switch( pExpr->op ){
491cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
492cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
493cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
494cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
495cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
496cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
497cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
498cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
499cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
500cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
501cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
502cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
503cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
504cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
505cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
506cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
507cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
508cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
509cce7d176Sdrh     default: break;
510cce7d176Sdrh   }
511cce7d176Sdrh   switch( pExpr->op ){
512967e8b73Sdrh     case TK_COLUMN: {
5132282792aSdrh       if( pParse->useAgg ){
5142282792aSdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
515c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
516967e8b73Sdrh         sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iColumn, 0, 0);
517c4a3c779Sdrh       }else{
518c4a3c779Sdrh         sqliteVdbeAddOp(v, OP_Key, pExpr->iTable, 0, 0, 0);
5192282792aSdrh       }
520cce7d176Sdrh       break;
521cce7d176Sdrh     }
522cce7d176Sdrh     case TK_INTEGER: {
523cce7d176Sdrh       int i = atoi(pExpr->token.z);
524cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
525cce7d176Sdrh       break;
526cce7d176Sdrh     }
527cce7d176Sdrh     case TK_FLOAT: {
528cce7d176Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
529cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
530cce7d176Sdrh       break;
531cce7d176Sdrh     }
532cce7d176Sdrh     case TK_STRING: {
533cce7d176Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
534cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
535cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
536cce7d176Sdrh       break;
537cce7d176Sdrh     }
538cce7d176Sdrh     case TK_NULL: {
539c61053b7Sdrh       sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
540cce7d176Sdrh       break;
541cce7d176Sdrh     }
542cce7d176Sdrh     case TK_AND:
543cce7d176Sdrh     case TK_OR:
544cce7d176Sdrh     case TK_PLUS:
545cce7d176Sdrh     case TK_STAR:
546cce7d176Sdrh     case TK_MINUS:
547cce7d176Sdrh     case TK_SLASH: {
548cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
549cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
550cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
551cce7d176Sdrh       break;
552cce7d176Sdrh     }
5530040077dSdrh     case TK_CONCAT: {
5540040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
5550040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
5560040077dSdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0, 0, 0);
5570040077dSdrh       break;
5580040077dSdrh     }
559cce7d176Sdrh     case TK_LT:
560cce7d176Sdrh     case TK_LE:
561cce7d176Sdrh     case TK_GT:
562cce7d176Sdrh     case TK_GE:
563cce7d176Sdrh     case TK_NE:
564cce7d176Sdrh     case TK_EQ:
565cce7d176Sdrh     case TK_LIKE:
566cce7d176Sdrh     case TK_GLOB: {
567cce7d176Sdrh       int dest;
568cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
569cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
570cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
571cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
572cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
573cce7d176Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
574cce7d176Sdrh       break;
575cce7d176Sdrh     }
576cce7d176Sdrh     case TK_UMINUS: {
5776e142f54Sdrh       assert( pExpr->pLeft );
5786e142f54Sdrh       if( pExpr->pLeft->op==TK_INTEGER ){
5796e142f54Sdrh         int i = atoi(pExpr->pLeft->token.z);
5806e142f54Sdrh         sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0);
5816e142f54Sdrh         break;
5826e142f54Sdrh       }else if( pExpr->pLeft->op==TK_FLOAT ){
5836e142f54Sdrh         Token *p = &pExpr->pLeft->token;
5846e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
5856e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
5866e142f54Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0);
5876e142f54Sdrh         sqliteFree(z);
5886e142f54Sdrh         break;
5896e142f54Sdrh       }
5901ccde15dSdrh       /* Fall through into TK_NOT */
5916e142f54Sdrh     }
5926e142f54Sdrh     case TK_NOT: {
593cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
594cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
595cce7d176Sdrh       break;
596cce7d176Sdrh     }
597cce7d176Sdrh     case TK_ISNULL:
598cce7d176Sdrh     case TK_NOTNULL: {
599cce7d176Sdrh       int dest;
6008be51133Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
601cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
602cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
603cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
6048be51133Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
605cce7d176Sdrh       break;
606cce7d176Sdrh     }
6072282792aSdrh     case TK_AGG_FUNCTION: {
6082282792aSdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
609967e8b73Sdrh       if( pExpr->iColumn==FN_Avg ){
6102282792aSdrh         assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
6112282792aSdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0);
6122282792aSdrh         sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0);
6132282792aSdrh       }
6142282792aSdrh       break;
6152282792aSdrh     }
616cce7d176Sdrh     case TK_FUNCTION: {
617967e8b73Sdrh       int id = pExpr->iColumn;
618cce7d176Sdrh       int op;
619cce7d176Sdrh       int i;
620cce7d176Sdrh       ExprList *pList = pExpr->pList;
6216ec2733bSdrh       switch( id ){
6226ec2733bSdrh         case FN_Fcnt: {
6230bdaf62eSdrh           sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0);
6240bdaf62eSdrh           break;
6250bdaf62eSdrh         }
6266ec2733bSdrh         case FN_Min:
6276ec2733bSdrh         case FN_Max: {
628cce7d176Sdrh           op = id==FN_Min ? OP_Min : OP_Max;
629cce7d176Sdrh           for(i=0; i<pList->nExpr; i++){
630cce7d176Sdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
631cce7d176Sdrh             if( i>0 ){
632cce7d176Sdrh               sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
633cce7d176Sdrh             }
634cce7d176Sdrh           }
635cce7d176Sdrh           break;
636cce7d176Sdrh         }
6376ec2733bSdrh         case FN_Length: {
6386ec2733bSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
6396ec2733bSdrh           sqliteVdbeAddOp(v, OP_Strlen, 0, 0, 0, 0);
6406ec2733bSdrh           break;
6416ec2733bSdrh         }
6426ec2733bSdrh         case FN_Substr: {
6436ec2733bSdrh           for(i=0; i<pList->nExpr; i++){
6446ec2733bSdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
6456ec2733bSdrh           }
6466ec2733bSdrh           sqliteVdbeAddOp(v, OP_Substr, 0, 0, 0, 0);
6476ec2733bSdrh           break;
6486ec2733bSdrh         }
6496ec2733bSdrh         default: {
6506ec2733bSdrh           /* Can't happen! */
6516ec2733bSdrh           break;
6526ec2733bSdrh         }
6536ec2733bSdrh       }
6546ec2733bSdrh       break;
6556ec2733bSdrh     }
65619a775c2Sdrh     case TK_SELECT: {
657967e8b73Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0, 0, 0);
65819a775c2Sdrh       break;
65919a775c2Sdrh     }
660fef5208cSdrh     case TK_IN: {
661fef5208cSdrh       int addr;
6624794b980Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
663fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
664fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
665fef5208cSdrh       if( pExpr->pSelect ){
666fef5208cSdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0);
667fef5208cSdrh       }else{
668fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0);
669fef5208cSdrh       }
6704794b980Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
671fef5208cSdrh       break;
672fef5208cSdrh     }
673fef5208cSdrh     case TK_BETWEEN: {
674fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
675fef5208cSdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
676fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
677fef5208cSdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0);
678fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
679fef5208cSdrh       break;
680fef5208cSdrh     }
681cce7d176Sdrh   }
682cce7d176Sdrh   return;
683cce7d176Sdrh }
684cce7d176Sdrh 
685cce7d176Sdrh /*
686cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
687cce7d176Sdrh ** to the label "dest" if the expression is true but execution
688cce7d176Sdrh ** continues straight thru if the expression is false.
689cce7d176Sdrh */
690cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
691cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
692cce7d176Sdrh   int op = 0;
693*daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
694cce7d176Sdrh   switch( pExpr->op ){
695cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
696cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
697cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
698cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
699cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
700cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
701cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
702cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
703cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
704cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
705cce7d176Sdrh     default:  break;
706cce7d176Sdrh   }
707cce7d176Sdrh   switch( pExpr->op ){
708cce7d176Sdrh     case TK_AND: {
709cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
710cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
711cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
712cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
713cce7d176Sdrh       break;
714cce7d176Sdrh     }
715cce7d176Sdrh     case TK_OR: {
716cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
717cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
718cce7d176Sdrh       break;
719cce7d176Sdrh     }
720cce7d176Sdrh     case TK_NOT: {
721cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
722cce7d176Sdrh       break;
723cce7d176Sdrh     }
724cce7d176Sdrh     case TK_LT:
725cce7d176Sdrh     case TK_LE:
726cce7d176Sdrh     case TK_GT:
727cce7d176Sdrh     case TK_GE:
728cce7d176Sdrh     case TK_NE:
729cce7d176Sdrh     case TK_EQ:
730cce7d176Sdrh     case TK_LIKE:
731cce7d176Sdrh     case TK_GLOB: {
732cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
733cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
734cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
735cce7d176Sdrh       break;
736cce7d176Sdrh     }
737cce7d176Sdrh     case TK_ISNULL:
738cce7d176Sdrh     case TK_NOTNULL: {
739cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
740cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
741cce7d176Sdrh       break;
742cce7d176Sdrh     }
743fef5208cSdrh     case TK_IN: {
744cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
745fef5208cSdrh       if( pExpr->pSelect ){
746fef5208cSdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0);
747fef5208cSdrh       }else{
748fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0);
749fef5208cSdrh       }
750fef5208cSdrh       break;
751fef5208cSdrh     }
752fef5208cSdrh     case TK_BETWEEN: {
753fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
754fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
755fef5208cSdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
756fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
757fef5208cSdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0);
758fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
759fef5208cSdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0);
760fef5208cSdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
761fef5208cSdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl);
762fef5208cSdrh       break;
763fef5208cSdrh     }
764cce7d176Sdrh     default: {
765cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
766cce7d176Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
767cce7d176Sdrh       break;
768cce7d176Sdrh     }
769cce7d176Sdrh   }
770cce7d176Sdrh }
771cce7d176Sdrh 
772cce7d176Sdrh /*
77366b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
774cce7d176Sdrh ** to the label "dest" if the expression is false but execution
775cce7d176Sdrh ** continues straight thru if the expression is true.
776cce7d176Sdrh */
777cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
778cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
779cce7d176Sdrh   int op = 0;
780*daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
781cce7d176Sdrh   switch( pExpr->op ){
782cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
783cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
784cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
785cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
786cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
787cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
788cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
789cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
790cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
791cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
792cce7d176Sdrh     default:  break;
793cce7d176Sdrh   }
794cce7d176Sdrh   switch( pExpr->op ){
795cce7d176Sdrh     case TK_AND: {
796cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
797cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
798cce7d176Sdrh       break;
799cce7d176Sdrh     }
800cce7d176Sdrh     case TK_OR: {
801cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
802cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
803cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
804cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
805cce7d176Sdrh       break;
806cce7d176Sdrh     }
807cce7d176Sdrh     case TK_NOT: {
808cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
809cce7d176Sdrh       break;
810cce7d176Sdrh     }
811cce7d176Sdrh     case TK_LT:
812cce7d176Sdrh     case TK_LE:
813cce7d176Sdrh     case TK_GT:
814cce7d176Sdrh     case TK_GE:
815cce7d176Sdrh     case TK_NE:
816cce7d176Sdrh     case TK_EQ: {
817cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
818cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
819cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
820cce7d176Sdrh       break;
821cce7d176Sdrh     }
822cce7d176Sdrh     case TK_LIKE:
823cce7d176Sdrh     case TK_GLOB: {
824cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
825cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
826cce7d176Sdrh       sqliteVdbeAddOp(v, op, 1, dest, 0, 0);
827cce7d176Sdrh       break;
828cce7d176Sdrh     }
829cce7d176Sdrh     case TK_ISNULL:
830cce7d176Sdrh     case TK_NOTNULL: {
831cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
832cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
833cce7d176Sdrh       break;
834cce7d176Sdrh     }
835fef5208cSdrh     case TK_IN: {
836cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
837fef5208cSdrh       if( pExpr->pSelect ){
838fef5208cSdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0);
839fef5208cSdrh       }else{
840fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0);
841fef5208cSdrh       }
842fef5208cSdrh       break;
843fef5208cSdrh     }
844fef5208cSdrh     case TK_BETWEEN: {
845fef5208cSdrh       int addr;
846fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
847fef5208cSdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
848fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
849fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
850fef5208cSdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0);
851fef5208cSdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0);
852fef5208cSdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0);
853fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
854fef5208cSdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0);
855fef5208cSdrh       break;
856fef5208cSdrh     }
857cce7d176Sdrh     default: {
858cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
859cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0);
860cce7d176Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
861cce7d176Sdrh       break;
862cce7d176Sdrh     }
863cce7d176Sdrh   }
864cce7d176Sdrh }
8652282792aSdrh 
8662282792aSdrh /*
8672282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
8682282792aSdrh ** if they are identical and return FALSE if they differ in any way.
8692282792aSdrh */
870d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
8712282792aSdrh   int i;
8722282792aSdrh   if( pA==0 ){
8732282792aSdrh     return pB==0;
8742282792aSdrh   }else if( pB==0 ){
8752282792aSdrh     return 0;
8762282792aSdrh   }
8772282792aSdrh   if( pA->op!=pB->op ) return 0;
878d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
879d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
8802282792aSdrh   if( pA->pList ){
8812282792aSdrh     if( pB->pList==0 ) return 0;
8822282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
8832282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
884d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
8852282792aSdrh         return 0;
8862282792aSdrh       }
8872282792aSdrh     }
8882282792aSdrh   }else if( pB->pList ){
8892282792aSdrh     return 0;
8902282792aSdrh   }
8912282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
8922282792aSdrh   if( pA->token.z ){
8932282792aSdrh     if( pB->token.z==0 ) return 0;
8942282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
8952282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
8962282792aSdrh   }
8972282792aSdrh   return 1;
8982282792aSdrh }
8992282792aSdrh 
9002282792aSdrh /*
9012282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
9022282792aSdrh */
9032282792aSdrh static int appendAggInfo(Parse *pParse){
9042282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
9052282792aSdrh     int amt = pParse->nAgg + 8;
9062282792aSdrh     pParse->aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
9072282792aSdrh     if( pParse->aAgg==0 ){
908*daffd0e5Sdrh       pParse->nAgg = 0;
9092282792aSdrh       return -1;
9102282792aSdrh     }
9112282792aSdrh   }
9122282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
9132282792aSdrh   return pParse->nAgg++;
9142282792aSdrh }
9152282792aSdrh 
9162282792aSdrh /*
9172282792aSdrh ** Analyze the given expression looking for aggregate functions and
9182282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
9192282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
9202282792aSdrh **
9212282792aSdrh ** This routine should only be called after the expression has been
9222282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
9232282792aSdrh **
9242282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
9252282792aSdrh ** the number of errors.
9262282792aSdrh */
9272282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
9282282792aSdrh   int i;
9292282792aSdrh   AggExpr *aAgg;
9302282792aSdrh   int nErr = 0;
9312282792aSdrh 
9322282792aSdrh   if( pExpr==0 ) return 0;
9332282792aSdrh   switch( pExpr->op ){
934967e8b73Sdrh     case TK_COLUMN: {
9352282792aSdrh       aAgg = pParse->aAgg;
9362282792aSdrh       for(i=0; i<pParse->nAgg; i++){
9372282792aSdrh         if( aAgg[i].isAgg ) continue;
9382282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
939967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
9402282792aSdrh           break;
9412282792aSdrh         }
9422282792aSdrh       }
9432282792aSdrh       if( i>=pParse->nAgg ){
9442282792aSdrh         i = appendAggInfo(pParse);
9452282792aSdrh         if( i<0 ) return 1;
9462282792aSdrh         pParse->aAgg[i].isAgg = 0;
9472282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
9482282792aSdrh       }
949aaf88729Sdrh       pExpr->iAgg = i;
9502282792aSdrh       break;
9512282792aSdrh     }
9522282792aSdrh     case TK_AGG_FUNCTION: {
953967e8b73Sdrh       if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
9542282792aSdrh         if( pParse->iAggCount>=0 ){
9552282792aSdrh           i = pParse->iAggCount;
9562282792aSdrh         }else{
9572282792aSdrh           i = appendAggInfo(pParse);
9582282792aSdrh           if( i<0 ) return 1;
9592282792aSdrh           pParse->aAgg[i].isAgg = 1;
9602282792aSdrh           pParse->aAgg[i].pExpr = 0;
9612282792aSdrh           pParse->iAggCount = i;
9622282792aSdrh         }
963967e8b73Sdrh         if( pExpr->iColumn==FN_Count ){
9642282792aSdrh           pExpr->iAgg = i;
9652282792aSdrh           break;
9662282792aSdrh         }
9672282792aSdrh       }
9682282792aSdrh       aAgg = pParse->aAgg;
9692282792aSdrh       for(i=0; i<pParse->nAgg; i++){
9702282792aSdrh         if( !aAgg[i].isAgg ) continue;
971d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
9722282792aSdrh           break;
9732282792aSdrh         }
9742282792aSdrh       }
9752282792aSdrh       if( i>=pParse->nAgg ){
9762282792aSdrh         i = appendAggInfo(pParse);
9772282792aSdrh         if( i<0 ) return 1;
9782282792aSdrh         pParse->aAgg[i].isAgg = 1;
9792282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
9802282792aSdrh       }
9812282792aSdrh       pExpr->iAgg = i;
9822282792aSdrh       break;
9832282792aSdrh     }
9842282792aSdrh     default: {
9852282792aSdrh       if( pExpr->pLeft ){
9862282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
9872282792aSdrh       }
9882282792aSdrh       if( nErr==0 && pExpr->pRight ){
9892282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
9902282792aSdrh       }
9912282792aSdrh       if( nErr==0 && pExpr->pList ){
9922282792aSdrh         int n = pExpr->pList->nExpr;
9932282792aSdrh         int i;
9942282792aSdrh         for(i=0; nErr==0 && i<n; i++){
9952282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
9962282792aSdrh         }
9972282792aSdrh       }
9982282792aSdrh       break;
9992282792aSdrh     }
10002282792aSdrh   }
10012282792aSdrh   return nErr;
10022282792aSdrh }
1003