blob: 802c874bcc30bc1a51bb8c7a870f5e1d1a29fd41 [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**
drh92086432002-01-22 14:11:29 +000015** $Id: expr.c,v 1.39 2002/01/22 14:11:29 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);
drhdaffd0e2001-04-11 14:28:42 +0000160 if( z==0 ) return 1;
drhcce7d172000-05-31 15:34:51 +0000161 for(i=0; i<pTabList->nId; i++){
162 int j;
163 Table *pTab = pTabList->a[i].pTab;
164 if( pTab==0 ) continue;
165 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000166 if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){
drhcce7d172000-05-31 15:34:51 +0000167 cnt++;
drh19a775c2000-06-05 18:54:46 +0000168 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000169 if( j==pTab->iPKey ){
170 /* Substitute the record number for the INTEGER PRIMARY KEY */
171 pExpr->iColumn = -1;
172 }else{
173 pExpr->iColumn = j;
174 }
drha2e00042002-01-22 03:13:42 +0000175 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000176 }
177 }
178 }
drha2e00042002-01-22 03:13:42 +0000179 if( cnt==0 && pEList!=0 ){
180 int j;
181 for(j=0; j<pEList->nExpr; j++){
182 char *zAs = pEList->a[j].zName;
183 if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){
184 cnt++;
185 assert( pExpr->pLeft==0 && pExpr->pRight==0 );
186 pExpr->op = TK_AS;
187 pExpr->iColumn = j;
188 pExpr->pLeft = pEList->a[j].pExpr;
189 }
190 }
191 }
drhc4a3c772001-04-04 11:48:57 +0000192 if( cnt==0 && sqliteIsRowid(z) ){
193 pExpr->iColumn = -1;
194 pExpr->iTable = pParse->nTab;
195 cnt = 1 + (pTabList->nId>1);
drha2e00042002-01-22 03:13:42 +0000196 pExpr->op = TK_COLUMN;
drhc4a3c772001-04-04 11:48:57 +0000197 }
drhcce7d172000-05-31 15:34:51 +0000198 sqliteFree(z);
199 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000200 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000201 pExpr->token.z, pExpr->token.n, 0);
202 pParse->nErr++;
203 return 1;
204 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000205 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000206 pExpr->token.z, pExpr->token.n, 0);
207 pParse->nErr++;
208 return 1;
209 }
drhcce7d172000-05-31 15:34:51 +0000210 break;
211 }
212
drh967e8b72000-06-21 13:59:10 +0000213 /* A table name and column name: ID.ID */
drhcce7d172000-05-31 15:34:51 +0000214 case TK_DOT: {
drhbed86902000-06-02 13:27:59 +0000215 int cnt = 0; /* Number of matches */
drhc4a3c772001-04-04 11:48:57 +0000216 int cntTab = 0; /* Number of matching tables */
drhbed86902000-06-02 13:27:59 +0000217 int i; /* Loop counter */
drhcce7d172000-05-31 15:34:51 +0000218 Expr *pLeft, *pRight; /* Left and right subbranches of the expr */
drhcce7d172000-05-31 15:34:51 +0000219 char *zLeft, *zRight; /* Text of an identifier */
220
221 pLeft = pExpr->pLeft;
222 pRight = pExpr->pRight;
223 assert( pLeft && pLeft->op==TK_ID );
224 assert( pRight && pRight->op==TK_ID );
drh6e142f52000-06-08 13:36:40 +0000225 zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
226 zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
drhdaffd0e2001-04-11 14:28:42 +0000227 if( zLeft==0 || zRight==0 ){
228 sqliteFree(zLeft);
229 sqliteFree(zRight);
230 return 1;
231 }
drh87c40e82001-07-23 14:33:02 +0000232 sqliteDequote(zLeft);
233 sqliteDequote(zRight);
drhc4a3c772001-04-04 11:48:57 +0000234 pExpr->iTable = -1;
drhcce7d172000-05-31 15:34:51 +0000235 for(i=0; i<pTabList->nId; i++){
236 int j;
237 char *zTab;
238 Table *pTab = pTabList->a[i].pTab;
239 if( pTab==0 ) continue;
240 if( pTabList->a[i].zAlias ){
241 zTab = pTabList->a[i].zAlias;
242 }else{
243 zTab = pTab->zName;
244 }
245 if( sqliteStrICmp(zTab, zLeft)!=0 ) continue;
drhc4a3c772001-04-04 11:48:57 +0000246 if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab;
drhcce7d172000-05-31 15:34:51 +0000247 for(j=0; j<pTab->nCol; j++){
drh7020f652000-06-03 18:06:52 +0000248 if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){
drhcce7d172000-05-31 15:34:51 +0000249 cnt++;
drh19a775c2000-06-05 18:54:46 +0000250 pExpr->iTable = i + pParse->nTab;
drh4a324312001-12-21 14:30:42 +0000251 if( j==pTab->iPKey ){
252 /* Substitute the record number for the INTEGER PRIMARY KEY */
253 pExpr->iColumn = -1;
254 }else{
255 pExpr->iColumn = j;
256 }
drhcce7d172000-05-31 15:34:51 +0000257 }
258 }
259 }
drhc4a3c772001-04-04 11:48:57 +0000260 if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){
261 cnt = 1;
262 pExpr->iColumn = -1;
263 }
drhcce7d172000-05-31 15:34:51 +0000264 sqliteFree(zLeft);
265 sqliteFree(zRight);
266 if( cnt==0 ){
drh967e8b72000-06-21 13:59:10 +0000267 sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1,
drhcce7d172000-05-31 15:34:51 +0000268 pLeft->token.z, pLeft->token.n, ".", 1,
269 pRight->token.z, pRight->token.n, 0);
270 pParse->nErr++;
271 return 1;
272 }else if( cnt>1 ){
drh967e8b72000-06-21 13:59:10 +0000273 sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1,
drhcce7d172000-05-31 15:34:51 +0000274 pLeft->token.z, pLeft->token.n, ".", 1,
275 pRight->token.z, pRight->token.n, 0);
276 pParse->nErr++;
277 return 1;
278 }
279 sqliteExprDelete(pLeft);
280 pExpr->pLeft = 0;
281 sqliteExprDelete(pRight);
282 pExpr->pRight = 0;
drh967e8b72000-06-21 13:59:10 +0000283 pExpr->op = TK_COLUMN;
drhcce7d172000-05-31 15:34:51 +0000284 break;
285 }
286
drhfef52082000-06-06 01:50:43 +0000287 case TK_IN: {
drhd8bc7082000-06-07 23:51:50 +0000288 Vdbe *v = sqliteGetVdbe(pParse);
drhfef52082000-06-06 01:50:43 +0000289 if( v==0 ) return 1;
drha2e00042002-01-22 03:13:42 +0000290 if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
drhcfab11b2000-06-06 03:31:22 +0000291 return 1;
292 }
drhfef52082000-06-06 01:50:43 +0000293 if( pExpr->pSelect ){
294 /* Case 1: expr IN (SELECT ...)
295 **
296 ** Generate code to write the results of the select into a temporary
drh4794b982000-06-06 13:54:14 +0000297 ** table. The cursor number of the temporary table has already
298 ** been put in iTable by sqliteExprResolveInSelect().
drhfef52082000-06-06 01:50:43 +0000299 */
drhc6b52df2002-01-04 03:09:29 +0000300 sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1);
drhfef52082000-06-06 01:50:43 +0000301 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) );
302 }else if( pExpr->pList ){
303 /* Case 2: expr IN (exprlist)
304 **
305 ** Create a set to put the exprlist values in. The Set id is stored
306 ** in iTable.
307 */
308 int i, iSet;
309 for(i=0; i<pExpr->pList->nExpr; i++){
310 Expr *pE2 = pExpr->pList->a[i].pExpr;
drh92086432002-01-22 14:11:29 +0000311 if( !sqliteExprIsConstant(pE2) ){
drhfef52082000-06-06 01:50:43 +0000312 sqliteSetString(&pParse->zErrMsg,
313 "right-hand side of IN operator must be constant", 0);
314 pParse->nErr++;
315 return 1;
316 }
drh4794b982000-06-06 13:54:14 +0000317 if( sqliteExprCheck(pParse, pE2, 0, 0) ){
318 return 1;
319 }
drhfef52082000-06-06 01:50:43 +0000320 }
321 iSet = pExpr->iTable = pParse->nSet++;
322 for(i=0; i<pExpr->pList->nExpr; i++){
323 Expr *pE2 = pExpr->pList->a[i].pExpr;
324 switch( pE2->op ){
325 case TK_FLOAT:
326 case TK_INTEGER:
327 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000328 int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000329 sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n);
330 sqliteVdbeDequoteP3(v, addr);
331 break;
332 }
333 default: {
334 sqliteExprCode(pParse, pE2);
drh99fcd712001-10-13 01:06:47 +0000335 sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0);
drhfef52082000-06-06 01:50:43 +0000336 break;
337 }
338 }
339 }
340 }
drhcfab11b2000-06-06 03:31:22 +0000341 break;
drhfef52082000-06-06 01:50:43 +0000342 }
343
drh19a775c2000-06-05 18:54:46 +0000344 case TK_SELECT: {
drhfef52082000-06-06 01:50:43 +0000345 /* This has to be a scalar SELECT. Generate code to put the
346 ** value of this select in a memory cell and record the number
drh967e8b72000-06-21 13:59:10 +0000347 ** of the memory cell in iColumn.
drhfef52082000-06-06 01:50:43 +0000348 */
drh967e8b72000-06-21 13:59:10 +0000349 pExpr->iColumn = pParse->nMem++;
350 if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){
drh19a775c2000-06-05 18:54:46 +0000351 return 1;
352 }
353 break;
354 }
355
drhcce7d172000-05-31 15:34:51 +0000356 /* For all else, just recursively walk the tree */
357 default: {
drh4794b982000-06-06 13:54:14 +0000358 if( pExpr->pLeft
drha2e00042002-01-22 03:13:42 +0000359 && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){
drhcce7d172000-05-31 15:34:51 +0000360 return 1;
361 }
362 if( pExpr->pRight
drha2e00042002-01-22 03:13:42 +0000363 && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){
drhcce7d172000-05-31 15:34:51 +0000364 return 1;
365 }
366 if( pExpr->pList ){
367 int i;
368 ExprList *pList = pExpr->pList;
369 for(i=0; i<pList->nExpr; i++){
drha2e00042002-01-22 03:13:42 +0000370 if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){
drhcce7d172000-05-31 15:34:51 +0000371 return 1;
372 }
373 }
374 }
375 }
376 }
377 return 0;
378}
379
380#if 0 /* NOT USED */
381/*
382** Compare a token against a string. Return TRUE if they match.
383*/
384static int sqliteTokenCmp(Token *pToken, const char *zStr){
385 int n = strlen(zStr);
386 if( n!=pToken->n ) return 0;
387 return sqliteStrNICmp(pToken->z, zStr, n)==0;
388}
389#endif
390
391/*
392** Convert a function name into its integer identifier. Return the
393** identifier. Return FN_Unknown if the function name is unknown.
394*/
395int sqliteFuncId(Token *pToken){
396 static const struct {
397 char *zName;
398 int len;
399 int id;
400 } aFunc[] = {
drhbf4133c2001-10-13 02:59:08 +0000401 { "count", 5, FN_Count },
402 { "min", 3, FN_Min },
403 { "max", 3, FN_Max },
404 { "sum", 3, FN_Sum },
405 { "avg", 3, FN_Avg },
drhbf4133c2001-10-13 02:59:08 +0000406 { "length", 6, FN_Length },
407 { "substr", 6, FN_Substr },
408 { "abs", 3, FN_Abs },
409 { "round", 5, FN_Round },
drhcce7d172000-05-31 15:34:51 +0000410 };
411 int i;
412 for(i=0; i<ArraySize(aFunc); i++){
413 if( aFunc[i].len==pToken->n
414 && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){
415 return aFunc[i].id;
416 }
417 }
418 return FN_Unknown;
419}
420
421/*
422** Error check the functions in an expression. Make sure all
423** function names are recognized and all functions have the correct
424** number of arguments. Leave an error message in pParse->zErrMsg
425** if anything is amiss. Return the number of errors.
426**
427** if pIsAgg is not null and this expression is an aggregate function
428** (like count(*) or max(value)) then write a 1 into *pIsAgg.
429*/
430int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){
431 int nErr = 0;
432 if( pExpr==0 ) return 0;
drhcce7d172000-05-31 15:34:51 +0000433 switch( pExpr->op ){
434 case TK_FUNCTION: {
435 int id = sqliteFuncId(&pExpr->token);
436 int n = pExpr->pList ? pExpr->pList->nExpr : 0;
437 int no_such_func = 0;
438 int too_many_args = 0;
439 int too_few_args = 0;
440 int is_agg = 0;
441 int i;
drh967e8b72000-06-21 13:59:10 +0000442 pExpr->iColumn = id;
drhcce7d172000-05-31 15:34:51 +0000443 switch( id ){
444 case FN_Unknown: {
445 no_such_func = 1;
446 break;
447 }
448 case FN_Count: {
449 no_such_func = !allowAgg;
450 too_many_args = n>1;
451 is_agg = 1;
452 break;
453 }
454 case FN_Max:
455 case FN_Min: {
456 too_few_args = allowAgg ? n<1 : n<2;
457 is_agg = n==1;
458 break;
459 }
drh22827922000-06-06 17:27:05 +0000460 case FN_Avg:
drhcce7d172000-05-31 15:34:51 +0000461 case FN_Sum: {
462 no_such_func = !allowAgg;
463 too_many_args = n>1;
464 too_few_args = n<1;
465 is_agg = 1;
466 break;
467 }
drhbf4133c2001-10-13 02:59:08 +0000468 case FN_Abs:
drh6ec27332000-08-28 15:51:43 +0000469 case FN_Length: {
470 too_few_args = n<1;
471 too_many_args = n>1;
472 break;
473 }
drhbf4133c2001-10-13 02:59:08 +0000474 case FN_Round: {
475 too_few_args = n<1;
476 too_many_args = n>2;
477 break;
478 }
drh6ec27332000-08-28 15:51:43 +0000479 case FN_Substr: {
480 too_few_args = n<3;
481 too_many_args = n>3;
482 break;
483 }
drhcce7d172000-05-31 15:34:51 +0000484 default: break;
485 }
486 if( no_such_func ){
487 sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1,
488 pExpr->token.z, pExpr->token.n, 0);
489 pParse->nErr++;
490 nErr++;
491 }else if( too_many_args ){
492 sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1,
493 pExpr->token.z, pExpr->token.n, "()", 2, 0);
494 pParse->nErr++;
495 nErr++;
496 }else if( too_few_args ){
497 sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1,
498 pExpr->token.z, pExpr->token.n, "()", 2, 0);
499 pParse->nErr++;
500 nErr++;
501 }
drh22827922000-06-06 17:27:05 +0000502 if( is_agg ) pExpr->op = TK_AGG_FUNCTION;
drhcce7d172000-05-31 15:34:51 +0000503 if( is_agg && pIsAgg ) *pIsAgg = 1;
504 for(i=0; nErr==0 && i<n; i++){
drh4cfa7932000-06-08 15:10:46 +0000505 nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr,
506 allowAgg && !is_agg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000507 }
508 }
509 default: {
510 if( pExpr->pLeft ){
drh22827922000-06-06 17:27:05 +0000511 nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000512 }
513 if( nErr==0 && pExpr->pRight ){
drh22827922000-06-06 17:27:05 +0000514 nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg);
drhcce7d172000-05-31 15:34:51 +0000515 }
drhfef52082000-06-06 01:50:43 +0000516 if( nErr==0 && pExpr->pList ){
517 int n = pExpr->pList->nExpr;
518 int i;
519 for(i=0; nErr==0 && i<n; i++){
drh22827922000-06-06 17:27:05 +0000520 Expr *pE2 = pExpr->pList->a[i].pExpr;
521 nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg);
drhfef52082000-06-06 01:50:43 +0000522 }
523 }
drhcce7d172000-05-31 15:34:51 +0000524 break;
525 }
526 }
527 return nErr;
528}
529
530/*
531** Generate code into the current Vdbe to evaluate the given
drh1ccde152000-06-17 13:12:39 +0000532** expression and leave the result on the top of stack.
drhcce7d172000-05-31 15:34:51 +0000533*/
534void sqliteExprCode(Parse *pParse, Expr *pExpr){
535 Vdbe *v = pParse->pVdbe;
536 int op;
drhdaffd0e2001-04-11 14:28:42 +0000537 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000538 switch( pExpr->op ){
539 case TK_PLUS: op = OP_Add; break;
540 case TK_MINUS: op = OP_Subtract; break;
541 case TK_STAR: op = OP_Multiply; break;
542 case TK_SLASH: op = OP_Divide; break;
543 case TK_AND: op = OP_And; break;
544 case TK_OR: op = OP_Or; break;
545 case TK_LT: op = OP_Lt; break;
546 case TK_LE: op = OP_Le; break;
547 case TK_GT: op = OP_Gt; break;
548 case TK_GE: op = OP_Ge; break;
549 case TK_NE: op = OP_Ne; break;
550 case TK_EQ: op = OP_Eq; break;
551 case TK_LIKE: op = OP_Like; break;
552 case TK_GLOB: op = OP_Glob; break;
553 case TK_ISNULL: op = OP_IsNull; break;
554 case TK_NOTNULL: op = OP_NotNull; break;
555 case TK_NOT: op = OP_Not; break;
556 case TK_UMINUS: op = OP_Negative; break;
drhbf4133c2001-10-13 02:59:08 +0000557 case TK_BITAND: op = OP_BitAnd; break;
558 case TK_BITOR: op = OP_BitOr; break;
559 case TK_BITNOT: op = OP_BitNot; break;
560 case TK_LSHIFT: op = OP_ShiftLeft; break;
561 case TK_RSHIFT: op = OP_ShiftRight; break;
562 case TK_REM: op = OP_Remainder; break;
drhcce7d172000-05-31 15:34:51 +0000563 default: break;
564 }
565 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +0000566 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +0000567 if( pParse->useAgg ){
drh99fcd712001-10-13 01:06:47 +0000568 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drhc4a3c772001-04-04 11:48:57 +0000569 }else if( pExpr->iColumn>=0 ){
drh99fcd712001-10-13 01:06:47 +0000570 sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn);
drhc4a3c772001-04-04 11:48:57 +0000571 }else{
drh99fcd712001-10-13 01:06:47 +0000572 sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0);
drh22827922000-06-06 17:27:05 +0000573 }
drhcce7d172000-05-31 15:34:51 +0000574 break;
575 }
576 case TK_INTEGER: {
drh7a7c7392001-11-24 00:31:46 +0000577 sqliteVdbeAddOp(v, OP_String, 0, 0);
578 sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n);
drhcce7d172000-05-31 15:34:51 +0000579 break;
580 }
581 case TK_FLOAT: {
drh99fcd712001-10-13 01:06:47 +0000582 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000583 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
584 break;
585 }
586 case TK_STRING: {
drh99fcd712001-10-13 01:06:47 +0000587 int addr = sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000588 sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n);
589 sqliteVdbeDequoteP3(v, addr);
590 break;
591 }
592 case TK_NULL: {
drh99fcd712001-10-13 01:06:47 +0000593 sqliteVdbeAddOp(v, OP_String, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000594 break;
595 }
596 case TK_AND:
597 case TK_OR:
598 case TK_PLUS:
599 case TK_STAR:
600 case TK_MINUS:
drhbf4133c2001-10-13 02:59:08 +0000601 case TK_REM:
602 case TK_BITAND:
603 case TK_BITOR:
drhcce7d172000-05-31 15:34:51 +0000604 case TK_SLASH: {
605 sqliteExprCode(pParse, pExpr->pLeft);
606 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000607 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000608 break;
609 }
drhbf4133c2001-10-13 02:59:08 +0000610 case TK_LSHIFT:
611 case TK_RSHIFT: {
612 sqliteExprCode(pParse, pExpr->pRight);
613 sqliteExprCode(pParse, pExpr->pLeft);
614 sqliteVdbeAddOp(v, op, 0, 0);
615 break;
616 }
drh00400772000-06-16 20:51:26 +0000617 case TK_CONCAT: {
618 sqliteExprCode(pParse, pExpr->pLeft);
619 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000620 sqliteVdbeAddOp(v, OP_Concat, 2, 0);
drh00400772000-06-16 20:51:26 +0000621 break;
622 }
drhcce7d172000-05-31 15:34:51 +0000623 case TK_LT:
624 case TK_LE:
625 case TK_GT:
626 case TK_GE:
627 case TK_NE:
628 case TK_EQ:
629 case TK_LIKE:
630 case TK_GLOB: {
631 int dest;
drh99fcd712001-10-13 01:06:47 +0000632 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000633 sqliteExprCode(pParse, pExpr->pLeft);
634 sqliteExprCode(pParse, pExpr->pRight);
635 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000636 sqliteVdbeAddOp(v, op, 0, dest);
637 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000638 break;
639 }
drhcce7d172000-05-31 15:34:51 +0000640 case TK_UMINUS: {
drh6e142f52000-06-08 13:36:40 +0000641 assert( pExpr->pLeft );
drh7a7c7392001-11-24 00:31:46 +0000642 if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){
drh6e142f52000-06-08 13:36:40 +0000643 Token *p = &pExpr->pLeft->token;
644 char *z = sqliteMalloc( p->n + 2 );
645 sprintf(z, "-%.*s", p->n, p->z);
drh99fcd712001-10-13 01:06:47 +0000646 sqliteVdbeAddOp(v, OP_String, 0, 0);
647 sqliteVdbeChangeP3(v, -1, z, p->n+1);
drh6e142f52000-06-08 13:36:40 +0000648 sqliteFree(z);
649 break;
650 }
drh1ccde152000-06-17 13:12:39 +0000651 /* Fall through into TK_NOT */
drh6e142f52000-06-08 13:36:40 +0000652 }
drhbf4133c2001-10-13 02:59:08 +0000653 case TK_BITNOT:
drh6e142f52000-06-08 13:36:40 +0000654 case TK_NOT: {
drhcce7d172000-05-31 15:34:51 +0000655 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000656 sqliteVdbeAddOp(v, op, 0, 0);
drhcce7d172000-05-31 15:34:51 +0000657 break;
658 }
659 case TK_ISNULL:
660 case TK_NOTNULL: {
661 int dest;
drh99fcd712001-10-13 01:06:47 +0000662 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhcce7d172000-05-31 15:34:51 +0000663 sqliteExprCode(pParse, pExpr->pLeft);
664 dest = sqliteVdbeCurrentAddr(v) + 2;
drh99fcd712001-10-13 01:06:47 +0000665 sqliteVdbeAddOp(v, op, 0, dest);
666 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhcce7d172000-05-31 15:34:51 +0000667 break;
668 }
drh22827922000-06-06 17:27:05 +0000669 case TK_AGG_FUNCTION: {
drh99fcd712001-10-13 01:06:47 +0000670 sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg);
drh967e8b72000-06-21 13:59:10 +0000671 if( pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +0000672 assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg );
drh99fcd712001-10-13 01:06:47 +0000673 sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount);
674 sqliteVdbeAddOp(v, OP_Divide, 0, 0);
drh22827922000-06-06 17:27:05 +0000675 }
676 break;
677 }
drhcce7d172000-05-31 15:34:51 +0000678 case TK_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +0000679 int id = pExpr->iColumn;
drhcce7d172000-05-31 15:34:51 +0000680 int op;
681 int i;
682 ExprList *pList = pExpr->pList;
drh6ec27332000-08-28 15:51:43 +0000683 switch( id ){
drh6ec27332000-08-28 15:51:43 +0000684 case FN_Min:
685 case FN_Max: {
686 op = id==FN_Min ? OP_Min : OP_Max;
687 for(i=0; i<pList->nExpr; i++){
688 sqliteExprCode(pParse, pList->a[i].pExpr);
689 if( i>0 ){
drh99fcd712001-10-13 01:06:47 +0000690 sqliteVdbeAddOp(v, op, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000691 }
692 }
693 break;
694 }
drhbf4133c2001-10-13 02:59:08 +0000695 case FN_Abs: {
696 sqliteExprCode(pParse, pList->a[0].pExpr);
697 sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
698 break;
699 }
700 case FN_Round: {
701 if( pList->nExpr==2 ){
702 sqliteExprCode(pParse, pList->a[1].pExpr);
703 }else{
704 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
705 }
706 sqliteExprCode(pParse, pList->a[0].pExpr);
707 sqliteVdbeAddOp(v, OP_Precision, 0, 0);
708 break;
709 }
drh6ec27332000-08-28 15:51:43 +0000710 case FN_Length: {
711 sqliteExprCode(pParse, pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000712 sqliteVdbeAddOp(v, OP_Strlen, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000713 break;
714 }
715 case FN_Substr: {
716 for(i=0; i<pList->nExpr; i++){
717 sqliteExprCode(pParse, pList->a[i].pExpr);
718 }
drh99fcd712001-10-13 01:06:47 +0000719 sqliteVdbeAddOp(v, OP_Substr, 0, 0);
drh6ec27332000-08-28 15:51:43 +0000720 break;
721 }
722 default: {
723 /* Can't happen! */
724 break;
drhcce7d172000-05-31 15:34:51 +0000725 }
726 }
727 break;
728 }
drh19a775c2000-06-05 18:54:46 +0000729 case TK_SELECT: {
drh99fcd712001-10-13 01:06:47 +0000730 sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0);
drh19a775c2000-06-05 18:54:46 +0000731 break;
732 }
drhfef52082000-06-06 01:50:43 +0000733 case TK_IN: {
734 int addr;
drh99fcd712001-10-13 01:06:47 +0000735 sqliteVdbeAddOp(v, OP_Integer, 1, 0);
drhfef52082000-06-06 01:50:43 +0000736 sqliteExprCode(pParse, pExpr->pLeft);
737 addr = sqliteVdbeCurrentAddr(v);
738 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000739 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000740 }else{
drh99fcd712001-10-13 01:06:47 +0000741 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2);
drhfef52082000-06-06 01:50:43 +0000742 }
drh99fcd712001-10-13 01:06:47 +0000743 sqliteVdbeAddOp(v, OP_AddImm, -1, 0);
drhfef52082000-06-06 01:50:43 +0000744 break;
745 }
746 case TK_BETWEEN: {
747 int lbl = sqliteVdbeMakeLabel(v);
drh99fcd712001-10-13 01:06:47 +0000748 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
drhfef52082000-06-06 01:50:43 +0000749 sqliteExprIfFalse(pParse, pExpr, lbl);
drh99fcd712001-10-13 01:06:47 +0000750 sqliteVdbeAddOp(v, OP_AddImm, 1, 0);
drhfef52082000-06-06 01:50:43 +0000751 sqliteVdbeResolveLabel(v, lbl);
752 break;
753 }
drha2e00042002-01-22 03:13:42 +0000754 case TK_AS: {
755 sqliteExprCode(pParse, pExpr->pLeft);
756 break;
757 }
drhcce7d172000-05-31 15:34:51 +0000758 }
759 return;
760}
761
762/*
763** Generate code for a boolean expression such that a jump is made
764** to the label "dest" if the expression is true but execution
765** continues straight thru if the expression is false.
766*/
767void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){
768 Vdbe *v = pParse->pVdbe;
769 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000770 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000771 switch( pExpr->op ){
772 case TK_LT: op = OP_Lt; break;
773 case TK_LE: op = OP_Le; break;
774 case TK_GT: op = OP_Gt; break;
775 case TK_GE: op = OP_Ge; break;
776 case TK_NE: op = OP_Ne; break;
777 case TK_EQ: op = OP_Eq; break;
778 case TK_LIKE: op = OP_Like; break;
779 case TK_GLOB: op = OP_Glob; break;
780 case TK_ISNULL: op = OP_IsNull; break;
781 case TK_NOTNULL: op = OP_NotNull; break;
782 default: break;
783 }
784 switch( pExpr->op ){
785 case TK_AND: {
786 int d2 = sqliteVdbeMakeLabel(v);
787 sqliteExprIfFalse(pParse, pExpr->pLeft, d2);
788 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
789 sqliteVdbeResolveLabel(v, d2);
790 break;
791 }
792 case TK_OR: {
793 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
794 sqliteExprIfTrue(pParse, pExpr->pRight, dest);
795 break;
796 }
797 case TK_NOT: {
798 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
799 break;
800 }
801 case TK_LT:
802 case TK_LE:
803 case TK_GT:
804 case TK_GE:
805 case TK_NE:
806 case TK_EQ:
807 case TK_LIKE:
808 case TK_GLOB: {
809 sqliteExprCode(pParse, pExpr->pLeft);
810 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000811 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000812 break;
813 }
814 case TK_ISNULL:
815 case TK_NOTNULL: {
816 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000817 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000818 break;
819 }
drhfef52082000-06-06 01:50:43 +0000820 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000821 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000822 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000823 sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000824 }else{
drh99fcd712001-10-13 01:06:47 +0000825 sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000826 }
827 break;
828 }
829 case TK_BETWEEN: {
830 int lbl = sqliteVdbeMakeLabel(v);
831 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000832 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000833 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
drh99fcd712001-10-13 01:06:47 +0000834 sqliteVdbeAddOp(v, OP_Lt, 0, lbl);
drhfef52082000-06-06 01:50:43 +0000835 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000836 sqliteVdbeAddOp(v, OP_Le, 0, dest);
837 sqliteVdbeAddOp(v, OP_Integer, 0, 0);
838 sqliteVdbeResolveLabel(v, lbl);
839 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
drhfef52082000-06-06 01:50:43 +0000840 break;
841 }
drhcce7d172000-05-31 15:34:51 +0000842 default: {
843 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000844 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000845 break;
846 }
847 }
848}
849
850/*
drh66b89c82000-11-28 20:47:17 +0000851** Generate code for a boolean expression such that a jump is made
drhcce7d172000-05-31 15:34:51 +0000852** to the label "dest" if the expression is false but execution
853** continues straight thru if the expression is true.
854*/
855void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){
856 Vdbe *v = pParse->pVdbe;
857 int op = 0;
drhdaffd0e2001-04-11 14:28:42 +0000858 if( v==0 || pExpr==0 ) return;
drhcce7d172000-05-31 15:34:51 +0000859 switch( pExpr->op ){
860 case TK_LT: op = OP_Ge; break;
861 case TK_LE: op = OP_Gt; break;
862 case TK_GT: op = OP_Le; break;
863 case TK_GE: op = OP_Lt; break;
864 case TK_NE: op = OP_Eq; break;
865 case TK_EQ: op = OP_Ne; break;
866 case TK_LIKE: op = OP_Like; break;
867 case TK_GLOB: op = OP_Glob; break;
868 case TK_ISNULL: op = OP_NotNull; break;
869 case TK_NOTNULL: op = OP_IsNull; break;
870 default: break;
871 }
872 switch( pExpr->op ){
873 case TK_AND: {
874 sqliteExprIfFalse(pParse, pExpr->pLeft, dest);
875 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
876 break;
877 }
878 case TK_OR: {
879 int d2 = sqliteVdbeMakeLabel(v);
880 sqliteExprIfTrue(pParse, pExpr->pLeft, d2);
881 sqliteExprIfFalse(pParse, pExpr->pRight, dest);
882 sqliteVdbeResolveLabel(v, d2);
883 break;
884 }
885 case TK_NOT: {
886 sqliteExprIfTrue(pParse, pExpr->pLeft, dest);
887 break;
888 }
889 case TK_LT:
890 case TK_LE:
891 case TK_GT:
892 case TK_GE:
893 case TK_NE:
894 case TK_EQ: {
895 sqliteExprCode(pParse, pExpr->pLeft);
896 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000897 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000898 break;
899 }
900 case TK_LIKE:
901 case TK_GLOB: {
902 sqliteExprCode(pParse, pExpr->pLeft);
903 sqliteExprCode(pParse, pExpr->pRight);
drh99fcd712001-10-13 01:06:47 +0000904 sqliteVdbeAddOp(v, op, 1, dest);
drhcce7d172000-05-31 15:34:51 +0000905 break;
906 }
907 case TK_ISNULL:
908 case TK_NOTNULL: {
909 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000910 sqliteVdbeAddOp(v, op, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000911 break;
912 }
drhfef52082000-06-06 01:50:43 +0000913 case TK_IN: {
drhcfab11b2000-06-06 03:31:22 +0000914 sqliteExprCode(pParse, pExpr->pLeft);
drhfef52082000-06-06 01:50:43 +0000915 if( pExpr->pSelect ){
drh99fcd712001-10-13 01:06:47 +0000916 sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000917 }else{
drh99fcd712001-10-13 01:06:47 +0000918 sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest);
drhfef52082000-06-06 01:50:43 +0000919 }
920 break;
921 }
922 case TK_BETWEEN: {
923 int addr;
924 sqliteExprCode(pParse, pExpr->pLeft);
drh99fcd712001-10-13 01:06:47 +0000925 sqliteVdbeAddOp(v, OP_Dup, 0, 0);
drhfef52082000-06-06 01:50:43 +0000926 sqliteExprCode(pParse, pExpr->pList->a[0].pExpr);
927 addr = sqliteVdbeCurrentAddr(v);
drh99fcd712001-10-13 01:06:47 +0000928 sqliteVdbeAddOp(v, OP_Ge, 0, addr+3);
929 sqliteVdbeAddOp(v, OP_Pop, 1, 0);
930 sqliteVdbeAddOp(v, OP_Goto, 0, dest);
drhfef52082000-06-06 01:50:43 +0000931 sqliteExprCode(pParse, pExpr->pList->a[1].pExpr);
drh99fcd712001-10-13 01:06:47 +0000932 sqliteVdbeAddOp(v, OP_Gt, 0, dest);
drhfef52082000-06-06 01:50:43 +0000933 break;
934 }
drhcce7d172000-05-31 15:34:51 +0000935 default: {
936 sqliteExprCode(pParse, pExpr);
drh99fcd712001-10-13 01:06:47 +0000937 sqliteVdbeAddOp(v, OP_Not, 0, 0);
938 sqliteVdbeAddOp(v, OP_If, 0, dest);
drhcce7d172000-05-31 15:34:51 +0000939 break;
940 }
941 }
942}
drh22827922000-06-06 17:27:05 +0000943
944/*
945** Do a deep comparison of two expression trees. Return TRUE (non-zero)
946** if they are identical and return FALSE if they differ in any way.
947*/
drhd8bc7082000-06-07 23:51:50 +0000948int sqliteExprCompare(Expr *pA, Expr *pB){
drh22827922000-06-06 17:27:05 +0000949 int i;
950 if( pA==0 ){
951 return pB==0;
952 }else if( pB==0 ){
953 return 0;
954 }
955 if( pA->op!=pB->op ) return 0;
drhd8bc7082000-06-07 23:51:50 +0000956 if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0;
957 if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0;
drh22827922000-06-06 17:27:05 +0000958 if( pA->pList ){
959 if( pB->pList==0 ) return 0;
960 if( pA->pList->nExpr!=pB->pList->nExpr ) return 0;
961 for(i=0; i<pA->pList->nExpr; i++){
drhd8bc7082000-06-07 23:51:50 +0000962 if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){
drh22827922000-06-06 17:27:05 +0000963 return 0;
964 }
965 }
966 }else if( pB->pList ){
967 return 0;
968 }
969 if( pA->pSelect || pB->pSelect ) return 0;
970 if( pA->token.z ){
971 if( pB->token.z==0 ) return 0;
972 if( pB->token.n!=pA->token.n ) return 0;
973 if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0;
974 }
975 return 1;
976}
977
978/*
979** Add a new element to the pParse->aAgg[] array and return its index.
980*/
981static int appendAggInfo(Parse *pParse){
982 if( (pParse->nAgg & 0x7)==0 ){
983 int amt = pParse->nAgg + 8;
drh6d4abfb2001-10-22 02:58:08 +0000984 AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0]));
985 if( aAgg==0 ){
drh22827922000-06-06 17:27:05 +0000986 return -1;
987 }
drh6d4abfb2001-10-22 02:58:08 +0000988 pParse->aAgg = aAgg;
drh22827922000-06-06 17:27:05 +0000989 }
990 memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0]));
991 return pParse->nAgg++;
992}
993
994/*
995** Analyze the given expression looking for aggregate functions and
996** for variables that need to be added to the pParse->aAgg[] array.
997** Make additional entries to the pParse->aAgg[] array as necessary.
998**
999** This routine should only be called after the expression has been
1000** analyzed by sqliteExprResolveIds() and sqliteExprCheck().
1001**
1002** If errors are seen, leave an error message in zErrMsg and return
1003** the number of errors.
1004*/
1005int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){
1006 int i;
1007 AggExpr *aAgg;
1008 int nErr = 0;
1009
1010 if( pExpr==0 ) return 0;
1011 switch( pExpr->op ){
drh967e8b72000-06-21 13:59:10 +00001012 case TK_COLUMN: {
drh22827922000-06-06 17:27:05 +00001013 aAgg = pParse->aAgg;
1014 for(i=0; i<pParse->nAgg; i++){
1015 if( aAgg[i].isAgg ) continue;
1016 if( aAgg[i].pExpr->iTable==pExpr->iTable
drh967e8b72000-06-21 13:59:10 +00001017 && aAgg[i].pExpr->iColumn==pExpr->iColumn ){
drh22827922000-06-06 17:27:05 +00001018 break;
1019 }
1020 }
1021 if( i>=pParse->nAgg ){
1022 i = appendAggInfo(pParse);
1023 if( i<0 ) return 1;
1024 pParse->aAgg[i].isAgg = 0;
1025 pParse->aAgg[i].pExpr = pExpr;
1026 }
drhaaf88722000-06-08 11:25:00 +00001027 pExpr->iAgg = i;
drh22827922000-06-06 17:27:05 +00001028 break;
1029 }
1030 case TK_AGG_FUNCTION: {
drh967e8b72000-06-21 13:59:10 +00001031 if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){
drh22827922000-06-06 17:27:05 +00001032 if( pParse->iAggCount>=0 ){
1033 i = pParse->iAggCount;
1034 }else{
1035 i = appendAggInfo(pParse);
1036 if( i<0 ) return 1;
1037 pParse->aAgg[i].isAgg = 1;
1038 pParse->aAgg[i].pExpr = 0;
1039 pParse->iAggCount = i;
1040 }
drh967e8b72000-06-21 13:59:10 +00001041 if( pExpr->iColumn==FN_Count ){
drh22827922000-06-06 17:27:05 +00001042 pExpr->iAgg = i;
1043 break;
1044 }
1045 }
1046 aAgg = pParse->aAgg;
1047 for(i=0; i<pParse->nAgg; i++){
1048 if( !aAgg[i].isAgg ) continue;
drhd8bc7082000-06-07 23:51:50 +00001049 if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){
drh22827922000-06-06 17:27:05 +00001050 break;
1051 }
1052 }
1053 if( i>=pParse->nAgg ){
1054 i = appendAggInfo(pParse);
1055 if( i<0 ) return 1;
1056 pParse->aAgg[i].isAgg = 1;
1057 pParse->aAgg[i].pExpr = pExpr;
1058 }
1059 pExpr->iAgg = i;
1060 break;
1061 }
1062 default: {
1063 if( pExpr->pLeft ){
1064 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft);
1065 }
1066 if( nErr==0 && pExpr->pRight ){
1067 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight);
1068 }
1069 if( nErr==0 && pExpr->pList ){
1070 int n = pExpr->pList->nExpr;
1071 int i;
1072 for(i=0; nErr==0 && i<n; i++){
1073 nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr);
1074 }
1075 }
1076 break;
1077 }
1078 }
1079 return nErr;
1080}