xref: /sqlite-3.40.0/src/expr.c (revision fef5208c)
1cce7d176Sdrh /*
2cce7d176Sdrh ** Copyright (c) 1999, 2000 D. Richard Hipp
3cce7d176Sdrh **
4cce7d176Sdrh ** This program is free software; you can redistribute it and/or
5cce7d176Sdrh ** modify it under the terms of the GNU General Public
6cce7d176Sdrh ** License as published by the Free Software Foundation; either
7cce7d176Sdrh ** version 2 of the License, or (at your option) any later version.
8cce7d176Sdrh **
9cce7d176Sdrh ** This program is distributed in the hope that it will be useful,
10cce7d176Sdrh ** but WITHOUT ANY WARRANTY; without even the implied warranty of
11cce7d176Sdrh ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12cce7d176Sdrh ** General Public License for more details.
13cce7d176Sdrh **
14cce7d176Sdrh ** You should have received a copy of the GNU General Public
15cce7d176Sdrh ** License along with this library; if not, write to the
16cce7d176Sdrh ** Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17cce7d176Sdrh ** Boston, MA  02111-1307, USA.
18cce7d176Sdrh **
19cce7d176Sdrh ** Author contact information:
20cce7d176Sdrh **   [email protected]
21cce7d176Sdrh **   http://www.hwaci.com/drh/
22cce7d176Sdrh **
23cce7d176Sdrh *************************************************************************
24cce7d176Sdrh ** This file contains C code routines used for processing expressions
25cce7d176Sdrh **
26*fef5208cSdrh ** $Id: expr.c,v 1.7 2000/06/06 01:50:43 drh Exp $
27cce7d176Sdrh */
28cce7d176Sdrh #include "sqliteInt.h"
29cce7d176Sdrh 
30cce7d176Sdrh /*
31*fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
32*fef5208cSdrh ** and 0 if it involves variables.
33*fef5208cSdrh */
34*fef5208cSdrh static int isConstant(Expr *p){
35*fef5208cSdrh   switch( p->op ){
36*fef5208cSdrh     case TK_ID:
37*fef5208cSdrh     case TK_FIELD:
38*fef5208cSdrh     case TK_DOT:
39*fef5208cSdrh       return 0;
40*fef5208cSdrh     default: {
41*fef5208cSdrh       if( p->pLeft && !isConstant(p->pLeft) ) return 0;
42*fef5208cSdrh       if( p->pRight && !isConstant(p->pRight) ) return 0;
43*fef5208cSdrh       if( p->pList ){
44*fef5208cSdrh         int i;
45*fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
46*fef5208cSdrh           if( !isConstant(p->pList->a[i].pExpr) ) return 0;
47*fef5208cSdrh         }
48*fef5208cSdrh       }
49*fef5208cSdrh       break;
50*fef5208cSdrh     }
51*fef5208cSdrh   }
52*fef5208cSdrh   return 1;
53*fef5208cSdrh }
54*fef5208cSdrh 
55*fef5208cSdrh /*
56cce7d176Sdrh ** This routine walks an expression tree and resolves references to
57cce7d176Sdrh ** table fields.  Nodes of the form ID.ID or ID resolve into an
58cce7d176Sdrh ** index to the table in the table list and a field offset.  The opcode
59cce7d176Sdrh ** for such nodes is changed to TK_FIELD.  The iTable value is changed
6019a775c2Sdrh ** to the index of the referenced table in pTabList plus the pParse->nTab
6119a775c2Sdrh ** value.  The iField value is changed to the index of the field of the
6219a775c2Sdrh ** referenced table.
6319a775c2Sdrh **
64*fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
65*fef5208cSdrh ** forms:
66*fef5208cSdrh **
67*fef5208cSdrh **           expr IN (exprlist)
68*fef5208cSdrh ** and
69*fef5208cSdrh **           expr IN (SELECT ...)
70*fef5208cSdrh **
71*fef5208cSdrh ** The first form is handled by creating a set holding the list
72*fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
73*fef5208cSdrh ** a temporary table.
74*fef5208cSdrh **
75*fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
7619a775c2Sdrh ** If it finds any, it generates code to write the value of that select
7719a775c2Sdrh ** into a memory cell.
78cce7d176Sdrh **
79cce7d176Sdrh ** Unknown fields or tables provoke an error.  The function returns
80cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
81cce7d176Sdrh */
82cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
83cce7d176Sdrh   if( pExpr==0 ) return 0;
84cce7d176Sdrh   switch( pExpr->op ){
85cce7d176Sdrh     /* A lone identifier */
86cce7d176Sdrh     case TK_ID: {
87cce7d176Sdrh       int cnt = 0;   /* Number of matches */
88cce7d176Sdrh       int i;         /* Loop counter */
89cce7d176Sdrh       char *z = 0;
90cce7d176Sdrh       sqliteSetNString(&z, pExpr->token.z, pExpr->token.n, 0);
91cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
92cce7d176Sdrh         int j;
93cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
94cce7d176Sdrh         if( pTab==0 ) continue;
95cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
967020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
97cce7d176Sdrh             cnt++;
9819a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
99cce7d176Sdrh             pExpr->iField = j;
100cce7d176Sdrh           }
101cce7d176Sdrh         }
102cce7d176Sdrh       }
103cce7d176Sdrh       sqliteFree(z);
104cce7d176Sdrh       if( cnt==0 ){
105cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
106cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
107cce7d176Sdrh         pParse->nErr++;
108cce7d176Sdrh         return 1;
109cce7d176Sdrh       }else if( cnt>1 ){
110cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
111cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
112cce7d176Sdrh         pParse->nErr++;
113cce7d176Sdrh         return 1;
114cce7d176Sdrh       }
115cce7d176Sdrh       pExpr->op = TK_FIELD;
116cce7d176Sdrh       break;
117cce7d176Sdrh     }
118cce7d176Sdrh 
119cce7d176Sdrh     /* A table name and field name:  ID.ID */
120cce7d176Sdrh     case TK_DOT: {
121cce7d176Sdrh       int cnt = 0;             /* Number of matches */
122cce7d176Sdrh       int i;                   /* Loop counter */
123cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
124cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
125cce7d176Sdrh 
126cce7d176Sdrh       pLeft = pExpr->pLeft;
127cce7d176Sdrh       pRight = pExpr->pRight;
128cce7d176Sdrh       assert( pLeft && pLeft->op==TK_ID );
129cce7d176Sdrh       assert( pRight && pRight->op==TK_ID );
130cce7d176Sdrh       zLeft = 0;
131cce7d176Sdrh       sqliteSetNString(&zLeft, pLeft->token.z, pLeft->token.n, 0);
132cce7d176Sdrh       zRight = 0;
133cce7d176Sdrh       sqliteSetNString(&zRight, pRight->token.z, pRight->token.n, 0);
134cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
135cce7d176Sdrh         int j;
136cce7d176Sdrh         char *zTab;
137cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
138cce7d176Sdrh         if( pTab==0 ) continue;
139cce7d176Sdrh         if( pTabList->a[i].zAlias ){
140cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
141cce7d176Sdrh         }else{
142cce7d176Sdrh           zTab = pTab->zName;
143cce7d176Sdrh         }
144cce7d176Sdrh         if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
145cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
1467020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
147cce7d176Sdrh             cnt++;
14819a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
149cce7d176Sdrh             pExpr->iField = j;
150cce7d176Sdrh           }
151cce7d176Sdrh         }
152cce7d176Sdrh       }
153cce7d176Sdrh       sqliteFree(zLeft);
154cce7d176Sdrh       sqliteFree(zRight);
155cce7d176Sdrh       if( cnt==0 ){
156cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
157cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
158cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
159cce7d176Sdrh         pParse->nErr++;
160cce7d176Sdrh         return 1;
161cce7d176Sdrh       }else if( cnt>1 ){
162cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
163cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
164cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
165cce7d176Sdrh         pParse->nErr++;
166cce7d176Sdrh         return 1;
167cce7d176Sdrh       }
168cce7d176Sdrh       sqliteExprDelete(pLeft);
169cce7d176Sdrh       pExpr->pLeft = 0;
170cce7d176Sdrh       sqliteExprDelete(pRight);
171cce7d176Sdrh       pExpr->pRight = 0;
172cce7d176Sdrh       pExpr->op = TK_FIELD;
173cce7d176Sdrh       break;
174cce7d176Sdrh     }
175cce7d176Sdrh 
176*fef5208cSdrh     case TK_IN: {
177*fef5208cSdrh       Vdbe *v = pParse->pVdbe;
178*fef5208cSdrh       if( v==0 ){
179*fef5208cSdrh         v = pParse->pVdbe = sqliteVdbeCreate(pParse->db->pBe);
180*fef5208cSdrh       }
181*fef5208cSdrh       if( v==0 ) return 1;
182*fef5208cSdrh       if( pExpr->pSelect ){
183*fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
184*fef5208cSdrh         **
185*fef5208cSdrh         ** Generate code to write the results of the select into a temporary
186*fef5208cSdrh         ** table.  The cursor number of the temporary table is stored in
187*fef5208cSdrh         ** iTable.
188*fef5208cSdrh         */
189*fef5208cSdrh         pExpr->iTable = pParse->nTab++;
190*fef5208cSdrh         sqliteVdbeAddOp(v, OP_Open, pExpr->iTable, 0, 0, 0);
191*fef5208cSdrh         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
192*fef5208cSdrh       }else if( pExpr->pList ){
193*fef5208cSdrh         /* Case 2:     expr IN (exprlist)
194*fef5208cSdrh         **
195*fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
196*fef5208cSdrh         ** in iTable.
197*fef5208cSdrh         */
198*fef5208cSdrh         int i, iSet;
199*fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
200*fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
201*fef5208cSdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
202*fef5208cSdrh             return 1;
203*fef5208cSdrh           }
204*fef5208cSdrh           if( !isConstant(pE2) ){
205*fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
206*fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
207*fef5208cSdrh             pParse->nErr++;
208*fef5208cSdrh             return 1;
209*fef5208cSdrh           }
210*fef5208cSdrh         }
211*fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
212*fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
213*fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
214*fef5208cSdrh           switch( pE2->op ){
215*fef5208cSdrh             case TK_FLOAT:
216*fef5208cSdrh             case TK_INTEGER:
217*fef5208cSdrh             case TK_STRING: {
218*fef5208cSdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
219*fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
220*fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
221*fef5208cSdrh               break;
222*fef5208cSdrh             }
223*fef5208cSdrh             default: {
224*fef5208cSdrh               sqliteExprCode(pParse, pE2);
225*fef5208cSdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
226*fef5208cSdrh               break;
227*fef5208cSdrh             }
228*fef5208cSdrh           }
229*fef5208cSdrh         }
230*fef5208cSdrh       }
231*fef5208cSdrh     }
232*fef5208cSdrh 
23319a775c2Sdrh     case TK_SELECT: {
234*fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
235*fef5208cSdrh       ** value of this select in a memory cell and record the number
236*fef5208cSdrh       ** of the memory cell in iField.
237*fef5208cSdrh       */
23819a775c2Sdrh       pExpr->iField = pParse->nMem++;
239*fef5208cSdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iField) ){
24019a775c2Sdrh         return 1;
24119a775c2Sdrh       }
24219a775c2Sdrh       break;
24319a775c2Sdrh     }
24419a775c2Sdrh 
245cce7d176Sdrh     /* For all else, just recursively walk the tree */
246cce7d176Sdrh     default: {
247cce7d176Sdrh       if( pExpr->pLeft
248cce7d176Sdrh             && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
249cce7d176Sdrh         return 1;
250cce7d176Sdrh       }
251cce7d176Sdrh       if( pExpr->pRight
252cce7d176Sdrh             && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){
253cce7d176Sdrh         return 1;
254cce7d176Sdrh       }
255cce7d176Sdrh       if( pExpr->pList ){
256cce7d176Sdrh         int i;
257cce7d176Sdrh         ExprList *pList = pExpr->pList;
258cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
259cce7d176Sdrh           if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){
260cce7d176Sdrh             return 1;
261cce7d176Sdrh           }
262cce7d176Sdrh         }
263cce7d176Sdrh       }
264cce7d176Sdrh     }
265cce7d176Sdrh   }
266cce7d176Sdrh   return 0;
267cce7d176Sdrh }
268cce7d176Sdrh 
269cce7d176Sdrh #if 0 /* NOT USED */
270cce7d176Sdrh /*
271cce7d176Sdrh ** Compare a token against a string.  Return TRUE if they match.
272cce7d176Sdrh */
273cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){
274cce7d176Sdrh   int n = strlen(zStr);
275cce7d176Sdrh   if( n!=pToken->n ) return 0;
276cce7d176Sdrh   return sqliteStrNICmp(pToken->z, zStr, n)==0;
277cce7d176Sdrh }
278cce7d176Sdrh #endif
279cce7d176Sdrh 
280cce7d176Sdrh /*
281cce7d176Sdrh ** Convert a function name into its integer identifier.  Return the
282cce7d176Sdrh ** identifier.  Return FN_Unknown if the function name is unknown.
283cce7d176Sdrh */
284cce7d176Sdrh int sqliteFuncId(Token *pToken){
285cce7d176Sdrh   static const struct {
286cce7d176Sdrh      char *zName;
287cce7d176Sdrh      int len;
288cce7d176Sdrh      int id;
289cce7d176Sdrh   } aFunc[] = {
290cce7d176Sdrh      { "count",  5, FN_Count },
291cce7d176Sdrh      { "min",    3, FN_Min   },
292cce7d176Sdrh      { "max",    3, FN_Max   },
293cce7d176Sdrh      { "sum",    3, FN_Sum   },
294cce7d176Sdrh   };
295cce7d176Sdrh   int i;
296cce7d176Sdrh   for(i=0; i<ArraySize(aFunc); i++){
297cce7d176Sdrh     if( aFunc[i].len==pToken->n
298cce7d176Sdrh      && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
299cce7d176Sdrh        return aFunc[i].id;
300cce7d176Sdrh     }
301cce7d176Sdrh   }
302cce7d176Sdrh   return FN_Unknown;
303cce7d176Sdrh }
304cce7d176Sdrh 
305cce7d176Sdrh /*
306cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
307cce7d176Sdrh ** function names are recognized and all functions have the correct
308cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
309cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
310cce7d176Sdrh **
311cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
312cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
313cce7d176Sdrh */
314cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
315cce7d176Sdrh   int nErr = 0;
316cce7d176Sdrh   if( pExpr==0 ) return 0;
317cce7d176Sdrh   if( pIsAgg ) *pIsAgg = 0;
318cce7d176Sdrh   switch( pExpr->op ){
319cce7d176Sdrh     case TK_FUNCTION: {
320cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
321cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
322cce7d176Sdrh       int no_such_func = 0;
323cce7d176Sdrh       int too_many_args = 0;
324cce7d176Sdrh       int too_few_args = 0;
325cce7d176Sdrh       int is_agg = 0;
326cce7d176Sdrh       int i;
327cce7d176Sdrh       switch( id ){
328cce7d176Sdrh         case FN_Unknown: {
329cce7d176Sdrh           no_such_func = 1;
330cce7d176Sdrh           break;
331cce7d176Sdrh         }
332cce7d176Sdrh         case FN_Count: {
333cce7d176Sdrh           no_such_func = !allowAgg;
334cce7d176Sdrh           too_many_args = n>1;
335cce7d176Sdrh           is_agg = 1;
336cce7d176Sdrh           break;
337cce7d176Sdrh         }
338cce7d176Sdrh         case FN_Max:
339cce7d176Sdrh         case FN_Min: {
340cce7d176Sdrh           too_few_args = allowAgg ? n<1 : n<2;
341cce7d176Sdrh           is_agg = n==1;
342cce7d176Sdrh           break;
343cce7d176Sdrh         }
344cce7d176Sdrh         case FN_Sum: {
345cce7d176Sdrh           no_such_func = !allowAgg;
346cce7d176Sdrh           too_many_args = n>1;
347cce7d176Sdrh           too_few_args = n<1;
348cce7d176Sdrh           is_agg = 1;
349cce7d176Sdrh           break;
350cce7d176Sdrh         }
351cce7d176Sdrh         default: break;
352cce7d176Sdrh       }
353cce7d176Sdrh       if( no_such_func ){
354cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
355cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
356cce7d176Sdrh         pParse->nErr++;
357cce7d176Sdrh         nErr++;
358cce7d176Sdrh       }else if( too_many_args ){
359cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
360cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
361cce7d176Sdrh         pParse->nErr++;
362cce7d176Sdrh         nErr++;
363cce7d176Sdrh       }else if( too_few_args ){
364cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
365cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
366cce7d176Sdrh         pParse->nErr++;
367cce7d176Sdrh         nErr++;
368cce7d176Sdrh       }
369cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
370cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
371cce7d176Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 0, 0);
372cce7d176Sdrh       }
373cce7d176Sdrh     }
374cce7d176Sdrh     default: {
375cce7d176Sdrh       if( pExpr->pLeft ){
376cce7d176Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, 0, 0);
377cce7d176Sdrh       }
378cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
379cce7d176Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, 0, 0);
380cce7d176Sdrh       }
381*fef5208cSdrh       if( nErr==0 && pExpr->pList ){
382*fef5208cSdrh         int n = pExpr->pList->nExpr;
383*fef5208cSdrh         int i;
384*fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
385*fef5208cSdrh           nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 0, 0);
386*fef5208cSdrh         }
387*fef5208cSdrh       }
388cce7d176Sdrh       break;
389cce7d176Sdrh     }
390cce7d176Sdrh   }
391cce7d176Sdrh   return nErr;
392cce7d176Sdrh }
393cce7d176Sdrh 
394cce7d176Sdrh /*
395cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
396cce7d176Sdrh ** expression and leave the result on the stack.
397cce7d176Sdrh */
398cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
399cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
400cce7d176Sdrh   int op;
401cce7d176Sdrh   switch( pExpr->op ){
402cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
403cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
404cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
405cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
406cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
407cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
408cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
409cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
410cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
411cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
412cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
413cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
414cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
415cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
416cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
417cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
418cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
419cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
420cce7d176Sdrh     default: break;
421cce7d176Sdrh   }
422cce7d176Sdrh   switch( pExpr->op ){
423cce7d176Sdrh     case TK_FIELD: {
424cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iField, 0, 0);
425cce7d176Sdrh       break;
426cce7d176Sdrh     }
427cce7d176Sdrh     case TK_INTEGER: {
428cce7d176Sdrh       int i = atoi(pExpr->token.z);
429cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
430cce7d176Sdrh       break;
431cce7d176Sdrh     }
432cce7d176Sdrh     case TK_FLOAT: {
433cce7d176Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
434cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
435cce7d176Sdrh       break;
436cce7d176Sdrh     }
437cce7d176Sdrh     case TK_STRING: {
438cce7d176Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
439cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
440cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
441cce7d176Sdrh       break;
442cce7d176Sdrh     }
443cce7d176Sdrh     case TK_NULL: {
444c61053b7Sdrh       sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
445cce7d176Sdrh       break;
446cce7d176Sdrh     }
447cce7d176Sdrh     case TK_AND:
448cce7d176Sdrh     case TK_OR:
449cce7d176Sdrh     case TK_PLUS:
450cce7d176Sdrh     case TK_STAR:
451cce7d176Sdrh     case TK_MINUS:
452cce7d176Sdrh     case TK_SLASH: {
453cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
454cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
455cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
456cce7d176Sdrh       break;
457cce7d176Sdrh     }
458cce7d176Sdrh     case TK_LT:
459cce7d176Sdrh     case TK_LE:
460cce7d176Sdrh     case TK_GT:
461cce7d176Sdrh     case TK_GE:
462cce7d176Sdrh     case TK_NE:
463cce7d176Sdrh     case TK_EQ:
464cce7d176Sdrh     case TK_LIKE:
465cce7d176Sdrh     case TK_GLOB: {
466cce7d176Sdrh       int dest;
467cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
468cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
469cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
470cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
471cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
472cce7d176Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
473cce7d176Sdrh       break;
474cce7d176Sdrh     }
475cce7d176Sdrh     case TK_NOT:
476cce7d176Sdrh     case TK_UMINUS: {
477cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
478cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
479cce7d176Sdrh       break;
480cce7d176Sdrh     }
481cce7d176Sdrh     case TK_ISNULL:
482cce7d176Sdrh     case TK_NOTNULL: {
483cce7d176Sdrh       int dest;
4848be51133Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
485cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
486cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
487cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
4888be51133Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
489cce7d176Sdrh       break;
490cce7d176Sdrh     }
491cce7d176Sdrh     case TK_FUNCTION: {
492cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
493cce7d176Sdrh       int op;
494cce7d176Sdrh       int i;
495cce7d176Sdrh       ExprList *pList = pExpr->pList;
496cce7d176Sdrh       op = id==FN_Min ? OP_Min : OP_Max;
497cce7d176Sdrh       for(i=0; i<pList->nExpr; i++){
498cce7d176Sdrh         sqliteExprCode(pParse, pList->a[i].pExpr);
499cce7d176Sdrh         if( i>0 ){
500cce7d176Sdrh           sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
501cce7d176Sdrh         }
502cce7d176Sdrh       }
503cce7d176Sdrh       break;
504cce7d176Sdrh     }
50519a775c2Sdrh     case TK_SELECT: {
50619a775c2Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iField, 0, 0, 0);
50719a775c2Sdrh       break;
50819a775c2Sdrh     }
509*fef5208cSdrh     case TK_IN: {
510*fef5208cSdrh       int addr;
511*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
512*fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
513*fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
514*fef5208cSdrh       if( pExpr->pSelect ){
515*fef5208cSdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0);
516*fef5208cSdrh       }else{
517*fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0);
518*fef5208cSdrh       }
519*fef5208cSdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0);
520*fef5208cSdrh       break;
521*fef5208cSdrh     }
522*fef5208cSdrh     case TK_BETWEEN: {
523*fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
524*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
525*fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
526*fef5208cSdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0);
527*fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
528*fef5208cSdrh       break;
529*fef5208cSdrh     }
530cce7d176Sdrh   }
531cce7d176Sdrh   return;
532cce7d176Sdrh }
533cce7d176Sdrh 
534cce7d176Sdrh /*
535cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
536cce7d176Sdrh ** to the label "dest" if the expression is true but execution
537cce7d176Sdrh ** continues straight thru if the expression is false.
538cce7d176Sdrh */
539cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
540cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
541cce7d176Sdrh   int op = 0;
542cce7d176Sdrh   switch( pExpr->op ){
543cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
544cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
545cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
546cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
547cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
548cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
549cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
550cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
551cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
552cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
553cce7d176Sdrh     default:  break;
554cce7d176Sdrh   }
555cce7d176Sdrh   switch( pExpr->op ){
556cce7d176Sdrh     case TK_AND: {
557cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
558cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
559cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
560cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
561cce7d176Sdrh       break;
562cce7d176Sdrh     }
563cce7d176Sdrh     case TK_OR: {
564cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
565cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
566cce7d176Sdrh       break;
567cce7d176Sdrh     }
568cce7d176Sdrh     case TK_NOT: {
569cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
570cce7d176Sdrh       break;
571cce7d176Sdrh     }
572cce7d176Sdrh     case TK_LT:
573cce7d176Sdrh     case TK_LE:
574cce7d176Sdrh     case TK_GT:
575cce7d176Sdrh     case TK_GE:
576cce7d176Sdrh     case TK_NE:
577cce7d176Sdrh     case TK_EQ:
578cce7d176Sdrh     case TK_LIKE:
579cce7d176Sdrh     case TK_GLOB: {
580cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
581cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
582cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
583cce7d176Sdrh       break;
584cce7d176Sdrh     }
585cce7d176Sdrh     case TK_ISNULL:
586cce7d176Sdrh     case TK_NOTNULL: {
587cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
588cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
589cce7d176Sdrh       break;
590cce7d176Sdrh     }
591*fef5208cSdrh     case TK_IN: {
592*fef5208cSdrh       if( pExpr->pSelect ){
593*fef5208cSdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0);
594*fef5208cSdrh       }else{
595*fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0);
596*fef5208cSdrh       }
597*fef5208cSdrh       break;
598*fef5208cSdrh     }
599*fef5208cSdrh     case TK_BETWEEN: {
600*fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
601*fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
602*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
603*fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
604*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0);
605*fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
606*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0);
607*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
608*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl);
609*fef5208cSdrh       break;
610*fef5208cSdrh     }
611cce7d176Sdrh     default: {
612cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
613cce7d176Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
614cce7d176Sdrh       break;
615cce7d176Sdrh     }
616cce7d176Sdrh   }
617cce7d176Sdrh }
618cce7d176Sdrh 
619cce7d176Sdrh /*
620cce7d176Sdrh ** Generate code for boolean expression such that a jump is made
621cce7d176Sdrh ** to the label "dest" if the expression is false but execution
622cce7d176Sdrh ** continues straight thru if the expression is true.
623cce7d176Sdrh */
624cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
625cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
626cce7d176Sdrh   int op = 0;
627cce7d176Sdrh   switch( pExpr->op ){
628cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
629cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
630cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
631cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
632cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
633cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
634cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
635cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
636cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
637cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
638cce7d176Sdrh     default:  break;
639cce7d176Sdrh   }
640cce7d176Sdrh   switch( pExpr->op ){
641cce7d176Sdrh     case TK_AND: {
642cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
643cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
644cce7d176Sdrh       break;
645cce7d176Sdrh     }
646cce7d176Sdrh     case TK_OR: {
647cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
648cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
649cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
650cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
651cce7d176Sdrh       break;
652cce7d176Sdrh     }
653cce7d176Sdrh     case TK_NOT: {
654cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
655cce7d176Sdrh       break;
656cce7d176Sdrh     }
657cce7d176Sdrh     case TK_LT:
658cce7d176Sdrh     case TK_LE:
659cce7d176Sdrh     case TK_GT:
660cce7d176Sdrh     case TK_GE:
661cce7d176Sdrh     case TK_NE:
662cce7d176Sdrh     case TK_EQ: {
663cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
664cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
665cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
666cce7d176Sdrh       break;
667cce7d176Sdrh     }
668cce7d176Sdrh     case TK_LIKE:
669cce7d176Sdrh     case TK_GLOB: {
670cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
671cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
672cce7d176Sdrh       sqliteVdbeAddOp(v, op, 1, dest, 0, 0);
673cce7d176Sdrh       break;
674cce7d176Sdrh     }
675cce7d176Sdrh     case TK_ISNULL:
676cce7d176Sdrh     case TK_NOTNULL: {
677cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
678cce7d176Sdrh       sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
679cce7d176Sdrh       break;
680cce7d176Sdrh     }
681*fef5208cSdrh     case TK_IN: {
682*fef5208cSdrh       if( pExpr->pSelect ){
683*fef5208cSdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0);
684*fef5208cSdrh       }else{
685*fef5208cSdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0);
686*fef5208cSdrh       }
687*fef5208cSdrh       break;
688*fef5208cSdrh     }
689*fef5208cSdrh     case TK_BETWEEN: {
690*fef5208cSdrh       int addr;
691*fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
692*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
693*fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
694*fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
695*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0);
696*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0);
697*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0);
698*fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
699*fef5208cSdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0);
700*fef5208cSdrh       break;
701*fef5208cSdrh     }
702cce7d176Sdrh     default: {
703cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
704cce7d176Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0);
705cce7d176Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
706cce7d176Sdrh       break;
707cce7d176Sdrh     }
708cce7d176Sdrh   }
709cce7d176Sdrh }
710