blob: 0a0113886bdc34b129e9e0fd0cdb37007350d1f6 [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**
drha2e00042002-01-22 03:13:42 +000015** $Id: expr.c,v 1.38 2002/01/22 03:13:42 drh Exp $
drhcce7d172000-05-31 15:34:51 +000016*/
17#include "sqliteInt.h"
18
drha2e00042002-01-22 03:13:42 +000019
20/*
21** Recursively delete an expression tree.
22*/
23void sqliteExprDelete(Expr *p){
24 if( p==0 ) return;
25 if( p->op!=TK_AS ){
26 if( p->pLeft ) sqliteExprDelete(p->pLeft);
27 if( p->pRight ) sqliteExprDelete(p->pRight);
28 }
29 if( p->pList ) sqliteExprListDelete(p->pList);
30 if( p->pSelect ) sqliteSelectDelete(p->pSelect);
31 sqliteFree(p);
32}
33
drhcce7d172000-05-31 15:34:51 +000034/*
drhfef52082000-06-06 01:50:43 +000035** Walk an expression tree. Return 1 if the expression is constant
36** and 0 if it involves variables.
37*/
38static int isConstant(Expr *p){
39 switch( p->op ){
40 case TK_ID:
drh967e8b72000-06-21 13:59:10 +000041 case TK_COLUMN:
drhfef52082000-06-06 01:50:43 +000042 case TK_DOT:
43 return 0;
44 default: {
45 if( p->pLeft && !isConstant(p->pLeft) ) return 0;
46 if( p->pRight && !isConstant(p->pRight) ) return 0;
47 if( p->pList ){
48 int i;
49 for(i=0; i<p->pList->nExpr; i++){
50 if( !isConstant(p->pList->a[i].pExpr) ) return 0;
51 }
52 }
53 break;
54 }
55 }
56 return 1;
57}
58
59/*
drh4794b982000-06-06 13:54:14 +000060** Walk the expression tree and process operators of the form:
61**
62** expr IN (SELECT ...)
63**
drh967e8b72000-06-21 13:59:10 +000064** These operators have to be processed before column names are
drh4794b982000-06-06 13:54:14 +000065** resolved because each such operator increments pParse->nTab
drh1ccde152000-06-17 13:12:39 +000066** to reserve cursor numbers for its own use. But pParse->nTab
drhaacc5432002-01-06 17:07:40 +000067** needs to be constant once we begin resolving column names. For
68** that reason, this procedure needs to be called on every expression
69** before sqliteExprResolveIds() is called on any expression.
drh4794b982000-06-06 13:54:14 +000070**
71** Actually, the processing of IN-SELECT is only started by this
72** routine. This routine allocates a cursor number to the IN-SELECT
73** and then moves on. The code generation is done by
74** sqliteExprResolveIds() which must be called afterwards.
75*/
76void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
77 if( pExpr==0 ) return;
78 if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
79 pExpr->iTable = pParse->nTab++;
80 }else{
81 if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
82 if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
83 if( pExpr->pList ){
84 int i;
85 ExprList *pList = pExpr->pList;
86 for(i=0; i<pList->nExpr; i++){
87 sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
88 }
89 }
90 }
91}
92
93/*
drhc4a3c772001-04-04 11:48:57 +000094** Return TRUE if the given string is a row-id column name.
95*/
96static int sqliteIsRowid(const char *z){
97 if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
98 if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
99 if( sqliteStrICmp(z, "OID")==0 ) return 1;
100 return 0;
101}
102
103/*
drhcce7d172000-05-31 15:34:51 +0000104** This routine walks an expression tree and resolves references to
drh967e8b72000-06-21 13:59:10 +0000105** table columns. Nodes of the form ID.ID or ID resolve into an
drhaacc5432002-01-06 17:07:40 +0000106** index to the table in the table list and a column offset. The
107** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable
108** value is changed to the index of the referenced table in pTabList
109** plus the pParse->nTab value. This value will ultimately become the
110** VDBE cursor number for a cursor that is pointing into the referenced
111** table. The Expr.iColumn value is changed to the index of the column
112** of the referenced table. The Expr.iColumn value for the special
113** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an
114** alias for ROWID.
drh19a775c2000-06-05 18:54:46 +0000115**
drhfef52082000-06-06 01:50:43 +0000116** We also check for instances of the IN operator. IN comes in two
117** forms:
118**
119** expr IN (exprlist)
120** and
121** expr IN (SELECT ...)
122**
123** The first form is handled by creating a set holding the list
124** of allowed values. The second form causes the SELECT to generate
125** a temporary table.
126**
127** This routine also looks for scalar SELECTs that are part of an expression.
drh19a775c2000-06-05 18:54:46 +0000128** If it finds any, it generates code to write the value of that select
129** into a memory cell.
drhcce7d172000-05-31 15:34:51 +0000130**
drh967e8b72000-06-21 13:59:10 +0000131** Unknown columns or tables provoke an error. The function returns
drhcce7d172000-05-31 15:34:51 +0000132** the number of errors seen and leaves an error message on pParse->zErrMsg.
133*/
drha2e00042002-01-22 03:13:42 +0000134int sqliteExprResolveIds(
135 Parse *pParse, /* The parser context */
136 IdList *pTabList, /* List of tables used to resolve column names */
137 ExprList *pEList, /* List of expressions used to resolve "AS" */
138 Expr *pExpr /* The expression to be analyzed. */
139){
drhdaffd0e2001-04-11 14:28:42 +0000140 if( pExpr==0 || pTabList==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000141 switch( pExpr->op ){
drha2e00042002-01-22 03:13:42 +0000142 /* A lone identifier. Try and match it as follows:
143 **
144 ** 1. To the name of a column of one of the tables in pTabList
145 **
146 ** 2. To the right side of an AS keyword in the column list of
147 ** a SELECT statement. (For example, match against 'x' in
148 ** "SELECT a+b AS 'x' FROM t1".)
149 **
150 ** 3. One of the special names "ROWID", "OID", or "_ROWID_".
151 */
drhcce7d172000-05-31 15:34:51 +0000152 case TK_ID: {
drhc4a3c772001-04-04 11:48:57 +0000153 int cnt = 0; /* Number of matches */
154 int i; /* Loop counter */
drh6e142f52000-06-08 13:36:40 +0000155 char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
drhdaffd0e2001-04-11 14:28:42 +0000156 if( z==0 ) return 1;
drhcce7d172000-05-31 15:34:51 +0000157 for(i=0; i<pTabList->nId; i++){
158 int j;
159 Table *pTab = pTabList->a[i].pTab;
160 if( pTab==0 ) continue;
161 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000162 if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
drhcce7d172000-05-31 15:34:51 +0000163 cnt++;
drh19a775c2000-06-05 18:54:46 +0000164 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000165 if( j==pTab->iPKey ){
166 /* Substitute the record number for the INTEGER PRIMARY KEY */
167 pExpr->iColumn = -1;
168 }else{
169 pExpr->iColumn = j;
170 }
drha2e00042002-01-22 03:13:42 +0000171 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000172 }
173 }
174 }
drha2e00042002-01-22 03:13:42 +0000175 if( cnt==0 && pEList!=0 ){
176 int j;
177 for(j=0; j<pEList->nExpr; j++){
178 char *zAs = pEList->a[j].zName;
179 if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
180 cnt++;
181 assert( pExpr->pLeft==0 && pExpr->pRight==0 );
182 pExpr->op = TK_AS;
183 pExpr->iColumn = j;
184 pExpr->pLeft = pEList->a[j].pExpr;
185 }
186 }
187 }
drhc4a3c772001-04-04 11:48:57 +0000188 if( cnt==0 && sqliteIsRowid(z) ){
189 pExpr->iColumn = -1;
190 pExpr->iTable = pParse->nTab;
191 cnt = 1 + (pTabList->nId>1);
drha2e00042002-01-22 03:13:42 +0000192 pExpr->op = TK_COLUMN;
drhc4a3c772001-04-04 11:48:57 +0000193 }
drhcce7d172000-05-31 15:34:51 +0000194 sqliteFree(z);
195 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000196 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000197 pExpr->token.z, pExpr->token.n, 0);
198 pParse->nErr++;
199 return 1;
200 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000201 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000202 pExpr->token.z, pExpr->token.n, 0);
203 pParse->nErr++;
204 return 1;
205 }
drhcce7d172000-05-31 15:34:51 +0000206 break;
207 }
208
drh967e8b72000-06-21 13:59:10 +0000209 /* A table name and column name: ID.ID */
drhcce7d172000-05-31 15:34:51 +0000210 case TK_DOT: {
drhbed86902000-06-02 13:27:59 +0000211 int cnt = 0; /* Number of matches */
drhc4a3c772001-04-04 11:48:57 +0000212 int cntTab = 0; /* Number of matching tables */
drhbed86902000-06-02 13:27:59 +0000213 int i; /* Loop counter */
drhcce7d172000-05-31 15:34:51 +0000214 Expr *pLeft, *pRight; /* Left and right subbranches of the expr */
drhcce7d172000-05-31 15:34:51 +0000215 char *zLeft, *zRight; /* Text of an identifier */
216
217 pLeft = pExpr->pLeft;
218 pRight = pExpr->pRight;
219 assert( pLeft && pLeft->op==TK_ID );
220 assert( pRight && pRight->op==TK_ID );
drh6e142f52000-06-08 13:36:40 +0000221 zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
222 zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
drhdaffd0e2001-04-11 14:28:42 +0000223 if( zLeft==0 || zRight==0 ){
224 sqliteFree(zLeft);
225 sqliteFree(zRight);
226 return 1;
227 }
drh87c40e82001-07-23 14:33:02 +0000228 sqliteDequote(zLeft);
229 sqliteDequote(zRight);
drhc4a3c772001-04-04 11:48:57 +0000230 pExpr->iTable = -1;
drhcce7d172000-05-31 15:34:51 +0000231 for(i=0; i<pTabList->nId; i++){
232 int j;
233 char *zTab;
234 Table *pTab = pTabList->a[i].pTab;
235 if( pTab==0 ) continue;
236 if( pTabList->a[i].zAlias ){
237 zTab = pTabList->a[i].zAlias;
238 }else{
239 zTab = pTab->zName;
240 }
241 if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
drhc4a3c772001-04-04 11:48:57 +0000242 if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000243 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000244 if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
drhcce7d172000-05-31 15:34:51 +0000245 cnt++;
drh19a775c2000-06-05 18:54:46 +0000246 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000247 if( j==pTab->iPKey ){
248 /* Substitute the record number for the INTEGER PRIMARY KEY */
249 pExpr->iColumn = -1;
250 }else{
251 pExpr->iColumn = j;
252 }
drhcce7d172000-05-31 15:34:51 +0000253 }
254 }
255 }
drhc4a3c772001-04-04 11:48:57 +0000256 if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
257 cnt = 1;
258 pExpr->iColumn = -1;
259 }
drhcce7d172000-05-31 15:34:51 +0000260 sqliteFree(zLeft);
261 sqliteFree(zRight);
262 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000263 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000264 pLeft->token.z, pLeft->token.n, ".", 1,
265 pRight->token.z, pRight->token.n, 0);
266 pParse->nErr++;
267 return 1;
268 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000269 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000270 pLeft->token.z, pLeft->token.n, ".", 1,
271 pRight->token.z, pRight->token.n, 0);
272 pParse->nErr++;
273 return 1;
274 }
275 sqliteExprDelete(pLeft);
276 pExpr->pLeft = 0;
277 sqliteExprDelete(pRight);
278 pExpr->pRight = 0;
drh967e8b72000-06-21 13:59:10 +0000279 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000280 break;
281 }
282
drhfef52082000-06-06 01:50:43 +0000283 case TK_IN: {
drhd8bc7082000-06-07 23:51:50 +0000284 Vdbe *v = sqliteGetVdbe(pParse);
drhfef52082000-06-06 01:50:43 +0000285 if( v==0 ) return 1;
drha2e00042002-01-22 03:13:42 +0000286 if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
drhcfab11b2000-06-06 03:31:22 +0000287 return 1;
288 }
drhfef52082000-06-06 01:50:43 +0000289 if( pExpr->pSelect ){
290 /* Case 1: expr IN (SELECT ...)
291 **
292 ** Generate code to write the results of the select into a temporary
drh4794b982000-06-06 13:54:14 +0000293 ** table. The cursor number of the temporary table has already
294 ** been put in iTable by sqliteExprResolveInSelect().
drhfef52082000-06-06 01:50:43 +0000295 */
drhc6b52df2002-01-04 03:09:29 +0000296 sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
drhfef52082000-06-06 01:50:43 +0000297 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
298 }else if( pExpr->pList ){
299 /* Case 2: expr IN (exprlist)
300 **
301 ** Create a set to put the exprlist values in. The Set id is stored
302 ** in iTable.
303 */
304 int i, iSet;
305 for(i=0; i<pExpr->pList->nExpr; i++){
306 Expr *pE2 = pExpr->pList->a[i].pExpr;
drhfef52082000-06-06 01:50:43 +0000307 if( !isConstant(pE2) ){
308 sqliteSetString(&pParse->zErrMsg,
309 "right-hand side of IN operator must be constant", 0);
310 pParse->nErr++;
311 return 1;
312 }
drh4794b982000-06-06 13:54:14 +0000313 if( sqliteExprCheck(pParse, pE2, 0, 0) ){
314 return 1;
315 }
drhfef52082000-06-06 01:50:43 +0000316 }
317 iSet = pExpr->iTable = pParse->nSet++;
318 for(i=0; i<pExpr->pList->nExpr; i++){
319 Expr *pE2 = pExpr->pList->a[i].pExpr;
320 switch( pE2->op ){
321 case TK_FLOAT:
322 case TK_INTEGER:
323 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000324 int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000325 sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
326 sqliteVdbeDequoteP3(v, addr);
327 break;
328 }
329 default: {
330 sqliteExprCode(pParse, pE2);
drh99fcd712001-10-13 01:06:47 +0000331 sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000332 break;
333 }
334 }
335 }
336 }
drhcfab11b2000-06-06 03:31:22 +0000337 break;
drhfef52082000-06-06 01:50:43 +0000338 }
339
drh19a775c2000-06-05 18:54:46 +0000340 case TK_SELECT: {
drhfef52082000-06-06 01:50:43 +0000341 /* This has to be a scalar SELECT. Generate code to put the
342 ** value of this select in a memory cell and record the number
drh967e8b72000-06-21 13:59:10 +0000343 ** of the memory cell in iColumn.
drhfef52082000-06-06 01:50:43 +0000344 */
drh967e8b72000-06-21 13:59:10 +0000345 pExpr->iColumn = pParse->nMem++;
346 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
drh19a775c2000-06-05 18:54:46 +0000347 return 1;
348 }
349 break;
350 }
351
drhcce7d172000-05-31 15:34:51 +0000352 /* For all else, just recursively walk the tree */
353 default: {
drh4794b982000-06-06 13:54:14 +0000354 if( pExpr->pLeft
drha2e00042002-01-22 03:13:42 +0000355 && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
drhcce7d172000-05-31 15:34:51 +0000356 return 1;
357 }
358 if( pExpr->pRight
drha2e00042002-01-22 03:13:42 +0000359 && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){
drhcce7d172000-05-31 15:34:51 +0000360 return 1;
361 }
362 if( pExpr->pList ){
363 int i;
364 ExprList *pList = pExpr->pList;
365 for(i=0; i<pList->nExpr; i++){
drha2e00042002-01-22 03:13:42 +0000366 if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){
drhcce7d172000-05-31 15:34:51 +0000367 return 1;
368 }
369 }
370 }
371 }
372 }
373 return 0;
374}
375
376#if 0 /* NOT USED */
377/*
378** Compare a token against a string. Return TRUE if they match.
379*/
380static int sqliteTokenCmp(Token *pToken, const char *zStr){
381 int n = strlen(zStr);
382 if( n!=pToken->n ) return 0;
383 return sqliteStrNICmp(pToken->z, zStr, n)==0;
384}
385#endif
386
387/*
388** Convert a function name into its integer identifier. Return the
389** identifier. Return FN_Unknown if the function name is unknown.
390*/
391int sqliteFuncId(Token *pToken){
392 static const struct {
393 char *zName;
394 int len;
395 int id;
396 } aFunc[] = {
drhbf4133c2001-10-13 02:59:08 +0000397 { "count", 5, FN_Count },
398 { "min", 3, FN_Min },
399 { "max", 3, FN_Max },
400 { "sum", 3, FN_Sum },
401 { "avg", 3, FN_Avg },
drhbf4133c2001-10-13 02:59:08 +0000402 { "length", 6, FN_Length },
403 { "substr", 6, FN_Substr },
404 { "abs", 3, FN_Abs },
405 { "round", 5, FN_Round },
drhcce7d172000-05-31 15:34:51 +0000406 };
407 int i;
408 for(i=0; i<ArraySize(aFunc); i++){
409 if( aFunc[i].len==pToken->n
410 && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
411 return aFunc[i].id;
412 }
413 }
414 return FN_Unknown;
415}
416
417/*
418** Error check the functions in an expression. Make sure all
419** function names are recognized and all functions have the correct
420** number of arguments. Leave an error message in pParse->zErrMsg
421** if anything is amiss. Return the number of errors.
422**
423** if pIsAgg is not null and this expression is an aggregate function
424** (like count(*) or max(value)) then write a 1 into *pIsAgg.
425*/
426int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
427 int nErr = 0;
428 if( pExpr==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000429 switch( pExpr->op ){
430 case TK_FUNCTION: {
431 int id = sqliteFuncId(&pExpr->token);
432 int n = pExpr->pList ? pExpr->pList->nExpr : 0;
433 int no_such_func = 0;
434 int too_many_args = 0;
435 int too_few_args = 0;
436 int is_agg = 0;
437 int i;
drh967e8b72000-06-21 13:59:10 +0000438 pExpr->iColumn = id;
drhcce7d172000-05-31 15:34:51 +0000439 switch( id ){
440 case FN_Unknown: {
441 no_such_func = 1;
442 break;
443 }
444 case FN_Count: {
445 no_such_func = !allowAgg;
446 too_many_args = n>1;
447 is_agg = 1;
448 break;
449 }
450 case FN_Max:
451 case FN_Min: {
452 too_few_args = allowAgg ? n<1 : n<2;
453 is_agg = n==1;
454 break;
455 }
drh22827922000-06-06 17:27:05 +0000456 case FN_Avg:
drhcce7d172000-05-31 15:34:51 +0000457 case FN_Sum: {
458 no_such_func = !allowAgg;
459 too_many_args = n>1;
460 too_few_args = n<1;
461 is_agg = 1;
462 break;
463 }
drhbf4133c2001-10-13 02:59:08 +0000464 case FN_Abs:
drh6ec27332000-08-28 15:51:43 +0000465 case FN_Length: {
466 too_few_args = n<1;
467 too_many_args = n>1;
468 break;
469 }
drhbf4133c2001-10-13 02:59:08 +0000470 case FN_Round: {
471 too_few_args = n<1;
472 too_many_args = n>2;
473 break;
474 }
drh6ec27332000-08-28 15:51:43 +0000475 case FN_Substr: {
476 too_few_args = n<3;
477 too_many_args = n>3;
478 break;
479 }
drhcce7d172000-05-31 15:34:51 +0000480 default: break;
481 }
482 if( no_such_func ){
483 sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
484 pExpr->token.z, pExpr->token.n, 0);
485 pParse->nErr++;
486 nErr++;
487 }else if( too_many_args ){
488 sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
489 pExpr->token.z, pExpr->token.n, "()", 2, 0);
490 pParse->nErr++;
491 nErr++;
492 }else if( too_few_args ){
493 sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
494 pExpr->token.z, pExpr->token.n, "()", 2, 0);
495 pParse->nErr++;
496 nErr++;
497 }
drh22827922000-06-06 17:27:05 +0000498 if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
drhcce7d172000-05-31 15:34:51 +0000499 if( is_agg && pIsAgg ) *pIsAgg = 1;
500 for(i=0; nErr==0 && i<n; i++){
drh4cfa7932000-06-08 15:10:46 +0000501 nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
502 allowAgg && !is_agg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000503 }
504 }
505 default: {
506 if( pExpr->pLeft ){
drh22827922000-06-06 17:27:05 +0000507 nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000508 }
509 if( nErr==0 && pExpr->pRight ){
drh22827922000-06-06 17:27:05 +0000510 nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000511 }
drhfef52082000-06-06 01:50:43 +0000512 if( nErr==0 && pExpr->pList ){
513 int n = pExpr->pList->nExpr;
514 int i;
515 for(i=0; nErr==0 && i<n; i++){
drh22827922000-06-06 17:27:05 +0000516 Expr *pE2 = pExpr->pList->a[i].pExpr;
517 nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
drhfef52082000-06-06 01:50:43 +0000518 }
519 }
drhcce7d172000-05-31 15:34:51 +0000520 break;
521 }
522 }
523 return nErr;
524}
525
526/*
527** Generate code into the current Vdbe to evaluate the given
drh1ccde152000-06-17 13:12:39 +0000528** expression and leave the result on the top of stack.
drhcce7d172000-05-31 15:34:51 +0000529*/
530void sqliteExprCode(Parse *pParse, Expr *pExpr){
531 Vdbe *v = pParse->pVdbe;
532 int op;
drhdaffd0e2001-04-11 14:28:42 +0000533 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000534 switch( pExpr->op ){
535 case TK_PLUS: op = OP_Add; break;
536 case TK_MINUS: op = OP_Subtract; break;
537 case TK_STAR: op = OP_Multiply; break;
538 case TK_SLASH: op = OP_Divide; break;
539 case TK_AND: op = OP_And; break;
540 case TK_OR: op = OP_Or; break;
541 case TK_LT: op = OP_Lt; break;
542 case TK_LE: op = OP_Le; break;
543 case TK_GT: op = OP_Gt; break;
544 case TK_GE: op = OP_Ge; break;
545 case TK_NE: op = OP_Ne; break;
546 case TK_EQ: op = OP_Eq; break;
547 case TK_LIKE: op = OP_Like; break;
548 case TK_GLOB: op = OP_Glob; break;
549 case TK_ISNULL: op = OP_IsNull; break;
550 case TK_NOTNULL: op = OP_NotNull; break;
551 case TK_NOT: op = OP_Not; break;
552 case TK_UMINUS: op = OP_Negative; break;
drhbf4133c2001-10-13 02:59:08 +0000553 case TK_BITAND: op = OP_BitAnd; break;
554 case TK_BITOR: op = OP_BitOr; break;
555 case TK_BITNOT: op = OP_BitNot; break;
556 case TK_LSHIFT: op = OP_ShiftLeft; break;
557 case TK_RSHIFT: op = OP_ShiftRight; break;
558 case TK_REM: op = OP_Remainder; break;
drhcce7d172000-05-31 15:34:51 +0000559 default: break;
560 }
561 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +0000562 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +0000563 if( pParse->useAgg ){
drh99fcd712001-10-13 01:06:47 +0000564 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drhc4a3c772001-04-04 11:48:57 +0000565 }else if( pExpr->iColumn>=0 ){
drh99fcd712001-10-13 01:06:47 +0000566 sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
drhc4a3c772001-04-04 11:48:57 +0000567 }else{
drh99fcd712001-10-13 01:06:47 +0000568 sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
drh22827922000-06-06 17:27:05 +0000569 }
drhcce7d172000-05-31 15:34:51 +0000570 break;
571 }
572 case TK_INTEGER: {
drh7a7c7392001-11-24 00:31:46 +0000573 sqliteVdbeAddOp(v, OP_String, 0, 0);
574 sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
drhcce7d172000-05-31 15:34:51 +0000575 break;
576 }
577 case TK_FLOAT: {
drh99fcd712001-10-13 01:06:47 +0000578 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000579 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
580 break;
581 }
582 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000583 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000584 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
585 sqliteVdbeDequoteP3(v, addr);
586 break;
587 }
588 case TK_NULL: {
drh99fcd712001-10-13 01:06:47 +0000589 sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000590 break;
591 }
592 case TK_AND:
593 case TK_OR:
594 case TK_PLUS:
595 case TK_STAR:
596 case TK_MINUS:
drhbf4133c2001-10-13 02:59:08 +0000597 case TK_REM:
598 case TK_BITAND:
599 case TK_BITOR:
drhcce7d172000-05-31 15:34:51 +0000600 case TK_SLASH: {
601 sqliteExprCode(pParse, pExpr->pLeft);
602 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000603 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000604 break;
605 }
drhbf4133c2001-10-13 02:59:08 +0000606 case TK_LSHIFT:
607 case TK_RSHIFT: {
608 sqliteExprCode(pParse, pExpr->pRight);
609 sqliteExprCode(pParse, pExpr->pLeft);
610 sqliteVdbeAddOp(v, op, 0, 0);
611 break;
612 }
drh00400772000-06-16 20:51:26 +0000613 case TK_CONCAT: {
614 sqliteExprCode(pParse, pExpr->pLeft);
615 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000616 sqliteVdbeAddOp(v, OP_Concat, 2, 0);
drh00400772000-06-16 20:51:26 +0000617 break;
618 }
drhcce7d172000-05-31 15:34:51 +0000619 case TK_LT:
620 case TK_LE:
621 case TK_GT:
622 case TK_GE:
623 case TK_NE:
624 case TK_EQ:
625 case TK_LIKE:
626 case TK_GLOB: {
627 int dest;
drh99fcd712001-10-13 01:06:47 +0000628 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000629 sqliteExprCode(pParse, pExpr->pLeft);
630 sqliteExprCode(pParse, pExpr->pRight);
631 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000632 sqliteVdbeAddOp(v, op, 0, dest);
633 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000634 break;
635 }
drhcce7d172000-05-31 15:34:51 +0000636 case TK_UMINUS: {
drh6e142f52000-06-08 13:36:40 +0000637 assert( pExpr->pLeft );
drh7a7c7392001-11-24 00:31:46 +0000638 if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
drh6e142f52000-06-08 13:36:40 +0000639 Token *p = &pExpr->pLeft->token;
640 char *z = sqliteMalloc( p->n + 2 );
641 sprintf(z, "-%.*s", p->n, p->z);
drh99fcd712001-10-13 01:06:47 +0000642 sqliteVdbeAddOp(v, OP_String, 0, 0);
643 sqliteVdbeChangeP3(v, -1, z, p->n+1);
drh6e142f52000-06-08 13:36:40 +0000644 sqliteFree(z);
645 break;
646 }
drh1ccde152000-06-17 13:12:39 +0000647 /* Fall through into TK_NOT */
drh6e142f52000-06-08 13:36:40 +0000648 }
drhbf4133c2001-10-13 02:59:08 +0000649 case TK_BITNOT:
drh6e142f52000-06-08 13:36:40 +0000650 case TK_NOT: {
drhcce7d172000-05-31 15:34:51 +0000651 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000652 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000653 break;
654 }
655 case TK_ISNULL:
656 case TK_NOTNULL: {
657 int dest;
drh99fcd712001-10-13 01:06:47 +0000658 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000659 sqliteExprCode(pParse, pExpr->pLeft);
660 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000661 sqliteVdbeAddOp(v, op, 0, dest);
662 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000663 break;
664 }
drh22827922000-06-06 17:27:05 +0000665 case TK_AGG_FUNCTION: {
drh99fcd712001-10-13 01:06:47 +0000666 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drh967e8b72000-06-21 13:59:10 +0000667 if( pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +0000668 assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
drh99fcd712001-10-13 01:06:47 +0000669 sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
670 sqliteVdbeAddOp(v, OP_Divide, 0, 0);
drh22827922000-06-06 17:27:05 +0000671 }
672 break;
673 }
drhcce7d172000-05-31 15:34:51 +0000674 case TK_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +0000675 int id = pExpr->iColumn;
drhcce7d172000-05-31 15:34:51 +0000676 int op;
677 int i;
678 ExprList *pList = pExpr->pList;
drh6ec27332000-08-28 15:51:43 +0000679 switch( id ){
drh6ec27332000-08-28 15:51:43 +0000680 case FN_Min:
681 case FN_Max: {
682 op = id==FN_Min ? OP_Min : OP_Max;
683 for(i=0; i<pList->nExpr; i++){
684 sqliteExprCode(pParse, pList->a[i].pExpr);
685 if( i>0 ){
drh99fcd712001-10-13 01:06:47 +0000686 sqliteVdbeAddOp(v, op, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000687 }
688 }
689 break;
690 }
drhbf4133c2001-10-13 02:59:08 +0000691 case FN_Abs: {
692 sqliteExprCode(pParse, pList->a[0].pExpr);
693 sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
694 break;
695 }
696 case FN_Round: {
697 if( pList->nExpr==2 ){
698 sqliteExprCode(pParse, pList->a[1].pExpr);
699 }else{
700 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
701 }
702 sqliteExprCode(pParse, pList->a[0].pExpr);
703 sqliteVdbeAddOp(v, OP_Precision, 0, 0);
704 break;
705 }
drh6ec27332000-08-28 15:51:43 +0000706 case FN_Length: {
707 sqliteExprCode(pParse, pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000708 sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000709 break;
710 }
711 case FN_Substr: {
712 for(i=0; i<pList->nExpr; i++){
713 sqliteExprCode(pParse, pList->a[i].pExpr);
714 }
drh99fcd712001-10-13 01:06:47 +0000715 sqliteVdbeAddOp(v, OP_Substr, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000716 break;
717 }
718 default: {
719 /* Can't happen! */
720 break;
drhcce7d172000-05-31 15:34:51 +0000721 }
722 }
723 break;
724 }
drh19a775c2000-06-05 18:54:46 +0000725 case TK_SELECT: {
drh99fcd712001-10-13 01:06:47 +0000726 sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
drh19a775c2000-06-05 18:54:46 +0000727 break;
728 }
drhfef52082000-06-06 01:50:43 +0000729 case TK_IN: {
730 int addr;
drh99fcd712001-10-13 01:06:47 +0000731 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhfef52082000-06-06 01:50:43 +0000732 sqliteExprCode(pParse, pExpr->pLeft);
733 addr = sqliteVdbeCurrentAddr(v);
734 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000735 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000736 }else{
drh99fcd712001-10-13 01:06:47 +0000737 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000738 }
drh99fcd712001-10-13 01:06:47 +0000739 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhfef52082000-06-06 01:50:43 +0000740 break;
741 }
742 case TK_BETWEEN: {
743 int lbl = sqliteVdbeMakeLabel(v);
drh99fcd712001-10-13 01:06:47 +0000744 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
drhfef52082000-06-06 01:50:43 +0000745 sqliteExprIfFalse(pParse, pExpr, lbl);
drh99fcd712001-10-13 01:06:47 +0000746 sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
drhfef52082000-06-06 01:50:43 +0000747 sqliteVdbeResolveLabel(v, lbl);
748 break;
749 }
drha2e00042002-01-22 03:13:42 +0000750 case TK_AS: {
751 sqliteExprCode(pParse, pExpr->pLeft);
752 break;
753 }
drhcce7d172000-05-31 15:34:51 +0000754 }
755 return;
756}
757
758/*
759** Generate code for a boolean expression such that a jump is made
760** to the label "dest" if the expression is true but execution
761** continues straight thru if the expression is false.
762*/
763void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
764 Vdbe *v = pParse->pVdbe;
765 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000766 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000767 switch( pExpr->op ){
768 case TK_LT: op = OP_Lt; break;
769 case TK_LE: op = OP_Le; break;
770 case TK_GT: op = OP_Gt; break;
771 case TK_GE: op = OP_Ge; break;
772 case TK_NE: op = OP_Ne; break;
773 case TK_EQ: op = OP_Eq; break;
774 case TK_LIKE: op = OP_Like; break;
775 case TK_GLOB: op = OP_Glob; break;
776 case TK_ISNULL: op = OP_IsNull; break;
777 case TK_NOTNULL: op = OP_NotNull; break;
778 default: break;
779 }
780 switch( pExpr->op ){
781 case TK_AND: {
782 int d2 = sqliteVdbeMakeLabel(v);
783 sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
784 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
785 sqliteVdbeResolveLabel(v, d2);
786 break;
787 }
788 case TK_OR: {
789 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
790 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
791 break;
792 }
793 case TK_NOT: {
794 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
795 break;
796 }
797 case TK_LT:
798 case TK_LE:
799 case TK_GT:
800 case TK_GE:
801 case TK_NE:
802 case TK_EQ:
803 case TK_LIKE:
804 case TK_GLOB: {
805 sqliteExprCode(pParse, pExpr->pLeft);
806 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000807 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000808 break;
809 }
810 case TK_ISNULL:
811 case TK_NOTNULL: {
812 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000813 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000814 break;
815 }
drhfef52082000-06-06 01:50:43 +0000816 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000817 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000818 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000819 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000820 }else{
drh99fcd712001-10-13 01:06:47 +0000821 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000822 }
823 break;
824 }
825 case TK_BETWEEN: {
826 int lbl = sqliteVdbeMakeLabel(v);
827 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000828 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000829 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000830 sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
drhfef52082000-06-06 01:50:43 +0000831 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000832 sqliteVdbeAddOp(v, OP_Le, 0, dest);
833 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
834 sqliteVdbeResolveLabel(v, lbl);
835 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
drhfef52082000-06-06 01:50:43 +0000836 break;
837 }
drhcce7d172000-05-31 15:34:51 +0000838 default: {
839 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000840 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000841 break;
842 }
843 }
844}
845
846/*
drh66b89c82000-11-28 20:47:17 +0000847** Generate code for a boolean expression such that a jump is made
drhcce7d172000-05-31 15:34:51 +0000848** to the label "dest" if the expression is false but execution
849** continues straight thru if the expression is true.
850*/
851void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
852 Vdbe *v = pParse->pVdbe;
853 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000854 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000855 switch( pExpr->op ){
856 case TK_LT: op = OP_Ge; break;
857 case TK_LE: op = OP_Gt; break;
858 case TK_GT: op = OP_Le; break;
859 case TK_GE: op = OP_Lt; break;
860 case TK_NE: op = OP_Eq; break;
861 case TK_EQ: op = OP_Ne; break;
862 case TK_LIKE: op = OP_Like; break;
863 case TK_GLOB: op = OP_Glob; break;
864 case TK_ISNULL: op = OP_NotNull; break;
865 case TK_NOTNULL: op = OP_IsNull; break;
866 default: break;
867 }
868 switch( pExpr->op ){
869 case TK_AND: {
870 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
871 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
872 break;
873 }
874 case TK_OR: {
875 int d2 = sqliteVdbeMakeLabel(v);
876 sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
877 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
878 sqliteVdbeResolveLabel(v, d2);
879 break;
880 }
881 case TK_NOT: {
882 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
883 break;
884 }
885 case TK_LT:
886 case TK_LE:
887 case TK_GT:
888 case TK_GE:
889 case TK_NE:
890 case TK_EQ: {
891 sqliteExprCode(pParse, pExpr->pLeft);
892 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000893 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000894 break;
895 }
896 case TK_LIKE:
897 case TK_GLOB: {
898 sqliteExprCode(pParse, pExpr->pLeft);
899 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000900 sqliteVdbeAddOp(v, op, 1, dest);
drhcce7d172000-05-31 15:34:51 +0000901 break;
902 }
903 case TK_ISNULL:
904 case TK_NOTNULL: {
905 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000906 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000907 break;
908 }
drhfef52082000-06-06 01:50:43 +0000909 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000910 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000911 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000912 sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000913 }else{
drh99fcd712001-10-13 01:06:47 +0000914 sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000915 }
916 break;
917 }
918 case TK_BETWEEN: {
919 int addr;
920 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000921 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000922 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
923 addr = sqliteVdbeCurrentAddr(v);
drh99fcd712001-10-13 01:06:47 +0000924 sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
925 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
926 sqliteVdbeAddOp(v, OP_Goto, 0, dest);
drhfef52082000-06-06 01:50:43 +0000927 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000928 sqliteVdbeAddOp(v, OP_Gt, 0, dest);
drhfef52082000-06-06 01:50:43 +0000929 break;
930 }
drhcce7d172000-05-31 15:34:51 +0000931 default: {
932 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000933 sqliteVdbeAddOp(v, OP_Not, 0, 0);
934 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000935 break;
936 }
937 }
938}
drh22827922000-06-06 17:27:05 +0000939
940/*
941** Do a deep comparison of two expression trees. Return TRUE (non-zero)
942** if they are identical and return FALSE if they differ in any way.
943*/
drhd8bc7082000-06-07 23:51:50 +0000944int sqliteExprCompare(Expr *pA, Expr *pB){
drh22827922000-06-06 17:27:05 +0000945 int i;
946 if( pA==0 ){
947 return pB==0;
948 }else if( pB==0 ){
949 return 0;
950 }
951 if( pA->op!=pB->op ) return 0;
drhd8bc7082000-06-07 23:51:50 +0000952 if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
953 if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
drh22827922000-06-06 17:27:05 +0000954 if( pA->pList ){
955 if( pB->pList==0 ) return 0;
956 if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
957 for(i=0; i<pA->pList->nExpr; i++){
drhd8bc7082000-06-07 23:51:50 +0000958 if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
drh22827922000-06-06 17:27:05 +0000959 return 0;
960 }
961 }
962 }else if( pB->pList ){
963 return 0;
964 }
965 if( pA->pSelect || pB->pSelect ) return 0;
966 if( pA->token.z ){
967 if( pB->token.z==0 ) return 0;
968 if( pB->token.n!=pA->token.n ) return 0;
969 if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
970 }
971 return 1;
972}
973
974/*
975** Add a new element to the pParse->aAgg[] array and return its index.
976*/
977static int appendAggInfo(Parse *pParse){
978 if( (pParse->nAgg & 0x7)==0 ){
979 int amt = pParse->nAgg + 8;
drh6d4abfb2001-10-22 02:58:08 +0000980 AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
981 if( aAgg==0 ){
drh22827922000-06-06 17:27:05 +0000982 return -1;
983 }
drh6d4abfb2001-10-22 02:58:08 +0000984 pParse->aAgg = aAgg;
drh22827922000-06-06 17:27:05 +0000985 }
986 memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
987 return pParse->nAgg++;
988}
989
990/*
991** Analyze the given expression looking for aggregate functions and
992** for variables that need to be added to the pParse->aAgg[] array.
993** Make additional entries to the pParse->aAgg[] array as necessary.
994**
995** This routine should only be called after the expression has been
996** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
997**
998** If errors are seen, leave an error message in zErrMsg and return
999** the number of errors.
1000*/
1001int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
1002 int i;
1003 AggExpr *aAgg;
1004 int nErr = 0;
1005
1006 if( pExpr==0 ) return 0;
1007 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +00001008 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +00001009 aAgg = pParse->aAgg;
1010 for(i=0; i<pParse->nAgg; i++){
1011 if( aAgg[i].isAgg ) continue;
1012 if( aAgg[i].pExpr->iTable==pExpr->iTable
drh967e8b72000-06-21 13:59:10 +00001013 && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
drh22827922000-06-06 17:27:05 +00001014 break;
1015 }
1016 }
1017 if( i>=pParse->nAgg ){
1018 i = appendAggInfo(pParse);
1019 if( i<0 ) return 1;
1020 pParse->aAgg[i].isAgg = 0;
1021 pParse->aAgg[i].pExpr = pExpr;
1022 }
drhaaf88722000-06-08 11:25:00 +00001023 pExpr->iAgg = i;
drh22827922000-06-06 17:27:05 +00001024 break;
1025 }
1026 case TK_AGG_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +00001027 if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +00001028 if( pParse->iAggCount>=0 ){
1029 i = pParse->iAggCount;
1030 }else{
1031 i = appendAggInfo(pParse);
1032 if( i<0 ) return 1;
1033 pParse->aAgg[i].isAgg = 1;
1034 pParse->aAgg[i].pExpr = 0;
1035 pParse->iAggCount = i;
1036 }
drh967e8b72000-06-21 13:59:10 +00001037 if( pExpr->iColumn==FN_Count ){
drh22827922000-06-06 17:27:05 +00001038 pExpr->iAgg = i;
1039 break;
1040 }
1041 }
1042 aAgg = pParse->aAgg;
1043 for(i=0; i<pParse->nAgg; i++){
1044 if( !aAgg[i].isAgg ) continue;
drhd8bc7082000-06-07 23:51:50 +00001045 if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
drh22827922000-06-06 17:27:05 +00001046 break;
1047 }
1048 }
1049 if( i>=pParse->nAgg ){
1050 i = appendAggInfo(pParse);
1051 if( i<0 ) return 1;
1052 pParse->aAgg[i].isAgg = 1;
1053 pParse->aAgg[i].pExpr = pExpr;
1054 }
1055 pExpr->iAgg = i;
1056 break;
1057 }
1058 default: {
1059 if( pExpr->pLeft ){
1060 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
1061 }
1062 if( nErr==0 && pExpr->pRight ){
1063 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
1064 }
1065 if( nErr==0 && pExpr->pList ){
1066 int n = pExpr->pList->nExpr;
1067 int i;
1068 for(i=0; nErr==0 && i<n; i++){
1069 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
1070 }
1071 }
1072 break;
1073 }
1074 }
1075 return nErr;
1076}