blob: 29c9a8b1c32963dbfe60c2d89350dbc1f462c6d2 [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**
drh2f4392f2002-02-14 21:42:51 +000015** $Id: expr.c,v 1.41 2002/02/14 21:42:51 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*/
drh92086432002-01-22 14:11:29 +000038int sqliteExprIsConstant(Expr *p){
drhfef52082000-06-06 01:50:43 +000039 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;
drh92086432002-01-22 14:11:29 +000044 case TK_INTEGER:
45 case TK_FLOAT:
46 case TK_STRING:
47 return 1;
drhfef52082000-06-06 01:50:43 +000048 default: {
drh92086432002-01-22 14:11:29 +000049 if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0;
50 if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0;
drhfef52082000-06-06 01:50:43 +000051 if( p->pList ){
52 int i;
53 for(i=0; i<p->pList->nExpr; i++){
drh92086432002-01-22 14:11:29 +000054 if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0;
drhfef52082000-06-06 01:50:43 +000055 }
56 }
drh92086432002-01-22 14:11:29 +000057 return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0);
drhfef52082000-06-06 01:50:43 +000058 }
59 }
drh92086432002-01-22 14:11:29 +000060 return 0;
drhfef52082000-06-06 01:50:43 +000061}
62
63/*
drh4794b982000-06-06 13:54:14 +000064** Walk the expression tree and process operators of the form:
65**
66** expr IN (SELECT ...)
67**
drh967e8b72000-06-21 13:59:10 +000068** These operators have to be processed before column names are
drh4794b982000-06-06 13:54:14 +000069** resolved because each such operator increments pParse->nTab
drh1ccde152000-06-17 13:12:39 +000070** to reserve cursor numbers for its own use. But pParse->nTab
drhaacc5432002-01-06 17:07:40 +000071** needs to be constant once we begin resolving column names. For
72** that reason, this procedure needs to be called on every expression
73** before sqliteExprResolveIds() is called on any expression.
drh4794b982000-06-06 13:54:14 +000074**
75** Actually, the processing of IN-SELECT is only started by this
76** routine. This routine allocates a cursor number to the IN-SELECT
77** and then moves on. The code generation is done by
78** sqliteExprResolveIds() which must be called afterwards.
79*/
80void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){
81 if( pExpr==0 ) return;
82 if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){
83 pExpr->iTable = pParse->nTab++;
84 }else{
85 if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft);
86 if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight);
87 if( pExpr->pList ){
88 int i;
89 ExprList *pList = pExpr->pList;
90 for(i=0; i<pList->nExpr; i++){
91 sqliteExprResolveInSelect(pParse, pList->a[i].pExpr);
92 }
93 }
94 }
95}
96
97/*
drhc4a3c772001-04-04 11:48:57 +000098** Return TRUE if the given string is a row-id column name.
99*/
100static int sqliteIsRowid(const char *z){
101 if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1;
102 if( sqliteStrICmp(z, "ROWID")==0 ) return 1;
103 if( sqliteStrICmp(z, "OID")==0 ) return 1;
104 return 0;
105}
106
107/*
drhcce7d172000-05-31 15:34:51 +0000108** This routine walks an expression tree and resolves references to
drh967e8b72000-06-21 13:59:10 +0000109** table columns. Nodes of the form ID.ID or ID resolve into an
drhaacc5432002-01-06 17:07:40 +0000110** index to the table in the table list and a column offset. The
111** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable
112** value is changed to the index of the referenced table in pTabList
113** plus the pParse->nTab value. This value will ultimately become the
114** VDBE cursor number for a cursor that is pointing into the referenced
115** table. The Expr.iColumn value is changed to the index of the column
116** of the referenced table. The Expr.iColumn value for the special
117** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an
118** alias for ROWID.
drh19a775c2000-06-05 18:54:46 +0000119**
drhfef52082000-06-06 01:50:43 +0000120** We also check for instances of the IN operator. IN comes in two
121** forms:
122**
123** expr IN (exprlist)
124** and
125** expr IN (SELECT ...)
126**
127** The first form is handled by creating a set holding the list
128** of allowed values. The second form causes the SELECT to generate
129** a temporary table.
130**
131** This routine also looks for scalar SELECTs that are part of an expression.
drh19a775c2000-06-05 18:54:46 +0000132** If it finds any, it generates code to write the value of that select
133** into a memory cell.
drhcce7d172000-05-31 15:34:51 +0000134**
drh967e8b72000-06-21 13:59:10 +0000135** Unknown columns or tables provoke an error. The function returns
drhcce7d172000-05-31 15:34:51 +0000136** the number of errors seen and leaves an error message on pParse->zErrMsg.
137*/
drha2e00042002-01-22 03:13:42 +0000138int sqliteExprResolveIds(
139 Parse *pParse, /* The parser context */
140 IdList *pTabList, /* List of tables used to resolve column names */
141 ExprList *pEList, /* List of expressions used to resolve "AS" */
142 Expr *pExpr /* The expression to be analyzed. */
143){
drhdaffd0e2001-04-11 14:28:42 +0000144 if( pExpr==0 || pTabList==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000145 switch( pExpr->op ){
drha2e00042002-01-22 03:13:42 +0000146 /* A lone identifier. Try and match it as follows:
147 **
148 ** 1. To the name of a column of one of the tables in pTabList
149 **
150 ** 2. To the right side of an AS keyword in the column list of
151 ** a SELECT statement. (For example, match against 'x' in
152 ** "SELECT a+b AS 'x' FROM t1".)
153 **
154 ** 3. One of the special names "ROWID", "OID", or "_ROWID_".
155 */
drhcce7d172000-05-31 15:34:51 +0000156 case TK_ID: {
drhc4a3c772001-04-04 11:48:57 +0000157 int cnt = 0; /* Number of matches */
158 int i; /* Loop counter */
drh6e142f52000-06-08 13:36:40 +0000159 char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
drh2f4392f2002-02-14 21:42:51 +0000160 sqliteDequote(z);
drhdaffd0e2001-04-11 14:28:42 +0000161 if( z==0 ) return 1;
drhcce7d172000-05-31 15:34:51 +0000162 for(i=0; i<pTabList->nId; i++){
163 int j;
164 Table *pTab = pTabList->a[i].pTab;
165 if( pTab==0 ) continue;
166 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000167 if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
drhcce7d172000-05-31 15:34:51 +0000168 cnt++;
drh19a775c2000-06-05 18:54:46 +0000169 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000170 if( j==pTab->iPKey ){
171 /* Substitute the record number for the INTEGER PRIMARY KEY */
172 pExpr->iColumn = -1;
173 }else{
174 pExpr->iColumn = j;
175 }
drha2e00042002-01-22 03:13:42 +0000176 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000177 }
178 }
179 }
drha2e00042002-01-22 03:13:42 +0000180 if( cnt==0 && pEList!=0 ){
181 int j;
182 for(j=0; j<pEList->nExpr; j++){
183 char *zAs = pEList->a[j].zName;
184 if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
185 cnt++;
186 assert( pExpr->pLeft==0 && pExpr->pRight==0 );
187 pExpr->op = TK_AS;
188 pExpr->iColumn = j;
189 pExpr->pLeft = pEList->a[j].pExpr;
190 }
191 }
192 }
drhc4a3c772001-04-04 11:48:57 +0000193 if( cnt==0 && sqliteIsRowid(z) ){
194 pExpr->iColumn = -1;
195 pExpr->iTable = pParse->nTab;
196 cnt = 1 + (pTabList->nId>1);
drha2e00042002-01-22 03:13:42 +0000197 pExpr->op = TK_COLUMN;
drhc4a3c772001-04-04 11:48:57 +0000198 }
drhcce7d172000-05-31 15:34:51 +0000199 sqliteFree(z);
200 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000201 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000202 pExpr->token.z, pExpr->token.n, 0);
203 pParse->nErr++;
204 return 1;
205 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000206 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000207 pExpr->token.z, pExpr->token.n, 0);
208 pParse->nErr++;
209 return 1;
210 }
drhcce7d172000-05-31 15:34:51 +0000211 break;
212 }
213
drh967e8b72000-06-21 13:59:10 +0000214 /* A table name and column name: ID.ID */
drhcce7d172000-05-31 15:34:51 +0000215 case TK_DOT: {
drhbed86902000-06-02 13:27:59 +0000216 int cnt = 0; /* Number of matches */
drhc4a3c772001-04-04 11:48:57 +0000217 int cntTab = 0; /* Number of matching tables */
drhbed86902000-06-02 13:27:59 +0000218 int i; /* Loop counter */
drhcce7d172000-05-31 15:34:51 +0000219 Expr *pLeft, *pRight; /* Left and right subbranches of the expr */
drhcce7d172000-05-31 15:34:51 +0000220 char *zLeft, *zRight; /* Text of an identifier */
221
222 pLeft = pExpr->pLeft;
223 pRight = pExpr->pRight;
224 assert( pLeft && pLeft->op==TK_ID );
225 assert( pRight && pRight->op==TK_ID );
drh6e142f52000-06-08 13:36:40 +0000226 zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
227 zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
drhdaffd0e2001-04-11 14:28:42 +0000228 if( zLeft==0 || zRight==0 ){
229 sqliteFree(zLeft);
230 sqliteFree(zRight);
231 return 1;
232 }
drh87c40e82001-07-23 14:33:02 +0000233 sqliteDequote(zLeft);
234 sqliteDequote(zRight);
drhc4a3c772001-04-04 11:48:57 +0000235 pExpr->iTable = -1;
drhcce7d172000-05-31 15:34:51 +0000236 for(i=0; i<pTabList->nId; i++){
237 int j;
238 char *zTab;
239 Table *pTab = pTabList->a[i].pTab;
240 if( pTab==0 ) continue;
241 if( pTabList->a[i].zAlias ){
242 zTab = pTabList->a[i].zAlias;
243 }else{
244 zTab = pTab->zName;
245 }
246 if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
drhc4a3c772001-04-04 11:48:57 +0000247 if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000248 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000249 if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
drhcce7d172000-05-31 15:34:51 +0000250 cnt++;
drh19a775c2000-06-05 18:54:46 +0000251 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000252 if( j==pTab->iPKey ){
253 /* Substitute the record number for the INTEGER PRIMARY KEY */
254 pExpr->iColumn = -1;
255 }else{
256 pExpr->iColumn = j;
257 }
drhcce7d172000-05-31 15:34:51 +0000258 }
259 }
260 }
drhc4a3c772001-04-04 11:48:57 +0000261 if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
262 cnt = 1;
263 pExpr->iColumn = -1;
264 }
drhcce7d172000-05-31 15:34:51 +0000265 sqliteFree(zLeft);
266 sqliteFree(zRight);
267 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000268 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000269 pLeft->token.z, pLeft->token.n, ".", 1,
270 pRight->token.z, pRight->token.n, 0);
271 pParse->nErr++;
272 return 1;
273 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000274 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000275 pLeft->token.z, pLeft->token.n, ".", 1,
276 pRight->token.z, pRight->token.n, 0);
277 pParse->nErr++;
278 return 1;
279 }
280 sqliteExprDelete(pLeft);
281 pExpr->pLeft = 0;
282 sqliteExprDelete(pRight);
283 pExpr->pRight = 0;
drh967e8b72000-06-21 13:59:10 +0000284 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000285 break;
286 }
287
drhfef52082000-06-06 01:50:43 +0000288 case TK_IN: {
drhd8bc7082000-06-07 23:51:50 +0000289 Vdbe *v = sqliteGetVdbe(pParse);
drhfef52082000-06-06 01:50:43 +0000290 if( v==0 ) return 1;
drha2e00042002-01-22 03:13:42 +0000291 if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
drhcfab11b2000-06-06 03:31:22 +0000292 return 1;
293 }
drhfef52082000-06-06 01:50:43 +0000294 if( pExpr->pSelect ){
295 /* Case 1: expr IN (SELECT ...)
296 **
297 ** Generate code to write the results of the select into a temporary
drh4794b982000-06-06 13:54:14 +0000298 ** table. The cursor number of the temporary table has already
299 ** been put in iTable by sqliteExprResolveInSelect().
drhfef52082000-06-06 01:50:43 +0000300 */
drhc6b52df2002-01-04 03:09:29 +0000301 sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
drhfef52082000-06-06 01:50:43 +0000302 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
303 }else if( pExpr->pList ){
304 /* Case 2: expr IN (exprlist)
305 **
306 ** Create a set to put the exprlist values in. The Set id is stored
307 ** in iTable.
308 */
309 int i, iSet;
310 for(i=0; i<pExpr->pList->nExpr; i++){
311 Expr *pE2 = pExpr->pList->a[i].pExpr;
drh92086432002-01-22 14:11:29 +0000312 if( !sqliteExprIsConstant(pE2) ){
drhfef52082000-06-06 01:50:43 +0000313 sqliteSetString(&pParse->zErrMsg,
314 "right-hand side of IN operator must be constant", 0);
315 pParse->nErr++;
316 return 1;
317 }
drh4794b982000-06-06 13:54:14 +0000318 if( sqliteExprCheck(pParse, pE2, 0, 0) ){
319 return 1;
320 }
drhfef52082000-06-06 01:50:43 +0000321 }
322 iSet = pExpr->iTable = pParse->nSet++;
323 for(i=0; i<pExpr->pList->nExpr; i++){
324 Expr *pE2 = pExpr->pList->a[i].pExpr;
325 switch( pE2->op ){
326 case TK_FLOAT:
327 case TK_INTEGER:
328 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000329 int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000330 sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
331 sqliteVdbeDequoteP3(v, addr);
332 break;
333 }
334 default: {
335 sqliteExprCode(pParse, pE2);
drh99fcd712001-10-13 01:06:47 +0000336 sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000337 break;
338 }
339 }
340 }
341 }
drhcfab11b2000-06-06 03:31:22 +0000342 break;
drhfef52082000-06-06 01:50:43 +0000343 }
344
drh19a775c2000-06-05 18:54:46 +0000345 case TK_SELECT: {
drhfef52082000-06-06 01:50:43 +0000346 /* This has to be a scalar SELECT. Generate code to put the
347 ** value of this select in a memory cell and record the number
drh967e8b72000-06-21 13:59:10 +0000348 ** of the memory cell in iColumn.
drhfef52082000-06-06 01:50:43 +0000349 */
drh967e8b72000-06-21 13:59:10 +0000350 pExpr->iColumn = pParse->nMem++;
351 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
drh19a775c2000-06-05 18:54:46 +0000352 return 1;
353 }
354 break;
355 }
356
drhcce7d172000-05-31 15:34:51 +0000357 /* For all else, just recursively walk the tree */
358 default: {
drh4794b982000-06-06 13:54:14 +0000359 if( pExpr->pLeft
drha2e00042002-01-22 03:13:42 +0000360 && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
drhcce7d172000-05-31 15:34:51 +0000361 return 1;
362 }
363 if( pExpr->pRight
drha2e00042002-01-22 03:13:42 +0000364 && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){
drhcce7d172000-05-31 15:34:51 +0000365 return 1;
366 }
367 if( pExpr->pList ){
368 int i;
369 ExprList *pList = pExpr->pList;
370 for(i=0; i<pList->nExpr; i++){
drha2e00042002-01-22 03:13:42 +0000371 if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){
drhcce7d172000-05-31 15:34:51 +0000372 return 1;
373 }
374 }
375 }
376 }
377 }
378 return 0;
379}
380
381#if 0 /* NOT USED */
382/*
383** Compare a token against a string. Return TRUE if they match.
384*/
385static int sqliteTokenCmp(Token *pToken, const char *zStr){
386 int n = strlen(zStr);
387 if( n!=pToken->n ) return 0;
388 return sqliteStrNICmp(pToken->z, zStr, n)==0;
389}
390#endif
391
392/*
393** Convert a function name into its integer identifier. Return the
394** identifier. Return FN_Unknown if the function name is unknown.
395*/
396int sqliteFuncId(Token *pToken){
397 static const struct {
398 char *zName;
399 int len;
400 int id;
401 } aFunc[] = {
drhbf4133c2001-10-13 02:59:08 +0000402 { "count", 5, FN_Count },
403 { "min", 3, FN_Min },
404 { "max", 3, FN_Max },
405 { "sum", 3, FN_Sum },
406 { "avg", 3, FN_Avg },
drhbf4133c2001-10-13 02:59:08 +0000407 { "length", 6, FN_Length },
408 { "substr", 6, FN_Substr },
409 { "abs", 3, FN_Abs },
410 { "round", 5, FN_Round },
drhcce7d172000-05-31 15:34:51 +0000411 };
412 int i;
413 for(i=0; i<ArraySize(aFunc); i++){
414 if( aFunc[i].len==pToken->n
415 && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
416 return aFunc[i].id;
417 }
418 }
419 return FN_Unknown;
420}
421
422/*
423** Error check the functions in an expression. Make sure all
424** function names are recognized and all functions have the correct
425** number of arguments. Leave an error message in pParse->zErrMsg
426** if anything is amiss. Return the number of errors.
427**
428** if pIsAgg is not null and this expression is an aggregate function
429** (like count(*) or max(value)) then write a 1 into *pIsAgg.
430*/
431int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
432 int nErr = 0;
433 if( pExpr==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000434 switch( pExpr->op ){
435 case TK_FUNCTION: {
436 int id = sqliteFuncId(&pExpr->token);
437 int n = pExpr->pList ? pExpr->pList->nExpr : 0;
438 int no_such_func = 0;
439 int too_many_args = 0;
440 int too_few_args = 0;
441 int is_agg = 0;
442 int i;
drh967e8b72000-06-21 13:59:10 +0000443 pExpr->iColumn = id;
drhcce7d172000-05-31 15:34:51 +0000444 switch( id ){
445 case FN_Unknown: {
446 no_such_func = 1;
447 break;
448 }
449 case FN_Count: {
450 no_such_func = !allowAgg;
451 too_many_args = n>1;
452 is_agg = 1;
453 break;
454 }
455 case FN_Max:
456 case FN_Min: {
457 too_few_args = allowAgg ? n<1 : n<2;
458 is_agg = n==1;
459 break;
460 }
drh22827922000-06-06 17:27:05 +0000461 case FN_Avg:
drhcce7d172000-05-31 15:34:51 +0000462 case FN_Sum: {
463 no_such_func = !allowAgg;
464 too_many_args = n>1;
465 too_few_args = n<1;
466 is_agg = 1;
467 break;
468 }
drhbf4133c2001-10-13 02:59:08 +0000469 case FN_Abs:
drh6ec27332000-08-28 15:51:43 +0000470 case FN_Length: {
471 too_few_args = n<1;
472 too_many_args = n>1;
473 break;
474 }
drhbf4133c2001-10-13 02:59:08 +0000475 case FN_Round: {
476 too_few_args = n<1;
477 too_many_args = n>2;
478 break;
479 }
drh6ec27332000-08-28 15:51:43 +0000480 case FN_Substr: {
481 too_few_args = n<3;
482 too_many_args = n>3;
483 break;
484 }
drhcce7d172000-05-31 15:34:51 +0000485 default: break;
486 }
487 if( no_such_func ){
488 sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
489 pExpr->token.z, pExpr->token.n, 0);
490 pParse->nErr++;
491 nErr++;
492 }else if( too_many_args ){
493 sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
494 pExpr->token.z, pExpr->token.n, "()", 2, 0);
495 pParse->nErr++;
496 nErr++;
497 }else if( too_few_args ){
498 sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
499 pExpr->token.z, pExpr->token.n, "()", 2, 0);
500 pParse->nErr++;
501 nErr++;
502 }
drh22827922000-06-06 17:27:05 +0000503 if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
drhcce7d172000-05-31 15:34:51 +0000504 if( is_agg && pIsAgg ) *pIsAgg = 1;
505 for(i=0; nErr==0 && i<n; i++){
drh4cfa7932000-06-08 15:10:46 +0000506 nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
507 allowAgg && !is_agg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000508 }
509 }
510 default: {
511 if( pExpr->pLeft ){
drh22827922000-06-06 17:27:05 +0000512 nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000513 }
514 if( nErr==0 && pExpr->pRight ){
drh22827922000-06-06 17:27:05 +0000515 nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000516 }
drhfef52082000-06-06 01:50:43 +0000517 if( nErr==0 && pExpr->pList ){
518 int n = pExpr->pList->nExpr;
519 int i;
520 for(i=0; nErr==0 && i<n; i++){
drh22827922000-06-06 17:27:05 +0000521 Expr *pE2 = pExpr->pList->a[i].pExpr;
522 nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
drhfef52082000-06-06 01:50:43 +0000523 }
524 }
drhcce7d172000-05-31 15:34:51 +0000525 break;
526 }
527 }
528 return nErr;
529}
530
531/*
532** Generate code into the current Vdbe to evaluate the given
drh1ccde152000-06-17 13:12:39 +0000533** expression and leave the result on the top of stack.
drhcce7d172000-05-31 15:34:51 +0000534*/
535void sqliteExprCode(Parse *pParse, Expr *pExpr){
536 Vdbe *v = pParse->pVdbe;
537 int op;
drhdaffd0e2001-04-11 14:28:42 +0000538 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000539 switch( pExpr->op ){
540 case TK_PLUS: op = OP_Add; break;
541 case TK_MINUS: op = OP_Subtract; break;
542 case TK_STAR: op = OP_Multiply; break;
543 case TK_SLASH: op = OP_Divide; break;
544 case TK_AND: op = OP_And; break;
545 case TK_OR: op = OP_Or; break;
546 case TK_LT: op = OP_Lt; break;
547 case TK_LE: op = OP_Le; break;
548 case TK_GT: op = OP_Gt; break;
549 case TK_GE: op = OP_Ge; break;
550 case TK_NE: op = OP_Ne; break;
551 case TK_EQ: op = OP_Eq; break;
552 case TK_LIKE: op = OP_Like; break;
553 case TK_GLOB: op = OP_Glob; break;
554 case TK_ISNULL: op = OP_IsNull; break;
555 case TK_NOTNULL: op = OP_NotNull; break;
556 case TK_NOT: op = OP_Not; break;
557 case TK_UMINUS: op = OP_Negative; break;
drhbf4133c2001-10-13 02:59:08 +0000558 case TK_BITAND: op = OP_BitAnd; break;
559 case TK_BITOR: op = OP_BitOr; break;
560 case TK_BITNOT: op = OP_BitNot; break;
561 case TK_LSHIFT: op = OP_ShiftLeft; break;
562 case TK_RSHIFT: op = OP_ShiftRight; break;
563 case TK_REM: op = OP_Remainder; break;
drhcce7d172000-05-31 15:34:51 +0000564 default: break;
565 }
566 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +0000567 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +0000568 if( pParse->useAgg ){
drh99fcd712001-10-13 01:06:47 +0000569 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drhc4a3c772001-04-04 11:48:57 +0000570 }else if( pExpr->iColumn>=0 ){
drh99fcd712001-10-13 01:06:47 +0000571 sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
drhc4a3c772001-04-04 11:48:57 +0000572 }else{
drh99fcd712001-10-13 01:06:47 +0000573 sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
drh22827922000-06-06 17:27:05 +0000574 }
drhcce7d172000-05-31 15:34:51 +0000575 break;
576 }
drhef6764a2002-01-30 04:32:00 +0000577 case TK_FLOAT:
drhcce7d172000-05-31 15:34:51 +0000578 case TK_INTEGER: {
drh7a7c7392001-11-24 00:31:46 +0000579 sqliteVdbeAddOp(v, OP_String, 0, 0);
580 sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
drhcce7d172000-05-31 15:34:51 +0000581 break;
582 }
drhcce7d172000-05-31 15:34:51 +0000583 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000584 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000585 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
586 sqliteVdbeDequoteP3(v, addr);
587 break;
588 }
589 case TK_NULL: {
drh99fcd712001-10-13 01:06:47 +0000590 sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000591 break;
592 }
593 case TK_AND:
594 case TK_OR:
595 case TK_PLUS:
596 case TK_STAR:
597 case TK_MINUS:
drhbf4133c2001-10-13 02:59:08 +0000598 case TK_REM:
599 case TK_BITAND:
600 case TK_BITOR:
drhcce7d172000-05-31 15:34:51 +0000601 case TK_SLASH: {
602 sqliteExprCode(pParse, pExpr->pLeft);
603 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000604 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000605 break;
606 }
drhbf4133c2001-10-13 02:59:08 +0000607 case TK_LSHIFT:
608 case TK_RSHIFT: {
609 sqliteExprCode(pParse, pExpr->pRight);
610 sqliteExprCode(pParse, pExpr->pLeft);
611 sqliteVdbeAddOp(v, op, 0, 0);
612 break;
613 }
drh00400772000-06-16 20:51:26 +0000614 case TK_CONCAT: {
615 sqliteExprCode(pParse, pExpr->pLeft);
616 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000617 sqliteVdbeAddOp(v, OP_Concat, 2, 0);
drh00400772000-06-16 20:51:26 +0000618 break;
619 }
drhcce7d172000-05-31 15:34:51 +0000620 case TK_LT:
621 case TK_LE:
622 case TK_GT:
623 case TK_GE:
624 case TK_NE:
625 case TK_EQ:
626 case TK_LIKE:
627 case TK_GLOB: {
628 int dest;
drh99fcd712001-10-13 01:06:47 +0000629 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000630 sqliteExprCode(pParse, pExpr->pLeft);
631 sqliteExprCode(pParse, pExpr->pRight);
632 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000633 sqliteVdbeAddOp(v, op, 0, dest);
634 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000635 break;
636 }
drhcce7d172000-05-31 15:34:51 +0000637 case TK_UMINUS: {
drh6e142f52000-06-08 13:36:40 +0000638 assert( pExpr->pLeft );
drh7a7c7392001-11-24 00:31:46 +0000639 if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
drh6e142f52000-06-08 13:36:40 +0000640 Token *p = &pExpr->pLeft->token;
641 char *z = sqliteMalloc( p->n + 2 );
642 sprintf(z, "-%.*s", p->n, p->z);
drh99fcd712001-10-13 01:06:47 +0000643 sqliteVdbeAddOp(v, OP_String, 0, 0);
644 sqliteVdbeChangeP3(v, -1, z, p->n+1);
drh6e142f52000-06-08 13:36:40 +0000645 sqliteFree(z);
646 break;
647 }
drh1ccde152000-06-17 13:12:39 +0000648 /* Fall through into TK_NOT */
drh6e142f52000-06-08 13:36:40 +0000649 }
drhbf4133c2001-10-13 02:59:08 +0000650 case TK_BITNOT:
drh6e142f52000-06-08 13:36:40 +0000651 case TK_NOT: {
drhcce7d172000-05-31 15:34:51 +0000652 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000653 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000654 break;
655 }
656 case TK_ISNULL:
657 case TK_NOTNULL: {
658 int dest;
drh99fcd712001-10-13 01:06:47 +0000659 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000660 sqliteExprCode(pParse, pExpr->pLeft);
661 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000662 sqliteVdbeAddOp(v, op, 0, dest);
663 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000664 break;
665 }
drh22827922000-06-06 17:27:05 +0000666 case TK_AGG_FUNCTION: {
drh99fcd712001-10-13 01:06:47 +0000667 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drh967e8b72000-06-21 13:59:10 +0000668 if( pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +0000669 assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
drh99fcd712001-10-13 01:06:47 +0000670 sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
671 sqliteVdbeAddOp(v, OP_Divide, 0, 0);
drh22827922000-06-06 17:27:05 +0000672 }
673 break;
674 }
drhcce7d172000-05-31 15:34:51 +0000675 case TK_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +0000676 int id = pExpr->iColumn;
drhcce7d172000-05-31 15:34:51 +0000677 int op;
678 int i;
679 ExprList *pList = pExpr->pList;
drh6ec27332000-08-28 15:51:43 +0000680 switch( id ){
drh6ec27332000-08-28 15:51:43 +0000681 case FN_Min:
682 case FN_Max: {
683 op = id==FN_Min ? OP_Min : OP_Max;
684 for(i=0; i<pList->nExpr; i++){
685 sqliteExprCode(pParse, pList->a[i].pExpr);
686 if( i>0 ){
drh99fcd712001-10-13 01:06:47 +0000687 sqliteVdbeAddOp(v, op, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000688 }
689 }
690 break;
691 }
drhbf4133c2001-10-13 02:59:08 +0000692 case FN_Abs: {
693 sqliteExprCode(pParse, pList->a[0].pExpr);
694 sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
695 break;
696 }
697 case FN_Round: {
698 if( pList->nExpr==2 ){
699 sqliteExprCode(pParse, pList->a[1].pExpr);
700 }else{
701 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
702 }
703 sqliteExprCode(pParse, pList->a[0].pExpr);
704 sqliteVdbeAddOp(v, OP_Precision, 0, 0);
705 break;
706 }
drh6ec27332000-08-28 15:51:43 +0000707 case FN_Length: {
708 sqliteExprCode(pParse, pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000709 sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000710 break;
711 }
712 case FN_Substr: {
713 for(i=0; i<pList->nExpr; i++){
714 sqliteExprCode(pParse, pList->a[i].pExpr);
715 }
drh99fcd712001-10-13 01:06:47 +0000716 sqliteVdbeAddOp(v, OP_Substr, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000717 break;
718 }
719 default: {
720 /* Can't happen! */
721 break;
drhcce7d172000-05-31 15:34:51 +0000722 }
723 }
724 break;
725 }
drh19a775c2000-06-05 18:54:46 +0000726 case TK_SELECT: {
drh99fcd712001-10-13 01:06:47 +0000727 sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
drh19a775c2000-06-05 18:54:46 +0000728 break;
729 }
drhfef52082000-06-06 01:50:43 +0000730 case TK_IN: {
731 int addr;
drh99fcd712001-10-13 01:06:47 +0000732 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhfef52082000-06-06 01:50:43 +0000733 sqliteExprCode(pParse, pExpr->pLeft);
734 addr = sqliteVdbeCurrentAddr(v);
735 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000736 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000737 }else{
drh99fcd712001-10-13 01:06:47 +0000738 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000739 }
drh99fcd712001-10-13 01:06:47 +0000740 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhfef52082000-06-06 01:50:43 +0000741 break;
742 }
743 case TK_BETWEEN: {
744 int lbl = sqliteVdbeMakeLabel(v);
drh99fcd712001-10-13 01:06:47 +0000745 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
drhfef52082000-06-06 01:50:43 +0000746 sqliteExprIfFalse(pParse, pExpr, lbl);
drh99fcd712001-10-13 01:06:47 +0000747 sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
drhfef52082000-06-06 01:50:43 +0000748 sqliteVdbeResolveLabel(v, lbl);
749 break;
750 }
drha2e00042002-01-22 03:13:42 +0000751 case TK_AS: {
752 sqliteExprCode(pParse, pExpr->pLeft);
753 break;
754 }
drhcce7d172000-05-31 15:34:51 +0000755 }
756 return;
757}
758
759/*
760** Generate code for a boolean expression such that a jump is made
761** to the label "dest" if the expression is true but execution
762** continues straight thru if the expression is false.
763*/
764void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
765 Vdbe *v = pParse->pVdbe;
766 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000767 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000768 switch( pExpr->op ){
769 case TK_LT: op = OP_Lt; break;
770 case TK_LE: op = OP_Le; break;
771 case TK_GT: op = OP_Gt; break;
772 case TK_GE: op = OP_Ge; break;
773 case TK_NE: op = OP_Ne; break;
774 case TK_EQ: op = OP_Eq; break;
775 case TK_LIKE: op = OP_Like; break;
776 case TK_GLOB: op = OP_Glob; break;
777 case TK_ISNULL: op = OP_IsNull; break;
778 case TK_NOTNULL: op = OP_NotNull; break;
779 default: break;
780 }
781 switch( pExpr->op ){
782 case TK_AND: {
783 int d2 = sqliteVdbeMakeLabel(v);
784 sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
785 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
786 sqliteVdbeResolveLabel(v, d2);
787 break;
788 }
789 case TK_OR: {
790 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
791 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
792 break;
793 }
794 case TK_NOT: {
795 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
796 break;
797 }
798 case TK_LT:
799 case TK_LE:
800 case TK_GT:
801 case TK_GE:
802 case TK_NE:
803 case TK_EQ:
804 case TK_LIKE:
805 case TK_GLOB: {
806 sqliteExprCode(pParse, pExpr->pLeft);
807 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000808 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000809 break;
810 }
811 case TK_ISNULL:
812 case TK_NOTNULL: {
813 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000814 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000815 break;
816 }
drhfef52082000-06-06 01:50:43 +0000817 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000818 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000819 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000820 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000821 }else{
drh99fcd712001-10-13 01:06:47 +0000822 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000823 }
824 break;
825 }
826 case TK_BETWEEN: {
827 int lbl = sqliteVdbeMakeLabel(v);
828 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000829 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000830 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000831 sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
drhfef52082000-06-06 01:50:43 +0000832 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000833 sqliteVdbeAddOp(v, OP_Le, 0, dest);
834 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
835 sqliteVdbeResolveLabel(v, lbl);
836 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
drhfef52082000-06-06 01:50:43 +0000837 break;
838 }
drhcce7d172000-05-31 15:34:51 +0000839 default: {
840 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000841 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000842 break;
843 }
844 }
845}
846
847/*
drh66b89c82000-11-28 20:47:17 +0000848** Generate code for a boolean expression such that a jump is made
drhcce7d172000-05-31 15:34:51 +0000849** to the label "dest" if the expression is false but execution
850** continues straight thru if the expression is true.
851*/
852void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
853 Vdbe *v = pParse->pVdbe;
854 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000855 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000856 switch( pExpr->op ){
857 case TK_LT: op = OP_Ge; break;
858 case TK_LE: op = OP_Gt; break;
859 case TK_GT: op = OP_Le; break;
860 case TK_GE: op = OP_Lt; break;
861 case TK_NE: op = OP_Eq; break;
862 case TK_EQ: op = OP_Ne; break;
863 case TK_LIKE: op = OP_Like; break;
864 case TK_GLOB: op = OP_Glob; break;
865 case TK_ISNULL: op = OP_NotNull; break;
866 case TK_NOTNULL: op = OP_IsNull; break;
867 default: break;
868 }
869 switch( pExpr->op ){
870 case TK_AND: {
871 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
872 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
873 break;
874 }
875 case TK_OR: {
876 int d2 = sqliteVdbeMakeLabel(v);
877 sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
878 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
879 sqliteVdbeResolveLabel(v, d2);
880 break;
881 }
882 case TK_NOT: {
883 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
884 break;
885 }
886 case TK_LT:
887 case TK_LE:
888 case TK_GT:
889 case TK_GE:
890 case TK_NE:
891 case TK_EQ: {
892 sqliteExprCode(pParse, pExpr->pLeft);
893 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000894 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000895 break;
896 }
897 case TK_LIKE:
898 case TK_GLOB: {
899 sqliteExprCode(pParse, pExpr->pLeft);
900 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000901 sqliteVdbeAddOp(v, op, 1, dest);
drhcce7d172000-05-31 15:34:51 +0000902 break;
903 }
904 case TK_ISNULL:
905 case TK_NOTNULL: {
906 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000907 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000908 break;
909 }
drhfef52082000-06-06 01:50:43 +0000910 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000911 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000912 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000913 sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000914 }else{
drh99fcd712001-10-13 01:06:47 +0000915 sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000916 }
917 break;
918 }
919 case TK_BETWEEN: {
920 int addr;
921 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000922 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000923 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
924 addr = sqliteVdbeCurrentAddr(v);
drh99fcd712001-10-13 01:06:47 +0000925 sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
926 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
927 sqliteVdbeAddOp(v, OP_Goto, 0, dest);
drhfef52082000-06-06 01:50:43 +0000928 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000929 sqliteVdbeAddOp(v, OP_Gt, 0, dest);
drhfef52082000-06-06 01:50:43 +0000930 break;
931 }
drhcce7d172000-05-31 15:34:51 +0000932 default: {
933 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000934 sqliteVdbeAddOp(v, OP_Not, 0, 0);
935 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000936 break;
937 }
938 }
939}
drh22827922000-06-06 17:27:05 +0000940
941/*
942** Do a deep comparison of two expression trees. Return TRUE (non-zero)
943** if they are identical and return FALSE if they differ in any way.
944*/
drhd8bc7082000-06-07 23:51:50 +0000945int sqliteExprCompare(Expr *pA, Expr *pB){
drh22827922000-06-06 17:27:05 +0000946 int i;
947 if( pA==0 ){
948 return pB==0;
949 }else if( pB==0 ){
950 return 0;
951 }
952 if( pA->op!=pB->op ) return 0;
drhd8bc7082000-06-07 23:51:50 +0000953 if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
954 if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
drh22827922000-06-06 17:27:05 +0000955 if( pA->pList ){
956 if( pB->pList==0 ) return 0;
957 if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
958 for(i=0; i<pA->pList->nExpr; i++){
drhd8bc7082000-06-07 23:51:50 +0000959 if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
drh22827922000-06-06 17:27:05 +0000960 return 0;
961 }
962 }
963 }else if( pB->pList ){
964 return 0;
965 }
966 if( pA->pSelect || pB->pSelect ) return 0;
967 if( pA->token.z ){
968 if( pB->token.z==0 ) return 0;
969 if( pB->token.n!=pA->token.n ) return 0;
970 if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
971 }
972 return 1;
973}
974
975/*
976** Add a new element to the pParse->aAgg[] array and return its index.
977*/
978static int appendAggInfo(Parse *pParse){
979 if( (pParse->nAgg & 0x7)==0 ){
980 int amt = pParse->nAgg + 8;
drh6d4abfb2001-10-22 02:58:08 +0000981 AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
982 if( aAgg==0 ){
drh22827922000-06-06 17:27:05 +0000983 return -1;
984 }
drh6d4abfb2001-10-22 02:58:08 +0000985 pParse->aAgg = aAgg;
drh22827922000-06-06 17:27:05 +0000986 }
987 memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
988 return pParse->nAgg++;
989}
990
991/*
992** Analyze the given expression looking for aggregate functions and
993** for variables that need to be added to the pParse->aAgg[] array.
994** Make additional entries to the pParse->aAgg[] array as necessary.
995**
996** This routine should only be called after the expression has been
997** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
998**
999** If errors are seen, leave an error message in zErrMsg and return
1000** the number of errors.
1001*/
1002int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
1003 int i;
1004 AggExpr *aAgg;
1005 int nErr = 0;
1006
1007 if( pExpr==0 ) return 0;
1008 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +00001009 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +00001010 aAgg = pParse->aAgg;
1011 for(i=0; i<pParse->nAgg; i++){
1012 if( aAgg[i].isAgg ) continue;
1013 if( aAgg[i].pExpr->iTable==pExpr->iTable
drh967e8b72000-06-21 13:59:10 +00001014 && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
drh22827922000-06-06 17:27:05 +00001015 break;
1016 }
1017 }
1018 if( i>=pParse->nAgg ){
1019 i = appendAggInfo(pParse);
1020 if( i<0 ) return 1;
1021 pParse->aAgg[i].isAgg = 0;
1022 pParse->aAgg[i].pExpr = pExpr;
1023 }
drhaaf88722000-06-08 11:25:00 +00001024 pExpr->iAgg = i;
drh22827922000-06-06 17:27:05 +00001025 break;
1026 }
1027 case TK_AGG_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +00001028 if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +00001029 if( pParse->iAggCount>=0 ){
1030 i = pParse->iAggCount;
1031 }else{
1032 i = appendAggInfo(pParse);
1033 if( i<0 ) return 1;
1034 pParse->aAgg[i].isAgg = 1;
1035 pParse->aAgg[i].pExpr = 0;
1036 pParse->iAggCount = i;
1037 }
drh967e8b72000-06-21 13:59:10 +00001038 if( pExpr->iColumn==FN_Count ){
drh22827922000-06-06 17:27:05 +00001039 pExpr->iAgg = i;
1040 break;
1041 }
1042 }
1043 aAgg = pParse->aAgg;
1044 for(i=0; i<pParse->nAgg; i++){
1045 if( !aAgg[i].isAgg ) continue;
drhd8bc7082000-06-07 23:51:50 +00001046 if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
drh22827922000-06-06 17:27:05 +00001047 break;
1048 }
1049 }
1050 if( i>=pParse->nAgg ){
1051 i = appendAggInfo(pParse);
1052 if( i<0 ) return 1;
1053 pParse->aAgg[i].isAgg = 1;
1054 pParse->aAgg[i].pExpr = pExpr;
1055 }
1056 pExpr->iAgg = i;
1057 break;
1058 }
1059 default: {
1060 if( pExpr->pLeft ){
1061 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
1062 }
1063 if( nErr==0 && pExpr->pRight ){
1064 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
1065 }
1066 if( nErr==0 && pExpr->pList ){
1067 int n = pExpr->pList->nExpr;
1068 int i;
1069 for(i=0; nErr==0 && i<n; i++){
1070 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
1071 }
1072 }
1073 break;
1074 }
1075 }
1076 return nErr;
1077}