xref: /sqlite-3.40.0/src/expr.c (revision 094b2bbf)
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*094b2bbfSdrh ** $Id: expr.c,v 1.56 2002/03/13 18:54:07 drh Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
18cce7d176Sdrh 
19a2e00042Sdrh 
20a2e00042Sdrh /*
21a76b5dfcSdrh ** Construct a new expression node and return a pointer to it.  Memory
22a76b5dfcSdrh ** for this node is obtained from sqliteMalloc().  The calling function
23a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed.
24a76b5dfcSdrh */
25a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
26a76b5dfcSdrh   Expr *pNew;
27a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
28a76b5dfcSdrh   if( pNew==0 ){
29a76b5dfcSdrh     sqliteExprDelete(pLeft);
30a76b5dfcSdrh     sqliteExprDelete(pRight);
31a76b5dfcSdrh     return 0;
32a76b5dfcSdrh   }
33a76b5dfcSdrh   pNew->op = op;
34a76b5dfcSdrh   pNew->pLeft = pLeft;
35a76b5dfcSdrh   pNew->pRight = pRight;
36a76b5dfcSdrh   if( pToken ){
37a76b5dfcSdrh     pNew->token = *pToken;
38a76b5dfcSdrh   }else{
39a76b5dfcSdrh     pNew->token.z = 0;
40a76b5dfcSdrh     pNew->token.n = 0;
41a76b5dfcSdrh   }
42a76b5dfcSdrh   if( pLeft && pRight ){
43a76b5dfcSdrh     sqliteExprSpan(pNew, &pLeft->span, &pRight->span);
44a76b5dfcSdrh   }else{
45a76b5dfcSdrh     pNew->span = pNew->token;
46a76b5dfcSdrh   }
47a76b5dfcSdrh   return pNew;
48a76b5dfcSdrh }
49a76b5dfcSdrh 
50a76b5dfcSdrh /*
51a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all
52a76b5dfcSdrh ** text between the two given tokens.
53a76b5dfcSdrh */
54a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
55a76b5dfcSdrh   if( pExpr ){
56a76b5dfcSdrh     pExpr->span.z = pLeft->z;
57a76b5dfcSdrh     pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
58a76b5dfcSdrh   }
59a76b5dfcSdrh }
60a76b5dfcSdrh 
61a76b5dfcSdrh /*
62a76b5dfcSdrh ** Construct a new expression node for a function with multiple
63a76b5dfcSdrh ** arguments.
64a76b5dfcSdrh */
65a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){
66a76b5dfcSdrh   Expr *pNew;
67a76b5dfcSdrh   pNew = sqliteMalloc( sizeof(Expr) );
68a76b5dfcSdrh   if( pNew==0 ){
69a76b5dfcSdrh     sqliteExprListDelete(pList);
70a76b5dfcSdrh     return 0;
71a76b5dfcSdrh   }
72a76b5dfcSdrh   pNew->op = TK_FUNCTION;
73a76b5dfcSdrh   pNew->pList = pList;
74a76b5dfcSdrh   if( pToken ){
75a76b5dfcSdrh     pNew->token = *pToken;
76a76b5dfcSdrh   }else{
77a76b5dfcSdrh     pNew->token.z = 0;
78a76b5dfcSdrh     pNew->token.n = 0;
79a76b5dfcSdrh   }
80a76b5dfcSdrh   return pNew;
81a76b5dfcSdrh }
82a76b5dfcSdrh 
83a76b5dfcSdrh /*
84a2e00042Sdrh ** Recursively delete an expression tree.
85a2e00042Sdrh */
86a2e00042Sdrh void sqliteExprDelete(Expr *p){
87a2e00042Sdrh   if( p==0 ) return;
88a2e00042Sdrh   if( p->pLeft ) sqliteExprDelete(p->pLeft);
89a2e00042Sdrh   if( p->pRight ) sqliteExprDelete(p->pRight);
90a2e00042Sdrh   if( p->pList ) sqliteExprListDelete(p->pList);
91a2e00042Sdrh   if( p->pSelect ) sqliteSelectDelete(p->pSelect);
92a2e00042Sdrh   sqliteFree(p);
93a2e00042Sdrh }
94a2e00042Sdrh 
95cce7d176Sdrh /*
96a76b5dfcSdrh ** The following group of functions are used to translate the string
97a76b5dfcSdrh ** pointers of tokens in expression from one buffer to another.
98a76b5dfcSdrh **
99a76b5dfcSdrh ** Normally, the Expr.token.z and Expr.span.z fields point into the
100a76b5dfcSdrh ** original input buffer of an SQL statement.  This is usually OK
101a76b5dfcSdrh ** since the SQL statement is executed and the expression is deleted
102a76b5dfcSdrh ** before the input buffer is freed.  Making the tokens point to the
103a76b5dfcSdrh ** original input buffer saves many calls to malloc() and thus helps
104a76b5dfcSdrh ** the library to run faster.
105a76b5dfcSdrh **
106a76b5dfcSdrh ** But sometimes we need an expression to persist past the time when
107a76b5dfcSdrh ** the input buffer is freed.  (Example: The SELECT clause of a
108a76b5dfcSdrh ** CREATE VIEW statement contains expressions that must persist for
109a76b5dfcSdrh ** the life of the view.)  When that happens we have to make a
110a76b5dfcSdrh ** persistent copy of the input buffer and translate the Expr.token.z
111a76b5dfcSdrh ** and Expr.span.z fields to point to the copy rather than the
112a2ed5601Sdrh ** original input buffer.  The following group of routines handle that
113a76b5dfcSdrh ** translation.
114a76b5dfcSdrh **
115a76b5dfcSdrh ** The "offset" parameter is the distance from the original input buffer
116a76b5dfcSdrh ** to the persistent copy.  These routines recursively walk the entire
117a76b5dfcSdrh ** expression tree and shift all tokens by "offset" amount.
118a76b5dfcSdrh **
119a76b5dfcSdrh ** The work of figuring out the appropriate "offset" and making the
120a76b5dfcSdrh ** presistent copy of the input buffer is done by the calling routine.
121a76b5dfcSdrh */
122a76b5dfcSdrh void sqliteExprMoveStrings(Expr *p, int offset){
123a76b5dfcSdrh   if( p==0 ) return;
124a76b5dfcSdrh   if( p->token.z ) p->token.z += offset;
125a76b5dfcSdrh   if( p->span.z ) p->span.z += offset;
126a76b5dfcSdrh   if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset);
127a76b5dfcSdrh   if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset);
128a76b5dfcSdrh   if( p->pList ) sqliteExprListMoveStrings(p->pList, offset);
129a76b5dfcSdrh   if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset);
130a76b5dfcSdrh }
131a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){
132a76b5dfcSdrh   int i;
133a76b5dfcSdrh   if( pList==0 ) return;
134a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
135a76b5dfcSdrh     sqliteExprMoveStrings(pList->a[i].pExpr, offset);
136a76b5dfcSdrh   }
137a76b5dfcSdrh }
138a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){
139a76b5dfcSdrh   if( pSelect==0 ) return;
140a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pEList, offset);
141a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pWhere, offset);
142a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pGroupBy, offset);
143a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pHaving, offset);
144a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pOrderBy, offset);
145a76b5dfcSdrh   sqliteSelectMoveStrings(pSelect->pPrior, offset);
146a76b5dfcSdrh }
147a76b5dfcSdrh 
148a76b5dfcSdrh /*
149ff78bd2fSdrh ** The following group of routines make deep copies of expressions,
150ff78bd2fSdrh ** expression lists, ID lists, and select statements.  The copies can
151ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines)
152ff78bd2fSdrh ** without effecting the originals.
153ff78bd2fSdrh **
154ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to
155ff78bd2fSdrh ** string space that is allocated separately from the expression tree
156ff78bd2fSdrh ** itself.  These routines do NOT duplicate that string space.
157ff78bd2fSdrh **
158ff78bd2fSdrh ** The expression list and ID list return by sqliteExprListDup() and
159ff78bd2fSdrh ** sqliteIdListDup() can not be further expanded by subsequent calls
160ff78bd2fSdrh ** to sqliteExprListAppend() or sqliteIdListAppend().
161ff78bd2fSdrh **
162ff78bd2fSdrh ** Any tables that the ID list might point to are not duplicated.
163ff78bd2fSdrh */
164ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){
165ff78bd2fSdrh   Expr *pNew;
166ff78bd2fSdrh   if( p==0 ) return 0;
167ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
168ff78bd2fSdrh   if( pNew==0 ) return 0;
169ff78bd2fSdrh   pNew->op = p->op;
170ff78bd2fSdrh   pNew->pLeft = sqliteExprDup(p->pLeft);
171ff78bd2fSdrh   pNew->pRight = sqliteExprDup(p->pRight);
172ff78bd2fSdrh   pNew->pList = sqliteExprListDup(p->pList);
173832508b7Sdrh   pNew->iTable = p->iTable;
174832508b7Sdrh   pNew->iColumn = p->iColumn;
175832508b7Sdrh   pNew->iAgg = p->iAgg;
176ff78bd2fSdrh   pNew->token = p->token;
177ff78bd2fSdrh   pNew->span = p->span;
178ff78bd2fSdrh   pNew->pSelect = sqliteSelectDup(p->pSelect);
179ff78bd2fSdrh   return pNew;
180ff78bd2fSdrh }
181ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){
182ff78bd2fSdrh   ExprList *pNew;
183ff78bd2fSdrh   int i;
184ff78bd2fSdrh   if( p==0 ) return 0;
185ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
186ff78bd2fSdrh   if( pNew==0 ) return 0;
187ff78bd2fSdrh   pNew->nExpr = p->nExpr;
188ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
189ff78bd2fSdrh   for(i=0; i<p->nExpr; i++){
190ff78bd2fSdrh     pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr);
191ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
192ff78bd2fSdrh     pNew->a[i].sortOrder = p->a[i].sortOrder;
193ff78bd2fSdrh     pNew->a[i].isAgg = p->a[i].isAgg;
194ff78bd2fSdrh     pNew->a[i].done = 0;
195ff78bd2fSdrh   }
196ff78bd2fSdrh   return pNew;
197ff78bd2fSdrh }
198ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){
199ff78bd2fSdrh   IdList *pNew;
200ff78bd2fSdrh   int i;
201ff78bd2fSdrh   if( p==0 ) return 0;
202ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
203ff78bd2fSdrh   if( pNew==0 ) return 0;
204ff78bd2fSdrh   pNew->nId = p->nId;
205ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) );
206ff78bd2fSdrh   for(i=0; i<p->nId; i++){
207ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
208ff78bd2fSdrh     pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias);
209ff78bd2fSdrh     pNew->a[i].idx = p->a[i].idx;
210ff78bd2fSdrh     pNew->a[i].pTab = 0;
211ff78bd2fSdrh     pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect);
212ff78bd2fSdrh   }
213ff78bd2fSdrh   return pNew;
214ff78bd2fSdrh }
215ff78bd2fSdrh Select *sqliteSelectDup(Select *p){
216ff78bd2fSdrh   Select *pNew;
217ff78bd2fSdrh   if( p==0 ) return 0;
218ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
219ff78bd2fSdrh   if( pNew==0 ) return 0;
220ff78bd2fSdrh   pNew->isDistinct = p->isDistinct;
221ff78bd2fSdrh   pNew->pEList = sqliteExprListDup(p->pEList);
222ff78bd2fSdrh   pNew->pSrc = sqliteIdListDup(p->pSrc);
223ff78bd2fSdrh   pNew->pWhere = sqliteExprDup(p->pWhere);
224ff78bd2fSdrh   pNew->pGroupBy = sqliteExprListDup(p->pGroupBy);
225ff78bd2fSdrh   pNew->pHaving = sqliteExprDup(p->pHaving);
226ff78bd2fSdrh   pNew->pOrderBy = sqliteExprListDup(p->pOrderBy);
227ff78bd2fSdrh   pNew->op = p->op;
228ff78bd2fSdrh   pNew->pPrior = sqliteSelectDup(p->pPrior);
229ff78bd2fSdrh   pNew->nLimit = p->nLimit;
230ff78bd2fSdrh   pNew->nOffset = p->nOffset;
231ff78bd2fSdrh   pNew->zSelect = 0;
232ff78bd2fSdrh   return pNew;
233ff78bd2fSdrh }
234ff78bd2fSdrh 
235ff78bd2fSdrh 
236ff78bd2fSdrh /*
237a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
238a76b5dfcSdrh ** initially NULL, then create a new expression list.
239a76b5dfcSdrh */
240a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
241a76b5dfcSdrh   int i;
242a76b5dfcSdrh   if( pList==0 ){
243a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
244a76b5dfcSdrh     if( pList==0 ){
245a76b5dfcSdrh       sqliteExprDelete(pExpr);
246a76b5dfcSdrh       return 0;
247a76b5dfcSdrh     }
248a76b5dfcSdrh   }
249a76b5dfcSdrh   if( (pList->nExpr & 7)==0 ){
250a76b5dfcSdrh     int n = pList->nExpr + 8;
251a76b5dfcSdrh     struct ExprList_item *a;
252a76b5dfcSdrh     a = sqliteRealloc(pList->a, n*sizeof(pList->a[0]));
253a76b5dfcSdrh     if( a==0 ){
254a76b5dfcSdrh       sqliteExprDelete(pExpr);
255a76b5dfcSdrh       return pList;
256a76b5dfcSdrh     }
257a76b5dfcSdrh     pList->a = a;
258a76b5dfcSdrh   }
259a76b5dfcSdrh   if( pExpr || pName ){
260a76b5dfcSdrh     i = pList->nExpr++;
261a76b5dfcSdrh     pList->a[i].pExpr = pExpr;
262a76b5dfcSdrh     pList->a[i].zName = 0;
263a76b5dfcSdrh     if( pName ){
264a76b5dfcSdrh       sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0);
265a76b5dfcSdrh       sqliteDequote(pList->a[i].zName);
266a76b5dfcSdrh     }
267a76b5dfcSdrh   }
268a76b5dfcSdrh   return pList;
269a76b5dfcSdrh }
270a76b5dfcSdrh 
271a76b5dfcSdrh /*
272a76b5dfcSdrh ** Delete an entire expression list.
273a76b5dfcSdrh */
274a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){
275a76b5dfcSdrh   int i;
276a76b5dfcSdrh   if( pList==0 ) return;
277a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
278a76b5dfcSdrh     sqliteExprDelete(pList->a[i].pExpr);
279a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
280a76b5dfcSdrh   }
281a76b5dfcSdrh   sqliteFree(pList->a);
282a76b5dfcSdrh   sqliteFree(pList);
283a76b5dfcSdrh }
284a76b5dfcSdrh 
285a76b5dfcSdrh /*
286fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
287fef5208cSdrh ** and 0 if it involves variables.
288fef5208cSdrh */
2899208643dSdrh int sqliteExprIsConstant(Expr *p){
290fef5208cSdrh   switch( p->op ){
291fef5208cSdrh     case TK_ID:
292967e8b73Sdrh     case TK_COLUMN:
293fef5208cSdrh     case TK_DOT:
294fef5208cSdrh       return 0;
2959208643dSdrh     case TK_INTEGER:
2969208643dSdrh     case TK_FLOAT:
2979208643dSdrh     case TK_STRING:
2989208643dSdrh       return 1;
299fef5208cSdrh     default: {
3009208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
3019208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
302fef5208cSdrh       if( p->pList ){
303fef5208cSdrh         int i;
304fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
3059208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
306fef5208cSdrh         }
307fef5208cSdrh       }
3089208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
309fef5208cSdrh     }
310fef5208cSdrh   }
3119208643dSdrh   return 0;
312fef5208cSdrh }
313fef5208cSdrh 
314fef5208cSdrh /*
315c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
316c4a3c779Sdrh */
317c4a3c779Sdrh static int sqliteIsRowid(const char *z){
318c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
319c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
320c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
321c4a3c779Sdrh   return 0;
322c4a3c779Sdrh }
323c4a3c779Sdrh 
324c4a3c779Sdrh /*
325cce7d176Sdrh ** This routine walks an expression tree and resolves references to
326967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
327aacc543eSdrh ** index to the table in the table list and a column offset.  The
328aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
329aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
330832508b7Sdrh ** plus the "base" value.  The base value will ultimately become the
331aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
332aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
333aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
334aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
335aacc543eSdrh ** alias for ROWID.
33619a775c2Sdrh **
337fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
338fef5208cSdrh ** forms:
339fef5208cSdrh **
340fef5208cSdrh **           expr IN (exprlist)
341fef5208cSdrh ** and
342fef5208cSdrh **           expr IN (SELECT ...)
343fef5208cSdrh **
344fef5208cSdrh ** The first form is handled by creating a set holding the list
345fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
346fef5208cSdrh ** a temporary table.
347fef5208cSdrh **
348fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
34919a775c2Sdrh ** If it finds any, it generates code to write the value of that select
35019a775c2Sdrh ** into a memory cell.
351cce7d176Sdrh **
352967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
353cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
354cce7d176Sdrh */
355a2e00042Sdrh int sqliteExprResolveIds(
356a2e00042Sdrh   Parse *pParse,     /* The parser context */
357832508b7Sdrh   int base,          /* VDBE cursor number for first entry in pTabList */
358a2e00042Sdrh   IdList *pTabList,  /* List of tables used to resolve column names */
359a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
360a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
361a2e00042Sdrh ){
362daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
363832508b7Sdrh   assert( base+pTabList->nId<=pParse->nTab );
364cce7d176Sdrh   switch( pExpr->op ){
365a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
366a2e00042Sdrh     **
367a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
368a2e00042Sdrh     **
369a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
370a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
371a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
372a2e00042Sdrh     **
373a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
374a2e00042Sdrh     */
375cce7d176Sdrh     case TK_ID: {
376cce7d176Sdrh       int cnt = 0;      /* Number of matches */
377cce7d176Sdrh       int i;            /* Loop counter */
378a76b5dfcSdrh       char *z;
379a76b5dfcSdrh       assert( pExpr->token.z );
380a76b5dfcSdrh       z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
3812f4392ffSdrh       sqliteDequote(z);
382daffd0e5Sdrh       if( z==0 ) return 1;
383cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
384cce7d176Sdrh         int j;
385cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
386cce7d176Sdrh         if( pTab==0 ) continue;
387417be79cSdrh         assert( pTab->nCol>0 );
388cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
3897020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
390cce7d176Sdrh             cnt++;
391832508b7Sdrh             pExpr->iTable = i + base;
3924a32431cSdrh             if( j==pTab->iPKey ){
3934a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
3944a32431cSdrh               pExpr->iColumn = -1;
3954a32431cSdrh             }else{
396967e8b73Sdrh               pExpr->iColumn = j;
397cce7d176Sdrh             }
398a2e00042Sdrh             pExpr->op = TK_COLUMN;
399a2e00042Sdrh           }
400a2e00042Sdrh         }
401a2e00042Sdrh       }
402a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
403a2e00042Sdrh         int j;
404a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
405a2e00042Sdrh           char *zAs = pEList->a[j].zName;
406a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
407a2e00042Sdrh             cnt++;
408a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
409a2e00042Sdrh             pExpr->op = TK_AS;
410a2e00042Sdrh             pExpr->iColumn = j;
41175148a27Sdrh             pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr);
412cce7d176Sdrh           }
413cce7d176Sdrh         }
4144a32431cSdrh       }
415c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
416c4a3c779Sdrh         pExpr->iColumn = -1;
417832508b7Sdrh         pExpr->iTable = base;
418c4a3c779Sdrh         cnt = 1 + (pTabList->nId>1);
419a2e00042Sdrh         pExpr->op = TK_COLUMN;
420c4a3c779Sdrh       }
421cce7d176Sdrh       sqliteFree(z);
422cce7d176Sdrh       if( cnt==0 ){
423967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
424cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
425cce7d176Sdrh         pParse->nErr++;
426cce7d176Sdrh         return 1;
427cce7d176Sdrh       }else if( cnt>1 ){
428967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
429cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
430cce7d176Sdrh         pParse->nErr++;
431cce7d176Sdrh         return 1;
432cce7d176Sdrh       }
433cce7d176Sdrh       break;
434cce7d176Sdrh     }
435cce7d176Sdrh 
436967e8b73Sdrh     /* A table name and column name:  ID.ID */
437cce7d176Sdrh     case TK_DOT: {
438cce7d176Sdrh       int cnt = 0;             /* Number of matches */
439c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
440cce7d176Sdrh       int i;                   /* Loop counter */
441cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
442cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
443cce7d176Sdrh 
444cce7d176Sdrh       pLeft = pExpr->pLeft;
445cce7d176Sdrh       pRight = pExpr->pRight;
446a76b5dfcSdrh       assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );
447a76b5dfcSdrh       assert( pRight && pRight->op==TK_ID && pRight->token.z );
4486e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
4496e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
450daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
451daffd0e5Sdrh         sqliteFree(zLeft);
452daffd0e5Sdrh         sqliteFree(zRight);
453daffd0e5Sdrh         return 1;
454daffd0e5Sdrh       }
45587c40e88Sdrh       sqliteDequote(zLeft);
45687c40e88Sdrh       sqliteDequote(zRight);
457c4a3c779Sdrh       pExpr->iTable = -1;
458cce7d176Sdrh       for(i=0; i<pTabList->nId; i++){
459cce7d176Sdrh         int j;
460cce7d176Sdrh         char *zTab;
461cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
462cce7d176Sdrh         if( pTab==0 ) continue;
463417be79cSdrh         assert( pTab->nCol>0 );
464cce7d176Sdrh         if( pTabList->a[i].zAlias ){
465cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
466cce7d176Sdrh         }else{
467cce7d176Sdrh           zTab = pTab->zName;
468cce7d176Sdrh         }
469*094b2bbfSdrh         if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue;
470832508b7Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + base;
471cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
4727020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
473cce7d176Sdrh             cnt++;
474832508b7Sdrh             pExpr->iTable = i + base;
4754a32431cSdrh             if( j==pTab->iPKey ){
4764a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
4774a32431cSdrh               pExpr->iColumn = -1;
4784a32431cSdrh             }else{
479967e8b73Sdrh               pExpr->iColumn = j;
480cce7d176Sdrh             }
481cce7d176Sdrh           }
482cce7d176Sdrh         }
4834a32431cSdrh       }
484c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
485c4a3c779Sdrh         cnt = 1;
486c4a3c779Sdrh         pExpr->iColumn = -1;
487c4a3c779Sdrh       }
488cce7d176Sdrh       sqliteFree(zLeft);
489cce7d176Sdrh       sqliteFree(zRight);
490cce7d176Sdrh       if( cnt==0 ){
491967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
492cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
493cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
494cce7d176Sdrh         pParse->nErr++;
495cce7d176Sdrh         return 1;
496cce7d176Sdrh       }else if( cnt>1 ){
497967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
498cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
499cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
500cce7d176Sdrh         pParse->nErr++;
501cce7d176Sdrh         return 1;
502cce7d176Sdrh       }
503cce7d176Sdrh       sqliteExprDelete(pLeft);
504cce7d176Sdrh       pExpr->pLeft = 0;
505cce7d176Sdrh       sqliteExprDelete(pRight);
506cce7d176Sdrh       pExpr->pRight = 0;
507967e8b73Sdrh       pExpr->op = TK_COLUMN;
508cce7d176Sdrh       break;
509cce7d176Sdrh     }
510cce7d176Sdrh 
511fef5208cSdrh     case TK_IN: {
512d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
513fef5208cSdrh       if( v==0 ) return 1;
514832508b7Sdrh       if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
515cfab11bcSdrh         return 1;
516cfab11bcSdrh       }
517fef5208cSdrh       if( pExpr->pSelect ){
518fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
519fef5208cSdrh         **
520fef5208cSdrh         ** Generate code to write the results of the select into a temporary
5214794b980Sdrh         ** table.  The cursor number of the temporary table has already
5224794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
523fef5208cSdrh         */
524832508b7Sdrh         pExpr->iTable = pParse->nTab++;
525c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
526832508b7Sdrh         sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0);
527fef5208cSdrh       }else if( pExpr->pList ){
528fef5208cSdrh         /* Case 2:     expr IN (exprlist)
529fef5208cSdrh         **
530fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
531fef5208cSdrh         ** in iTable.
532fef5208cSdrh         */
533fef5208cSdrh         int i, iSet;
534fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
535fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
5369208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
537fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
538fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
539fef5208cSdrh             pParse->nErr++;
540fef5208cSdrh             return 1;
541fef5208cSdrh           }
5424794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
5434794b980Sdrh             return 1;
5444794b980Sdrh           }
545fef5208cSdrh         }
546fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
547fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
548fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
549fef5208cSdrh           switch( pE2->op ){
550fef5208cSdrh             case TK_FLOAT:
551fef5208cSdrh             case TK_INTEGER:
552fef5208cSdrh             case TK_STRING: {
55399fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
554a76b5dfcSdrh               assert( pE2->token.z );
555fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
556fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
557fef5208cSdrh               break;
558fef5208cSdrh             }
559fef5208cSdrh             default: {
560fef5208cSdrh               sqliteExprCode(pParse, pE2);
56199fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
562fef5208cSdrh               break;
563fef5208cSdrh             }
564fef5208cSdrh           }
565fef5208cSdrh         }
566fef5208cSdrh       }
567cfab11bcSdrh       break;
568fef5208cSdrh     }
569fef5208cSdrh 
57019a775c2Sdrh     case TK_SELECT: {
571fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
572fef5208cSdrh       ** value of this select in a memory cell and record the number
573967e8b73Sdrh       ** of the memory cell in iColumn.
574fef5208cSdrh       */
575967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
576832508b7Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
57719a775c2Sdrh         return 1;
57819a775c2Sdrh       }
57919a775c2Sdrh       break;
58019a775c2Sdrh     }
58119a775c2Sdrh 
582cce7d176Sdrh     /* For all else, just recursively walk the tree */
583cce7d176Sdrh     default: {
584cce7d176Sdrh       if( pExpr->pLeft
585832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
586cce7d176Sdrh         return 1;
587cce7d176Sdrh       }
588cce7d176Sdrh       if( pExpr->pRight
589832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){
590cce7d176Sdrh         return 1;
591cce7d176Sdrh       }
592cce7d176Sdrh       if( pExpr->pList ){
593cce7d176Sdrh         int i;
594cce7d176Sdrh         ExprList *pList = pExpr->pList;
595cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
596832508b7Sdrh           Expr *pArg = pList->a[i].pExpr;
597832508b7Sdrh           if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){
598cce7d176Sdrh             return 1;
599cce7d176Sdrh           }
600cce7d176Sdrh         }
601cce7d176Sdrh       }
602cce7d176Sdrh     }
603cce7d176Sdrh   }
604cce7d176Sdrh   return 0;
605cce7d176Sdrh }
606cce7d176Sdrh 
607cce7d176Sdrh /*
608cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
609cce7d176Sdrh ** function names are recognized and all functions have the correct
610cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
611cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
612cce7d176Sdrh **
613cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
614cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
615cce7d176Sdrh */
616cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
617cce7d176Sdrh   int nErr = 0;
618cce7d176Sdrh   if( pExpr==0 ) return 0;
619cce7d176Sdrh   switch( pExpr->op ){
620cce7d176Sdrh     case TK_FUNCTION: {
621cce7d176Sdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;
622cce7d176Sdrh       int no_such_func = 0;
6238e0a2f90Sdrh       int wrong_num_args = 0;
624cce7d176Sdrh       int is_agg = 0;
625cce7d176Sdrh       int i;
6260bce8354Sdrh       FuncDef *pDef;
6270bce8354Sdrh 
62889425d5eSdrh       pDef = sqliteFindFunction(pParse->db,
62989425d5eSdrh          pExpr->token.z, pExpr->token.n, n, 0);
6300bce8354Sdrh       if( pDef==0 ){
6310bce8354Sdrh         pDef = sqliteFindFunction(pParse->db,
6328e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, -1, 0);
6330bce8354Sdrh         if( pDef==0 ){
634cce7d176Sdrh           no_such_func = 1;
6358e0a2f90Sdrh         }else{
6368e0a2f90Sdrh           wrong_num_args = 1;
6378e0a2f90Sdrh         }
6388e0a2f90Sdrh       }else{
6390bce8354Sdrh         is_agg = pDef->xFunc==0;
640cce7d176Sdrh       }
6418e0a2f90Sdrh       if( is_agg && !allowAgg ){
6428e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1,
6438e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
6448e0a2f90Sdrh         pParse->nErr++;
6458e0a2f90Sdrh         nErr++;
6468e0a2f90Sdrh         is_agg = 0;
6478e0a2f90Sdrh       }else if( no_such_func ){
648cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
649cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
650cce7d176Sdrh         pParse->nErr++;
651cce7d176Sdrh         nErr++;
6528e0a2f90Sdrh       }else if( wrong_num_args ){
6538e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg,
6548e0a2f90Sdrh            "wrong number of arguments to function ",-1,
6558e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
6568e0a2f90Sdrh         pParse->nErr++;
6578e0a2f90Sdrh         nErr++;
658cce7d176Sdrh       }
6592282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
660cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
661cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
6624cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
6634cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
664cce7d176Sdrh       }
665cce7d176Sdrh     }
666cce7d176Sdrh     default: {
667cce7d176Sdrh       if( pExpr->pLeft ){
6682282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
669cce7d176Sdrh       }
670cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
6712282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
672cce7d176Sdrh       }
673fef5208cSdrh       if( nErr==0 && pExpr->pList ){
674fef5208cSdrh         int n = pExpr->pList->nExpr;
675fef5208cSdrh         int i;
676fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
6772282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
6782282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
679fef5208cSdrh         }
680fef5208cSdrh       }
681cce7d176Sdrh       break;
682cce7d176Sdrh     }
683cce7d176Sdrh   }
684cce7d176Sdrh   return nErr;
685cce7d176Sdrh }
686cce7d176Sdrh 
687cce7d176Sdrh /*
688cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
6891ccde15dSdrh ** expression and leave the result on the top of stack.
690cce7d176Sdrh */
691cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
692cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
693cce7d176Sdrh   int op;
694daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
695cce7d176Sdrh   switch( pExpr->op ){
696cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
697cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
698cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
699cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
700cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
701cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
702cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
703cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
704cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
705cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
706cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
707cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
708cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
709cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
710cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
711cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
712cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
713cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
714bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
715bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
716bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
717bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
718bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
719bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
720cce7d176Sdrh     default: break;
721cce7d176Sdrh   }
722cce7d176Sdrh   switch( pExpr->op ){
723967e8b73Sdrh     case TK_COLUMN: {
7242282792aSdrh       if( pParse->useAgg ){
72599fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
726c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
72799fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
728c4a3c779Sdrh       }else{
72999fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
7302282792aSdrh       }
731cce7d176Sdrh       break;
732cce7d176Sdrh     }
733cce7d176Sdrh     case TK_INTEGER: {
734e6840900Sdrh       sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0);
735e6840900Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
736e6840900Sdrh       break;
737e6840900Sdrh     }
738e6840900Sdrh     case TK_FLOAT: {
7397a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
740a76b5dfcSdrh       assert( pExpr->token.z );
7417a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
742cce7d176Sdrh       break;
743cce7d176Sdrh     }
744cce7d176Sdrh     case TK_STRING: {
74599fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
746a76b5dfcSdrh       assert( pExpr->token.z );
747cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
748cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
749cce7d176Sdrh       break;
750cce7d176Sdrh     }
751cce7d176Sdrh     case TK_NULL: {
75299fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
753cce7d176Sdrh       break;
754cce7d176Sdrh     }
755cce7d176Sdrh     case TK_AND:
756cce7d176Sdrh     case TK_OR:
757cce7d176Sdrh     case TK_PLUS:
758cce7d176Sdrh     case TK_STAR:
759cce7d176Sdrh     case TK_MINUS:
760bf4133cbSdrh     case TK_REM:
761bf4133cbSdrh     case TK_BITAND:
762bf4133cbSdrh     case TK_BITOR:
763cce7d176Sdrh     case TK_SLASH: {
764cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
765cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
76699fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
767cce7d176Sdrh       break;
768cce7d176Sdrh     }
769bf4133cbSdrh     case TK_LSHIFT:
770bf4133cbSdrh     case TK_RSHIFT: {
771bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
772bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
773bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
774bf4133cbSdrh       break;
775bf4133cbSdrh     }
7760040077dSdrh     case TK_CONCAT: {
7770040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
7780040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
77999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
7800040077dSdrh       break;
7810040077dSdrh     }
782cce7d176Sdrh     case TK_LT:
783cce7d176Sdrh     case TK_LE:
784cce7d176Sdrh     case TK_GT:
785cce7d176Sdrh     case TK_GE:
786cce7d176Sdrh     case TK_NE:
787cce7d176Sdrh     case TK_EQ:
788cce7d176Sdrh     case TK_LIKE:
789cce7d176Sdrh     case TK_GLOB: {
790cce7d176Sdrh       int dest;
79199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
792cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
793cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
794cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
79599fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
79699fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
797cce7d176Sdrh       break;
798cce7d176Sdrh     }
799cce7d176Sdrh     case TK_UMINUS: {
8006e142f54Sdrh       assert( pExpr->pLeft );
8017a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
8026e142f54Sdrh         Token *p = &pExpr->pLeft->token;
8036e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
8046e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
805e6840900Sdrh         if( pExpr->pLeft->op==TK_INTEGER ){
806e6840900Sdrh           sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0);
807e6840900Sdrh         }else{
80899fcd718Sdrh           sqliteVdbeAddOp(v, OP_String, 0, 0);
809e6840900Sdrh         }
81099fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
8116e142f54Sdrh         sqliteFree(z);
8126e142f54Sdrh         break;
8136e142f54Sdrh       }
8141ccde15dSdrh       /* Fall through into TK_NOT */
8156e142f54Sdrh     }
816bf4133cbSdrh     case TK_BITNOT:
8176e142f54Sdrh     case TK_NOT: {
818cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
81999fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
820cce7d176Sdrh       break;
821cce7d176Sdrh     }
822cce7d176Sdrh     case TK_ISNULL:
823cce7d176Sdrh     case TK_NOTNULL: {
824cce7d176Sdrh       int dest;
82599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
826cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
827cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
82899fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
82999fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
830cce7d176Sdrh       break;
831cce7d176Sdrh     }
8322282792aSdrh     case TK_AGG_FUNCTION: {
83399fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
8342282792aSdrh       break;
8352282792aSdrh     }
836cce7d176Sdrh     case TK_FUNCTION: {
837cce7d176Sdrh       int i;
838cce7d176Sdrh       ExprList *pList = pExpr->pList;
83989425d5eSdrh       int nExpr = pList ? pList->nExpr : 0;
8400bce8354Sdrh       FuncDef *pDef;
8410bce8354Sdrh       pDef = sqliteFindFunction(pParse->db,
84289425d5eSdrh                       pExpr->token.z, pExpr->token.n, nExpr, 0);
8430bce8354Sdrh       assert( pDef!=0 );
84489425d5eSdrh       for(i=0; i<nExpr; i++){
8458e0a2f90Sdrh         sqliteExprCode(pParse, pList->a[i].pExpr);
8468e0a2f90Sdrh       }
84789425d5eSdrh       sqliteVdbeAddOp(v, OP_Function, nExpr, 0);
8480bce8354Sdrh       sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER);
8496ec2733bSdrh       break;
8506ec2733bSdrh     }
85119a775c2Sdrh     case TK_SELECT: {
85299fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
85319a775c2Sdrh       break;
85419a775c2Sdrh     }
855fef5208cSdrh     case TK_IN: {
856fef5208cSdrh       int addr;
85799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
858fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
859fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
860fef5208cSdrh       if( pExpr->pSelect ){
86199fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
862fef5208cSdrh       }else{
86399fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
864fef5208cSdrh       }
86599fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
866fef5208cSdrh       break;
867fef5208cSdrh     }
868fef5208cSdrh     case TK_BETWEEN: {
869fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
87099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
871fef5208cSdrh       sqliteExprIfFalse(pParse, pExpr, lbl);
87299fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
873fef5208cSdrh       sqliteVdbeResolveLabel(v, lbl);
874fef5208cSdrh       break;
875fef5208cSdrh     }
876a2e00042Sdrh     case TK_AS: {
877a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
878a2e00042Sdrh       break;
879a2e00042Sdrh     }
880cce7d176Sdrh   }
881cce7d176Sdrh   return;
882cce7d176Sdrh }
883cce7d176Sdrh 
884cce7d176Sdrh /*
885cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
886cce7d176Sdrh ** to the label "dest" if the expression is true but execution
887cce7d176Sdrh ** continues straight thru if the expression is false.
888cce7d176Sdrh */
889cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
890cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
891cce7d176Sdrh   int op = 0;
892daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
893cce7d176Sdrh   switch( pExpr->op ){
894cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
895cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
896cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
897cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
898cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
899cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
900cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
901cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
902cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
903cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
904cce7d176Sdrh     default:  break;
905cce7d176Sdrh   }
906cce7d176Sdrh   switch( pExpr->op ){
907cce7d176Sdrh     case TK_AND: {
908cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
909cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
910cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
911cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
912cce7d176Sdrh       break;
913cce7d176Sdrh     }
914cce7d176Sdrh     case TK_OR: {
915cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
916cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest);
917cce7d176Sdrh       break;
918cce7d176Sdrh     }
919cce7d176Sdrh     case TK_NOT: {
920cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
921cce7d176Sdrh       break;
922cce7d176Sdrh     }
923cce7d176Sdrh     case TK_LT:
924cce7d176Sdrh     case TK_LE:
925cce7d176Sdrh     case TK_GT:
926cce7d176Sdrh     case TK_GE:
927cce7d176Sdrh     case TK_NE:
928cce7d176Sdrh     case TK_EQ:
929cce7d176Sdrh     case TK_LIKE:
930cce7d176Sdrh     case TK_GLOB: {
931cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
932cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
93399fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
934cce7d176Sdrh       break;
935cce7d176Sdrh     }
936cce7d176Sdrh     case TK_ISNULL:
937cce7d176Sdrh     case TK_NOTNULL: {
938cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
93999fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
940cce7d176Sdrh       break;
941cce7d176Sdrh     }
942fef5208cSdrh     case TK_IN: {
943cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
944fef5208cSdrh       if( pExpr->pSelect ){
94599fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
946fef5208cSdrh       }else{
94799fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
948fef5208cSdrh       }
949fef5208cSdrh       break;
950fef5208cSdrh     }
951fef5208cSdrh     case TK_BETWEEN: {
952fef5208cSdrh       int lbl = sqliteVdbeMakeLabel(v);
953fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
95499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
955fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
95699fcd718Sdrh       sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
957fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
95899fcd718Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, dest);
95999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
96099fcd718Sdrh       sqliteVdbeResolveLabel(v, lbl);
96199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
962fef5208cSdrh       break;
963fef5208cSdrh     }
964cce7d176Sdrh     default: {
965cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
96699fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
967cce7d176Sdrh       break;
968cce7d176Sdrh     }
969cce7d176Sdrh   }
970cce7d176Sdrh }
971cce7d176Sdrh 
972cce7d176Sdrh /*
97366b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
974cce7d176Sdrh ** to the label "dest" if the expression is false but execution
975cce7d176Sdrh ** continues straight thru if the expression is true.
976cce7d176Sdrh */
977cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
978cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
979cce7d176Sdrh   int op = 0;
980daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
981cce7d176Sdrh   switch( pExpr->op ){
982cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
983cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
984cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
985cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
986cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
987cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
988cce7d176Sdrh     case TK_LIKE:     op = OP_Like;     break;
989cce7d176Sdrh     case TK_GLOB:     op = OP_Glob;     break;
990cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
991cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
992cce7d176Sdrh     default:  break;
993cce7d176Sdrh   }
994cce7d176Sdrh   switch( pExpr->op ){
995cce7d176Sdrh     case TK_AND: {
996cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
997cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
998cce7d176Sdrh       break;
999cce7d176Sdrh     }
1000cce7d176Sdrh     case TK_OR: {
1001cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1002cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
1003cce7d176Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest);
1004cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1005cce7d176Sdrh       break;
1006cce7d176Sdrh     }
1007cce7d176Sdrh     case TK_NOT: {
1008cce7d176Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
1009cce7d176Sdrh       break;
1010cce7d176Sdrh     }
1011cce7d176Sdrh     case TK_LT:
1012cce7d176Sdrh     case TK_LE:
1013cce7d176Sdrh     case TK_GT:
1014cce7d176Sdrh     case TK_GE:
1015cce7d176Sdrh     case TK_NE:
1016cce7d176Sdrh     case TK_EQ: {
1017cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1018cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
101999fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1020cce7d176Sdrh       break;
1021cce7d176Sdrh     }
1022cce7d176Sdrh     case TK_LIKE:
1023cce7d176Sdrh     case TK_GLOB: {
1024cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1025cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
102699fcd718Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1027cce7d176Sdrh       break;
1028cce7d176Sdrh     }
1029cce7d176Sdrh     case TK_ISNULL:
1030cce7d176Sdrh     case TK_NOTNULL: {
1031cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
103299fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, dest);
1033cce7d176Sdrh       break;
1034cce7d176Sdrh     }
1035fef5208cSdrh     case TK_IN: {
1036cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1037fef5208cSdrh       if( pExpr->pSelect ){
103899fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1039fef5208cSdrh       }else{
104099fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1041fef5208cSdrh       }
1042fef5208cSdrh       break;
1043fef5208cSdrh     }
1044fef5208cSdrh     case TK_BETWEEN: {
1045fef5208cSdrh       int addr;
1046fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
104799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1048fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1049fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
105099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
105199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
105299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
1053fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
105499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Gt, 0, dest);
1055fef5208cSdrh       break;
1056fef5208cSdrh     }
1057cce7d176Sdrh     default: {
1058cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
105999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Not, 0, 0);
106099fcd718Sdrh       sqliteVdbeAddOp(v, OP_If, 0, dest);
1061cce7d176Sdrh       break;
1062cce7d176Sdrh     }
1063cce7d176Sdrh   }
1064cce7d176Sdrh }
10652282792aSdrh 
10662282792aSdrh /*
10672282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
10682282792aSdrh ** if they are identical and return FALSE if they differ in any way.
10692282792aSdrh */
1070d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
10712282792aSdrh   int i;
10722282792aSdrh   if( pA==0 ){
10732282792aSdrh     return pB==0;
10742282792aSdrh   }else if( pB==0 ){
10752282792aSdrh     return 0;
10762282792aSdrh   }
10772282792aSdrh   if( pA->op!=pB->op ) return 0;
1078d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1079d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
10802282792aSdrh   if( pA->pList ){
10812282792aSdrh     if( pB->pList==0 ) return 0;
10822282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
10832282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1084d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
10852282792aSdrh         return 0;
10862282792aSdrh       }
10872282792aSdrh     }
10882282792aSdrh   }else if( pB->pList ){
10892282792aSdrh     return 0;
10902282792aSdrh   }
10912282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
10922282792aSdrh   if( pA->token.z ){
10932282792aSdrh     if( pB->token.z==0 ) return 0;
10942282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
10952282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
10962282792aSdrh   }
10972282792aSdrh   return 1;
10982282792aSdrh }
10992282792aSdrh 
11002282792aSdrh /*
11012282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
11022282792aSdrh */
11032282792aSdrh static int appendAggInfo(Parse *pParse){
11042282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
11052282792aSdrh     int amt = pParse->nAgg + 8;
11066d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
11076d4abfbeSdrh     if( aAgg==0 ){
11082282792aSdrh       return -1;
11092282792aSdrh     }
11106d4abfbeSdrh     pParse->aAgg = aAgg;
11112282792aSdrh   }
11122282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
11132282792aSdrh   return pParse->nAgg++;
11142282792aSdrh }
11152282792aSdrh 
11162282792aSdrh /*
11172282792aSdrh ** Analyze the given expression looking for aggregate functions and
11182282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
11192282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
11202282792aSdrh **
11212282792aSdrh ** This routine should only be called after the expression has been
11222282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
11232282792aSdrh **
11242282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
11252282792aSdrh ** the number of errors.
11262282792aSdrh */
11272282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
11282282792aSdrh   int i;
11292282792aSdrh   AggExpr *aAgg;
11302282792aSdrh   int nErr = 0;
11312282792aSdrh 
11322282792aSdrh   if( pExpr==0 ) return 0;
11332282792aSdrh   switch( pExpr->op ){
1134967e8b73Sdrh     case TK_COLUMN: {
11352282792aSdrh       aAgg = pParse->aAgg;
11362282792aSdrh       for(i=0; i<pParse->nAgg; i++){
11372282792aSdrh         if( aAgg[i].isAgg ) continue;
11382282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1139967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
11402282792aSdrh           break;
11412282792aSdrh         }
11422282792aSdrh       }
11432282792aSdrh       if( i>=pParse->nAgg ){
11442282792aSdrh         i = appendAggInfo(pParse);
11452282792aSdrh         if( i<0 ) return 1;
11462282792aSdrh         pParse->aAgg[i].isAgg = 0;
11472282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
11482282792aSdrh       }
1149aaf88729Sdrh       pExpr->iAgg = i;
11502282792aSdrh       break;
11512282792aSdrh     }
11522282792aSdrh     case TK_AGG_FUNCTION: {
11532282792aSdrh       aAgg = pParse->aAgg;
11542282792aSdrh       for(i=0; i<pParse->nAgg; i++){
11552282792aSdrh         if( !aAgg[i].isAgg ) continue;
1156d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
11572282792aSdrh           break;
11582282792aSdrh         }
11592282792aSdrh       }
11602282792aSdrh       if( i>=pParse->nAgg ){
11612282792aSdrh         i = appendAggInfo(pParse);
11622282792aSdrh         if( i<0 ) return 1;
11632282792aSdrh         pParse->aAgg[i].isAgg = 1;
11642282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
11650bce8354Sdrh         pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db,
1166f55f25f0Sdrh              pExpr->token.z, pExpr->token.n,
1167f55f25f0Sdrh              pExpr->pList ? pExpr->pList->nExpr : 0, 0);
11682282792aSdrh       }
11692282792aSdrh       pExpr->iAgg = i;
11702282792aSdrh       break;
11712282792aSdrh     }
11722282792aSdrh     default: {
11732282792aSdrh       if( pExpr->pLeft ){
11742282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
11752282792aSdrh       }
11762282792aSdrh       if( nErr==0 && pExpr->pRight ){
11772282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
11782282792aSdrh       }
11792282792aSdrh       if( nErr==0 && pExpr->pList ){
11802282792aSdrh         int n = pExpr->pList->nExpr;
11812282792aSdrh         int i;
11822282792aSdrh         for(i=0; nErr==0 && i<n; i++){
11832282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
11842282792aSdrh         }
11852282792aSdrh       }
11862282792aSdrh       break;
11872282792aSdrh     }
11882282792aSdrh   }
11892282792aSdrh   return nErr;
11902282792aSdrh }
11918e0a2f90Sdrh 
11928e0a2f90Sdrh /*
11938e0a2f90Sdrh ** Locate a user function given a name and a number of arguments.
11940bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that
11958e0a2f90Sdrh ** function, or return NULL if the function does not exist.
11968e0a2f90Sdrh **
11970bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef
11988e0a2f90Sdrh ** structure is created and liked into the "db" structure if a
11998e0a2f90Sdrh ** no matching function previously existed.  When createFlag is true
12008e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts
12018e0a2f90Sdrh ** any number of arguments will be returned.
12028e0a2f90Sdrh **
12038e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid
12048e0a2f90Sdrh ** function found is returned.  A function is valid if either xFunc
12058e0a2f90Sdrh ** or xStep is non-zero.
12068e0a2f90Sdrh */
12070bce8354Sdrh FuncDef *sqliteFindFunction(
12088e0a2f90Sdrh   sqlite *db,        /* An open database */
12098e0a2f90Sdrh   const char *zName, /* Name of the function.  Not null-terminated */
12108e0a2f90Sdrh   int nName,         /* Number of characters in the name */
12118e0a2f90Sdrh   int nArg,          /* Number of arguments.  -1 means any number */
12128e0a2f90Sdrh   int createFlag     /* Create new entry if true and does not otherwise exist */
12138e0a2f90Sdrh ){
12140bce8354Sdrh   FuncDef *pFirst, *p, *pMaybe;
12150bce8354Sdrh   pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName);
12161350b030Sdrh   if( p && !createFlag && nArg<0 ){
12178e0a2f90Sdrh     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
12188e0a2f90Sdrh     return p;
12198e0a2f90Sdrh   }
12208e0a2f90Sdrh   pMaybe = 0;
12218e0a2f90Sdrh   while( p && p->nArg!=nArg ){
12228e0a2f90Sdrh     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
12238e0a2f90Sdrh     p = p->pNext;
12248e0a2f90Sdrh   }
12258e0a2f90Sdrh   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
12268e0a2f90Sdrh     return 0;
12278e0a2f90Sdrh   }
12288e0a2f90Sdrh   if( p==0 && pMaybe ){
12298e0a2f90Sdrh     assert( createFlag==0 );
12308e0a2f90Sdrh     return pMaybe;
12318e0a2f90Sdrh   }
123289425d5eSdrh   if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
12338e0a2f90Sdrh     p->nArg = nArg;
12348e0a2f90Sdrh     p->pNext = pFirst;
12350bce8354Sdrh     sqliteHashInsert(&db->aFunc, zName, nName, (void*)p);
12368e0a2f90Sdrh   }
12378e0a2f90Sdrh   return p;
12388e0a2f90Sdrh }
1239