blob: b341f83a63983fb47acc754a7fd697be4d780581 [file] [log] [blame]
drhcce7d172000-05-31 15:34:51 +00001/*
drhb19a2bc2001-09-16 00:13:26 +00002** 2001 September 15
drhcce7d172000-05-31 15:34:51 +00003**
drhb19a2bc2001-09-16 00:13:26 +00004** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
drhcce7d172000-05-31 15:34:51 +00006**
drhb19a2bc2001-09-16 00:13:26 +00007** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
drhcce7d172000-05-31 15:34:51 +000010**
11*************************************************************************
drh1ccde152000-06-17 13:12:39 +000012** This file contains routines used for analyzing expressions and
drhb19a2bc2001-09-16 00:13:26 +000013** for generating VDBE code that evaluates expressions in SQLite.
drhcce7d172000-05-31 15:34:51 +000014**
danielk19770202b292004-06-09 09:55:16 +000015** $Id: expr.c,v 1.137 2004/06/09 09:55:18 danielk1977 Exp $
drhcce7d172000-05-31 15:34:51 +000016*/
17#include "sqliteInt.h"
drh04738cb2002-06-02 18:19:00 +000018#include <ctype.h>
drha2e00042002-01-22 03:13:42 +000019
danielk1977e014a832004-05-17 10:48:57 +000020char const *sqlite3AffinityString(char affinity){
21 switch( affinity ){
22 case SQLITE_AFF_INTEGER: return "i";
23 case SQLITE_AFF_NUMERIC: return "n";
24 case SQLITE_AFF_TEXT: return "t";
25 case SQLITE_AFF_NONE: return "o";
26 default:
27 assert(0);
28 }
29}
30
31
32/*
33** Return the 'affinity' of the expression pExpr if any.
34**
35** If pExpr is a column, a reference to a column via an 'AS' alias,
36** or a sub-select with a column as the return value, then the
37** affinity of that column is returned. Otherwise, 0x00 is returned,
38** indicating no affinity for the expression.
39**
40** i.e. the WHERE clause expresssions in the following statements all
41** have an affinity:
42**
43** CREATE TABLE t1(a);
44** SELECT * FROM t1 WHERE a;
45** SELECT a AS b FROM t1 WHERE b;
46** SELECT * FROM t1 WHERE (select a from t1);
47*/
danielk1977bf3b7212004-05-18 10:06:24 +000048char sqlite3ExprAffinity(Expr *pExpr){
danielk1977a37cdde2004-05-16 11:15:36 +000049 if( pExpr->op==TK_AS ){
danielk1977bf3b7212004-05-18 10:06:24 +000050 return sqlite3ExprAffinity(pExpr->pLeft);
danielk1977a37cdde2004-05-16 11:15:36 +000051 }
52 if( pExpr->op==TK_SELECT ){
danielk1977bf3b7212004-05-18 10:06:24 +000053 return sqlite3ExprAffinity(pExpr->pSelect->pEList->a[0].pExpr);
danielk1977a37cdde2004-05-16 11:15:36 +000054 }
55 return pExpr->affinity;
56}
57
drh53db1452004-05-20 13:54:53 +000058/*
danielk19770202b292004-06-09 09:55:16 +000059** Return the default collation sequence for the expression pExpr. If
60** there is no default collation type, return 0.
61*/
62CollSeq *sqlite3ExprCollSeq(Expr *pExpr){
63 if( pExpr ){
64 if( pExpr->pColl ) return pExpr->pColl;
65 if( pExpr->op==TK_AS ){
66 return sqlite3ExprCollSeq(pExpr->pLeft);
67 }
68 }
69 return 0;
70}
71
72/*
drh53db1452004-05-20 13:54:53 +000073** pExpr is the left operand of a comparison operator. aff2 is the
74** type affinity of the right operand. This routine returns the
75** type affinity that should be used for the comparison operator.
76*/
danielk1977e014a832004-05-17 10:48:57 +000077char sqlite3CompareAffinity(Expr *pExpr, char aff2){
danielk1977bf3b7212004-05-18 10:06:24 +000078 char aff1 = sqlite3ExprAffinity(pExpr);
danielk1977e014a832004-05-17 10:48:57 +000079 if( aff1 && aff2 ){
80 /* Both sides of the comparison are columns. If one has numeric or
81 ** integer affinity, use that. Otherwise use no affinity.
82 */
83 if( aff1==SQLITE_AFF_INTEGER || aff2==SQLITE_AFF_INTEGER ){
84 return SQLITE_AFF_INTEGER;
85 }else if( aff1==SQLITE_AFF_NUMERIC || aff2==SQLITE_AFF_NUMERIC ){
86 return SQLITE_AFF_NUMERIC;
87 }else{
88 return SQLITE_AFF_NONE;
89 }
90 }else if( !aff1 && !aff2 ){
91 /* Neither side of the comparison is a column. Use numeric affinity
92 ** for the comparison.
93 */
94 return SQLITE_AFF_NUMERIC;
95 }else{
96 /* One side is a column, the other is not. Use the columns affinity. */
97 return (aff1 + aff2);
98 }
99}
100
drh53db1452004-05-20 13:54:53 +0000101/*
102** pExpr is a comparison operator. Return the type affinity that should
103** be applied to both operands prior to doing the comparison.
104*/
danielk1977e014a832004-05-17 10:48:57 +0000105static char comparisonAffinity(Expr *pExpr){
106 char aff;
107 assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT ||
108 pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE ||
109 pExpr->op==TK_NE );
110 assert( pExpr->pLeft );
danielk1977bf3b7212004-05-18 10:06:24 +0000111 aff = sqlite3ExprAffinity(pExpr->pLeft);
danielk1977e014a832004-05-17 10:48:57 +0000112 if( pExpr->pRight ){
113 aff = sqlite3CompareAffinity(pExpr->pRight, aff);
114 }
115 else if( pExpr->pSelect ){
116 aff = sqlite3CompareAffinity(pExpr->pSelect->pEList->a[0].pExpr, aff);
117 }
118 else if( !aff ){
119 aff = SQLITE_AFF_NUMERIC;
120 }
121 return aff;
122}
123
124/*
125** pExpr is a comparison expression, eg. '=', '<', IN(...) etc.
126** idx_affinity is the affinity of an indexed column. Return true
127** if the index with affinity idx_affinity may be used to implement
128** the comparison in pExpr.
129*/
130int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){
131 char aff = comparisonAffinity(pExpr);
132 return
133 (aff==SQLITE_AFF_NONE) ||
134 (aff==SQLITE_AFF_NUMERIC && idx_affinity==SQLITE_AFF_INTEGER) ||
135 (aff==SQLITE_AFF_INTEGER && idx_affinity==SQLITE_AFF_NUMERIC) ||
136 (aff==idx_affinity);
137}
138
danielk1977a37cdde2004-05-16 11:15:36 +0000139/*
140** Return the P1 value that should be used for a binary comparison
141** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2.
142** If jumpIfNull is true, then set the low byte of the returned
143** P1 value to tell the opcode to jump if either expression
144** evaluates to NULL.
145*/
danielk1977e014a832004-05-17 10:48:57 +0000146static int binaryCompareP1(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){
danielk1977bf3b7212004-05-18 10:06:24 +0000147 char aff = sqlite3ExprAffinity(pExpr2);
danielk1977e014a832004-05-17 10:48:57 +0000148 return (((int)sqlite3CompareAffinity(pExpr1, aff))<<8)+(jumpIfNull?1:0);
danielk1977a37cdde2004-05-16 11:15:36 +0000149}
150
drha2e00042002-01-22 03:13:42 +0000151/*
danielk19770202b292004-06-09 09:55:16 +0000152** Return a pointer to the collation sequence that should be used by
153** a binary comparison operator comparing pLeft and pRight.
154**
155** If the left hand expression has a collating sequence type, then it is
156** used. Otherwise the collation sequence for the right hand expression
157** is used, or the default (BINARY) if neither expression has a collating
158** type.
159*/
160static CollSeq* binaryCompareCollSeq(Expr *pLeft, Expr *pRight){
161 CollSeq *pColl = sqlite3ExprCollSeq(pLeft);
162 if( !pColl ){
163 pColl = sqlite3ExprCollSeq(pRight);
164 }
165 return pColl;
166}
167
168/*
drha76b5df2002-02-23 02:32:10 +0000169** Construct a new expression node and return a pointer to it. Memory
170** for this node is obtained from sqliteMalloc(). The calling function
171** is responsible for making sure the node eventually gets freed.
172*/
danielk19774adee202004-05-08 08:23:19 +0000173Expr *sqlite3Expr(int op, Expr *pLeft, Expr *pRight, Token *pToken){
drha76b5df2002-02-23 02:32:10 +0000174 Expr *pNew;
175 pNew = sqliteMalloc( sizeof(Expr) );
176 if( pNew==0 ){
drh4efc4752004-01-16 15:55:37 +0000177 /* When malloc fails, we leak memory from pLeft and pRight */
drha76b5df2002-02-23 02:32:10 +0000178 return 0;
179 }
180 pNew->op = op;
181 pNew->pLeft = pLeft;
182 pNew->pRight = pRight;
183 if( pToken ){
drh4b59ab52002-08-24 18:24:51 +0000184 assert( pToken->dyn==0 );
drha76b5df2002-02-23 02:32:10 +0000185 pNew->token = *pToken;
drh6977fea2002-10-22 23:38:04 +0000186 pNew->span = *pToken;
drha76b5df2002-02-23 02:32:10 +0000187 }else{
drh4efc4752004-01-16 15:55:37 +0000188 assert( pNew->token.dyn==0 );
189 assert( pNew->token.z==0 );
190 assert( pNew->token.n==0 );
drh6977fea2002-10-22 23:38:04 +0000191 if( pLeft && pRight ){
danielk19774adee202004-05-08 08:23:19 +0000192 sqlite3ExprSpan(pNew, &pLeft->span, &pRight->span);
drh6977fea2002-10-22 23:38:04 +0000193 }else{
194 pNew->span = pNew->token;
195 }
drha76b5df2002-02-23 02:32:10 +0000196 }
drha76b5df2002-02-23 02:32:10 +0000197 return pNew;
198}
199
200/*
drh6977fea2002-10-22 23:38:04 +0000201** Set the Expr.span field of the given expression to span all
drha76b5df2002-02-23 02:32:10 +0000202** text between the two given tokens.
203*/
danielk19774adee202004-05-08 08:23:19 +0000204void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){
drh4efc4752004-01-16 15:55:37 +0000205 assert( pRight!=0 );
206 assert( pLeft!=0 );
207 /* Note: pExpr might be NULL due to a prior malloc failure */
208 if( pExpr && pRight->z && pLeft->z ){
drh4b59ab52002-08-24 18:24:51 +0000209 if( pLeft->dyn==0 && pRight->dyn==0 ){
drh6977fea2002-10-22 23:38:04 +0000210 pExpr->span.z = pLeft->z;
211 pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z);
drh4b59ab52002-08-24 18:24:51 +0000212 }else{
drh6977fea2002-10-22 23:38:04 +0000213 pExpr->span.z = 0;
drh4b59ab52002-08-24 18:24:51 +0000214 }
drha76b5df2002-02-23 02:32:10 +0000215 }
216}
217
218/*
219** Construct a new expression node for a function with multiple
220** arguments.
221*/
danielk19774adee202004-05-08 08:23:19 +0000222Expr *sqlite3ExprFunction(ExprList *pList, Token *pToken){
drha76b5df2002-02-23 02:32:10 +0000223 Expr *pNew;
224 pNew = sqliteMalloc( sizeof(Expr) );
225 if( pNew==0 ){
danielk19774adee202004-05-08 08:23:19 +0000226 /* sqlite3ExprListDelete(pList); // Leak pList when malloc fails */
drha76b5df2002-02-23 02:32:10 +0000227 return 0;
228 }
229 pNew->op = TK_FUNCTION;
230 pNew->pList = pList;
231 if( pToken ){
drh4b59ab52002-08-24 18:24:51 +0000232 assert( pToken->dyn==0 );
drha76b5df2002-02-23 02:32:10 +0000233 pNew->token = *pToken;
234 }else{
235 pNew->token.z = 0;
drha76b5df2002-02-23 02:32:10 +0000236 }
drh6977fea2002-10-22 23:38:04 +0000237 pNew->span = pNew->token;
drha76b5df2002-02-23 02:32:10 +0000238 return pNew;
239}
240
241/*
drha2e00042002-01-22 03:13:42 +0000242** Recursively delete an expression tree.
243*/
danielk19774adee202004-05-08 08:23:19 +0000244void sqlite3ExprDelete(Expr *p){
drha2e00042002-01-22 03:13:42 +0000245 if( p==0 ) return;
drh4efc4752004-01-16 15:55:37 +0000246 if( p->span.dyn ) sqliteFree((char*)p->span.z);
247 if( p->token.dyn ) sqliteFree((char*)p->token.z);
danielk19774adee202004-05-08 08:23:19 +0000248 sqlite3ExprDelete(p->pLeft);
249 sqlite3ExprDelete(p->pRight);
250 sqlite3ExprListDelete(p->pList);
251 sqlite3SelectDelete(p->pSelect);
drha2e00042002-01-22 03:13:42 +0000252 sqliteFree(p);
253}
254
drha76b5df2002-02-23 02:32:10 +0000255
256/*
drhff78bd22002-02-27 01:47:11 +0000257** The following group of routines make deep copies of expressions,
258** expression lists, ID lists, and select statements. The copies can
259** be deleted (by being passed to their respective ...Delete() routines)
260** without effecting the originals.
261**
danielk19774adee202004-05-08 08:23:19 +0000262** The expression list, ID, and source lists return by sqlite3ExprListDup(),
263** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded
drhad3cab52002-05-24 02:04:32 +0000264** by subsequent calls to sqlite*ListAppend() routines.
drhff78bd22002-02-27 01:47:11 +0000265**
drhad3cab52002-05-24 02:04:32 +0000266** Any tables that the SrcList might point to are not duplicated.
drhff78bd22002-02-27 01:47:11 +0000267*/
danielk19774adee202004-05-08 08:23:19 +0000268Expr *sqlite3ExprDup(Expr *p){
drhff78bd22002-02-27 01:47:11 +0000269 Expr *pNew;
270 if( p==0 ) return 0;
drhfcb78a42003-01-18 20:11:05 +0000271 pNew = sqliteMallocRaw( sizeof(*p) );
drhff78bd22002-02-27 01:47:11 +0000272 if( pNew==0 ) return 0;
drh3b167c72002-06-28 12:18:47 +0000273 memcpy(pNew, p, sizeof(*pNew));
drh6977fea2002-10-22 23:38:04 +0000274 if( p->token.z!=0 ){
drh4b59ab52002-08-24 18:24:51 +0000275 pNew->token.z = sqliteStrDup(p->token.z);
276 pNew->token.dyn = 1;
277 }else{
drh4efc4752004-01-16 15:55:37 +0000278 assert( pNew->token.z==0 );
drh4b59ab52002-08-24 18:24:51 +0000279 }
drh6977fea2002-10-22 23:38:04 +0000280 pNew->span.z = 0;
danielk19774adee202004-05-08 08:23:19 +0000281 pNew->pLeft = sqlite3ExprDup(p->pLeft);
282 pNew->pRight = sqlite3ExprDup(p->pRight);
283 pNew->pList = sqlite3ExprListDup(p->pList);
284 pNew->pSelect = sqlite3SelectDup(p->pSelect);
drhff78bd22002-02-27 01:47:11 +0000285 return pNew;
286}
danielk19774adee202004-05-08 08:23:19 +0000287void sqlite3TokenCopy(Token *pTo, Token *pFrom){
drh4b59ab52002-08-24 18:24:51 +0000288 if( pTo->dyn ) sqliteFree((char*)pTo->z);
drh4b59ab52002-08-24 18:24:51 +0000289 if( pFrom->z ){
290 pTo->n = pFrom->n;
291 pTo->z = sqliteStrNDup(pFrom->z, pFrom->n);
292 pTo->dyn = 1;
293 }else{
drh4b59ab52002-08-24 18:24:51 +0000294 pTo->z = 0;
drh4b59ab52002-08-24 18:24:51 +0000295 }
296}
danielk19774adee202004-05-08 08:23:19 +0000297ExprList *sqlite3ExprListDup(ExprList *p){
drhff78bd22002-02-27 01:47:11 +0000298 ExprList *pNew;
drh3e7bc9c2004-02-21 19:17:17 +0000299 struct ExprList_item *pItem;
drhff78bd22002-02-27 01:47:11 +0000300 int i;
301 if( p==0 ) return 0;
302 pNew = sqliteMalloc( sizeof(*pNew) );
303 if( pNew==0 ) return 0;
drh4305d102003-07-30 12:34:12 +0000304 pNew->nExpr = pNew->nAlloc = p->nExpr;
drh3e7bc9c2004-02-21 19:17:17 +0000305 pNew->a = pItem = sqliteMalloc( p->nExpr*sizeof(p->a[0]) );
drh1bdd9b52004-04-23 17:04:44 +0000306 if( pItem==0 ) return 0; /* Leaks memory after a malloc failure */
307 for(i=0; i<p->nExpr; i++, pItem++){
drh4b59ab52002-08-24 18:24:51 +0000308 Expr *pNewExpr, *pOldExpr;
danielk19774adee202004-05-08 08:23:19 +0000309 pItem->pExpr = pNewExpr = sqlite3ExprDup(pOldExpr = p->a[i].pExpr);
drh6977fea2002-10-22 23:38:04 +0000310 if( pOldExpr->span.z!=0 && pNewExpr ){
311 /* Always make a copy of the span for top-level expressions in the
drh4b59ab52002-08-24 18:24:51 +0000312 ** expression list. The logic in SELECT processing that determines
313 ** the names of columns in the result set needs this information */
danielk19774adee202004-05-08 08:23:19 +0000314 sqlite3TokenCopy(&pNewExpr->span, &pOldExpr->span);
drh4b59ab52002-08-24 18:24:51 +0000315 }
drh1f3e9052002-10-31 00:09:39 +0000316 assert( pNewExpr==0 || pNewExpr->span.z!=0
danielk197724b03fd2004-05-10 10:34:34 +0000317 || pOldExpr->span.z==0 || sqlite3_malloc_failed );
drh3e7bc9c2004-02-21 19:17:17 +0000318 pItem->zName = sqliteStrDup(p->a[i].zName);
319 pItem->sortOrder = p->a[i].sortOrder;
320 pItem->isAgg = p->a[i].isAgg;
321 pItem->done = 0;
drhff78bd22002-02-27 01:47:11 +0000322 }
323 return pNew;
324}
danielk19774adee202004-05-08 08:23:19 +0000325SrcList *sqlite3SrcListDup(SrcList *p){
drhad3cab52002-05-24 02:04:32 +0000326 SrcList *pNew;
327 int i;
drh113088e2003-03-20 01:16:58 +0000328 int nByte;
drhad3cab52002-05-24 02:04:32 +0000329 if( p==0 ) return 0;
drh113088e2003-03-20 01:16:58 +0000330 nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0);
drh4efc4752004-01-16 15:55:37 +0000331 pNew = sqliteMallocRaw( nByte );
drhad3cab52002-05-24 02:04:32 +0000332 if( pNew==0 ) return 0;
drh4305d102003-07-30 12:34:12 +0000333 pNew->nSrc = pNew->nAlloc = p->nSrc;
drhad3cab52002-05-24 02:04:32 +0000334 for(i=0; i<p->nSrc; i++){
drh4efc4752004-01-16 15:55:37 +0000335 struct SrcList_item *pNewItem = &pNew->a[i];
336 struct SrcList_item *pOldItem = &p->a[i];
337 pNewItem->zDatabase = sqliteStrDup(pOldItem->zDatabase);
338 pNewItem->zName = sqliteStrDup(pOldItem->zName);
339 pNewItem->zAlias = sqliteStrDup(pOldItem->zAlias);
340 pNewItem->jointype = pOldItem->jointype;
341 pNewItem->iCursor = pOldItem->iCursor;
342 pNewItem->pTab = 0;
danielk19774adee202004-05-08 08:23:19 +0000343 pNewItem->pSelect = sqlite3SelectDup(pOldItem->pSelect);
344 pNewItem->pOn = sqlite3ExprDup(pOldItem->pOn);
345 pNewItem->pUsing = sqlite3IdListDup(pOldItem->pUsing);
drhad3cab52002-05-24 02:04:32 +0000346 }
347 return pNew;
348}
danielk19774adee202004-05-08 08:23:19 +0000349IdList *sqlite3IdListDup(IdList *p){
drhff78bd22002-02-27 01:47:11 +0000350 IdList *pNew;
351 int i;
352 if( p==0 ) return 0;
drh4efc4752004-01-16 15:55:37 +0000353 pNew = sqliteMallocRaw( sizeof(*pNew) );
drhff78bd22002-02-27 01:47:11 +0000354 if( pNew==0 ) return 0;
drh4305d102003-07-30 12:34:12 +0000355 pNew->nId = pNew->nAlloc = p->nId;
drh4efc4752004-01-16 15:55:37 +0000356 pNew->a = sqliteMallocRaw( p->nId*sizeof(p->a[0]) );
drhe4697f52002-05-23 02:09:03 +0000357 if( pNew->a==0 ) return 0;
drhff78bd22002-02-27 01:47:11 +0000358 for(i=0; i<p->nId; i++){
drh4efc4752004-01-16 15:55:37 +0000359 struct IdList_item *pNewItem = &pNew->a[i];
360 struct IdList_item *pOldItem = &p->a[i];
361 pNewItem->zName = sqliteStrDup(pOldItem->zName);
362 pNewItem->idx = pOldItem->idx;
drhff78bd22002-02-27 01:47:11 +0000363 }
364 return pNew;
365}
danielk19774adee202004-05-08 08:23:19 +0000366Select *sqlite3SelectDup(Select *p){
drhff78bd22002-02-27 01:47:11 +0000367 Select *pNew;
368 if( p==0 ) return 0;
drh4efc4752004-01-16 15:55:37 +0000369 pNew = sqliteMallocRaw( sizeof(*p) );
drhff78bd22002-02-27 01:47:11 +0000370 if( pNew==0 ) return 0;
371 pNew->isDistinct = p->isDistinct;
danielk19774adee202004-05-08 08:23:19 +0000372 pNew->pEList = sqlite3ExprListDup(p->pEList);
373 pNew->pSrc = sqlite3SrcListDup(p->pSrc);
374 pNew->pWhere = sqlite3ExprDup(p->pWhere);
375 pNew->pGroupBy = sqlite3ExprListDup(p->pGroupBy);
376 pNew->pHaving = sqlite3ExprDup(p->pHaving);
377 pNew->pOrderBy = sqlite3ExprListDup(p->pOrderBy);
drhff78bd22002-02-27 01:47:11 +0000378 pNew->op = p->op;
danielk19774adee202004-05-08 08:23:19 +0000379 pNew->pPrior = sqlite3SelectDup(p->pPrior);
drhff78bd22002-02-27 01:47:11 +0000380 pNew->nLimit = p->nLimit;
381 pNew->nOffset = p->nOffset;
382 pNew->zSelect = 0;
drh7b58dae2003-07-20 01:16:46 +0000383 pNew->iLimit = -1;
384 pNew->iOffset = -1;
drhff78bd22002-02-27 01:47:11 +0000385 return pNew;
386}
387
388
389/*
drha76b5df2002-02-23 02:32:10 +0000390** Add a new element to the end of an expression list. If pList is
391** initially NULL, then create a new expression list.
392*/
danielk19774adee202004-05-08 08:23:19 +0000393ExprList *sqlite3ExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){
drha76b5df2002-02-23 02:32:10 +0000394 if( pList==0 ){
395 pList = sqliteMalloc( sizeof(ExprList) );
396 if( pList==0 ){
danielk19774adee202004-05-08 08:23:19 +0000397 /* sqlite3ExprDelete(pExpr); // Leak memory if malloc fails */
drha76b5df2002-02-23 02:32:10 +0000398 return 0;
399 }
drh4efc4752004-01-16 15:55:37 +0000400 assert( pList->nAlloc==0 );
drha76b5df2002-02-23 02:32:10 +0000401 }
drh4305d102003-07-30 12:34:12 +0000402 if( pList->nAlloc<=pList->nExpr ){
drh4305d102003-07-30 12:34:12 +0000403 pList->nAlloc = pList->nAlloc*2 + 4;
drh4efc4752004-01-16 15:55:37 +0000404 pList->a = sqliteRealloc(pList->a, pList->nAlloc*sizeof(pList->a[0]));
405 if( pList->a==0 ){
danielk19774adee202004-05-08 08:23:19 +0000406 /* sqlite3ExprDelete(pExpr); // Leak memory if malloc fails */
drh4efc4752004-01-16 15:55:37 +0000407 pList->nExpr = pList->nAlloc = 0;
drha76b5df2002-02-23 02:32:10 +0000408 return pList;
409 }
drha76b5df2002-02-23 02:32:10 +0000410 }
drh4efc4752004-01-16 15:55:37 +0000411 assert( pList->a!=0 );
412 if( pExpr || pName ){
413 struct ExprList_item *pItem = &pList->a[pList->nExpr++];
414 memset(pItem, 0, sizeof(*pItem));
415 pItem->pExpr = pExpr;
drha76b5df2002-02-23 02:32:10 +0000416 if( pName ){
danielk19774adee202004-05-08 08:23:19 +0000417 sqlite3SetNString(&pItem->zName, pName->z, pName->n, 0);
418 sqlite3Dequote(pItem->zName);
drha76b5df2002-02-23 02:32:10 +0000419 }
420 }
421 return pList;
422}
423
424/*
425** Delete an entire expression list.
426*/
danielk19774adee202004-05-08 08:23:19 +0000427void sqlite3ExprListDelete(ExprList *pList){
drha76b5df2002-02-23 02:32:10 +0000428 int i;
429 if( pList==0 ) return;
drh1bdd9b52004-04-23 17:04:44 +0000430 assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) );
431 assert( pList->nExpr<=pList->nAlloc );
drha76b5df2002-02-23 02:32:10 +0000432 for(i=0; i<pList->nExpr; i++){
danielk19774adee202004-05-08 08:23:19 +0000433 sqlite3ExprDelete(pList->a[i].pExpr);
drha76b5df2002-02-23 02:32:10 +0000434 sqliteFree(pList->a[i].zName);
435 }
436 sqliteFree(pList->a);
437 sqliteFree(pList);
438}
439
440/*
drhfef52082000-06-06 01:50:43 +0000441** Walk an expression tree. Return 1 if the expression is constant
442** and 0 if it involves variables.
drh23989372002-05-21 13:43:04 +0000443**
444** For the purposes of this function, a double-quoted string (ex: "abc")
445** is considered a variable but a single-quoted string (ex: 'abc') is
446** a constant.
drhfef52082000-06-06 01:50:43 +0000447*/
danielk19774adee202004-05-08 08:23:19 +0000448int sqlite3ExprIsConstant(Expr *p){
drhfef52082000-06-06 01:50:43 +0000449 switch( p->op ){
450 case TK_ID:
drh967e8b72000-06-21 13:59:10 +0000451 case TK_COLUMN:
drhfef52082000-06-06 01:50:43 +0000452 case TK_DOT:
drh7bdc0c12003-04-19 17:27:24 +0000453 case TK_FUNCTION:
drhfef52082000-06-06 01:50:43 +0000454 return 0;
drh7bdc0c12003-04-19 17:27:24 +0000455 case TK_NULL:
drh23989372002-05-21 13:43:04 +0000456 case TK_STRING:
danielk1977c572ef72004-05-27 09:28:41 +0000457 case TK_BLOB:
drh92086432002-01-22 14:11:29 +0000458 case TK_INTEGER:
459 case TK_FLOAT:
drh50457892003-09-06 01:10:47 +0000460 case TK_VARIABLE:
drh92086432002-01-22 14:11:29 +0000461 return 1;
drhfef52082000-06-06 01:50:43 +0000462 default: {
danielk19774adee202004-05-08 08:23:19 +0000463 if( p->pLeft && !sqlite3ExprIsConstant(p->pLeft) ) return 0;
464 if( p->pRight && !sqlite3ExprIsConstant(p->pRight) ) return 0;
drhfef52082000-06-06 01:50:43 +0000465 if( p->pList ){
466 int i;
467 for(i=0; i<p->pList->nExpr; i++){
danielk19774adee202004-05-08 08:23:19 +0000468 if( !sqlite3ExprIsConstant(p->pList->a[i].pExpr) ) return 0;
drhfef52082000-06-06 01:50:43 +0000469 }
470 }
drh92086432002-01-22 14:11:29 +0000471 return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
drhfef52082000-06-06 01:50:43 +0000472 }
473 }
drh92086432002-01-22 14:11:29 +0000474 return 0;
drhfef52082000-06-06 01:50:43 +0000475}
476
477/*
drh202b2df2004-01-06 01:13:46 +0000478** If the given expression codes a constant integer that is small enough
479** to fit in a 32-bit integer, return 1 and put the value of the integer
480** in *pValue. If the expression is not an integer or if it is too big
481** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged.
drhe4de1fe2002-06-02 16:09:01 +0000482*/
danielk19774adee202004-05-08 08:23:19 +0000483int sqlite3ExprIsInteger(Expr *p, int *pValue){
drhe4de1fe2002-06-02 16:09:01 +0000484 switch( p->op ){
485 case TK_INTEGER: {
drhfec19aa2004-05-19 20:41:03 +0000486 if( sqlite3GetInt32(p->token.z, pValue) ){
drh202b2df2004-01-06 01:13:46 +0000487 return 1;
488 }
489 break;
drhe4de1fe2002-06-02 16:09:01 +0000490 }
491 case TK_STRING: {
drhbd790ee2002-06-02 18:22:06 +0000492 const char *z = p->token.z;
drhe4de1fe2002-06-02 16:09:01 +0000493 int n = p->token.n;
drhbd790ee2002-06-02 18:22:06 +0000494 if( n>0 && z[0]=='-' ){ z++; n--; }
drhe4de1fe2002-06-02 16:09:01 +0000495 while( n>0 && *z && isdigit(*z) ){ z++; n--; }
drhfec19aa2004-05-19 20:41:03 +0000496 if( n==0 && sqlite3GetInt32(p->token.z, pValue) ){
drhe4de1fe2002-06-02 16:09:01 +0000497 return 1;
498 }
499 break;
500 }
drh4b59ab52002-08-24 18:24:51 +0000501 case TK_UPLUS: {
danielk19774adee202004-05-08 08:23:19 +0000502 return sqlite3ExprIsInteger(p->pLeft, pValue);
drh4b59ab52002-08-24 18:24:51 +0000503 }
drhe4de1fe2002-06-02 16:09:01 +0000504 case TK_UMINUS: {
505 int v;
danielk19774adee202004-05-08 08:23:19 +0000506 if( sqlite3ExprIsInteger(p->pLeft, &v) ){
drhe4de1fe2002-06-02 16:09:01 +0000507 *pValue = -v;
508 return 1;
509 }
510 break;
511 }
512 default: break;
513 }
514 return 0;
515}
516
517/*
drhc4a3c772001-04-04 11:48:57 +0000518** Return TRUE if the given string is a row-id column name.
519*/
danielk19774adee202004-05-08 08:23:19 +0000520int sqlite3IsRowid(const char *z){
521 if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1;
522 if( sqlite3StrICmp(z, "ROWID")==0 ) return 1;
523 if( sqlite3StrICmp(z, "OID")==0 ) return 1;
drhc4a3c772001-04-04 11:48:57 +0000524 return 0;
525}
526
527/*
drh8141f612004-01-25 22:44:58 +0000528** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up
529** that name in the set of source tables in pSrcList and make the pExpr
530** expression node refer back to that source column. The following changes
531** are made to pExpr:
532**
533** pExpr->iDb Set the index in db->aDb[] of the database holding
534** the table.
535** pExpr->iTable Set to the cursor number for the table obtained
536** from pSrcList.
537** pExpr->iColumn Set to the column number within the table.
drh8141f612004-01-25 22:44:58 +0000538** pExpr->op Set to TK_COLUMN.
539** pExpr->pLeft Any expression this points to is deleted
540** pExpr->pRight Any expression this points to is deleted.
541**
542** The pDbToken is the name of the database (the "X"). This value may be
543** NULL meaning that name is of the form Y.Z or Z. Any available database
544** can be used. The pTableToken is the name of the table (the "Y"). This
545** value can be NULL if pDbToken is also NULL. If pTableToken is NULL it
546** means that the form of the name is Z and that columns from any table
547** can be used.
548**
549** If the name cannot be resolved unambiguously, leave an error message
550** in pParse and return non-zero. Return zero on success.
551*/
552static int lookupName(
553 Parse *pParse, /* The parsing context */
554 Token *pDbToken, /* Name of the database containing table, or NULL */
555 Token *pTableToken, /* Name of table containing column, or NULL */
556 Token *pColumnToken, /* Name of the column. */
557 SrcList *pSrcList, /* List of tables used to resolve column names */
558 ExprList *pEList, /* List of expressions used to resolve "AS" */
559 Expr *pExpr /* Make this EXPR node point to the selected column */
560){
561 char *zDb = 0; /* Name of the database. The "X" in X.Y.Z */
562 char *zTab = 0; /* Name of the table. The "Y" in X.Y.Z or Y.Z */
563 char *zCol = 0; /* Name of the column. The "Z" */
564 int i, j; /* Loop counters */
565 int cnt = 0; /* Number of matching column names */
566 int cntTab = 0; /* Number of matching table names */
drh7e26d752004-02-11 10:35:29 +0000567 sqlite *db = pParse->db; /* The database */
drh8141f612004-01-25 22:44:58 +0000568
569 assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */
570 if( pDbToken && pDbToken->z ){
571 zDb = sqliteStrNDup(pDbToken->z, pDbToken->n);
danielk19774adee202004-05-08 08:23:19 +0000572 sqlite3Dequote(zDb);
drh8141f612004-01-25 22:44:58 +0000573 }else{
574 zDb = 0;
575 }
576 if( pTableToken && pTableToken->z ){
577 zTab = sqliteStrNDup(pTableToken->z, pTableToken->n);
danielk19774adee202004-05-08 08:23:19 +0000578 sqlite3Dequote(zTab);
drh8141f612004-01-25 22:44:58 +0000579 }else{
580 assert( zDb==0 );
581 zTab = 0;
582 }
583 zCol = sqliteStrNDup(pColumnToken->z, pColumnToken->n);
danielk19774adee202004-05-08 08:23:19 +0000584 sqlite3Dequote(zCol);
danielk197724b03fd2004-05-10 10:34:34 +0000585 if( sqlite3_malloc_failed ){
drh8141f612004-01-25 22:44:58 +0000586 return 1; /* Leak memory (zDb and zTab) if malloc fails */
587 }
588 assert( zTab==0 || pEList==0 );
589
590 pExpr->iTable = -1;
591 for(i=0; i<pSrcList->nSrc; i++){
592 struct SrcList_item *pItem = &pSrcList->a[i];
593 Table *pTab = pItem->pTab;
594 Column *pCol;
595
596 if( pTab==0 ) continue;
597 assert( pTab->nCol>0 );
598 if( zTab ){
599 if( pItem->zAlias ){
600 char *zTabName = pItem->zAlias;
danielk19774adee202004-05-08 08:23:19 +0000601 if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
drh8141f612004-01-25 22:44:58 +0000602 }else{
603 char *zTabName = pTab->zName;
danielk19774adee202004-05-08 08:23:19 +0000604 if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue;
605 if( zDb!=0 && sqlite3StrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){
drh8141f612004-01-25 22:44:58 +0000606 continue;
607 }
608 }
609 }
610 if( 0==(cntTab++) ){
611 pExpr->iTable = pItem->iCursor;
612 pExpr->iDb = pTab->iDb;
613 }
614 for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){
danielk19774adee202004-05-08 08:23:19 +0000615 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
drh8141f612004-01-25 22:44:58 +0000616 cnt++;
617 pExpr->iTable = pItem->iCursor;
618 pExpr->iDb = pTab->iDb;
619 /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */
620 pExpr->iColumn = j==pTab->iPKey ? -1 : j;
danielk1977a37cdde2004-05-16 11:15:36 +0000621 pExpr->affinity = pTab->aCol[j].affinity;
danielk19770202b292004-06-09 09:55:16 +0000622 pExpr->pColl = pTab->aCol[j].pColl;
drh8141f612004-01-25 22:44:58 +0000623 break;
624 }
625 }
626 }
627
628 /* If we have not already resolved the name, then maybe
629 ** it is a new.* or old.* trigger argument reference
630 */
631 if( zDb==0 && zTab!=0 && cnt==0 && pParse->trigStack!=0 ){
632 TriggerStack *pTriggerStack = pParse->trigStack;
633 Table *pTab = 0;
danielk19774adee202004-05-08 08:23:19 +0000634 if( pTriggerStack->newIdx != -1 && sqlite3StrICmp("new", zTab) == 0 ){
drh8141f612004-01-25 22:44:58 +0000635 pExpr->iTable = pTriggerStack->newIdx;
636 assert( pTriggerStack->pTab );
637 pTab = pTriggerStack->pTab;
danielk19774adee202004-05-08 08:23:19 +0000638 }else if( pTriggerStack->oldIdx != -1 && sqlite3StrICmp("old", zTab) == 0 ){
drh8141f612004-01-25 22:44:58 +0000639 pExpr->iTable = pTriggerStack->oldIdx;
640 assert( pTriggerStack->pTab );
641 pTab = pTriggerStack->pTab;
642 }
643
644 if( pTab ){
645 int j;
646 Column *pCol = pTab->aCol;
647
648 pExpr->iDb = pTab->iDb;
649 cntTab++;
650 for(j=0; j < pTab->nCol; j++, pCol++) {
danielk19774adee202004-05-08 08:23:19 +0000651 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){
drh8141f612004-01-25 22:44:58 +0000652 cnt++;
653 pExpr->iColumn = j==pTab->iPKey ? -1 : j;
danielk1977a37cdde2004-05-16 11:15:36 +0000654 pExpr->affinity = pTab->aCol[j].affinity;
danielk19770202b292004-06-09 09:55:16 +0000655 pExpr->pColl = pTab->aCol[j].pColl;
drh8141f612004-01-25 22:44:58 +0000656 break;
657 }
658 }
659 }
660 }
661
662 /*
663 ** Perhaps the name is a reference to the ROWID
664 */
danielk19774adee202004-05-08 08:23:19 +0000665 if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){
drh8141f612004-01-25 22:44:58 +0000666 cnt = 1;
667 pExpr->iColumn = -1;
danielk1977a37cdde2004-05-16 11:15:36 +0000668 pExpr->affinity = SQLITE_AFF_INTEGER;
drh8141f612004-01-25 22:44:58 +0000669 }
670
671 /*
672 ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z
673 ** might refer to an result-set alias. This happens, for example, when
674 ** we are resolving names in the WHERE clause of the following command:
675 **
676 ** SELECT a+b AS x FROM table WHERE x<10;
677 **
678 ** In cases like this, replace pExpr with a copy of the expression that
679 ** forms the result set entry ("a+b" in the example) and return immediately.
680 ** Note that the expression in the result set should have already been
681 ** resolved by the time the WHERE clause is resolved.
682 */
683 if( cnt==0 && pEList!=0 ){
684 for(j=0; j<pEList->nExpr; j++){
685 char *zAs = pEList->a[j].zName;
danielk19774adee202004-05-08 08:23:19 +0000686 if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){
drh8141f612004-01-25 22:44:58 +0000687 assert( pExpr->pLeft==0 && pExpr->pRight==0 );
688 pExpr->op = TK_AS;
689 pExpr->iColumn = j;
danielk19774adee202004-05-08 08:23:19 +0000690 pExpr->pLeft = sqlite3ExprDup(pEList->a[j].pExpr);
drh8141f612004-01-25 22:44:58 +0000691 sqliteFree(zCol);
692 assert( zTab==0 && zDb==0 );
693 return 0;
694 }
695 }
696 }
697
698 /*
699 ** If X and Y are NULL (in other words if only the column name Z is
700 ** supplied) and the value of Z is enclosed in double-quotes, then
701 ** Z is a string literal if it doesn't match any column names. In that
702 ** case, we need to return right away and not make any changes to
703 ** pExpr.
704 */
705 if( cnt==0 && zTab==0 && pColumnToken->z[0]=='"' ){
706 sqliteFree(zCol);
707 return 0;
708 }
709
710 /*
711 ** cnt==0 means there was not match. cnt>1 means there were two or
712 ** more matches. Either way, we have an error.
713 */
714 if( cnt!=1 ){
715 char *z = 0;
716 char *zErr;
717 zErr = cnt==0 ? "no such column: %s" : "ambiguous column name: %s";
718 if( zDb ){
danielk19774adee202004-05-08 08:23:19 +0000719 sqlite3SetString(&z, zDb, ".", zTab, ".", zCol, 0);
drh8141f612004-01-25 22:44:58 +0000720 }else if( zTab ){
danielk19774adee202004-05-08 08:23:19 +0000721 sqlite3SetString(&z, zTab, ".", zCol, 0);
drh8141f612004-01-25 22:44:58 +0000722 }else{
723 z = sqliteStrDup(zCol);
724 }
danielk19774adee202004-05-08 08:23:19 +0000725 sqlite3ErrorMsg(pParse, zErr, z);
drh8141f612004-01-25 22:44:58 +0000726 sqliteFree(z);
727 }
728
729 /* Clean up and return
730 */
731 sqliteFree(zDb);
732 sqliteFree(zTab);
733 sqliteFree(zCol);
danielk19774adee202004-05-08 08:23:19 +0000734 sqlite3ExprDelete(pExpr->pLeft);
drh8141f612004-01-25 22:44:58 +0000735 pExpr->pLeft = 0;
danielk19774adee202004-05-08 08:23:19 +0000736 sqlite3ExprDelete(pExpr->pRight);
drh8141f612004-01-25 22:44:58 +0000737 pExpr->pRight = 0;
738 pExpr->op = TK_COLUMN;
danielk19774adee202004-05-08 08:23:19 +0000739 sqlite3AuthRead(pParse, pExpr, pSrcList);
drh8141f612004-01-25 22:44:58 +0000740 return cnt!=1;
741}
742
743/*
drhcce7d172000-05-31 15:34:51 +0000744** This routine walks an expression tree and resolves references to
drh967e8b72000-06-21 13:59:10 +0000745** table columns. Nodes of the form ID.ID or ID resolve into an
drhaacc5432002-01-06 17:07:40 +0000746** index to the table in the table list and a column offset. The
747** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable
748** value is changed to the index of the referenced table in pTabList
drh832508b2002-03-02 17:04:07 +0000749** plus the "base" value. The base value will ultimately become the
drhaacc5432002-01-06 17:07:40 +0000750** VDBE cursor number for a cursor that is pointing into the referenced
751** table. The Expr.iColumn value is changed to the index of the column
752** of the referenced table. The Expr.iColumn value for the special
753** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an
754** alias for ROWID.
drh19a775c2000-06-05 18:54:46 +0000755**
drhfef52082000-06-06 01:50:43 +0000756** We also check for instances of the IN operator. IN comes in two
757** forms:
758**
759** expr IN (exprlist)
760** and
761** expr IN (SELECT ...)
762**
763** The first form is handled by creating a set holding the list
764** of allowed values. The second form causes the SELECT to generate
765** a temporary table.
766**
767** This routine also looks for scalar SELECTs that are part of an expression.
drh19a775c2000-06-05 18:54:46 +0000768** If it finds any, it generates code to write the value of that select
769** into a memory cell.
drhcce7d172000-05-31 15:34:51 +0000770**
drh967e8b72000-06-21 13:59:10 +0000771** Unknown columns or tables provoke an error. The function returns
drhcce7d172000-05-31 15:34:51 +0000772** the number of errors seen and leaves an error message on pParse->zErrMsg.
773*/
danielk19774adee202004-05-08 08:23:19 +0000774int sqlite3ExprResolveIds(
drha2e00042002-01-22 03:13:42 +0000775 Parse *pParse, /* The parser context */
drh8141f612004-01-25 22:44:58 +0000776 SrcList *pSrcList, /* List of tables used to resolve column names */
drha2e00042002-01-22 03:13:42 +0000777 ExprList *pEList, /* List of expressions used to resolve "AS" */
778 Expr *pExpr /* The expression to be analyzed. */
779){
drh6a3ea0e2003-05-02 14:32:12 +0000780 int i;
781
drh8141f612004-01-25 22:44:58 +0000782 if( pExpr==0 || pSrcList==0 ) return 0;
783 for(i=0; i<pSrcList->nSrc; i++){
784 assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab );
drh6a3ea0e2003-05-02 14:32:12 +0000785 }
drhcce7d172000-05-31 15:34:51 +0000786 switch( pExpr->op ){
drh23989372002-05-21 13:43:04 +0000787 /* Double-quoted strings (ex: "abc") are used as identifiers if
788 ** possible. Otherwise they remain as strings. Single-quoted
789 ** strings (ex: 'abc') are always string literals.
790 */
791 case TK_STRING: {
792 if( pExpr->token.z[0]=='\'' ) break;
793 /* Fall thru into the TK_ID case if this is a double-quoted string */
794 }
drh8141f612004-01-25 22:44:58 +0000795 /* A lone identifier is the name of a columnd.
drha2e00042002-01-22 03:13:42 +0000796 */
drhcce7d172000-05-31 15:34:51 +0000797 case TK_ID: {
drh8141f612004-01-25 22:44:58 +0000798 if( lookupName(pParse, 0, 0, &pExpr->token, pSrcList, pEList, pExpr) ){
drhcce7d172000-05-31 15:34:51 +0000799 return 1;
drhed6c8672003-01-12 18:02:16 +0000800 }
drhcce7d172000-05-31 15:34:51 +0000801 break;
802 }
803
drhd24cc422003-03-27 12:51:24 +0000804 /* A table name and column name: ID.ID
805 ** Or a database, table and column: ID.ID.ID
806 */
drhcce7d172000-05-31 15:34:51 +0000807 case TK_DOT: {
drh8141f612004-01-25 22:44:58 +0000808 Token *pColumn;
809 Token *pTable;
810 Token *pDb;
811 Expr *pRight;
drhcce7d172000-05-31 15:34:51 +0000812
drhcce7d172000-05-31 15:34:51 +0000813 pRight = pExpr->pRight;
drhd24cc422003-03-27 12:51:24 +0000814 if( pRight->op==TK_ID ){
drh8141f612004-01-25 22:44:58 +0000815 pDb = 0;
816 pTable = &pExpr->pLeft->token;
817 pColumn = &pRight->token;
drhd24cc422003-03-27 12:51:24 +0000818 }else{
drh8141f612004-01-25 22:44:58 +0000819 assert( pRight->op==TK_DOT );
820 pDb = &pExpr->pLeft->token;
821 pTable = &pRight->pLeft->token;
822 pColumn = &pRight->pRight->token;
drhd24cc422003-03-27 12:51:24 +0000823 }
drh8141f612004-01-25 22:44:58 +0000824 if( lookupName(pParse, pDb, pTable, pColumn, pSrcList, 0, pExpr) ){
drhdaffd0e2001-04-11 14:28:42 +0000825 return 1;
826 }
drhcce7d172000-05-31 15:34:51 +0000827 break;
828 }
829
drhfef52082000-06-06 01:50:43 +0000830 case TK_IN: {
danielk1977e014a832004-05-17 10:48:57 +0000831 char affinity;
danielk19774adee202004-05-08 08:23:19 +0000832 Vdbe *v = sqlite3GetVdbe(pParse);
drhd3d39e92004-05-20 22:16:29 +0000833 KeyInfo keyInfo;
danielk19770202b292004-06-09 09:55:16 +0000834 int addr; /* Address of OP_OpenTemp instruction */
drhd3d39e92004-05-20 22:16:29 +0000835
drhfef52082000-06-06 01:50:43 +0000836 if( v==0 ) return 1;
danielk19774adee202004-05-08 08:23:19 +0000837 if( sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){
drhcfab11b2000-06-06 03:31:22 +0000838 return 1;
839 }
danielk1977bf3b7212004-05-18 10:06:24 +0000840 affinity = sqlite3ExprAffinity(pExpr->pLeft);
danielk1977e014a832004-05-17 10:48:57 +0000841
842 /* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)'
843 ** expression it is handled the same way. A temporary table is
844 ** filled with single-field index keys representing the results
845 ** from the SELECT or the <exprlist>.
846 **
847 ** If the 'x' expression is a column value, or the SELECT...
848 ** statement returns a column value, then the affinity of that
849 ** column is used to build the index keys. If both 'x' and the
850 ** SELECT... statement are columns, then numeric affinity is used
851 ** if either column has NUMERIC or INTEGER affinity. If neither
852 ** 'x' nor the SELECT... statement are columns, then numeric affinity
853 ** is used.
854 */
855 pExpr->iTable = pParse->nTab++;
danielk19770202b292004-06-09 09:55:16 +0000856 addr = sqlite3VdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 0);
drhd3d39e92004-05-20 22:16:29 +0000857 memset(&keyInfo, 0, sizeof(keyInfo));
858 keyInfo.nField = 1;
drhf3218fe2004-05-28 08:21:02 +0000859 sqlite3VdbeAddOp(v, OP_SetNumColumns, pExpr->iTable, 1);
danielk1977e014a832004-05-17 10:48:57 +0000860
drhfef52082000-06-06 01:50:43 +0000861 if( pExpr->pSelect ){
862 /* Case 1: expr IN (SELECT ...)
863 **
danielk1977e014a832004-05-17 10:48:57 +0000864 ** Generate code to write the results of the select into the temporary
865 ** table allocated and opened above.
drhfef52082000-06-06 01:50:43 +0000866 */
danielk1977e014a832004-05-17 10:48:57 +0000867 int iParm = pExpr->iTable + (((int)affinity)<<16);
868 assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable );
danielk1977bf3b7212004-05-18 10:06:24 +0000869 sqlite3Select(pParse, pExpr->pSelect, SRT_Set, iParm, 0, 0, 0, 0);
danielk19770202b292004-06-09 09:55:16 +0000870 if( pExpr->pSelect->pEList && pExpr->pSelect->pEList->nExpr>0 ){
871 keyInfo.aColl[0] = binaryCompareCollSeq(pExpr->pLeft,
872 pExpr->pSelect->pEList->a[0].pExpr);
873 }
drhfef52082000-06-06 01:50:43 +0000874 }else if( pExpr->pList ){
875 /* Case 2: expr IN (exprlist)
876 **
danielk1977e014a832004-05-17 10:48:57 +0000877 ** For each expression, build an index key from the evaluation and
878 ** store it in the temporary table. If <expr> is a column, then use
879 ** that columns affinity when building index keys. If <expr> is not
880 ** a column, use numeric affinity.
drhfef52082000-06-06 01:50:43 +0000881 */
danielk1977e014a832004-05-17 10:48:57 +0000882 int i;
883 char const *affStr;
884 if( !affinity ){
885 affinity = SQLITE_AFF_NUMERIC;
886 }
887 affStr = sqlite3AffinityString(affinity);
danielk19770202b292004-06-09 09:55:16 +0000888 keyInfo.aColl[0] = pExpr->pLeft->pColl;
danielk1977e014a832004-05-17 10:48:57 +0000889
890 /* Loop through each expression in <exprlist>. */
drhfef52082000-06-06 01:50:43 +0000891 for(i=0; i<pExpr->pList->nExpr; i++){
892 Expr *pE2 = pExpr->pList->a[i].pExpr;
danielk1977e014a832004-05-17 10:48:57 +0000893
894 /* Check that the expression is constant and valid. */
danielk19774adee202004-05-08 08:23:19 +0000895 if( !sqlite3ExprIsConstant(pE2) ){
896 sqlite3ErrorMsg(pParse,
drhda93d232003-03-31 02:12:46 +0000897 "right-hand side of IN operator must be constant");
drhfef52082000-06-06 01:50:43 +0000898 return 1;
899 }
danielk19774adee202004-05-08 08:23:19 +0000900 if( sqlite3ExprCheck(pParse, pE2, 0, 0) ){
drh4794b982000-06-06 13:54:14 +0000901 return 1;
902 }
danielk1977e014a832004-05-17 10:48:57 +0000903
904 /* Evaluate the expression and insert it into the temp table */
905 sqlite3ExprCode(pParse, pE2);
906 sqlite3VdbeOp3(v, OP_MakeKey, 1, 0, affStr, P3_STATIC);
danielk19770f69c1e2004-05-29 11:24:50 +0000907 sqlite3VdbeAddOp(v, OP_String8, 0, 0);
danielk1977e014a832004-05-17 10:48:57 +0000908 sqlite3VdbeAddOp(v, OP_PutStrKey, pExpr->iTable, 0);
drhfef52082000-06-06 01:50:43 +0000909 }
910 }
danielk19770202b292004-06-09 09:55:16 +0000911 sqlite3VdbeChangeP3(v, addr, (void *)&keyInfo, P3_KEYINFO);
912
drhcfab11b2000-06-06 03:31:22 +0000913 break;
drhfef52082000-06-06 01:50:43 +0000914 }
915
drh19a775c2000-06-05 18:54:46 +0000916 case TK_SELECT: {
drhfef52082000-06-06 01:50:43 +0000917 /* This has to be a scalar SELECT. Generate code to put the
918 ** value of this select in a memory cell and record the number
drh967e8b72000-06-21 13:59:10 +0000919 ** of the memory cell in iColumn.
drhfef52082000-06-06 01:50:43 +0000920 */
drh967e8b72000-06-21 13:59:10 +0000921 pExpr->iColumn = pParse->nMem++;
danielk1977bf3b7212004-05-18 10:06:24 +0000922 if(sqlite3Select(pParse, pExpr->pSelect, SRT_Mem,pExpr->iColumn,0,0,0,0)){
drh19a775c2000-06-05 18:54:46 +0000923 return 1;
924 }
925 break;
926 }
927
drhcce7d172000-05-31 15:34:51 +0000928 /* For all else, just recursively walk the tree */
929 default: {
drh4794b982000-06-06 13:54:14 +0000930 if( pExpr->pLeft
danielk19774adee202004-05-08 08:23:19 +0000931 && sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){
drhcce7d172000-05-31 15:34:51 +0000932 return 1;
933 }
934 if( pExpr->pRight
danielk19774adee202004-05-08 08:23:19 +0000935 && sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pRight) ){
drhcce7d172000-05-31 15:34:51 +0000936 return 1;
937 }
938 if( pExpr->pList ){
939 int i;
940 ExprList *pList = pExpr->pList;
941 for(i=0; i<pList->nExpr; i++){
drh832508b2002-03-02 17:04:07 +0000942 Expr *pArg = pList->a[i].pExpr;
danielk19774adee202004-05-08 08:23:19 +0000943 if( sqlite3ExprResolveIds(pParse, pSrcList, pEList, pArg) ){
drhcce7d172000-05-31 15:34:51 +0000944 return 1;
945 }
946 }
947 }
948 }
949 }
950 return 0;
951}
952
drhcce7d172000-05-31 15:34:51 +0000953/*
drh4b59ab52002-08-24 18:24:51 +0000954** pExpr is a node that defines a function of some kind. It might
955** be a syntactic function like "count(x)" or it might be a function
956** that implements an operator, like "a LIKE b".
957**
958** This routine makes *pzName point to the name of the function and
959** *pnName hold the number of characters in the function name.
960*/
961static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){
962 switch( pExpr->op ){
963 case TK_FUNCTION: {
964 *pzName = pExpr->token.z;
drh6977fea2002-10-22 23:38:04 +0000965 *pnName = pExpr->token.n;
drh4b59ab52002-08-24 18:24:51 +0000966 break;
967 }
968 case TK_LIKE: {
969 *pzName = "like";
970 *pnName = 4;
971 break;
972 }
973 case TK_GLOB: {
974 *pzName = "glob";
975 *pnName = 4;
976 break;
977 }
978 default: {
979 *pzName = "can't happen";
980 *pnName = 12;
981 break;
982 }
983 }
984}
985
986/*
drhcce7d172000-05-31 15:34:51 +0000987** Error check the functions in an expression. Make sure all
988** function names are recognized and all functions have the correct
989** number of arguments. Leave an error message in pParse->zErrMsg
990** if anything is amiss. Return the number of errors.
991**
992** if pIsAgg is not null and this expression is an aggregate function
993** (like count(*) or max(value)) then write a 1 into *pIsAgg.
994*/
danielk19774adee202004-05-08 08:23:19 +0000995int sqlite3ExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
drhcce7d172000-05-31 15:34:51 +0000996 int nErr = 0;
997 if( pExpr==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000998 switch( pExpr->op ){
drh4b59ab52002-08-24 18:24:51 +0000999 case TK_GLOB:
1000 case TK_LIKE:
drhcce7d172000-05-31 15:34:51 +00001001 case TK_FUNCTION: {
drhc9b84a12002-06-20 11:36:48 +00001002 int n = pExpr->pList ? pExpr->pList->nExpr : 0; /* Number of arguments */
1003 int no_such_func = 0; /* True if no such function exists */
drhc9b84a12002-06-20 11:36:48 +00001004 int wrong_num_args = 0; /* True if wrong number of arguments */
1005 int is_agg = 0; /* True if is an aggregate function */
drhcce7d172000-05-31 15:34:51 +00001006 int i;
drh4b59ab52002-08-24 18:24:51 +00001007 int nId; /* Number of characters in function name */
1008 const char *zId; /* The function name. */
drh0bce8352002-02-28 00:41:10 +00001009 FuncDef *pDef;
danielk1977d02eb1f2004-06-06 09:44:03 +00001010 int iPrefEnc = (pParse->db->enc==TEXT_Utf8)?0:1;
drh0bce8352002-02-28 00:41:10 +00001011
drh4b59ab52002-08-24 18:24:51 +00001012 getFunctionName(pExpr, &zId, &nId);
danielk1977d02eb1f2004-06-06 09:44:03 +00001013 pDef = sqlite3FindFunction(pParse->db, zId, nId, n, iPrefEnc, 0);
drh0bce8352002-02-28 00:41:10 +00001014 if( pDef==0 ){
danielk1977d02eb1f2004-06-06 09:44:03 +00001015 pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, iPrefEnc, 0);
drh0bce8352002-02-28 00:41:10 +00001016 if( pDef==0 ){
drh268380c2004-02-25 13:47:31 +00001017 no_such_func = 1;
drh0bce8352002-02-28 00:41:10 +00001018 }else{
1019 wrong_num_args = 1;
drhcce7d172000-05-31 15:34:51 +00001020 }
drh0bce8352002-02-28 00:41:10 +00001021 }else{
1022 is_agg = pDef->xFunc==0;
drhcce7d172000-05-31 15:34:51 +00001023 }
drh8e0a2f92002-02-23 23:45:45 +00001024 if( is_agg && !allowAgg ){
danielk19774adee202004-05-08 08:23:19 +00001025 sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId, zId);
drh8e0a2f92002-02-23 23:45:45 +00001026 nErr++;
1027 is_agg = 0;
1028 }else if( no_such_func ){
danielk19774adee202004-05-08 08:23:19 +00001029 sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId);
drhcce7d172000-05-31 15:34:51 +00001030 nErr++;
drh8e0a2f92002-02-23 23:45:45 +00001031 }else if( wrong_num_args ){
danielk19774adee202004-05-08 08:23:19 +00001032 sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()",
drhf7a9e1a2004-02-22 18:40:56 +00001033 nId, zId);
drh8e0a2f92002-02-23 23:45:45 +00001034 nErr++;
drhcce7d172000-05-31 15:34:51 +00001035 }
drhf7a9e1a2004-02-22 18:40:56 +00001036 if( is_agg ){
1037 pExpr->op = TK_AGG_FUNCTION;
1038 if( pIsAgg ) *pIsAgg = 1;
1039 }
drhcce7d172000-05-31 15:34:51 +00001040 for(i=0; nErr==0 && i<n; i++){
danielk19774adee202004-05-08 08:23:19 +00001041 nErr = sqlite3ExprCheck(pParse, pExpr->pList->a[i].pExpr,
drh4cfa7932000-06-08 15:10:46 +00001042 allowAgg && !is_agg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +00001043 }
danielk19770202b292004-06-09 09:55:16 +00001044 /* FIX ME: Compute pExpr->affinity based on the expected return
1045 ** type of the function
1046 */
drhcce7d172000-05-31 15:34:51 +00001047 }
1048 default: {
1049 if( pExpr->pLeft ){
danielk19774adee202004-05-08 08:23:19 +00001050 nErr = sqlite3ExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +00001051 }
1052 if( nErr==0 && pExpr->pRight ){
danielk19774adee202004-05-08 08:23:19 +00001053 nErr = sqlite3ExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +00001054 }
drhfef52082000-06-06 01:50:43 +00001055 if( nErr==0 && pExpr->pList ){
1056 int n = pExpr->pList->nExpr;
1057 int i;
1058 for(i=0; nErr==0 && i<n; i++){
drh22827922000-06-06 17:27:05 +00001059 Expr *pE2 = pExpr->pList->a[i].pExpr;
danielk19774adee202004-05-08 08:23:19 +00001060 nErr = sqlite3ExprCheck(pParse, pE2, allowAgg, pIsAgg);
drhfef52082000-06-06 01:50:43 +00001061 }
1062 }
drhcce7d172000-05-31 15:34:51 +00001063 break;
1064 }
1065 }
1066 return nErr;
1067}
1068
1069/*
drhd3d39e92004-05-20 22:16:29 +00001070** Return one of the SQLITE_AFF_* affinity types that indicates the likely
1071** data type of the result of the given expression.
1072**
1073** Not every expression has a fixed type. If the type cannot be determined
1074** at compile-time, then try to return the type affinity if the expression
1075** is a column. Otherwise just return SQLITE_AFF_NONE.
drhc9b84a12002-06-20 11:36:48 +00001076**
danielk19774adee202004-05-08 08:23:19 +00001077** The sqlite3ExprResolveIds() and sqlite3ExprCheck() routines must have
drhc9b84a12002-06-20 11:36:48 +00001078** both been called on the expression before it is passed to this routine.
1079*/
danielk19774adee202004-05-08 08:23:19 +00001080int sqlite3ExprType(Expr *p){
drhd3d39e92004-05-20 22:16:29 +00001081 if( p==0 ) return SQLITE_AFF_NONE;
drhc9b84a12002-06-20 11:36:48 +00001082 while( p ) switch( p->op ){
drhc9b84a12002-06-20 11:36:48 +00001083 case TK_CONCAT:
drh736c22b2004-05-21 02:14:24 +00001084 case TK_STRING:
danielk1977c572ef72004-05-27 09:28:41 +00001085 case TK_BLOB:
drhd3d39e92004-05-20 22:16:29 +00001086 return SQLITE_AFF_TEXT;
drhc9b84a12002-06-20 11:36:48 +00001087
1088 case TK_AS:
1089 p = p->pLeft;
1090 break;
1091
drh736c22b2004-05-21 02:14:24 +00001092 case TK_VARIABLE:
drhd3d39e92004-05-20 22:16:29 +00001093 case TK_NULL:
1094 return SQLITE_AFF_NONE;
drhc9b84a12002-06-20 11:36:48 +00001095
drhd3d39e92004-05-20 22:16:29 +00001096 case TK_SELECT: /*** FIX ME ****/
1097 case TK_COLUMN: /*** FIX ME ****/
1098 case TK_CASE: /*** FIX ME ****/
drhb1363202002-06-26 02:45:03 +00001099
drhc9b84a12002-06-20 11:36:48 +00001100 default:
drhd3d39e92004-05-20 22:16:29 +00001101 return SQLITE_AFF_NUMERIC;
drhc9b84a12002-06-20 11:36:48 +00001102 }
drhd3d39e92004-05-20 22:16:29 +00001103 return SQLITE_AFF_NONE;
drhc9b84a12002-06-20 11:36:48 +00001104}
1105
1106/*
drhfec19aa2004-05-19 20:41:03 +00001107** Generate an instruction that will put the integer describe by
1108** text z[0..n-1] on the stack.
1109*/
1110static void codeInteger(Vdbe *v, const char *z, int n){
1111 int i;
drh6fec0762004-05-30 01:38:43 +00001112 if( sqlite3GetInt32(z, &i) ){
1113 sqlite3VdbeAddOp(v, OP_Integer, i, 0);
1114 }else if( sqlite3FitsIn64Bits(z) ){
1115 sqlite3VdbeOp3(v, OP_Integer, 0, 0, z, n);
drhfec19aa2004-05-19 20:41:03 +00001116 }else{
1117 sqlite3VdbeOp3(v, OP_Real, 0, 0, z, n);
1118 }
1119}
1120
1121/*
drhcce7d172000-05-31 15:34:51 +00001122** Generate code into the current Vdbe to evaluate the given
drh1ccde152000-06-17 13:12:39 +00001123** expression and leave the result on the top of stack.
drhcce7d172000-05-31 15:34:51 +00001124*/
danielk19774adee202004-05-08 08:23:19 +00001125void sqlite3ExprCode(Parse *pParse, Expr *pExpr){
drhcce7d172000-05-31 15:34:51 +00001126 Vdbe *v = pParse->pVdbe;
1127 int op;
drhdaffd0e2001-04-11 14:28:42 +00001128 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +00001129 switch( pExpr->op ){
1130 case TK_PLUS: op = OP_Add; break;
1131 case TK_MINUS: op = OP_Subtract; break;
1132 case TK_STAR: op = OP_Multiply; break;
1133 case TK_SLASH: op = OP_Divide; break;
1134 case TK_AND: op = OP_And; break;
1135 case TK_OR: op = OP_Or; break;
1136 case TK_LT: op = OP_Lt; break;
1137 case TK_LE: op = OP_Le; break;
1138 case TK_GT: op = OP_Gt; break;
1139 case TK_GE: op = OP_Ge; break;
1140 case TK_NE: op = OP_Ne; break;
1141 case TK_EQ: op = OP_Eq; break;
drhcce7d172000-05-31 15:34:51 +00001142 case TK_ISNULL: op = OP_IsNull; break;
1143 case TK_NOTNULL: op = OP_NotNull; break;
1144 case TK_NOT: op = OP_Not; break;
1145 case TK_UMINUS: op = OP_Negative; break;
drhbf4133c2001-10-13 02:59:08 +00001146 case TK_BITAND: op = OP_BitAnd; break;
1147 case TK_BITOR: op = OP_BitOr; break;
1148 case TK_BITNOT: op = OP_BitNot; break;
1149 case TK_LSHIFT: op = OP_ShiftLeft; break;
1150 case TK_RSHIFT: op = OP_ShiftRight; break;
1151 case TK_REM: op = OP_Remainder; break;
drhfec19aa2004-05-19 20:41:03 +00001152 case TK_FLOAT: op = OP_Real; break;
danielk19770f69c1e2004-05-29 11:24:50 +00001153 case TK_STRING: op = OP_String8; break;
danielk1977c572ef72004-05-27 09:28:41 +00001154 case TK_BLOB: op = OP_HexBlob; break;
drhcce7d172000-05-31 15:34:51 +00001155 default: break;
1156 }
1157 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +00001158 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +00001159 if( pParse->useAgg ){
danielk19774adee202004-05-08 08:23:19 +00001160 sqlite3VdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drhc4a3c772001-04-04 11:48:57 +00001161 }else if( pExpr->iColumn>=0 ){
danielk19774adee202004-05-08 08:23:19 +00001162 sqlite3VdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
drhc4a3c772001-04-04 11:48:57 +00001163 }else{
danielk19774adee202004-05-08 08:23:19 +00001164 sqlite3VdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
drh22827922000-06-06 17:27:05 +00001165 }
drhcce7d172000-05-31 15:34:51 +00001166 break;
1167 }
1168 case TK_INTEGER: {
drhfec19aa2004-05-19 20:41:03 +00001169 codeInteger(v, pExpr->token.z, pExpr->token.n);
1170 break;
1171 }
1172 case TK_FLOAT:
1173 case TK_STRING: {
1174 sqlite3VdbeOp3(v, op, 0, 0, pExpr->token.z, pExpr->token.n);
danielk19774adee202004-05-08 08:23:19 +00001175 sqlite3VdbeDequoteP3(v, -1);
drhcce7d172000-05-31 15:34:51 +00001176 break;
1177 }
danielk1977c572ef72004-05-27 09:28:41 +00001178 case TK_BLOB: {
1179 sqlite3VdbeOp3(v, op, 0, 0, pExpr->token.z+1, pExpr->token.n-1);
1180 sqlite3VdbeDequoteP3(v, -1);
1181 break;
1182 }
drhcce7d172000-05-31 15:34:51 +00001183 case TK_NULL: {
danielk19770f69c1e2004-05-29 11:24:50 +00001184 sqlite3VdbeAddOp(v, OP_String8, 0, 0);
drhcce7d172000-05-31 15:34:51 +00001185 break;
1186 }
drh50457892003-09-06 01:10:47 +00001187 case TK_VARIABLE: {
danielk19774adee202004-05-08 08:23:19 +00001188 sqlite3VdbeAddOp(v, OP_Variable, pExpr->iTable, 0);
drh50457892003-09-06 01:10:47 +00001189 break;
1190 }
drhc9b84a12002-06-20 11:36:48 +00001191 case TK_LT:
1192 case TK_LE:
1193 case TK_GT:
1194 case TK_GE:
1195 case TK_NE:
1196 case TK_EQ: {
danielk1977a37cdde2004-05-16 11:15:36 +00001197 int p1 = binaryCompareP1(pExpr->pLeft, pExpr->pRight, 0);
danielk19770202b292004-06-09 09:55:16 +00001198 CollSeq *p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pRight);
danielk1977a37cdde2004-05-16 11:15:36 +00001199 sqlite3ExprCode(pParse, pExpr->pLeft);
1200 sqlite3ExprCode(pParse, pExpr->pRight);
danielk19770202b292004-06-09 09:55:16 +00001201 sqlite3VdbeOp3(v, op, p1, 0, (void *)p3, P3_COLLSEQ);
danielk1977a37cdde2004-05-16 11:15:36 +00001202 break;
drhc9b84a12002-06-20 11:36:48 +00001203 }
drhcce7d172000-05-31 15:34:51 +00001204 case TK_AND:
1205 case TK_OR:
1206 case TK_PLUS:
1207 case TK_STAR:
1208 case TK_MINUS:
drhbf4133c2001-10-13 02:59:08 +00001209 case TK_REM:
1210 case TK_BITAND:
1211 case TK_BITOR:
drhc9b84a12002-06-20 11:36:48 +00001212 case TK_SLASH: {
danielk19774adee202004-05-08 08:23:19 +00001213 sqlite3ExprCode(pParse, pExpr->pLeft);
1214 sqlite3ExprCode(pParse, pExpr->pRight);
1215 sqlite3VdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +00001216 break;
1217 }
drhbf4133c2001-10-13 02:59:08 +00001218 case TK_LSHIFT:
1219 case TK_RSHIFT: {
danielk19774adee202004-05-08 08:23:19 +00001220 sqlite3ExprCode(pParse, pExpr->pRight);
1221 sqlite3ExprCode(pParse, pExpr->pLeft);
1222 sqlite3VdbeAddOp(v, op, 0, 0);
drhbf4133c2001-10-13 02:59:08 +00001223 break;
1224 }
drh00400772000-06-16 20:51:26 +00001225 case TK_CONCAT: {
danielk19774adee202004-05-08 08:23:19 +00001226 sqlite3ExprCode(pParse, pExpr->pLeft);
1227 sqlite3ExprCode(pParse, pExpr->pRight);
1228 sqlite3VdbeAddOp(v, OP_Concat, 2, 0);
drh00400772000-06-16 20:51:26 +00001229 break;
1230 }
drhcce7d172000-05-31 15:34:51 +00001231 case TK_UMINUS: {
drhfec19aa2004-05-19 20:41:03 +00001232 Expr *pLeft = pExpr->pLeft;
1233 assert( pLeft );
1234 if( pLeft->op==TK_FLOAT || pLeft->op==TK_INTEGER ){
1235 Token *p = &pLeft->token;
drh6e142f52000-06-08 13:36:40 +00001236 char *z = sqliteMalloc( p->n + 2 );
1237 sprintf(z, "-%.*s", p->n, p->z);
drhfec19aa2004-05-19 20:41:03 +00001238 if( pLeft->op==TK_FLOAT ){
1239 sqlite3VdbeOp3(v, OP_Real, 0, 0, z, p->n+1);
drhe6840902002-03-06 03:08:25 +00001240 }else{
drhfec19aa2004-05-19 20:41:03 +00001241 codeInteger(v, z, p->n+1);
drhe6840902002-03-06 03:08:25 +00001242 }
drh6e142f52000-06-08 13:36:40 +00001243 sqliteFree(z);
1244 break;
1245 }
drh1ccde152000-06-17 13:12:39 +00001246 /* Fall through into TK_NOT */
drh6e142f52000-06-08 13:36:40 +00001247 }
drhbf4133c2001-10-13 02:59:08 +00001248 case TK_BITNOT:
drh6e142f52000-06-08 13:36:40 +00001249 case TK_NOT: {
danielk19774adee202004-05-08 08:23:19 +00001250 sqlite3ExprCode(pParse, pExpr->pLeft);
1251 sqlite3VdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +00001252 break;
1253 }
1254 case TK_ISNULL:
1255 case TK_NOTNULL: {
1256 int dest;
danielk19774adee202004-05-08 08:23:19 +00001257 sqlite3VdbeAddOp(v, OP_Integer, 1, 0);
1258 sqlite3ExprCode(pParse, pExpr->pLeft);
1259 dest = sqlite3VdbeCurrentAddr(v) + 2;
1260 sqlite3VdbeAddOp(v, op, 1, dest);
1261 sqlite3VdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +00001262 }
danielk1977a37cdde2004-05-16 11:15:36 +00001263 break;
drh22827922000-06-06 17:27:05 +00001264 case TK_AGG_FUNCTION: {
danielk19774adee202004-05-08 08:23:19 +00001265 sqlite3VdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drh22827922000-06-06 17:27:05 +00001266 break;
1267 }
drh4b59ab52002-08-24 18:24:51 +00001268 case TK_GLOB:
1269 case TK_LIKE:
drhcce7d172000-05-31 15:34:51 +00001270 case TK_FUNCTION: {
drhcce7d172000-05-31 15:34:51 +00001271 ExprList *pList = pExpr->pList;
drh89425d52002-02-28 03:04:48 +00001272 int nExpr = pList ? pList->nExpr : 0;
drh0bce8352002-02-28 00:41:10 +00001273 FuncDef *pDef;
drh4b59ab52002-08-24 18:24:51 +00001274 int nId;
1275 const char *zId;
danielk1977682f68b2004-06-05 10:22:17 +00001276 int p2 = 0;
1277 int i;
danielk1977d02eb1f2004-06-06 09:44:03 +00001278 int iPrefEnc = (pParse->db->enc==TEXT_Utf8)?0:1;
drh4b59ab52002-08-24 18:24:51 +00001279 getFunctionName(pExpr, &zId, &nId);
danielk1977d02eb1f2004-06-06 09:44:03 +00001280 pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, iPrefEnc, 0);
drh0bce8352002-02-28 00:41:10 +00001281 assert( pDef!=0 );
drhf9b596e2004-05-26 16:54:42 +00001282 nExpr = sqlite3ExprCodeExprList(pParse, pList);
danielk1977682f68b2004-06-05 10:22:17 +00001283 for(i=0; i<nExpr && i<32; i++){
danielk1977d02eb1f2004-06-06 09:44:03 +00001284 if( sqlite3ExprIsConstant(pList->a[i].pExpr) ){
1285 p2 |= (1<<i);
1286 }
danielk1977682f68b2004-06-05 10:22:17 +00001287 }
1288 sqlite3VdbeOp3(v, OP_Function, nExpr, p2, (char*)pDef, P3_FUNCDEF);
drhcce7d172000-05-31 15:34:51 +00001289 break;
1290 }
drh19a775c2000-06-05 18:54:46 +00001291 case TK_SELECT: {
danielk19774adee202004-05-08 08:23:19 +00001292 sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
drh19a775c2000-06-05 18:54:46 +00001293 break;
1294 }
drhfef52082000-06-06 01:50:43 +00001295 case TK_IN: {
1296 int addr;
danielk1977e014a832004-05-17 10:48:57 +00001297 char const *affStr;
1298
1299 /* Figure out the affinity to use to create a key from the results
1300 ** of the expression. affinityStr stores a static string suitable for
1301 ** P3 of OP_MakeKey.
1302 */
1303 affStr = sqlite3AffinityString(comparisonAffinity(pExpr));
1304
danielk19774adee202004-05-08 08:23:19 +00001305 sqlite3VdbeAddOp(v, OP_Integer, 1, 0);
danielk1977e014a832004-05-17 10:48:57 +00001306
1307 /* Code the <expr> from "<expr> IN (...)". The temporary table
1308 ** pExpr->iTable contains the values that make up the (...) set.
1309 */
danielk19774adee202004-05-08 08:23:19 +00001310 sqlite3ExprCode(pParse, pExpr->pLeft);
1311 addr = sqlite3VdbeCurrentAddr(v);
danielk1977e014a832004-05-17 10:48:57 +00001312 sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+4); /* addr + 0 */
danielk19774adee202004-05-08 08:23:19 +00001313 sqlite3VdbeAddOp(v, OP_Pop, 2, 0);
danielk19770f69c1e2004-05-29 11:24:50 +00001314 sqlite3VdbeAddOp(v, OP_String8, 0, 0);
danielk1977e014a832004-05-17 10:48:57 +00001315 sqlite3VdbeAddOp(v, OP_Goto, 0, addr+7);
1316 sqlite3VdbeOp3(v, OP_MakeKey, 1, 0, affStr, P3_STATIC); /* addr + 4 */
1317 sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, addr+7);
1318 sqlite3VdbeAddOp(v, OP_AddImm, -1, 0); /* addr + 6 */
1319
drhfef52082000-06-06 01:50:43 +00001320 break;
1321 }
1322 case TK_BETWEEN: {
danielk19770202b292004-06-09 09:55:16 +00001323 int p1;
1324 CollSeq *p3;
danielk19774adee202004-05-08 08:23:19 +00001325 sqlite3ExprCode(pParse, pExpr->pLeft);
1326 sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
1327 sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr);
danielk19770202b292004-06-09 09:55:16 +00001328 p1 = binaryCompareP1(pExpr->pLeft, pExpr->pList->a[0].pExpr, 0);
1329 p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pList->a[0].pExpr);
1330 sqlite3VdbeOp3(v, OP_Ge, p1, 0, (void *)p3, P3_COLLSEQ);
danielk19774adee202004-05-08 08:23:19 +00001331 sqlite3VdbeAddOp(v, OP_Pull, 1, 0);
1332 sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr);
danielk19770202b292004-06-09 09:55:16 +00001333 p1 = binaryCompareP1(pExpr->pLeft, pExpr->pList->a[1].pExpr, 0);
1334 p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pList->a[1].pExpr);
1335 sqlite3VdbeOp3(v, OP_Le, p1, 0, (void *)p3, P3_COLLSEQ);
danielk19774adee202004-05-08 08:23:19 +00001336 sqlite3VdbeAddOp(v, OP_And, 0, 0);
drhfef52082000-06-06 01:50:43 +00001337 break;
1338 }
drh51e9a442004-01-16 16:42:53 +00001339 case TK_UPLUS:
drha2e00042002-01-22 03:13:42 +00001340 case TK_AS: {
danielk19774adee202004-05-08 08:23:19 +00001341 sqlite3ExprCode(pParse, pExpr->pLeft);
drha2e00042002-01-22 03:13:42 +00001342 break;
1343 }
drh17a7f8d2002-03-24 13:13:27 +00001344 case TK_CASE: {
1345 int expr_end_label;
drhf5905aa2002-05-26 20:54:33 +00001346 int jumpInst;
1347 int addr;
1348 int nExpr;
drh17a7f8d2002-03-24 13:13:27 +00001349 int i;
1350
1351 assert(pExpr->pList);
1352 assert((pExpr->pList->nExpr % 2) == 0);
1353 assert(pExpr->pList->nExpr > 0);
drhf5905aa2002-05-26 20:54:33 +00001354 nExpr = pExpr->pList->nExpr;
danielk19774adee202004-05-08 08:23:19 +00001355 expr_end_label = sqlite3VdbeMakeLabel(v);
drh17a7f8d2002-03-24 13:13:27 +00001356 if( pExpr->pLeft ){
danielk19774adee202004-05-08 08:23:19 +00001357 sqlite3ExprCode(pParse, pExpr->pLeft);
drh17a7f8d2002-03-24 13:13:27 +00001358 }
drhf5905aa2002-05-26 20:54:33 +00001359 for(i=0; i<nExpr; i=i+2){
danielk19774adee202004-05-08 08:23:19 +00001360 sqlite3ExprCode(pParse, pExpr->pList->a[i].pExpr);
drh17a7f8d2002-03-24 13:13:27 +00001361 if( pExpr->pLeft ){
danielk19770202b292004-06-09 09:55:16 +00001362 int p1 = binaryCompareP1(pExpr->pLeft, pExpr->pList->a[i].pExpr, 1);
1363 CollSeq *p3 = binaryCompareCollSeq(pExpr->pLeft,
1364 pExpr->pList->a[i].pExpr);
danielk19774adee202004-05-08 08:23:19 +00001365 sqlite3VdbeAddOp(v, OP_Dup, 1, 1);
danielk19770202b292004-06-09 09:55:16 +00001366 jumpInst = sqlite3VdbeOp3(v, OP_Ne, p1, 0, (void *)p3, P3_COLLSEQ);
danielk19774adee202004-05-08 08:23:19 +00001367 sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
drh17a7f8d2002-03-24 13:13:27 +00001368 }else{
danielk19774adee202004-05-08 08:23:19 +00001369 jumpInst = sqlite3VdbeAddOp(v, OP_IfNot, 1, 0);
drh17a7f8d2002-03-24 13:13:27 +00001370 }
danielk19774adee202004-05-08 08:23:19 +00001371 sqlite3ExprCode(pParse, pExpr->pList->a[i+1].pExpr);
1372 sqlite3VdbeAddOp(v, OP_Goto, 0, expr_end_label);
1373 addr = sqlite3VdbeCurrentAddr(v);
1374 sqlite3VdbeChangeP2(v, jumpInst, addr);
drh17a7f8d2002-03-24 13:13:27 +00001375 }
drhf570f012002-05-31 15:51:25 +00001376 if( pExpr->pLeft ){
danielk19774adee202004-05-08 08:23:19 +00001377 sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
drhf570f012002-05-31 15:51:25 +00001378 }
drh17a7f8d2002-03-24 13:13:27 +00001379 if( pExpr->pRight ){
danielk19774adee202004-05-08 08:23:19 +00001380 sqlite3ExprCode(pParse, pExpr->pRight);
drh17a7f8d2002-03-24 13:13:27 +00001381 }else{
danielk19770f69c1e2004-05-29 11:24:50 +00001382 sqlite3VdbeAddOp(v, OP_String8, 0, 0);
drh17a7f8d2002-03-24 13:13:27 +00001383 }
danielk19774adee202004-05-08 08:23:19 +00001384 sqlite3VdbeResolveLabel(v, expr_end_label);
danielk19776f349032002-06-11 02:25:40 +00001385 break;
1386 }
1387 case TK_RAISE: {
1388 if( !pParse->trigStack ){
danielk19774adee202004-05-08 08:23:19 +00001389 sqlite3ErrorMsg(pParse,
drhda93d232003-03-31 02:12:46 +00001390 "RAISE() may only be used within a trigger-program");
danielk19776f349032002-06-11 02:25:40 +00001391 pParse->nErr++;
1392 return;
1393 }
1394 if( pExpr->iColumn == OE_Rollback ||
1395 pExpr->iColumn == OE_Abort ||
1396 pExpr->iColumn == OE_Fail ){
danielk19774adee202004-05-08 08:23:19 +00001397 sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn,
drh701a0ae2004-02-22 20:05:00 +00001398 pExpr->token.z, pExpr->token.n);
danielk19774adee202004-05-08 08:23:19 +00001399 sqlite3VdbeDequoteP3(v, -1);
danielk19776f349032002-06-11 02:25:40 +00001400 } else {
1401 assert( pExpr->iColumn == OE_Ignore );
danielk19774adee202004-05-08 08:23:19 +00001402 sqlite3VdbeOp3(v, OP_Goto, 0, pParse->trigStack->ignoreJump,
drh701a0ae2004-02-22 20:05:00 +00001403 "(IGNORE jump)", 0);
danielk19776f349032002-06-11 02:25:40 +00001404 }
drh17a7f8d2002-03-24 13:13:27 +00001405 }
1406 break;
drhcce7d172000-05-31 15:34:51 +00001407 }
drhcce7d172000-05-31 15:34:51 +00001408}
1409
1410/*
drh268380c2004-02-25 13:47:31 +00001411** Generate code that pushes the value of every element of the given
drhf9b596e2004-05-26 16:54:42 +00001412** expression list onto the stack.
drh268380c2004-02-25 13:47:31 +00001413**
1414** Return the number of elements pushed onto the stack.
1415*/
danielk19774adee202004-05-08 08:23:19 +00001416int sqlite3ExprCodeExprList(
drh268380c2004-02-25 13:47:31 +00001417 Parse *pParse, /* Parsing context */
drhf9b596e2004-05-26 16:54:42 +00001418 ExprList *pList /* The expression list to be coded */
drh268380c2004-02-25 13:47:31 +00001419){
1420 struct ExprList_item *pItem;
1421 int i, n;
1422 Vdbe *v;
1423 if( pList==0 ) return 0;
danielk19774adee202004-05-08 08:23:19 +00001424 v = sqlite3GetVdbe(pParse);
drh268380c2004-02-25 13:47:31 +00001425 n = pList->nExpr;
1426 for(pItem=pList->a, i=0; i<n; i++, pItem++){
danielk19774adee202004-05-08 08:23:19 +00001427 sqlite3ExprCode(pParse, pItem->pExpr);
drh268380c2004-02-25 13:47:31 +00001428 }
drhf9b596e2004-05-26 16:54:42 +00001429 return n;
drh268380c2004-02-25 13:47:31 +00001430}
1431
1432/*
drhcce7d172000-05-31 15:34:51 +00001433** Generate code for a boolean expression such that a jump is made
1434** to the label "dest" if the expression is true but execution
1435** continues straight thru if the expression is false.
drhf5905aa2002-05-26 20:54:33 +00001436**
1437** If the expression evaluates to NULL (neither true nor false), then
1438** take the jump if the jumpIfNull flag is true.
drhcce7d172000-05-31 15:34:51 +00001439*/
danielk19774adee202004-05-08 08:23:19 +00001440void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
drhcce7d172000-05-31 15:34:51 +00001441 Vdbe *v = pParse->pVdbe;
1442 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +00001443 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +00001444 switch( pExpr->op ){
1445 case TK_LT: op = OP_Lt; break;
1446 case TK_LE: op = OP_Le; break;
1447 case TK_GT: op = OP_Gt; break;
1448 case TK_GE: op = OP_Ge; break;
1449 case TK_NE: op = OP_Ne; break;
1450 case TK_EQ: op = OP_Eq; break;
drhcce7d172000-05-31 15:34:51 +00001451 case TK_ISNULL: op = OP_IsNull; break;
1452 case TK_NOTNULL: op = OP_NotNull; break;
1453 default: break;
1454 }
1455 switch( pExpr->op ){
1456 case TK_AND: {
danielk19774adee202004-05-08 08:23:19 +00001457 int d2 = sqlite3VdbeMakeLabel(v);
1458 sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull);
1459 sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
1460 sqlite3VdbeResolveLabel(v, d2);
drhcce7d172000-05-31 15:34:51 +00001461 break;
1462 }
1463 case TK_OR: {
danielk19774adee202004-05-08 08:23:19 +00001464 sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
1465 sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull);
drhcce7d172000-05-31 15:34:51 +00001466 break;
1467 }
1468 case TK_NOT: {
danielk19774adee202004-05-08 08:23:19 +00001469 sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
drhcce7d172000-05-31 15:34:51 +00001470 break;
1471 }
1472 case TK_LT:
1473 case TK_LE:
1474 case TK_GT:
1475 case TK_GE:
1476 case TK_NE:
drh0ac65892002-04-20 14:24:41 +00001477 case TK_EQ: {
danielk1977a37cdde2004-05-16 11:15:36 +00001478 int p1 = binaryCompareP1(pExpr->pLeft, pExpr->pRight, jumpIfNull);
danielk19770202b292004-06-09 09:55:16 +00001479 CollSeq *p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pRight);
danielk19774adee202004-05-08 08:23:19 +00001480 sqlite3ExprCode(pParse, pExpr->pLeft);
1481 sqlite3ExprCode(pParse, pExpr->pRight);
danielk19770202b292004-06-09 09:55:16 +00001482 sqlite3VdbeOp3(v, op, p1, dest, (void *)p3, P3_COLLSEQ);
drhcce7d172000-05-31 15:34:51 +00001483 break;
1484 }
1485 case TK_ISNULL:
1486 case TK_NOTNULL: {
danielk19774adee202004-05-08 08:23:19 +00001487 sqlite3ExprCode(pParse, pExpr->pLeft);
1488 sqlite3VdbeAddOp(v, op, 1, dest);
drhcce7d172000-05-31 15:34:51 +00001489 break;
1490 }
drhfef52082000-06-06 01:50:43 +00001491 case TK_BETWEEN: {
danielk19770202b292004-06-09 09:55:16 +00001492 /* The expression "x BETWEEN y AND z" is implemented as:
1493 **
1494 ** 1 IF (x < y) GOTO 3
1495 ** 2 IF (x <= z) GOTO <dest>
1496 ** 3 ...
1497 */
drhf5905aa2002-05-26 20:54:33 +00001498 int addr;
danielk19770202b292004-06-09 09:55:16 +00001499 int p1;
1500 CollSeq *p3;
danielk19774adee202004-05-08 08:23:19 +00001501 sqlite3ExprCode(pParse, pExpr->pLeft);
1502 sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
1503 sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr);
danielk19770202b292004-06-09 09:55:16 +00001504 p1 = binaryCompareP1(pExpr->pLeft, pExpr->pList->a[0].pExpr, !jumpIfNull);
1505 p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pList->a[0].pExpr);
1506 addr = sqlite3VdbeOp3(v, OP_Lt, p1, 0, (void *)p3, P3_COLLSEQ);
1507
danielk19774adee202004-05-08 08:23:19 +00001508 sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr);
danielk19770202b292004-06-09 09:55:16 +00001509 p1 = binaryCompareP1(pExpr->pLeft, pExpr->pList->a[1].pExpr, jumpIfNull);
1510 p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pList->a[1].pExpr);
1511 sqlite3VdbeOp3(v, OP_Le, p1, dest, (void *)p3, P3_COLLSEQ);
1512
danielk19774adee202004-05-08 08:23:19 +00001513 sqlite3VdbeAddOp(v, OP_Integer, 0, 0);
1514 sqlite3VdbeChangeP2(v, addr, sqlite3VdbeCurrentAddr(v));
1515 sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
drhfef52082000-06-06 01:50:43 +00001516 break;
1517 }
drhcce7d172000-05-31 15:34:51 +00001518 default: {
danielk19774adee202004-05-08 08:23:19 +00001519 sqlite3ExprCode(pParse, pExpr);
1520 sqlite3VdbeAddOp(v, OP_If, jumpIfNull, dest);
drhcce7d172000-05-31 15:34:51 +00001521 break;
1522 }
1523 }
1524}
1525
1526/*
drh66b89c82000-11-28 20:47:17 +00001527** Generate code for a boolean expression such that a jump is made
drhcce7d172000-05-31 15:34:51 +00001528** to the label "dest" if the expression is false but execution
1529** continues straight thru if the expression is true.
drhf5905aa2002-05-26 20:54:33 +00001530**
1531** If the expression evaluates to NULL (neither true nor false) then
1532** jump if jumpIfNull is true or fall through if jumpIfNull is false.
drhcce7d172000-05-31 15:34:51 +00001533*/
danielk19774adee202004-05-08 08:23:19 +00001534void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
drhcce7d172000-05-31 15:34:51 +00001535 Vdbe *v = pParse->pVdbe;
1536 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +00001537 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +00001538 switch( pExpr->op ){
1539 case TK_LT: op = OP_Ge; break;
1540 case TK_LE: op = OP_Gt; break;
1541 case TK_GT: op = OP_Le; break;
1542 case TK_GE: op = OP_Lt; break;
1543 case TK_NE: op = OP_Eq; break;
1544 case TK_EQ: op = OP_Ne; break;
drhcce7d172000-05-31 15:34:51 +00001545 case TK_ISNULL: op = OP_NotNull; break;
1546 case TK_NOTNULL: op = OP_IsNull; break;
1547 default: break;
1548 }
1549 switch( pExpr->op ){
1550 case TK_AND: {
danielk19774adee202004-05-08 08:23:19 +00001551 sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull);
1552 sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
drhcce7d172000-05-31 15:34:51 +00001553 break;
1554 }
1555 case TK_OR: {
danielk19774adee202004-05-08 08:23:19 +00001556 int d2 = sqlite3VdbeMakeLabel(v);
1557 sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull);
1558 sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull);
1559 sqlite3VdbeResolveLabel(v, d2);
drhcce7d172000-05-31 15:34:51 +00001560 break;
1561 }
1562 case TK_NOT: {
danielk19774adee202004-05-08 08:23:19 +00001563 sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull);
drhcce7d172000-05-31 15:34:51 +00001564 break;
1565 }
1566 case TK_LT:
1567 case TK_LE:
1568 case TK_GT:
1569 case TK_GE:
1570 case TK_NE:
1571 case TK_EQ: {
danielk1977a37cdde2004-05-16 11:15:36 +00001572 int p1 = binaryCompareP1(pExpr->pLeft, pExpr->pRight, jumpIfNull);
danielk19770202b292004-06-09 09:55:16 +00001573 CollSeq *p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pRight);
danielk19774adee202004-05-08 08:23:19 +00001574 sqlite3ExprCode(pParse, pExpr->pLeft);
1575 sqlite3ExprCode(pParse, pExpr->pRight);
danielk19770202b292004-06-09 09:55:16 +00001576 sqlite3VdbeOp3(v, op, p1, dest, (void *)p3, P3_COLLSEQ);
drhcce7d172000-05-31 15:34:51 +00001577 break;
1578 }
drhcce7d172000-05-31 15:34:51 +00001579 case TK_ISNULL:
1580 case TK_NOTNULL: {
danielk19774adee202004-05-08 08:23:19 +00001581 sqlite3ExprCode(pParse, pExpr->pLeft);
1582 sqlite3VdbeAddOp(v, op, 1, dest);
drhcce7d172000-05-31 15:34:51 +00001583 break;
1584 }
drhfef52082000-06-06 01:50:43 +00001585 case TK_BETWEEN: {
danielk19770202b292004-06-09 09:55:16 +00001586 /* The expression is "x BETWEEN y AND z". It is implemented as:
1587 **
1588 ** 1 IF (x >= y) GOTO 3
1589 ** 2 GOTO <dest>
1590 ** 3 IF (x > z) GOTO <dest>
1591 */
drhfef52082000-06-06 01:50:43 +00001592 int addr;
danielk19770202b292004-06-09 09:55:16 +00001593 int p1;
1594 CollSeq *p3;
danielk19774adee202004-05-08 08:23:19 +00001595 sqlite3ExprCode(pParse, pExpr->pLeft);
1596 sqlite3VdbeAddOp(v, OP_Dup, 0, 0);
1597 sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr);
1598 addr = sqlite3VdbeCurrentAddr(v);
danielk19770202b292004-06-09 09:55:16 +00001599 p1 = binaryCompareP1(pExpr->pLeft, pExpr->pList->a[0].pExpr, !jumpIfNull);
1600 p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pList->a[0].pExpr);
1601 sqlite3VdbeOp3(v, OP_Ge, p1, addr+3, (void *)p3, P3_COLLSEQ);
danielk19774adee202004-05-08 08:23:19 +00001602 sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
1603 sqlite3VdbeAddOp(v, OP_Goto, 0, dest);
1604 sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr);
danielk19770202b292004-06-09 09:55:16 +00001605 p1 = binaryCompareP1(pExpr->pLeft, pExpr->pList->a[1].pExpr, jumpIfNull);
1606 p3 = binaryCompareCollSeq(pExpr->pLeft, pExpr->pList->a[1].pExpr);
1607 sqlite3VdbeOp3(v, OP_Gt, p1, dest, (void *)p3, P3_COLLSEQ);
drhfef52082000-06-06 01:50:43 +00001608 break;
1609 }
drhcce7d172000-05-31 15:34:51 +00001610 default: {
danielk19774adee202004-05-08 08:23:19 +00001611 sqlite3ExprCode(pParse, pExpr);
1612 sqlite3VdbeAddOp(v, OP_IfNot, jumpIfNull, dest);
drhcce7d172000-05-31 15:34:51 +00001613 break;
1614 }
1615 }
1616}
drh22827922000-06-06 17:27:05 +00001617
1618/*
1619** Do a deep comparison of two expression trees. Return TRUE (non-zero)
1620** if they are identical and return FALSE if they differ in any way.
1621*/
danielk19774adee202004-05-08 08:23:19 +00001622int sqlite3ExprCompare(Expr *pA, Expr *pB){
drh22827922000-06-06 17:27:05 +00001623 int i;
1624 if( pA==0 ){
1625 return pB==0;
1626 }else if( pB==0 ){
1627 return 0;
1628 }
1629 if( pA->op!=pB->op ) return 0;
danielk19774adee202004-05-08 08:23:19 +00001630 if( !sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 0;
1631 if( !sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 0;
drh22827922000-06-06 17:27:05 +00001632 if( pA->pList ){
1633 if( pB->pList==0 ) return 0;
1634 if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
1635 for(i=0; i<pA->pList->nExpr; i++){
danielk19774adee202004-05-08 08:23:19 +00001636 if( !sqlite3ExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
drh22827922000-06-06 17:27:05 +00001637 return 0;
1638 }
1639 }
1640 }else if( pB->pList ){
1641 return 0;
1642 }
1643 if( pA->pSelect || pB->pSelect ) return 0;
drh2f2c01e2002-07-02 13:05:04 +00001644 if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0;
drh22827922000-06-06 17:27:05 +00001645 if( pA->token.z ){
1646 if( pB->token.z==0 ) return 0;
drh6977fea2002-10-22 23:38:04 +00001647 if( pB->token.n!=pA->token.n ) return 0;
danielk19774adee202004-05-08 08:23:19 +00001648 if( sqlite3StrNICmp(pA->token.z, pB->token.z, pB->token.n)!=0 ) return 0;
drh22827922000-06-06 17:27:05 +00001649 }
1650 return 1;
1651}
1652
1653/*
1654** Add a new element to the pParse->aAgg[] array and return its index.
1655*/
1656static int appendAggInfo(Parse *pParse){
1657 if( (pParse->nAgg & 0x7)==0 ){
1658 int amt = pParse->nAgg + 8;
drh6d4abfb2001-10-22 02:58:08 +00001659 AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
1660 if( aAgg==0 ){
drh22827922000-06-06 17:27:05 +00001661 return -1;
1662 }
drh6d4abfb2001-10-22 02:58:08 +00001663 pParse->aAgg = aAgg;
drh22827922000-06-06 17:27:05 +00001664 }
1665 memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
1666 return pParse->nAgg++;
1667}
1668
1669/*
1670** Analyze the given expression looking for aggregate functions and
1671** for variables that need to be added to the pParse->aAgg[] array.
1672** Make additional entries to the pParse->aAgg[] array as necessary.
1673**
1674** This routine should only be called after the expression has been
danielk19774adee202004-05-08 08:23:19 +00001675** analyzed by sqlite3ExprResolveIds() and sqlite3ExprCheck().
drh22827922000-06-06 17:27:05 +00001676**
1677** If errors are seen, leave an error message in zErrMsg and return
1678** the number of errors.
1679*/
danielk19774adee202004-05-08 08:23:19 +00001680int sqlite3ExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
drh22827922000-06-06 17:27:05 +00001681 int i;
1682 AggExpr *aAgg;
1683 int nErr = 0;
1684
1685 if( pExpr==0 ) return 0;
1686 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +00001687 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +00001688 aAgg = pParse->aAgg;
1689 for(i=0; i<pParse->nAgg; i++){
1690 if( aAgg[i].isAgg ) continue;
1691 if( aAgg[i].pExpr->iTable==pExpr->iTable
drh967e8b72000-06-21 13:59:10 +00001692 && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
drh22827922000-06-06 17:27:05 +00001693 break;
1694 }
1695 }
1696 if( i>=pParse->nAgg ){
1697 i = appendAggInfo(pParse);
1698 if( i<0 ) return 1;
1699 pParse->aAgg[i].isAgg = 0;
1700 pParse->aAgg[i].pExpr = pExpr;
1701 }
drhaaf88722000-06-08 11:25:00 +00001702 pExpr->iAgg = i;
drh22827922000-06-06 17:27:05 +00001703 break;
1704 }
1705 case TK_AGG_FUNCTION: {
drh22827922000-06-06 17:27:05 +00001706 aAgg = pParse->aAgg;
1707 for(i=0; i<pParse->nAgg; i++){
1708 if( !aAgg[i].isAgg ) continue;
danielk19774adee202004-05-08 08:23:19 +00001709 if( sqlite3ExprCompare(aAgg[i].pExpr, pExpr) ){
drh22827922000-06-06 17:27:05 +00001710 break;
1711 }
1712 }
1713 if( i>=pParse->nAgg ){
danielk1977d02eb1f2004-06-06 09:44:03 +00001714 int iPrefEnc = (pParse->db->enc==TEXT_Utf8)?0:1;
drh22827922000-06-06 17:27:05 +00001715 i = appendAggInfo(pParse);
1716 if( i<0 ) return 1;
1717 pParse->aAgg[i].isAgg = 1;
1718 pParse->aAgg[i].pExpr = pExpr;
danielk19774adee202004-05-08 08:23:19 +00001719 pParse->aAgg[i].pFunc = sqlite3FindFunction(pParse->db,
drh6977fea2002-10-22 23:38:04 +00001720 pExpr->token.z, pExpr->token.n,
danielk1977d02eb1f2004-06-06 09:44:03 +00001721 pExpr->pList ? pExpr->pList->nExpr : 0, iPrefEnc, 0);
drh22827922000-06-06 17:27:05 +00001722 }
1723 pExpr->iAgg = i;
1724 break;
1725 }
1726 default: {
1727 if( pExpr->pLeft ){
danielk19774adee202004-05-08 08:23:19 +00001728 nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pLeft);
drh22827922000-06-06 17:27:05 +00001729 }
1730 if( nErr==0 && pExpr->pRight ){
danielk19774adee202004-05-08 08:23:19 +00001731 nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pRight);
drh22827922000-06-06 17:27:05 +00001732 }
1733 if( nErr==0 && pExpr->pList ){
1734 int n = pExpr->pList->nExpr;
1735 int i;
1736 for(i=0; nErr==0 && i<n; i++){
danielk19774adee202004-05-08 08:23:19 +00001737 nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
drh22827922000-06-06 17:27:05 +00001738 }
1739 }
1740 break;
1741 }
1742 }
1743 return nErr;
1744}
drh8e0a2f92002-02-23 23:45:45 +00001745
1746/*
danielk1977d02eb1f2004-06-06 09:44:03 +00001747** Locate a user function given a name, a number of arguments and a flag
1748** indicating whether the function prefers UTF-16 over UTF-8. Return a
1749** pointer to the FuncDef structure that defines that function, or return
1750** NULL if the function does not exist.
drh8e0a2f92002-02-23 23:45:45 +00001751**
drh0bce8352002-02-28 00:41:10 +00001752** If the createFlag argument is true, then a new (blank) FuncDef
drh8e0a2f92002-02-23 23:45:45 +00001753** structure is created and liked into the "db" structure if a
1754** no matching function previously existed. When createFlag is true
1755** and the nArg parameter is -1, then only a function that accepts
1756** any number of arguments will be returned.
1757**
1758** If createFlag is false and nArg is -1, then the first valid
1759** function found is returned. A function is valid if either xFunc
1760** or xStep is non-zero.
danielk1977d02eb1f2004-06-06 09:44:03 +00001761**
1762** If createFlag is false, then a function with the required name and
1763** number of arguments may be returned even if the eTextRep flag does not
1764** match that requested.
drh8e0a2f92002-02-23 23:45:45 +00001765*/
danielk19774adee202004-05-08 08:23:19 +00001766FuncDef *sqlite3FindFunction(
drh8e0a2f92002-02-23 23:45:45 +00001767 sqlite *db, /* An open database */
1768 const char *zName, /* Name of the function. Not null-terminated */
1769 int nName, /* Number of characters in the name */
1770 int nArg, /* Number of arguments. -1 means any number */
danielk1977d02eb1f2004-06-06 09:44:03 +00001771 int eTextRep, /* True to retrieve UTF-16 versions. */
drh8e0a2f92002-02-23 23:45:45 +00001772 int createFlag /* Create new entry if true and does not otherwise exist */
1773){
danielk1977d02eb1f2004-06-06 09:44:03 +00001774 FuncDef *p; /* Iterator variable */
1775 FuncDef *pFirst; /* First function with this name */
1776 FuncDef *pBest = 0; /* Best match found so far */
1777 int matchqual = 0;
1778
1779 /* Normalize argument values to simplify comparisons below. */
1780 if( eTextRep ) eTextRep = 1;
1781 if( nArg<-1 ) nArg = -1;
1782
1783 pFirst = (FuncDef*)sqlite3HashFind(&db->aFunc, zName, nName);
1784 for(p=pFirst; p; p=p->pNext){
1785 if( 1 || p->xFunc || p->xStep ){
1786 if( p->nArg==nArg && p->iPrefEnc==eTextRep ){
1787 /* A perfect match. */
1788 pBest = p;
1789 matchqual = 4;
1790 break;
1791 }
1792 if( p->nArg==nArg ){
1793 /* Number of arguments matches, but not the text encoding */
1794 pBest = p;
1795 matchqual = 3;
1796 }
1797 else if( (p->nArg<0) || (nArg<0) ){
1798 if( matchqual<2 && p->iPrefEnc==eTextRep ){
1799 /* Matched a varargs function with correct text encoding */
1800 pBest = p;
1801 matchqual = 2;
1802 }
1803 if( matchqual<1 ){
1804 /* Matched a varargs function with incorrect text encoding */
1805 pBest = p;
1806 matchqual = 1;
1807 }
1808 }
1809 }
drh8e0a2f92002-02-23 23:45:45 +00001810 }
danielk1977d02eb1f2004-06-06 09:44:03 +00001811
1812 if( createFlag && matchqual<4 &&
1813 (pBest = sqliteMalloc(sizeof(*pBest)+nName+1)) ){
1814 pBest->nArg = nArg;
1815 pBest->pNext = pFirst;
1816 pBest->zName = (char*)&pBest[1];
danielk1977ad7dd422004-06-06 12:41:49 +00001817 pBest->iPrefEnc = eTextRep;
danielk1977d02eb1f2004-06-06 09:44:03 +00001818 memcpy(pBest->zName, zName, nName);
1819 pBest->zName[nName] = 0;
1820 sqlite3HashInsert(&db->aFunc, pBest->zName, nName, (void*)pBest);
drh8e0a2f92002-02-23 23:45:45 +00001821 }
danielk1977d02eb1f2004-06-06 09:44:03 +00001822
1823 if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){
1824 return pBest;
drh8e0a2f92002-02-23 23:45:45 +00001825 }
danielk1977d02eb1f2004-06-06 09:44:03 +00001826 return 0;
drh8e0a2f92002-02-23 23:45:45 +00001827}
danielk1977d02eb1f2004-06-06 09:44:03 +00001828