blob: 7ca71230099f8c214442fd67c7c6b10a55b5e01d [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**
drh00400772000-06-16 20:51:26 +000026** $Id: expr.c,v 1.16 2000/06/16 20:51:26 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 */
drh6e142f52000-06-08 13:36:40 +0000121 char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
drhcce7d172000-05-31 15:34:51 +0000122 for(i=0; i<pTabList->nId; i++){
123 int j;
124 Table *pTab = pTabList->a[i].pTab;
125 if( pTab==0 ) continue;
126 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000127 if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
drhcce7d172000-05-31 15:34:51 +0000128 cnt++;
drh19a775c2000-06-05 18:54:46 +0000129 pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000130 pExpr->iField = j;
131 }
132 }
133 }
134 sqliteFree(z);
135 if( cnt==0 ){
136 sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
137 pExpr->token.z, pExpr->token.n, 0);
138 pParse->nErr++;
139 return 1;
140 }else if( cnt>1 ){
141 sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
142 pExpr->token.z, pExpr->token.n, 0);
143 pParse->nErr++;
144 return 1;
145 }
146 pExpr->op = TK_FIELD;
147 break;
148 }
149
150 /* A table name and field name: ID.ID */
151 case TK_DOT: {
drhbed86902000-06-02 13:27:59 +0000152 int cnt = 0; /* Number of matches */
153 int i; /* Loop counter */
drhcce7d172000-05-31 15:34:51 +0000154 Expr *pLeft, *pRight; /* Left and right subbranches of the expr */
drhcce7d172000-05-31 15:34:51 +0000155 char *zLeft, *zRight; /* Text of an identifier */
156
157 pLeft = pExpr->pLeft;
158 pRight = pExpr->pRight;
159 assert( pLeft && pLeft->op==TK_ID );
160 assert( pRight && pRight->op==TK_ID );
drh6e142f52000-06-08 13:36:40 +0000161 zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
162 zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
drhcce7d172000-05-31 15:34:51 +0000163 for(i=0; i<pTabList->nId; i++){
164 int j;
165 char *zTab;
166 Table *pTab = pTabList->a[i].pTab;
167 if( pTab==0 ) continue;
168 if( pTabList->a[i].zAlias ){
169 zTab = pTabList->a[i].zAlias;
170 }else{
171 zTab = pTab->zName;
172 }
173 if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
174 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000175 if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
drhcce7d172000-05-31 15:34:51 +0000176 cnt++;
drh19a775c2000-06-05 18:54:46 +0000177 pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000178 pExpr->iField = j;
179 }
180 }
181 }
182 sqliteFree(zLeft);
183 sqliteFree(zRight);
184 if( cnt==0 ){
185 sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1,
186 pLeft->token.z, pLeft->token.n, ".", 1,
187 pRight->token.z, pRight->token.n, 0);
188 pParse->nErr++;
189 return 1;
190 }else if( cnt>1 ){
191 sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1,
192 pLeft->token.z, pLeft->token.n, ".", 1,
193 pRight->token.z, pRight->token.n, 0);
194 pParse->nErr++;
195 return 1;
196 }
197 sqliteExprDelete(pLeft);
198 pExpr->pLeft = 0;
199 sqliteExprDelete(pRight);
200 pExpr->pRight = 0;
201 pExpr->op = TK_FIELD;
202 break;
203 }
204
drhfef52082000-06-06 01:50:43 +0000205 case TK_IN: {
drhd8bc7082000-06-07 23:51:50 +0000206 Vdbe *v = sqliteGetVdbe(pParse);
drhfef52082000-06-06 01:50:43 +0000207 if( v==0 ) return 1;
drhcfab11b2000-06-06 03:31:22 +0000208 if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
209 return 1;
210 }
drhfef52082000-06-06 01:50:43 +0000211 if( pExpr->pSelect ){
212 /* Case 1: expr IN (SELECT ...)
213 **
214 ** Generate code to write the results of the select into a temporary
drh4794b982000-06-06 13:54:14 +0000215 ** table. The cursor number of the temporary table has already
216 ** been put in iTable by sqliteExprResolveInSelect().
drhfef52082000-06-06 01:50:43 +0000217 */
drh4794b982000-06-06 13:54:14 +0000218 sqliteVdbeAddOp(v, OP_Open, pExpr->iTable, 1, 0, 0);
drhfef52082000-06-06 01:50:43 +0000219 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
220 }else if( pExpr->pList ){
221 /* Case 2: expr IN (exprlist)
222 **
223 ** Create a set to put the exprlist values in. The Set id is stored
224 ** in iTable.
225 */
226 int i, iSet;
227 for(i=0; i<pExpr->pList->nExpr; i++){
228 Expr *pE2 = pExpr->pList->a[i].pExpr;
drhfef52082000-06-06 01:50:43 +0000229 if( !isConstant(pE2) ){
230 sqliteSetString(&pParse->zErrMsg,
231 "right-hand side of IN operator must be constant", 0);
232 pParse->nErr++;
233 return 1;
234 }
drh4794b982000-06-06 13:54:14 +0000235 if( sqliteExprCheck(pParse, pE2, 0, 0) ){
236 return 1;
237 }
drhfef52082000-06-06 01:50:43 +0000238 }
239 iSet = pExpr->iTable = pParse->nSet++;
240 for(i=0; i<pExpr->pList->nExpr; i++){
241 Expr *pE2 = pExpr->pList->a[i].pExpr;
242 switch( pE2->op ){
243 case TK_FLOAT:
244 case TK_INTEGER:
245 case TK_STRING: {
246 int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
247 sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
248 sqliteVdbeDequoteP3(v, addr);
249 break;
250 }
251 default: {
252 sqliteExprCode(pParse, pE2);
253 sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0);
254 break;
255 }
256 }
257 }
258 }
drhcfab11b2000-06-06 03:31:22 +0000259 break;
drhfef52082000-06-06 01:50:43 +0000260 }
261
drh19a775c2000-06-05 18:54:46 +0000262 case TK_SELECT: {
drhfef52082000-06-06 01:50:43 +0000263 /* This has to be a scalar SELECT. Generate code to put the
264 ** value of this select in a memory cell and record the number
265 ** of the memory cell in iField.
266 */
drh19a775c2000-06-05 18:54:46 +0000267 pExpr->iField = pParse->nMem++;
drhfef52082000-06-06 01:50:43 +0000268 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iField) ){
drh19a775c2000-06-05 18:54:46 +0000269 return 1;
270 }
271 break;
272 }
273
drhcce7d172000-05-31 15:34:51 +0000274 /* For all else, just recursively walk the tree */
275 default: {
drh4794b982000-06-06 13:54:14 +0000276 if( pExpr->pLeft
277 && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
drhcce7d172000-05-31 15:34:51 +0000278 return 1;
279 }
280 if( pExpr->pRight
drh4794b982000-06-06 13:54:14 +0000281 && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){
drhcce7d172000-05-31 15:34:51 +0000282 return 1;
283 }
284 if( pExpr->pList ){
285 int i;
286 ExprList *pList = pExpr->pList;
287 for(i=0; i<pList->nExpr; i++){
288 if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){
289 return 1;
290 }
291 }
292 }
293 }
294 }
295 return 0;
296}
297
298#if 0 /* NOT USED */
299/*
300** Compare a token against a string. Return TRUE if they match.
301*/
302static int sqliteTokenCmp(Token *pToken, const char *zStr){
303 int n = strlen(zStr);
304 if( n!=pToken->n ) return 0;
305 return sqliteStrNICmp(pToken->z, zStr, n)==0;
306}
307#endif
308
309/*
310** Convert a function name into its integer identifier. Return the
311** identifier. Return FN_Unknown if the function name is unknown.
312*/
313int sqliteFuncId(Token *pToken){
314 static const struct {
315 char *zName;
316 int len;
317 int id;
318 } aFunc[] = {
319 { "count", 5, FN_Count },
320 { "min", 3, FN_Min },
321 { "max", 3, FN_Max },
322 { "sum", 3, FN_Sum },
drh22827922000-06-06 17:27:05 +0000323 { "avg", 3, FN_Avg },
drh0bdaf622000-06-11 23:50:13 +0000324 { "fcnt", 4, FN_Fcnt }, /* Used for testing only */
drhcce7d172000-05-31 15:34:51 +0000325 };
326 int i;
327 for(i=0; i<ArraySize(aFunc); i++){
328 if( aFunc[i].len==pToken->n
329 && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
330 return aFunc[i].id;
331 }
332 }
333 return FN_Unknown;
334}
335
336/*
337** Error check the functions in an expression. Make sure all
338** function names are recognized and all functions have the correct
339** number of arguments. Leave an error message in pParse->zErrMsg
340** if anything is amiss. Return the number of errors.
341**
342** if pIsAgg is not null and this expression is an aggregate function
343** (like count(*) or max(value)) then write a 1 into *pIsAgg.
344*/
345int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
346 int nErr = 0;
347 if( pExpr==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000348 switch( pExpr->op ){
349 case TK_FUNCTION: {
350 int id = sqliteFuncId(&pExpr->token);
351 int n = pExpr->pList ? pExpr->pList->nExpr : 0;
352 int no_such_func = 0;
353 int too_many_args = 0;
354 int too_few_args = 0;
355 int is_agg = 0;
356 int i;
drh22827922000-06-06 17:27:05 +0000357 pExpr->iField = id;
drhcce7d172000-05-31 15:34:51 +0000358 switch( id ){
359 case FN_Unknown: {
360 no_such_func = 1;
361 break;
362 }
363 case FN_Count: {
364 no_such_func = !allowAgg;
365 too_many_args = n>1;
366 is_agg = 1;
367 break;
368 }
369 case FN_Max:
370 case FN_Min: {
371 too_few_args = allowAgg ? n<1 : n<2;
372 is_agg = n==1;
373 break;
374 }
drh22827922000-06-06 17:27:05 +0000375 case FN_Avg:
drhcce7d172000-05-31 15:34:51 +0000376 case FN_Sum: {
377 no_such_func = !allowAgg;
378 too_many_args = n>1;
379 too_few_args = n<1;
380 is_agg = 1;
381 break;
382 }
drh0bdaf622000-06-11 23:50:13 +0000383 /* The "fcnt(*)" function always returns the number of fetch
384 ** operations that have occurred so far while processing the
385 ** SQL statement. This information can be used by test procedures
386 ** to verify that indices are being used properly to minimize
387 ** searching. All arguments to fcnt() are ignored. fcnt() has
388 ** no use (other than testing) that we are aware of.
389 */
390 case FN_Fcnt: {
391 n = 0;
392 break;
393 }
drhcce7d172000-05-31 15:34:51 +0000394 default: break;
395 }
396 if( no_such_func ){
397 sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
398 pExpr->token.z, pExpr->token.n, 0);
399 pParse->nErr++;
400 nErr++;
401 }else if( too_many_args ){
402 sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
403 pExpr->token.z, pExpr->token.n, "()", 2, 0);
404 pParse->nErr++;
405 nErr++;
406 }else if( too_few_args ){
407 sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
408 pExpr->token.z, pExpr->token.n, "()", 2, 0);
409 pParse->nErr++;
410 nErr++;
411 }
drh22827922000-06-06 17:27:05 +0000412 if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
drhcce7d172000-05-31 15:34:51 +0000413 if( is_agg && pIsAgg ) *pIsAgg = 1;
414 for(i=0; nErr==0 && i<n; i++){
drh4cfa7932000-06-08 15:10:46 +0000415 nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
416 allowAgg && !is_agg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000417 }
418 }
419 default: {
420 if( pExpr->pLeft ){
drh22827922000-06-06 17:27:05 +0000421 nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000422 }
423 if( nErr==0 && pExpr->pRight ){
drh22827922000-06-06 17:27:05 +0000424 nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000425 }
drhfef52082000-06-06 01:50:43 +0000426 if( nErr==0 && pExpr->pList ){
427 int n = pExpr->pList->nExpr;
428 int i;
429 for(i=0; nErr==0 && i<n; i++){
drh22827922000-06-06 17:27:05 +0000430 Expr *pE2 = pExpr->pList->a[i].pExpr;
431 nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
drhfef52082000-06-06 01:50:43 +0000432 }
433 }
drhcce7d172000-05-31 15:34:51 +0000434 break;
435 }
436 }
437 return nErr;
438}
439
440/*
441** Generate code into the current Vdbe to evaluate the given
442** expression and leave the result on the stack.
443*/
444void sqliteExprCode(Parse *pParse, Expr *pExpr){
445 Vdbe *v = pParse->pVdbe;
446 int op;
447 switch( pExpr->op ){
448 case TK_PLUS: op = OP_Add; break;
449 case TK_MINUS: op = OP_Subtract; break;
450 case TK_STAR: op = OP_Multiply; break;
451 case TK_SLASH: op = OP_Divide; break;
452 case TK_AND: op = OP_And; break;
453 case TK_OR: op = OP_Or; break;
454 case TK_LT: op = OP_Lt; break;
455 case TK_LE: op = OP_Le; break;
456 case TK_GT: op = OP_Gt; break;
457 case TK_GE: op = OP_Ge; break;
458 case TK_NE: op = OP_Ne; break;
459 case TK_EQ: op = OP_Eq; break;
460 case TK_LIKE: op = OP_Like; break;
461 case TK_GLOB: op = OP_Glob; break;
462 case TK_ISNULL: op = OP_IsNull; break;
463 case TK_NOTNULL: op = OP_NotNull; break;
464 case TK_NOT: op = OP_Not; break;
465 case TK_UMINUS: op = OP_Negative; break;
466 default: break;
467 }
468 switch( pExpr->op ){
469 case TK_FIELD: {
drh22827922000-06-06 17:27:05 +0000470 if( pParse->useAgg ){
471 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
472 }else{
473 sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iField, 0, 0);
474 }
drhcce7d172000-05-31 15:34:51 +0000475 break;
476 }
477 case TK_INTEGER: {
478 int i = atoi(pExpr->token.z);
479 sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0);
480 break;
481 }
482 case TK_FLOAT: {
483 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
484 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
485 break;
486 }
487 case TK_STRING: {
488 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0);
489 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
490 sqliteVdbeDequoteP3(v, addr);
491 break;
492 }
493 case TK_NULL: {
drhc61053b2000-06-04 12:58:36 +0000494 sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000495 break;
496 }
497 case TK_AND:
498 case TK_OR:
499 case TK_PLUS:
500 case TK_STAR:
501 case TK_MINUS:
502 case TK_SLASH: {
503 sqliteExprCode(pParse, pExpr->pLeft);
504 sqliteExprCode(pParse, pExpr->pRight);
505 sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
506 break;
507 }
drh00400772000-06-16 20:51:26 +0000508 case TK_CONCAT: {
509 sqliteExprCode(pParse, pExpr->pLeft);
510 sqliteExprCode(pParse, pExpr->pRight);
511 sqliteVdbeAddOp(v, OP_Concat, 2, 0, 0, 0);
512 break;
513 }
drhcce7d172000-05-31 15:34:51 +0000514 case TK_LT:
515 case TK_LE:
516 case TK_GT:
517 case TK_GE:
518 case TK_NE:
519 case TK_EQ:
520 case TK_LIKE:
521 case TK_GLOB: {
522 int dest;
523 sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
524 sqliteExprCode(pParse, pExpr->pLeft);
525 sqliteExprCode(pParse, pExpr->pRight);
526 dest = sqliteVdbeCurrentAddr(v) + 2;
527 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
528 sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
529 break;
530 }
drhcce7d172000-05-31 15:34:51 +0000531 case TK_UMINUS: {
drh6e142f52000-06-08 13:36:40 +0000532 assert( pExpr->pLeft );
533 if( pExpr->pLeft->op==TK_INTEGER ){
534 int i = atoi(pExpr->pLeft->token.z);
535 sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0);
536 break;
537 }else if( pExpr->pLeft->op==TK_FLOAT ){
538 Token *p = &pExpr->pLeft->token;
539 char *z = sqliteMalloc( p->n + 2 );
540 sprintf(z, "-%.*s", p->n, p->z);
541 sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0);
542 sqliteFree(z);
543 break;
544 }
545 /* Fall true into TK_NOT */
546 }
547 case TK_NOT: {
drhcce7d172000-05-31 15:34:51 +0000548 sqliteExprCode(pParse, pExpr->pLeft);
549 sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
550 break;
551 }
552 case TK_ISNULL:
553 case TK_NOTNULL: {
554 int dest;
drh8be51132000-06-03 19:19:41 +0000555 sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000556 sqliteExprCode(pParse, pExpr->pLeft);
557 dest = sqliteVdbeCurrentAddr(v) + 2;
558 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
drh8be51132000-06-03 19:19:41 +0000559 sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000560 break;
561 }
drh22827922000-06-06 17:27:05 +0000562 case TK_AGG_FUNCTION: {
563 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0);
564 if( pExpr->iField==FN_Avg ){
565 assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
566 sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0);
567 sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0);
568 }
569 break;
570 }
drhcce7d172000-05-31 15:34:51 +0000571 case TK_FUNCTION: {
drh22827922000-06-06 17:27:05 +0000572 int id = pExpr->iField;
drhcce7d172000-05-31 15:34:51 +0000573 int op;
574 int i;
575 ExprList *pList = pExpr->pList;
drh0bdaf622000-06-11 23:50:13 +0000576 if( id==FN_Fcnt ){
577 sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0);
578 break;
579 }
drhcce7d172000-05-31 15:34:51 +0000580 op = id==FN_Min ? OP_Min : OP_Max;
581 for(i=0; i<pList->nExpr; i++){
582 sqliteExprCode(pParse, pList->a[i].pExpr);
583 if( i>0 ){
584 sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
585 }
586 }
587 break;
588 }
drh19a775c2000-06-05 18:54:46 +0000589 case TK_SELECT: {
590 sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iField, 0, 0, 0);
591 break;
592 }
drhfef52082000-06-06 01:50:43 +0000593 case TK_IN: {
594 int addr;
drh4794b982000-06-06 13:54:14 +0000595 sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0);
drhfef52082000-06-06 01:50:43 +0000596 sqliteExprCode(pParse, pExpr->pLeft);
597 addr = sqliteVdbeCurrentAddr(v);
598 if( pExpr->pSelect ){
599 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0);
600 }else{
601 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0);
602 }
drh4794b982000-06-06 13:54:14 +0000603 sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
drhfef52082000-06-06 01:50:43 +0000604 break;
605 }
606 case TK_BETWEEN: {
607 int lbl = sqliteVdbeMakeLabel(v);
608 sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
609 sqliteExprIfFalse(pParse, pExpr, lbl);
610 sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0);
611 sqliteVdbeResolveLabel(v, lbl);
612 break;
613 }
drhcce7d172000-05-31 15:34:51 +0000614 }
615 return;
616}
617
618/*
619** Generate code for a boolean expression such that a jump is made
620** to the label "dest" if the expression is true but execution
621** continues straight thru if the expression is false.
622*/
623void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
624 Vdbe *v = pParse->pVdbe;
625 int op = 0;
626 switch( pExpr->op ){
627 case TK_LT: op = OP_Lt; break;
628 case TK_LE: op = OP_Le; break;
629 case TK_GT: op = OP_Gt; break;
630 case TK_GE: op = OP_Ge; break;
631 case TK_NE: op = OP_Ne; break;
632 case TK_EQ: op = OP_Eq; break;
633 case TK_LIKE: op = OP_Like; break;
634 case TK_GLOB: op = OP_Glob; break;
635 case TK_ISNULL: op = OP_IsNull; break;
636 case TK_NOTNULL: op = OP_NotNull; break;
637 default: break;
638 }
639 switch( pExpr->op ){
640 case TK_AND: {
641 int d2 = sqliteVdbeMakeLabel(v);
642 sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
643 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
644 sqliteVdbeResolveLabel(v, d2);
645 break;
646 }
647 case TK_OR: {
648 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
649 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
650 break;
651 }
652 case TK_NOT: {
653 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
654 break;
655 }
656 case TK_LT:
657 case TK_LE:
658 case TK_GT:
659 case TK_GE:
660 case TK_NE:
661 case TK_EQ:
662 case TK_LIKE:
663 case TK_GLOB: {
664 sqliteExprCode(pParse, pExpr->pLeft);
665 sqliteExprCode(pParse, pExpr->pRight);
666 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
667 break;
668 }
669 case TK_ISNULL:
670 case TK_NOTNULL: {
671 sqliteExprCode(pParse, pExpr->pLeft);
672 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
673 break;
674 }
drhfef52082000-06-06 01:50:43 +0000675 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000676 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000677 if( pExpr->pSelect ){
678 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0);
679 }else{
680 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0);
681 }
682 break;
683 }
684 case TK_BETWEEN: {
685 int lbl = sqliteVdbeMakeLabel(v);
686 sqliteExprCode(pParse, pExpr->pLeft);
687 sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
688 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
689 sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0);
690 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
691 sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0);
692 sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0);
693 sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl);
694 break;
695 }
drhcce7d172000-05-31 15:34:51 +0000696 default: {
697 sqliteExprCode(pParse, pExpr);
698 sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
699 break;
700 }
701 }
702}
703
704/*
705** Generate code for boolean expression such that a jump is made
706** to the label "dest" if the expression is false but execution
707** continues straight thru if the expression is true.
708*/
709void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
710 Vdbe *v = pParse->pVdbe;
711 int op = 0;
712 switch( pExpr->op ){
713 case TK_LT: op = OP_Ge; break;
714 case TK_LE: op = OP_Gt; break;
715 case TK_GT: op = OP_Le; break;
716 case TK_GE: op = OP_Lt; break;
717 case TK_NE: op = OP_Eq; break;
718 case TK_EQ: op = OP_Ne; break;
719 case TK_LIKE: op = OP_Like; break;
720 case TK_GLOB: op = OP_Glob; break;
721 case TK_ISNULL: op = OP_NotNull; break;
722 case TK_NOTNULL: op = OP_IsNull; break;
723 default: break;
724 }
725 switch( pExpr->op ){
726 case TK_AND: {
727 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
728 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
729 break;
730 }
731 case TK_OR: {
732 int d2 = sqliteVdbeMakeLabel(v);
733 sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
734 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
735 sqliteVdbeResolveLabel(v, d2);
736 break;
737 }
738 case TK_NOT: {
739 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
740 break;
741 }
742 case TK_LT:
743 case TK_LE:
744 case TK_GT:
745 case TK_GE:
746 case TK_NE:
747 case TK_EQ: {
748 sqliteExprCode(pParse, pExpr->pLeft);
749 sqliteExprCode(pParse, pExpr->pRight);
750 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
751 break;
752 }
753 case TK_LIKE:
754 case TK_GLOB: {
755 sqliteExprCode(pParse, pExpr->pLeft);
756 sqliteExprCode(pParse, pExpr->pRight);
757 sqliteVdbeAddOp(v, op, 1, dest, 0, 0);
758 break;
759 }
760 case TK_ISNULL:
761 case TK_NOTNULL: {
762 sqliteExprCode(pParse, pExpr->pLeft);
763 sqliteVdbeAddOp(v, op, 0, dest, 0, 0);
764 break;
765 }
drhfef52082000-06-06 01:50:43 +0000766 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000767 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000768 if( pExpr->pSelect ){
769 sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0);
770 }else{
771 sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0);
772 }
773 break;
774 }
775 case TK_BETWEEN: {
776 int addr;
777 sqliteExprCode(pParse, pExpr->pLeft);
778 sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0);
779 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
780 addr = sqliteVdbeCurrentAddr(v);
781 sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0);
782 sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0);
783 sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0);
784 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
785 sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0);
786 break;
787 }
drhcce7d172000-05-31 15:34:51 +0000788 default: {
789 sqliteExprCode(pParse, pExpr);
790 sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0);
791 sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0);
792 break;
793 }
794 }
795}
drh22827922000-06-06 17:27:05 +0000796
797/*
798** Do a deep comparison of two expression trees. Return TRUE (non-zero)
799** if they are identical and return FALSE if they differ in any way.
800*/
drhd8bc7082000-06-07 23:51:50 +0000801int sqliteExprCompare(Expr *pA, Expr *pB){
drh22827922000-06-06 17:27:05 +0000802 int i;
803 if( pA==0 ){
804 return pB==0;
805 }else if( pB==0 ){
806 return 0;
807 }
808 if( pA->op!=pB->op ) return 0;
drhd8bc7082000-06-07 23:51:50 +0000809 if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
810 if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
drh22827922000-06-06 17:27:05 +0000811 if( pA->pList ){
812 if( pB->pList==0 ) return 0;
813 if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
814 for(i=0; i<pA->pList->nExpr; i++){
drhd8bc7082000-06-07 23:51:50 +0000815 if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
drh22827922000-06-06 17:27:05 +0000816 return 0;
817 }
818 }
819 }else if( pB->pList ){
820 return 0;
821 }
822 if( pA->pSelect || pB->pSelect ) return 0;
823 if( pA->token.z ){
824 if( pB->token.z==0 ) return 0;
825 if( pB->token.n!=pA->token.n ) return 0;
826 if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
827 }
828 return 1;
829}
830
831/*
832** Add a new element to the pParse->aAgg[] array and return its index.
833*/
834static int appendAggInfo(Parse *pParse){
835 if( (pParse->nAgg & 0x7)==0 ){
836 int amt = pParse->nAgg + 8;
837 pParse->aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
838 if( pParse->aAgg==0 ){
839 sqliteSetString(&pParse->zErrMsg, "out of memory", 0);
840 pParse->nErr++;
841 return -1;
842 }
843 }
844 memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
845 return pParse->nAgg++;
846}
847
848/*
849** Analyze the given expression looking for aggregate functions and
850** for variables that need to be added to the pParse->aAgg[] array.
851** Make additional entries to the pParse->aAgg[] array as necessary.
852**
853** This routine should only be called after the expression has been
854** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
855**
856** If errors are seen, leave an error message in zErrMsg and return
857** the number of errors.
858*/
859int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
860 int i;
861 AggExpr *aAgg;
862 int nErr = 0;
863
864 if( pExpr==0 ) return 0;
865 switch( pExpr->op ){
866 case TK_FIELD: {
867 aAgg = pParse->aAgg;
868 for(i=0; i<pParse->nAgg; i++){
869 if( aAgg[i].isAgg ) continue;
870 if( aAgg[i].pExpr->iTable==pExpr->iTable
871 && aAgg[i].pExpr->iField==pExpr->iField ){
drh22827922000-06-06 17:27:05 +0000872 break;
873 }
874 }
875 if( i>=pParse->nAgg ){
876 i = appendAggInfo(pParse);
877 if( i<0 ) return 1;
878 pParse->aAgg[i].isAgg = 0;
879 pParse->aAgg[i].pExpr = pExpr;
880 }
drhaaf88722000-06-08 11:25:00 +0000881 pExpr->iAgg = i;
drh22827922000-06-06 17:27:05 +0000882 break;
883 }
884 case TK_AGG_FUNCTION: {
885 if( pExpr->iField==FN_Count || pExpr->iField==FN_Avg ){
886 if( pParse->iAggCount>=0 ){
887 i = pParse->iAggCount;
888 }else{
889 i = appendAggInfo(pParse);
890 if( i<0 ) return 1;
891 pParse->aAgg[i].isAgg = 1;
892 pParse->aAgg[i].pExpr = 0;
893 pParse->iAggCount = i;
894 }
895 if( pExpr->iField==FN_Count ){
896 pExpr->iAgg = i;
897 break;
898 }
899 }
900 aAgg = pParse->aAgg;
901 for(i=0; i<pParse->nAgg; i++){
902 if( !aAgg[i].isAgg ) continue;
drhd8bc7082000-06-07 23:51:50 +0000903 if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
drh22827922000-06-06 17:27:05 +0000904 break;
905 }
906 }
907 if( i>=pParse->nAgg ){
908 i = appendAggInfo(pParse);
909 if( i<0 ) return 1;
910 pParse->aAgg[i].isAgg = 1;
911 pParse->aAgg[i].pExpr = pExpr;
912 }
913 pExpr->iAgg = i;
914 break;
915 }
916 default: {
917 if( pExpr->pLeft ){
918 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
919 }
920 if( nErr==0 && pExpr->pRight ){
921 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
922 }
923 if( nErr==0 && pExpr->pList ){
924 int n = pExpr->pList->nExpr;
925 int i;
926 for(i=0; nErr==0 && i<n; i++){
927 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
928 }
929 }
930 break;
931 }
932 }
933 return nErr;
934}