xref: /sqlite-3.40.0/src/expr.c (revision 2f2c01e5)
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*2f2c01e5Sdrh ** $Id: expr.c,v 1.77 2002/07/02 13:05:05 drh Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
1804738cb9Sdrh #include <ctype.h>
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;
1243b167c75Sdrh   if( !p->staticToken ){
125a76b5dfcSdrh     if( p->token.z ) p->token.z += offset;
126a76b5dfcSdrh     if( p->span.z ) p->span.z += offset;
1273b167c75Sdrh   }
128a76b5dfcSdrh   if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset);
129a76b5dfcSdrh   if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset);
130a76b5dfcSdrh   if( p->pList ) sqliteExprListMoveStrings(p->pList, offset);
131a76b5dfcSdrh   if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset);
132a76b5dfcSdrh }
133a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){
134a76b5dfcSdrh   int i;
135a76b5dfcSdrh   if( pList==0 ) return;
136a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
137a76b5dfcSdrh     sqliteExprMoveStrings(pList->a[i].pExpr, offset);
138a76b5dfcSdrh   }
139a76b5dfcSdrh }
140a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){
141a76b5dfcSdrh   if( pSelect==0 ) return;
142a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pEList, offset);
143a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pWhere, offset);
144a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pGroupBy, offset);
145a76b5dfcSdrh   sqliteExprMoveStrings(pSelect->pHaving, offset);
146a76b5dfcSdrh   sqliteExprListMoveStrings(pSelect->pOrderBy, offset);
147a76b5dfcSdrh   sqliteSelectMoveStrings(pSelect->pPrior, offset);
148a76b5dfcSdrh }
149a76b5dfcSdrh 
150a76b5dfcSdrh /*
151ff78bd2fSdrh ** The following group of routines make deep copies of expressions,
152ff78bd2fSdrh ** expression lists, ID lists, and select statements.  The copies can
153ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines)
154ff78bd2fSdrh ** without effecting the originals.
155ff78bd2fSdrh **
156ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to
157ff78bd2fSdrh ** string space that is allocated separately from the expression tree
158ff78bd2fSdrh ** itself.  These routines do NOT duplicate that string space.
159ff78bd2fSdrh **
160ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(),
161ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded
162ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines.
163ff78bd2fSdrh **
164ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated.
165ff78bd2fSdrh */
166ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){
167ff78bd2fSdrh   Expr *pNew;
168ff78bd2fSdrh   if( p==0 ) return 0;
169ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
170ff78bd2fSdrh   if( pNew==0 ) return 0;
1713b167c75Sdrh   memcpy(pNew, p, sizeof(*pNew));
172ff78bd2fSdrh   pNew->pLeft = sqliteExprDup(p->pLeft);
173ff78bd2fSdrh   pNew->pRight = sqliteExprDup(p->pRight);
174ff78bd2fSdrh   pNew->pList = sqliteExprListDup(p->pList);
175ff78bd2fSdrh   pNew->pSelect = sqliteSelectDup(p->pSelect);
176ff78bd2fSdrh   return pNew;
177ff78bd2fSdrh }
178ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){
179ff78bd2fSdrh   ExprList *pNew;
180ff78bd2fSdrh   int i;
181ff78bd2fSdrh   if( p==0 ) return 0;
182ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
183ff78bd2fSdrh   if( pNew==0 ) return 0;
184ff78bd2fSdrh   pNew->nExpr = p->nExpr;
185ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
186e4697f5eSdrh   if( pNew->a==0 ) return 0;
187ff78bd2fSdrh   for(i=0; i<p->nExpr; i++){
188ff78bd2fSdrh     pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr);
189ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
190ff78bd2fSdrh     pNew->a[i].sortOrder = p->a[i].sortOrder;
191ff78bd2fSdrh     pNew->a[i].isAgg = p->a[i].isAgg;
192ff78bd2fSdrh     pNew->a[i].done = 0;
193ff78bd2fSdrh   }
194ff78bd2fSdrh   return pNew;
195ff78bd2fSdrh }
196ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){
197ad3cab52Sdrh   SrcList *pNew;
198ad3cab52Sdrh   int i;
199ad3cab52Sdrh   if( p==0 ) return 0;
200ad3cab52Sdrh   pNew = sqliteMalloc( sizeof(*pNew) );
201ad3cab52Sdrh   if( pNew==0 ) return 0;
202ad3cab52Sdrh   pNew->nSrc = p->nSrc;
203ad3cab52Sdrh   pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) );
2046f34903eSdanielk1977   if( pNew->a==0 && p->nSrc != 0 ) return 0;
205ad3cab52Sdrh   for(i=0; i<p->nSrc; i++){
206ad3cab52Sdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
207ad3cab52Sdrh     pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias);
208ad3cab52Sdrh     pNew->a[i].jointype = p->a[i].jointype;
209ad3cab52Sdrh     pNew->a[i].pTab = 0;
210ad3cab52Sdrh     pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect);
211ad3cab52Sdrh     pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn);
212ad3cab52Sdrh     pNew->a[i].pUsing = sqliteIdListDup(p->a[i].pUsing);
213ad3cab52Sdrh   }
214ad3cab52Sdrh   return pNew;
215ad3cab52Sdrh }
216ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){
217ff78bd2fSdrh   IdList *pNew;
218ff78bd2fSdrh   int i;
219ff78bd2fSdrh   if( p==0 ) return 0;
220ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*pNew) );
221ff78bd2fSdrh   if( pNew==0 ) return 0;
222ff78bd2fSdrh   pNew->nId = p->nId;
223ff78bd2fSdrh   pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) );
224e4697f5eSdrh   if( pNew->a==0 ) return 0;
225ff78bd2fSdrh   for(i=0; i<p->nId; i++){
226ff78bd2fSdrh     pNew->a[i].zName = sqliteStrDup(p->a[i].zName);
227ff78bd2fSdrh     pNew->a[i].idx = p->a[i].idx;
228ff78bd2fSdrh   }
229ff78bd2fSdrh   return pNew;
230ff78bd2fSdrh }
231ff78bd2fSdrh Select *sqliteSelectDup(Select *p){
232ff78bd2fSdrh   Select *pNew;
233ff78bd2fSdrh   if( p==0 ) return 0;
234ff78bd2fSdrh   pNew = sqliteMalloc( sizeof(*p) );
235ff78bd2fSdrh   if( pNew==0 ) return 0;
236ff78bd2fSdrh   pNew->isDistinct = p->isDistinct;
237ff78bd2fSdrh   pNew->pEList = sqliteExprListDup(p->pEList);
238ad3cab52Sdrh   pNew->pSrc = sqliteSrcListDup(p->pSrc);
239ff78bd2fSdrh   pNew->pWhere = sqliteExprDup(p->pWhere);
240ff78bd2fSdrh   pNew->pGroupBy = sqliteExprListDup(p->pGroupBy);
241ff78bd2fSdrh   pNew->pHaving = sqliteExprDup(p->pHaving);
242ff78bd2fSdrh   pNew->pOrderBy = sqliteExprListDup(p->pOrderBy);
243ff78bd2fSdrh   pNew->op = p->op;
244ff78bd2fSdrh   pNew->pPrior = sqliteSelectDup(p->pPrior);
245ff78bd2fSdrh   pNew->nLimit = p->nLimit;
246ff78bd2fSdrh   pNew->nOffset = p->nOffset;
247ff78bd2fSdrh   pNew->zSelect = 0;
248ff78bd2fSdrh   return pNew;
249ff78bd2fSdrh }
250ff78bd2fSdrh 
251ff78bd2fSdrh 
252ff78bd2fSdrh /*
253a76b5dfcSdrh ** Add a new element to the end of an expression list.  If pList is
254a76b5dfcSdrh ** initially NULL, then create a new expression list.
255a76b5dfcSdrh */
256a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
257a76b5dfcSdrh   int i;
258a76b5dfcSdrh   if( pList==0 ){
259a76b5dfcSdrh     pList = sqliteMalloc( sizeof(ExprList) );
260a76b5dfcSdrh     if( pList==0 ){
261a76b5dfcSdrh       sqliteExprDelete(pExpr);
262a76b5dfcSdrh       return 0;
263a76b5dfcSdrh     }
264a76b5dfcSdrh   }
265a76b5dfcSdrh   if( (pList->nExpr & 7)==0 ){
266a76b5dfcSdrh     int n = pList->nExpr + 8;
267a76b5dfcSdrh     struct ExprList_item *a;
268a76b5dfcSdrh     a = sqliteRealloc(pList->a, n*sizeof(pList->a[0]));
269a76b5dfcSdrh     if( a==0 ){
270a76b5dfcSdrh       sqliteExprDelete(pExpr);
271a76b5dfcSdrh       return pList;
272a76b5dfcSdrh     }
273a76b5dfcSdrh     pList->a = a;
274a76b5dfcSdrh   }
275a76b5dfcSdrh   if( pExpr || pName ){
276a76b5dfcSdrh     i = pList->nExpr++;
277a76b5dfcSdrh     pList->a[i].pExpr = pExpr;
278a76b5dfcSdrh     pList->a[i].zName = 0;
279a76b5dfcSdrh     if( pName ){
280a76b5dfcSdrh       sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0);
281a76b5dfcSdrh       sqliteDequote(pList->a[i].zName);
282a76b5dfcSdrh     }
283a76b5dfcSdrh   }
284a76b5dfcSdrh   return pList;
285a76b5dfcSdrh }
286a76b5dfcSdrh 
287a76b5dfcSdrh /*
288a76b5dfcSdrh ** Delete an entire expression list.
289a76b5dfcSdrh */
290a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){
291a76b5dfcSdrh   int i;
292a76b5dfcSdrh   if( pList==0 ) return;
293a76b5dfcSdrh   for(i=0; i<pList->nExpr; i++){
294a76b5dfcSdrh     sqliteExprDelete(pList->a[i].pExpr);
295a76b5dfcSdrh     sqliteFree(pList->a[i].zName);
296a76b5dfcSdrh   }
297a76b5dfcSdrh   sqliteFree(pList->a);
298a76b5dfcSdrh   sqliteFree(pList);
299a76b5dfcSdrh }
300a76b5dfcSdrh 
301a76b5dfcSdrh /*
302fef5208cSdrh ** Walk an expression tree.  Return 1 if the expression is constant
303fef5208cSdrh ** and 0 if it involves variables.
3042398937bSdrh **
3052398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc")
3062398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is
3072398937bSdrh ** a constant.
308fef5208cSdrh */
3099208643dSdrh int sqliteExprIsConstant(Expr *p){
310fef5208cSdrh   switch( p->op ){
311fef5208cSdrh     case TK_ID:
312967e8b73Sdrh     case TK_COLUMN:
313fef5208cSdrh     case TK_DOT:
314fef5208cSdrh       return 0;
3152398937bSdrh     case TK_STRING:
3162398937bSdrh       return p->token.z[0]=='\'';
3179208643dSdrh     case TK_INTEGER:
3189208643dSdrh     case TK_FLOAT:
3199208643dSdrh       return 1;
320fef5208cSdrh     default: {
3219208643dSdrh       if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
3229208643dSdrh       if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
323fef5208cSdrh       if( p->pList ){
324fef5208cSdrh         int i;
325fef5208cSdrh         for(i=0; i<p->pList->nExpr; i++){
3269208643dSdrh           if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
327fef5208cSdrh         }
328fef5208cSdrh       }
3299208643dSdrh       return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
330fef5208cSdrh     }
331fef5208cSdrh   }
3329208643dSdrh   return 0;
333fef5208cSdrh }
334fef5208cSdrh 
335fef5208cSdrh /*
336e4de1febSdrh ** If the given expression codes a constant integer, return 1 and put
337e4de1febSdrh ** the value of the integer in *pValue.  If the expression is not an
338e4de1febSdrh ** integer, return 0 and leave *pValue unchanged.
339e4de1febSdrh */
340e4de1febSdrh int sqliteExprIsInteger(Expr *p, int *pValue){
341e4de1febSdrh   switch( p->op ){
342e4de1febSdrh     case TK_INTEGER: {
343e4de1febSdrh       *pValue = atoi(p->token.z);
344e4de1febSdrh       return 1;
345e4de1febSdrh     }
346e4de1febSdrh     case TK_STRING: {
347bd790ee3Sdrh       const char *z = p->token.z;
348e4de1febSdrh       int n = p->token.n;
349bd790ee3Sdrh       if( n>0 && z[0]=='-' ){ z++; n--; }
350e4de1febSdrh       while( n>0 && *z && isdigit(*z) ){ z++; n--; }
351e4de1febSdrh       if( n==0 ){
352e4de1febSdrh         *pValue = atoi(p->token.z);
353e4de1febSdrh         return 1;
354e4de1febSdrh       }
355e4de1febSdrh       break;
356e4de1febSdrh     }
357e4de1febSdrh     case TK_UMINUS: {
358e4de1febSdrh       int v;
359e4de1febSdrh       if( sqliteExprIsInteger(p->pLeft, &v) ){
360e4de1febSdrh         *pValue = -v;
361e4de1febSdrh         return 1;
362e4de1febSdrh       }
363e4de1febSdrh       break;
364e4de1febSdrh     }
365e4de1febSdrh     default: break;
366e4de1febSdrh   }
367e4de1febSdrh   return 0;
368e4de1febSdrh }
369e4de1febSdrh 
370e4de1febSdrh /*
371c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name.
372c4a3c779Sdrh */
373a9f9d1c0Sdrh int sqliteIsRowid(const char *z){
374c4a3c779Sdrh   if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
375c4a3c779Sdrh   if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
376c4a3c779Sdrh   if( sqliteStrICmp(z, "OID")==0 ) return 1;
377c4a3c779Sdrh   return 0;
378c4a3c779Sdrh }
379c4a3c779Sdrh 
380c4a3c779Sdrh /*
381cce7d176Sdrh ** This routine walks an expression tree and resolves references to
382967e8b73Sdrh ** table columns.  Nodes of the form ID.ID or ID resolve into an
383aacc543eSdrh ** index to the table in the table list and a column offset.  The
384aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN.  The Expr.iTable
385aacc543eSdrh ** value is changed to the index of the referenced table in pTabList
386832508b7Sdrh ** plus the "base" value.  The base value will ultimately become the
387aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced
388aacc543eSdrh ** table.  The Expr.iColumn value is changed to the index of the column
389aacc543eSdrh ** of the referenced table.  The Expr.iColumn value for the special
390aacc543eSdrh ** ROWID column is -1.  Any INTEGER PRIMARY KEY column is tried as an
391aacc543eSdrh ** alias for ROWID.
39219a775c2Sdrh **
393fef5208cSdrh ** We also check for instances of the IN operator.  IN comes in two
394fef5208cSdrh ** forms:
395fef5208cSdrh **
396fef5208cSdrh **           expr IN (exprlist)
397fef5208cSdrh ** and
398fef5208cSdrh **           expr IN (SELECT ...)
399fef5208cSdrh **
400fef5208cSdrh ** The first form is handled by creating a set holding the list
401fef5208cSdrh ** of allowed values.  The second form causes the SELECT to generate
402fef5208cSdrh ** a temporary table.
403fef5208cSdrh **
404fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression.
40519a775c2Sdrh ** If it finds any, it generates code to write the value of that select
40619a775c2Sdrh ** into a memory cell.
407cce7d176Sdrh **
408967e8b73Sdrh ** Unknown columns or tables provoke an error.  The function returns
409cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg.
410cce7d176Sdrh */
411a2e00042Sdrh int sqliteExprResolveIds(
412a2e00042Sdrh   Parse *pParse,     /* The parser context */
413832508b7Sdrh   int base,          /* VDBE cursor number for first entry in pTabList */
414ad3cab52Sdrh   SrcList *pTabList, /* List of tables used to resolve column names */
415a2e00042Sdrh   ExprList *pEList,  /* List of expressions used to resolve "AS" */
416a2e00042Sdrh   Expr *pExpr        /* The expression to be analyzed. */
417a2e00042Sdrh ){
418daffd0e5Sdrh   if( pExpr==0 || pTabList==0 ) return 0;
419ad3cab52Sdrh   assert( base+pTabList->nSrc<=pParse->nTab );
420cce7d176Sdrh   switch( pExpr->op ){
4212398937bSdrh     /* Double-quoted strings (ex: "abc") are used as identifiers if
4222398937bSdrh     ** possible.  Otherwise they remain as strings.  Single-quoted
4232398937bSdrh     ** strings (ex: 'abc') are always string literals.
4242398937bSdrh     */
4252398937bSdrh     case TK_STRING: {
4262398937bSdrh       if( pExpr->token.z[0]=='\'' ) break;
4272398937bSdrh       /* Fall thru into the TK_ID case if this is a double-quoted string */
4282398937bSdrh     }
429a2e00042Sdrh     /* A lone identifier.  Try and match it as follows:
430a2e00042Sdrh     **
431a2e00042Sdrh     **     1.  To the name of a column of one of the tables in pTabList
432a2e00042Sdrh     **
433a2e00042Sdrh     **     2.  To the right side of an AS keyword in the column list of
434a2e00042Sdrh     **         a SELECT statement.  (For example, match against 'x' in
435a2e00042Sdrh     **         "SELECT a+b AS 'x' FROM t1".)
436a2e00042Sdrh     **
437a2e00042Sdrh     **     3.  One of the special names "ROWID", "OID", or "_ROWID_".
438a2e00042Sdrh     */
439cce7d176Sdrh     case TK_ID: {
440cce7d176Sdrh       int cnt = 0;      /* Number of matches */
441cce7d176Sdrh       int i;            /* Loop counter */
442a76b5dfcSdrh       char *z;
443a76b5dfcSdrh       assert( pExpr->token.z );
444a76b5dfcSdrh       z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
4452f4392ffSdrh       sqliteDequote(z);
446daffd0e5Sdrh       if( z==0 ) return 1;
447ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
448cce7d176Sdrh         int j;
449cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
450cce7d176Sdrh         if( pTab==0 ) continue;
451417be79cSdrh         assert( pTab->nCol>0 );
452cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
4537020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
454cce7d176Sdrh             cnt++;
455832508b7Sdrh             pExpr->iTable = i + base;
4564a32431cSdrh             if( j==pTab->iPKey ){
4574a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
4584a32431cSdrh               pExpr->iColumn = -1;
459c9b84a1fSdrh               pExpr->dataType = SQLITE_SO_NUM;
4604a32431cSdrh             }else{
461967e8b73Sdrh               pExpr->iColumn = j;
462c9b84a1fSdrh               pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
463cce7d176Sdrh             }
464a2e00042Sdrh             pExpr->op = TK_COLUMN;
465a2e00042Sdrh           }
466a2e00042Sdrh         }
467a2e00042Sdrh       }
468a2e00042Sdrh       if( cnt==0 && pEList!=0 ){
469a2e00042Sdrh         int j;
470a2e00042Sdrh         for(j=0; j<pEList->nExpr; j++){
471a2e00042Sdrh           char *zAs = pEList->a[j].zName;
472a2e00042Sdrh           if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
473a2e00042Sdrh             cnt++;
474a2e00042Sdrh             assert( pExpr->pLeft==0 && pExpr->pRight==0 );
475a2e00042Sdrh             pExpr->op = TK_AS;
476a2e00042Sdrh             pExpr->iColumn = j;
47775148a27Sdrh             pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr);
478cce7d176Sdrh           }
479cce7d176Sdrh         }
4804a32431cSdrh       }
481c4a3c779Sdrh       if( cnt==0 && sqliteIsRowid(z) ){
482c4a3c779Sdrh         pExpr->iColumn = -1;
483832508b7Sdrh         pExpr->iTable = base;
484ad3cab52Sdrh         cnt = 1 + (pTabList->nSrc>1);
485a2e00042Sdrh         pExpr->op = TK_COLUMN;
486c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
487c4a3c779Sdrh       }
488cce7d176Sdrh       sqliteFree(z);
4892398937bSdrh       if( cnt==0 && pExpr->token.z[0]!='"' ){
490967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
491cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
492cce7d176Sdrh         pParse->nErr++;
493cce7d176Sdrh         return 1;
494cce7d176Sdrh       }else if( cnt>1 ){
495967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
496cce7d176Sdrh           pExpr->token.z, pExpr->token.n, 0);
497cce7d176Sdrh         pParse->nErr++;
498cce7d176Sdrh         return 1;
499cce7d176Sdrh       }
500cce7d176Sdrh       break;
501cce7d176Sdrh     }
502cce7d176Sdrh 
503967e8b73Sdrh     /* A table name and column name:  ID.ID */
504cce7d176Sdrh     case TK_DOT: {
505cce7d176Sdrh       int cnt = 0;             /* Number of matches */
506c4a3c779Sdrh       int cntTab = 0;          /* Number of matching tables */
507cce7d176Sdrh       int i;                   /* Loop counter */
508cce7d176Sdrh       Expr *pLeft, *pRight;    /* Left and right subbranches of the expr */
509cce7d176Sdrh       char *zLeft, *zRight;    /* Text of an identifier */
510cce7d176Sdrh 
511cce7d176Sdrh       pLeft = pExpr->pLeft;
512cce7d176Sdrh       pRight = pExpr->pRight;
513a76b5dfcSdrh       assert( pLeft && pLeft->op==TK_ID && pLeft->token.z );
514a76b5dfcSdrh       assert( pRight && pRight->op==TK_ID && pRight->token.z );
5156e142f54Sdrh       zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
5166e142f54Sdrh       zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
517daffd0e5Sdrh       if( zLeft==0 || zRight==0 ){
518daffd0e5Sdrh         sqliteFree(zLeft);
519daffd0e5Sdrh         sqliteFree(zRight);
520daffd0e5Sdrh         return 1;
521daffd0e5Sdrh       }
52287c40e88Sdrh       sqliteDequote(zLeft);
52387c40e88Sdrh       sqliteDequote(zRight);
524c4a3c779Sdrh       pExpr->iTable = -1;
525ad3cab52Sdrh       for(i=0; i<pTabList->nSrc; i++){
526cce7d176Sdrh         int j;
527cce7d176Sdrh         char *zTab;
528cce7d176Sdrh         Table *pTab = pTabList->a[i].pTab;
529cce7d176Sdrh         if( pTab==0 ) continue;
530417be79cSdrh         assert( pTab->nCol>0 );
531cce7d176Sdrh         if( pTabList->a[i].zAlias ){
532cce7d176Sdrh           zTab = pTabList->a[i].zAlias;
533cce7d176Sdrh         }else{
534cce7d176Sdrh           zTab = pTab->zName;
535cce7d176Sdrh         }
536094b2bbfSdrh         if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue;
537832508b7Sdrh         if( 0==(cntTab++) ) pExpr->iTable = i + base;
538cce7d176Sdrh         for(j=0; j<pTab->nCol; j++){
5397020f651Sdrh           if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
540cce7d176Sdrh             cnt++;
541832508b7Sdrh             pExpr->iTable = i + base;
5424a32431cSdrh             if( j==pTab->iPKey ){
5434a32431cSdrh               /* Substitute the record number for the INTEGER PRIMARY KEY */
5444a32431cSdrh               pExpr->iColumn = -1;
5454a32431cSdrh             }else{
546967e8b73Sdrh               pExpr->iColumn = j;
547cce7d176Sdrh             }
548c9b84a1fSdrh             pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
549cce7d176Sdrh           }
550cce7d176Sdrh         }
5514a32431cSdrh       }
552c3f9bad2Sdanielk1977 
553c3f9bad2Sdanielk1977       /* If we have not already resolved this *.* expression, then maybe
554c3f9bad2Sdanielk1977        * it is a new.* or old.* trigger argument reference */
555c3f9bad2Sdanielk1977       if( cnt == 0 && pParse->trigStack != 0 ){
556f29ce559Sdanielk1977         TriggerStack *pTriggerStack = pParse->trigStack;
557c3f9bad2Sdanielk1977         int t = 0;
558f29ce559Sdanielk1977         if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){
559f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->newIdx;
560c3f9bad2Sdanielk1977           cntTab++;
561c3f9bad2Sdanielk1977           t = 1;
562c3f9bad2Sdanielk1977         }
563f29ce559Sdanielk1977         if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){
564f29ce559Sdanielk1977           pExpr->iTable = pTriggerStack->oldIdx;
565c3f9bad2Sdanielk1977           cntTab++;
566c3f9bad2Sdanielk1977           t = 1;
567c3f9bad2Sdanielk1977         }
568c3f9bad2Sdanielk1977 
569f29ce559Sdanielk1977         if( t ){
570f29ce559Sdanielk1977 	  int j;
571c9b84a1fSdrh           Table *pTab = pTriggerStack->pTab;
572c9b84a1fSdrh           for(j=0; j < pTab->nCol; j++) {
573c9b84a1fSdrh             if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
574c3f9bad2Sdanielk1977               cnt++;
575c3f9bad2Sdanielk1977               pExpr->iColumn = j;
576c9b84a1fSdrh               pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK;
577c3f9bad2Sdanielk1977             }
578c3f9bad2Sdanielk1977           }
579c3f9bad2Sdanielk1977 	}
580f29ce559Sdanielk1977       }
581c3f9bad2Sdanielk1977 
582c4a3c779Sdrh       if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
583c4a3c779Sdrh         cnt = 1;
584c4a3c779Sdrh         pExpr->iColumn = -1;
585c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
586c4a3c779Sdrh       }
587cce7d176Sdrh       sqliteFree(zLeft);
588cce7d176Sdrh       sqliteFree(zRight);
589cce7d176Sdrh       if( cnt==0 ){
590967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
591cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
592cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
593cce7d176Sdrh         pParse->nErr++;
594cce7d176Sdrh         return 1;
595cce7d176Sdrh       }else if( cnt>1 ){
596967e8b73Sdrh         sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
597cce7d176Sdrh           pLeft->token.z, pLeft->token.n, ".", 1,
598cce7d176Sdrh           pRight->token.z, pRight->token.n, 0);
599cce7d176Sdrh         pParse->nErr++;
600cce7d176Sdrh         return 1;
601cce7d176Sdrh       }
602cce7d176Sdrh       sqliteExprDelete(pLeft);
603cce7d176Sdrh       pExpr->pLeft = 0;
604cce7d176Sdrh       sqliteExprDelete(pRight);
605cce7d176Sdrh       pExpr->pRight = 0;
606967e8b73Sdrh       pExpr->op = TK_COLUMN;
607cce7d176Sdrh       break;
608cce7d176Sdrh     }
609cce7d176Sdrh 
610fef5208cSdrh     case TK_IN: {
611d8bc7086Sdrh       Vdbe *v = sqliteGetVdbe(pParse);
612fef5208cSdrh       if( v==0 ) return 1;
613832508b7Sdrh       if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
614cfab11bcSdrh         return 1;
615cfab11bcSdrh       }
616fef5208cSdrh       if( pExpr->pSelect ){
617fef5208cSdrh         /* Case 1:     expr IN (SELECT ...)
618fef5208cSdrh         **
619fef5208cSdrh         ** Generate code to write the results of the select into a temporary
6204794b980Sdrh         ** table.  The cursor number of the temporary table has already
6214794b980Sdrh         ** been put in iTable by sqliteExprResolveInSelect().
622fef5208cSdrh         */
623832508b7Sdrh         pExpr->iTable = pParse->nTab++;
624c6b52df3Sdrh         sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
625832508b7Sdrh         sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0);
626fef5208cSdrh       }else if( pExpr->pList ){
627fef5208cSdrh         /* Case 2:     expr IN (exprlist)
628fef5208cSdrh         **
629fef5208cSdrh         ** Create a set to put the exprlist values in.  The Set id is stored
630fef5208cSdrh         ** in iTable.
631fef5208cSdrh         */
632fef5208cSdrh         int i, iSet;
633fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
634fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
6359208643dSdrh           if( !sqliteExprIsConstant(pE2) ){
636fef5208cSdrh             sqliteSetString(&pParse->zErrMsg,
637fef5208cSdrh               "right-hand side of IN operator must be constant", 0);
638fef5208cSdrh             pParse->nErr++;
639fef5208cSdrh             return 1;
640fef5208cSdrh           }
6414794b980Sdrh           if( sqliteExprCheck(pParse, pE2, 0, 0) ){
6424794b980Sdrh             return 1;
6434794b980Sdrh           }
644fef5208cSdrh         }
645fef5208cSdrh         iSet = pExpr->iTable = pParse->nSet++;
646fef5208cSdrh         for(i=0; i<pExpr->pList->nExpr; i++){
647fef5208cSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
648fef5208cSdrh           switch( pE2->op ){
649fef5208cSdrh             case TK_FLOAT:
650fef5208cSdrh             case TK_INTEGER:
651fef5208cSdrh             case TK_STRING: {
65299fcd718Sdrh               int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
653a76b5dfcSdrh               assert( pE2->token.z );
654fef5208cSdrh               sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
655fef5208cSdrh               sqliteVdbeDequoteP3(v, addr);
656fef5208cSdrh               break;
657fef5208cSdrh             }
658fef5208cSdrh             default: {
659fef5208cSdrh               sqliteExprCode(pParse, pE2);
66099fcd718Sdrh               sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
661fef5208cSdrh               break;
662fef5208cSdrh             }
663fef5208cSdrh           }
664fef5208cSdrh         }
665fef5208cSdrh       }
666cfab11bcSdrh       break;
667fef5208cSdrh     }
668fef5208cSdrh 
66919a775c2Sdrh     case TK_SELECT: {
670fef5208cSdrh       /* This has to be a scalar SELECT.  Generate code to put the
671fef5208cSdrh       ** value of this select in a memory cell and record the number
672967e8b73Sdrh       ** of the memory cell in iColumn.
673fef5208cSdrh       */
674967e8b73Sdrh       pExpr->iColumn = pParse->nMem++;
675832508b7Sdrh       if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){
67619a775c2Sdrh         return 1;
67719a775c2Sdrh       }
67819a775c2Sdrh       break;
67919a775c2Sdrh     }
68019a775c2Sdrh 
681cce7d176Sdrh     /* For all else, just recursively walk the tree */
682cce7d176Sdrh     default: {
683cce7d176Sdrh       if( pExpr->pLeft
684832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){
685cce7d176Sdrh         return 1;
686cce7d176Sdrh       }
687cce7d176Sdrh       if( pExpr->pRight
688832508b7Sdrh       && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){
689cce7d176Sdrh         return 1;
690cce7d176Sdrh       }
691cce7d176Sdrh       if( pExpr->pList ){
692cce7d176Sdrh         int i;
693cce7d176Sdrh         ExprList *pList = pExpr->pList;
694cce7d176Sdrh         for(i=0; i<pList->nExpr; i++){
695832508b7Sdrh           Expr *pArg = pList->a[i].pExpr;
696832508b7Sdrh           if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){
697cce7d176Sdrh             return 1;
698cce7d176Sdrh           }
699cce7d176Sdrh         }
700cce7d176Sdrh       }
701cce7d176Sdrh     }
702cce7d176Sdrh   }
703cce7d176Sdrh   return 0;
704cce7d176Sdrh }
705cce7d176Sdrh 
706cce7d176Sdrh /*
707cce7d176Sdrh ** Error check the functions in an expression.  Make sure all
708cce7d176Sdrh ** function names are recognized and all functions have the correct
709cce7d176Sdrh ** number of arguments.  Leave an error message in pParse->zErrMsg
710cce7d176Sdrh ** if anything is amiss.  Return the number of errors.
711cce7d176Sdrh **
712cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function
713cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg.
714cce7d176Sdrh */
715cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
716cce7d176Sdrh   int nErr = 0;
717cce7d176Sdrh   if( pExpr==0 ) return 0;
718cce7d176Sdrh   switch( pExpr->op ){
719cce7d176Sdrh     case TK_FUNCTION: {
720c9b84a1fSdrh       int n = pExpr->pList ? pExpr->pList->nExpr : 0;  /* Number of arguments */
721c9b84a1fSdrh       int no_such_func = 0;       /* True if no such function exists */
722c9b84a1fSdrh       int is_type_of = 0;         /* True if is the special TypeOf() function */
723c9b84a1fSdrh       int wrong_num_args = 0;     /* True if wrong number of arguments */
724c9b84a1fSdrh       int is_agg = 0;             /* True if is an aggregate function */
725cce7d176Sdrh       int i;
7260bce8354Sdrh       FuncDef *pDef;
7270bce8354Sdrh 
72889425d5eSdrh       pDef = sqliteFindFunction(pParse->db,
72989425d5eSdrh          pExpr->token.z, pExpr->token.n, n, 0);
7300bce8354Sdrh       if( pDef==0 ){
7310bce8354Sdrh         pDef = sqliteFindFunction(pParse->db,
7328e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, -1, 0);
7330bce8354Sdrh         if( pDef==0 ){
734c9b84a1fSdrh           if( n==1 && pExpr->token.n==6
735c9b84a1fSdrh                && sqliteStrNICmp(pExpr->token.z, "typeof", 6)==0 ){
736c9b84a1fSdrh             is_type_of = 1;
737c9b84a1fSdrh           }else {
738cce7d176Sdrh             no_such_func = 1;
739c9b84a1fSdrh           }
7408e0a2f90Sdrh         }else{
7418e0a2f90Sdrh           wrong_num_args = 1;
7428e0a2f90Sdrh         }
7438e0a2f90Sdrh       }else{
7440bce8354Sdrh         is_agg = pDef->xFunc==0;
745cce7d176Sdrh       }
7468e0a2f90Sdrh       if( is_agg && !allowAgg ){
7478e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1,
7488e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
7498e0a2f90Sdrh         pParse->nErr++;
7508e0a2f90Sdrh         nErr++;
7518e0a2f90Sdrh         is_agg = 0;
7528e0a2f90Sdrh       }else if( no_such_func ){
753cce7d176Sdrh         sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
754cce7d176Sdrh            pExpr->token.z, pExpr->token.n, 0);
755cce7d176Sdrh         pParse->nErr++;
756cce7d176Sdrh         nErr++;
7578e0a2f90Sdrh       }else if( wrong_num_args ){
7588e0a2f90Sdrh         sqliteSetNString(&pParse->zErrMsg,
7598e0a2f90Sdrh            "wrong number of arguments to function ",-1,
7608e0a2f90Sdrh            pExpr->token.z, pExpr->token.n, "()", 2, 0);
7618e0a2f90Sdrh         pParse->nErr++;
7628e0a2f90Sdrh         nErr++;
763cce7d176Sdrh       }
7642282792aSdrh       if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
765cce7d176Sdrh       if( is_agg && pIsAgg ) *pIsAgg = 1;
766cce7d176Sdrh       for(i=0; nErr==0 && i<n; i++){
7674cfa7934Sdrh         nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
7684cfa7934Sdrh                                allowAgg && !is_agg, pIsAgg);
769cce7d176Sdrh       }
770c9b84a1fSdrh       if( pDef==0 ){
771c9b84a1fSdrh         if( is_type_of ){
772c9b84a1fSdrh           pExpr->op = TK_STRING;
773c9b84a1fSdrh           if( sqliteExprType(pExpr->pList->a[0].pExpr)==SQLITE_SO_NUM ){
774c9b84a1fSdrh             pExpr->token.z = "numeric";
775c9b84a1fSdrh             pExpr->token.n = 7;
776c9b84a1fSdrh           }else{
777c9b84a1fSdrh             pExpr->token.z = "text";
778c9b84a1fSdrh             pExpr->token.n = 4;
779c9b84a1fSdrh           }
780c9b84a1fSdrh         }
781c9b84a1fSdrh       }else if( pDef->dataType>=0 ){
782c9b84a1fSdrh         if( pDef->dataType<n ){
783c9b84a1fSdrh           pExpr->dataType =
784c9b84a1fSdrh              sqliteExprType(pExpr->pList->a[pDef->dataType].pExpr);
785c9b84a1fSdrh         }else{
786c9b84a1fSdrh           pExpr->dataType = SQLITE_SO_NUM;
787c9b84a1fSdrh         }
788c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_ARGS ){
789c9b84a1fSdrh         pDef->dataType = SQLITE_SO_TEXT;
790c9b84a1fSdrh         for(i=0; i<n; i++){
791c9b84a1fSdrh           if( sqliteExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){
792c9b84a1fSdrh             pExpr->dataType = SQLITE_SO_NUM;
793c9b84a1fSdrh             break;
794c9b84a1fSdrh           }
795c9b84a1fSdrh         }
796c9b84a1fSdrh       }else if( pDef->dataType==SQLITE_NUMERIC ){
797c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_NUM;
798c9b84a1fSdrh       }else{
799c9b84a1fSdrh         pExpr->dataType = SQLITE_SO_TEXT;
800c9b84a1fSdrh       }
801cce7d176Sdrh     }
802cce7d176Sdrh     default: {
803cce7d176Sdrh       if( pExpr->pLeft ){
8042282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
805cce7d176Sdrh       }
806cce7d176Sdrh       if( nErr==0 && pExpr->pRight ){
8072282792aSdrh         nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
808cce7d176Sdrh       }
809fef5208cSdrh       if( nErr==0 && pExpr->pList ){
810fef5208cSdrh         int n = pExpr->pList->nExpr;
811fef5208cSdrh         int i;
812fef5208cSdrh         for(i=0; nErr==0 && i<n; i++){
8132282792aSdrh           Expr *pE2 = pExpr->pList->a[i].pExpr;
8142282792aSdrh           nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
815fef5208cSdrh         }
816fef5208cSdrh       }
817cce7d176Sdrh       break;
818cce7d176Sdrh     }
819cce7d176Sdrh   }
820cce7d176Sdrh   return nErr;
821cce7d176Sdrh }
822cce7d176Sdrh 
823cce7d176Sdrh /*
824c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the
825c9b84a1fSdrh ** given expression should sort as numeric values or as text.
826c9b84a1fSdrh **
827c9b84a1fSdrh ** The sqliteExprResolveIds() and sqliteExprCheck() routines must have
828c9b84a1fSdrh ** both been called on the expression before it is passed to this routine.
829c9b84a1fSdrh */
830c9b84a1fSdrh int sqliteExprType(Expr *p){
831c9b84a1fSdrh   if( p==0 ) return SQLITE_SO_NUM;
832c9b84a1fSdrh   while( p ) switch( p->op ){
833c9b84a1fSdrh     case TK_PLUS:
834c9b84a1fSdrh     case TK_MINUS:
835c9b84a1fSdrh     case TK_STAR:
836c9b84a1fSdrh     case TK_SLASH:
837c9b84a1fSdrh     case TK_AND:
838c9b84a1fSdrh     case TK_OR:
839c9b84a1fSdrh     case TK_ISNULL:
840c9b84a1fSdrh     case TK_NOTNULL:
841c9b84a1fSdrh     case TK_NOT:
842c9b84a1fSdrh     case TK_UMINUS:
843c9b84a1fSdrh     case TK_BITAND:
844c9b84a1fSdrh     case TK_BITOR:
845c9b84a1fSdrh     case TK_BITNOT:
846c9b84a1fSdrh     case TK_LSHIFT:
847c9b84a1fSdrh     case TK_RSHIFT:
848c9b84a1fSdrh     case TK_REM:
849c9b84a1fSdrh     case TK_INTEGER:
850c9b84a1fSdrh     case TK_FLOAT:
851c9b84a1fSdrh     case TK_IN:
852c9b84a1fSdrh     case TK_BETWEEN:
853c9b84a1fSdrh       return SQLITE_SO_NUM;
854c9b84a1fSdrh 
855c9b84a1fSdrh     case TK_STRING:
856c9b84a1fSdrh     case TK_NULL:
857c9b84a1fSdrh     case TK_CONCAT:
858c9b84a1fSdrh       return SQLITE_SO_TEXT;
859c9b84a1fSdrh 
860c9b84a1fSdrh     case TK_LT:
861c9b84a1fSdrh     case TK_LE:
862c9b84a1fSdrh     case TK_GT:
863c9b84a1fSdrh     case TK_GE:
864c9b84a1fSdrh     case TK_NE:
865c9b84a1fSdrh     case TK_EQ:
866c9b84a1fSdrh       if( sqliteExprType(p->pLeft)==SQLITE_SO_NUM ){
867c9b84a1fSdrh         return SQLITE_SO_NUM;
868c9b84a1fSdrh       }
869c9b84a1fSdrh       p = p->pRight;
870c9b84a1fSdrh       break;
871c9b84a1fSdrh 
872c9b84a1fSdrh     case TK_AS:
873c9b84a1fSdrh       p = p->pLeft;
874c9b84a1fSdrh       break;
875c9b84a1fSdrh 
876c9b84a1fSdrh     case TK_COLUMN:
877c9b84a1fSdrh     case TK_FUNCTION:
878c9b84a1fSdrh     case TK_AGG_FUNCTION:
879c9b84a1fSdrh       return p->dataType;
880c9b84a1fSdrh 
881c9b84a1fSdrh     case TK_SELECT:
882c9b84a1fSdrh       assert( p->pSelect );
883c9b84a1fSdrh       assert( p->pSelect->pEList );
884c9b84a1fSdrh       assert( p->pSelect->pEList->nExpr>0 );
885c9b84a1fSdrh       p = p->pSelect->pEList->a[0].pExpr;
886c9b84a1fSdrh       break;
887c9b84a1fSdrh 
888b1363206Sdrh     case TK_CASE: {
889b1363206Sdrh       if( p->pRight && sqliteExprType(p->pRight)==SQLITE_SO_NUM ){
890b1363206Sdrh         return SQLITE_SO_NUM;
891b1363206Sdrh       }
892b1363206Sdrh       if( p->pList ){
893b1363206Sdrh         int i;
894b1363206Sdrh         ExprList *pList = p->pList;
895b1363206Sdrh         for(i=1; i<pList->nExpr; i+=2){
896b1363206Sdrh           if( sqliteExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){
897b1363206Sdrh             return SQLITE_SO_NUM;
898b1363206Sdrh           }
899b1363206Sdrh         }
900b1363206Sdrh       }
901b1363206Sdrh       return SQLITE_SO_TEXT;
902b1363206Sdrh     }
903b1363206Sdrh 
904c9b84a1fSdrh     default:
905c9b84a1fSdrh       assert( p->op==TK_ABORT );  /* Can't Happen */
906c9b84a1fSdrh       break;
907c9b84a1fSdrh   }
908c9b84a1fSdrh   return SQLITE_SO_NUM;
909c9b84a1fSdrh }
910c9b84a1fSdrh 
911c9b84a1fSdrh /*
912cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given
9131ccde15dSdrh ** expression and leave the result on the top of stack.
914cce7d176Sdrh */
915cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){
916cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
917cce7d176Sdrh   int op;
918daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
919cce7d176Sdrh   switch( pExpr->op ){
920cce7d176Sdrh     case TK_PLUS:     op = OP_Add;      break;
921cce7d176Sdrh     case TK_MINUS:    op = OP_Subtract; break;
922cce7d176Sdrh     case TK_STAR:     op = OP_Multiply; break;
923cce7d176Sdrh     case TK_SLASH:    op = OP_Divide;   break;
924cce7d176Sdrh     case TK_AND:      op = OP_And;      break;
925cce7d176Sdrh     case TK_OR:       op = OP_Or;       break;
926cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
927cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
928cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
929cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
930cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
931cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
932cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
933cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
934cce7d176Sdrh     case TK_NOT:      op = OP_Not;      break;
935cce7d176Sdrh     case TK_UMINUS:   op = OP_Negative; break;
936bf4133cbSdrh     case TK_BITAND:   op = OP_BitAnd;   break;
937bf4133cbSdrh     case TK_BITOR:    op = OP_BitOr;    break;
938bf4133cbSdrh     case TK_BITNOT:   op = OP_BitNot;   break;
939bf4133cbSdrh     case TK_LSHIFT:   op = OP_ShiftLeft;  break;
940bf4133cbSdrh     case TK_RSHIFT:   op = OP_ShiftRight; break;
941bf4133cbSdrh     case TK_REM:      op = OP_Remainder;  break;
942cce7d176Sdrh     default: break;
943cce7d176Sdrh   }
944cce7d176Sdrh   switch( pExpr->op ){
945967e8b73Sdrh     case TK_COLUMN: {
9462282792aSdrh       if( pParse->useAgg ){
94799fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
948c4a3c779Sdrh       }else if( pExpr->iColumn>=0 ){
94999fcd718Sdrh         sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
950c4a3c779Sdrh       }else{
95199fcd718Sdrh         sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
9522282792aSdrh       }
953cce7d176Sdrh       break;
954cce7d176Sdrh     }
955cce7d176Sdrh     case TK_INTEGER: {
956d9e30930Sdrh       int iVal = atoi(pExpr->token.z);
957d9e30930Sdrh       char zBuf[30];
958d9e30930Sdrh       sprintf(zBuf,"%d",iVal);
959d9e30930Sdrh       if( strlen(zBuf)!=pExpr->token.n
960d9e30930Sdrh             || strncmp(pExpr->token.z,zBuf,pExpr->token.n)!=0 ){
961d9e30930Sdrh         /* If the integer value cannot be represented exactly in 32 bits,
962d9e30930Sdrh         ** then code it as a string instead. */
963d9e30930Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
964d9e30930Sdrh       }else{
965d9e30930Sdrh         sqliteVdbeAddOp(v, OP_Integer, iVal, 0);
966d9e30930Sdrh       }
967e6840900Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
968e6840900Sdrh       break;
969e6840900Sdrh     }
970e6840900Sdrh     case TK_FLOAT: {
9717a7c7390Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
972a76b5dfcSdrh       assert( pExpr->token.z );
9737a7c7390Sdrh       sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
974cce7d176Sdrh       break;
975cce7d176Sdrh     }
976cce7d176Sdrh     case TK_STRING: {
97799fcd718Sdrh       int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
978a76b5dfcSdrh       assert( pExpr->token.z );
979cce7d176Sdrh       sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
980cce7d176Sdrh       sqliteVdbeDequoteP3(v, addr);
981cce7d176Sdrh       break;
982cce7d176Sdrh     }
983cce7d176Sdrh     case TK_NULL: {
98499fcd718Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
985cce7d176Sdrh       break;
986cce7d176Sdrh     }
987c9b84a1fSdrh     case TK_LT:
988c9b84a1fSdrh     case TK_LE:
989c9b84a1fSdrh     case TK_GT:
990c9b84a1fSdrh     case TK_GE:
991c9b84a1fSdrh     case TK_NE:
992c9b84a1fSdrh     case TK_EQ: {
993c9b84a1fSdrh       if( pParse->db->file_format>=3 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
994c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
995c9b84a1fSdrh       }
996c9b84a1fSdrh       /* Fall through into the next case */
997c9b84a1fSdrh     }
998cce7d176Sdrh     case TK_AND:
999cce7d176Sdrh     case TK_OR:
1000cce7d176Sdrh     case TK_PLUS:
1001cce7d176Sdrh     case TK_STAR:
1002cce7d176Sdrh     case TK_MINUS:
1003bf4133cbSdrh     case TK_REM:
1004bf4133cbSdrh     case TK_BITAND:
1005bf4133cbSdrh     case TK_BITOR:
1006c9b84a1fSdrh     case TK_SLASH: {
1007cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1008cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
100999fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
1010cce7d176Sdrh       break;
1011cce7d176Sdrh     }
1012bf4133cbSdrh     case TK_LSHIFT:
1013bf4133cbSdrh     case TK_RSHIFT: {
1014bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pRight);
1015bf4133cbSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1016bf4133cbSdrh       sqliteVdbeAddOp(v, op, 0, 0);
1017bf4133cbSdrh       break;
1018bf4133cbSdrh     }
10190040077dSdrh     case TK_CONCAT: {
10200040077dSdrh       sqliteExprCode(pParse, pExpr->pLeft);
10210040077dSdrh       sqliteExprCode(pParse, pExpr->pRight);
102299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Concat, 2, 0);
10230040077dSdrh       break;
10240040077dSdrh     }
1025cce7d176Sdrh     case TK_UMINUS: {
10266e142f54Sdrh       assert( pExpr->pLeft );
10277a7c7390Sdrh       if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
10286e142f54Sdrh         Token *p = &pExpr->pLeft->token;
10296e142f54Sdrh         char *z = sqliteMalloc( p->n + 2 );
10306e142f54Sdrh         sprintf(z, "-%.*s", p->n, p->z);
1031e6840900Sdrh         if( pExpr->pLeft->op==TK_INTEGER ){
1032e6840900Sdrh           sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0);
1033e6840900Sdrh         }else{
103499fcd718Sdrh           sqliteVdbeAddOp(v, OP_String, 0, 0);
1035e6840900Sdrh         }
103699fcd718Sdrh         sqliteVdbeChangeP3(v, -1, z, p->n+1);
10376e142f54Sdrh         sqliteFree(z);
10386e142f54Sdrh         break;
10396e142f54Sdrh       }
10401ccde15dSdrh       /* Fall through into TK_NOT */
10416e142f54Sdrh     }
1042bf4133cbSdrh     case TK_BITNOT:
10436e142f54Sdrh     case TK_NOT: {
1044cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
104599fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
1046cce7d176Sdrh       break;
1047cce7d176Sdrh     }
1048cce7d176Sdrh     case TK_ISNULL:
1049cce7d176Sdrh     case TK_NOTNULL: {
1050cce7d176Sdrh       int dest;
105199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
1052cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1053cce7d176Sdrh       dest = sqliteVdbeCurrentAddr(v) + 2;
1054f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
105599fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
1056cce7d176Sdrh       break;
1057cce7d176Sdrh     }
10582282792aSdrh     case TK_AGG_FUNCTION: {
105999fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
10602282792aSdrh       break;
10612282792aSdrh     }
1062cce7d176Sdrh     case TK_FUNCTION: {
1063cce7d176Sdrh       int i;
1064cce7d176Sdrh       ExprList *pList = pExpr->pList;
106589425d5eSdrh       int nExpr = pList ? pList->nExpr : 0;
10660bce8354Sdrh       FuncDef *pDef;
10670bce8354Sdrh       pDef = sqliteFindFunction(pParse->db,
106889425d5eSdrh                       pExpr->token.z, pExpr->token.n, nExpr, 0);
10690bce8354Sdrh       assert( pDef!=0 );
107089425d5eSdrh       for(i=0; i<nExpr; i++){
10718e0a2f90Sdrh         sqliteExprCode(pParse, pList->a[i].pExpr);
10728e0a2f90Sdrh       }
107389425d5eSdrh       sqliteVdbeAddOp(v, OP_Function, nExpr, 0);
10740bce8354Sdrh       sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER);
10756ec2733bSdrh       break;
10766ec2733bSdrh     }
107719a775c2Sdrh     case TK_SELECT: {
107899fcd718Sdrh       sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
107919a775c2Sdrh       break;
108019a775c2Sdrh     }
1081fef5208cSdrh     case TK_IN: {
1082fef5208cSdrh       int addr;
108399fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 1, 0);
1084fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1085fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1086f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4);
1087f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1088f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
1089f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, addr+6);
1090fef5208cSdrh       if( pExpr->pSelect ){
1091f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6);
1092fef5208cSdrh       }else{
1093f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6);
1094fef5208cSdrh       }
109599fcd718Sdrh       sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
1096fef5208cSdrh       break;
1097fef5208cSdrh     }
1098fef5208cSdrh     case TK_BETWEEN: {
1099f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1100f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1101f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1102f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, 0, 0);
1103f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pull, 1, 0);
1104f5905aa7Sdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1105f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, 0, 0);
1106f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_And, 0, 0);
1107fef5208cSdrh       break;
1108fef5208cSdrh     }
1109a2e00042Sdrh     case TK_AS: {
1110a2e00042Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1111a2e00042Sdrh       break;
1112a2e00042Sdrh     }
111317a7f8ddSdrh     case TK_CASE: {
111417a7f8ddSdrh       int expr_end_label;
1115f5905aa7Sdrh       int jumpInst;
1116f5905aa7Sdrh       int addr;
1117f5905aa7Sdrh       int nExpr;
111817a7f8ddSdrh       int i;
111917a7f8ddSdrh 
112017a7f8ddSdrh       assert(pExpr->pList);
112117a7f8ddSdrh       assert((pExpr->pList->nExpr % 2) == 0);
112217a7f8ddSdrh       assert(pExpr->pList->nExpr > 0);
1123f5905aa7Sdrh       nExpr = pExpr->pList->nExpr;
1124f5905aa7Sdrh       expr_end_label = sqliteVdbeMakeLabel(v);
112517a7f8ddSdrh       if( pExpr->pLeft ){
112617a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pLeft);
1127cce7d176Sdrh       }
1128f5905aa7Sdrh       for(i=0; i<nExpr; i=i+2){
112917a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i].pExpr);
113017a7f8ddSdrh         if( pExpr->pLeft ){
1131f5905aa7Sdrh           sqliteVdbeAddOp(v, OP_Dup, 1, 1);
1132f570f011Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_Ne, 1, 0);
1133f570f011Sdrh           sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1134f5905aa7Sdrh         }else{
1135f570f011Sdrh           jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 1, 0);
113617a7f8ddSdrh         }
113717a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr);
1138f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label);
1139f5905aa7Sdrh         addr = sqliteVdbeCurrentAddr(v);
1140f5905aa7Sdrh         sqliteVdbeChangeP2(v, jumpInst, addr);
114117a7f8ddSdrh       }
1142f570f011Sdrh       if( pExpr->pLeft ){
1143f570f011Sdrh         sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1144f570f011Sdrh       }
114517a7f8ddSdrh       if( pExpr->pRight ){
114617a7f8ddSdrh         sqliteExprCode(pParse, pExpr->pRight);
114717a7f8ddSdrh       }else{
1148f5905aa7Sdrh         sqliteVdbeAddOp(v, OP_String, 0, 0);
114917a7f8ddSdrh       }
1150f5905aa7Sdrh       sqliteVdbeResolveLabel(v, expr_end_label);
11516f34903eSdanielk1977       break;
11526f34903eSdanielk1977     }
11536f34903eSdanielk1977     case TK_RAISE: {
11546f34903eSdanielk1977       if( !pParse->trigStack ){
11556f34903eSdanielk1977         sqliteSetNString(&pParse->zErrMsg,
11566f34903eSdanielk1977 		"RAISE() may only be used within a trigger-program", -1, 0);
11576f34903eSdanielk1977         pParse->nErr++;
11586f34903eSdanielk1977 	return;
11596f34903eSdanielk1977       }
11606f34903eSdanielk1977       if( pExpr->iColumn == OE_Rollback ||
11616f34903eSdanielk1977 	  pExpr->iColumn == OE_Abort ||
11626f34903eSdanielk1977 	  pExpr->iColumn == OE_Fail ){
11636f34903eSdanielk1977 	  char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
11646f34903eSdanielk1977 	  sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn);
11656f34903eSdanielk1977 	  sqliteDequote(msg);
11666f34903eSdanielk1977 	  sqliteVdbeChangeP3(v, -1, msg, 0);
11676f34903eSdanielk1977 	  sqliteFree(msg);
11686f34903eSdanielk1977       } else {
11696f34903eSdanielk1977 	  assert( pExpr->iColumn == OE_Ignore );
11706f34903eSdanielk1977 	  sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump);
11716f34903eSdanielk1977 	  sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", -1);
11726f34903eSdanielk1977       }
117317a7f8ddSdrh     }
117417a7f8ddSdrh     break;
117517a7f8ddSdrh   }
1176cce7d176Sdrh }
1177cce7d176Sdrh 
1178cce7d176Sdrh /*
1179cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made
1180cce7d176Sdrh ** to the label "dest" if the expression is true but execution
1181cce7d176Sdrh ** continues straight thru if the expression is false.
1182f5905aa7Sdrh **
1183f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then
1184f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true.
1185cce7d176Sdrh */
1186f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1187cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1188cce7d176Sdrh   int op = 0;
1189daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1190cce7d176Sdrh   switch( pExpr->op ){
1191cce7d176Sdrh     case TK_LT:       op = OP_Lt;       break;
1192cce7d176Sdrh     case TK_LE:       op = OP_Le;       break;
1193cce7d176Sdrh     case TK_GT:       op = OP_Gt;       break;
1194cce7d176Sdrh     case TK_GE:       op = OP_Ge;       break;
1195cce7d176Sdrh     case TK_NE:       op = OP_Ne;       break;
1196cce7d176Sdrh     case TK_EQ:       op = OP_Eq;       break;
1197cce7d176Sdrh     case TK_ISNULL:   op = OP_IsNull;   break;
1198cce7d176Sdrh     case TK_NOTNULL:  op = OP_NotNull;  break;
1199cce7d176Sdrh     default:  break;
1200cce7d176Sdrh   }
1201cce7d176Sdrh   switch( pExpr->op ){
1202cce7d176Sdrh     case TK_AND: {
1203cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1204f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);
1205f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1206cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1207cce7d176Sdrh       break;
1208cce7d176Sdrh     }
1209cce7d176Sdrh     case TK_OR: {
1210f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1211f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1212cce7d176Sdrh       break;
1213cce7d176Sdrh     }
1214cce7d176Sdrh     case TK_NOT: {
1215f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1216cce7d176Sdrh       break;
1217cce7d176Sdrh     }
1218cce7d176Sdrh     case TK_LT:
1219cce7d176Sdrh     case TK_LE:
1220cce7d176Sdrh     case TK_GT:
1221cce7d176Sdrh     case TK_GE:
1222cce7d176Sdrh     case TK_NE:
12230ac65892Sdrh     case TK_EQ: {
1224cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1225cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1226c9b84a1fSdrh       if( pParse->db->file_format>=3 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
1227c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1228c9b84a1fSdrh       }
1229f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1230cce7d176Sdrh       break;
1231cce7d176Sdrh     }
1232cce7d176Sdrh     case TK_ISNULL:
1233cce7d176Sdrh     case TK_NOTNULL: {
1234cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1235f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1236cce7d176Sdrh       break;
1237cce7d176Sdrh     }
1238fef5208cSdrh     case TK_IN: {
1239f5905aa7Sdrh       int addr;
1240cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1241f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1242f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1243f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1244f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1245fef5208cSdrh       if( pExpr->pSelect ){
124699fcd718Sdrh         sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
1247fef5208cSdrh       }else{
124899fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
1249fef5208cSdrh       }
1250fef5208cSdrh       break;
1251fef5208cSdrh     }
1252fef5208cSdrh     case TK_BETWEEN: {
1253f5905aa7Sdrh       int addr;
1254fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
125599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1256fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1257f5905aa7Sdrh       addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0);
1258fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1259f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest);
126099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Integer, 0, 0);
1261f5905aa7Sdrh       sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v));
126299fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1263fef5208cSdrh       break;
1264fef5208cSdrh     }
1265cce7d176Sdrh     default: {
1266cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1267f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest);
1268cce7d176Sdrh       break;
1269cce7d176Sdrh     }
1270cce7d176Sdrh   }
1271cce7d176Sdrh }
1272cce7d176Sdrh 
1273cce7d176Sdrh /*
127466b89c8fSdrh ** Generate code for a boolean expression such that a jump is made
1275cce7d176Sdrh ** to the label "dest" if the expression is false but execution
1276cce7d176Sdrh ** continues straight thru if the expression is true.
1277f5905aa7Sdrh **
1278f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then
1279f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false.
1280cce7d176Sdrh */
1281f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
1282cce7d176Sdrh   Vdbe *v = pParse->pVdbe;
1283cce7d176Sdrh   int op = 0;
1284daffd0e5Sdrh   if( v==0 || pExpr==0 ) return;
1285cce7d176Sdrh   switch( pExpr->op ){
1286cce7d176Sdrh     case TK_LT:       op = OP_Ge;       break;
1287cce7d176Sdrh     case TK_LE:       op = OP_Gt;       break;
1288cce7d176Sdrh     case TK_GT:       op = OP_Le;       break;
1289cce7d176Sdrh     case TK_GE:       op = OP_Lt;       break;
1290cce7d176Sdrh     case TK_NE:       op = OP_Eq;       break;
1291cce7d176Sdrh     case TK_EQ:       op = OP_Ne;       break;
1292cce7d176Sdrh     case TK_ISNULL:   op = OP_NotNull;  break;
1293cce7d176Sdrh     case TK_NOTNULL:  op = OP_IsNull;   break;
1294cce7d176Sdrh     default:  break;
1295cce7d176Sdrh   }
1296cce7d176Sdrh   switch( pExpr->op ){
1297cce7d176Sdrh     case TK_AND: {
1298f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1299f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1300cce7d176Sdrh       break;
1301cce7d176Sdrh     }
1302cce7d176Sdrh     case TK_OR: {
1303cce7d176Sdrh       int d2 = sqliteVdbeMakeLabel(v);
1304f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);
1305f5905aa7Sdrh       sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1306cce7d176Sdrh       sqliteVdbeResolveLabel(v, d2);
1307cce7d176Sdrh       break;
1308cce7d176Sdrh     }
1309cce7d176Sdrh     case TK_NOT: {
1310f5905aa7Sdrh       sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1311cce7d176Sdrh       break;
1312cce7d176Sdrh     }
1313cce7d176Sdrh     case TK_LT:
1314cce7d176Sdrh     case TK_LE:
1315cce7d176Sdrh     case TK_GT:
1316cce7d176Sdrh     case TK_GE:
1317cce7d176Sdrh     case TK_NE:
1318cce7d176Sdrh     case TK_EQ: {
1319c9b84a1fSdrh       if( pParse->db->file_format>=3 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){
1320c9b84a1fSdrh         op += 6;  /* Convert numeric opcodes to text opcodes */
1321c9b84a1fSdrh       }
1322cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1323cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pRight);
1324f5905aa7Sdrh       sqliteVdbeAddOp(v, op, jumpIfNull, dest);
1325cce7d176Sdrh       break;
1326cce7d176Sdrh     }
1327cce7d176Sdrh     case TK_ISNULL:
1328cce7d176Sdrh     case TK_NOTNULL: {
1329cce7d176Sdrh       sqliteExprCode(pParse, pExpr->pLeft);
1330f5905aa7Sdrh       sqliteVdbeAddOp(v, op, 1, dest);
1331cce7d176Sdrh       break;
1332cce7d176Sdrh     }
1333fef5208cSdrh     case TK_IN: {
1334f5905aa7Sdrh       int addr;
1335cfab11bcSdrh       sqliteExprCode(pParse, pExpr->pLeft);
1336f5905aa7Sdrh       addr = sqliteVdbeCurrentAddr(v);
1337f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3);
1338f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
1339f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4);
1340fef5208cSdrh       if( pExpr->pSelect ){
134199fcd718Sdrh         sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
1342fef5208cSdrh       }else{
134399fcd718Sdrh         sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
1344fef5208cSdrh       }
1345fef5208cSdrh       break;
1346fef5208cSdrh     }
1347fef5208cSdrh     case TK_BETWEEN: {
1348fef5208cSdrh       int addr;
1349fef5208cSdrh       sqliteExprCode(pParse, pExpr->pLeft);
135099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Dup, 0, 0);
1351fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
1352fef5208cSdrh       addr = sqliteVdbeCurrentAddr(v);
1353f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3);
135499fcd718Sdrh       sqliteVdbeAddOp(v, OP_Pop, 1, 0);
135599fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, dest);
1356fef5208cSdrh       sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
1357f5905aa7Sdrh       sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest);
1358fef5208cSdrh       break;
1359fef5208cSdrh     }
1360cce7d176Sdrh     default: {
1361cce7d176Sdrh       sqliteExprCode(pParse, pExpr);
1362461c281aSdrh       sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest);
1363cce7d176Sdrh       break;
1364cce7d176Sdrh     }
1365cce7d176Sdrh   }
1366cce7d176Sdrh }
13672282792aSdrh 
13682282792aSdrh /*
13692282792aSdrh ** Do a deep comparison of two expression trees.  Return TRUE (non-zero)
13702282792aSdrh ** if they are identical and return FALSE if they differ in any way.
13712282792aSdrh */
1372d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){
13732282792aSdrh   int i;
13742282792aSdrh   if( pA==0 ){
13752282792aSdrh     return pB==0;
13762282792aSdrh   }else if( pB==0 ){
13772282792aSdrh     return 0;
13782282792aSdrh   }
13792282792aSdrh   if( pA->op!=pB->op ) return 0;
1380d8bc7086Sdrh   if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1381d8bc7086Sdrh   if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
13822282792aSdrh   if( pA->pList ){
13832282792aSdrh     if( pB->pList==0 ) return 0;
13842282792aSdrh     if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
13852282792aSdrh     for(i=0; i<pA->pList->nExpr; i++){
1386d8bc7086Sdrh       if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
13872282792aSdrh         return 0;
13882282792aSdrh       }
13892282792aSdrh     }
13902282792aSdrh   }else if( pB->pList ){
13912282792aSdrh     return 0;
13922282792aSdrh   }
13932282792aSdrh   if( pA->pSelect || pB->pSelect ) return 0;
1394*2f2c01e5Sdrh   if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;
13952282792aSdrh   if( pA->token.z ){
13962282792aSdrh     if( pB->token.z==0 ) return 0;
13972282792aSdrh     if( pB->token.n!=pA->token.n ) return 0;
13982282792aSdrh     if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
13992282792aSdrh   }
14002282792aSdrh   return 1;
14012282792aSdrh }
14022282792aSdrh 
14032282792aSdrh /*
14042282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index.
14052282792aSdrh */
14062282792aSdrh static int appendAggInfo(Parse *pParse){
14072282792aSdrh   if( (pParse->nAgg & 0x7)==0 ){
14082282792aSdrh     int amt = pParse->nAgg + 8;
14096d4abfbeSdrh     AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
14106d4abfbeSdrh     if( aAgg==0 ){
14112282792aSdrh       return -1;
14122282792aSdrh     }
14136d4abfbeSdrh     pParse->aAgg = aAgg;
14142282792aSdrh   }
14152282792aSdrh   memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
14162282792aSdrh   return pParse->nAgg++;
14172282792aSdrh }
14182282792aSdrh 
14192282792aSdrh /*
14202282792aSdrh ** Analyze the given expression looking for aggregate functions and
14212282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array.
14222282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary.
14232282792aSdrh **
14242282792aSdrh ** This routine should only be called after the expression has been
14252282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
14262282792aSdrh **
14272282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return
14282282792aSdrh ** the number of errors.
14292282792aSdrh */
14302282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
14312282792aSdrh   int i;
14322282792aSdrh   AggExpr *aAgg;
14332282792aSdrh   int nErr = 0;
14342282792aSdrh 
14352282792aSdrh   if( pExpr==0 ) return 0;
14362282792aSdrh   switch( pExpr->op ){
1437967e8b73Sdrh     case TK_COLUMN: {
14382282792aSdrh       aAgg = pParse->aAgg;
14392282792aSdrh       for(i=0; i<pParse->nAgg; i++){
14402282792aSdrh         if( aAgg[i].isAgg ) continue;
14412282792aSdrh         if( aAgg[i].pExpr->iTable==pExpr->iTable
1442967e8b73Sdrh          && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
14432282792aSdrh           break;
14442282792aSdrh         }
14452282792aSdrh       }
14462282792aSdrh       if( i>=pParse->nAgg ){
14472282792aSdrh         i = appendAggInfo(pParse);
14482282792aSdrh         if( i<0 ) return 1;
14492282792aSdrh         pParse->aAgg[i].isAgg = 0;
14502282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
14512282792aSdrh       }
1452aaf88729Sdrh       pExpr->iAgg = i;
14532282792aSdrh       break;
14542282792aSdrh     }
14552282792aSdrh     case TK_AGG_FUNCTION: {
14562282792aSdrh       aAgg = pParse->aAgg;
14572282792aSdrh       for(i=0; i<pParse->nAgg; i++){
14582282792aSdrh         if( !aAgg[i].isAgg ) continue;
1459d8bc7086Sdrh         if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
14602282792aSdrh           break;
14612282792aSdrh         }
14622282792aSdrh       }
14632282792aSdrh       if( i>=pParse->nAgg ){
14642282792aSdrh         i = appendAggInfo(pParse);
14652282792aSdrh         if( i<0 ) return 1;
14662282792aSdrh         pParse->aAgg[i].isAgg = 1;
14672282792aSdrh         pParse->aAgg[i].pExpr = pExpr;
14680bce8354Sdrh         pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db,
1469f55f25f0Sdrh              pExpr->token.z, pExpr->token.n,
1470f55f25f0Sdrh              pExpr->pList ? pExpr->pList->nExpr : 0, 0);
14712282792aSdrh       }
14722282792aSdrh       pExpr->iAgg = i;
14732282792aSdrh       break;
14742282792aSdrh     }
14752282792aSdrh     default: {
14762282792aSdrh       if( pExpr->pLeft ){
14772282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
14782282792aSdrh       }
14792282792aSdrh       if( nErr==0 && pExpr->pRight ){
14802282792aSdrh         nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
14812282792aSdrh       }
14822282792aSdrh       if( nErr==0 && pExpr->pList ){
14832282792aSdrh         int n = pExpr->pList->nExpr;
14842282792aSdrh         int i;
14852282792aSdrh         for(i=0; nErr==0 && i<n; i++){
14862282792aSdrh           nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
14872282792aSdrh         }
14882282792aSdrh       }
14892282792aSdrh       break;
14902282792aSdrh     }
14912282792aSdrh   }
14922282792aSdrh   return nErr;
14932282792aSdrh }
14948e0a2f90Sdrh 
14958e0a2f90Sdrh /*
14968e0a2f90Sdrh ** Locate a user function given a name and a number of arguments.
14970bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that
14988e0a2f90Sdrh ** function, or return NULL if the function does not exist.
14998e0a2f90Sdrh **
15000bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef
15018e0a2f90Sdrh ** structure is created and liked into the "db" structure if a
15028e0a2f90Sdrh ** no matching function previously existed.  When createFlag is true
15038e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts
15048e0a2f90Sdrh ** any number of arguments will be returned.
15058e0a2f90Sdrh **
15068e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid
15078e0a2f90Sdrh ** function found is returned.  A function is valid if either xFunc
15088e0a2f90Sdrh ** or xStep is non-zero.
15098e0a2f90Sdrh */
15100bce8354Sdrh FuncDef *sqliteFindFunction(
15118e0a2f90Sdrh   sqlite *db,        /* An open database */
15128e0a2f90Sdrh   const char *zName, /* Name of the function.  Not null-terminated */
15138e0a2f90Sdrh   int nName,         /* Number of characters in the name */
15148e0a2f90Sdrh   int nArg,          /* Number of arguments.  -1 means any number */
15158e0a2f90Sdrh   int createFlag     /* Create new entry if true and does not otherwise exist */
15168e0a2f90Sdrh ){
15170bce8354Sdrh   FuncDef *pFirst, *p, *pMaybe;
15180bce8354Sdrh   pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName);
15191350b030Sdrh   if( p && !createFlag && nArg<0 ){
15208e0a2f90Sdrh     while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; }
15218e0a2f90Sdrh     return p;
15228e0a2f90Sdrh   }
15238e0a2f90Sdrh   pMaybe = 0;
15248e0a2f90Sdrh   while( p && p->nArg!=nArg ){
15258e0a2f90Sdrh     if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p;
15268e0a2f90Sdrh     p = p->pNext;
15278e0a2f90Sdrh   }
15288e0a2f90Sdrh   if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){
15298e0a2f90Sdrh     return 0;
15308e0a2f90Sdrh   }
15318e0a2f90Sdrh   if( p==0 && pMaybe ){
15328e0a2f90Sdrh     assert( createFlag==0 );
15338e0a2f90Sdrh     return pMaybe;
15348e0a2f90Sdrh   }
153589425d5eSdrh   if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){
15368e0a2f90Sdrh     p->nArg = nArg;
15378e0a2f90Sdrh     p->pNext = pFirst;
1538c9b84a1fSdrh     p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC;
15390bce8354Sdrh     sqliteHashInsert(&db->aFunc, zName, nName, (void*)p);
15408e0a2f90Sdrh   }
15418e0a2f90Sdrh   return p;
15428e0a2f90Sdrh }
1543