xref: /sqlite-3.40.0/src/expr.c (revision 2f4392ff)
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*2f4392ffSdrh ** $Id: expr.c,v 1.41 2002/02/14 21:42:51 drh Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
18cce7d176Sdrh 
19a2e00042Sdrh 
20a2e00042Sdrh /*
21a2e00042Sdrh ** Recursively delete an expression tree.
22a2e00042Sdrh */
23a2e00042Sdrh void sqliteExprDelete(Expr *p){
24a2e00042Sdrh   if( p==0 ) return;
25a2e00042Sdrh   if( p->op!=TK_AS ){
26a2e00042Sdrh     if( p->pLeft ) sqliteExprDelete(p->pLeft);
27a2e00042Sdrh     if( p->pRight ) sqliteExprDelete(p->pRight);
28a2e00042Sdrh   }
29a2e00042Sdrh   if( p->pList ) sqliteExprListDelete(p->pList);
30a2e00042Sdrh   if( p->pSelect ) sqliteSelectDelete(p->pSelect);
31a2e00042Sdrh   sqliteFree(p);
32a2e00042Sdrh }
33a2e00042Sdrh 
34cce7d176Sdrh /*
35fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
36fef5208cSdrh ** and 0 if it involves variables.
37fef5208cSdrh */
389208643dSdrh int sqliteExprIsConstant(Expr *p){
39fef5208cSdrh   switch( p->op ){
40fef5208cSdrh     case TK_ID:
41967e8b73Sdrh     case TK_COLUMN:
42fef5208cSdrh     case TK_DOT:
43fef5208cSdrh       return 0;
449208643dSdrh     case TK_INTEGER:
459208643dSdrh     case TK_FLOAT:
469208643dSdrh     case TK_STRING:
479208643dSdrh       return 1;
48fef5208cSdrh     default: {
499208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
509208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
51fef5208cSdrh       if( p->pList ){
52fef5208cSdrh         int i;
53fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
549208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
55fef5208cSdrh         }
56fef5208cSdrh       }
579208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
58fef5208cSdrh     }
59fef5208cSdrh   }
609208643dSdrh   return 0;
61fef5208cSdrh }
62fef5208cSdrh 
63fef5208cSdrh /*
644794b980Sdrh ** Walk the expression tree and process operators of the form:
654794b980Sdrh **
664794b980Sdrh **       expr IN (SELECT ...)
674794b980Sdrh **
68967e8b73Sdrh ** These operators have to be processed before column names are
694794b980Sdrh ** resolved because each such operator increments pParse->nTab
701ccde15dSdrh ** to reserve cursor numbers for its own use.  But pParse->nTab
71aacc543eSdrh ** needs to be constant once we begin resolving column names.  For
72aacc543eSdrh ** that reason, this procedure needs to be called on every expression
73aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression.
744794b980Sdrh **
754794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this
764794b980Sdrh ** routine.  This routine allocates a cursor number to the IN-SELECT
774794b980Sdrh ** and then moves on.  The code generation is done by
784794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards.
794794b980Sdrh */
804794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
814794b980Sdrh   if( pExpr==0 ) return;
824794b980Sdrh   if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
834794b980Sdrh     pExpr->iTable = pParse->nTab++;
844794b980Sdrh   }else{
854794b980Sdrh     if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
864794b980Sdrh     if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
874794b980Sdrh     if( pExpr->pList ){
884794b980Sdrh       int i;
894794b980Sdrh       ExprList *pList = pExpr->pList;
904794b980Sdrh       for(i=0; i<pList->nExpr; i++){
914794b980Sdrh         sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
924794b980Sdrh       }
934794b980Sdrh     }
944794b980Sdrh   }
954794b980Sdrh }
964794b980Sdrh 
974794b980Sdrh /*
98c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
99c4a3c779Sdrh */
100c4a3c779Sdrh static int sqliteIsRowid(const char *z){
101c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
102c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
103c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
104c4a3c779Sdrh   return 0;
105c4a3c779Sdrh }
106c4a3c779Sdrh 
107c4a3c779Sdrh /*
108cce7d176Sdrh ** This routine walks an expression tree and resolves references to
109967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
110aacc543eSdrh ** index to the table in the table list and a column offset.  The
111aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
112aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
113aacc543eSdrh ** plus the pParse->nTab value.  This value will ultimately become the
114aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
115aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
116aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
117aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
118aacc543eSdrh ** alias for ROWID.
11919a775c2Sdrh **
120fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
121fef5208cSdrh ** forms:
122fef5208cSdrh **
123fef5208cSdrh **           expr IN (exprlist)
124fef5208cSdrh ** and
125fef5208cSdrh **           expr IN (SELECT ...)
126fef5208cSdrh **
127fef5208cSdrh ** The first form is handled by creating a set holding the list
128fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
129fef5208cSdrh ** a temporary table.
130fef5208cSdrh **
131fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
13219a775c2Sdrh ** If it finds any, it generates code to write the value of that select
13319a775c2Sdrh ** into a memory cell.
134cce7d176Sdrh **
135967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
136cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
137cce7d176Sdrh */
138a2e00042Sdrh int sqliteExprResolveIds(
139a2e00042Sdrh   Parse *pParse,     /* The parser context */
140a2e00042Sdrh   IdList *pTabList,  /* List of tables used to resolve column names */
141a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
142a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
143a2e00042Sdrh ){
144daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
145cce7d176Sdrh   switch( pExpr->op ){
146a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
147a2e00042Sdrh     **
148a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
149a2e00042Sdrh     **
150a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
151a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
152a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
153a2e00042Sdrh     **
154a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
155a2e00042Sdrh     */
156cce7d176Sdrh     case TK_ID: {
157cce7d176Sdrh       int cnt = 0;      /* Number of matches */
158cce7d176Sdrh       int i;            /* Loop counter */
1596e142f54Sdrh       char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
160*2f4392ffSdrh       sqliteDequote(z);
161daffd0e5Sdrh       if( z==0 ) return 1;
162cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
163cce7d176Sdrh         int j;
164cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
165cce7d176Sdrh         if( pTab==0 ) continue;
166cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
1677020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
168cce7d176Sdrh             cnt++;
16919a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
1704a32431cSdrh             if( j==pTab->iPKey ){
1714a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
1724a32431cSdrh               pExpr->iColumn = -1;
1734a32431cSdrh             }else{
174967e8b73Sdrh               pExpr->iColumn = j;
175cce7d176Sdrh             }
176a2e00042Sdrh             pExpr->op = TK_COLUMN;
177a2e00042Sdrh           }
178a2e00042Sdrh         }
179a2e00042Sdrh       }
180a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
181a2e00042Sdrh         int j;
182a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
183a2e00042Sdrh           char *zAs = pEList->a[j].zName;
184a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
185a2e00042Sdrh             cnt++;
186a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
187a2e00042Sdrh             pExpr->op = TK_AS;
188a2e00042Sdrh             pExpr->iColumn = j;
189a2e00042Sdrh             pExpr->pLeft = pEList->a[j].pExpr;
190cce7d176Sdrh           }
191cce7d176Sdrh         }
1924a32431cSdrh       }
193c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
194c4a3c779Sdrh         pExpr->iColumn = -1;
195c4a3c779Sdrh         pExpr->iTable = pParse->nTab;
196c4a3c779Sdrh         cnt = 1 + (pTabList->nId>1);
197a2e00042Sdrh         pExpr->op = TK_COLUMN;
198c4a3c779Sdrh       }
199cce7d176Sdrh       sqliteFree(z);
200cce7d176Sdrh       if( cnt==0 ){
201967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
202cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
203cce7d176Sdrh         pParse->nErr++;
204cce7d176Sdrh         return 1;
205cce7d176Sdrh       }else if( cnt>1 ){
206967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
207cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
208cce7d176Sdrh         pParse->nErr++;
209cce7d176Sdrh         return 1;
210cce7d176Sdrh       }
211cce7d176Sdrh       break;
212cce7d176Sdrh     }
213cce7d176Sdrh 
214967e8b73Sdrh     /* A table name and column name:  ID.ID */
215cce7d176Sdrh     case TK_DOT: {
216cce7d176Sdrh       int cnt = 0;             /* Number of matches */
217c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
218cce7d176Sdrh       int i;                   /* Loop counter */
219cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
220cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
221cce7d176Sdrh 
222cce7d176Sdrh       pLeft = pExpr->pLeft;
223cce7d176Sdrh       pRight = pExpr->pRight;
224cce7d176Sdrh       assert( pLeft && pLeft->op==TK_ID );
225cce7d176Sdrh       assert( pRight && pRight->op==TK_ID );
2266e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
2276e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
228daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
229daffd0e5Sdrh         sqliteFree(zLeft);
230daffd0e5Sdrh         sqliteFree(zRight);
231daffd0e5Sdrh         return 1;
232daffd0e5Sdrh       }
23387c40e88Sdrh       sqliteDequote(zLeft);
23487c40e88Sdrh       sqliteDequote(zRight);
235c4a3c779Sdrh       pExpr->iTable = -1;
236cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
237cce7d176Sdrh         int j;
238cce7d176Sdrh         char *zTab;
239cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
240cce7d176Sdrh         if( pTab==0 ) continue;
241cce7d176Sdrh         if( pTabList->a[i].zAlias ){
242cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
243cce7d176Sdrh         }else{
244cce7d176Sdrh           zTab = pTab->zName;
245cce7d176Sdrh         }
246cce7d176Sdrh         if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
247c4a3c779Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
248cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
2497020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
250cce7d176Sdrh             cnt++;
25119a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
2524a32431cSdrh             if( j==pTab->iPKey ){
2534a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
2544a32431cSdrh               pExpr->iColumn = -1;
2554a32431cSdrh             }else{
256967e8b73Sdrh               pExpr->iColumn = j;
257cce7d176Sdrh             }
258cce7d176Sdrh           }
259cce7d176Sdrh         }
2604a32431cSdrh       }
261c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
262c4a3c779Sdrh         cnt = 1;
263c4a3c779Sdrh         pExpr->iColumn = -1;
264c4a3c779Sdrh       }
265cce7d176Sdrh       sqliteFree(zLeft);
266cce7d176Sdrh       sqliteFree(zRight);
267cce7d176Sdrh       if( cnt==0 ){
268967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
269cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
270cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
271cce7d176Sdrh         pParse->nErr++;
272cce7d176Sdrh         return 1;
273cce7d176Sdrh       }else if( cnt>1 ){
274967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
275cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
276cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
277cce7d176Sdrh         pParse->nErr++;
278cce7d176Sdrh         return 1;
279cce7d176Sdrh       }
280cce7d176Sdrh       sqliteExprDelete(pLeft);
281cce7d176Sdrh       pExpr->pLeft = 0;
282cce7d176Sdrh       sqliteExprDelete(pRight);
283cce7d176Sdrh       pExpr->pRight = 0;
284967e8b73Sdrh       pExpr->op = TK_COLUMN;
285cce7d176Sdrh       break;
286cce7d176Sdrh     }
287cce7d176Sdrh 
288fef5208cSdrh     case TK_IN: {
289d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
290fef5208cSdrh       if( v==0 ) return 1;
291a2e00042Sdrh       if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
292cfab11bcSdrh         return 1;
293cfab11bcSdrh       }
294fef5208cSdrh       if( pExpr->pSelect ){
295fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
296fef5208cSdrh         **
297fef5208cSdrh         ** Generate code to write the results of the select into a temporary
2984794b980Sdrh         ** table.  The cursor number of the temporary table has already
2994794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
300fef5208cSdrh         */
301c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
302fef5208cSdrh         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
303fef5208cSdrh       }else if( pExpr->pList ){
304fef5208cSdrh         /* Case 2:     expr IN (exprlist)
305fef5208cSdrh         **
306fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
307fef5208cSdrh         ** in iTable.
308fef5208cSdrh         */
309fef5208cSdrh         int i, iSet;
310fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
311fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
3129208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
313fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
314fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
315fef5208cSdrh             pParse->nErr++;
316fef5208cSdrh             return 1;
317fef5208cSdrh           }
3184794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
3194794b980Sdrh             return 1;
3204794b980Sdrh           }
321fef5208cSdrh         }
322fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
323fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
324fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
325fef5208cSdrh           switch( pE2->op ){
326fef5208cSdrh             case TK_FLOAT:
327fef5208cSdrh             case TK_INTEGER:
328fef5208cSdrh             case TK_STRING: {
32999fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
330fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
331fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
332fef5208cSdrh               break;
333fef5208cSdrh             }
334fef5208cSdrh             default: {
335fef5208cSdrh               sqliteExprCode(pParse, pE2);
33699fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
337fef5208cSdrh               break;
338fef5208cSdrh             }
339fef5208cSdrh           }
340fef5208cSdrh         }
341fef5208cSdrh       }
342cfab11bcSdrh       break;
343fef5208cSdrh     }
344fef5208cSdrh 
34519a775c2Sdrh     case TK_SELECT: {
346fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
347fef5208cSdrh       ** value of this select in a memory cell and record the number
348967e8b73Sdrh       ** of the memory cell in iColumn.
349fef5208cSdrh       */
350967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
351967e8b73Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
35219a775c2Sdrh         return 1;
35319a775c2Sdrh       }
35419a775c2Sdrh       break;
35519a775c2Sdrh     }
35619a775c2Sdrh 
357cce7d176Sdrh     /* For all else, just recursively walk the tree */
358cce7d176Sdrh     default: {
359cce7d176Sdrh       if( pExpr->pLeft
360a2e00042Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
361cce7d176Sdrh         return 1;
362cce7d176Sdrh       }
363cce7d176Sdrh       if( pExpr->pRight
364a2e00042Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){
365cce7d176Sdrh         return 1;
366cce7d176Sdrh       }
367cce7d176Sdrh       if( pExpr->pList ){
368cce7d176Sdrh         int i;
369cce7d176Sdrh         ExprList *pList = pExpr->pList;
370cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
371a2e00042Sdrh           if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){
372cce7d176Sdrh             return 1;
373cce7d176Sdrh           }
374cce7d176Sdrh         }
375cce7d176Sdrh       }
376cce7d176Sdrh     }
377cce7d176Sdrh   }
378cce7d176Sdrh   return 0;
379cce7d176Sdrh }
380cce7d176Sdrh 
381cce7d176Sdrh #if 0 /* NOT USED */
382cce7d176Sdrh /*
383cce7d176Sdrh ** Compare a token against a string.  Return TRUE if they match.
384cce7d176Sdrh */
385cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){
386cce7d176Sdrh   int n = strlen(zStr);
387cce7d176Sdrh   if( n!=pToken->n ) return 0;
388cce7d176Sdrh   return sqliteStrNICmp(pToken->z, zStr, n)==0;
389cce7d176Sdrh }
390cce7d176Sdrh #endif
391cce7d176Sdrh 
392cce7d176Sdrh /*
393cce7d176Sdrh ** Convert a function name into its integer identifier.  Return the
394cce7d176Sdrh ** identifier.  Return FN_Unknown if the function name is unknown.
395cce7d176Sdrh */
396cce7d176Sdrh int sqliteFuncId(Token *pToken){
397cce7d176Sdrh   static const struct {
398cce7d176Sdrh      char *zName;
399cce7d176Sdrh      int len;
400cce7d176Sdrh      int id;
401cce7d176Sdrh   } aFunc[] = {
402cce7d176Sdrh      { "count",  5, FN_Count  },
403cce7d176Sdrh      { "min",    3, FN_Min    },
404cce7d176Sdrh      { "max",    3, FN_Max    },
405cce7d176Sdrh      { "sum",    3, FN_Sum    },
4062282792aSdrh      { "avg",    3, FN_Avg    },
4076ec2733bSdrh      { "length", 6, FN_Length },
4086ec2733bSdrh      { "substr", 6, FN_Substr },
409bf4133cbSdrh      { "abs",    3, FN_Abs    },
410bf4133cbSdrh      { "round",  5, FN_Round  },
411cce7d176Sdrh   };
412cce7d176Sdrh   int i;
413cce7d176Sdrh   for(i=0; i<ArraySize(aFunc); i++){
414cce7d176Sdrh     if( aFunc[i].len==pToken->n
415cce7d176Sdrh      && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
416cce7d176Sdrh        return aFunc[i].id;
417cce7d176Sdrh     }
418cce7d176Sdrh   }
419cce7d176Sdrh   return FN_Unknown;
420cce7d176Sdrh }
421cce7d176Sdrh 
422cce7d176Sdrh /*
423cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
424cce7d176Sdrh ** function names are recognized and all functions have the correct
425cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
426cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
427cce7d176Sdrh **
428cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
429cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
430cce7d176Sdrh */
431cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
432cce7d176Sdrh   int nErr = 0;
433cce7d176Sdrh   if( pExpr==0 ) return 0;
434cce7d176Sdrh   switch( pExpr->op ){
435cce7d176Sdrh     case TK_FUNCTION: {
436cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
437cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
438cce7d176Sdrh       int no_such_func = 0;
439cce7d176Sdrh       int too_many_args = 0;
440cce7d176Sdrh       int too_few_args = 0;
441cce7d176Sdrh       int is_agg = 0;
442cce7d176Sdrh       int i;
443967e8b73Sdrh       pExpr->iColumn = id;
444cce7d176Sdrh       switch( id ){
445cce7d176Sdrh         case FN_Unknown: {
446cce7d176Sdrh           no_such_func = 1;
447cce7d176Sdrh           break;
448cce7d176Sdrh         }
449cce7d176Sdrh         case FN_Count: {
450cce7d176Sdrh           no_such_func = !allowAgg;
451cce7d176Sdrh           too_many_args = n>1;
452cce7d176Sdrh           is_agg = 1;
453cce7d176Sdrh           break;
454cce7d176Sdrh         }
455cce7d176Sdrh         case FN_Max:
456cce7d176Sdrh         case FN_Min: {
457cce7d176Sdrh           too_few_args = allowAgg ? n<1 : n<2;
458cce7d176Sdrh           is_agg = n==1;
459cce7d176Sdrh           break;
460cce7d176Sdrh         }
4612282792aSdrh         case FN_Avg:
462cce7d176Sdrh         case FN_Sum: {
463cce7d176Sdrh           no_such_func = !allowAgg;
464cce7d176Sdrh           too_many_args = n>1;
465cce7d176Sdrh           too_few_args = n<1;
466cce7d176Sdrh           is_agg = 1;
467cce7d176Sdrh           break;
468cce7d176Sdrh         }
469bf4133cbSdrh         case FN_Abs:
4706ec2733bSdrh         case FN_Length: {
4716ec2733bSdrh           too_few_args = n<1;
4726ec2733bSdrh           too_many_args = n>1;
4736ec2733bSdrh           break;
4746ec2733bSdrh         }
475bf4133cbSdrh         case FN_Round: {
476bf4133cbSdrh           too_few_args = n<1;
477bf4133cbSdrh           too_many_args = n>2;
478bf4133cbSdrh           break;
479bf4133cbSdrh         }
4806ec2733bSdrh         case FN_Substr: {
4816ec2733bSdrh           too_few_args = n<3;
4826ec2733bSdrh           too_many_args = n>3;
4836ec2733bSdrh           break;
4846ec2733bSdrh         }
485cce7d176Sdrh         default: break;
486cce7d176Sdrh       }
487cce7d176Sdrh       if( no_such_func ){
488cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
489cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
490cce7d176Sdrh         pParse->nErr++;
491cce7d176Sdrh         nErr++;
492cce7d176Sdrh       }else if( too_many_args ){
493cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
494cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
495cce7d176Sdrh         pParse->nErr++;
496cce7d176Sdrh         nErr++;
497cce7d176Sdrh       }else if( too_few_args ){
498cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
499cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
500cce7d176Sdrh         pParse->nErr++;
501cce7d176Sdrh         nErr++;
502cce7d176Sdrh       }
5032282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
504cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
505cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
5064cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
5074cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
508cce7d176Sdrh       }
509cce7d176Sdrh     }
510cce7d176Sdrh     default: {
511cce7d176Sdrh       if( pExpr->pLeft ){
5122282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
513cce7d176Sdrh       }
514cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
5152282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
516cce7d176Sdrh       }
517fef5208cSdrh       if( nErr==0 && pExpr->pList ){
518fef5208cSdrh         int n = pExpr->pList->nExpr;
519fef5208cSdrh         int i;
520fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
5212282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
5222282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
523fef5208cSdrh         }
524fef5208cSdrh       }
525cce7d176Sdrh       break;
526cce7d176Sdrh     }
527cce7d176Sdrh   }
528cce7d176Sdrh   return nErr;
529cce7d176Sdrh }
530cce7d176Sdrh 
531cce7d176Sdrh /*
532cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
5331ccde15dSdrh ** expression and leave the result on the top of stack.
534cce7d176Sdrh */
535cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
536cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
537cce7d176Sdrh   int op;
538daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
539cce7d176Sdrh   switch( pExpr->op ){
540cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
541cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
542cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
543cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
544cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
545cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
546cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
547cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
548cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
549cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
550cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
551cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
552cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
553cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
554cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
555cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
556cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
557cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
558bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
559bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
560bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
561bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
562bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
563bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
564cce7d176Sdrh     default: break;
565cce7d176Sdrh   }
566cce7d176Sdrh   switch( pExpr->op ){
567967e8b73Sdrh     case TK_COLUMN: {
5682282792aSdrh       if( pParse->useAgg ){
56999fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
570c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
57199fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
572c4a3c779Sdrh       }else{
57399fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
5742282792aSdrh       }
575cce7d176Sdrh       break;
576cce7d176Sdrh     }
577ef6764a1Sdrh     case TK_FLOAT:
578cce7d176Sdrh     case TK_INTEGER: {
5797a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
5807a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
581cce7d176Sdrh       break;
582cce7d176Sdrh     }
583cce7d176Sdrh     case TK_STRING: {
58499fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
585cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
586cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
587cce7d176Sdrh       break;
588cce7d176Sdrh     }
589cce7d176Sdrh     case TK_NULL: {
59099fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
591cce7d176Sdrh       break;
592cce7d176Sdrh     }
593cce7d176Sdrh     case TK_AND:
594cce7d176Sdrh     case TK_OR:
595cce7d176Sdrh     case TK_PLUS:
596cce7d176Sdrh     case TK_STAR:
597cce7d176Sdrh     case TK_MINUS:
598bf4133cbSdrh     case TK_REM:
599bf4133cbSdrh     case TK_BITAND:
600bf4133cbSdrh     case TK_BITOR:
601cce7d176Sdrh     case TK_SLASH: {
602cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
603cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
60499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
605cce7d176Sdrh       break;
606cce7d176Sdrh     }
607bf4133cbSdrh     case TK_LSHIFT:
608bf4133cbSdrh     case TK_RSHIFT: {
609bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
610bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
611bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
612bf4133cbSdrh       break;
613bf4133cbSdrh     }
6140040077dSdrh     case TK_CONCAT: {
6150040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
6160040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
61799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
6180040077dSdrh       break;
6190040077dSdrh     }
620cce7d176Sdrh     case TK_LT:
621cce7d176Sdrh     case TK_LE:
622cce7d176Sdrh     case TK_GT:
623cce7d176Sdrh     case TK_GE:
624cce7d176Sdrh     case TK_NE:
625cce7d176Sdrh     case TK_EQ:
626cce7d176Sdrh     case TK_LIKE:
627cce7d176Sdrh     case TK_GLOB: {
628cce7d176Sdrh       int dest;
62999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
630cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
631cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
632cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
63399fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
63499fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
635cce7d176Sdrh       break;
636cce7d176Sdrh     }
637cce7d176Sdrh     case TK_UMINUS: {
6386e142f54Sdrh       assert( pExpr->pLeft );
6397a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
6406e142f54Sdrh         Token *p = &pExpr->pLeft->token;
6416e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
6426e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
64399fcd718Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
64499fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
6456e142f54Sdrh         sqliteFree(z);
6466e142f54Sdrh         break;
6476e142f54Sdrh       }
6481ccde15dSdrh       /* Fall through into TK_NOT */
6496e142f54Sdrh     }
650bf4133cbSdrh     case TK_BITNOT:
6516e142f54Sdrh     case TK_NOT: {
652cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
65399fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
654cce7d176Sdrh       break;
655cce7d176Sdrh     }
656cce7d176Sdrh     case TK_ISNULL:
657cce7d176Sdrh     case TK_NOTNULL: {
658cce7d176Sdrh       int dest;
65999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
660cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
661cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
66299fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
66399fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
664cce7d176Sdrh       break;
665cce7d176Sdrh     }
6662282792aSdrh     case TK_AGG_FUNCTION: {
66799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
668967e8b73Sdrh       if( pExpr->iColumn==FN_Avg ){
6692282792aSdrh         assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
67099fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
67199fcd718Sdrh         sqliteVdbeAddOp(v, OP_Divide, 0, 0);
6722282792aSdrh       }
6732282792aSdrh       break;
6742282792aSdrh     }
675cce7d176Sdrh     case TK_FUNCTION: {
676967e8b73Sdrh       int id = pExpr->iColumn;
677cce7d176Sdrh       int op;
678cce7d176Sdrh       int i;
679cce7d176Sdrh       ExprList *pList = pExpr->pList;
6806ec2733bSdrh       switch( id ){
6816ec2733bSdrh         case FN_Min:
6826ec2733bSdrh         case FN_Max: {
683cce7d176Sdrh           op = id==FN_Min ? OP_Min : OP_Max;
684cce7d176Sdrh           for(i=0; i<pList->nExpr; i++){
685cce7d176Sdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
686cce7d176Sdrh             if( i>0 ){
68799fcd718Sdrh               sqliteVdbeAddOp(v, op, 0, 0);
688cce7d176Sdrh             }
689cce7d176Sdrh           }
690cce7d176Sdrh           break;
691cce7d176Sdrh         }
692bf4133cbSdrh         case FN_Abs: {
693bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
694bf4133cbSdrh           sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
695bf4133cbSdrh           break;
696bf4133cbSdrh         }
697bf4133cbSdrh         case FN_Round: {
698bf4133cbSdrh           if( pList->nExpr==2 ){
699bf4133cbSdrh             sqliteExprCode(pParse, pList->a[1].pExpr);
700bf4133cbSdrh           }else{
701bf4133cbSdrh             sqliteVdbeAddOp(v, OP_Integer, 0, 0);
702bf4133cbSdrh           }
703bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
704bf4133cbSdrh           sqliteVdbeAddOp(v, OP_Precision, 0, 0);
705bf4133cbSdrh           break;
706bf4133cbSdrh         }
7076ec2733bSdrh         case FN_Length: {
7086ec2733bSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
70999fcd718Sdrh           sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
7106ec2733bSdrh           break;
7116ec2733bSdrh         }
7126ec2733bSdrh         case FN_Substr: {
7136ec2733bSdrh           for(i=0; i<pList->nExpr; i++){
7146ec2733bSdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
7156ec2733bSdrh           }
71699fcd718Sdrh           sqliteVdbeAddOp(v, OP_Substr, 0, 0);
7176ec2733bSdrh           break;
7186ec2733bSdrh         }
7196ec2733bSdrh         default: {
7206ec2733bSdrh           /* Can't happen! */
7216ec2733bSdrh           break;
7226ec2733bSdrh         }
7236ec2733bSdrh       }
7246ec2733bSdrh       break;
7256ec2733bSdrh     }
72619a775c2Sdrh     case TK_SELECT: {
72799fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
72819a775c2Sdrh       break;
72919a775c2Sdrh     }
730fef5208cSdrh     case TK_IN: {
731fef5208cSdrh       int addr;
73299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
733fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
734fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
735fef5208cSdrh       if( pExpr->pSelect ){
73699fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
737fef5208cSdrh       }else{
73899fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
739fef5208cSdrh       }
74099fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
741fef5208cSdrh       break;
742fef5208cSdrh     }
743fef5208cSdrh     case TK_BETWEEN: {
744fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
74599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
746fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
74799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
748fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
749fef5208cSdrh       break;
750fef5208cSdrh     }
751a2e00042Sdrh     case TK_AS: {
752a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
753a2e00042Sdrh       break;
754a2e00042Sdrh     }
755cce7d176Sdrh   }
756cce7d176Sdrh   return;
757cce7d176Sdrh }
758cce7d176Sdrh 
759cce7d176Sdrh /*
760cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
761cce7d176Sdrh ** to the label "dest" if the expression is true but execution
762cce7d176Sdrh ** continues straight thru if the expression is false.
763cce7d176Sdrh */
764cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
765cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
766cce7d176Sdrh   int op = 0;
767daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
768cce7d176Sdrh   switch( pExpr->op ){
769cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
770cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
771cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
772cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
773cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
774cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
775cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
776cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
777cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
778cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
779cce7d176Sdrh     default:  break;
780cce7d176Sdrh   }
781cce7d176Sdrh   switch( pExpr->op ){
782cce7d176Sdrh     case TK_AND: {
783cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
784cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
785cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
786cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
787cce7d176Sdrh       break;
788cce7d176Sdrh     }
789cce7d176Sdrh     case TK_OR: {
790cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
791cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
792cce7d176Sdrh       break;
793cce7d176Sdrh     }
794cce7d176Sdrh     case TK_NOT: {
795cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
796cce7d176Sdrh       break;
797cce7d176Sdrh     }
798cce7d176Sdrh     case TK_LT:
799cce7d176Sdrh     case TK_LE:
800cce7d176Sdrh     case TK_GT:
801cce7d176Sdrh     case TK_GE:
802cce7d176Sdrh     case TK_NE:
803cce7d176Sdrh     case TK_EQ:
804cce7d176Sdrh     case TK_LIKE:
805cce7d176Sdrh     case TK_GLOB: {
806cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
807cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
80899fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
809cce7d176Sdrh       break;
810cce7d176Sdrh     }
811cce7d176Sdrh     case TK_ISNULL:
812cce7d176Sdrh     case TK_NOTNULL: {
813cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
81499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
815cce7d176Sdrh       break;
816cce7d176Sdrh     }
817fef5208cSdrh     case TK_IN: {
818cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
819fef5208cSdrh       if( pExpr->pSelect ){
82099fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
821fef5208cSdrh       }else{
82299fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
823fef5208cSdrh       }
824fef5208cSdrh       break;
825fef5208cSdrh     }
826fef5208cSdrh     case TK_BETWEEN: {
827fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
828fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
82999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
830fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
83199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
832fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
83399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest);
83499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
83599fcd718Sdrh       sqliteVdbeResolveLabel(v, lbl);
83699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
837fef5208cSdrh       break;
838fef5208cSdrh     }
839cce7d176Sdrh     default: {
840cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
84199fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
842cce7d176Sdrh       break;
843cce7d176Sdrh     }
844cce7d176Sdrh   }
845cce7d176Sdrh }
846cce7d176Sdrh 
847cce7d176Sdrh /*
84866b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
849cce7d176Sdrh ** to the label "dest" if the expression is false but execution
850cce7d176Sdrh ** continues straight thru if the expression is true.
851cce7d176Sdrh */
852cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
853cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
854cce7d176Sdrh   int op = 0;
855daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
856cce7d176Sdrh   switch( pExpr->op ){
857cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
858cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
859cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
860cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
861cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
862cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
863cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
864cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
865cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
866cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
867cce7d176Sdrh     default:  break;
868cce7d176Sdrh   }
869cce7d176Sdrh   switch( pExpr->op ){
870cce7d176Sdrh     case TK_AND: {
871cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
872cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
873cce7d176Sdrh       break;
874cce7d176Sdrh     }
875cce7d176Sdrh     case TK_OR: {
876cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
877cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
878cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
879cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
880cce7d176Sdrh       break;
881cce7d176Sdrh     }
882cce7d176Sdrh     case TK_NOT: {
883cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
884cce7d176Sdrh       break;
885cce7d176Sdrh     }
886cce7d176Sdrh     case TK_LT:
887cce7d176Sdrh     case TK_LE:
888cce7d176Sdrh     case TK_GT:
889cce7d176Sdrh     case TK_GE:
890cce7d176Sdrh     case TK_NE:
891cce7d176Sdrh     case TK_EQ: {
892cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
893cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
89499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
895cce7d176Sdrh       break;
896cce7d176Sdrh     }
897cce7d176Sdrh     case TK_LIKE:
898cce7d176Sdrh     case TK_GLOB: {
899cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
900cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
90199fcd718Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
902cce7d176Sdrh       break;
903cce7d176Sdrh     }
904cce7d176Sdrh     case TK_ISNULL:
905cce7d176Sdrh     case TK_NOTNULL: {
906cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
90799fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
908cce7d176Sdrh       break;
909cce7d176Sdrh     }
910fef5208cSdrh     case TK_IN: {
911cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
912fef5208cSdrh       if( pExpr->pSelect ){
91399fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
914fef5208cSdrh       }else{
91599fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
916fef5208cSdrh       }
917fef5208cSdrh       break;
918fef5208cSdrh     }
919fef5208cSdrh     case TK_BETWEEN: {
920fef5208cSdrh       int addr;
921fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
92299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
923fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
924fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
92599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
92699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
92799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
928fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
92999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest);
930fef5208cSdrh       break;
931fef5208cSdrh     }
932cce7d176Sdrh     default: {
933cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
93499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0);
93599fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
936cce7d176Sdrh       break;
937cce7d176Sdrh     }
938cce7d176Sdrh   }
939cce7d176Sdrh }
9402282792aSdrh 
9412282792aSdrh /*
9422282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
9432282792aSdrh ** if they are identical and return FALSE if they differ in any way.
9442282792aSdrh */
945d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
9462282792aSdrh   int i;
9472282792aSdrh   if( pA==0 ){
9482282792aSdrh     return pB==0;
9492282792aSdrh   }else if( pB==0 ){
9502282792aSdrh     return 0;
9512282792aSdrh   }
9522282792aSdrh   if( pA->op!=pB->op ) return 0;
953d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
954d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
9552282792aSdrh   if( pA->pList ){
9562282792aSdrh     if( pB->pList==0 ) return 0;
9572282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
9582282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
959d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
9602282792aSdrh         return 0;
9612282792aSdrh       }
9622282792aSdrh     }
9632282792aSdrh   }else if( pB->pList ){
9642282792aSdrh     return 0;
9652282792aSdrh   }
9662282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
9672282792aSdrh   if( pA->token.z ){
9682282792aSdrh     if( pB->token.z==0 ) return 0;
9692282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
9702282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
9712282792aSdrh   }
9722282792aSdrh   return 1;
9732282792aSdrh }
9742282792aSdrh 
9752282792aSdrh /*
9762282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
9772282792aSdrh */
9782282792aSdrh static int appendAggInfo(Parse *pParse){
9792282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
9802282792aSdrh     int amt = pParse->nAgg + 8;
9816d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
9826d4abfbeSdrh     if( aAgg==0 ){
9832282792aSdrh       return -1;
9842282792aSdrh     }
9856d4abfbeSdrh     pParse->aAgg = aAgg;
9862282792aSdrh   }
9872282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
9882282792aSdrh   return pParse->nAgg++;
9892282792aSdrh }
9902282792aSdrh 
9912282792aSdrh /*
9922282792aSdrh ** Analyze the given expression looking for aggregate functions and
9932282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
9942282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
9952282792aSdrh **
9962282792aSdrh ** This routine should only be called after the expression has been
9972282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
9982282792aSdrh **
9992282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
10002282792aSdrh ** the number of errors.
10012282792aSdrh */
10022282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
10032282792aSdrh   int i;
10042282792aSdrh   AggExpr *aAgg;
10052282792aSdrh   int nErr = 0;
10062282792aSdrh 
10072282792aSdrh   if( pExpr==0 ) return 0;
10082282792aSdrh   switch( pExpr->op ){
1009967e8b73Sdrh     case TK_COLUMN: {
10102282792aSdrh       aAgg = pParse->aAgg;
10112282792aSdrh       for(i=0; i<pParse->nAgg; i++){
10122282792aSdrh         if( aAgg[i].isAgg ) continue;
10132282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1014967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
10152282792aSdrh           break;
10162282792aSdrh         }
10172282792aSdrh       }
10182282792aSdrh       if( i>=pParse->nAgg ){
10192282792aSdrh         i = appendAggInfo(pParse);
10202282792aSdrh         if( i<0 ) return 1;
10212282792aSdrh         pParse->aAgg[i].isAgg = 0;
10222282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
10232282792aSdrh       }
1024aaf88729Sdrh       pExpr->iAgg = i;
10252282792aSdrh       break;
10262282792aSdrh     }
10272282792aSdrh     case TK_AGG_FUNCTION: {
1028967e8b73Sdrh       if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
10292282792aSdrh         if( pParse->iAggCount>=0 ){
10302282792aSdrh           i = pParse->iAggCount;
10312282792aSdrh         }else{
10322282792aSdrh           i = appendAggInfo(pParse);
10332282792aSdrh           if( i<0 ) return 1;
10342282792aSdrh           pParse->aAgg[i].isAgg = 1;
10352282792aSdrh           pParse->aAgg[i].pExpr = 0;
10362282792aSdrh           pParse->iAggCount = i;
10372282792aSdrh         }
1038967e8b73Sdrh         if( pExpr->iColumn==FN_Count ){
10392282792aSdrh           pExpr->iAgg = i;
10402282792aSdrh           break;
10412282792aSdrh         }
10422282792aSdrh       }
10432282792aSdrh       aAgg = pParse->aAgg;
10442282792aSdrh       for(i=0; i<pParse->nAgg; i++){
10452282792aSdrh         if( !aAgg[i].isAgg ) continue;
1046d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
10472282792aSdrh           break;
10482282792aSdrh         }
10492282792aSdrh       }
10502282792aSdrh       if( i>=pParse->nAgg ){
10512282792aSdrh         i = appendAggInfo(pParse);
10522282792aSdrh         if( i<0 ) return 1;
10532282792aSdrh         pParse->aAgg[i].isAgg = 1;
10542282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
10552282792aSdrh       }
10562282792aSdrh       pExpr->iAgg = i;
10572282792aSdrh       break;
10582282792aSdrh     }
10592282792aSdrh     default: {
10602282792aSdrh       if( pExpr->pLeft ){
10612282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
10622282792aSdrh       }
10632282792aSdrh       if( nErr==0 && pExpr->pRight ){
10642282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
10652282792aSdrh       }
10662282792aSdrh       if( nErr==0 && pExpr->pList ){
10672282792aSdrh         int n = pExpr->pList->nExpr;
10682282792aSdrh         int i;
10692282792aSdrh         for(i=0; nErr==0 && i<n; i++){
10702282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
10712282792aSdrh         }
10722282792aSdrh       }
10732282792aSdrh       break;
10742282792aSdrh     }
10752282792aSdrh   }
10762282792aSdrh   return nErr;
10772282792aSdrh }
1078