xref: /sqlite-3.40.0/src/expr.c (revision a76b5dfc)
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*a76b5dfcSdrh ** $Id: expr.c,v 1.42 2002/02/23 02:32:10 drh Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
18cce7d176Sdrh 
19a2e00042Sdrh 
20a2e00042Sdrh /*
21*a76b5dfcSdrh ** Construct a new expression node and return a pointer to it.  Memory
22*a76b5dfcSdrh ** for this node is obtained from sqliteMalloc().  The calling function
23*a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed.
24*a76b5dfcSdrh */
25*a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
26*a76b5dfcSdrh   Expr *pNew;
27*a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
28*a76b5dfcSdrh   if( pNew==0 ){
29*a76b5dfcSdrh     sqliteExprDelete(pLeft);
30*a76b5dfcSdrh     sqliteExprDelete(pRight);
31*a76b5dfcSdrh     return 0;
32*a76b5dfcSdrh   }
33*a76b5dfcSdrh   pNew->op = op;
34*a76b5dfcSdrh   pNew->pLeft = pLeft;
35*a76b5dfcSdrh   pNew->pRight = pRight;
36*a76b5dfcSdrh   if( pToken ){
37*a76b5dfcSdrh     pNew->token = *pToken;
38*a76b5dfcSdrh   }else{
39*a76b5dfcSdrh     pNew->token.z = 0;
40*a76b5dfcSdrh     pNew->token.n = 0;
41*a76b5dfcSdrh   }
42*a76b5dfcSdrh   if( pLeft && pRight ){
43*a76b5dfcSdrh     sqliteExprSpan(pNew, &pLeft->span, &pRight->span);
44*a76b5dfcSdrh   }else{
45*a76b5dfcSdrh     pNew->span = pNew->token;
46*a76b5dfcSdrh   }
47*a76b5dfcSdrh   return pNew;
48*a76b5dfcSdrh }
49*a76b5dfcSdrh 
50*a76b5dfcSdrh /*
51*a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all
52*a76b5dfcSdrh ** text between the two given tokens.
53*a76b5dfcSdrh */
54*a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
55*a76b5dfcSdrh   if( pExpr ){
56*a76b5dfcSdrh     pExpr->span.z = pLeft->z;
57*a76b5dfcSdrh     pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
58*a76b5dfcSdrh   }
59*a76b5dfcSdrh }
60*a76b5dfcSdrh 
61*a76b5dfcSdrh /*
62*a76b5dfcSdrh ** Construct a new expression node for a function with multiple
63*a76b5dfcSdrh ** arguments.
64*a76b5dfcSdrh */
65*a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){
66*a76b5dfcSdrh   Expr *pNew;
67*a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
68*a76b5dfcSdrh   if( pNew==0 ){
69*a76b5dfcSdrh     sqliteExprListDelete(pList);
70*a76b5dfcSdrh     return 0;
71*a76b5dfcSdrh   }
72*a76b5dfcSdrh   pNew->op = TK_FUNCTION;
73*a76b5dfcSdrh   pNew->pList = pList;
74*a76b5dfcSdrh   if( pToken ){
75*a76b5dfcSdrh     pNew->token = *pToken;
76*a76b5dfcSdrh   }else{
77*a76b5dfcSdrh     pNew->token.z = 0;
78*a76b5dfcSdrh     pNew->token.n = 0;
79*a76b5dfcSdrh   }
80*a76b5dfcSdrh   return pNew;
81*a76b5dfcSdrh }
82*a76b5dfcSdrh 
83*a76b5dfcSdrh /*
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 /*
98*a76b5dfcSdrh ** The following group of functions are used to translate the string
99*a76b5dfcSdrh ** pointers of tokens in expression from one buffer to another.
100*a76b5dfcSdrh **
101*a76b5dfcSdrh ** Normally, the Expr.token.z and Expr.span.z fields point into the
102*a76b5dfcSdrh ** original input buffer of an SQL statement.  This is usually OK
103*a76b5dfcSdrh ** since the SQL statement is executed and the expression is deleted
104*a76b5dfcSdrh ** before the input buffer is freed.  Making the tokens point to the
105*a76b5dfcSdrh ** original input buffer saves many calls to malloc() and thus helps
106*a76b5dfcSdrh ** the library to run faster.
107*a76b5dfcSdrh **
108*a76b5dfcSdrh ** But sometimes we need an expression to persist past the time when
109*a76b5dfcSdrh ** the input buffer is freed.  (Example: The SELECT clause of a
110*a76b5dfcSdrh ** CREATE VIEW statement contains expressions that must persist for
111*a76b5dfcSdrh ** the life of the view.)  When that happens we have to make a
112*a76b5dfcSdrh ** persistent copy of the input buffer and translate the Expr.token.z
113*a76b5dfcSdrh ** and Expr.span.z fields to point to the copy rather than the
114*a76b5dfcSdrh ** original input buffer.  The following group of routines to that
115*a76b5dfcSdrh ** translation.
116*a76b5dfcSdrh **
117*a76b5dfcSdrh ** The "offset" parameter is the distance from the original input buffer
118*a76b5dfcSdrh ** to the persistent copy.  These routines recursively walk the entire
119*a76b5dfcSdrh ** expression tree and shift all tokens by "offset" amount.
120*a76b5dfcSdrh **
121*a76b5dfcSdrh ** The work of figuring out the appropriate "offset" and making the
122*a76b5dfcSdrh ** presistent copy of the input buffer is done by the calling routine.
123*a76b5dfcSdrh */
124*a76b5dfcSdrh void sqliteExprMoveStrings(Expr *p, int offset){
125*a76b5dfcSdrh   if( p==0 ) return;
126*a76b5dfcSdrh   if( p->token.z ) p->token.z += offset;
127*a76b5dfcSdrh   if( p->span.z ) p->span.z += offset;
128*a76b5dfcSdrh   if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset);
129*a76b5dfcSdrh   if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset);
130*a76b5dfcSdrh   if( p->pList ) sqliteExprListMoveStrings(p->pList, offset);
131*a76b5dfcSdrh   if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset);
132*a76b5dfcSdrh }
133*a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){
134*a76b5dfcSdrh   int i;
135*a76b5dfcSdrh   if( pList==0 ) return;
136*a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
137*a76b5dfcSdrh     sqliteExprMoveStrings(pList->a[i].pExpr, offset);
138*a76b5dfcSdrh   }
139*a76b5dfcSdrh }
140*a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){
141*a76b5dfcSdrh   if( pSelect==0 ) return;
142*a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pEList, offset);
143*a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pWhere, offset);
144*a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pGroupBy, offset);
145*a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pHaving, offset);
146*a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pOrderBy, offset);
147*a76b5dfcSdrh   sqliteSelectMoveStrings(pSelect->pPrior, offset);
148*a76b5dfcSdrh }
149*a76b5dfcSdrh 
150*a76b5dfcSdrh /*
151*a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
152*a76b5dfcSdrh ** initially NULL, then create a new expression list.
153*a76b5dfcSdrh */
154*a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
155*a76b5dfcSdrh   int i;
156*a76b5dfcSdrh   if( pList==0 ){
157*a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
158*a76b5dfcSdrh     if( pList==0 ){
159*a76b5dfcSdrh       sqliteExprDelete(pExpr);
160*a76b5dfcSdrh       return 0;
161*a76b5dfcSdrh     }
162*a76b5dfcSdrh   }
163*a76b5dfcSdrh   if( (pList->nExpr & 7)==0 ){
164*a76b5dfcSdrh     int n = pList->nExpr + 8;
165*a76b5dfcSdrh     struct ExprList_item *a;
166*a76b5dfcSdrh     a = sqliteRealloc(pList->a, n*sizeof(pList->a[0]));
167*a76b5dfcSdrh     if( a==0 ){
168*a76b5dfcSdrh       sqliteExprDelete(pExpr);
169*a76b5dfcSdrh       return pList;
170*a76b5dfcSdrh     }
171*a76b5dfcSdrh     pList->a = a;
172*a76b5dfcSdrh   }
173*a76b5dfcSdrh   if( pExpr || pName ){
174*a76b5dfcSdrh     i = pList->nExpr++;
175*a76b5dfcSdrh     pList->a[i].pExpr = pExpr;
176*a76b5dfcSdrh     pList->a[i].zName = 0;
177*a76b5dfcSdrh     if( pName ){
178*a76b5dfcSdrh       sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0);
179*a76b5dfcSdrh       sqliteDequote(pList->a[i].zName);
180*a76b5dfcSdrh     }
181*a76b5dfcSdrh   }
182*a76b5dfcSdrh   return pList;
183*a76b5dfcSdrh }
184*a76b5dfcSdrh 
185*a76b5dfcSdrh /*
186*a76b5dfcSdrh ** Delete an entire expression list.
187*a76b5dfcSdrh */
188*a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){
189*a76b5dfcSdrh   int i;
190*a76b5dfcSdrh   if( pList==0 ) return;
191*a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
192*a76b5dfcSdrh     sqliteExprDelete(pList->a[i].pExpr);
193*a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
194*a76b5dfcSdrh   }
195*a76b5dfcSdrh   sqliteFree(pList->a);
196*a76b5dfcSdrh   sqliteFree(pList);
197*a76b5dfcSdrh }
198*a76b5dfcSdrh 
199*a76b5dfcSdrh /*
200fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
201fef5208cSdrh ** and 0 if it involves variables.
202fef5208cSdrh */
2039208643dSdrh int sqliteExprIsConstant(Expr *p){
204fef5208cSdrh   switch( p->op ){
205fef5208cSdrh     case TK_ID:
206967e8b73Sdrh     case TK_COLUMN:
207fef5208cSdrh     case TK_DOT:
208fef5208cSdrh       return 0;
2099208643dSdrh     case TK_INTEGER:
2109208643dSdrh     case TK_FLOAT:
2119208643dSdrh     case TK_STRING:
2129208643dSdrh       return 1;
213fef5208cSdrh     default: {
2149208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
2159208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
216fef5208cSdrh       if( p->pList ){
217fef5208cSdrh         int i;
218fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
2199208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
220fef5208cSdrh         }
221fef5208cSdrh       }
2229208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
223fef5208cSdrh     }
224fef5208cSdrh   }
2259208643dSdrh   return 0;
226fef5208cSdrh }
227fef5208cSdrh 
228fef5208cSdrh /*
2294794b980Sdrh ** Walk the expression tree and process operators of the form:
2304794b980Sdrh **
2314794b980Sdrh **       expr IN (SELECT ...)
2324794b980Sdrh **
233967e8b73Sdrh ** These operators have to be processed before column names are
2344794b980Sdrh ** resolved because each such operator increments pParse->nTab
2351ccde15dSdrh ** to reserve cursor numbers for its own use.  But pParse->nTab
236aacc543eSdrh ** needs to be constant once we begin resolving column names.  For
237aacc543eSdrh ** that reason, this procedure needs to be called on every expression
238aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression.
2394794b980Sdrh **
2404794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this
2414794b980Sdrh ** routine.  This routine allocates a cursor number to the IN-SELECT
2424794b980Sdrh ** and then moves on.  The code generation is done by
2434794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards.
2444794b980Sdrh */
2454794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
2464794b980Sdrh   if( pExpr==0 ) return;
2474794b980Sdrh   if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
2484794b980Sdrh     pExpr->iTable = pParse->nTab++;
2494794b980Sdrh   }else{
2504794b980Sdrh     if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
2514794b980Sdrh     if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
2524794b980Sdrh     if( pExpr->pList ){
2534794b980Sdrh       int i;
2544794b980Sdrh       ExprList *pList = pExpr->pList;
2554794b980Sdrh       for(i=0; i<pList->nExpr; i++){
2564794b980Sdrh         sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
2574794b980Sdrh       }
2584794b980Sdrh     }
2594794b980Sdrh   }
2604794b980Sdrh }
2614794b980Sdrh 
2624794b980Sdrh /*
263c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
264c4a3c779Sdrh */
265c4a3c779Sdrh static int sqliteIsRowid(const char *z){
266c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
267c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
268c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
269c4a3c779Sdrh   return 0;
270c4a3c779Sdrh }
271c4a3c779Sdrh 
272c4a3c779Sdrh /*
273cce7d176Sdrh ** This routine walks an expression tree and resolves references to
274967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
275aacc543eSdrh ** index to the table in the table list and a column offset.  The
276aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
277aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
278aacc543eSdrh ** plus the pParse->nTab value.  This value will ultimately become the
279aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
280aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
281aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
282aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
283aacc543eSdrh ** alias for ROWID.
28419a775c2Sdrh **
285fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
286fef5208cSdrh ** forms:
287fef5208cSdrh **
288fef5208cSdrh **           expr IN (exprlist)
289fef5208cSdrh ** and
290fef5208cSdrh **           expr IN (SELECT ...)
291fef5208cSdrh **
292fef5208cSdrh ** The first form is handled by creating a set holding the list
293fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
294fef5208cSdrh ** a temporary table.
295fef5208cSdrh **
296fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
29719a775c2Sdrh ** If it finds any, it generates code to write the value of that select
29819a775c2Sdrh ** into a memory cell.
299cce7d176Sdrh **
300967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
301cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
302cce7d176Sdrh */
303a2e00042Sdrh int sqliteExprResolveIds(
304a2e00042Sdrh   Parse *pParse,     /* The parser context */
305a2e00042Sdrh   IdList *pTabList,  /* List of tables used to resolve column names */
306a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
307a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
308a2e00042Sdrh ){
309daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
310cce7d176Sdrh   switch( pExpr->op ){
311a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
312a2e00042Sdrh     **
313a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
314a2e00042Sdrh     **
315a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
316a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
317a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
318a2e00042Sdrh     **
319a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
320a2e00042Sdrh     */
321cce7d176Sdrh     case TK_ID: {
322cce7d176Sdrh       int cnt = 0;      /* Number of matches */
323cce7d176Sdrh       int i;            /* Loop counter */
324*a76b5dfcSdrh       char *z;
325*a76b5dfcSdrh       assert( pExpr->token.z );
326*a76b5dfcSdrh       z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
3272f4392ffSdrh       sqliteDequote(z);
328daffd0e5Sdrh       if( z==0 ) return 1;
329cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
330cce7d176Sdrh         int j;
331cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
332cce7d176Sdrh         if( pTab==0 ) continue;
333cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
3347020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
335cce7d176Sdrh             cnt++;
33619a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
3374a32431cSdrh             if( j==pTab->iPKey ){
3384a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
3394a32431cSdrh               pExpr->iColumn = -1;
3404a32431cSdrh             }else{
341967e8b73Sdrh               pExpr->iColumn = j;
342cce7d176Sdrh             }
343a2e00042Sdrh             pExpr->op = TK_COLUMN;
344a2e00042Sdrh           }
345a2e00042Sdrh         }
346a2e00042Sdrh       }
347a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
348a2e00042Sdrh         int j;
349a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
350a2e00042Sdrh           char *zAs = pEList->a[j].zName;
351a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
352a2e00042Sdrh             cnt++;
353a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
354a2e00042Sdrh             pExpr->op = TK_AS;
355a2e00042Sdrh             pExpr->iColumn = j;
356a2e00042Sdrh             pExpr->pLeft = pEList->a[j].pExpr;
357cce7d176Sdrh           }
358cce7d176Sdrh         }
3594a32431cSdrh       }
360c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
361c4a3c779Sdrh         pExpr->iColumn = -1;
362c4a3c779Sdrh         pExpr->iTable = pParse->nTab;
363c4a3c779Sdrh         cnt = 1 + (pTabList->nId>1);
364a2e00042Sdrh         pExpr->op = TK_COLUMN;
365c4a3c779Sdrh       }
366cce7d176Sdrh       sqliteFree(z);
367cce7d176Sdrh       if( cnt==0 ){
368967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
369cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
370cce7d176Sdrh         pParse->nErr++;
371cce7d176Sdrh         return 1;
372cce7d176Sdrh       }else if( cnt>1 ){
373967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
374cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
375cce7d176Sdrh         pParse->nErr++;
376cce7d176Sdrh         return 1;
377cce7d176Sdrh       }
378cce7d176Sdrh       break;
379cce7d176Sdrh     }
380cce7d176Sdrh 
381967e8b73Sdrh     /* A table name and column name:  ID.ID */
382cce7d176Sdrh     case TK_DOT: {
383cce7d176Sdrh       int cnt = 0;             /* Number of matches */
384c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
385cce7d176Sdrh       int i;                   /* Loop counter */
386cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
387cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
388cce7d176Sdrh 
389cce7d176Sdrh       pLeft = pExpr->pLeft;
390cce7d176Sdrh       pRight = pExpr->pRight;
391*a76b5dfcSdrh       assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );
392*a76b5dfcSdrh       assert( pRight && pRight->op==TK_ID && pRight->token.z );
3936e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
3946e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
395daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
396daffd0e5Sdrh         sqliteFree(zLeft);
397daffd0e5Sdrh         sqliteFree(zRight);
398daffd0e5Sdrh         return 1;
399daffd0e5Sdrh       }
40087c40e88Sdrh       sqliteDequote(zLeft);
40187c40e88Sdrh       sqliteDequote(zRight);
402c4a3c779Sdrh       pExpr->iTable = -1;
403cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
404cce7d176Sdrh         int j;
405cce7d176Sdrh         char *zTab;
406cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
407cce7d176Sdrh         if( pTab==0 ) continue;
408cce7d176Sdrh         if( pTabList->a[i].zAlias ){
409cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
410cce7d176Sdrh         }else{
411cce7d176Sdrh           zTab = pTab->zName;
412cce7d176Sdrh         }
413cce7d176Sdrh         if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
414c4a3c779Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
415cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
4167020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
417cce7d176Sdrh             cnt++;
41819a775c2Sdrh             pExpr->iTable = i + pParse->nTab;
4194a32431cSdrh             if( j==pTab->iPKey ){
4204a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
4214a32431cSdrh               pExpr->iColumn = -1;
4224a32431cSdrh             }else{
423967e8b73Sdrh               pExpr->iColumn = j;
424cce7d176Sdrh             }
425cce7d176Sdrh           }
426cce7d176Sdrh         }
4274a32431cSdrh       }
428c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
429c4a3c779Sdrh         cnt = 1;
430c4a3c779Sdrh         pExpr->iColumn = -1;
431c4a3c779Sdrh       }
432cce7d176Sdrh       sqliteFree(zLeft);
433cce7d176Sdrh       sqliteFree(zRight);
434cce7d176Sdrh       if( cnt==0 ){
435967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
436cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
437cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
438cce7d176Sdrh         pParse->nErr++;
439cce7d176Sdrh         return 1;
440cce7d176Sdrh       }else if( cnt>1 ){
441967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
442cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
443cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
444cce7d176Sdrh         pParse->nErr++;
445cce7d176Sdrh         return 1;
446cce7d176Sdrh       }
447cce7d176Sdrh       sqliteExprDelete(pLeft);
448cce7d176Sdrh       pExpr->pLeft = 0;
449cce7d176Sdrh       sqliteExprDelete(pRight);
450cce7d176Sdrh       pExpr->pRight = 0;
451967e8b73Sdrh       pExpr->op = TK_COLUMN;
452cce7d176Sdrh       break;
453cce7d176Sdrh     }
454cce7d176Sdrh 
455fef5208cSdrh     case TK_IN: {
456d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
457fef5208cSdrh       if( v==0 ) return 1;
458a2e00042Sdrh       if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
459cfab11bcSdrh         return 1;
460cfab11bcSdrh       }
461fef5208cSdrh       if( pExpr->pSelect ){
462fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
463fef5208cSdrh         **
464fef5208cSdrh         ** Generate code to write the results of the select into a temporary
4654794b980Sdrh         ** table.  The cursor number of the temporary table has already
4664794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
467fef5208cSdrh         */
468c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
469fef5208cSdrh         if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
470fef5208cSdrh       }else if( pExpr->pList ){
471fef5208cSdrh         /* Case 2:     expr IN (exprlist)
472fef5208cSdrh         **
473fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
474fef5208cSdrh         ** in iTable.
475fef5208cSdrh         */
476fef5208cSdrh         int i, iSet;
477fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
478fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
4799208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
480fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
481fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
482fef5208cSdrh             pParse->nErr++;
483fef5208cSdrh             return 1;
484fef5208cSdrh           }
4854794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
4864794b980Sdrh             return 1;
4874794b980Sdrh           }
488fef5208cSdrh         }
489fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
490fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
491fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
492fef5208cSdrh           switch( pE2->op ){
493fef5208cSdrh             case TK_FLOAT:
494fef5208cSdrh             case TK_INTEGER:
495fef5208cSdrh             case TK_STRING: {
49699fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
497*a76b5dfcSdrh               assert( pE2->token.z );
498fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
499fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
500fef5208cSdrh               break;
501fef5208cSdrh             }
502fef5208cSdrh             default: {
503fef5208cSdrh               sqliteExprCode(pParse, pE2);
50499fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
505fef5208cSdrh               break;
506fef5208cSdrh             }
507fef5208cSdrh           }
508fef5208cSdrh         }
509fef5208cSdrh       }
510cfab11bcSdrh       break;
511fef5208cSdrh     }
512fef5208cSdrh 
51319a775c2Sdrh     case TK_SELECT: {
514fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
515fef5208cSdrh       ** value of this select in a memory cell and record the number
516967e8b73Sdrh       ** of the memory cell in iColumn.
517fef5208cSdrh       */
518967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
519967e8b73Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
52019a775c2Sdrh         return 1;
52119a775c2Sdrh       }
52219a775c2Sdrh       break;
52319a775c2Sdrh     }
52419a775c2Sdrh 
525cce7d176Sdrh     /* For all else, just recursively walk the tree */
526cce7d176Sdrh     default: {
527cce7d176Sdrh       if( pExpr->pLeft
528a2e00042Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
529cce7d176Sdrh         return 1;
530cce7d176Sdrh       }
531cce7d176Sdrh       if( pExpr->pRight
532a2e00042Sdrh       && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){
533cce7d176Sdrh         return 1;
534cce7d176Sdrh       }
535cce7d176Sdrh       if( pExpr->pList ){
536cce7d176Sdrh         int i;
537cce7d176Sdrh         ExprList *pList = pExpr->pList;
538cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
539a2e00042Sdrh           if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){
540cce7d176Sdrh             return 1;
541cce7d176Sdrh           }
542cce7d176Sdrh         }
543cce7d176Sdrh       }
544cce7d176Sdrh     }
545cce7d176Sdrh   }
546cce7d176Sdrh   return 0;
547cce7d176Sdrh }
548cce7d176Sdrh 
549cce7d176Sdrh #if 0 /* NOT USED */
550cce7d176Sdrh /*
551cce7d176Sdrh ** Compare a token against a string.  Return TRUE if they match.
552cce7d176Sdrh */
553cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){
554cce7d176Sdrh   int n = strlen(zStr);
555cce7d176Sdrh   if( n!=pToken->n ) return 0;
556cce7d176Sdrh   return sqliteStrNICmp(pToken->z, zStr, n)==0;
557cce7d176Sdrh }
558cce7d176Sdrh #endif
559cce7d176Sdrh 
560cce7d176Sdrh /*
561cce7d176Sdrh ** Convert a function name into its integer identifier.  Return the
562cce7d176Sdrh ** identifier.  Return FN_Unknown if the function name is unknown.
563cce7d176Sdrh */
564cce7d176Sdrh int sqliteFuncId(Token *pToken){
565cce7d176Sdrh   static const struct {
566cce7d176Sdrh      char *zName;
567cce7d176Sdrh      int len;
568cce7d176Sdrh      int id;
569cce7d176Sdrh   } aFunc[] = {
570cce7d176Sdrh      { "count",  5, FN_Count  },
571cce7d176Sdrh      { "min",    3, FN_Min    },
572cce7d176Sdrh      { "max",    3, FN_Max    },
573cce7d176Sdrh      { "sum",    3, FN_Sum    },
5742282792aSdrh      { "avg",    3, FN_Avg    },
5756ec2733bSdrh      { "length", 6, FN_Length },
5766ec2733bSdrh      { "substr", 6, FN_Substr },
577bf4133cbSdrh      { "abs",    3, FN_Abs    },
578bf4133cbSdrh      { "round",  5, FN_Round  },
579cce7d176Sdrh   };
580cce7d176Sdrh   int i;
581cce7d176Sdrh   for(i=0; i<ArraySize(aFunc); i++){
582cce7d176Sdrh     if( aFunc[i].len==pToken->n
583cce7d176Sdrh      && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
584cce7d176Sdrh        return aFunc[i].id;
585cce7d176Sdrh     }
586cce7d176Sdrh   }
587cce7d176Sdrh   return FN_Unknown;
588cce7d176Sdrh }
589cce7d176Sdrh 
590cce7d176Sdrh /*
591cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
592cce7d176Sdrh ** function names are recognized and all functions have the correct
593cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
594cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
595cce7d176Sdrh **
596cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
597cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
598cce7d176Sdrh */
599cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
600cce7d176Sdrh   int nErr = 0;
601cce7d176Sdrh   if( pExpr==0 ) return 0;
602cce7d176Sdrh   switch( pExpr->op ){
603cce7d176Sdrh     case TK_FUNCTION: {
604cce7d176Sdrh       int id = sqliteFuncId(&pExpr->token);
605cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
606cce7d176Sdrh       int no_such_func = 0;
607cce7d176Sdrh       int too_many_args = 0;
608cce7d176Sdrh       int too_few_args = 0;
609cce7d176Sdrh       int is_agg = 0;
610cce7d176Sdrh       int i;
611967e8b73Sdrh       pExpr->iColumn = id;
612cce7d176Sdrh       switch( id ){
613cce7d176Sdrh         case FN_Unknown: {
614cce7d176Sdrh           no_such_func = 1;
615cce7d176Sdrh           break;
616cce7d176Sdrh         }
617cce7d176Sdrh         case FN_Count: {
618cce7d176Sdrh           no_such_func = !allowAgg;
619cce7d176Sdrh           too_many_args = n>1;
620cce7d176Sdrh           is_agg = 1;
621cce7d176Sdrh           break;
622cce7d176Sdrh         }
623cce7d176Sdrh         case FN_Max:
624cce7d176Sdrh         case FN_Min: {
625cce7d176Sdrh           too_few_args = allowAgg ? n<1 : n<2;
626cce7d176Sdrh           is_agg = n==1;
627cce7d176Sdrh           break;
628cce7d176Sdrh         }
6292282792aSdrh         case FN_Avg:
630cce7d176Sdrh         case FN_Sum: {
631cce7d176Sdrh           no_such_func = !allowAgg;
632cce7d176Sdrh           too_many_args = n>1;
633cce7d176Sdrh           too_few_args = n<1;
634cce7d176Sdrh           is_agg = 1;
635cce7d176Sdrh           break;
636cce7d176Sdrh         }
637bf4133cbSdrh         case FN_Abs:
6386ec2733bSdrh         case FN_Length: {
6396ec2733bSdrh           too_few_args = n<1;
6406ec2733bSdrh           too_many_args = n>1;
6416ec2733bSdrh           break;
6426ec2733bSdrh         }
643bf4133cbSdrh         case FN_Round: {
644bf4133cbSdrh           too_few_args = n<1;
645bf4133cbSdrh           too_many_args = n>2;
646bf4133cbSdrh           break;
647bf4133cbSdrh         }
6486ec2733bSdrh         case FN_Substr: {
6496ec2733bSdrh           too_few_args = n<3;
6506ec2733bSdrh           too_many_args = n>3;
6516ec2733bSdrh           break;
6526ec2733bSdrh         }
653cce7d176Sdrh         default: break;
654cce7d176Sdrh       }
655cce7d176Sdrh       if( no_such_func ){
656cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
657cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
658cce7d176Sdrh         pParse->nErr++;
659cce7d176Sdrh         nErr++;
660cce7d176Sdrh       }else if( too_many_args ){
661cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
662cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
663cce7d176Sdrh         pParse->nErr++;
664cce7d176Sdrh         nErr++;
665cce7d176Sdrh       }else if( too_few_args ){
666cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
667cce7d176Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
668cce7d176Sdrh         pParse->nErr++;
669cce7d176Sdrh         nErr++;
670cce7d176Sdrh       }
6712282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
672cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
673cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
6744cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
6754cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
676cce7d176Sdrh       }
677cce7d176Sdrh     }
678cce7d176Sdrh     default: {
679cce7d176Sdrh       if( pExpr->pLeft ){
6802282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
681cce7d176Sdrh       }
682cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
6832282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
684cce7d176Sdrh       }
685fef5208cSdrh       if( nErr==0 && pExpr->pList ){
686fef5208cSdrh         int n = pExpr->pList->nExpr;
687fef5208cSdrh         int i;
688fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
6892282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
6902282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
691fef5208cSdrh         }
692fef5208cSdrh       }
693cce7d176Sdrh       break;
694cce7d176Sdrh     }
695cce7d176Sdrh   }
696cce7d176Sdrh   return nErr;
697cce7d176Sdrh }
698cce7d176Sdrh 
699cce7d176Sdrh /*
700cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
7011ccde15dSdrh ** expression and leave the result on the top of stack.
702cce7d176Sdrh */
703cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
704cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
705cce7d176Sdrh   int op;
706daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
707cce7d176Sdrh   switch( pExpr->op ){
708cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
709cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
710cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
711cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
712cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
713cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
714cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
715cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
716cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
717cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
718cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
719cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
720cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
721cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
722cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
723cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
724cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
725cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
726bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
727bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
728bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
729bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
730bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
731bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
732cce7d176Sdrh     default: break;
733cce7d176Sdrh   }
734cce7d176Sdrh   switch( pExpr->op ){
735967e8b73Sdrh     case TK_COLUMN: {
7362282792aSdrh       if( pParse->useAgg ){
73799fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
738c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
73999fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
740c4a3c779Sdrh       }else{
74199fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
7422282792aSdrh       }
743cce7d176Sdrh       break;
744cce7d176Sdrh     }
745ef6764a1Sdrh     case TK_FLOAT:
746cce7d176Sdrh     case TK_INTEGER: {
7477a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
748*a76b5dfcSdrh       assert( pExpr->token.z );
7497a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
750cce7d176Sdrh       break;
751cce7d176Sdrh     }
752cce7d176Sdrh     case TK_STRING: {
75399fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
754*a76b5dfcSdrh       assert( pExpr->token.z );
755cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
756cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
757cce7d176Sdrh       break;
758cce7d176Sdrh     }
759cce7d176Sdrh     case TK_NULL: {
76099fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
761cce7d176Sdrh       break;
762cce7d176Sdrh     }
763cce7d176Sdrh     case TK_AND:
764cce7d176Sdrh     case TK_OR:
765cce7d176Sdrh     case TK_PLUS:
766cce7d176Sdrh     case TK_STAR:
767cce7d176Sdrh     case TK_MINUS:
768bf4133cbSdrh     case TK_REM:
769bf4133cbSdrh     case TK_BITAND:
770bf4133cbSdrh     case TK_BITOR:
771cce7d176Sdrh     case TK_SLASH: {
772cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
773cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
77499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
775cce7d176Sdrh       break;
776cce7d176Sdrh     }
777bf4133cbSdrh     case TK_LSHIFT:
778bf4133cbSdrh     case TK_RSHIFT: {
779bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
780bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
781bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
782bf4133cbSdrh       break;
783bf4133cbSdrh     }
7840040077dSdrh     case TK_CONCAT: {
7850040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
7860040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
78799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
7880040077dSdrh       break;
7890040077dSdrh     }
790cce7d176Sdrh     case TK_LT:
791cce7d176Sdrh     case TK_LE:
792cce7d176Sdrh     case TK_GT:
793cce7d176Sdrh     case TK_GE:
794cce7d176Sdrh     case TK_NE:
795cce7d176Sdrh     case TK_EQ:
796cce7d176Sdrh     case TK_LIKE:
797cce7d176Sdrh     case TK_GLOB: {
798cce7d176Sdrh       int dest;
79999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
800cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
801cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
802cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
80399fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
80499fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
805cce7d176Sdrh       break;
806cce7d176Sdrh     }
807cce7d176Sdrh     case TK_UMINUS: {
8086e142f54Sdrh       assert( pExpr->pLeft );
8097a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
8106e142f54Sdrh         Token *p = &pExpr->pLeft->token;
8116e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
8126e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
81399fcd718Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
81499fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
8156e142f54Sdrh         sqliteFree(z);
8166e142f54Sdrh         break;
8176e142f54Sdrh       }
8181ccde15dSdrh       /* Fall through into TK_NOT */
8196e142f54Sdrh     }
820bf4133cbSdrh     case TK_BITNOT:
8216e142f54Sdrh     case TK_NOT: {
822cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
82399fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
824cce7d176Sdrh       break;
825cce7d176Sdrh     }
826cce7d176Sdrh     case TK_ISNULL:
827cce7d176Sdrh     case TK_NOTNULL: {
828cce7d176Sdrh       int dest;
82999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
830cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
831cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
83299fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
83399fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
834cce7d176Sdrh       break;
835cce7d176Sdrh     }
8362282792aSdrh     case TK_AGG_FUNCTION: {
83799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
838967e8b73Sdrh       if( pExpr->iColumn==FN_Avg ){
8392282792aSdrh         assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
84099fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
84199fcd718Sdrh         sqliteVdbeAddOp(v, OP_Divide, 0, 0);
8422282792aSdrh       }
8432282792aSdrh       break;
8442282792aSdrh     }
845cce7d176Sdrh     case TK_FUNCTION: {
846967e8b73Sdrh       int id = pExpr->iColumn;
847cce7d176Sdrh       int op;
848cce7d176Sdrh       int i;
849cce7d176Sdrh       ExprList *pList = pExpr->pList;
8506ec2733bSdrh       switch( id ){
8516ec2733bSdrh         case FN_Min:
8526ec2733bSdrh         case FN_Max: {
853cce7d176Sdrh           op = id==FN_Min ? OP_Min : OP_Max;
854cce7d176Sdrh           for(i=0; i<pList->nExpr; i++){
855cce7d176Sdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
856cce7d176Sdrh             if( i>0 ){
85799fcd718Sdrh               sqliteVdbeAddOp(v, op, 0, 0);
858cce7d176Sdrh             }
859cce7d176Sdrh           }
860cce7d176Sdrh           break;
861cce7d176Sdrh         }
862bf4133cbSdrh         case FN_Abs: {
863bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
864bf4133cbSdrh           sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
865bf4133cbSdrh           break;
866bf4133cbSdrh         }
867bf4133cbSdrh         case FN_Round: {
868bf4133cbSdrh           if( pList->nExpr==2 ){
869bf4133cbSdrh             sqliteExprCode(pParse, pList->a[1].pExpr);
870bf4133cbSdrh           }else{
871bf4133cbSdrh             sqliteVdbeAddOp(v, OP_Integer, 0, 0);
872bf4133cbSdrh           }
873bf4133cbSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
874bf4133cbSdrh           sqliteVdbeAddOp(v, OP_Precision, 0, 0);
875bf4133cbSdrh           break;
876bf4133cbSdrh         }
8776ec2733bSdrh         case FN_Length: {
8786ec2733bSdrh           sqliteExprCode(pParse, pList->a[0].pExpr);
87999fcd718Sdrh           sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
8806ec2733bSdrh           break;
8816ec2733bSdrh         }
8826ec2733bSdrh         case FN_Substr: {
8836ec2733bSdrh           for(i=0; i<pList->nExpr; i++){
8846ec2733bSdrh             sqliteExprCode(pParse, pList->a[i].pExpr);
8856ec2733bSdrh           }
88699fcd718Sdrh           sqliteVdbeAddOp(v, OP_Substr, 0, 0);
8876ec2733bSdrh           break;
8886ec2733bSdrh         }
8896ec2733bSdrh         default: {
8906ec2733bSdrh           /* Can't happen! */
8916ec2733bSdrh           break;
8926ec2733bSdrh         }
8936ec2733bSdrh       }
8946ec2733bSdrh       break;
8956ec2733bSdrh     }
89619a775c2Sdrh     case TK_SELECT: {
89799fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
89819a775c2Sdrh       break;
89919a775c2Sdrh     }
900fef5208cSdrh     case TK_IN: {
901fef5208cSdrh       int addr;
90299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
903fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
904fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
905fef5208cSdrh       if( pExpr->pSelect ){
90699fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
907fef5208cSdrh       }else{
90899fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
909fef5208cSdrh       }
91099fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
911fef5208cSdrh       break;
912fef5208cSdrh     }
913fef5208cSdrh     case TK_BETWEEN: {
914fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
91599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
916fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
91799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
918fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
919fef5208cSdrh       break;
920fef5208cSdrh     }
921a2e00042Sdrh     case TK_AS: {
922a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
923a2e00042Sdrh       break;
924a2e00042Sdrh     }
925cce7d176Sdrh   }
926cce7d176Sdrh   return;
927cce7d176Sdrh }
928cce7d176Sdrh 
929cce7d176Sdrh /*
930cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
931cce7d176Sdrh ** to the label "dest" if the expression is true but execution
932cce7d176Sdrh ** continues straight thru if the expression is false.
933cce7d176Sdrh */
934cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
935cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
936cce7d176Sdrh   int op = 0;
937daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
938cce7d176Sdrh   switch( pExpr->op ){
939cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
940cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
941cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
942cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
943cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
944cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
945cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
946cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
947cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
948cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
949cce7d176Sdrh     default:  break;
950cce7d176Sdrh   }
951cce7d176Sdrh   switch( pExpr->op ){
952cce7d176Sdrh     case TK_AND: {
953cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
954cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
955cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
956cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
957cce7d176Sdrh       break;
958cce7d176Sdrh     }
959cce7d176Sdrh     case TK_OR: {
960cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
961cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
962cce7d176Sdrh       break;
963cce7d176Sdrh     }
964cce7d176Sdrh     case TK_NOT: {
965cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
966cce7d176Sdrh       break;
967cce7d176Sdrh     }
968cce7d176Sdrh     case TK_LT:
969cce7d176Sdrh     case TK_LE:
970cce7d176Sdrh     case TK_GT:
971cce7d176Sdrh     case TK_GE:
972cce7d176Sdrh     case TK_NE:
973cce7d176Sdrh     case TK_EQ:
974cce7d176Sdrh     case TK_LIKE:
975cce7d176Sdrh     case TK_GLOB: {
976cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
977cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
97899fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
979cce7d176Sdrh       break;
980cce7d176Sdrh     }
981cce7d176Sdrh     case TK_ISNULL:
982cce7d176Sdrh     case TK_NOTNULL: {
983cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
98499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
985cce7d176Sdrh       break;
986cce7d176Sdrh     }
987fef5208cSdrh     case TK_IN: {
988cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
989fef5208cSdrh       if( pExpr->pSelect ){
99099fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
991fef5208cSdrh       }else{
99299fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
993fef5208cSdrh       }
994fef5208cSdrh       break;
995fef5208cSdrh     }
996fef5208cSdrh     case TK_BETWEEN: {
997fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
998fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
99999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1000fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
100199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
1002fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
100399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest);
100499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
100599fcd718Sdrh       sqliteVdbeResolveLabel(v, lbl);
100699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1007fef5208cSdrh       break;
1008fef5208cSdrh     }
1009cce7d176Sdrh     default: {
1010cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
101199fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
1012cce7d176Sdrh       break;
1013cce7d176Sdrh     }
1014cce7d176Sdrh   }
1015cce7d176Sdrh }
1016cce7d176Sdrh 
1017cce7d176Sdrh /*
101866b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
1019cce7d176Sdrh ** to the label "dest" if the expression is false but execution
1020cce7d176Sdrh ** continues straight thru if the expression is true.
1021cce7d176Sdrh */
1022cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
1023cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1024cce7d176Sdrh   int op = 0;
1025daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1026cce7d176Sdrh   switch( pExpr->op ){
1027cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
1028cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
1029cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
1030cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
1031cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
1032cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
1033cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
1034cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
1035cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
1036cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
1037cce7d176Sdrh     default:  break;
1038cce7d176Sdrh   }
1039cce7d176Sdrh   switch( pExpr->op ){
1040cce7d176Sdrh     case TK_AND: {
1041cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
1042cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
1043cce7d176Sdrh       break;
1044cce7d176Sdrh     }
1045cce7d176Sdrh     case TK_OR: {
1046cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1047cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
1048cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
1049cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1050cce7d176Sdrh       break;
1051cce7d176Sdrh     }
1052cce7d176Sdrh     case TK_NOT: {
1053cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
1054cce7d176Sdrh       break;
1055cce7d176Sdrh     }
1056cce7d176Sdrh     case TK_LT:
1057cce7d176Sdrh     case TK_LE:
1058cce7d176Sdrh     case TK_GT:
1059cce7d176Sdrh     case TK_GE:
1060cce7d176Sdrh     case TK_NE:
1061cce7d176Sdrh     case TK_EQ: {
1062cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1063cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
106499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1065cce7d176Sdrh       break;
1066cce7d176Sdrh     }
1067cce7d176Sdrh     case TK_LIKE:
1068cce7d176Sdrh     case TK_GLOB: {
1069cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1070cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
107199fcd718Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1072cce7d176Sdrh       break;
1073cce7d176Sdrh     }
1074cce7d176Sdrh     case TK_ISNULL:
1075cce7d176Sdrh     case TK_NOTNULL: {
1076cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
107799fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1078cce7d176Sdrh       break;
1079cce7d176Sdrh     }
1080fef5208cSdrh     case TK_IN: {
1081cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1082fef5208cSdrh       if( pExpr->pSelect ){
108399fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1084fef5208cSdrh       }else{
108599fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1086fef5208cSdrh       }
1087fef5208cSdrh       break;
1088fef5208cSdrh     }
1089fef5208cSdrh     case TK_BETWEEN: {
1090fef5208cSdrh       int addr;
1091fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
109299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1093fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1094fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
109599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
109699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
109799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
1098fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
109999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest);
1100fef5208cSdrh       break;
1101fef5208cSdrh     }
1102cce7d176Sdrh     default: {
1103cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
110499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0);
110599fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
1106cce7d176Sdrh       break;
1107cce7d176Sdrh     }
1108cce7d176Sdrh   }
1109cce7d176Sdrh }
11102282792aSdrh 
11112282792aSdrh /*
11122282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
11132282792aSdrh ** if they are identical and return FALSE if they differ in any way.
11142282792aSdrh */
1115d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
11162282792aSdrh   int i;
11172282792aSdrh   if( pA==0 ){
11182282792aSdrh     return pB==0;
11192282792aSdrh   }else if( pB==0 ){
11202282792aSdrh     return 0;
11212282792aSdrh   }
11222282792aSdrh   if( pA->op!=pB->op ) return 0;
1123d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1124d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
11252282792aSdrh   if( pA->pList ){
11262282792aSdrh     if( pB->pList==0 ) return 0;
11272282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
11282282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1129d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
11302282792aSdrh         return 0;
11312282792aSdrh       }
11322282792aSdrh     }
11332282792aSdrh   }else if( pB->pList ){
11342282792aSdrh     return 0;
11352282792aSdrh   }
11362282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
11372282792aSdrh   if( pA->token.z ){
11382282792aSdrh     if( pB->token.z==0 ) return 0;
11392282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
11402282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
11412282792aSdrh   }
11422282792aSdrh   return 1;
11432282792aSdrh }
11442282792aSdrh 
11452282792aSdrh /*
11462282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
11472282792aSdrh */
11482282792aSdrh static int appendAggInfo(Parse *pParse){
11492282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
11502282792aSdrh     int amt = pParse->nAgg + 8;
11516d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
11526d4abfbeSdrh     if( aAgg==0 ){
11532282792aSdrh       return -1;
11542282792aSdrh     }
11556d4abfbeSdrh     pParse->aAgg = aAgg;
11562282792aSdrh   }
11572282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
11582282792aSdrh   return pParse->nAgg++;
11592282792aSdrh }
11602282792aSdrh 
11612282792aSdrh /*
11622282792aSdrh ** Analyze the given expression looking for aggregate functions and
11632282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
11642282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
11652282792aSdrh **
11662282792aSdrh ** This routine should only be called after the expression has been
11672282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
11682282792aSdrh **
11692282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
11702282792aSdrh ** the number of errors.
11712282792aSdrh */
11722282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
11732282792aSdrh   int i;
11742282792aSdrh   AggExpr *aAgg;
11752282792aSdrh   int nErr = 0;
11762282792aSdrh 
11772282792aSdrh   if( pExpr==0 ) return 0;
11782282792aSdrh   switch( pExpr->op ){
1179967e8b73Sdrh     case TK_COLUMN: {
11802282792aSdrh       aAgg = pParse->aAgg;
11812282792aSdrh       for(i=0; i<pParse->nAgg; i++){
11822282792aSdrh         if( aAgg[i].isAgg ) continue;
11832282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1184967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
11852282792aSdrh           break;
11862282792aSdrh         }
11872282792aSdrh       }
11882282792aSdrh       if( i>=pParse->nAgg ){
11892282792aSdrh         i = appendAggInfo(pParse);
11902282792aSdrh         if( i<0 ) return 1;
11912282792aSdrh         pParse->aAgg[i].isAgg = 0;
11922282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
11932282792aSdrh       }
1194aaf88729Sdrh       pExpr->iAgg = i;
11952282792aSdrh       break;
11962282792aSdrh     }
11972282792aSdrh     case TK_AGG_FUNCTION: {
1198967e8b73Sdrh       if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
11992282792aSdrh         if( pParse->iAggCount>=0 ){
12002282792aSdrh           i = pParse->iAggCount;
12012282792aSdrh         }else{
12022282792aSdrh           i = appendAggInfo(pParse);
12032282792aSdrh           if( i<0 ) return 1;
12042282792aSdrh           pParse->aAgg[i].isAgg = 1;
12052282792aSdrh           pParse->aAgg[i].pExpr = 0;
12062282792aSdrh           pParse->iAggCount = i;
12072282792aSdrh         }
1208967e8b73Sdrh         if( pExpr->iColumn==FN_Count ){
12092282792aSdrh           pExpr->iAgg = i;
12102282792aSdrh           break;
12112282792aSdrh         }
12122282792aSdrh       }
12132282792aSdrh       aAgg = pParse->aAgg;
12142282792aSdrh       for(i=0; i<pParse->nAgg; i++){
12152282792aSdrh         if( !aAgg[i].isAgg ) continue;
1216d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
12172282792aSdrh           break;
12182282792aSdrh         }
12192282792aSdrh       }
12202282792aSdrh       if( i>=pParse->nAgg ){
12212282792aSdrh         i = appendAggInfo(pParse);
12222282792aSdrh         if( i<0 ) return 1;
12232282792aSdrh         pParse->aAgg[i].isAgg = 1;
12242282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
12252282792aSdrh       }
12262282792aSdrh       pExpr->iAgg = i;
12272282792aSdrh       break;
12282282792aSdrh     }
12292282792aSdrh     default: {
12302282792aSdrh       if( pExpr->pLeft ){
12312282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
12322282792aSdrh       }
12332282792aSdrh       if( nErr==0 && pExpr->pRight ){
12342282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
12352282792aSdrh       }
12362282792aSdrh       if( nErr==0 && pExpr->pList ){
12372282792aSdrh         int n = pExpr->pList->nExpr;
12382282792aSdrh         int i;
12392282792aSdrh         for(i=0; nErr==0 && i<n; i++){
12402282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
12412282792aSdrh         }
12422282792aSdrh       }
12432282792aSdrh       break;
12442282792aSdrh     }
12452282792aSdrh   }
12462282792aSdrh   return nErr;
12472282792aSdrh }
1248