xref: /sqlite-3.40.0/src/expr.c (revision 461c281a)
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*461c281aSdrh ** $Id: expr.c,v 1.65 2002/05/30 02:35:12 drh Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
18cce7d176Sdrh 
19a2e00042Sdrh 
20a2e00042Sdrh /*
21a76b5dfcSdrh ** Construct a new expression node and return a pointer to it.  Memory
22a76b5dfcSdrh ** for this node is obtained from sqliteMalloc().  The calling function
23a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed.
24a76b5dfcSdrh */
25a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
26a76b5dfcSdrh   Expr *pNew;
27a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
28a76b5dfcSdrh   if( pNew==0 ){
29a76b5dfcSdrh     sqliteExprDelete(pLeft);
30a76b5dfcSdrh     sqliteExprDelete(pRight);
31a76b5dfcSdrh     return 0;
32a76b5dfcSdrh   }
33a76b5dfcSdrh   pNew->op = op;
34a76b5dfcSdrh   pNew->pLeft = pLeft;
35a76b5dfcSdrh   pNew->pRight = pRight;
36a76b5dfcSdrh   if( pToken ){
37a76b5dfcSdrh     pNew->token = *pToken;
38a76b5dfcSdrh   }else{
39a76b5dfcSdrh     pNew->token.z = 0;
40a76b5dfcSdrh     pNew->token.n = 0;
41a76b5dfcSdrh   }
42a76b5dfcSdrh   if( pLeft && pRight ){
43a76b5dfcSdrh     sqliteExprSpan(pNew, &pLeft->span, &pRight->span);
44a76b5dfcSdrh   }else{
45a76b5dfcSdrh     pNew->span = pNew->token;
46a76b5dfcSdrh   }
47a76b5dfcSdrh   return pNew;
48a76b5dfcSdrh }
49a76b5dfcSdrh 
50a76b5dfcSdrh /*
51a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all
52a76b5dfcSdrh ** text between the two given tokens.
53a76b5dfcSdrh */
54a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
55a76b5dfcSdrh   if( pExpr ){
56a76b5dfcSdrh     pExpr->span.z = pLeft->z;
57a76b5dfcSdrh     pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
58a76b5dfcSdrh   }
59a76b5dfcSdrh }
60a76b5dfcSdrh 
61a76b5dfcSdrh /*
62a76b5dfcSdrh ** Construct a new expression node for a function with multiple
63a76b5dfcSdrh ** arguments.
64a76b5dfcSdrh */
65a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){
66a76b5dfcSdrh   Expr *pNew;
67a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
68a76b5dfcSdrh   if( pNew==0 ){
69a76b5dfcSdrh     sqliteExprListDelete(pList);
70a76b5dfcSdrh     return 0;
71a76b5dfcSdrh   }
72a76b5dfcSdrh   pNew->op = TK_FUNCTION;
73a76b5dfcSdrh   pNew->pList = pList;
74a76b5dfcSdrh   if( pToken ){
75a76b5dfcSdrh     pNew->token = *pToken;
76a76b5dfcSdrh   }else{
77a76b5dfcSdrh     pNew->token.z = 0;
78a76b5dfcSdrh     pNew->token.n = 0;
79a76b5dfcSdrh   }
80a76b5dfcSdrh   return pNew;
81a76b5dfcSdrh }
82a76b5dfcSdrh 
83a76b5dfcSdrh /*
84a2e00042Sdrh ** Recursively delete an expression tree.
85a2e00042Sdrh */
86a2e00042Sdrh void sqliteExprDelete(Expr *p){
87a2e00042Sdrh   if( p==0 ) return;
88a2e00042Sdrh   if( p->pLeft ) sqliteExprDelete(p->pLeft);
89a2e00042Sdrh   if( p->pRight ) sqliteExprDelete(p->pRight);
90a2e00042Sdrh   if( p->pList ) sqliteExprListDelete(p->pList);
91a2e00042Sdrh   if( p->pSelect ) sqliteSelectDelete(p->pSelect);
92a2e00042Sdrh   sqliteFree(p);
93a2e00042Sdrh }
94a2e00042Sdrh 
95cce7d176Sdrh /*
96a76b5dfcSdrh ** The following group of functions are used to translate the string
97a76b5dfcSdrh ** pointers of tokens in expression from one buffer to another.
98a76b5dfcSdrh **
99a76b5dfcSdrh ** Normally, the Expr.token.z and Expr.span.z fields point into the
100a76b5dfcSdrh ** original input buffer of an SQL statement.  This is usually OK
101a76b5dfcSdrh ** since the SQL statement is executed and the expression is deleted
102a76b5dfcSdrh ** before the input buffer is freed.  Making the tokens point to the
103a76b5dfcSdrh ** original input buffer saves many calls to malloc() and thus helps
104a76b5dfcSdrh ** the library to run faster.
105a76b5dfcSdrh **
106a76b5dfcSdrh ** But sometimes we need an expression to persist past the time when
107a76b5dfcSdrh ** the input buffer is freed.  (Example: The SELECT clause of a
108a76b5dfcSdrh ** CREATE VIEW statement contains expressions that must persist for
109a76b5dfcSdrh ** the life of the view.)  When that happens we have to make a
110a76b5dfcSdrh ** persistent copy of the input buffer and translate the Expr.token.z
111a76b5dfcSdrh ** and Expr.span.z fields to point to the copy rather than the
112a2ed5601Sdrh ** original input buffer.  The following group of routines handle that
113a76b5dfcSdrh ** translation.
114a76b5dfcSdrh **
115a76b5dfcSdrh ** The "offset" parameter is the distance from the original input buffer
116a76b5dfcSdrh ** to the persistent copy.  These routines recursively walk the entire
117a76b5dfcSdrh ** expression tree and shift all tokens by "offset" amount.
118a76b5dfcSdrh **
119a76b5dfcSdrh ** The work of figuring out the appropriate "offset" and making the
120a76b5dfcSdrh ** presistent copy of the input buffer is done by the calling routine.
121a76b5dfcSdrh */
122a76b5dfcSdrh void sqliteExprMoveStrings(Expr *p, int offset){
123a76b5dfcSdrh   if( p==0 ) return;
124a76b5dfcSdrh   if( p->token.z ) p->token.z += offset;
125a76b5dfcSdrh   if( p->span.z ) p->span.z += offset;
126a76b5dfcSdrh   if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset);
127a76b5dfcSdrh   if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset);
128a76b5dfcSdrh   if( p->pList ) sqliteExprListMoveStrings(p->pList, offset);
129a76b5dfcSdrh   if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset);
130a76b5dfcSdrh }
131a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){
132a76b5dfcSdrh   int i;
133a76b5dfcSdrh   if( pList==0 ) return;
134a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
135a76b5dfcSdrh     sqliteExprMoveStrings(pList->a[i].pExpr, offset);
136a76b5dfcSdrh   }
137a76b5dfcSdrh }
138a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){
139a76b5dfcSdrh   if( pSelect==0 ) return;
140a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pEList, offset);
141a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pWhere, offset);
142a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pGroupBy, offset);
143a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pHaving, offset);
144a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pOrderBy, offset);
145a76b5dfcSdrh   sqliteSelectMoveStrings(pSelect->pPrior, offset);
146a76b5dfcSdrh }
147a76b5dfcSdrh 
148a76b5dfcSdrh /*
149ff78bd2fSdrh ** The following group of routines make deep copies of expressions,
150ff78bd2fSdrh ** expression lists, ID lists, and select statements.  The copies can
151ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines)
152ff78bd2fSdrh ** without effecting the originals.
153ff78bd2fSdrh **
154ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to
155ff78bd2fSdrh ** string space that is allocated separately from the expression tree
156ff78bd2fSdrh ** itself.  These routines do NOT duplicate that string space.
157ff78bd2fSdrh **
158ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(),
159ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded
160ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines.
161ff78bd2fSdrh **
162ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated.
163ff78bd2fSdrh */
164ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){
165ff78bd2fSdrh   Expr *pNew;
166ff78bd2fSdrh   if( p==0 ) return 0;
167ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
168ff78bd2fSdrh   if( pNew==0 ) return 0;
169ff78bd2fSdrh   pNew->op = p->op;
170ff78bd2fSdrh   pNew->pLeft = sqliteExprDup(p->pLeft);
171ff78bd2fSdrh   pNew->pRight = sqliteExprDup(p->pRight);
172ff78bd2fSdrh   pNew->pList = sqliteExprListDup(p->pList);
173832508b7Sdrh   pNew->iTable = p->iTable;
174832508b7Sdrh   pNew->iColumn = p->iColumn;
175832508b7Sdrh   pNew->iAgg = p->iAgg;
176ff78bd2fSdrh   pNew->token = p->token;
177ff78bd2fSdrh   pNew->span = p->span;
178ff78bd2fSdrh   pNew->pSelect = sqliteSelectDup(p->pSelect);
179ff78bd2fSdrh   return pNew;
180ff78bd2fSdrh }
181ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){
182ff78bd2fSdrh   ExprList *pNew;
183ff78bd2fSdrh   int i;
184ff78bd2fSdrh   if( p==0 ) return 0;
185ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
186ff78bd2fSdrh   if( pNew==0 ) return 0;
187ff78bd2fSdrh   pNew->nExpr = p->nExpr;
188ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
189e4697f5eSdrh   if( pNew->a==0 ) return 0;
190ff78bd2fSdrh   for(i=0; i<p->nExpr; i++){
191ff78bd2fSdrh     pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr);
192ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
193ff78bd2fSdrh     pNew->a[i].sortOrder = p->a[i].sortOrder;
194ff78bd2fSdrh     pNew->a[i].isAgg = p->a[i].isAgg;
195ff78bd2fSdrh     pNew->a[i].done = 0;
196ff78bd2fSdrh   }
197ff78bd2fSdrh   return pNew;
198ff78bd2fSdrh }
199ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){
200ad3cab52Sdrh   SrcList *pNew;
201ad3cab52Sdrh   int i;
202ad3cab52Sdrh   if( p==0 ) return 0;
203ad3cab52Sdrh   pNew = sqliteMalloc( sizeof(*pNew) );
204ad3cab52Sdrh   if( pNew==0 ) return 0;
205ad3cab52Sdrh   pNew->nSrc = p->nSrc;
206ad3cab52Sdrh   pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) );
207ad3cab52Sdrh   if( pNew->a==0 ) return 0;
208ad3cab52Sdrh   for(i=0; i<p->nSrc; i++){
209ad3cab52Sdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
210ad3cab52Sdrh     pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias);
211ad3cab52Sdrh     pNew->a[i].jointype = p->a[i].jointype;
212ad3cab52Sdrh     pNew->a[i].pTab = 0;
213ad3cab52Sdrh     pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect);
214ad3cab52Sdrh     pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn);
215ad3cab52Sdrh     pNew->a[i].pUsing = sqliteIdListDup(p->a[i].pUsing);
216ad3cab52Sdrh   }
217ad3cab52Sdrh   return pNew;
218ad3cab52Sdrh }
219ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){
220ff78bd2fSdrh   IdList *pNew;
221ff78bd2fSdrh   int i;
222ff78bd2fSdrh   if( p==0 ) return 0;
223ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
224ff78bd2fSdrh   if( pNew==0 ) return 0;
225ff78bd2fSdrh   pNew->nId = p->nId;
226ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) );
227e4697f5eSdrh   if( pNew->a==0 ) return 0;
228ff78bd2fSdrh   for(i=0; i<p->nId; i++){
229ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
230ff78bd2fSdrh     pNew->a[i].idx = p->a[i].idx;
231ff78bd2fSdrh   }
232ff78bd2fSdrh   return pNew;
233ff78bd2fSdrh }
234ff78bd2fSdrh Select *sqliteSelectDup(Select *p){
235ff78bd2fSdrh   Select *pNew;
236ff78bd2fSdrh   if( p==0 ) return 0;
237ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
238ff78bd2fSdrh   if( pNew==0 ) return 0;
239ff78bd2fSdrh   pNew->isDistinct = p->isDistinct;
240ff78bd2fSdrh   pNew->pEList = sqliteExprListDup(p->pEList);
241ad3cab52Sdrh   pNew->pSrc = sqliteSrcListDup(p->pSrc);
242ff78bd2fSdrh   pNew->pWhere = sqliteExprDup(p->pWhere);
243ff78bd2fSdrh   pNew->pGroupBy = sqliteExprListDup(p->pGroupBy);
244ff78bd2fSdrh   pNew->pHaving = sqliteExprDup(p->pHaving);
245ff78bd2fSdrh   pNew->pOrderBy = sqliteExprListDup(p->pOrderBy);
246ff78bd2fSdrh   pNew->op = p->op;
247ff78bd2fSdrh   pNew->pPrior = sqliteSelectDup(p->pPrior);
248ff78bd2fSdrh   pNew->nLimit = p->nLimit;
249ff78bd2fSdrh   pNew->nOffset = p->nOffset;
250ff78bd2fSdrh   pNew->zSelect = 0;
251ff78bd2fSdrh   return pNew;
252ff78bd2fSdrh }
253ff78bd2fSdrh 
254ff78bd2fSdrh 
255ff78bd2fSdrh /*
256a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
257a76b5dfcSdrh ** initially NULL, then create a new expression list.
258a76b5dfcSdrh */
259a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
260a76b5dfcSdrh   int i;
261a76b5dfcSdrh   if( pList==0 ){
262a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
263a76b5dfcSdrh     if( pList==0 ){
264a76b5dfcSdrh       sqliteExprDelete(pExpr);
265a76b5dfcSdrh       return 0;
266a76b5dfcSdrh     }
267a76b5dfcSdrh   }
268a76b5dfcSdrh   if( (pList->nExpr & 7)==0 ){
269a76b5dfcSdrh     int n = pList->nExpr + 8;
270a76b5dfcSdrh     struct ExprList_item *a;
271a76b5dfcSdrh     a = sqliteRealloc(pList->a, n*sizeof(pList->a[0]));
272a76b5dfcSdrh     if( a==0 ){
273a76b5dfcSdrh       sqliteExprDelete(pExpr);
274a76b5dfcSdrh       return pList;
275a76b5dfcSdrh     }
276a76b5dfcSdrh     pList->a = a;
277a76b5dfcSdrh   }
278a76b5dfcSdrh   if( pExpr || pName ){
279a76b5dfcSdrh     i = pList->nExpr++;
280a76b5dfcSdrh     pList->a[i].pExpr = pExpr;
281a76b5dfcSdrh     pList->a[i].zName = 0;
282a76b5dfcSdrh     if( pName ){
283a76b5dfcSdrh       sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0);
284a76b5dfcSdrh       sqliteDequote(pList->a[i].zName);
285a76b5dfcSdrh     }
286a76b5dfcSdrh   }
287a76b5dfcSdrh   return pList;
288a76b5dfcSdrh }
289a76b5dfcSdrh 
290a76b5dfcSdrh /*
291a76b5dfcSdrh ** Delete an entire expression list.
292a76b5dfcSdrh */
293a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){
294a76b5dfcSdrh   int i;
295a76b5dfcSdrh   if( pList==0 ) return;
296a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
297a76b5dfcSdrh     sqliteExprDelete(pList->a[i].pExpr);
298a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
299a76b5dfcSdrh   }
300a76b5dfcSdrh   sqliteFree(pList->a);
301a76b5dfcSdrh   sqliteFree(pList);
302a76b5dfcSdrh }
303a76b5dfcSdrh 
304a76b5dfcSdrh /*
305fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
306fef5208cSdrh ** and 0 if it involves variables.
3072398937bSdrh **
3082398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc")
3092398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is
3102398937bSdrh ** a constant.
311fef5208cSdrh */
3129208643dSdrh int sqliteExprIsConstant(Expr *p){
313fef5208cSdrh   switch( p->op ){
314fef5208cSdrh     case TK_ID:
315967e8b73Sdrh     case TK_COLUMN:
316fef5208cSdrh     case TK_DOT:
317fef5208cSdrh       return 0;
3182398937bSdrh     case TK_STRING:
3192398937bSdrh       return p->token.z[0]=='\'';
3209208643dSdrh     case TK_INTEGER:
3219208643dSdrh     case TK_FLOAT:
3229208643dSdrh       return 1;
323fef5208cSdrh     default: {
3249208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
3259208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
326fef5208cSdrh       if( p->pList ){
327fef5208cSdrh         int i;
328fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
3299208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
330fef5208cSdrh         }
331fef5208cSdrh       }
3329208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
333fef5208cSdrh     }
334fef5208cSdrh   }
3359208643dSdrh   return 0;
336fef5208cSdrh }
337fef5208cSdrh 
338fef5208cSdrh /*
339c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
340c4a3c779Sdrh */
341c4a3c779Sdrh static int sqliteIsRowid(const char *z){
342c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
343c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
344c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
345c4a3c779Sdrh   return 0;
346c4a3c779Sdrh }
347c4a3c779Sdrh 
348c4a3c779Sdrh /*
349cce7d176Sdrh ** This routine walks an expression tree and resolves references to
350967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
351aacc543eSdrh ** index to the table in the table list and a column offset.  The
352aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
353aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
354832508b7Sdrh ** plus the "base" value.  The base value will ultimately become the
355aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
356aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
357aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
358aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
359aacc543eSdrh ** alias for ROWID.
36019a775c2Sdrh **
361fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
362fef5208cSdrh ** forms:
363fef5208cSdrh **
364fef5208cSdrh **           expr IN (exprlist)
365fef5208cSdrh ** and
366fef5208cSdrh **           expr IN (SELECT ...)
367fef5208cSdrh **
368fef5208cSdrh ** The first form is handled by creating a set holding the list
369fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
370fef5208cSdrh ** a temporary table.
371fef5208cSdrh **
372fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
37319a775c2Sdrh ** If it finds any, it generates code to write the value of that select
37419a775c2Sdrh ** into a memory cell.
375cce7d176Sdrh **
376967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
377cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
378cce7d176Sdrh */
379a2e00042Sdrh int sqliteExprResolveIds(
380a2e00042Sdrh   Parse *pParse,     /* The parser context */
381832508b7Sdrh   int base,          /* VDBE cursor number for first entry in pTabList */
382ad3cab52Sdrh   SrcList *pTabList, /* List of tables used to resolve column names */
383a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
384a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
385a2e00042Sdrh ){
386daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
387ad3cab52Sdrh   assert( base+pTabList->nSrc<=pParse->nTab );
388cce7d176Sdrh   switch( pExpr->op ){
3892398937bSdrh     /* Double-quoted strings (ex: "abc") are used as identifiers if
3902398937bSdrh     ** possible.  Otherwise they remain as strings.  Single-quoted
3912398937bSdrh     ** strings (ex: 'abc') are always string literals.
3922398937bSdrh     */
3932398937bSdrh     case TK_STRING: {
3942398937bSdrh       if( pExpr->token.z[0]=='\'' ) break;
3952398937bSdrh       /* Fall thru into the TK_ID case if this is a double-quoted string */
3962398937bSdrh     }
397a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
398a2e00042Sdrh     **
399a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
400a2e00042Sdrh     **
401a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
402a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
403a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
404a2e00042Sdrh     **
405a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
406a2e00042Sdrh     */
407cce7d176Sdrh     case TK_ID: {
408cce7d176Sdrh       int cnt = 0;      /* Number of matches */
409cce7d176Sdrh       int i;            /* Loop counter */
410a76b5dfcSdrh       char *z;
411a76b5dfcSdrh       assert( pExpr->token.z );
412a76b5dfcSdrh       z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
4132f4392ffSdrh       sqliteDequote(z);
414daffd0e5Sdrh       if( z==0 ) return 1;
415ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
416cce7d176Sdrh         int j;
417cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
418cce7d176Sdrh         if( pTab==0 ) continue;
419417be79cSdrh         assert( pTab->nCol>0 );
420cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
4217020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
422cce7d176Sdrh             cnt++;
423832508b7Sdrh             pExpr->iTable = i + base;
4244a32431cSdrh             if( j==pTab->iPKey ){
4254a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
4264a32431cSdrh               pExpr->iColumn = -1;
4274a32431cSdrh             }else{
428967e8b73Sdrh               pExpr->iColumn = j;
429cce7d176Sdrh             }
430a2e00042Sdrh             pExpr->op = TK_COLUMN;
431a2e00042Sdrh           }
432a2e00042Sdrh         }
433a2e00042Sdrh       }
434a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
435a2e00042Sdrh         int j;
436a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
437a2e00042Sdrh           char *zAs = pEList->a[j].zName;
438a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
439a2e00042Sdrh             cnt++;
440a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
441a2e00042Sdrh             pExpr->op = TK_AS;
442a2e00042Sdrh             pExpr->iColumn = j;
44375148a27Sdrh             pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr);
444cce7d176Sdrh           }
445cce7d176Sdrh         }
4464a32431cSdrh       }
447c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
448c4a3c779Sdrh         pExpr->iColumn = -1;
449832508b7Sdrh         pExpr->iTable = base;
450ad3cab52Sdrh         cnt = 1 + (pTabList->nSrc>1);
451a2e00042Sdrh         pExpr->op = TK_COLUMN;
452c4a3c779Sdrh       }
453cce7d176Sdrh       sqliteFree(z);
4542398937bSdrh       if( cnt==0 && pExpr->token.z[0]!='"' ){
455967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
456cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
457cce7d176Sdrh         pParse->nErr++;
458cce7d176Sdrh         return 1;
459cce7d176Sdrh       }else if( cnt>1 ){
460967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
461cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
462cce7d176Sdrh         pParse->nErr++;
463cce7d176Sdrh         return 1;
464cce7d176Sdrh       }
465cce7d176Sdrh       break;
466cce7d176Sdrh     }
467cce7d176Sdrh 
468967e8b73Sdrh     /* A table name and column name:  ID.ID */
469cce7d176Sdrh     case TK_DOT: {
470cce7d176Sdrh       int cnt = 0;             /* Number of matches */
471c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
472cce7d176Sdrh       int i;                   /* Loop counter */
473cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
474cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
475cce7d176Sdrh 
476cce7d176Sdrh       pLeft = pExpr->pLeft;
477cce7d176Sdrh       pRight = pExpr->pRight;
478a76b5dfcSdrh       assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );
479a76b5dfcSdrh       assert( pRight && pRight->op==TK_ID && pRight->token.z );
4806e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
4816e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
482daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
483daffd0e5Sdrh         sqliteFree(zLeft);
484daffd0e5Sdrh         sqliteFree(zRight);
485daffd0e5Sdrh         return 1;
486daffd0e5Sdrh       }
48787c40e88Sdrh       sqliteDequote(zLeft);
48887c40e88Sdrh       sqliteDequote(zRight);
489c4a3c779Sdrh       pExpr->iTable = -1;
490ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
491cce7d176Sdrh         int j;
492cce7d176Sdrh         char *zTab;
493cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
494cce7d176Sdrh         if( pTab==0 ) continue;
495417be79cSdrh         assert( pTab->nCol>0 );
496cce7d176Sdrh         if( pTabList->a[i].zAlias ){
497cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
498cce7d176Sdrh         }else{
499cce7d176Sdrh           zTab = pTab->zName;
500cce7d176Sdrh         }
501094b2bbfSdrh         if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue;
502832508b7Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + base;
503cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
5047020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
505cce7d176Sdrh             cnt++;
506832508b7Sdrh             pExpr->iTable = i + base;
5074a32431cSdrh             if( j==pTab->iPKey ){
5084a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
5094a32431cSdrh               pExpr->iColumn = -1;
5104a32431cSdrh             }else{
511967e8b73Sdrh               pExpr->iColumn = j;
512cce7d176Sdrh             }
513cce7d176Sdrh           }
514cce7d176Sdrh         }
5154a32431cSdrh       }
516c3f9bad2Sdanielk1977 
517c3f9bad2Sdanielk1977       /* If we have not already resolved this *.* expression, then maybe
518c3f9bad2Sdanielk1977        * it is a new.* or old.* trigger argument reference */
519c3f9bad2Sdanielk1977       if( cnt == 0 && pParse->trigStack != 0 ){
520f29ce559Sdanielk1977         TriggerStack *pTriggerStack = pParse->trigStack;
521c3f9bad2Sdanielk1977         int t = 0;
522f29ce559Sdanielk1977         if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){
523f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->newIdx;
524c3f9bad2Sdanielk1977           cntTab++;
525c3f9bad2Sdanielk1977           t = 1;
526c3f9bad2Sdanielk1977         }
527f29ce559Sdanielk1977         if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){
528f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->oldIdx;
529c3f9bad2Sdanielk1977           cntTab++;
530c3f9bad2Sdanielk1977           t = 1;
531c3f9bad2Sdanielk1977         }
532c3f9bad2Sdanielk1977 
533f29ce559Sdanielk1977         if( t ){
534f29ce559Sdanielk1977 	  int j;
535f29ce559Sdanielk1977           for(j=0; j < pTriggerStack->pTab->nCol; j++) {
536f29ce559Sdanielk1977             if( sqliteStrICmp(pTriggerStack->pTab->aCol[j].zName, zRight)==0 ){
537c3f9bad2Sdanielk1977               cnt++;
538c3f9bad2Sdanielk1977               pExpr->iColumn = j;
539c3f9bad2Sdanielk1977             }
540c3f9bad2Sdanielk1977           }
541c3f9bad2Sdanielk1977 	}
542f29ce559Sdanielk1977       }
543c3f9bad2Sdanielk1977 
544c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
545c4a3c779Sdrh         cnt = 1;
546c4a3c779Sdrh         pExpr->iColumn = -1;
547c4a3c779Sdrh       }
548cce7d176Sdrh       sqliteFree(zLeft);
549cce7d176Sdrh       sqliteFree(zRight);
550cce7d176Sdrh       if( cnt==0 ){
551967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
552cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
553cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
554cce7d176Sdrh         pParse->nErr++;
555cce7d176Sdrh         return 1;
556cce7d176Sdrh       }else if( cnt>1 ){
557967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
558cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
559cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
560cce7d176Sdrh         pParse->nErr++;
561cce7d176Sdrh         return 1;
562cce7d176Sdrh       }
563cce7d176Sdrh       sqliteExprDelete(pLeft);
564cce7d176Sdrh       pExpr->pLeft = 0;
565cce7d176Sdrh       sqliteExprDelete(pRight);
566cce7d176Sdrh       pExpr->pRight = 0;
567967e8b73Sdrh       pExpr->op = TK_COLUMN;
568cce7d176Sdrh       break;
569cce7d176Sdrh     }
570cce7d176Sdrh 
571fef5208cSdrh     case TK_IN: {
572d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
573fef5208cSdrh       if( v==0 ) return 1;
574832508b7Sdrh       if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
575cfab11bcSdrh         return 1;
576cfab11bcSdrh       }
577fef5208cSdrh       if( pExpr->pSelect ){
578fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
579fef5208cSdrh         **
580fef5208cSdrh         ** Generate code to write the results of the select into a temporary
5814794b980Sdrh         ** table.  The cursor number of the temporary table has already
5824794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
583fef5208cSdrh         */
584832508b7Sdrh         pExpr->iTable = pParse->nTab++;
585c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
586832508b7Sdrh         sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0);
587fef5208cSdrh       }else if( pExpr->pList ){
588fef5208cSdrh         /* Case 2:     expr IN (exprlist)
589fef5208cSdrh         **
590fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
591fef5208cSdrh         ** in iTable.
592fef5208cSdrh         */
593fef5208cSdrh         int i, iSet;
594fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
595fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
5969208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
597fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
598fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
599fef5208cSdrh             pParse->nErr++;
600fef5208cSdrh             return 1;
601fef5208cSdrh           }
6024794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
6034794b980Sdrh             return 1;
6044794b980Sdrh           }
605fef5208cSdrh         }
606fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
607fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
608fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
609fef5208cSdrh           switch( pE2->op ){
610fef5208cSdrh             case TK_FLOAT:
611fef5208cSdrh             case TK_INTEGER:
612fef5208cSdrh             case TK_STRING: {
61399fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
614a76b5dfcSdrh               assert( pE2->token.z );
615fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
616fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
617fef5208cSdrh               break;
618fef5208cSdrh             }
619fef5208cSdrh             default: {
620fef5208cSdrh               sqliteExprCode(pParse, pE2);
62199fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
622fef5208cSdrh               break;
623fef5208cSdrh             }
624fef5208cSdrh           }
625fef5208cSdrh         }
626fef5208cSdrh       }
627cfab11bcSdrh       break;
628fef5208cSdrh     }
629fef5208cSdrh 
63019a775c2Sdrh     case TK_SELECT: {
631fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
632fef5208cSdrh       ** value of this select in a memory cell and record the number
633967e8b73Sdrh       ** of the memory cell in iColumn.
634fef5208cSdrh       */
635967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
636832508b7Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
63719a775c2Sdrh         return 1;
63819a775c2Sdrh       }
63919a775c2Sdrh       break;
64019a775c2Sdrh     }
64119a775c2Sdrh 
642cce7d176Sdrh     /* For all else, just recursively walk the tree */
643cce7d176Sdrh     default: {
644cce7d176Sdrh       if( pExpr->pLeft
645832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
646cce7d176Sdrh         return 1;
647cce7d176Sdrh       }
648cce7d176Sdrh       if( pExpr->pRight
649832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){
650cce7d176Sdrh         return 1;
651cce7d176Sdrh       }
652cce7d176Sdrh       if( pExpr->pList ){
653cce7d176Sdrh         int i;
654cce7d176Sdrh         ExprList *pList = pExpr->pList;
655cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
656832508b7Sdrh           Expr *pArg = pList->a[i].pExpr;
657832508b7Sdrh           if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){
658cce7d176Sdrh             return 1;
659cce7d176Sdrh           }
660cce7d176Sdrh         }
661cce7d176Sdrh       }
662cce7d176Sdrh     }
663cce7d176Sdrh   }
664cce7d176Sdrh   return 0;
665cce7d176Sdrh }
666cce7d176Sdrh 
667cce7d176Sdrh /*
668cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
669cce7d176Sdrh ** function names are recognized and all functions have the correct
670cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
671cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
672cce7d176Sdrh **
673cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
674cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
675cce7d176Sdrh */
676cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
677cce7d176Sdrh   int nErr = 0;
678cce7d176Sdrh   if( pExpr==0 ) return 0;
679cce7d176Sdrh   switch( pExpr->op ){
680cce7d176Sdrh     case TK_FUNCTION: {
681cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
682cce7d176Sdrh       int no_such_func = 0;
6838e0a2f90Sdrh       int wrong_num_args = 0;
684cce7d176Sdrh       int is_agg = 0;
685cce7d176Sdrh       int i;
6860bce8354Sdrh       FuncDef *pDef;
6870bce8354Sdrh 
68889425d5eSdrh       pDef = sqliteFindFunction(pParse->db,
68989425d5eSdrh          pExpr->token.z, pExpr->token.n, n, 0);
6900bce8354Sdrh       if( pDef==0 ){
6910bce8354Sdrh         pDef = sqliteFindFunction(pParse->db,
6928e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, -1, 0);
6930bce8354Sdrh         if( pDef==0 ){
694cce7d176Sdrh           no_such_func = 1;
6958e0a2f90Sdrh         }else{
6968e0a2f90Sdrh           wrong_num_args = 1;
6978e0a2f90Sdrh         }
6988e0a2f90Sdrh       }else{
6990bce8354Sdrh         is_agg = pDef->xFunc==0;
700cce7d176Sdrh       }
7018e0a2f90Sdrh       if( is_agg && !allowAgg ){
7028e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1,
7038e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
7048e0a2f90Sdrh         pParse->nErr++;
7058e0a2f90Sdrh         nErr++;
7068e0a2f90Sdrh         is_agg = 0;
7078e0a2f90Sdrh       }else if( no_such_func ){
708cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
709cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
710cce7d176Sdrh         pParse->nErr++;
711cce7d176Sdrh         nErr++;
7128e0a2f90Sdrh       }else if( wrong_num_args ){
7138e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg,
7148e0a2f90Sdrh            "wrong number of arguments to function ",-1,
7158e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
7168e0a2f90Sdrh         pParse->nErr++;
7178e0a2f90Sdrh         nErr++;
718cce7d176Sdrh       }
7192282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
720cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
721cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
7224cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
7234cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
724cce7d176Sdrh       }
725cce7d176Sdrh     }
726cce7d176Sdrh     default: {
727cce7d176Sdrh       if( pExpr->pLeft ){
7282282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
729cce7d176Sdrh       }
730cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
7312282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
732cce7d176Sdrh       }
733fef5208cSdrh       if( nErr==0 && pExpr->pList ){
734fef5208cSdrh         int n = pExpr->pList->nExpr;
735fef5208cSdrh         int i;
736fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
7372282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
7382282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
739fef5208cSdrh         }
740fef5208cSdrh       }
741cce7d176Sdrh       break;
742cce7d176Sdrh     }
743cce7d176Sdrh   }
744cce7d176Sdrh   return nErr;
745cce7d176Sdrh }
746cce7d176Sdrh 
747cce7d176Sdrh /*
748cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
7491ccde15dSdrh ** expression and leave the result on the top of stack.
750cce7d176Sdrh */
751cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
752cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
753cce7d176Sdrh   int op;
754daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
755cce7d176Sdrh   switch( pExpr->op ){
756cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
757cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
758cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
759cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
760cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
761cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
762cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
763cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
764cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
765cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
766cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
767cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
768cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
769cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
770cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
771cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
772bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
773bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
774bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
775bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
776bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
777bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
778cce7d176Sdrh     default: break;
779cce7d176Sdrh   }
780cce7d176Sdrh   switch( pExpr->op ){
781967e8b73Sdrh     case TK_COLUMN: {
7822282792aSdrh       if( pParse->useAgg ){
78399fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
784c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
78599fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
786c4a3c779Sdrh       }else{
78799fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
7882282792aSdrh       }
789cce7d176Sdrh       break;
790cce7d176Sdrh     }
791cce7d176Sdrh     case TK_INTEGER: {
792e6840900Sdrh       sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0);
793e6840900Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
794e6840900Sdrh       break;
795e6840900Sdrh     }
796e6840900Sdrh     case TK_FLOAT: {
7977a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
798a76b5dfcSdrh       assert( pExpr->token.z );
7997a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
800cce7d176Sdrh       break;
801cce7d176Sdrh     }
802cce7d176Sdrh     case TK_STRING: {
80399fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
804a76b5dfcSdrh       assert( pExpr->token.z );
805cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
806cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
807cce7d176Sdrh       break;
808cce7d176Sdrh     }
809cce7d176Sdrh     case TK_NULL: {
81099fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
811cce7d176Sdrh       break;
812cce7d176Sdrh     }
813cce7d176Sdrh     case TK_AND:
814cce7d176Sdrh     case TK_OR:
815cce7d176Sdrh     case TK_PLUS:
816cce7d176Sdrh     case TK_STAR:
817cce7d176Sdrh     case TK_MINUS:
818bf4133cbSdrh     case TK_REM:
819bf4133cbSdrh     case TK_BITAND:
820bf4133cbSdrh     case TK_BITOR:
821f5905aa7Sdrh     case TK_SLASH:
822f5905aa7Sdrh     case TK_LT:
823f5905aa7Sdrh     case TK_LE:
824f5905aa7Sdrh     case TK_GT:
825f5905aa7Sdrh     case TK_GE:
826f5905aa7Sdrh     case TK_NE:
827f5905aa7Sdrh     case TK_EQ: {
828cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
829cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
83099fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
831cce7d176Sdrh       break;
832cce7d176Sdrh     }
833bf4133cbSdrh     case TK_LSHIFT:
834bf4133cbSdrh     case TK_RSHIFT: {
835bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
836bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
837bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
838bf4133cbSdrh       break;
839bf4133cbSdrh     }
8400040077dSdrh     case TK_CONCAT: {
8410040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
8420040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
84399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
8440040077dSdrh       break;
8450040077dSdrh     }
846cce7d176Sdrh     case TK_UMINUS: {
8476e142f54Sdrh       assert( pExpr->pLeft );
8487a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
8496e142f54Sdrh         Token *p = &pExpr->pLeft->token;
8506e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
8516e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
852e6840900Sdrh         if( pExpr->pLeft->op==TK_INTEGER ){
853e6840900Sdrh           sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0);
854e6840900Sdrh         }else{
85599fcd718Sdrh           sqliteVdbeAddOp(v, OP_String, 0, 0);
856e6840900Sdrh         }
85799fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
8586e142f54Sdrh         sqliteFree(z);
8596e142f54Sdrh         break;
8606e142f54Sdrh       }
8611ccde15dSdrh       /* Fall through into TK_NOT */
8626e142f54Sdrh     }
863bf4133cbSdrh     case TK_BITNOT:
8646e142f54Sdrh     case TK_NOT: {
865cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
86699fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
867cce7d176Sdrh       break;
868cce7d176Sdrh     }
869cce7d176Sdrh     case TK_ISNULL:
870cce7d176Sdrh     case TK_NOTNULL: {
871cce7d176Sdrh       int dest;
87299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
873cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
874cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
875f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
87699fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
877cce7d176Sdrh       break;
878cce7d176Sdrh     }
8792282792aSdrh     case TK_AGG_FUNCTION: {
88099fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
8812282792aSdrh       break;
8822282792aSdrh     }
883cce7d176Sdrh     case TK_FUNCTION: {
884cce7d176Sdrh       int i;
885cce7d176Sdrh       ExprList *pList = pExpr->pList;
88689425d5eSdrh       int nExpr = pList ? pList->nExpr : 0;
8870bce8354Sdrh       FuncDef *pDef;
8880bce8354Sdrh       pDef = sqliteFindFunction(pParse->db,
88989425d5eSdrh                       pExpr->token.z, pExpr->token.n, nExpr, 0);
8900bce8354Sdrh       assert( pDef!=0 );
89189425d5eSdrh       for(i=0; i<nExpr; i++){
8928e0a2f90Sdrh         sqliteExprCode(pParse, pList->a[i].pExpr);
8938e0a2f90Sdrh       }
89489425d5eSdrh       sqliteVdbeAddOp(v, OP_Function, nExpr, 0);
8950bce8354Sdrh       sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER);
8966ec2733bSdrh       break;
8976ec2733bSdrh     }
89819a775c2Sdrh     case TK_SELECT: {
89999fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
90019a775c2Sdrh       break;
90119a775c2Sdrh     }
902fef5208cSdrh     case TK_IN: {
903fef5208cSdrh       int addr;
90499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
905fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
906fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
907f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4);
908f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
909f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
910f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, addr+6);
911fef5208cSdrh       if( pExpr->pSelect ){
912f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6);
913fef5208cSdrh       }else{
914f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6);
915fef5208cSdrh       }
91699fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
917fef5208cSdrh       break;
918fef5208cSdrh     }
919fef5208cSdrh     case TK_BETWEEN: {
920f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
921f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
922f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
923f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, 0);
924f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pull, 1, 0);
925f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
926f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, 0);
927f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_And, 0, 0);
928fef5208cSdrh       break;
929fef5208cSdrh     }
930a2e00042Sdrh     case TK_AS: {
931a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
932a2e00042Sdrh       break;
933a2e00042Sdrh     }
93417a7f8ddSdrh     case TK_CASE: {
93517a7f8ddSdrh       int expr_end_label;
936f5905aa7Sdrh       int null_result_label;
937f5905aa7Sdrh       int jumpInst;
938*461c281aSdrh       int nullBypassInst;
939f5905aa7Sdrh       int addr;
940f5905aa7Sdrh       int nExpr;
94117a7f8ddSdrh       int i;
94217a7f8ddSdrh 
94317a7f8ddSdrh       assert(pExpr->pList);
94417a7f8ddSdrh       assert((pExpr->pList->nExpr % 2) == 0);
94517a7f8ddSdrh       assert(pExpr->pList->nExpr > 0);
946f5905aa7Sdrh       nExpr = pExpr->pList->nExpr;
947f5905aa7Sdrh       expr_end_label = sqliteVdbeMakeLabel(v);
948f5905aa7Sdrh       null_result_label = sqliteVdbeMakeLabel(v);
94917a7f8ddSdrh       if( pExpr->pLeft ){
95017a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pLeft);
951*461c281aSdrh         nullBypassInst = sqliteVdbeAddOp(v, OP_IsNull, -1, 0);
952cce7d176Sdrh       }
953f5905aa7Sdrh       for(i=0; i<nExpr; i=i+2){
95417a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i].pExpr);
955f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_IsNull, -1, null_result_label);
95617a7f8ddSdrh         if( pExpr->pLeft ){
957f5905aa7Sdrh           sqliteVdbeAddOp(v, OP_Dup, 1, 1);
958f5905aa7Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_Ne, 0, 0);
959f5905aa7Sdrh         }else{
960f5905aa7Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 0, 0);
96117a7f8ddSdrh         }
96217a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr);
963f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label);
964f5905aa7Sdrh         if( i>=nExpr-2 ){
965f5905aa7Sdrh           sqliteVdbeResolveLabel(v, null_result_label);
966f5905aa7Sdrh           sqliteVdbeAddOp(v, OP_Pop, 1, 0);
967f5905aa7Sdrh           if( pExpr->pRight!=0 ){
968f5905aa7Sdrh             sqliteVdbeAddOp(v, OP_String, 0, 0);
969f5905aa7Sdrh             sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label);
97017a7f8ddSdrh           }
971f5905aa7Sdrh         }
972f5905aa7Sdrh         addr = sqliteVdbeCurrentAddr(v);
973f5905aa7Sdrh         sqliteVdbeChangeP2(v, jumpInst, addr);
97417a7f8ddSdrh       }
97517a7f8ddSdrh       if( pExpr->pRight ){
97617a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pRight);
97717a7f8ddSdrh       }else{
978f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
97917a7f8ddSdrh       }
980f5905aa7Sdrh       sqliteVdbeResolveLabel(v, expr_end_label);
981f5905aa7Sdrh       if( pExpr->pLeft ){
982f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Pull, 1, 0);
983f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Pop, 1, 0);
984*461c281aSdrh         sqliteVdbeChangeP2(v, nullBypassInst, sqliteVdbeCurrentAddr(v));
985f5905aa7Sdrh       }
98617a7f8ddSdrh     }
98717a7f8ddSdrh     break;
98817a7f8ddSdrh   }
989cce7d176Sdrh }
990cce7d176Sdrh 
991cce7d176Sdrh /*
992cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
993cce7d176Sdrh ** to the label "dest" if the expression is true but execution
994cce7d176Sdrh ** continues straight thru if the expression is false.
995f5905aa7Sdrh **
996f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then
997f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true.
998cce7d176Sdrh */
999f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1000cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1001cce7d176Sdrh   int op = 0;
1002daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1003cce7d176Sdrh   switch( pExpr->op ){
1004cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
1005cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
1006cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
1007cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
1008cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
1009cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
1010cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
1011cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
1012cce7d176Sdrh     default:  break;
1013cce7d176Sdrh   }
1014cce7d176Sdrh   switch( pExpr->op ){
1015cce7d176Sdrh     case TK_AND: {
1016cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1017f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);
1018f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1019cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1020cce7d176Sdrh       break;
1021cce7d176Sdrh     }
1022cce7d176Sdrh     case TK_OR: {
1023f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1024f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1025cce7d176Sdrh       break;
1026cce7d176Sdrh     }
1027cce7d176Sdrh     case TK_NOT: {
1028f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1029cce7d176Sdrh       break;
1030cce7d176Sdrh     }
1031cce7d176Sdrh     case TK_LT:
1032cce7d176Sdrh     case TK_LE:
1033cce7d176Sdrh     case TK_GT:
1034cce7d176Sdrh     case TK_GE:
1035cce7d176Sdrh     case TK_NE:
10360ac65892Sdrh     case TK_EQ: {
1037cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1038cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1039f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1040cce7d176Sdrh       break;
1041cce7d176Sdrh     }
1042cce7d176Sdrh     case TK_ISNULL:
1043cce7d176Sdrh     case TK_NOTNULL: {
1044cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1045f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1046cce7d176Sdrh       break;
1047cce7d176Sdrh     }
1048fef5208cSdrh     case TK_IN: {
1049f5905aa7Sdrh       int addr;
1050cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1051f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1052f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1053f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1054f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1055fef5208cSdrh       if( pExpr->pSelect ){
105699fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
1057fef5208cSdrh       }else{
105899fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
1059fef5208cSdrh       }
1060fef5208cSdrh       break;
1061fef5208cSdrh     }
1062fef5208cSdrh     case TK_BETWEEN: {
1063f5905aa7Sdrh       int addr;
1064fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
106599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1066fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1067f5905aa7Sdrh       addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0);
1068fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1069f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest);
107099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
1071f5905aa7Sdrh       sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v));
107299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1073fef5208cSdrh       break;
1074fef5208cSdrh     }
1075cce7d176Sdrh     default: {
1076cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1077f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest);
1078cce7d176Sdrh       break;
1079cce7d176Sdrh     }
1080cce7d176Sdrh   }
1081cce7d176Sdrh }
1082cce7d176Sdrh 
1083cce7d176Sdrh /*
108466b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
1085cce7d176Sdrh ** to the label "dest" if the expression is false but execution
1086cce7d176Sdrh ** continues straight thru if the expression is true.
1087f5905aa7Sdrh **
1088f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then
1089f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false.
1090cce7d176Sdrh */
1091f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1092cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1093cce7d176Sdrh   int op = 0;
1094daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1095cce7d176Sdrh   switch( pExpr->op ){
1096cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
1097cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
1098cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
1099cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
1100cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
1101cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
1102cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
1103cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
1104cce7d176Sdrh     default:  break;
1105cce7d176Sdrh   }
1106cce7d176Sdrh   switch( pExpr->op ){
1107cce7d176Sdrh     case TK_AND: {
1108f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1109f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1110cce7d176Sdrh       break;
1111cce7d176Sdrh     }
1112cce7d176Sdrh     case TK_OR: {
1113cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1114f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);
1115f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1116cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1117cce7d176Sdrh       break;
1118cce7d176Sdrh     }
1119cce7d176Sdrh     case TK_NOT: {
1120f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1121cce7d176Sdrh       break;
1122cce7d176Sdrh     }
1123cce7d176Sdrh     case TK_LT:
1124cce7d176Sdrh     case TK_LE:
1125cce7d176Sdrh     case TK_GT:
1126cce7d176Sdrh     case TK_GE:
1127cce7d176Sdrh     case TK_NE:
1128cce7d176Sdrh     case TK_EQ: {
1129cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1130cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1131f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1132cce7d176Sdrh       break;
1133cce7d176Sdrh     }
1134cce7d176Sdrh     case TK_ISNULL:
1135cce7d176Sdrh     case TK_NOTNULL: {
1136cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1137f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1138cce7d176Sdrh       break;
1139cce7d176Sdrh     }
1140fef5208cSdrh     case TK_IN: {
1141f5905aa7Sdrh       int addr;
1142cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1143f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1144f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1145f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1146f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1147fef5208cSdrh       if( pExpr->pSelect ){
114899fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1149fef5208cSdrh       }else{
115099fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1151fef5208cSdrh       }
1152fef5208cSdrh       break;
1153fef5208cSdrh     }
1154fef5208cSdrh     case TK_BETWEEN: {
1155fef5208cSdrh       int addr;
1156fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
115799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1158fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1159fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1160f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3);
116199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
116299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
1163fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1164f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest);
1165fef5208cSdrh       break;
1166fef5208cSdrh     }
1167cce7d176Sdrh     default: {
1168cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1169*461c281aSdrh       sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest);
1170cce7d176Sdrh       break;
1171cce7d176Sdrh     }
1172cce7d176Sdrh   }
1173cce7d176Sdrh }
11742282792aSdrh 
11752282792aSdrh /*
11762282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
11772282792aSdrh ** if they are identical and return FALSE if they differ in any way.
11782282792aSdrh */
1179d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
11802282792aSdrh   int i;
11812282792aSdrh   if( pA==0 ){
11822282792aSdrh     return pB==0;
11832282792aSdrh   }else if( pB==0 ){
11842282792aSdrh     return 0;
11852282792aSdrh   }
11862282792aSdrh   if( pA->op!=pB->op ) return 0;
1187d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1188d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
11892282792aSdrh   if( pA->pList ){
11902282792aSdrh     if( pB->pList==0 ) return 0;
11912282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
11922282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1193d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
11942282792aSdrh         return 0;
11952282792aSdrh       }
11962282792aSdrh     }
11972282792aSdrh   }else if( pB->pList ){
11982282792aSdrh     return 0;
11992282792aSdrh   }
12002282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
12012282792aSdrh   if( pA->token.z ){
12022282792aSdrh     if( pB->token.z==0 ) return 0;
12032282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
12042282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
12052282792aSdrh   }
12062282792aSdrh   return 1;
12072282792aSdrh }
12082282792aSdrh 
12092282792aSdrh /*
12102282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
12112282792aSdrh */
12122282792aSdrh static int appendAggInfo(Parse *pParse){
12132282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
12142282792aSdrh     int amt = pParse->nAgg + 8;
12156d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
12166d4abfbeSdrh     if( aAgg==0 ){
12172282792aSdrh       return -1;
12182282792aSdrh     }
12196d4abfbeSdrh     pParse->aAgg = aAgg;
12202282792aSdrh   }
12212282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
12222282792aSdrh   return pParse->nAgg++;
12232282792aSdrh }
12242282792aSdrh 
12252282792aSdrh /*
12262282792aSdrh ** Analyze the given expression looking for aggregate functions and
12272282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
12282282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
12292282792aSdrh **
12302282792aSdrh ** This routine should only be called after the expression has been
12312282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
12322282792aSdrh **
12332282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
12342282792aSdrh ** the number of errors.
12352282792aSdrh */
12362282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
12372282792aSdrh   int i;
12382282792aSdrh   AggExpr *aAgg;
12392282792aSdrh   int nErr = 0;
12402282792aSdrh 
12412282792aSdrh   if( pExpr==0 ) return 0;
12422282792aSdrh   switch( pExpr->op ){
1243967e8b73Sdrh     case TK_COLUMN: {
12442282792aSdrh       aAgg = pParse->aAgg;
12452282792aSdrh       for(i=0; i<pParse->nAgg; i++){
12462282792aSdrh         if( aAgg[i].isAgg ) continue;
12472282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1248967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
12492282792aSdrh           break;
12502282792aSdrh         }
12512282792aSdrh       }
12522282792aSdrh       if( i>=pParse->nAgg ){
12532282792aSdrh         i = appendAggInfo(pParse);
12542282792aSdrh         if( i<0 ) return 1;
12552282792aSdrh         pParse->aAgg[i].isAgg = 0;
12562282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
12572282792aSdrh       }
1258aaf88729Sdrh       pExpr->iAgg = i;
12592282792aSdrh       break;
12602282792aSdrh     }
12612282792aSdrh     case TK_AGG_FUNCTION: {
12622282792aSdrh       aAgg = pParse->aAgg;
12632282792aSdrh       for(i=0; i<pParse->nAgg; i++){
12642282792aSdrh         if( !aAgg[i].isAgg ) continue;
1265d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
12662282792aSdrh           break;
12672282792aSdrh         }
12682282792aSdrh       }
12692282792aSdrh       if( i>=pParse->nAgg ){
12702282792aSdrh         i = appendAggInfo(pParse);
12712282792aSdrh         if( i<0 ) return 1;
12722282792aSdrh         pParse->aAgg[i].isAgg = 1;
12732282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
12740bce8354Sdrh         pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db,
1275f55f25f0Sdrh              pExpr->token.z, pExpr->token.n,
1276f55f25f0Sdrh              pExpr->pList ? pExpr->pList->nExpr : 0, 0);
12772282792aSdrh       }
12782282792aSdrh       pExpr->iAgg = i;
12792282792aSdrh       break;
12802282792aSdrh     }
12812282792aSdrh     default: {
12822282792aSdrh       if( pExpr->pLeft ){
12832282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
12842282792aSdrh       }
12852282792aSdrh       if( nErr==0 && pExpr->pRight ){
12862282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
12872282792aSdrh       }
12882282792aSdrh       if( nErr==0 && pExpr->pList ){
12892282792aSdrh         int n = pExpr->pList->nExpr;
12902282792aSdrh         int i;
12912282792aSdrh         for(i=0; nErr==0 && i<n; i++){
12922282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
12932282792aSdrh         }
12942282792aSdrh       }
12952282792aSdrh       break;
12962282792aSdrh     }
12972282792aSdrh   }
12982282792aSdrh   return nErr;
12992282792aSdrh }
13008e0a2f90Sdrh 
13018e0a2f90Sdrh /*
13028e0a2f90Sdrh ** Locate a user function given a name and a number of arguments.
13030bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that
13048e0a2f90Sdrh ** function, or return NULL if the function does not exist.
13058e0a2f90Sdrh **
13060bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef
13078e0a2f90Sdrh ** structure is created and liked into the "db" structure if a
13088e0a2f90Sdrh ** no matching function previously existed.  When createFlag is true
13098e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts
13108e0a2f90Sdrh ** any number of arguments will be returned.
13118e0a2f90Sdrh **
13128e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid
13138e0a2f90Sdrh ** function found is returned.  A function is valid if either xFunc
13148e0a2f90Sdrh ** or xStep is non-zero.
13158e0a2f90Sdrh */
13160bce8354Sdrh FuncDef *sqliteFindFunction(
13178e0a2f90Sdrh   sqlite *db,        /* An open database */
13188e0a2f90Sdrh   const char *zName, /* Name of the function.  Not null-terminated */
13198e0a2f90Sdrh   int nName,         /* Number of characters in the name */
13208e0a2f90Sdrh   int nArg,          /* Number of arguments.  -1 means any number */
13218e0a2f90Sdrh   int createFlag     /* Create new entry if true and does not otherwise exist */
13228e0a2f90Sdrh ){
13230bce8354Sdrh   FuncDef *pFirst, *p, *pMaybe;
13240bce8354Sdrh   pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName);
13251350b030Sdrh   if( p && !createFlag && nArg<0 ){
13268e0a2f90Sdrh     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
13278e0a2f90Sdrh     return p;
13288e0a2f90Sdrh   }
13298e0a2f90Sdrh   pMaybe = 0;
13308e0a2f90Sdrh   while( p && p->nArg!=nArg ){
13318e0a2f90Sdrh     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
13328e0a2f90Sdrh     p = p->pNext;
13338e0a2f90Sdrh   }
13348e0a2f90Sdrh   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
13358e0a2f90Sdrh     return 0;
13368e0a2f90Sdrh   }
13378e0a2f90Sdrh   if( p==0 && pMaybe ){
13388e0a2f90Sdrh     assert( createFlag==0 );
13398e0a2f90Sdrh     return pMaybe;
13408e0a2f90Sdrh   }
134189425d5eSdrh   if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
13428e0a2f90Sdrh     p->nArg = nArg;
13438e0a2f90Sdrh     p->pNext = pFirst;
13440bce8354Sdrh     sqliteHashInsert(&db->aFunc, zName, nName, (void*)p);
13458e0a2f90Sdrh   }
13468e0a2f90Sdrh   return p;
13478e0a2f90Sdrh }
1348