xref: /sqlite-3.40.0/src/expr.c (revision aacc543e)
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*aacc543eSdrh ** $Id: expr.c,v 1.37 2002/01/06 17:07:40 drh Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
18cce7d176Sdrh 
19cce7d176Sdrh /*
20fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
21fef5208cSdrh ** and 0 if it involves variables.
22fef5208cSdrh */
23fef5208cSdrh static int isConstant(Expr *p){
24fef5208cSdrh   switch( p->op ){
25fef5208cSdrh     case TK_ID:
26967e8b73Sdrh     case TK_COLUMN:
27fef5208cSdrh     case TK_DOT:
28fef5208cSdrh       return 0;
29fef5208cSdrh     default: {
30fef5208cSdrh       if( p->pLeft && !isConstant(p->pLeft) ) return 0;
31fef5208cSdrh       if( p->pRight && !isConstant(p->pRight) ) return 0;
32fef5208cSdrh       if( p->pList ){
33fef5208cSdrh         int i;
34fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
35fef5208cSdrh           if( !isConstant(p->pList->a[i].pExpr) ) return 0;
36fef5208cSdrh         }
37fef5208cSdrh       }
38fef5208cSdrh       break;
39fef5208cSdrh     }
40fef5208cSdrh   }
41fef5208cSdrh   return 1;
42fef5208cSdrh }
43fef5208cSdrh 
44fef5208cSdrh /*
454794b980Sdrh ** Walk the expression tree and process operators of the form:
464794b980Sdrh **
474794b980Sdrh **       expr IN (SELECT ...)
484794b980Sdrh **
49967e8b73Sdrh ** These operators have to be processed before column names are
504794b980Sdrh ** resolved because each such operator increments pParse->nTab
511ccde15dSdrh ** to reserve cursor numbers for its own use.  But pParse->nTab
52*aacc543eSdrh ** needs to be constant once we begin resolving column names.  For
53*aacc543eSdrh ** that reason, this procedure needs to be called on every expression
54*aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression.
554794b980Sdrh **
564794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this
574794b980Sdrh ** routine.  This routine allocates a cursor number to the IN-SELECT
584794b980Sdrh ** and then moves on.  The code generation is done by
594794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards.
604794b980Sdrh */
614794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
624794b980Sdrh   if( pExpr==0 ) return;
634794b980Sdrh   if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
644794b980Sdrh     pExpr->iTable = pParse->nTab++;
654794b980Sdrh   }else{
664794b980Sdrh     if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
674794b980Sdrh     if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
684794b980Sdrh     if( pExpr->pList ){
694794b980Sdrh       int i;
704794b980Sdrh       ExprList *pList = pExpr->pList;
714794b980Sdrh       for(i=0; i<pList->nExpr; i++){
724794b980Sdrh         sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
734794b980Sdrh       }
744794b980Sdrh     }
754794b980Sdrh   }
764794b980Sdrh }
774794b980Sdrh 
784794b980Sdrh /*
79c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
80c4a3c779Sdrh */
81c4a3c779Sdrh static int sqliteIsRowid(const char *z){
82c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
83c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
84c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
85c4a3c779Sdrh   return 0;
86c4a3c779Sdrh }
87c4a3c779Sdrh 
88c4a3c779Sdrh /*
89cce7d176Sdrh ** This routine walks an expression tree and resolves references to
90967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
91*aacc543eSdrh ** index to the table in the table list and a column offset.  The
92*aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
93*aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
94*aacc543eSdrh ** plus the pParse->nTab value.  This value will ultimately become the
95*aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
96*aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
97*aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
98*aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
99*aacc543eSdrh ** alias for ROWID.
10019a775c2Sdrh **
101fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
102fef5208cSdrh ** forms:
103fef5208cSdrh **
104fef5208cSdrh **           expr IN (exprlist)
105fef5208cSdrh ** and
106fef5208cSdrh **           expr IN (SELECT ...)
107fef5208cSdrh **
108fef5208cSdrh ** The first form is handled by creating a set holding the list
109fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
110fef5208cSdrh ** a temporary table.
111fef5208cSdrh **
112fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
11319a775c2Sdrh ** If it finds any, it generates code to write the value of that select
11419a775c2Sdrh ** into a memory cell.
115cce7d176Sdrh **
116967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
117cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
118cce7d176Sdrh */
119cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
120daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
121cce7d176Sdrh   switch( pExpr->op ){
122cce7d176Sdrh     /* A lone identifier */
123cce7d176Sdrh     case TK_ID: {
124cce7d176Sdrh       int cnt = 0;      /* Number of matches */
125cce7d176Sdrh       int i;            /* Loop counter */
1266e142f54Sdrh       char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
127daffd0e5Sdrh       if( z==0 ) return 1;
128cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
129cce7d176Sdrh         int j;
130cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
131cce7d176Sdrh         if( pTab==0 ) continue;
132cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
1337020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
134cce7d176Sdrh             cnt++;
13519a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
1364a32431cSdrh             if( j==pTab->iPKey ){
1374a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
1384a32431cSdrh               pExpr->iColumn = -1;
1394a32431cSdrh             }else{
140967e8b73Sdrh               pExpr->iColumn = j;
141cce7d176Sdrh             }
142cce7d176Sdrh           }
143cce7d176Sdrh         }
1444a32431cSdrh       }
145c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
146c4a3c779Sdrh         pExpr->iColumn = -1;
147c4a3c779Sdrh         pExpr->iTable = pParse->nTab;
148c4a3c779Sdrh         cnt = 1 + (pTabList->nId>1);
149c4a3c779Sdrh       }
150cce7d176Sdrh       sqliteFree(z);
151cce7d176Sdrh       if( cnt==0 ){
152967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
153cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
154cce7d176Sdrh         pParse->nErr++;
155cce7d176Sdrh         return 1;
156cce7d176Sdrh       }else if( cnt>1 ){
157967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
158cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
159cce7d176Sdrh         pParse->nErr++;
160cce7d176Sdrh         return 1;
161cce7d176Sdrh       }
162967e8b73Sdrh       pExpr->op = TK_COLUMN;
163cce7d176Sdrh       break;
164cce7d176Sdrh     }
165cce7d176Sdrh 
166967e8b73Sdrh     /* A table name and column name:  ID.ID */
167cce7d176Sdrh     case TK_DOT: {
168cce7d176Sdrh       int cnt = 0;             /* Number of matches */
169c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
170cce7d176Sdrh       int i;                   /* Loop counter */
171cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
172cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
173cce7d176Sdrh 
174cce7d176Sdrh       pLeft = pExpr->pLeft;
175cce7d176Sdrh       pRight = pExpr->pRight;
176cce7d176Sdrh       assert( pLeft && pLeft->op==TK_ID );
177cce7d176Sdrh       assert( pRight && pRight->op==TK_ID );
1786e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
1796e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
180daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
181daffd0e5Sdrh         sqliteFree(zLeft);
182daffd0e5Sdrh         sqliteFree(zRight);
183daffd0e5Sdrh         return 1;
184daffd0e5Sdrh       }
18587c40e88Sdrh       sqliteDequote(zLeft);
18687c40e88Sdrh       sqliteDequote(zRight);
187c4a3c779Sdrh       pExpr->iTable = -1;
188cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
189cce7d176Sdrh         int j;
190cce7d176Sdrh         char *zTab;
191cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
192cce7d176Sdrh         if( pTab==0 ) continue;
193cce7d176Sdrh         if( pTabList->a[i].zAlias ){
194cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
195cce7d176Sdrh         }else{
196cce7d176Sdrh           zTab = pTab->zName;
197cce7d176Sdrh         }
198cce7d176Sdrh         if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
199c4a3c779Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
200cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
2017020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
202cce7d176Sdrh             cnt++;
20319a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
2044a32431cSdrh             if( j==pTab->iPKey ){
2054a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
2064a32431cSdrh               pExpr->iColumn = -1;
2074a32431cSdrh             }else{
208967e8b73Sdrh               pExpr->iColumn = j;
209cce7d176Sdrh             }
210cce7d176Sdrh           }
211cce7d176Sdrh         }
2124a32431cSdrh       }
213c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
214c4a3c779Sdrh         cnt = 1;
215c4a3c779Sdrh         pExpr->iColumn = -1;
216c4a3c779Sdrh       }
217cce7d176Sdrh       sqliteFree(zLeft);
218cce7d176Sdrh       sqliteFree(zRight);
219cce7d176Sdrh       if( cnt==0 ){
220967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
221cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
222cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
223cce7d176Sdrh         pParse->nErr++;
224cce7d176Sdrh         return 1;
225cce7d176Sdrh       }else if( cnt>1 ){
226967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
227cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
228cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
229cce7d176Sdrh         pParse->nErr++;
230cce7d176Sdrh         return 1;
231cce7d176Sdrh       }
232cce7d176Sdrh       sqliteExprDelete(pLeft);
233cce7d176Sdrh       pExpr->pLeft = 0;
234cce7d176Sdrh       sqliteExprDelete(pRight);
235cce7d176Sdrh       pExpr->pRight = 0;
236967e8b73Sdrh       pExpr->op = TK_COLUMN;
237cce7d176Sdrh       break;
238cce7d176Sdrh     }
239cce7d176Sdrh 
240fef5208cSdrh     case TK_IN: {
241d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
242fef5208cSdrh       if( v==0 ) return 1;
243cfab11bcSdrh       if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
244cfab11bcSdrh         return 1;
245cfab11bcSdrh       }
246fef5208cSdrh       if( pExpr->pSelect ){
247fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
248fef5208cSdrh         **
249fef5208cSdrh         ** Generate code to write the results of the select into a temporary
2504794b980Sdrh         ** table.  The cursor number of the temporary table has already
2514794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
252fef5208cSdrh         */
253c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
254fef5208cSdrh         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
255fef5208cSdrh       }else if( pExpr->pList ){
256fef5208cSdrh         /* Case 2:     expr IN (exprlist)
257fef5208cSdrh         **
258fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
259fef5208cSdrh         ** in iTable.
260fef5208cSdrh         */
261fef5208cSdrh         int i, iSet;
262fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
263fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
264fef5208cSdrh           if( !isConstant(pE2) ){
265fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
266fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
267fef5208cSdrh             pParse->nErr++;
268fef5208cSdrh             return 1;
269fef5208cSdrh           }
2704794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
2714794b980Sdrh             return 1;
2724794b980Sdrh           }
273fef5208cSdrh         }
274fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
275fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
276fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
277fef5208cSdrh           switch( pE2->op ){
278fef5208cSdrh             case TK_FLOAT:
279fef5208cSdrh             case TK_INTEGER:
280fef5208cSdrh             case TK_STRING: {
28199fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
282fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
283fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
284fef5208cSdrh               break;
285fef5208cSdrh             }
286fef5208cSdrh             default: {
287fef5208cSdrh               sqliteExprCode(pParse, pE2);
28899fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
289fef5208cSdrh               break;
290fef5208cSdrh             }
291fef5208cSdrh           }
292fef5208cSdrh         }
293fef5208cSdrh       }
294cfab11bcSdrh       break;
295fef5208cSdrh     }
296fef5208cSdrh 
29719a775c2Sdrh     case TK_SELECT: {
298fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
299fef5208cSdrh       ** value of this select in a memory cell and record the number
300967e8b73Sdrh       ** of the memory cell in iColumn.
301fef5208cSdrh       */
302967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
303967e8b73Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
30419a775c2Sdrh         return 1;
30519a775c2Sdrh       }
30619a775c2Sdrh       break;
30719a775c2Sdrh     }
30819a775c2Sdrh 
309cce7d176Sdrh     /* For all else, just recursively walk the tree */
310cce7d176Sdrh     default: {
311cce7d176Sdrh       if( pExpr->pLeft
312cce7d176Sdrh       && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
313cce7d176Sdrh         return 1;
314cce7d176Sdrh       }
315cce7d176Sdrh       if( pExpr->pRight
316cce7d176Sdrh       && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){
317cce7d176Sdrh         return 1;
318cce7d176Sdrh       }
319cce7d176Sdrh       if( pExpr->pList ){
320cce7d176Sdrh         int i;
321cce7d176Sdrh         ExprList *pList = pExpr->pList;
322cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
323cce7d176Sdrh           if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){
324cce7d176Sdrh             return 1;
325cce7d176Sdrh           }
326cce7d176Sdrh         }
327cce7d176Sdrh       }
328cce7d176Sdrh     }
329cce7d176Sdrh   }
330cce7d176Sdrh   return 0;
331cce7d176Sdrh }
332cce7d176Sdrh 
333cce7d176Sdrh #if 0 /* NOT USED */
334cce7d176Sdrh /*
335cce7d176Sdrh ** Compare a token against a string.  Return TRUE if they match.
336cce7d176Sdrh */
337cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){
338cce7d176Sdrh   int n = strlen(zStr);
339cce7d176Sdrh   if( n!=pToken->n ) return 0;
340cce7d176Sdrh   return sqliteStrNICmp(pToken->z, zStr, n)==0;
341cce7d176Sdrh }
342cce7d176Sdrh #endif
343cce7d176Sdrh 
344cce7d176Sdrh /*
345cce7d176Sdrh ** Convert a function name into its integer identifier.  Return the
346cce7d176Sdrh ** identifier.  Return FN_Unknown if the function name is unknown.
347cce7d176Sdrh */
348cce7d176Sdrh int sqliteFuncId(Token *pToken){
349cce7d176Sdrh   static const struct {
350cce7d176Sdrh      char *zName;
351cce7d176Sdrh      int len;
352cce7d176Sdrh      int id;
353cce7d176Sdrh   } aFunc[] = {
354cce7d176Sdrh      { "count",  5, FN_Count  },
355cce7d176Sdrh      { "min",    3, FN_Min    },
356cce7d176Sdrh      { "max",    3, FN_Max    },
357cce7d176Sdrh      { "sum",    3, FN_Sum    },
3582282792aSdrh      { "avg",    3, FN_Avg    },
3596ec2733bSdrh      { "length", 6, FN_Length },
3606ec2733bSdrh      { "substr", 6, FN_Substr },
361bf4133cbSdrh      { "abs",    3, FN_Abs    },
362bf4133cbSdrh      { "round",  5, FN_Round  },
363cce7d176Sdrh   };
364cce7d176Sdrh   int i;
365cce7d176Sdrh   for(i=0; i<ArraySize(aFunc); i++){
366cce7d176Sdrh     if( aFunc[i].len==pToken->n
367cce7d176Sdrh      && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
368cce7d176Sdrh        return aFunc[i].id;
369cce7d176Sdrh     }
370cce7d176Sdrh   }
371cce7d176Sdrh   return FN_Unknown;
372cce7d176Sdrh }
373cce7d176Sdrh 
374cce7d176Sdrh /*
375cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
376cce7d176Sdrh ** function names are recognized and all functions have the correct
377cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
378cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
379cce7d176Sdrh **
380cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
381cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
382cce7d176Sdrh */
383cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
384cce7d176Sdrh   int nErr = 0;
385cce7d176Sdrh   if( pExpr==0 ) return 0;
386cce7d176Sdrh   switch( pExpr->op ){
387cce7d176Sdrh     case TK_FUNCTION: {
388cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
389cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
390cce7d176Sdrh       int no_such_func = 0;
391cce7d176Sdrh       int too_many_args = 0;
392cce7d176Sdrh       int too_few_args = 0;
393cce7d176Sdrh       int is_agg = 0;
394cce7d176Sdrh       int i;
395967e8b73Sdrh       pExpr->iColumn = id;
396cce7d176Sdrh       switch( id ){
397cce7d176Sdrh         case FN_Unknown: {
398cce7d176Sdrh           no_such_func = 1;
399cce7d176Sdrh           break;
400cce7d176Sdrh         }
401cce7d176Sdrh         case FN_Count: {
402cce7d176Sdrh           no_such_func = !allowAgg;
403cce7d176Sdrh           too_many_args = n>1;
404cce7d176Sdrh           is_agg = 1;
405cce7d176Sdrh           break;
406cce7d176Sdrh         }
407cce7d176Sdrh         case FN_Max:
408cce7d176Sdrh         case FN_Min: {
409cce7d176Sdrh           too_few_args = allowAgg ? n<1 : n<2;
410cce7d176Sdrh           is_agg = n==1;
411cce7d176Sdrh           break;
412cce7d176Sdrh         }
4132282792aSdrh         case FN_Avg:
414cce7d176Sdrh         case FN_Sum: {
415cce7d176Sdrh           no_such_func = !allowAgg;
416cce7d176Sdrh           too_many_args = n>1;
417cce7d176Sdrh           too_few_args = n<1;
418cce7d176Sdrh           is_agg = 1;
419cce7d176Sdrh           break;
420cce7d176Sdrh         }
421bf4133cbSdrh         case FN_Abs:
4226ec2733bSdrh         case FN_Length: {
4236ec2733bSdrh           too_few_args = n<1;
4246ec2733bSdrh           too_many_args = n>1;
4256ec2733bSdrh           break;
4266ec2733bSdrh         }
427bf4133cbSdrh         case FN_Round: {
428bf4133cbSdrh           too_few_args = n<1;
429bf4133cbSdrh           too_many_args = n>2;
430bf4133cbSdrh           break;
431bf4133cbSdrh         }
4326ec2733bSdrh         case FN_Substr: {
4336ec2733bSdrh           too_few_args = n<3;
4346ec2733bSdrh           too_many_args = n>3;
4356ec2733bSdrh           break;
4366ec2733bSdrh         }
437cce7d176Sdrh         default: break;
438cce7d176Sdrh       }
439cce7d176Sdrh       if( no_such_func ){
440cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
441cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
442cce7d176Sdrh         pParse->nErr++;
443cce7d176Sdrh         nErr++;
444cce7d176Sdrh       }else if( too_many_args ){
445cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
446cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
447cce7d176Sdrh         pParse->nErr++;
448cce7d176Sdrh         nErr++;
449cce7d176Sdrh       }else if( too_few_args ){
450cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
451cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
452cce7d176Sdrh         pParse->nErr++;
453cce7d176Sdrh         nErr++;
454cce7d176Sdrh       }
4552282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
456cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
457cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
4584cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
4594cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
460cce7d176Sdrh       }
461cce7d176Sdrh     }
462cce7d176Sdrh     default: {
463cce7d176Sdrh       if( pExpr->pLeft ){
4642282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
465cce7d176Sdrh       }
466cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
4672282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
468cce7d176Sdrh       }
469fef5208cSdrh       if( nErr==0 && pExpr->pList ){
470fef5208cSdrh         int n = pExpr->pList->nExpr;
471fef5208cSdrh         int i;
472fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
4732282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
4742282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
475fef5208cSdrh         }
476fef5208cSdrh       }
477cce7d176Sdrh       break;
478cce7d176Sdrh     }
479cce7d176Sdrh   }
480cce7d176Sdrh   return nErr;
481cce7d176Sdrh }
482cce7d176Sdrh 
483cce7d176Sdrh /*
484cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
4851ccde15dSdrh ** expression and leave the result on the top of stack.
486cce7d176Sdrh */
487cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
488cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
489cce7d176Sdrh   int op;
490daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
491cce7d176Sdrh   switch( pExpr->op ){
492cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
493cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
494cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
495cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
496cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
497cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
498cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
499cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
500cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
501cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
502cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
503cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
504cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
505cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
506cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
507cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
508cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
509cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
510bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
511bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
512bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
513bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
514bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
515bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
516cce7d176Sdrh     default: break;
517cce7d176Sdrh   }
518cce7d176Sdrh   switch( pExpr->op ){
519967e8b73Sdrh     case TK_COLUMN: {
5202282792aSdrh       if( pParse->useAgg ){
52199fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
522c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
52399fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
524c4a3c779Sdrh       }else{
52599fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
5262282792aSdrh       }
527cce7d176Sdrh       break;
528cce7d176Sdrh     }
529cce7d176Sdrh     case TK_INTEGER: {
5307a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
5317a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
532cce7d176Sdrh       break;
533cce7d176Sdrh     }
534cce7d176Sdrh     case TK_FLOAT: {
53599fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
536cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
537cce7d176Sdrh       break;
538cce7d176Sdrh     }
539cce7d176Sdrh     case TK_STRING: {
54099fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
541cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
542cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
543cce7d176Sdrh       break;
544cce7d176Sdrh     }
545cce7d176Sdrh     case TK_NULL: {
54699fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
547cce7d176Sdrh       break;
548cce7d176Sdrh     }
549cce7d176Sdrh     case TK_AND:
550cce7d176Sdrh     case TK_OR:
551cce7d176Sdrh     case TK_PLUS:
552cce7d176Sdrh     case TK_STAR:
553cce7d176Sdrh     case TK_MINUS:
554bf4133cbSdrh     case TK_REM:
555bf4133cbSdrh     case TK_BITAND:
556bf4133cbSdrh     case TK_BITOR:
557cce7d176Sdrh     case TK_SLASH: {
558cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
559cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
56099fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
561cce7d176Sdrh       break;
562cce7d176Sdrh     }
563bf4133cbSdrh     case TK_LSHIFT:
564bf4133cbSdrh     case TK_RSHIFT: {
565bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
566bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
567bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
568bf4133cbSdrh       break;
569bf4133cbSdrh     }
5700040077dSdrh     case TK_CONCAT: {
5710040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
5720040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
57399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
5740040077dSdrh       break;
5750040077dSdrh     }
576cce7d176Sdrh     case TK_LT:
577cce7d176Sdrh     case TK_LE:
578cce7d176Sdrh     case TK_GT:
579cce7d176Sdrh     case TK_GE:
580cce7d176Sdrh     case TK_NE:
581cce7d176Sdrh     case TK_EQ:
582cce7d176Sdrh     case TK_LIKE:
583cce7d176Sdrh     case TK_GLOB: {
584cce7d176Sdrh       int dest;
58599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
586cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
587cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
588cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
58999fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
59099fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
591cce7d176Sdrh       break;
592cce7d176Sdrh     }
593cce7d176Sdrh     case TK_UMINUS: {
5946e142f54Sdrh       assert( pExpr->pLeft );
5957a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
5966e142f54Sdrh         Token *p = &pExpr->pLeft->token;
5976e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
5986e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
59999fcd718Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
60099fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
6016e142f54Sdrh         sqliteFree(z);
6026e142f54Sdrh         break;
6036e142f54Sdrh       }
6041ccde15dSdrh       /* Fall through into TK_NOT */
6056e142f54Sdrh     }
606bf4133cbSdrh     case TK_BITNOT:
6076e142f54Sdrh     case TK_NOT: {
608cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
60999fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
610cce7d176Sdrh       break;
611cce7d176Sdrh     }
612cce7d176Sdrh     case TK_ISNULL:
613cce7d176Sdrh     case TK_NOTNULL: {
614cce7d176Sdrh       int dest;
61599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
616cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
617cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
61899fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
61999fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
620cce7d176Sdrh       break;
621cce7d176Sdrh     }
6222282792aSdrh     case TK_AGG_FUNCTION: {
62399fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
624967e8b73Sdrh       if( pExpr->iColumn==FN_Avg ){
6252282792aSdrh         assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
62699fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
62799fcd718Sdrh         sqliteVdbeAddOp(v, OP_Divide, 0, 0);
6282282792aSdrh       }
6292282792aSdrh       break;
6302282792aSdrh     }
631cce7d176Sdrh     case TK_FUNCTION: {
632967e8b73Sdrh       int id = pExpr->iColumn;
633cce7d176Sdrh       int op;
634cce7d176Sdrh       int i;
635cce7d176Sdrh       ExprList *pList = pExpr->pList;
6366ec2733bSdrh       switch( id ){
6376ec2733bSdrh         case FN_Min:
6386ec2733bSdrh         case FN_Max: {
639cce7d176Sdrh           op = id==FN_Min ? OP_Min : OP_Max;
640cce7d176Sdrh           for(i=0; i<pList->nExpr; i++){
641cce7d176Sdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
642cce7d176Sdrh             if( i>0 ){
64399fcd718Sdrh               sqliteVdbeAddOp(v, op, 0, 0);
644cce7d176Sdrh             }
645cce7d176Sdrh           }
646cce7d176Sdrh           break;
647cce7d176Sdrh         }
648bf4133cbSdrh         case FN_Abs: {
649bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
650bf4133cbSdrh           sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
651bf4133cbSdrh           break;
652bf4133cbSdrh         }
653bf4133cbSdrh         case FN_Round: {
654bf4133cbSdrh           if( pList->nExpr==2 ){
655bf4133cbSdrh             sqliteExprCode(pParse, pList->a[1].pExpr);
656bf4133cbSdrh           }else{
657bf4133cbSdrh             sqliteVdbeAddOp(v, OP_Integer, 0, 0);
658bf4133cbSdrh           }
659bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
660bf4133cbSdrh           sqliteVdbeAddOp(v, OP_Precision, 0, 0);
661bf4133cbSdrh           break;
662bf4133cbSdrh         }
6636ec2733bSdrh         case FN_Length: {
6646ec2733bSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
66599fcd718Sdrh           sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
6666ec2733bSdrh           break;
6676ec2733bSdrh         }
6686ec2733bSdrh         case FN_Substr: {
6696ec2733bSdrh           for(i=0; i<pList->nExpr; i++){
6706ec2733bSdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
6716ec2733bSdrh           }
67299fcd718Sdrh           sqliteVdbeAddOp(v, OP_Substr, 0, 0);
6736ec2733bSdrh           break;
6746ec2733bSdrh         }
6756ec2733bSdrh         default: {
6766ec2733bSdrh           /* Can't happen! */
6776ec2733bSdrh           break;
6786ec2733bSdrh         }
6796ec2733bSdrh       }
6806ec2733bSdrh       break;
6816ec2733bSdrh     }
68219a775c2Sdrh     case TK_SELECT: {
68399fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
68419a775c2Sdrh       break;
68519a775c2Sdrh     }
686fef5208cSdrh     case TK_IN: {
687fef5208cSdrh       int addr;
68899fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
689fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
690fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
691fef5208cSdrh       if( pExpr->pSelect ){
69299fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
693fef5208cSdrh       }else{
69499fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
695fef5208cSdrh       }
69699fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
697fef5208cSdrh       break;
698fef5208cSdrh     }
699fef5208cSdrh     case TK_BETWEEN: {
700fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
70199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
702fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
70399fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
704fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
705fef5208cSdrh       break;
706fef5208cSdrh     }
707cce7d176Sdrh   }
708cce7d176Sdrh   return;
709cce7d176Sdrh }
710cce7d176Sdrh 
711cce7d176Sdrh /*
712cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
713cce7d176Sdrh ** to the label "dest" if the expression is true but execution
714cce7d176Sdrh ** continues straight thru if the expression is false.
715cce7d176Sdrh */
716cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
717cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
718cce7d176Sdrh   int op = 0;
719daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
720cce7d176Sdrh   switch( pExpr->op ){
721cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
722cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
723cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
724cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
725cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
726cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
727cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
728cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
729cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
730cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
731cce7d176Sdrh     default:  break;
732cce7d176Sdrh   }
733cce7d176Sdrh   switch( pExpr->op ){
734cce7d176Sdrh     case TK_AND: {
735cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
736cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
737cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
738cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
739cce7d176Sdrh       break;
740cce7d176Sdrh     }
741cce7d176Sdrh     case TK_OR: {
742cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
743cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
744cce7d176Sdrh       break;
745cce7d176Sdrh     }
746cce7d176Sdrh     case TK_NOT: {
747cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
748cce7d176Sdrh       break;
749cce7d176Sdrh     }
750cce7d176Sdrh     case TK_LT:
751cce7d176Sdrh     case TK_LE:
752cce7d176Sdrh     case TK_GT:
753cce7d176Sdrh     case TK_GE:
754cce7d176Sdrh     case TK_NE:
755cce7d176Sdrh     case TK_EQ:
756cce7d176Sdrh     case TK_LIKE:
757cce7d176Sdrh     case TK_GLOB: {
758cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
759cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
76099fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
761cce7d176Sdrh       break;
762cce7d176Sdrh     }
763cce7d176Sdrh     case TK_ISNULL:
764cce7d176Sdrh     case TK_NOTNULL: {
765cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
76699fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
767cce7d176Sdrh       break;
768cce7d176Sdrh     }
769fef5208cSdrh     case TK_IN: {
770cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
771fef5208cSdrh       if( pExpr->pSelect ){
77299fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
773fef5208cSdrh       }else{
77499fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
775fef5208cSdrh       }
776fef5208cSdrh       break;
777fef5208cSdrh     }
778fef5208cSdrh     case TK_BETWEEN: {
779fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
780fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
78199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
782fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
78399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
784fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
78599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest);
78699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
78799fcd718Sdrh       sqliteVdbeResolveLabel(v, lbl);
78899fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
789fef5208cSdrh       break;
790fef5208cSdrh     }
791cce7d176Sdrh     default: {
792cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
79399fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
794cce7d176Sdrh       break;
795cce7d176Sdrh     }
796cce7d176Sdrh   }
797cce7d176Sdrh }
798cce7d176Sdrh 
799cce7d176Sdrh /*
80066b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
801cce7d176Sdrh ** to the label "dest" if the expression is false but execution
802cce7d176Sdrh ** continues straight thru if the expression is true.
803cce7d176Sdrh */
804cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
805cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
806cce7d176Sdrh   int op = 0;
807daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
808cce7d176Sdrh   switch( pExpr->op ){
809cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
810cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
811cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
812cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
813cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
814cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
815cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
816cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
817cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
818cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
819cce7d176Sdrh     default:  break;
820cce7d176Sdrh   }
821cce7d176Sdrh   switch( pExpr->op ){
822cce7d176Sdrh     case TK_AND: {
823cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
824cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
825cce7d176Sdrh       break;
826cce7d176Sdrh     }
827cce7d176Sdrh     case TK_OR: {
828cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
829cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
830cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
831cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
832cce7d176Sdrh       break;
833cce7d176Sdrh     }
834cce7d176Sdrh     case TK_NOT: {
835cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
836cce7d176Sdrh       break;
837cce7d176Sdrh     }
838cce7d176Sdrh     case TK_LT:
839cce7d176Sdrh     case TK_LE:
840cce7d176Sdrh     case TK_GT:
841cce7d176Sdrh     case TK_GE:
842cce7d176Sdrh     case TK_NE:
843cce7d176Sdrh     case TK_EQ: {
844cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
845cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
84699fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
847cce7d176Sdrh       break;
848cce7d176Sdrh     }
849cce7d176Sdrh     case TK_LIKE:
850cce7d176Sdrh     case TK_GLOB: {
851cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
852cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
85399fcd718Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
854cce7d176Sdrh       break;
855cce7d176Sdrh     }
856cce7d176Sdrh     case TK_ISNULL:
857cce7d176Sdrh     case TK_NOTNULL: {
858cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
85999fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
860cce7d176Sdrh       break;
861cce7d176Sdrh     }
862fef5208cSdrh     case TK_IN: {
863cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
864fef5208cSdrh       if( pExpr->pSelect ){
86599fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
866fef5208cSdrh       }else{
86799fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
868fef5208cSdrh       }
869fef5208cSdrh       break;
870fef5208cSdrh     }
871fef5208cSdrh     case TK_BETWEEN: {
872fef5208cSdrh       int addr;
873fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
87499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
875fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
876fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
87799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
87899fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
87999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
880fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
88199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest);
882fef5208cSdrh       break;
883fef5208cSdrh     }
884cce7d176Sdrh     default: {
885cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
88699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0);
88799fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
888cce7d176Sdrh       break;
889cce7d176Sdrh     }
890cce7d176Sdrh   }
891cce7d176Sdrh }
8922282792aSdrh 
8932282792aSdrh /*
8942282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
8952282792aSdrh ** if they are identical and return FALSE if they differ in any way.
8962282792aSdrh */
897d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
8982282792aSdrh   int i;
8992282792aSdrh   if( pA==0 ){
9002282792aSdrh     return pB==0;
9012282792aSdrh   }else if( pB==0 ){
9022282792aSdrh     return 0;
9032282792aSdrh   }
9042282792aSdrh   if( pA->op!=pB->op ) return 0;
905d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
906d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
9072282792aSdrh   if( pA->pList ){
9082282792aSdrh     if( pB->pList==0 ) return 0;
9092282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
9102282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
911d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
9122282792aSdrh         return 0;
9132282792aSdrh       }
9142282792aSdrh     }
9152282792aSdrh   }else if( pB->pList ){
9162282792aSdrh     return 0;
9172282792aSdrh   }
9182282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
9192282792aSdrh   if( pA->token.z ){
9202282792aSdrh     if( pB->token.z==0 ) return 0;
9212282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
9222282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
9232282792aSdrh   }
9242282792aSdrh   return 1;
9252282792aSdrh }
9262282792aSdrh 
9272282792aSdrh /*
9282282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
9292282792aSdrh */
9302282792aSdrh static int appendAggInfo(Parse *pParse){
9312282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
9322282792aSdrh     int amt = pParse->nAgg + 8;
9336d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
9346d4abfbeSdrh     if( aAgg==0 ){
9352282792aSdrh       return -1;
9362282792aSdrh     }
9376d4abfbeSdrh     pParse->aAgg = aAgg;
9382282792aSdrh   }
9392282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
9402282792aSdrh   return pParse->nAgg++;
9412282792aSdrh }
9422282792aSdrh 
9432282792aSdrh /*
9442282792aSdrh ** Analyze the given expression looking for aggregate functions and
9452282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
9462282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
9472282792aSdrh **
9482282792aSdrh ** This routine should only be called after the expression has been
9492282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
9502282792aSdrh **
9512282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
9522282792aSdrh ** the number of errors.
9532282792aSdrh */
9542282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
9552282792aSdrh   int i;
9562282792aSdrh   AggExpr *aAgg;
9572282792aSdrh   int nErr = 0;
9582282792aSdrh 
9592282792aSdrh   if( pExpr==0 ) return 0;
9602282792aSdrh   switch( pExpr->op ){
961967e8b73Sdrh     case TK_COLUMN: {
9622282792aSdrh       aAgg = pParse->aAgg;
9632282792aSdrh       for(i=0; i<pParse->nAgg; i++){
9642282792aSdrh         if( aAgg[i].isAgg ) continue;
9652282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
966967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
9672282792aSdrh           break;
9682282792aSdrh         }
9692282792aSdrh       }
9702282792aSdrh       if( i>=pParse->nAgg ){
9712282792aSdrh         i = appendAggInfo(pParse);
9722282792aSdrh         if( i<0 ) return 1;
9732282792aSdrh         pParse->aAgg[i].isAgg = 0;
9742282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
9752282792aSdrh       }
976aaf88729Sdrh       pExpr->iAgg = i;
9772282792aSdrh       break;
9782282792aSdrh     }
9792282792aSdrh     case TK_AGG_FUNCTION: {
980967e8b73Sdrh       if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
9812282792aSdrh         if( pParse->iAggCount>=0 ){
9822282792aSdrh           i = pParse->iAggCount;
9832282792aSdrh         }else{
9842282792aSdrh           i = appendAggInfo(pParse);
9852282792aSdrh           if( i<0 ) return 1;
9862282792aSdrh           pParse->aAgg[i].isAgg = 1;
9872282792aSdrh           pParse->aAgg[i].pExpr = 0;
9882282792aSdrh           pParse->iAggCount = i;
9892282792aSdrh         }
990967e8b73Sdrh         if( pExpr->iColumn==FN_Count ){
9912282792aSdrh           pExpr->iAgg = i;
9922282792aSdrh           break;
9932282792aSdrh         }
9942282792aSdrh       }
9952282792aSdrh       aAgg = pParse->aAgg;
9962282792aSdrh       for(i=0; i<pParse->nAgg; i++){
9972282792aSdrh         if( !aAgg[i].isAgg ) continue;
998d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
9992282792aSdrh           break;
10002282792aSdrh         }
10012282792aSdrh       }
10022282792aSdrh       if( i>=pParse->nAgg ){
10032282792aSdrh         i = appendAggInfo(pParse);
10042282792aSdrh         if( i<0 ) return 1;
10052282792aSdrh         pParse->aAgg[i].isAgg = 1;
10062282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
10072282792aSdrh       }
10082282792aSdrh       pExpr->iAgg = i;
10092282792aSdrh       break;
10102282792aSdrh     }
10112282792aSdrh     default: {
10122282792aSdrh       if( pExpr->pLeft ){
10132282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
10142282792aSdrh       }
10152282792aSdrh       if( nErr==0 && pExpr->pRight ){
10162282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
10172282792aSdrh       }
10182282792aSdrh       if( nErr==0 && pExpr->pList ){
10192282792aSdrh         int n = pExpr->pList->nExpr;
10202282792aSdrh         int i;
10212282792aSdrh         for(i=0; nErr==0 && i<n; i++){
10222282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
10232282792aSdrh         }
10242282792aSdrh       }
10252282792aSdrh       break;
10262282792aSdrh     }
10272282792aSdrh   }
10282282792aSdrh   return nErr;
10292282792aSdrh }
1030