xref: /sqlite-3.40.0/src/expr.c (revision ff78bd2f)
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*ff78bd2fSdrh ** $Id: expr.c,v 1.46 2002/02/27 01:47: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->op!=TK_AS ){
89a2e00042Sdrh     if( p->pLeft ) sqliteExprDelete(p->pLeft);
90a2e00042Sdrh     if( p->pRight ) sqliteExprDelete(p->pRight);
91a2e00042Sdrh   }
92a2e00042Sdrh   if( p->pList ) sqliteExprListDelete(p->pList);
93a2e00042Sdrh   if( p->pSelect ) sqliteSelectDelete(p->pSelect);
94a2e00042Sdrh   sqliteFree(p);
95a2e00042Sdrh }
96a2e00042Sdrh 
97cce7d176Sdrh /*
98a76b5dfcSdrh ** The following group of functions are used to translate the string
99a76b5dfcSdrh ** pointers of tokens in expression from one buffer to another.
100a76b5dfcSdrh **
101a76b5dfcSdrh ** Normally, the Expr.token.z and Expr.span.z fields point into the
102a76b5dfcSdrh ** original input buffer of an SQL statement.  This is usually OK
103a76b5dfcSdrh ** since the SQL statement is executed and the expression is deleted
104a76b5dfcSdrh ** before the input buffer is freed.  Making the tokens point to the
105a76b5dfcSdrh ** original input buffer saves many calls to malloc() and thus helps
106a76b5dfcSdrh ** the library to run faster.
107a76b5dfcSdrh **
108a76b5dfcSdrh ** But sometimes we need an expression to persist past the time when
109a76b5dfcSdrh ** the input buffer is freed.  (Example: The SELECT clause of a
110a76b5dfcSdrh ** CREATE VIEW statement contains expressions that must persist for
111a76b5dfcSdrh ** the life of the view.)  When that happens we have to make a
112a76b5dfcSdrh ** persistent copy of the input buffer and translate the Expr.token.z
113a76b5dfcSdrh ** and Expr.span.z fields to point to the copy rather than the
114a2ed5601Sdrh ** original input buffer.  The following group of routines handle that
115a76b5dfcSdrh ** translation.
116a76b5dfcSdrh **
117a76b5dfcSdrh ** The "offset" parameter is the distance from the original input buffer
118a76b5dfcSdrh ** to the persistent copy.  These routines recursively walk the entire
119a76b5dfcSdrh ** expression tree and shift all tokens by "offset" amount.
120a76b5dfcSdrh **
121a76b5dfcSdrh ** The work of figuring out the appropriate "offset" and making the
122a76b5dfcSdrh ** presistent copy of the input buffer is done by the calling routine.
123a76b5dfcSdrh */
124a76b5dfcSdrh void sqliteExprMoveStrings(Expr *p, int offset){
125a76b5dfcSdrh   if( p==0 ) return;
126a76b5dfcSdrh   if( p->token.z ) p->token.z += offset;
127a76b5dfcSdrh   if( p->span.z ) p->span.z += offset;
128a76b5dfcSdrh   if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset);
129a76b5dfcSdrh   if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset);
130a76b5dfcSdrh   if( p->pList ) sqliteExprListMoveStrings(p->pList, offset);
131a76b5dfcSdrh   if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset);
132a76b5dfcSdrh }
133a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){
134a76b5dfcSdrh   int i;
135a76b5dfcSdrh   if( pList==0 ) return;
136a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
137a76b5dfcSdrh     sqliteExprMoveStrings(pList->a[i].pExpr, offset);
138a76b5dfcSdrh   }
139a76b5dfcSdrh }
140a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){
141a76b5dfcSdrh   if( pSelect==0 ) return;
142a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pEList, offset);
143a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pWhere, offset);
144a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pGroupBy, offset);
145a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pHaving, offset);
146a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pOrderBy, offset);
147a76b5dfcSdrh   sqliteSelectMoveStrings(pSelect->pPrior, offset);
148a76b5dfcSdrh }
149a76b5dfcSdrh 
150a76b5dfcSdrh /*
151*ff78bd2fSdrh ** The following group of routines make deep copies of expressions,
152*ff78bd2fSdrh ** expression lists, ID lists, and select statements.  The copies can
153*ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines)
154*ff78bd2fSdrh ** without effecting the originals.
155*ff78bd2fSdrh **
156*ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to
157*ff78bd2fSdrh ** string space that is allocated separately from the expression tree
158*ff78bd2fSdrh ** itself.  These routines do NOT duplicate that string space.
159*ff78bd2fSdrh **
160*ff78bd2fSdrh ** The expression list and ID list return by sqliteExprListDup() and
161*ff78bd2fSdrh ** sqliteIdListDup() can not be further expanded by subsequent calls
162*ff78bd2fSdrh ** to sqliteExprListAppend() or sqliteIdListAppend().
163*ff78bd2fSdrh **
164*ff78bd2fSdrh ** Any tables that the ID list might point to are not duplicated.
165*ff78bd2fSdrh */
166*ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){
167*ff78bd2fSdrh   Expr *pNew;
168*ff78bd2fSdrh   if( p==0 ) return 0;
169*ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
170*ff78bd2fSdrh   if( pNew==0 ) return 0;
171*ff78bd2fSdrh   pNew->op = p->op;
172*ff78bd2fSdrh   pNew->pLeft = sqliteExprDup(p->pLeft);
173*ff78bd2fSdrh   pNew->pRight = sqliteExprDup(p->pRight);
174*ff78bd2fSdrh   pNew->pList = sqliteExprListDup(p->pList);
175*ff78bd2fSdrh   pNew->token = p->token;
176*ff78bd2fSdrh   pNew->span = p->span;
177*ff78bd2fSdrh   pNew->pSelect = sqliteSelectDup(p->pSelect);
178*ff78bd2fSdrh   return pNew;
179*ff78bd2fSdrh }
180*ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){
181*ff78bd2fSdrh   ExprList *pNew;
182*ff78bd2fSdrh   int i;
183*ff78bd2fSdrh   if( p==0 ) return 0;
184*ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
185*ff78bd2fSdrh   if( pNew==0 ) return 0;
186*ff78bd2fSdrh   pNew->nExpr = p->nExpr;
187*ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
188*ff78bd2fSdrh   for(i=0; i<p->nExpr; i++){
189*ff78bd2fSdrh     pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr);
190*ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
191*ff78bd2fSdrh     pNew->a[i].sortOrder = p->a[i].sortOrder;
192*ff78bd2fSdrh     pNew->a[i].isAgg = p->a[i].isAgg;
193*ff78bd2fSdrh     pNew->a[i].done = 0;
194*ff78bd2fSdrh   }
195*ff78bd2fSdrh   return pNew;
196*ff78bd2fSdrh }
197*ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){
198*ff78bd2fSdrh   IdList *pNew;
199*ff78bd2fSdrh   int i;
200*ff78bd2fSdrh   if( p==0 ) return 0;
201*ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
202*ff78bd2fSdrh   if( pNew==0 ) return 0;
203*ff78bd2fSdrh   pNew->nId = p->nId;
204*ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) );
205*ff78bd2fSdrh   for(i=0; i<p->nId; i++){
206*ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
207*ff78bd2fSdrh     pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias);
208*ff78bd2fSdrh     pNew->a[i].idx = p->a[i].idx;
209*ff78bd2fSdrh     pNew->a[i].pTab = 0;
210*ff78bd2fSdrh     pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect);
211*ff78bd2fSdrh   }
212*ff78bd2fSdrh   return pNew;
213*ff78bd2fSdrh }
214*ff78bd2fSdrh Select *sqliteSelectDup(Select *p){
215*ff78bd2fSdrh   Select *pNew;
216*ff78bd2fSdrh   if( p==0 ) return 0;
217*ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
218*ff78bd2fSdrh   if( pNew==0 ) return 0;
219*ff78bd2fSdrh   pNew->isDistinct = p->isDistinct;
220*ff78bd2fSdrh   pNew->pEList = sqliteExprListDup(p->pEList);
221*ff78bd2fSdrh   pNew->pSrc = sqliteIdListDup(p->pSrc);
222*ff78bd2fSdrh   pNew->pWhere = sqliteExprDup(p->pWhere);
223*ff78bd2fSdrh   pNew->pGroupBy = sqliteExprListDup(p->pGroupBy);
224*ff78bd2fSdrh   pNew->pHaving = sqliteExprDup(p->pHaving);
225*ff78bd2fSdrh   pNew->pOrderBy = sqliteExprListDup(p->pOrderBy);
226*ff78bd2fSdrh   pNew->op = p->op;
227*ff78bd2fSdrh   pNew->pPrior = sqliteSelectDup(p->pPrior);
228*ff78bd2fSdrh   pNew->nLimit = p->nLimit;
229*ff78bd2fSdrh   pNew->nOffset = p->nOffset;
230*ff78bd2fSdrh   pNew->zSelect = 0;
231*ff78bd2fSdrh   return pNew;
232*ff78bd2fSdrh }
233*ff78bd2fSdrh 
234*ff78bd2fSdrh 
235*ff78bd2fSdrh /*
236a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
237a76b5dfcSdrh ** initially NULL, then create a new expression list.
238a76b5dfcSdrh */
239a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
240a76b5dfcSdrh   int i;
241a76b5dfcSdrh   if( pList==0 ){
242a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
243a76b5dfcSdrh     if( pList==0 ){
244a76b5dfcSdrh       sqliteExprDelete(pExpr);
245a76b5dfcSdrh       return 0;
246a76b5dfcSdrh     }
247a76b5dfcSdrh   }
248a76b5dfcSdrh   if( (pList->nExpr & 7)==0 ){
249a76b5dfcSdrh     int n = pList->nExpr + 8;
250a76b5dfcSdrh     struct ExprList_item *a;
251a76b5dfcSdrh     a = sqliteRealloc(pList->a, n*sizeof(pList->a[0]));
252a76b5dfcSdrh     if( a==0 ){
253a76b5dfcSdrh       sqliteExprDelete(pExpr);
254a76b5dfcSdrh       return pList;
255a76b5dfcSdrh     }
256a76b5dfcSdrh     pList->a = a;
257a76b5dfcSdrh   }
258a76b5dfcSdrh   if( pExpr || pName ){
259a76b5dfcSdrh     i = pList->nExpr++;
260a76b5dfcSdrh     pList->a[i].pExpr = pExpr;
261a76b5dfcSdrh     pList->a[i].zName = 0;
262a76b5dfcSdrh     if( pName ){
263a76b5dfcSdrh       sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0);
264a76b5dfcSdrh       sqliteDequote(pList->a[i].zName);
265a76b5dfcSdrh     }
266a76b5dfcSdrh   }
267a76b5dfcSdrh   return pList;
268a76b5dfcSdrh }
269a76b5dfcSdrh 
270a76b5dfcSdrh /*
271a76b5dfcSdrh ** Delete an entire expression list.
272a76b5dfcSdrh */
273a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){
274a76b5dfcSdrh   int i;
275a76b5dfcSdrh   if( pList==0 ) return;
276a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
277a76b5dfcSdrh     sqliteExprDelete(pList->a[i].pExpr);
278a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
279a76b5dfcSdrh   }
280a76b5dfcSdrh   sqliteFree(pList->a);
281a76b5dfcSdrh   sqliteFree(pList);
282a76b5dfcSdrh }
283a76b5dfcSdrh 
284a76b5dfcSdrh /*
285fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
286fef5208cSdrh ** and 0 if it involves variables.
287fef5208cSdrh */
2889208643dSdrh int sqliteExprIsConstant(Expr *p){
289fef5208cSdrh   switch( p->op ){
290fef5208cSdrh     case TK_ID:
291967e8b73Sdrh     case TK_COLUMN:
292fef5208cSdrh     case TK_DOT:
293fef5208cSdrh       return 0;
2949208643dSdrh     case TK_INTEGER:
2959208643dSdrh     case TK_FLOAT:
2969208643dSdrh     case TK_STRING:
2979208643dSdrh       return 1;
298fef5208cSdrh     default: {
2999208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
3009208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
301fef5208cSdrh       if( p->pList ){
302fef5208cSdrh         int i;
303fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
3049208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
305fef5208cSdrh         }
306fef5208cSdrh       }
3079208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
308fef5208cSdrh     }
309fef5208cSdrh   }
3109208643dSdrh   return 0;
311fef5208cSdrh }
312fef5208cSdrh 
313fef5208cSdrh /*
3144794b980Sdrh ** Walk the expression tree and process operators of the form:
3154794b980Sdrh **
3164794b980Sdrh **       expr IN (SELECT ...)
3174794b980Sdrh **
318967e8b73Sdrh ** These operators have to be processed before column names are
3194794b980Sdrh ** resolved because each such operator increments pParse->nTab
3201ccde15dSdrh ** to reserve cursor numbers for its own use.  But pParse->nTab
321aacc543eSdrh ** needs to be constant once we begin resolving column names.  For
322aacc543eSdrh ** that reason, this procedure needs to be called on every expression
323aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression.
3244794b980Sdrh **
3254794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this
3264794b980Sdrh ** routine.  This routine allocates a cursor number to the IN-SELECT
3274794b980Sdrh ** and then moves on.  The code generation is done by
3284794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards.
3294794b980Sdrh */
3304794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
3314794b980Sdrh   if( pExpr==0 ) return;
3324794b980Sdrh   if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
3334794b980Sdrh     pExpr->iTable = pParse->nTab++;
3344794b980Sdrh   }else{
3354794b980Sdrh     if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
3364794b980Sdrh     if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
3374794b980Sdrh     if( pExpr->pList ){
3384794b980Sdrh       int i;
3394794b980Sdrh       ExprList *pList = pExpr->pList;
3404794b980Sdrh       for(i=0; i<pList->nExpr; i++){
3414794b980Sdrh         sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
3424794b980Sdrh       }
3434794b980Sdrh     }
3444794b980Sdrh   }
3454794b980Sdrh }
3464794b980Sdrh 
3474794b980Sdrh /*
348c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
349c4a3c779Sdrh */
350c4a3c779Sdrh static int sqliteIsRowid(const char *z){
351c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
352c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
353c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
354c4a3c779Sdrh   return 0;
355c4a3c779Sdrh }
356c4a3c779Sdrh 
357c4a3c779Sdrh /*
358cce7d176Sdrh ** This routine walks an expression tree and resolves references to
359967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
360aacc543eSdrh ** index to the table in the table list and a column offset.  The
361aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
362aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
363aacc543eSdrh ** plus the pParse->nTab value.  This value will ultimately become the
364aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
365aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
366aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
367aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
368aacc543eSdrh ** alias for ROWID.
36919a775c2Sdrh **
370fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
371fef5208cSdrh ** forms:
372fef5208cSdrh **
373fef5208cSdrh **           expr IN (exprlist)
374fef5208cSdrh ** and
375fef5208cSdrh **           expr IN (SELECT ...)
376fef5208cSdrh **
377fef5208cSdrh ** The first form is handled by creating a set holding the list
378fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
379fef5208cSdrh ** a temporary table.
380fef5208cSdrh **
381fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
38219a775c2Sdrh ** If it finds any, it generates code to write the value of that select
38319a775c2Sdrh ** into a memory cell.
384cce7d176Sdrh **
385967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
386cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
387cce7d176Sdrh */
388a2e00042Sdrh int sqliteExprResolveIds(
389a2e00042Sdrh   Parse *pParse,     /* The parser context */
390a2e00042Sdrh   IdList *pTabList,  /* List of tables used to resolve column names */
391a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
392a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
393a2e00042Sdrh ){
394daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
395cce7d176Sdrh   switch( pExpr->op ){
396a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
397a2e00042Sdrh     **
398a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
399a2e00042Sdrh     **
400a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
401a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
402a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
403a2e00042Sdrh     **
404a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
405a2e00042Sdrh     */
406cce7d176Sdrh     case TK_ID: {
407cce7d176Sdrh       int cnt = 0;      /* Number of matches */
408cce7d176Sdrh       int i;            /* Loop counter */
409a76b5dfcSdrh       char *z;
410a76b5dfcSdrh       assert( pExpr->token.z );
411a76b5dfcSdrh       z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
4122f4392ffSdrh       sqliteDequote(z);
413daffd0e5Sdrh       if( z==0 ) return 1;
414cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
415cce7d176Sdrh         int j;
416cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
417cce7d176Sdrh         if( pTab==0 ) continue;
418cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
4197020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
420cce7d176Sdrh             cnt++;
42119a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
4224a32431cSdrh             if( j==pTab->iPKey ){
4234a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
4244a32431cSdrh               pExpr->iColumn = -1;
4254a32431cSdrh             }else{
426967e8b73Sdrh               pExpr->iColumn = j;
427cce7d176Sdrh             }
428a2e00042Sdrh             pExpr->op = TK_COLUMN;
429a2e00042Sdrh           }
430a2e00042Sdrh         }
431a2e00042Sdrh       }
432a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
433a2e00042Sdrh         int j;
434a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
435a2e00042Sdrh           char *zAs = pEList->a[j].zName;
436a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
437a2e00042Sdrh             cnt++;
438a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
439a2e00042Sdrh             pExpr->op = TK_AS;
440a2e00042Sdrh             pExpr->iColumn = j;
441a2e00042Sdrh             pExpr->pLeft = pEList->a[j].pExpr;
442cce7d176Sdrh           }
443cce7d176Sdrh         }
4444a32431cSdrh       }
445c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
446c4a3c779Sdrh         pExpr->iColumn = -1;
447c4a3c779Sdrh         pExpr->iTable = pParse->nTab;
448c4a3c779Sdrh         cnt = 1 + (pTabList->nId>1);
449a2e00042Sdrh         pExpr->op = TK_COLUMN;
450c4a3c779Sdrh       }
451cce7d176Sdrh       sqliteFree(z);
452cce7d176Sdrh       if( cnt==0 ){
453967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
454cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
455cce7d176Sdrh         pParse->nErr++;
456cce7d176Sdrh         return 1;
457cce7d176Sdrh       }else if( cnt>1 ){
458967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
459cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
460cce7d176Sdrh         pParse->nErr++;
461cce7d176Sdrh         return 1;
462cce7d176Sdrh       }
463cce7d176Sdrh       break;
464cce7d176Sdrh     }
465cce7d176Sdrh 
466967e8b73Sdrh     /* A table name and column name:  ID.ID */
467cce7d176Sdrh     case TK_DOT: {
468cce7d176Sdrh       int cnt = 0;             /* Number of matches */
469c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
470cce7d176Sdrh       int i;                   /* Loop counter */
471cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
472cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
473cce7d176Sdrh 
474cce7d176Sdrh       pLeft = pExpr->pLeft;
475cce7d176Sdrh       pRight = pExpr->pRight;
476a76b5dfcSdrh       assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );
477a76b5dfcSdrh       assert( pRight && pRight->op==TK_ID && pRight->token.z );
4786e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
4796e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
480daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
481daffd0e5Sdrh         sqliteFree(zLeft);
482daffd0e5Sdrh         sqliteFree(zRight);
483daffd0e5Sdrh         return 1;
484daffd0e5Sdrh       }
48587c40e88Sdrh       sqliteDequote(zLeft);
48687c40e88Sdrh       sqliteDequote(zRight);
487c4a3c779Sdrh       pExpr->iTable = -1;
488cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
489cce7d176Sdrh         int j;
490cce7d176Sdrh         char *zTab;
491cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
492cce7d176Sdrh         if( pTab==0 ) continue;
493cce7d176Sdrh         if( pTabList->a[i].zAlias ){
494cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
495cce7d176Sdrh         }else{
496cce7d176Sdrh           zTab = pTab->zName;
497cce7d176Sdrh         }
498cce7d176Sdrh         if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
499c4a3c779Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
500cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
5017020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
502cce7d176Sdrh             cnt++;
50319a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
5044a32431cSdrh             if( j==pTab->iPKey ){
5054a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
5064a32431cSdrh               pExpr->iColumn = -1;
5074a32431cSdrh             }else{
508967e8b73Sdrh               pExpr->iColumn = j;
509cce7d176Sdrh             }
510cce7d176Sdrh           }
511cce7d176Sdrh         }
5124a32431cSdrh       }
513c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
514c4a3c779Sdrh         cnt = 1;
515c4a3c779Sdrh         pExpr->iColumn = -1;
516c4a3c779Sdrh       }
517cce7d176Sdrh       sqliteFree(zLeft);
518cce7d176Sdrh       sqliteFree(zRight);
519cce7d176Sdrh       if( cnt==0 ){
520967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
521cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
522cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
523cce7d176Sdrh         pParse->nErr++;
524cce7d176Sdrh         return 1;
525cce7d176Sdrh       }else if( cnt>1 ){
526967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
527cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
528cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
529cce7d176Sdrh         pParse->nErr++;
530cce7d176Sdrh         return 1;
531cce7d176Sdrh       }
532cce7d176Sdrh       sqliteExprDelete(pLeft);
533cce7d176Sdrh       pExpr->pLeft = 0;
534cce7d176Sdrh       sqliteExprDelete(pRight);
535cce7d176Sdrh       pExpr->pRight = 0;
536967e8b73Sdrh       pExpr->op = TK_COLUMN;
537cce7d176Sdrh       break;
538cce7d176Sdrh     }
539cce7d176Sdrh 
540fef5208cSdrh     case TK_IN: {
541d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
542fef5208cSdrh       if( v==0 ) return 1;
543a2e00042Sdrh       if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
544cfab11bcSdrh         return 1;
545cfab11bcSdrh       }
546fef5208cSdrh       if( pExpr->pSelect ){
547fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
548fef5208cSdrh         **
549fef5208cSdrh         ** Generate code to write the results of the select into a temporary
5504794b980Sdrh         ** table.  The cursor number of the temporary table has already
5514794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
552fef5208cSdrh         */
553c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
554fef5208cSdrh         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
555fef5208cSdrh       }else if( pExpr->pList ){
556fef5208cSdrh         /* Case 2:     expr IN (exprlist)
557fef5208cSdrh         **
558fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
559fef5208cSdrh         ** in iTable.
560fef5208cSdrh         */
561fef5208cSdrh         int i, iSet;
562fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
563fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
5649208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
565fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
566fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
567fef5208cSdrh             pParse->nErr++;
568fef5208cSdrh             return 1;
569fef5208cSdrh           }
5704794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
5714794b980Sdrh             return 1;
5724794b980Sdrh           }
573fef5208cSdrh         }
574fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
575fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
576fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
577fef5208cSdrh           switch( pE2->op ){
578fef5208cSdrh             case TK_FLOAT:
579fef5208cSdrh             case TK_INTEGER:
580fef5208cSdrh             case TK_STRING: {
58199fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
582a76b5dfcSdrh               assert( pE2->token.z );
583fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
584fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
585fef5208cSdrh               break;
586fef5208cSdrh             }
587fef5208cSdrh             default: {
588fef5208cSdrh               sqliteExprCode(pParse, pE2);
58999fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
590fef5208cSdrh               break;
591fef5208cSdrh             }
592fef5208cSdrh           }
593fef5208cSdrh         }
594fef5208cSdrh       }
595cfab11bcSdrh       break;
596fef5208cSdrh     }
597fef5208cSdrh 
59819a775c2Sdrh     case TK_SELECT: {
599fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
600fef5208cSdrh       ** value of this select in a memory cell and record the number
601967e8b73Sdrh       ** of the memory cell in iColumn.
602fef5208cSdrh       */
603967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
604967e8b73Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
60519a775c2Sdrh         return 1;
60619a775c2Sdrh       }
60719a775c2Sdrh       break;
60819a775c2Sdrh     }
60919a775c2Sdrh 
610cce7d176Sdrh     /* For all else, just recursively walk the tree */
611cce7d176Sdrh     default: {
612cce7d176Sdrh       if( pExpr->pLeft
613a2e00042Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
614cce7d176Sdrh         return 1;
615cce7d176Sdrh       }
616cce7d176Sdrh       if( pExpr->pRight
617a2e00042Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){
618cce7d176Sdrh         return 1;
619cce7d176Sdrh       }
620cce7d176Sdrh       if( pExpr->pList ){
621cce7d176Sdrh         int i;
622cce7d176Sdrh         ExprList *pList = pExpr->pList;
623cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
624a2e00042Sdrh           if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){
625cce7d176Sdrh             return 1;
626cce7d176Sdrh           }
627cce7d176Sdrh         }
628cce7d176Sdrh       }
629cce7d176Sdrh     }
630cce7d176Sdrh   }
631cce7d176Sdrh   return 0;
632cce7d176Sdrh }
633cce7d176Sdrh 
634cce7d176Sdrh #if 0 /* NOT USED */
635cce7d176Sdrh /*
636cce7d176Sdrh ** Compare a token against a string.  Return TRUE if they match.
637cce7d176Sdrh */
638cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){
639cce7d176Sdrh   int n = strlen(zStr);
640cce7d176Sdrh   if( n!=pToken->n ) return 0;
641cce7d176Sdrh   return sqliteStrNICmp(pToken->z, zStr, n)==0;
642cce7d176Sdrh }
643cce7d176Sdrh #endif
644cce7d176Sdrh 
645cce7d176Sdrh /*
646cce7d176Sdrh ** Convert a function name into its integer identifier.  Return the
647cce7d176Sdrh ** identifier.  Return FN_Unknown if the function name is unknown.
648cce7d176Sdrh */
649cce7d176Sdrh int sqliteFuncId(Token *pToken){
650cce7d176Sdrh   static const struct {
651cce7d176Sdrh      char *zName;
652cce7d176Sdrh      int len;
653cce7d176Sdrh      int id;
654cce7d176Sdrh   } aFunc[] = {
655cce7d176Sdrh      { "count",  5, FN_Count  },
656cce7d176Sdrh      { "min",    3, FN_Min    },
657cce7d176Sdrh      { "max",    3, FN_Max    },
658cce7d176Sdrh      { "sum",    3, FN_Sum    },
6592282792aSdrh      { "avg",    3, FN_Avg    },
6606ec2733bSdrh      { "length", 6, FN_Length },
6616ec2733bSdrh      { "substr", 6, FN_Substr },
662bf4133cbSdrh      { "abs",    3, FN_Abs    },
663bf4133cbSdrh      { "round",  5, FN_Round  },
664cce7d176Sdrh   };
665cce7d176Sdrh   int i;
666cce7d176Sdrh   for(i=0; i<ArraySize(aFunc); i++){
667cce7d176Sdrh     if( aFunc[i].len==pToken->n
668cce7d176Sdrh      && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
669cce7d176Sdrh        return aFunc[i].id;
670cce7d176Sdrh     }
671cce7d176Sdrh   }
672cce7d176Sdrh   return FN_Unknown;
673cce7d176Sdrh }
674cce7d176Sdrh 
675cce7d176Sdrh /*
676cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
677cce7d176Sdrh ** function names are recognized and all functions have the correct
678cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
679cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
680cce7d176Sdrh **
681cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
682cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
683cce7d176Sdrh */
684cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
685cce7d176Sdrh   int nErr = 0;
686cce7d176Sdrh   if( pExpr==0 ) return 0;
687cce7d176Sdrh   switch( pExpr->op ){
688cce7d176Sdrh     case TK_FUNCTION: {
689cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
690cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
691cce7d176Sdrh       int no_such_func = 0;
692cce7d176Sdrh       int too_many_args = 0;
693cce7d176Sdrh       int too_few_args = 0;
6948e0a2f90Sdrh       int wrong_num_args = 0;
695cce7d176Sdrh       int is_agg = 0;
696cce7d176Sdrh       int i;
697967e8b73Sdrh       pExpr->iColumn = id;
698cce7d176Sdrh       switch( id ){
699cce7d176Sdrh         case FN_Unknown: {
7008e0a2f90Sdrh           UserFunc *pUser = sqliteFindUserFunction(pParse->db,
7018e0a2f90Sdrh              pExpr->token.z, pExpr->token.n, n, 0);
7028e0a2f90Sdrh           if( pUser==0 ){
7038e0a2f90Sdrh             pUser = sqliteFindUserFunction(pParse->db,
7048e0a2f90Sdrh                pExpr->token.z, pExpr->token.n, -1, 0);
7058e0a2f90Sdrh             if( pUser==0 ){
706cce7d176Sdrh               no_such_func = 1;
7078e0a2f90Sdrh             }else{
7088e0a2f90Sdrh               wrong_num_args = 1;
7098e0a2f90Sdrh             }
7108e0a2f90Sdrh           }else{
7118e0a2f90Sdrh             is_agg = pUser->xFunc==0;
7128e0a2f90Sdrh           }
713cce7d176Sdrh           break;
714cce7d176Sdrh         }
715cce7d176Sdrh         case FN_Count: {
716cce7d176Sdrh           too_many_args = n>1;
717cce7d176Sdrh           is_agg = 1;
718cce7d176Sdrh           break;
719cce7d176Sdrh         }
720cce7d176Sdrh         case FN_Max:
721cce7d176Sdrh         case FN_Min: {
7228e0a2f90Sdrh           too_few_args = n<1;
723cce7d176Sdrh           is_agg = n==1;
724cce7d176Sdrh           break;
725cce7d176Sdrh         }
7262282792aSdrh         case FN_Avg:
727cce7d176Sdrh         case FN_Sum: {
728cce7d176Sdrh           too_many_args = n>1;
729cce7d176Sdrh           too_few_args = n<1;
730cce7d176Sdrh           is_agg = 1;
731cce7d176Sdrh           break;
732cce7d176Sdrh         }
733bf4133cbSdrh         case FN_Abs:
7346ec2733bSdrh         case FN_Length: {
7356ec2733bSdrh           too_few_args = n<1;
7366ec2733bSdrh           too_many_args = n>1;
7376ec2733bSdrh           break;
7386ec2733bSdrh         }
739bf4133cbSdrh         case FN_Round: {
740bf4133cbSdrh           too_few_args = n<1;
741bf4133cbSdrh           too_many_args = n>2;
742bf4133cbSdrh           break;
743bf4133cbSdrh         }
7446ec2733bSdrh         case FN_Substr: {
7456ec2733bSdrh           too_few_args = n<3;
7466ec2733bSdrh           too_many_args = n>3;
7476ec2733bSdrh           break;
7486ec2733bSdrh         }
749cce7d176Sdrh         default: break;
750cce7d176Sdrh       }
7518e0a2f90Sdrh       if( is_agg && !allowAgg ){
7528e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1,
7538e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
7548e0a2f90Sdrh         pParse->nErr++;
7558e0a2f90Sdrh         nErr++;
7568e0a2f90Sdrh         is_agg = 0;
7578e0a2f90Sdrh       }else if( no_such_func ){
758cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
759cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
760cce7d176Sdrh         pParse->nErr++;
761cce7d176Sdrh         nErr++;
762cce7d176Sdrh       }else if( too_many_args ){
763cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
764cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
765cce7d176Sdrh         pParse->nErr++;
766cce7d176Sdrh         nErr++;
767cce7d176Sdrh       }else if( too_few_args ){
768cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
769cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
770cce7d176Sdrh         pParse->nErr++;
771cce7d176Sdrh         nErr++;
7728e0a2f90Sdrh       }else if( wrong_num_args ){
7738e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg,
7748e0a2f90Sdrh            "wrong number of arguments to function ",-1,
7758e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
7768e0a2f90Sdrh         pParse->nErr++;
7778e0a2f90Sdrh         nErr++;
778cce7d176Sdrh       }
7792282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
780cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
781cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
7824cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
7834cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
784cce7d176Sdrh       }
785cce7d176Sdrh     }
786cce7d176Sdrh     default: {
787cce7d176Sdrh       if( pExpr->pLeft ){
7882282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
789cce7d176Sdrh       }
790cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
7912282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
792cce7d176Sdrh       }
793fef5208cSdrh       if( nErr==0 && pExpr->pList ){
794fef5208cSdrh         int n = pExpr->pList->nExpr;
795fef5208cSdrh         int i;
796fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
7972282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
7982282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
799fef5208cSdrh         }
800fef5208cSdrh       }
801cce7d176Sdrh       break;
802cce7d176Sdrh     }
803cce7d176Sdrh   }
804cce7d176Sdrh   return nErr;
805cce7d176Sdrh }
806cce7d176Sdrh 
807cce7d176Sdrh /*
808cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
8091ccde15dSdrh ** expression and leave the result on the top of stack.
810cce7d176Sdrh */
811cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
812cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
813cce7d176Sdrh   int op;
814daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
815cce7d176Sdrh   switch( pExpr->op ){
816cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
817cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
818cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
819cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
820cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
821cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
822cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
823cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
824cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
825cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
826cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
827cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
828cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
829cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
830cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
831cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
832cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
833cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
834bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
835bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
836bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
837bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
838bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
839bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
840cce7d176Sdrh     default: break;
841cce7d176Sdrh   }
842cce7d176Sdrh   switch( pExpr->op ){
843967e8b73Sdrh     case TK_COLUMN: {
8442282792aSdrh       if( pParse->useAgg ){
84599fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
846c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
84799fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
848c4a3c779Sdrh       }else{
84999fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
8502282792aSdrh       }
851cce7d176Sdrh       break;
852cce7d176Sdrh     }
853ef6764a1Sdrh     case TK_FLOAT:
854cce7d176Sdrh     case TK_INTEGER: {
8557a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
856a76b5dfcSdrh       assert( pExpr->token.z );
8577a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
858cce7d176Sdrh       break;
859cce7d176Sdrh     }
860cce7d176Sdrh     case TK_STRING: {
86199fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
862a76b5dfcSdrh       assert( pExpr->token.z );
863cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
864cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
865cce7d176Sdrh       break;
866cce7d176Sdrh     }
867cce7d176Sdrh     case TK_NULL: {
86899fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
869cce7d176Sdrh       break;
870cce7d176Sdrh     }
871cce7d176Sdrh     case TK_AND:
872cce7d176Sdrh     case TK_OR:
873cce7d176Sdrh     case TK_PLUS:
874cce7d176Sdrh     case TK_STAR:
875cce7d176Sdrh     case TK_MINUS:
876bf4133cbSdrh     case TK_REM:
877bf4133cbSdrh     case TK_BITAND:
878bf4133cbSdrh     case TK_BITOR:
879cce7d176Sdrh     case TK_SLASH: {
880cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
881cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
88299fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
883cce7d176Sdrh       break;
884cce7d176Sdrh     }
885bf4133cbSdrh     case TK_LSHIFT:
886bf4133cbSdrh     case TK_RSHIFT: {
887bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
888bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
889bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
890bf4133cbSdrh       break;
891bf4133cbSdrh     }
8920040077dSdrh     case TK_CONCAT: {
8930040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
8940040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
89599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
8960040077dSdrh       break;
8970040077dSdrh     }
898cce7d176Sdrh     case TK_LT:
899cce7d176Sdrh     case TK_LE:
900cce7d176Sdrh     case TK_GT:
901cce7d176Sdrh     case TK_GE:
902cce7d176Sdrh     case TK_NE:
903cce7d176Sdrh     case TK_EQ:
904cce7d176Sdrh     case TK_LIKE:
905cce7d176Sdrh     case TK_GLOB: {
906cce7d176Sdrh       int dest;
90799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
908cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
909cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
910cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
91199fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
91299fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
913cce7d176Sdrh       break;
914cce7d176Sdrh     }
915cce7d176Sdrh     case TK_UMINUS: {
9166e142f54Sdrh       assert( pExpr->pLeft );
9177a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
9186e142f54Sdrh         Token *p = &pExpr->pLeft->token;
9196e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
9206e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
92199fcd718Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
92299fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
9236e142f54Sdrh         sqliteFree(z);
9246e142f54Sdrh         break;
9256e142f54Sdrh       }
9261ccde15dSdrh       /* Fall through into TK_NOT */
9276e142f54Sdrh     }
928bf4133cbSdrh     case TK_BITNOT:
9296e142f54Sdrh     case TK_NOT: {
930cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
93199fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
932cce7d176Sdrh       break;
933cce7d176Sdrh     }
934cce7d176Sdrh     case TK_ISNULL:
935cce7d176Sdrh     case TK_NOTNULL: {
936cce7d176Sdrh       int dest;
93799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
938cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
939cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
94099fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
94199fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
942cce7d176Sdrh       break;
943cce7d176Sdrh     }
9442282792aSdrh     case TK_AGG_FUNCTION: {
94599fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
946967e8b73Sdrh       if( pExpr->iColumn==FN_Avg ){
9472282792aSdrh         assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
94899fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
94999fcd718Sdrh         sqliteVdbeAddOp(v, OP_Divide, 0, 0);
9502282792aSdrh       }
9512282792aSdrh       break;
9522282792aSdrh     }
953cce7d176Sdrh     case TK_FUNCTION: {
954967e8b73Sdrh       int id = pExpr->iColumn;
955cce7d176Sdrh       int op;
956cce7d176Sdrh       int i;
957cce7d176Sdrh       ExprList *pList = pExpr->pList;
9586ec2733bSdrh       switch( id ){
9596ec2733bSdrh         case FN_Min:
9606ec2733bSdrh         case FN_Max: {
961cce7d176Sdrh           op = id==FN_Min ? OP_Min : OP_Max;
962cce7d176Sdrh           for(i=0; i<pList->nExpr; i++){
963cce7d176Sdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
964cce7d176Sdrh             if( i>0 ){
96599fcd718Sdrh               sqliteVdbeAddOp(v, op, 0, 0);
966cce7d176Sdrh             }
967cce7d176Sdrh           }
968cce7d176Sdrh           break;
969cce7d176Sdrh         }
970bf4133cbSdrh         case FN_Abs: {
971bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
972bf4133cbSdrh           sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
973bf4133cbSdrh           break;
974bf4133cbSdrh         }
975bf4133cbSdrh         case FN_Round: {
976bf4133cbSdrh           if( pList->nExpr==2 ){
977bf4133cbSdrh             sqliteExprCode(pParse, pList->a[1].pExpr);
978bf4133cbSdrh           }else{
979bf4133cbSdrh             sqliteVdbeAddOp(v, OP_Integer, 0, 0);
980bf4133cbSdrh           }
981bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
982bf4133cbSdrh           sqliteVdbeAddOp(v, OP_Precision, 0, 0);
983bf4133cbSdrh           break;
984bf4133cbSdrh         }
9856ec2733bSdrh         case FN_Length: {
9866ec2733bSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
98799fcd718Sdrh           sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
9886ec2733bSdrh           break;
9896ec2733bSdrh         }
9906ec2733bSdrh         case FN_Substr: {
9916ec2733bSdrh           for(i=0; i<pList->nExpr; i++){
9926ec2733bSdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
9936ec2733bSdrh           }
99499fcd718Sdrh           sqliteVdbeAddOp(v, OP_Substr, 0, 0);
9956ec2733bSdrh           break;
9966ec2733bSdrh         }
9978e0a2f90Sdrh         case FN_Unknown: {
9988e0a2f90Sdrh           UserFunc *pUser;
9998e0a2f90Sdrh           pUser = sqliteFindUserFunction(pParse->db,
10008e0a2f90Sdrh                       pExpr->token.z, pExpr->token.n, pList->nExpr, 0);
10018e0a2f90Sdrh           assert( pUser!=0 );
10028e0a2f90Sdrh           for(i=0; i<pList->nExpr; i++){
10038e0a2f90Sdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
10048e0a2f90Sdrh           }
10058e0a2f90Sdrh           sqliteVdbeAddOp(v, OP_UserFunc, pList->nExpr, 0);
10068e0a2f90Sdrh           sqliteVdbeChangeP3(v, -1, (char*)pUser->xFunc, P3_POINTER);
10078e0a2f90Sdrh           break;
10088e0a2f90Sdrh         }
10096ec2733bSdrh         default: {
10106ec2733bSdrh           /* Can't happen! */
10116ec2733bSdrh           break;
10126ec2733bSdrh         }
10136ec2733bSdrh       }
10146ec2733bSdrh       break;
10156ec2733bSdrh     }
101619a775c2Sdrh     case TK_SELECT: {
101799fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
101819a775c2Sdrh       break;
101919a775c2Sdrh     }
1020fef5208cSdrh     case TK_IN: {
1021fef5208cSdrh       int addr;
102299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
1023fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1024fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1025fef5208cSdrh       if( pExpr->pSelect ){
102699fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
1027fef5208cSdrh       }else{
102899fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
1029fef5208cSdrh       }
103099fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
1031fef5208cSdrh       break;
1032fef5208cSdrh     }
1033fef5208cSdrh     case TK_BETWEEN: {
1034fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
103599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
1036fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
103799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
1038fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
1039fef5208cSdrh       break;
1040fef5208cSdrh     }
1041a2e00042Sdrh     case TK_AS: {
1042a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1043a2e00042Sdrh       break;
1044a2e00042Sdrh     }
1045cce7d176Sdrh   }
1046cce7d176Sdrh   return;
1047cce7d176Sdrh }
1048cce7d176Sdrh 
1049cce7d176Sdrh /*
1050cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
1051cce7d176Sdrh ** to the label "dest" if the expression is true but execution
1052cce7d176Sdrh ** continues straight thru if the expression is false.
1053cce7d176Sdrh */
1054cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
1055cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1056cce7d176Sdrh   int op = 0;
1057daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1058cce7d176Sdrh   switch( pExpr->op ){
1059cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
1060cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
1061cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
1062cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
1063cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
1064cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
1065cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
1066cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
1067cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
1068cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
1069cce7d176Sdrh     default:  break;
1070cce7d176Sdrh   }
1071cce7d176Sdrh   switch( pExpr->op ){
1072cce7d176Sdrh     case TK_AND: {
1073cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1074cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
1075cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
1076cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1077cce7d176Sdrh       break;
1078cce7d176Sdrh     }
1079cce7d176Sdrh     case TK_OR: {
1080cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
1081cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
1082cce7d176Sdrh       break;
1083cce7d176Sdrh     }
1084cce7d176Sdrh     case TK_NOT: {
1085cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
1086cce7d176Sdrh       break;
1087cce7d176Sdrh     }
1088cce7d176Sdrh     case TK_LT:
1089cce7d176Sdrh     case TK_LE:
1090cce7d176Sdrh     case TK_GT:
1091cce7d176Sdrh     case TK_GE:
1092cce7d176Sdrh     case TK_NE:
1093cce7d176Sdrh     case TK_EQ:
1094cce7d176Sdrh     case TK_LIKE:
1095cce7d176Sdrh     case TK_GLOB: {
1096cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1097cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
109899fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1099cce7d176Sdrh       break;
1100cce7d176Sdrh     }
1101cce7d176Sdrh     case TK_ISNULL:
1102cce7d176Sdrh     case TK_NOTNULL: {
1103cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
110499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1105cce7d176Sdrh       break;
1106cce7d176Sdrh     }
1107fef5208cSdrh     case TK_IN: {
1108cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1109fef5208cSdrh       if( pExpr->pSelect ){
111099fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
1111fef5208cSdrh       }else{
111299fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
1113fef5208cSdrh       }
1114fef5208cSdrh       break;
1115fef5208cSdrh     }
1116fef5208cSdrh     case TK_BETWEEN: {
1117fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
1118fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
111999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1120fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
112199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
1122fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
112399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest);
112499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
112599fcd718Sdrh       sqliteVdbeResolveLabel(v, lbl);
112699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1127fef5208cSdrh       break;
1128fef5208cSdrh     }
1129cce7d176Sdrh     default: {
1130cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
113199fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
1132cce7d176Sdrh       break;
1133cce7d176Sdrh     }
1134cce7d176Sdrh   }
1135cce7d176Sdrh }
1136cce7d176Sdrh 
1137cce7d176Sdrh /*
113866b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
1139cce7d176Sdrh ** to the label "dest" if the expression is false but execution
1140cce7d176Sdrh ** continues straight thru if the expression is true.
1141cce7d176Sdrh */
1142cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
1143cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1144cce7d176Sdrh   int op = 0;
1145daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1146cce7d176Sdrh   switch( pExpr->op ){
1147cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
1148cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
1149cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
1150cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
1151cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
1152cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
1153cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
1154cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
1155cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
1156cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
1157cce7d176Sdrh     default:  break;
1158cce7d176Sdrh   }
1159cce7d176Sdrh   switch( pExpr->op ){
1160cce7d176Sdrh     case TK_AND: {
1161cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
1162cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
1163cce7d176Sdrh       break;
1164cce7d176Sdrh     }
1165cce7d176Sdrh     case TK_OR: {
1166cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1167cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
1168cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
1169cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1170cce7d176Sdrh       break;
1171cce7d176Sdrh     }
1172cce7d176Sdrh     case TK_NOT: {
1173cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
1174cce7d176Sdrh       break;
1175cce7d176Sdrh     }
1176cce7d176Sdrh     case TK_LT:
1177cce7d176Sdrh     case TK_LE:
1178cce7d176Sdrh     case TK_GT:
1179cce7d176Sdrh     case TK_GE:
1180cce7d176Sdrh     case TK_NE:
1181cce7d176Sdrh     case TK_EQ: {
1182cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1183cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
118499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1185cce7d176Sdrh       break;
1186cce7d176Sdrh     }
1187cce7d176Sdrh     case TK_LIKE:
1188cce7d176Sdrh     case TK_GLOB: {
1189cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1190cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
119199fcd718Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1192cce7d176Sdrh       break;
1193cce7d176Sdrh     }
1194cce7d176Sdrh     case TK_ISNULL:
1195cce7d176Sdrh     case TK_NOTNULL: {
1196cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
119799fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1198cce7d176Sdrh       break;
1199cce7d176Sdrh     }
1200fef5208cSdrh     case TK_IN: {
1201cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1202fef5208cSdrh       if( pExpr->pSelect ){
120399fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1204fef5208cSdrh       }else{
120599fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1206fef5208cSdrh       }
1207fef5208cSdrh       break;
1208fef5208cSdrh     }
1209fef5208cSdrh     case TK_BETWEEN: {
1210fef5208cSdrh       int addr;
1211fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
121299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1213fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1214fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
121599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
121699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
121799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
1218fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
121999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest);
1220fef5208cSdrh       break;
1221fef5208cSdrh     }
1222cce7d176Sdrh     default: {
1223cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
122499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0);
122599fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
1226cce7d176Sdrh       break;
1227cce7d176Sdrh     }
1228cce7d176Sdrh   }
1229cce7d176Sdrh }
12302282792aSdrh 
12312282792aSdrh /*
12322282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
12332282792aSdrh ** if they are identical and return FALSE if they differ in any way.
12342282792aSdrh */
1235d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
12362282792aSdrh   int i;
12372282792aSdrh   if( pA==0 ){
12382282792aSdrh     return pB==0;
12392282792aSdrh   }else if( pB==0 ){
12402282792aSdrh     return 0;
12412282792aSdrh   }
12422282792aSdrh   if( pA->op!=pB->op ) return 0;
1243d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1244d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
12452282792aSdrh   if( pA->pList ){
12462282792aSdrh     if( pB->pList==0 ) return 0;
12472282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
12482282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1249d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
12502282792aSdrh         return 0;
12512282792aSdrh       }
12522282792aSdrh     }
12532282792aSdrh   }else if( pB->pList ){
12542282792aSdrh     return 0;
12552282792aSdrh   }
12562282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
12572282792aSdrh   if( pA->token.z ){
12582282792aSdrh     if( pB->token.z==0 ) return 0;
12592282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
12602282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
12612282792aSdrh   }
12622282792aSdrh   return 1;
12632282792aSdrh }
12642282792aSdrh 
12652282792aSdrh /*
12662282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
12672282792aSdrh */
12682282792aSdrh static int appendAggInfo(Parse *pParse){
12692282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
12702282792aSdrh     int amt = pParse->nAgg + 8;
12716d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
12726d4abfbeSdrh     if( aAgg==0 ){
12732282792aSdrh       return -1;
12742282792aSdrh     }
12756d4abfbeSdrh     pParse->aAgg = aAgg;
12762282792aSdrh   }
12772282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
12782282792aSdrh   return pParse->nAgg++;
12792282792aSdrh }
12802282792aSdrh 
12812282792aSdrh /*
12822282792aSdrh ** Analyze the given expression looking for aggregate functions and
12832282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
12842282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
12852282792aSdrh **
12862282792aSdrh ** This routine should only be called after the expression has been
12872282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
12882282792aSdrh **
12892282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
12902282792aSdrh ** the number of errors.
12912282792aSdrh */
12922282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
12932282792aSdrh   int i;
12942282792aSdrh   AggExpr *aAgg;
12952282792aSdrh   int nErr = 0;
12962282792aSdrh 
12972282792aSdrh   if( pExpr==0 ) return 0;
12982282792aSdrh   switch( pExpr->op ){
1299967e8b73Sdrh     case TK_COLUMN: {
13002282792aSdrh       aAgg = pParse->aAgg;
13012282792aSdrh       for(i=0; i<pParse->nAgg; i++){
13022282792aSdrh         if( aAgg[i].isAgg ) continue;
13032282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1304967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
13052282792aSdrh           break;
13062282792aSdrh         }
13072282792aSdrh       }
13082282792aSdrh       if( i>=pParse->nAgg ){
13092282792aSdrh         i = appendAggInfo(pParse);
13102282792aSdrh         if( i<0 ) return 1;
13112282792aSdrh         pParse->aAgg[i].isAgg = 0;
13122282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
13132282792aSdrh       }
1314aaf88729Sdrh       pExpr->iAgg = i;
13152282792aSdrh       break;
13162282792aSdrh     }
13172282792aSdrh     case TK_AGG_FUNCTION: {
1318967e8b73Sdrh       if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
13192282792aSdrh         if( pParse->iAggCount>=0 ){
13202282792aSdrh           i = pParse->iAggCount;
13212282792aSdrh         }else{
13222282792aSdrh           i = appendAggInfo(pParse);
13232282792aSdrh           if( i<0 ) return 1;
13242282792aSdrh           pParse->aAgg[i].isAgg = 1;
13252282792aSdrh           pParse->aAgg[i].pExpr = 0;
13262282792aSdrh           pParse->iAggCount = i;
13272282792aSdrh         }
1328967e8b73Sdrh         if( pExpr->iColumn==FN_Count ){
13292282792aSdrh           pExpr->iAgg = i;
13302282792aSdrh           break;
13312282792aSdrh         }
13322282792aSdrh       }
13332282792aSdrh       aAgg = pParse->aAgg;
13342282792aSdrh       for(i=0; i<pParse->nAgg; i++){
13352282792aSdrh         if( !aAgg[i].isAgg ) continue;
1336d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
13372282792aSdrh           break;
13382282792aSdrh         }
13392282792aSdrh       }
13402282792aSdrh       if( i>=pParse->nAgg ){
13412282792aSdrh         i = appendAggInfo(pParse);
13422282792aSdrh         if( i<0 ) return 1;
13432282792aSdrh         pParse->aAgg[i].isAgg = 1;
13442282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
1345e5095355Sdrh         if( pExpr->iColumn==FN_Unknown ){
1346e5095355Sdrh           pParse->aAgg[i].pUser = sqliteFindUserFunction(pParse->db,
1347e5095355Sdrh              pExpr->token.z, pExpr->token.n, pExpr->pList->nExpr, 0);
1348e5095355Sdrh         }else{
1349e5095355Sdrh           pParse->aAgg[i].pUser = 0;
1350e5095355Sdrh         }
13512282792aSdrh       }
13522282792aSdrh       pExpr->iAgg = i;
13532282792aSdrh       break;
13542282792aSdrh     }
13552282792aSdrh     default: {
13562282792aSdrh       if( pExpr->pLeft ){
13572282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
13582282792aSdrh       }
13592282792aSdrh       if( nErr==0 && pExpr->pRight ){
13602282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
13612282792aSdrh       }
13622282792aSdrh       if( nErr==0 && pExpr->pList ){
13632282792aSdrh         int n = pExpr->pList->nExpr;
13642282792aSdrh         int i;
13652282792aSdrh         for(i=0; nErr==0 && i<n; i++){
13662282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
13672282792aSdrh         }
13682282792aSdrh       }
13692282792aSdrh       break;
13702282792aSdrh     }
13712282792aSdrh   }
13722282792aSdrh   return nErr;
13732282792aSdrh }
13748e0a2f90Sdrh 
13758e0a2f90Sdrh /*
13768e0a2f90Sdrh ** Locate a user function given a name and a number of arguments.
13778e0a2f90Sdrh ** Return a pointer to the UserFunc structure that defines that
13788e0a2f90Sdrh ** function, or return NULL if the function does not exist.
13798e0a2f90Sdrh **
13808e0a2f90Sdrh ** If the createFlag argument is true, then a new (blank) UserFunc
13818e0a2f90Sdrh ** structure is created and liked into the "db" structure if a
13828e0a2f90Sdrh ** no matching function previously existed.  When createFlag is true
13838e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts
13848e0a2f90Sdrh ** any number of arguments will be returned.
13858e0a2f90Sdrh **
13868e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid
13878e0a2f90Sdrh ** function found is returned.  A function is valid if either xFunc
13888e0a2f90Sdrh ** or xStep is non-zero.
13898e0a2f90Sdrh */
13908e0a2f90Sdrh UserFunc *sqliteFindUserFunction(
13918e0a2f90Sdrh   sqlite *db,        /* An open database */
13928e0a2f90Sdrh   const char *zName, /* Name of the function.  Not null-terminated */
13938e0a2f90Sdrh   int nName,         /* Number of characters in the name */
13948e0a2f90Sdrh   int nArg,          /* Number of arguments.  -1 means any number */
13958e0a2f90Sdrh   int createFlag     /* Create new entry if true and does not otherwise exist */
13968e0a2f90Sdrh ){
13978e0a2f90Sdrh   UserFunc *pFirst, *p, *pMaybe;
13988e0a2f90Sdrh   pFirst = p = (UserFunc*)sqliteHashFind(&db->userFunc, zName, nName);
13998e0a2f90Sdrh   if( !createFlag && nArg<0 ){
14008e0a2f90Sdrh     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
14018e0a2f90Sdrh     return p;
14028e0a2f90Sdrh   }
14038e0a2f90Sdrh   pMaybe = 0;
14048e0a2f90Sdrh   while( p && p->nArg!=nArg ){
14058e0a2f90Sdrh     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
14068e0a2f90Sdrh     p = p->pNext;
14078e0a2f90Sdrh   }
14088e0a2f90Sdrh   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
14098e0a2f90Sdrh     return 0;
14108e0a2f90Sdrh   }
14118e0a2f90Sdrh   if( p==0 && pMaybe ){
14128e0a2f90Sdrh     assert( createFlag==0 );
14138e0a2f90Sdrh     return pMaybe;
14148e0a2f90Sdrh   }
14158e0a2f90Sdrh   if( p==0 && createFlag ){
14168e0a2f90Sdrh     p = sqliteMalloc( sizeof(*p) );
14178e0a2f90Sdrh     p->nArg = nArg;
14188e0a2f90Sdrh     p->pNext = pFirst;
14198e0a2f90Sdrh     sqliteHashInsert(&db->userFunc, zName, nName, (void*)p);
14208e0a2f90Sdrh   }
14218e0a2f90Sdrh   return p;
14228e0a2f90Sdrh }
1423