blob: d5e4f747c5da7ac079543118bb563962057c72ef [file] [log] [blame]
drhcce7d172000-05-31 15:34:51 +00001/*
2** Copyright (c) 1999, 2000 D. Richard Hipp
3**
4** This program is free software; you can redistribute it and/or
5** modify it under the terms of the GNU General Public
6** License as published by the Free Software Foundation; either
7** version 2 of the License, or (at your option) any later version.
8**
9** This program is distributed in the hope that it will be useful,
10** but WITHOUT ANY WARRANTY; without even the implied warranty of
11** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12** General Public License for more details.
13**
14** You should have received a copy of the GNU General Public
15** License along with this library; if not, write to the
16** Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17** Boston, MA 02111-1307, USA.
18**
19** Author contact information:
20** drh@hwaci.com
21** http://www.hwaci.com/drh/
22**
23*************************************************************************
24** This file contains C code routines used for processing expressions
25**
drhd8bc7082000-06-07 23:51:50 +000026** $Id: expr.c,v 1.11 2000/06/07 23:51:50 drh Exp $
drhcce7d172000-05-31 15:34:51 +000027*/
28#include "sqliteInt.h"
29
30/*
drhfef52082000-06-06 01:50:43 +000031** Walk an expression tree. Return 1 if the expression is constant
32** and 0 if it involves variables.
33*/
34static int isConstant(Expr *p){
35 switch( p->op ){
36 case TK_ID:
37 case TK_FIELD:
38 case TK_DOT:
39 return 0;
40 default: {
41 if( p->pLeft && !isConstant(p->pLeft) ) return 0;
42 if( p->pRight && !isConstant(p->pRight) ) return 0;
43 if( p->pList ){
44 int i;
45 for(i=0; i<p->pList->nExpr; i++){
46 if( !isConstant(p->pList->a[i].pExpr) ) return 0;
47 }
48 }
49 break;
50 }
51 }
52 return 1;
53}
54
55/*
drh4794b982000-06-06 13:54:14 +000056** Walk the expression tree and process operators of the form:
57**
58** expr IN (SELECT ...)
59**
60** These operators have to be processed before field names are
61** resolved because each such operator increments pParse->nTab
62** to reserve a cursor number for its own use. But pParse->nTab
63** needs to be constant once we begin resolving field names.
64**
65** Actually, the processing of IN-SELECT is only started by this
66** routine. This routine allocates a cursor number to the IN-SELECT
67** and then moves on. The code generation is done by
68** sqliteExprResolveIds() which must be called afterwards.
69*/
70void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
71 if( pExpr==0 ) return;
72 if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
73 pExpr->iTable = pParse->nTab++;
74 }else{
75 if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
76 if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
77 if( pExpr->pList ){
78 int i;
79 ExprList *pList = pExpr->pList;
80 for(i=0; i<pList->nExpr; i++){
81 sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
82 }
83 }
84 }
85}
86
87/*
drhcce7d172000-05-31 15:34:51 +000088** This routine walks an expression tree and resolves references to
89** table fields. Nodes of the form ID.ID or ID resolve into an
90** index to the table in the table list and a field offset. The opcode
91** for such nodes is changed to TK_FIELD. The iTable value is changed
drh19a775c2000-06-05 18:54:46 +000092** to the index of the referenced table in pTabList plus the pParse->nTab
93** value. The iField value is changed to the index of the field of the
94** referenced table.
95**
drhfef52082000-06-06 01:50:43 +000096** We also check for instances of the IN operator. IN comes in two
97** forms:
98**
99** expr IN (exprlist)
100** and
101** expr IN (SELECT ...)
102**
103** The first form is handled by creating a set holding the list
104** of allowed values. The second form causes the SELECT to generate
105** a temporary table.
106**
107** This routine also looks for scalar SELECTs that are part of an expression.
drh19a775c2000-06-05 18:54:46 +0000108** If it finds any, it generates code to write the value of that select
109** into a memory cell.
drhcce7d172000-05-31 15:34:51 +0000110**
111** Unknown fields or tables provoke an error. The function returns
112** the number of errors seen and leaves an error message on pParse->zErrMsg.
113*/
114int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
115 if( pExpr==0 ) return 0;
116 switch( pExpr->op ){
117 /* A lone identifier */
118 case TK_ID: {
119 int cnt = 0; /* Number of matches */
120 int i; /* Loop counter */
121 char *z = 0;
122 sqliteSetNString(&z, pExpr->token.z, pExpr->token.n, 0);
123 for(i=0; i<pTabList->nId; i++){
124 int j;
125 Table *pTab = pTabList->a[i].pTab;
126 if( pTab==0 ) continue;
127 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000128 if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
drhcce7d172000-05-31 15:34:51 +0000129 cnt++;
drh19a775c2000-06-05 18:54:46 +0000130 pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000131 pExpr->iField = j;
132 }
133 }
134 }
135 sqliteFree(z);
136 if( cnt==0 ){
137 sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
138 pExpr->token.z, pExpr->token.n, 0);
139 pParse->nErr++;
140 return 1;
141 }else if( cnt>1 ){
142 sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
143 pExpr->token.z, pExpr->token.n, 0);
144 pParse->nErr++;
145 return 1;
146 }
147 pExpr->op = TK_FIELD;
148 break;
149 }
150
151 /* A table name and field name: ID.ID */
152 case TK_DOT: {
drhbed86902000-06-02 13:27:59 +0000153 int cnt = 0; /* Number of matches */
154 int i; /* Loop counter */
drhcce7d172000-05-31 15:34:51 +0000155 Expr *pLeft, *pRight; /* Left and right subbranches of the expr */
drhcce7d172000-05-31 15:34:51 +0000156 char *zLeft, *zRight; /* Text of an identifier */
157
158 pLeft = pExpr->pLeft;
159 pRight = pExpr->pRight;
160 assert( pLeft && pLeft->op==TK_ID );
161 assert( pRight && pRight->op==TK_ID );
162 zLeft = 0;
163 sqliteSetNString(&zLeft, pLeft->token.z, pLeft->token.n, 0);
164 zRight = 0;
165 sqliteSetNString(&zRight, pRight->token.z, pRight->token.n, 0);
166 for(i=0; i<pTabList->nId; i++){
167 int j;
168 char *zTab;
169 Table *pTab = pTabList->a[i].pTab;
170 if( pTab==0 ) continue;
171 if( pTabList->a[i].zAlias ){
172 zTab = pTabList->a[i].zAlias;
173 }else{
174 zTab = pTab->zName;
175 }
176 if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
177 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000178 if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
drhcce7d172000-05-31 15:34:51 +0000179 cnt++;
drh19a775c2000-06-05 18:54:46 +0000180 pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000181 pExpr->iField = j;
182 }
183 }
184 }
185 sqliteFree(zLeft);
186 sqliteFree(zRight);
187 if( cnt==0 ){
188 sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
189 pLeft->token.z, pLeft->token.n, ".", 1,
190 pRight->token.z, pRight->token.n, 0);
191 pParse->nErr++;
192 return 1;
193 }else if( cnt>1 ){
194 sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
195 pLeft->token.z, pLeft->token.n, ".", 1,
196 pRight->token.z, pRight->token.n, 0);
197 pParse->nErr++;
198 return 1;
199 }
200 sqliteExprDelete(pLeft);
201 pExpr->pLeft = 0;
202 sqliteExprDelete(pRight);
203 pExpr->pRight = 0;
204 pExpr->op = TK_FIELD;
205 break;
206 }
207
drhfef52082000-06-06 01:50:43 +0000208 case TK_IN: {
drhd8bc7082000-06-07 23:51:50 +0000209 Vdbe *v = sqliteGetVdbe(pParse);
drhfef52082000-06-06 01:50:43 +0000210 if( v==0 ) return 1;
drhcfab11b2000-06-06 03:31:22 +0000211 if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
212 return 1;
213 }
drhfef52082000-06-06 01:50:43 +0000214 if( pExpr->pSelect ){
215 /* Case 1: expr IN (SELECT ...)
216 **
217 ** Generate code to write the results of the select into a temporary
drh4794b982000-06-06 13:54:14 +0000218 ** table. The cursor number of the temporary table has already
219 ** been put in iTable by sqliteExprResolveInSelect().
drhfef52082000-06-06 01:50:43 +0000220 */
drh4794b982000-06-06 13:54:14 +0000221 sqliteVdbeAddOp(v, OP_Open, pExpr->iTable, 1, 0, 0);
drhfef52082000-06-06 01:50:43 +0000222 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
223 }else if( pExpr->pList ){
224 /* Case 2: expr IN (exprlist)
225 **
226 ** Create a set to put the exprlist values in. The Set id is stored
227 ** in iTable.
228 */
229 int i, iSet;
230 for(i=0; i<pExpr->pList->nExpr; i++){
231 Expr *pE2 = pExpr->pList->a[i].pExpr;
drhfef52082000-06-06 01:50:43 +0000232 if( !isConstant(pE2) ){
233 sqliteSetString(&pParse->zErrMsg,
234 "right-hand side of IN operator must be constant", 0);
235 pParse->nErr++;
236 return 1;
237 }
drh4794b982000-06-06 13:54:14 +0000238 if( sqliteExprCheck(pParse, pE2, 0, 0) ){
239 return 1;
240 }
drhfef52082000-06-06 01:50:43 +0000241 }
242 iSet = pExpr->iTable = pParse->nSet++;
243 for(i=0; i<pExpr->pList->nExpr; i++){
244 Expr *pE2 = pExpr->pList->a[i].pExpr;
245 switch( pE2->op ){
246 case TK_FLOAT:
247 case TK_INTEGER:
248 case TK_STRING: {
249 int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
250 sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
251 sqliteVdbeDequoteP3(v, addr);
252 break;
253 }
254 default: {
255 sqliteExprCode(pParse, pE2);
256 sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
257 break;
258 }
259 }
260 }
261 }
drhcfab11b2000-06-06 03:31:22 +0000262 break;
drhfef52082000-06-06 01:50:43 +0000263 }
264
drh19a775c2000-06-05 18:54:46 +0000265 case TK_SELECT: {
drhfef52082000-06-06 01:50:43 +0000266 /* This has to be a scalar SELECT. Generate code to put the
267 ** value of this select in a memory cell and record the number
268 ** of the memory cell in iField.
269 */
drh19a775c2000-06-05 18:54:46 +0000270 pExpr->iField = pParse->nMem++;
drhfef52082000-06-06 01:50:43 +0000271 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iField) ){
drh19a775c2000-06-05 18:54:46 +0000272 return 1;
273 }
274 break;
275 }
276
drhcce7d172000-05-31 15:34:51 +0000277 /* For all else, just recursively walk the tree */
278 default: {
drh4794b982000-06-06 13:54:14 +0000279 if( pExpr->pLeft
280 && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
drhcce7d172000-05-31 15:34:51 +0000281 return 1;
282 }
283 if( pExpr->pRight
drh4794b982000-06-06 13:54:14 +0000284 && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){
drhcce7d172000-05-31 15:34:51 +0000285 return 1;
286 }
287 if( pExpr->pList ){
288 int i;
289 ExprList *pList = pExpr->pList;
290 for(i=0; i<pList->nExpr; i++){
291 if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){
292 return 1;
293 }
294 }
295 }
296 }
297 }
298 return 0;
299}
300
301#if 0 /* NOT USED */
302/*
303** Compare a token against a string. Return TRUE if they match.
304*/
305static int sqliteTokenCmp(Token *pToken, const char *zStr){
306 int n = strlen(zStr);
307 if( n!=pToken->n ) return 0;
308 return sqliteStrNICmp(pToken->z, zStr, n)==0;
309}
310#endif
311
312/*
313** Convert a function name into its integer identifier. Return the
314** identifier. Return FN_Unknown if the function name is unknown.
315*/
316int sqliteFuncId(Token *pToken){
317 static const struct {
318 char *zName;
319 int len;
320 int id;
321 } aFunc[] = {
322 { "count", 5, FN_Count },
323 { "min", 3, FN_Min },
324 { "max", 3, FN_Max },
325 { "sum", 3, FN_Sum },
drh22827922000-06-06 17:27:05 +0000326 { "avg", 3, FN_Avg },
drhcce7d172000-05-31 15:34:51 +0000327 };
328 int i;
329 for(i=0; i<ArraySize(aFunc); i++){
330 if( aFunc[i].len==pToken->n
331 && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
332 return aFunc[i].id;
333 }
334 }
335 return FN_Unknown;
336}
337
338/*
339** Error check the functions in an expression. Make sure all
340** function names are recognized and all functions have the correct
341** number of arguments. Leave an error message in pParse->zErrMsg
342** if anything is amiss. Return the number of errors.
343**
344** if pIsAgg is not null and this expression is an aggregate function
345** (like count(*) or max(value)) then write a 1 into *pIsAgg.
346*/
347int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
348 int nErr = 0;
349 if( pExpr==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000350 switch( pExpr->op ){
351 case TK_FUNCTION: {
352 int id = sqliteFuncId(&pExpr->token);
353 int n = pExpr->pList ? pExpr->pList->nExpr : 0;
354 int no_such_func = 0;
355 int too_many_args = 0;
356 int too_few_args = 0;
357 int is_agg = 0;
358 int i;
drh22827922000-06-06 17:27:05 +0000359 pExpr->iField = id;
drhcce7d172000-05-31 15:34:51 +0000360 switch( id ){
361 case FN_Unknown: {
362 no_such_func = 1;
363 break;
364 }
365 case FN_Count: {
366 no_such_func = !allowAgg;
367 too_many_args = n>1;
368 is_agg = 1;
369 break;
370 }
371 case FN_Max:
372 case FN_Min: {
373 too_few_args = allowAgg ? n<1 : n<2;
374 is_agg = n==1;
375 break;
376 }
drh22827922000-06-06 17:27:05 +0000377 case FN_Avg:
drhcce7d172000-05-31 15:34:51 +0000378 case FN_Sum: {
379 no_such_func = !allowAgg;
380 too_many_args = n>1;
381 too_few_args = n<1;
382 is_agg = 1;
383 break;
384 }
385 default: break;
386 }
387 if( no_such_func ){
388 sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
389 pExpr->token.z, pExpr->token.n, 0);
390 pParse->nErr++;
391 nErr++;
392 }else if( too_many_args ){
393 sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
394 pExpr->token.z, pExpr->token.n, "()", 2, 0);
395 pParse->nErr++;
396 nErr++;
397 }else if( too_few_args ){
398 sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
399 pExpr->token.z, pExpr->token.n, "()", 2, 0);
400 pParse->nErr++;
401 nErr++;
402 }
drh22827922000-06-06 17:27:05 +0000403 if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
drhcce7d172000-05-31 15:34:51 +0000404 if( is_agg && pIsAgg ) *pIsAgg = 1;
405 for(i=0; nErr==0 && i<n; i++){
406 nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 0, 0);
407 }
408 }
409 default: {
410 if( pExpr->pLeft ){
drh22827922000-06-06 17:27:05 +0000411 nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000412 }
413 if( nErr==0 && pExpr->pRight ){
drh22827922000-06-06 17:27:05 +0000414 nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000415 }
drhfef52082000-06-06 01:50:43 +0000416 if( nErr==0 && pExpr->pList ){
417 int n = pExpr->pList->nExpr;
418 int i;
419 for(i=0; nErr==0 && i<n; i++){
drh22827922000-06-06 17:27:05 +0000420 Expr *pE2 = pExpr->pList->a[i].pExpr;
421 nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
drhfef52082000-06-06 01:50:43 +0000422 }
423 }
drhcce7d172000-05-31 15:34:51 +0000424 break;
425 }
426 }
427 return nErr;
428}
429
430/*
431** Generate code into the current Vdbe to evaluate the given
432** expression and leave the result on the stack.
433*/
434void sqliteExprCode(Parse *pParse, Expr *pExpr){
435 Vdbe *v = pParse->pVdbe;
436 int op;
437 switch( pExpr->op ){
438 case TK_PLUS: op = OP_Add; break;
439 case TK_MINUS: op = OP_Subtract; break;
440 case TK_STAR: op = OP_Multiply; break;
441 case TK_SLASH: op = OP_Divide; break;
442 case TK_AND: op = OP_And; break;
443 case TK_OR: op = OP_Or; break;
444 case TK_LT: op = OP_Lt; break;
445 case TK_LE: op = OP_Le; break;
446 case TK_GT: op = OP_Gt; break;
447 case TK_GE: op = OP_Ge; break;
448 case TK_NE: op = OP_Ne; break;
449 case TK_EQ: op = OP_Eq; break;
450 case TK_LIKE: op = OP_Like; break;
451 case TK_GLOB: op = OP_Glob; break;
452 case TK_ISNULL: op = OP_IsNull; break;
453 case TK_NOTNULL: op = OP_NotNull; break;
454 case TK_NOT: op = OP_Not; break;
455 case TK_UMINUS: op = OP_Negative; break;
456 default: break;
457 }
458 switch( pExpr->op ){
459 case TK_FIELD: {
drh22827922000-06-06 17:27:05 +0000460 if( pParse->useAgg ){
461 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
462 }else{
463 sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iField, 0, 0);
464 }
drhcce7d172000-05-31 15:34:51 +0000465 break;
466 }
467 case TK_INTEGER: {
468 int i = atoi(pExpr->token.z);
469 sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
470 break;
471 }
472 case TK_FLOAT: {
473 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
474 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
475 break;
476 }
477 case TK_STRING: {
478 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
479 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
480 sqliteVdbeDequoteP3(v, addr);
481 break;
482 }
483 case TK_NULL: {
drhc61053b2000-06-04 12:58:36 +0000484 sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000485 break;
486 }
487 case TK_AND:
488 case TK_OR:
489 case TK_PLUS:
490 case TK_STAR:
491 case TK_MINUS:
492 case TK_SLASH: {
493 sqliteExprCode(pParse, pExpr->pLeft);
494 sqliteExprCode(pParse, pExpr->pRight);
495 sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
496 break;
497 }
498 case TK_LT:
499 case TK_LE:
500 case TK_GT:
501 case TK_GE:
502 case TK_NE:
503 case TK_EQ:
504 case TK_LIKE:
505 case TK_GLOB: {
506 int dest;
507 sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
508 sqliteExprCode(pParse, pExpr->pLeft);
509 sqliteExprCode(pParse, pExpr->pRight);
510 dest = sqliteVdbeCurrentAddr(v) + 2;
511 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
512 sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
513 break;
514 }
515 case TK_NOT:
516 case TK_UMINUS: {
517 sqliteExprCode(pParse, pExpr->pLeft);
518 sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
519 break;
520 }
521 case TK_ISNULL:
522 case TK_NOTNULL: {
523 int dest;
drh8be51132000-06-03 19:19:41 +0000524 sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000525 sqliteExprCode(pParse, pExpr->pLeft);
526 dest = sqliteVdbeCurrentAddr(v) + 2;
527 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
drh8be51132000-06-03 19:19:41 +0000528 sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000529 break;
530 }
drh22827922000-06-06 17:27:05 +0000531 case TK_AGG_FUNCTION: {
532 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
533 if( pExpr->iField==FN_Avg ){
534 assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
535 sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0);
536 sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0);
537 }
538 break;
539 }
drhcce7d172000-05-31 15:34:51 +0000540 case TK_FUNCTION: {
drh22827922000-06-06 17:27:05 +0000541 int id = pExpr->iField;
drhcce7d172000-05-31 15:34:51 +0000542 int op;
543 int i;
544 ExprList *pList = pExpr->pList;
545 op = id==FN_Min ? OP_Min : OP_Max;
546 for(i=0; i<pList->nExpr; i++){
547 sqliteExprCode(pParse, pList->a[i].pExpr);
548 if( i>0 ){
549 sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
550 }
551 }
552 break;
553 }
drh19a775c2000-06-05 18:54:46 +0000554 case TK_SELECT: {
555 sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iField, 0, 0, 0);
556 break;
557 }
drhfef52082000-06-06 01:50:43 +0000558 case TK_IN: {
559 int addr;
drh4794b982000-06-06 13:54:14 +0000560 sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
drhfef52082000-06-06 01:50:43 +0000561 sqliteExprCode(pParse, pExpr->pLeft);
562 addr = sqliteVdbeCurrentAddr(v);
563 if( pExpr->pSelect ){
564 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0);
565 }else{
566 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0);
567 }
drh4794b982000-06-06 13:54:14 +0000568 sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
drhfef52082000-06-06 01:50:43 +0000569 break;
570 }
571 case TK_BETWEEN: {
572 int lbl = sqliteVdbeMakeLabel(v);
573 sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
574 sqliteExprIfFalse(pParse, pExpr, lbl);
575 sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0);
576 sqliteVdbeResolveLabel(v, lbl);
577 break;
578 }
drhcce7d172000-05-31 15:34:51 +0000579 }
580 return;
581}
582
583/*
584** Generate code for a boolean expression such that a jump is made
585** to the label "dest" if the expression is true but execution
586** continues straight thru if the expression is false.
587*/
588void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
589 Vdbe *v = pParse->pVdbe;
590 int op = 0;
591 switch( pExpr->op ){
592 case TK_LT: op = OP_Lt; break;
593 case TK_LE: op = OP_Le; break;
594 case TK_GT: op = OP_Gt; break;
595 case TK_GE: op = OP_Ge; break;
596 case TK_NE: op = OP_Ne; break;
597 case TK_EQ: op = OP_Eq; break;
598 case TK_LIKE: op = OP_Like; break;
599 case TK_GLOB: op = OP_Glob; break;
600 case TK_ISNULL: op = OP_IsNull; break;
601 case TK_NOTNULL: op = OP_NotNull; break;
602 default: break;
603 }
604 switch( pExpr->op ){
605 case TK_AND: {
606 int d2 = sqliteVdbeMakeLabel(v);
607 sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
608 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
609 sqliteVdbeResolveLabel(v, d2);
610 break;
611 }
612 case TK_OR: {
613 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
614 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
615 break;
616 }
617 case TK_NOT: {
618 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
619 break;
620 }
621 case TK_LT:
622 case TK_LE:
623 case TK_GT:
624 case TK_GE:
625 case TK_NE:
626 case TK_EQ:
627 case TK_LIKE:
628 case TK_GLOB: {
629 sqliteExprCode(pParse, pExpr->pLeft);
630 sqliteExprCode(pParse, pExpr->pRight);
631 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
632 break;
633 }
634 case TK_ISNULL:
635 case TK_NOTNULL: {
636 sqliteExprCode(pParse, pExpr->pLeft);
637 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
638 break;
639 }
drhfef52082000-06-06 01:50:43 +0000640 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000641 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000642 if( pExpr->pSelect ){
643 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0);
644 }else{
645 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0);
646 }
647 break;
648 }
649 case TK_BETWEEN: {
650 int lbl = sqliteVdbeMakeLabel(v);
651 sqliteExprCode(pParse, pExpr->pLeft);
652 sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
653 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
654 sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0);
655 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
656 sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0);
657 sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
658 sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl);
659 break;
660 }
drhcce7d172000-05-31 15:34:51 +0000661 default: {
662 sqliteExprCode(pParse, pExpr);
663 sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
664 break;
665 }
666 }
667}
668
669/*
670** Generate code for boolean expression such that a jump is made
671** to the label "dest" if the expression is false but execution
672** continues straight thru if the expression is true.
673*/
674void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
675 Vdbe *v = pParse->pVdbe;
676 int op = 0;
677 switch( pExpr->op ){
678 case TK_LT: op = OP_Ge; break;
679 case TK_LE: op = OP_Gt; break;
680 case TK_GT: op = OP_Le; break;
681 case TK_GE: op = OP_Lt; break;
682 case TK_NE: op = OP_Eq; break;
683 case TK_EQ: op = OP_Ne; break;
684 case TK_LIKE: op = OP_Like; break;
685 case TK_GLOB: op = OP_Glob; break;
686 case TK_ISNULL: op = OP_NotNull; break;
687 case TK_NOTNULL: op = OP_IsNull; break;
688 default: break;
689 }
690 switch( pExpr->op ){
691 case TK_AND: {
692 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
693 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
694 break;
695 }
696 case TK_OR: {
697 int d2 = sqliteVdbeMakeLabel(v);
698 sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
699 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
700 sqliteVdbeResolveLabel(v, d2);
701 break;
702 }
703 case TK_NOT: {
704 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
705 break;
706 }
707 case TK_LT:
708 case TK_LE:
709 case TK_GT:
710 case TK_GE:
711 case TK_NE:
712 case TK_EQ: {
713 sqliteExprCode(pParse, pExpr->pLeft);
714 sqliteExprCode(pParse, pExpr->pRight);
715 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
716 break;
717 }
718 case TK_LIKE:
719 case TK_GLOB: {
720 sqliteExprCode(pParse, pExpr->pLeft);
721 sqliteExprCode(pParse, pExpr->pRight);
722 sqliteVdbeAddOp(v, op, 1, dest, 0, 0);
723 break;
724 }
725 case TK_ISNULL:
726 case TK_NOTNULL: {
727 sqliteExprCode(pParse, pExpr->pLeft);
728 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
729 break;
730 }
drhfef52082000-06-06 01:50:43 +0000731 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000732 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000733 if( pExpr->pSelect ){
734 sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0);
735 }else{
736 sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0);
737 }
738 break;
739 }
740 case TK_BETWEEN: {
741 int addr;
742 sqliteExprCode(pParse, pExpr->pLeft);
743 sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
744 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
745 addr = sqliteVdbeCurrentAddr(v);
746 sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0);
747 sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0);
748 sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0);
749 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
750 sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0);
751 break;
752 }
drhcce7d172000-05-31 15:34:51 +0000753 default: {
754 sqliteExprCode(pParse, pExpr);
755 sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0);
756 sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
757 break;
758 }
759 }
760}
drh22827922000-06-06 17:27:05 +0000761
762/*
763** Do a deep comparison of two expression trees. Return TRUE (non-zero)
764** if they are identical and return FALSE if they differ in any way.
765*/
drhd8bc7082000-06-07 23:51:50 +0000766int sqliteExprCompare(Expr *pA, Expr *pB){
drh22827922000-06-06 17:27:05 +0000767 int i;
768 if( pA==0 ){
769 return pB==0;
770 }else if( pB==0 ){
771 return 0;
772 }
773 if( pA->op!=pB->op ) return 0;
drhd8bc7082000-06-07 23:51:50 +0000774 if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
775 if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
drh22827922000-06-06 17:27:05 +0000776 if( pA->pList ){
777 if( pB->pList==0 ) return 0;
778 if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
779 for(i=0; i<pA->pList->nExpr; i++){
drhd8bc7082000-06-07 23:51:50 +0000780 if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
drh22827922000-06-06 17:27:05 +0000781 return 0;
782 }
783 }
784 }else if( pB->pList ){
785 return 0;
786 }
787 if( pA->pSelect || pB->pSelect ) return 0;
788 if( pA->token.z ){
789 if( pB->token.z==0 ) return 0;
790 if( pB->token.n!=pA->token.n ) return 0;
791 if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
792 }
793 return 1;
794}
795
796/*
797** Add a new element to the pParse->aAgg[] array and return its index.
798*/
799static int appendAggInfo(Parse *pParse){
800 if( (pParse->nAgg & 0x7)==0 ){
801 int amt = pParse->nAgg + 8;
802 pParse->aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
803 if( pParse->aAgg==0 ){
804 sqliteSetString(&pParse->zErrMsg, "out of memory", 0);
805 pParse->nErr++;
806 return -1;
807 }
808 }
809 memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
810 return pParse->nAgg++;
811}
812
813/*
814** Analyze the given expression looking for aggregate functions and
815** for variables that need to be added to the pParse->aAgg[] array.
816** Make additional entries to the pParse->aAgg[] array as necessary.
817**
818** This routine should only be called after the expression has been
819** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
820**
821** If errors are seen, leave an error message in zErrMsg and return
822** the number of errors.
823*/
824int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
825 int i;
826 AggExpr *aAgg;
827 int nErr = 0;
828
829 if( pExpr==0 ) return 0;
830 switch( pExpr->op ){
831 case TK_FIELD: {
832 aAgg = pParse->aAgg;
833 for(i=0; i<pParse->nAgg; i++){
834 if( aAgg[i].isAgg ) continue;
835 if( aAgg[i].pExpr->iTable==pExpr->iTable
836 && aAgg[i].pExpr->iField==pExpr->iField ){
837 pExpr->iAgg = i;
838 break;
839 }
840 }
841 if( i>=pParse->nAgg ){
842 i = appendAggInfo(pParse);
843 if( i<0 ) return 1;
844 pParse->aAgg[i].isAgg = 0;
845 pParse->aAgg[i].pExpr = pExpr;
846 }
847 break;
848 }
849 case TK_AGG_FUNCTION: {
850 if( pExpr->iField==FN_Count || pExpr->iField==FN_Avg ){
851 if( pParse->iAggCount>=0 ){
852 i = pParse->iAggCount;
853 }else{
854 i = appendAggInfo(pParse);
855 if( i<0 ) return 1;
856 pParse->aAgg[i].isAgg = 1;
857 pParse->aAgg[i].pExpr = 0;
858 pParse->iAggCount = i;
859 }
860 if( pExpr->iField==FN_Count ){
861 pExpr->iAgg = i;
862 break;
863 }
864 }
865 aAgg = pParse->aAgg;
866 for(i=0; i<pParse->nAgg; i++){
867 if( !aAgg[i].isAgg ) continue;
drhd8bc7082000-06-07 23:51:50 +0000868 if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
drh22827922000-06-06 17:27:05 +0000869 break;
870 }
871 }
872 if( i>=pParse->nAgg ){
873 i = appendAggInfo(pParse);
874 if( i<0 ) return 1;
875 pParse->aAgg[i].isAgg = 1;
876 pParse->aAgg[i].pExpr = pExpr;
877 }
878 pExpr->iAgg = i;
879 break;
880 }
881 default: {
882 if( pExpr->pLeft ){
883 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
884 }
885 if( nErr==0 && pExpr->pRight ){
886 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
887 }
888 if( nErr==0 && pExpr->pList ){
889 int n = pExpr->pList->nExpr;
890 int i;
891 for(i=0; nErr==0 && i<n; i++){
892 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
893 }
894 }
895 break;
896 }
897 }
898 return nErr;
899}