blob: 6d2e3104b6998f77a0d2f81ddf2f26b572912461 [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**
drhaacc5432002-01-06 17:07:40 +000015** $Id: expr.c,v 1.37 2002/01/06 17:07:40 drh Exp $
drhcce7d172000-05-31 15:34:51 +000016*/
17#include "sqliteInt.h"
18
19/*
drhfef52082000-06-06 01:50:43 +000020** Walk an expression tree. Return 1 if the expression is constant
21** and 0 if it involves variables.
22*/
23static int isConstant(Expr *p){
24 switch( p->op ){
25 case TK_ID:
drh967e8b72000-06-21 13:59:10 +000026 case TK_COLUMN:
drhfef52082000-06-06 01:50:43 +000027 case TK_DOT:
28 return 0;
29 default: {
30 if( p->pLeft && !isConstant(p->pLeft) ) return 0;
31 if( p->pRight && !isConstant(p->pRight) ) return 0;
32 if( p->pList ){
33 int i;
34 for(i=0; i<p->pList->nExpr; i++){
35 if( !isConstant(p->pList->a[i].pExpr) ) return 0;
36 }
37 }
38 break;
39 }
40 }
41 return 1;
42}
43
44/*
drh4794b982000-06-06 13:54:14 +000045** Walk the expression tree and process operators of the form:
46**
47** expr IN (SELECT ...)
48**
drh967e8b72000-06-21 13:59:10 +000049** These operators have to be processed before column names are
drh4794b982000-06-06 13:54:14 +000050** resolved because each such operator increments pParse->nTab
drh1ccde152000-06-17 13:12:39 +000051** to reserve cursor numbers for its own use. But pParse->nTab
drhaacc5432002-01-06 17:07:40 +000052** needs to be constant once we begin resolving column names. For
53** that reason, this procedure needs to be called on every expression
54** before sqliteExprResolveIds() is called on any expression.
drh4794b982000-06-06 13:54:14 +000055**
56** Actually, the processing of IN-SELECT is only started by this
57** routine. This routine allocates a cursor number to the IN-SELECT
58** and then moves on. The code generation is done by
59** sqliteExprResolveIds() which must be called afterwards.
60*/
61void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
62 if( pExpr==0 ) return;
63 if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
64 pExpr->iTable = pParse->nTab++;
65 }else{
66 if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
67 if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
68 if( pExpr->pList ){
69 int i;
70 ExprList *pList = pExpr->pList;
71 for(i=0; i<pList->nExpr; i++){
72 sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
73 }
74 }
75 }
76}
77
78/*
drhc4a3c772001-04-04 11:48:57 +000079** Return TRUE if the given string is a row-id column name.
80*/
81static int sqliteIsRowid(const char *z){
82 if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
83 if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
84 if( sqliteStrICmp(z, "OID")==0 ) return 1;
85 return 0;
86}
87
88/*
drhcce7d172000-05-31 15:34:51 +000089** This routine walks an expression tree and resolves references to
drh967e8b72000-06-21 13:59:10 +000090** table columns. Nodes of the form ID.ID or ID resolve into an
drhaacc5432002-01-06 17:07:40 +000091** index to the table in the table list and a column offset. The
92** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable
93** value is changed to the index of the referenced table in pTabList
94** plus the pParse->nTab value. This value will ultimately become the
95** VDBE cursor number for a cursor that is pointing into the referenced
96** table. The Expr.iColumn value is changed to the index of the column
97** of the referenced table. The Expr.iColumn value for the special
98** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an
99** alias for ROWID.
drh19a775c2000-06-05 18:54:46 +0000100**
drhfef52082000-06-06 01:50:43 +0000101** We also check for instances of the IN operator. IN comes in two
102** forms:
103**
104** expr IN (exprlist)
105** and
106** expr IN (SELECT ...)
107**
108** The first form is handled by creating a set holding the list
109** of allowed values. The second form causes the SELECT to generate
110** a temporary table.
111**
112** This routine also looks for scalar SELECTs that are part of an expression.
drh19a775c2000-06-05 18:54:46 +0000113** If it finds any, it generates code to write the value of that select
114** into a memory cell.
drhcce7d172000-05-31 15:34:51 +0000115**
drh967e8b72000-06-21 13:59:10 +0000116** Unknown columns or tables provoke an error. The function returns
drhcce7d172000-05-31 15:34:51 +0000117** the number of errors seen and leaves an error message on pParse->zErrMsg.
118*/
119int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
drhdaffd0e2001-04-11 14:28:42 +0000120 if( pExpr==0 || pTabList==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000121 switch( pExpr->op ){
122 /* A lone identifier */
123 case TK_ID: {
drhc4a3c772001-04-04 11:48:57 +0000124 int cnt = 0; /* Number of matches */
125 int i; /* Loop counter */
drh6e142f52000-06-08 13:36:40 +0000126 char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
drhdaffd0e2001-04-11 14:28:42 +0000127 if( z==0 ) return 1;
drhcce7d172000-05-31 15:34:51 +0000128 for(i=0; i<pTabList->nId; i++){
129 int j;
130 Table *pTab = pTabList->a[i].pTab;
131 if( pTab==0 ) continue;
132 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000133 if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
drhcce7d172000-05-31 15:34:51 +0000134 cnt++;
drh19a775c2000-06-05 18:54:46 +0000135 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000136 if( j==pTab->iPKey ){
137 /* Substitute the record number for the INTEGER PRIMARY KEY */
138 pExpr->iColumn = -1;
139 }else{
140 pExpr->iColumn = j;
141 }
drhcce7d172000-05-31 15:34:51 +0000142 }
143 }
144 }
drhc4a3c772001-04-04 11:48:57 +0000145 if( cnt==0 && sqliteIsRowid(z) ){
146 pExpr->iColumn = -1;
147 pExpr->iTable = pParse->nTab;
148 cnt = 1 + (pTabList->nId>1);
149 }
drhcce7d172000-05-31 15:34:51 +0000150 sqliteFree(z);
151 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000152 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000153 pExpr->token.z, pExpr->token.n, 0);
154 pParse->nErr++;
155 return 1;
156 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000157 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000158 pExpr->token.z, pExpr->token.n, 0);
159 pParse->nErr++;
160 return 1;
161 }
drh967e8b72000-06-21 13:59:10 +0000162 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000163 break;
164 }
165
drh967e8b72000-06-21 13:59:10 +0000166 /* A table name and column name: ID.ID */
drhcce7d172000-05-31 15:34:51 +0000167 case TK_DOT: {
drhbed86902000-06-02 13:27:59 +0000168 int cnt = 0; /* Number of matches */
drhc4a3c772001-04-04 11:48:57 +0000169 int cntTab = 0; /* Number of matching tables */
drhbed86902000-06-02 13:27:59 +0000170 int i; /* Loop counter */
drhcce7d172000-05-31 15:34:51 +0000171 Expr *pLeft, *pRight; /* Left and right subbranches of the expr */
drhcce7d172000-05-31 15:34:51 +0000172 char *zLeft, *zRight; /* Text of an identifier */
173
174 pLeft = pExpr->pLeft;
175 pRight = pExpr->pRight;
176 assert( pLeft && pLeft->op==TK_ID );
177 assert( pRight && pRight->op==TK_ID );
drh6e142f52000-06-08 13:36:40 +0000178 zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
179 zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
drhdaffd0e2001-04-11 14:28:42 +0000180 if( zLeft==0 || zRight==0 ){
181 sqliteFree(zLeft);
182 sqliteFree(zRight);
183 return 1;
184 }
drh87c40e82001-07-23 14:33:02 +0000185 sqliteDequote(zLeft);
186 sqliteDequote(zRight);
drhc4a3c772001-04-04 11:48:57 +0000187 pExpr->iTable = -1;
drhcce7d172000-05-31 15:34:51 +0000188 for(i=0; i<pTabList->nId; i++){
189 int j;
190 char *zTab;
191 Table *pTab = pTabList->a[i].pTab;
192 if( pTab==0 ) continue;
193 if( pTabList->a[i].zAlias ){
194 zTab = pTabList->a[i].zAlias;
195 }else{
196 zTab = pTab->zName;
197 }
198 if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
drhc4a3c772001-04-04 11:48:57 +0000199 if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000200 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000201 if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
drhcce7d172000-05-31 15:34:51 +0000202 cnt++;
drh19a775c2000-06-05 18:54:46 +0000203 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000204 if( j==pTab->iPKey ){
205 /* Substitute the record number for the INTEGER PRIMARY KEY */
206 pExpr->iColumn = -1;
207 }else{
208 pExpr->iColumn = j;
209 }
drhcce7d172000-05-31 15:34:51 +0000210 }
211 }
212 }
drhc4a3c772001-04-04 11:48:57 +0000213 if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
214 cnt = 1;
215 pExpr->iColumn = -1;
216 }
drhcce7d172000-05-31 15:34:51 +0000217 sqliteFree(zLeft);
218 sqliteFree(zRight);
219 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000220 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000221 pLeft->token.z, pLeft->token.n, ".", 1,
222 pRight->token.z, pRight->token.n, 0);
223 pParse->nErr++;
224 return 1;
225 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000226 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000227 pLeft->token.z, pLeft->token.n, ".", 1,
228 pRight->token.z, pRight->token.n, 0);
229 pParse->nErr++;
230 return 1;
231 }
232 sqliteExprDelete(pLeft);
233 pExpr->pLeft = 0;
234 sqliteExprDelete(pRight);
235 pExpr->pRight = 0;
drh967e8b72000-06-21 13:59:10 +0000236 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000237 break;
238 }
239
drhfef52082000-06-06 01:50:43 +0000240 case TK_IN: {
drhd8bc7082000-06-07 23:51:50 +0000241 Vdbe *v = sqliteGetVdbe(pParse);
drhfef52082000-06-06 01:50:43 +0000242 if( v==0 ) return 1;
drhcfab11b2000-06-06 03:31:22 +0000243 if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
244 return 1;
245 }
drhfef52082000-06-06 01:50:43 +0000246 if( pExpr->pSelect ){
247 /* Case 1: expr IN (SELECT ...)
248 **
249 ** Generate code to write the results of the select into a temporary
drh4794b982000-06-06 13:54:14 +0000250 ** table. The cursor number of the temporary table has already
251 ** been put in iTable by sqliteExprResolveInSelect().
drhfef52082000-06-06 01:50:43 +0000252 */
drhc6b52df2002-01-04 03:09:29 +0000253 sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
drhfef52082000-06-06 01:50:43 +0000254 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
255 }else if( pExpr->pList ){
256 /* Case 2: expr IN (exprlist)
257 **
258 ** Create a set to put the exprlist values in. The Set id is stored
259 ** in iTable.
260 */
261 int i, iSet;
262 for(i=0; i<pExpr->pList->nExpr; i++){
263 Expr *pE2 = pExpr->pList->a[i].pExpr;
drhfef52082000-06-06 01:50:43 +0000264 if( !isConstant(pE2) ){
265 sqliteSetString(&pParse->zErrMsg,
266 "right-hand side of IN operator must be constant", 0);
267 pParse->nErr++;
268 return 1;
269 }
drh4794b982000-06-06 13:54:14 +0000270 if( sqliteExprCheck(pParse, pE2, 0, 0) ){
271 return 1;
272 }
drhfef52082000-06-06 01:50:43 +0000273 }
274 iSet = pExpr->iTable = pParse->nSet++;
275 for(i=0; i<pExpr->pList->nExpr; i++){
276 Expr *pE2 = pExpr->pList->a[i].pExpr;
277 switch( pE2->op ){
278 case TK_FLOAT:
279 case TK_INTEGER:
280 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000281 int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000282 sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
283 sqliteVdbeDequoteP3(v, addr);
284 break;
285 }
286 default: {
287 sqliteExprCode(pParse, pE2);
drh99fcd712001-10-13 01:06:47 +0000288 sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000289 break;
290 }
291 }
292 }
293 }
drhcfab11b2000-06-06 03:31:22 +0000294 break;
drhfef52082000-06-06 01:50:43 +0000295 }
296
drh19a775c2000-06-05 18:54:46 +0000297 case TK_SELECT: {
drhfef52082000-06-06 01:50:43 +0000298 /* This has to be a scalar SELECT. Generate code to put the
299 ** value of this select in a memory cell and record the number
drh967e8b72000-06-21 13:59:10 +0000300 ** of the memory cell in iColumn.
drhfef52082000-06-06 01:50:43 +0000301 */
drh967e8b72000-06-21 13:59:10 +0000302 pExpr->iColumn = pParse->nMem++;
303 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
drh19a775c2000-06-05 18:54:46 +0000304 return 1;
305 }
306 break;
307 }
308
drhcce7d172000-05-31 15:34:51 +0000309 /* For all else, just recursively walk the tree */
310 default: {
drh4794b982000-06-06 13:54:14 +0000311 if( pExpr->pLeft
312 && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){
drhcce7d172000-05-31 15:34:51 +0000313 return 1;
314 }
315 if( pExpr->pRight
drh4794b982000-06-06 13:54:14 +0000316 && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){
drhcce7d172000-05-31 15:34:51 +0000317 return 1;
318 }
319 if( pExpr->pList ){
320 int i;
321 ExprList *pList = pExpr->pList;
322 for(i=0; i<pList->nExpr; i++){
323 if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){
324 return 1;
325 }
326 }
327 }
328 }
329 }
330 return 0;
331}
332
333#if 0 /* NOT USED */
334/*
335** Compare a token against a string. Return TRUE if they match.
336*/
337static int sqliteTokenCmp(Token *pToken, const char *zStr){
338 int n = strlen(zStr);
339 if( n!=pToken->n ) return 0;
340 return sqliteStrNICmp(pToken->z, zStr, n)==0;
341}
342#endif
343
344/*
345** Convert a function name into its integer identifier. Return the
346** identifier. Return FN_Unknown if the function name is unknown.
347*/
348int sqliteFuncId(Token *pToken){
349 static const struct {
350 char *zName;
351 int len;
352 int id;
353 } aFunc[] = {
drhbf4133c2001-10-13 02:59:08 +0000354 { "count", 5, FN_Count },
355 { "min", 3, FN_Min },
356 { "max", 3, FN_Max },
357 { "sum", 3, FN_Sum },
358 { "avg", 3, FN_Avg },
drhbf4133c2001-10-13 02:59:08 +0000359 { "length", 6, FN_Length },
360 { "substr", 6, FN_Substr },
361 { "abs", 3, FN_Abs },
362 { "round", 5, FN_Round },
drhcce7d172000-05-31 15:34:51 +0000363 };
364 int i;
365 for(i=0; i<ArraySize(aFunc); i++){
366 if( aFunc[i].len==pToken->n
367 && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
368 return aFunc[i].id;
369 }
370 }
371 return FN_Unknown;
372}
373
374/*
375** Error check the functions in an expression. Make sure all
376** function names are recognized and all functions have the correct
377** number of arguments. Leave an error message in pParse->zErrMsg
378** if anything is amiss. Return the number of errors.
379**
380** if pIsAgg is not null and this expression is an aggregate function
381** (like count(*) or max(value)) then write a 1 into *pIsAgg.
382*/
383int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
384 int nErr = 0;
385 if( pExpr==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000386 switch( pExpr->op ){
387 case TK_FUNCTION: {
388 int id = sqliteFuncId(&pExpr->token);
389 int n = pExpr->pList ? pExpr->pList->nExpr : 0;
390 int no_such_func = 0;
391 int too_many_args = 0;
392 int too_few_args = 0;
393 int is_agg = 0;
394 int i;
drh967e8b72000-06-21 13:59:10 +0000395 pExpr->iColumn = id;
drhcce7d172000-05-31 15:34:51 +0000396 switch( id ){
397 case FN_Unknown: {
398 no_such_func = 1;
399 break;
400 }
401 case FN_Count: {
402 no_such_func = !allowAgg;
403 too_many_args = n>1;
404 is_agg = 1;
405 break;
406 }
407 case FN_Max:
408 case FN_Min: {
409 too_few_args = allowAgg ? n<1 : n<2;
410 is_agg = n==1;
411 break;
412 }
drh22827922000-06-06 17:27:05 +0000413 case FN_Avg:
drhcce7d172000-05-31 15:34:51 +0000414 case FN_Sum: {
415 no_such_func = !allowAgg;
416 too_many_args = n>1;
417 too_few_args = n<1;
418 is_agg = 1;
419 break;
420 }
drhbf4133c2001-10-13 02:59:08 +0000421 case FN_Abs:
drh6ec27332000-08-28 15:51:43 +0000422 case FN_Length: {
423 too_few_args = n<1;
424 too_many_args = n>1;
425 break;
426 }
drhbf4133c2001-10-13 02:59:08 +0000427 case FN_Round: {
428 too_few_args = n<1;
429 too_many_args = n>2;
430 break;
431 }
drh6ec27332000-08-28 15:51:43 +0000432 case FN_Substr: {
433 too_few_args = n<3;
434 too_many_args = n>3;
435 break;
436 }
drhcce7d172000-05-31 15:34:51 +0000437 default: break;
438 }
439 if( no_such_func ){
440 sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
441 pExpr->token.z, pExpr->token.n, 0);
442 pParse->nErr++;
443 nErr++;
444 }else if( too_many_args ){
445 sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
446 pExpr->token.z, pExpr->token.n, "()", 2, 0);
447 pParse->nErr++;
448 nErr++;
449 }else if( too_few_args ){
450 sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
451 pExpr->token.z, pExpr->token.n, "()", 2, 0);
452 pParse->nErr++;
453 nErr++;
454 }
drh22827922000-06-06 17:27:05 +0000455 if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
drhcce7d172000-05-31 15:34:51 +0000456 if( is_agg && pIsAgg ) *pIsAgg = 1;
457 for(i=0; nErr==0 && i<n; i++){
drh4cfa7932000-06-08 15:10:46 +0000458 nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
459 allowAgg && !is_agg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000460 }
461 }
462 default: {
463 if( pExpr->pLeft ){
drh22827922000-06-06 17:27:05 +0000464 nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000465 }
466 if( nErr==0 && pExpr->pRight ){
drh22827922000-06-06 17:27:05 +0000467 nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000468 }
drhfef52082000-06-06 01:50:43 +0000469 if( nErr==0 && pExpr->pList ){
470 int n = pExpr->pList->nExpr;
471 int i;
472 for(i=0; nErr==0 && i<n; i++){
drh22827922000-06-06 17:27:05 +0000473 Expr *pE2 = pExpr->pList->a[i].pExpr;
474 nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
drhfef52082000-06-06 01:50:43 +0000475 }
476 }
drhcce7d172000-05-31 15:34:51 +0000477 break;
478 }
479 }
480 return nErr;
481}
482
483/*
484** Generate code into the current Vdbe to evaluate the given
drh1ccde152000-06-17 13:12:39 +0000485** expression and leave the result on the top of stack.
drhcce7d172000-05-31 15:34:51 +0000486*/
487void sqliteExprCode(Parse *pParse, Expr *pExpr){
488 Vdbe *v = pParse->pVdbe;
489 int op;
drhdaffd0e2001-04-11 14:28:42 +0000490 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000491 switch( pExpr->op ){
492 case TK_PLUS: op = OP_Add; break;
493 case TK_MINUS: op = OP_Subtract; break;
494 case TK_STAR: op = OP_Multiply; break;
495 case TK_SLASH: op = OP_Divide; break;
496 case TK_AND: op = OP_And; break;
497 case TK_OR: op = OP_Or; break;
498 case TK_LT: op = OP_Lt; break;
499 case TK_LE: op = OP_Le; break;
500 case TK_GT: op = OP_Gt; break;
501 case TK_GE: op = OP_Ge; break;
502 case TK_NE: op = OP_Ne; break;
503 case TK_EQ: op = OP_Eq; break;
504 case TK_LIKE: op = OP_Like; break;
505 case TK_GLOB: op = OP_Glob; break;
506 case TK_ISNULL: op = OP_IsNull; break;
507 case TK_NOTNULL: op = OP_NotNull; break;
508 case TK_NOT: op = OP_Not; break;
509 case TK_UMINUS: op = OP_Negative; break;
drhbf4133c2001-10-13 02:59:08 +0000510 case TK_BITAND: op = OP_BitAnd; break;
511 case TK_BITOR: op = OP_BitOr; break;
512 case TK_BITNOT: op = OP_BitNot; break;
513 case TK_LSHIFT: op = OP_ShiftLeft; break;
514 case TK_RSHIFT: op = OP_ShiftRight; break;
515 case TK_REM: op = OP_Remainder; break;
drhcce7d172000-05-31 15:34:51 +0000516 default: break;
517 }
518 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +0000519 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +0000520 if( pParse->useAgg ){
drh99fcd712001-10-13 01:06:47 +0000521 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drhc4a3c772001-04-04 11:48:57 +0000522 }else if( pExpr->iColumn>=0 ){
drh99fcd712001-10-13 01:06:47 +0000523 sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
drhc4a3c772001-04-04 11:48:57 +0000524 }else{
drh99fcd712001-10-13 01:06:47 +0000525 sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
drh22827922000-06-06 17:27:05 +0000526 }
drhcce7d172000-05-31 15:34:51 +0000527 break;
528 }
529 case TK_INTEGER: {
drh7a7c7392001-11-24 00:31:46 +0000530 sqliteVdbeAddOp(v, OP_String, 0, 0);
531 sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
drhcce7d172000-05-31 15:34:51 +0000532 break;
533 }
534 case TK_FLOAT: {
drh99fcd712001-10-13 01:06:47 +0000535 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000536 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
537 break;
538 }
539 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000540 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000541 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
542 sqliteVdbeDequoteP3(v, addr);
543 break;
544 }
545 case TK_NULL: {
drh99fcd712001-10-13 01:06:47 +0000546 sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000547 break;
548 }
549 case TK_AND:
550 case TK_OR:
551 case TK_PLUS:
552 case TK_STAR:
553 case TK_MINUS:
drhbf4133c2001-10-13 02:59:08 +0000554 case TK_REM:
555 case TK_BITAND:
556 case TK_BITOR:
drhcce7d172000-05-31 15:34:51 +0000557 case TK_SLASH: {
558 sqliteExprCode(pParse, pExpr->pLeft);
559 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000560 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000561 break;
562 }
drhbf4133c2001-10-13 02:59:08 +0000563 case TK_LSHIFT:
564 case TK_RSHIFT: {
565 sqliteExprCode(pParse, pExpr->pRight);
566 sqliteExprCode(pParse, pExpr->pLeft);
567 sqliteVdbeAddOp(v, op, 0, 0);
568 break;
569 }
drh00400772000-06-16 20:51:26 +0000570 case TK_CONCAT: {
571 sqliteExprCode(pParse, pExpr->pLeft);
572 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000573 sqliteVdbeAddOp(v, OP_Concat, 2, 0);
drh00400772000-06-16 20:51:26 +0000574 break;
575 }
drhcce7d172000-05-31 15:34:51 +0000576 case TK_LT:
577 case TK_LE:
578 case TK_GT:
579 case TK_GE:
580 case TK_NE:
581 case TK_EQ:
582 case TK_LIKE:
583 case TK_GLOB: {
584 int dest;
drh99fcd712001-10-13 01:06:47 +0000585 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000586 sqliteExprCode(pParse, pExpr->pLeft);
587 sqliteExprCode(pParse, pExpr->pRight);
588 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000589 sqliteVdbeAddOp(v, op, 0, dest);
590 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000591 break;
592 }
drhcce7d172000-05-31 15:34:51 +0000593 case TK_UMINUS: {
drh6e142f52000-06-08 13:36:40 +0000594 assert( pExpr->pLeft );
drh7a7c7392001-11-24 00:31:46 +0000595 if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
drh6e142f52000-06-08 13:36:40 +0000596 Token *p = &pExpr->pLeft->token;
597 char *z = sqliteMalloc( p->n + 2 );
598 sprintf(z, "-%.*s", p->n, p->z);
drh99fcd712001-10-13 01:06:47 +0000599 sqliteVdbeAddOp(v, OP_String, 0, 0);
600 sqliteVdbeChangeP3(v, -1, z, p->n+1);
drh6e142f52000-06-08 13:36:40 +0000601 sqliteFree(z);
602 break;
603 }
drh1ccde152000-06-17 13:12:39 +0000604 /* Fall through into TK_NOT */
drh6e142f52000-06-08 13:36:40 +0000605 }
drhbf4133c2001-10-13 02:59:08 +0000606 case TK_BITNOT:
drh6e142f52000-06-08 13:36:40 +0000607 case TK_NOT: {
drhcce7d172000-05-31 15:34:51 +0000608 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000609 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000610 break;
611 }
612 case TK_ISNULL:
613 case TK_NOTNULL: {
614 int dest;
drh99fcd712001-10-13 01:06:47 +0000615 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000616 sqliteExprCode(pParse, pExpr->pLeft);
617 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000618 sqliteVdbeAddOp(v, op, 0, dest);
619 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000620 break;
621 }
drh22827922000-06-06 17:27:05 +0000622 case TK_AGG_FUNCTION: {
drh99fcd712001-10-13 01:06:47 +0000623 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drh967e8b72000-06-21 13:59:10 +0000624 if( pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +0000625 assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
drh99fcd712001-10-13 01:06:47 +0000626 sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
627 sqliteVdbeAddOp(v, OP_Divide, 0, 0);
drh22827922000-06-06 17:27:05 +0000628 }
629 break;
630 }
drhcce7d172000-05-31 15:34:51 +0000631 case TK_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +0000632 int id = pExpr->iColumn;
drhcce7d172000-05-31 15:34:51 +0000633 int op;
634 int i;
635 ExprList *pList = pExpr->pList;
drh6ec27332000-08-28 15:51:43 +0000636 switch( id ){
drh6ec27332000-08-28 15:51:43 +0000637 case FN_Min:
638 case FN_Max: {
639 op = id==FN_Min ? OP_Min : OP_Max;
640 for(i=0; i<pList->nExpr; i++){
641 sqliteExprCode(pParse, pList->a[i].pExpr);
642 if( i>0 ){
drh99fcd712001-10-13 01:06:47 +0000643 sqliteVdbeAddOp(v, op, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000644 }
645 }
646 break;
647 }
drhbf4133c2001-10-13 02:59:08 +0000648 case FN_Abs: {
649 sqliteExprCode(pParse, pList->a[0].pExpr);
650 sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
651 break;
652 }
653 case FN_Round: {
654 if( pList->nExpr==2 ){
655 sqliteExprCode(pParse, pList->a[1].pExpr);
656 }else{
657 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
658 }
659 sqliteExprCode(pParse, pList->a[0].pExpr);
660 sqliteVdbeAddOp(v, OP_Precision, 0, 0);
661 break;
662 }
drh6ec27332000-08-28 15:51:43 +0000663 case FN_Length: {
664 sqliteExprCode(pParse, pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000665 sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000666 break;
667 }
668 case FN_Substr: {
669 for(i=0; i<pList->nExpr; i++){
670 sqliteExprCode(pParse, pList->a[i].pExpr);
671 }
drh99fcd712001-10-13 01:06:47 +0000672 sqliteVdbeAddOp(v, OP_Substr, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000673 break;
674 }
675 default: {
676 /* Can't happen! */
677 break;
drhcce7d172000-05-31 15:34:51 +0000678 }
679 }
680 break;
681 }
drh19a775c2000-06-05 18:54:46 +0000682 case TK_SELECT: {
drh99fcd712001-10-13 01:06:47 +0000683 sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
drh19a775c2000-06-05 18:54:46 +0000684 break;
685 }
drhfef52082000-06-06 01:50:43 +0000686 case TK_IN: {
687 int addr;
drh99fcd712001-10-13 01:06:47 +0000688 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhfef52082000-06-06 01:50:43 +0000689 sqliteExprCode(pParse, pExpr->pLeft);
690 addr = sqliteVdbeCurrentAddr(v);
691 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000692 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000693 }else{
drh99fcd712001-10-13 01:06:47 +0000694 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000695 }
drh99fcd712001-10-13 01:06:47 +0000696 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhfef52082000-06-06 01:50:43 +0000697 break;
698 }
699 case TK_BETWEEN: {
700 int lbl = sqliteVdbeMakeLabel(v);
drh99fcd712001-10-13 01:06:47 +0000701 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
drhfef52082000-06-06 01:50:43 +0000702 sqliteExprIfFalse(pParse, pExpr, lbl);
drh99fcd712001-10-13 01:06:47 +0000703 sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
drhfef52082000-06-06 01:50:43 +0000704 sqliteVdbeResolveLabel(v, lbl);
705 break;
706 }
drhcce7d172000-05-31 15:34:51 +0000707 }
708 return;
709}
710
711/*
712** Generate code for a boolean expression such that a jump is made
713** to the label "dest" if the expression is true but execution
714** continues straight thru if the expression is false.
715*/
716void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
717 Vdbe *v = pParse->pVdbe;
718 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000719 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000720 switch( pExpr->op ){
721 case TK_LT: op = OP_Lt; break;
722 case TK_LE: op = OP_Le; break;
723 case TK_GT: op = OP_Gt; break;
724 case TK_GE: op = OP_Ge; break;
725 case TK_NE: op = OP_Ne; break;
726 case TK_EQ: op = OP_Eq; break;
727 case TK_LIKE: op = OP_Like; break;
728 case TK_GLOB: op = OP_Glob; break;
729 case TK_ISNULL: op = OP_IsNull; break;
730 case TK_NOTNULL: op = OP_NotNull; break;
731 default: break;
732 }
733 switch( pExpr->op ){
734 case TK_AND: {
735 int d2 = sqliteVdbeMakeLabel(v);
736 sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
737 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
738 sqliteVdbeResolveLabel(v, d2);
739 break;
740 }
741 case TK_OR: {
742 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
743 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
744 break;
745 }
746 case TK_NOT: {
747 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
748 break;
749 }
750 case TK_LT:
751 case TK_LE:
752 case TK_GT:
753 case TK_GE:
754 case TK_NE:
755 case TK_EQ:
756 case TK_LIKE:
757 case TK_GLOB: {
758 sqliteExprCode(pParse, pExpr->pLeft);
759 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000760 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000761 break;
762 }
763 case TK_ISNULL:
764 case TK_NOTNULL: {
765 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000766 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000767 break;
768 }
drhfef52082000-06-06 01:50:43 +0000769 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000770 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000771 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000772 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000773 }else{
drh99fcd712001-10-13 01:06:47 +0000774 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000775 }
776 break;
777 }
778 case TK_BETWEEN: {
779 int lbl = sqliteVdbeMakeLabel(v);
780 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000781 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000782 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000783 sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
drhfef52082000-06-06 01:50:43 +0000784 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000785 sqliteVdbeAddOp(v, OP_Le, 0, dest);
786 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
787 sqliteVdbeResolveLabel(v, lbl);
788 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
drhfef52082000-06-06 01:50:43 +0000789 break;
790 }
drhcce7d172000-05-31 15:34:51 +0000791 default: {
792 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000793 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000794 break;
795 }
796 }
797}
798
799/*
drh66b89c82000-11-28 20:47:17 +0000800** Generate code for a boolean expression such that a jump is made
drhcce7d172000-05-31 15:34:51 +0000801** to the label "dest" if the expression is false but execution
802** continues straight thru if the expression is true.
803*/
804void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
805 Vdbe *v = pParse->pVdbe;
806 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000807 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000808 switch( pExpr->op ){
809 case TK_LT: op = OP_Ge; break;
810 case TK_LE: op = OP_Gt; break;
811 case TK_GT: op = OP_Le; break;
812 case TK_GE: op = OP_Lt; break;
813 case TK_NE: op = OP_Eq; break;
814 case TK_EQ: op = OP_Ne; break;
815 case TK_LIKE: op = OP_Like; break;
816 case TK_GLOB: op = OP_Glob; break;
817 case TK_ISNULL: op = OP_NotNull; break;
818 case TK_NOTNULL: op = OP_IsNull; break;
819 default: break;
820 }
821 switch( pExpr->op ){
822 case TK_AND: {
823 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
824 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
825 break;
826 }
827 case TK_OR: {
828 int d2 = sqliteVdbeMakeLabel(v);
829 sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
830 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
831 sqliteVdbeResolveLabel(v, d2);
832 break;
833 }
834 case TK_NOT: {
835 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
836 break;
837 }
838 case TK_LT:
839 case TK_LE:
840 case TK_GT:
841 case TK_GE:
842 case TK_NE:
843 case TK_EQ: {
844 sqliteExprCode(pParse, pExpr->pLeft);
845 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000846 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000847 break;
848 }
849 case TK_LIKE:
850 case TK_GLOB: {
851 sqliteExprCode(pParse, pExpr->pLeft);
852 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000853 sqliteVdbeAddOp(v, op, 1, dest);
drhcce7d172000-05-31 15:34:51 +0000854 break;
855 }
856 case TK_ISNULL:
857 case TK_NOTNULL: {
858 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000859 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000860 break;
861 }
drhfef52082000-06-06 01:50:43 +0000862 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000863 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000864 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000865 sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000866 }else{
drh99fcd712001-10-13 01:06:47 +0000867 sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000868 }
869 break;
870 }
871 case TK_BETWEEN: {
872 int addr;
873 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000874 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000875 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
876 addr = sqliteVdbeCurrentAddr(v);
drh99fcd712001-10-13 01:06:47 +0000877 sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
878 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
879 sqliteVdbeAddOp(v, OP_Goto, 0, dest);
drhfef52082000-06-06 01:50:43 +0000880 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000881 sqliteVdbeAddOp(v, OP_Gt, 0, dest);
drhfef52082000-06-06 01:50:43 +0000882 break;
883 }
drhcce7d172000-05-31 15:34:51 +0000884 default: {
885 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000886 sqliteVdbeAddOp(v, OP_Not, 0, 0);
887 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000888 break;
889 }
890 }
891}
drh22827922000-06-06 17:27:05 +0000892
893/*
894** Do a deep comparison of two expression trees. Return TRUE (non-zero)
895** if they are identical and return FALSE if they differ in any way.
896*/
drhd8bc7082000-06-07 23:51:50 +0000897int sqliteExprCompare(Expr *pA, Expr *pB){
drh22827922000-06-06 17:27:05 +0000898 int i;
899 if( pA==0 ){
900 return pB==0;
901 }else if( pB==0 ){
902 return 0;
903 }
904 if( pA->op!=pB->op ) return 0;
drhd8bc7082000-06-07 23:51:50 +0000905 if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
906 if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
drh22827922000-06-06 17:27:05 +0000907 if( pA->pList ){
908 if( pB->pList==0 ) return 0;
909 if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
910 for(i=0; i<pA->pList->nExpr; i++){
drhd8bc7082000-06-07 23:51:50 +0000911 if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
drh22827922000-06-06 17:27:05 +0000912 return 0;
913 }
914 }
915 }else if( pB->pList ){
916 return 0;
917 }
918 if( pA->pSelect || pB->pSelect ) return 0;
919 if( pA->token.z ){
920 if( pB->token.z==0 ) return 0;
921 if( pB->token.n!=pA->token.n ) return 0;
922 if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
923 }
924 return 1;
925}
926
927/*
928** Add a new element to the pParse->aAgg[] array and return its index.
929*/
930static int appendAggInfo(Parse *pParse){
931 if( (pParse->nAgg & 0x7)==0 ){
932 int amt = pParse->nAgg + 8;
drh6d4abfb2001-10-22 02:58:08 +0000933 AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
934 if( aAgg==0 ){
drh22827922000-06-06 17:27:05 +0000935 return -1;
936 }
drh6d4abfb2001-10-22 02:58:08 +0000937 pParse->aAgg = aAgg;
drh22827922000-06-06 17:27:05 +0000938 }
939 memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
940 return pParse->nAgg++;
941}
942
943/*
944** Analyze the given expression looking for aggregate functions and
945** for variables that need to be added to the pParse->aAgg[] array.
946** Make additional entries to the pParse->aAgg[] array as necessary.
947**
948** This routine should only be called after the expression has been
949** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
950**
951** If errors are seen, leave an error message in zErrMsg and return
952** the number of errors.
953*/
954int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
955 int i;
956 AggExpr *aAgg;
957 int nErr = 0;
958
959 if( pExpr==0 ) return 0;
960 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +0000961 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +0000962 aAgg = pParse->aAgg;
963 for(i=0; i<pParse->nAgg; i++){
964 if( aAgg[i].isAgg ) continue;
965 if( aAgg[i].pExpr->iTable==pExpr->iTable
drh967e8b72000-06-21 13:59:10 +0000966 && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
drh22827922000-06-06 17:27:05 +0000967 break;
968 }
969 }
970 if( i>=pParse->nAgg ){
971 i = appendAggInfo(pParse);
972 if( i<0 ) return 1;
973 pParse->aAgg[i].isAgg = 0;
974 pParse->aAgg[i].pExpr = pExpr;
975 }
drhaaf88722000-06-08 11:25:00 +0000976 pExpr->iAgg = i;
drh22827922000-06-06 17:27:05 +0000977 break;
978 }
979 case TK_AGG_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +0000980 if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +0000981 if( pParse->iAggCount>=0 ){
982 i = pParse->iAggCount;
983 }else{
984 i = appendAggInfo(pParse);
985 if( i<0 ) return 1;
986 pParse->aAgg[i].isAgg = 1;
987 pParse->aAgg[i].pExpr = 0;
988 pParse->iAggCount = i;
989 }
drh967e8b72000-06-21 13:59:10 +0000990 if( pExpr->iColumn==FN_Count ){
drh22827922000-06-06 17:27:05 +0000991 pExpr->iAgg = i;
992 break;
993 }
994 }
995 aAgg = pParse->aAgg;
996 for(i=0; i<pParse->nAgg; i++){
997 if( !aAgg[i].isAgg ) continue;
drhd8bc7082000-06-07 23:51:50 +0000998 if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
drh22827922000-06-06 17:27:05 +0000999 break;
1000 }
1001 }
1002 if( i>=pParse->nAgg ){
1003 i = appendAggInfo(pParse);
1004 if( i<0 ) return 1;
1005 pParse->aAgg[i].isAgg = 1;
1006 pParse->aAgg[i].pExpr = pExpr;
1007 }
1008 pExpr->iAgg = i;
1009 break;
1010 }
1011 default: {
1012 if( pExpr->pLeft ){
1013 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
1014 }
1015 if( nErr==0 && pExpr->pRight ){
1016 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
1017 }
1018 if( nErr==0 && pExpr->pList ){
1019 int n = pExpr->pList->nExpr;
1020 int i;
1021 for(i=0; nErr==0 && i<n; i++){
1022 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
1023 }
1024 }
1025 break;
1026 }
1027 }
1028 return nErr;
1029}