1cce7d176Sdrh /* 2cce7d176Sdrh ** Copyright (c) 1999, 2000 D. Richard Hipp 3cce7d176Sdrh ** 4cce7d176Sdrh ** This program is free software; you can redistribute it and/or 5cce7d176Sdrh ** modify it under the terms of the GNU General Public 6cce7d176Sdrh ** License as published by the Free Software Foundation; either 7cce7d176Sdrh ** version 2 of the License, or (at your option) any later version. 8cce7d176Sdrh ** 9cce7d176Sdrh ** This program is distributed in the hope that it will be useful, 10cce7d176Sdrh ** but WITHOUT ANY WARRANTY; without even the implied warranty of 11cce7d176Sdrh ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cce7d176Sdrh ** General Public License for more details. 13cce7d176Sdrh ** 14cce7d176Sdrh ** You should have received a copy of the GNU General Public 15cce7d176Sdrh ** License along with this library; if not, write to the 16cce7d176Sdrh ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17cce7d176Sdrh ** Boston, MA 02111-1307, USA. 18cce7d176Sdrh ** 19cce7d176Sdrh ** Author contact information: 20cce7d176Sdrh ** [email protected] 21cce7d176Sdrh ** http://www.hwaci.com/drh/ 22cce7d176Sdrh ** 23cce7d176Sdrh ************************************************************************* 241ccde15dSdrh ** This file contains routines used for analyzing expressions and 251ccde15dSdrh ** for generating VDBE code that evaluates expressions. 26cce7d176Sdrh ** 27*3fc190ccSdrh ** $Id: expr.c,v 1.27 2001/09/14 03:24:25 drh Exp $ 28cce7d176Sdrh */ 29cce7d176Sdrh #include "sqliteInt.h" 30cce7d176Sdrh 31cce7d176Sdrh /* 32fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 33fef5208cSdrh ** and 0 if it involves variables. 34fef5208cSdrh */ 35fef5208cSdrh static int isConstant(Expr *p){ 36fef5208cSdrh switch( p->op ){ 37fef5208cSdrh case TK_ID: 38967e8b73Sdrh case TK_COLUMN: 39fef5208cSdrh case TK_DOT: 40fef5208cSdrh return 0; 41fef5208cSdrh default: { 42fef5208cSdrh if( p->pLeft && !isConstant(p->pLeft) ) return 0; 43fef5208cSdrh if( p->pRight && !isConstant(p->pRight) ) return 0; 44fef5208cSdrh if( p->pList ){ 45fef5208cSdrh int i; 46fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 47fef5208cSdrh if( !isConstant(p->pList->a[i].pExpr) ) return 0; 48fef5208cSdrh } 49fef5208cSdrh } 50fef5208cSdrh break; 51fef5208cSdrh } 52fef5208cSdrh } 53fef5208cSdrh return 1; 54fef5208cSdrh } 55fef5208cSdrh 56fef5208cSdrh /* 574794b980Sdrh ** Walk the expression tree and process operators of the form: 584794b980Sdrh ** 594794b980Sdrh ** expr IN (SELECT ...) 604794b980Sdrh ** 61967e8b73Sdrh ** These operators have to be processed before column names are 624794b980Sdrh ** resolved because each such operator increments pParse->nTab 631ccde15dSdrh ** to reserve cursor numbers for its own use. But pParse->nTab 64967e8b73Sdrh ** needs to be constant once we begin resolving column names. 654794b980Sdrh ** 664794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this 674794b980Sdrh ** routine. This routine allocates a cursor number to the IN-SELECT 684794b980Sdrh ** and then moves on. The code generation is done by 694794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards. 704794b980Sdrh */ 714794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){ 724794b980Sdrh if( pExpr==0 ) return; 734794b980Sdrh if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){ 744794b980Sdrh pExpr->iTable = pParse->nTab++; 754794b980Sdrh }else{ 764794b980Sdrh if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft); 774794b980Sdrh if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight); 784794b980Sdrh if( pExpr->pList ){ 794794b980Sdrh int i; 804794b980Sdrh ExprList *pList = pExpr->pList; 814794b980Sdrh for(i=0; i<pList->nExpr; i++){ 824794b980Sdrh sqliteExprResolveInSelect(pParse, pList->a[i].pExpr); 834794b980Sdrh } 844794b980Sdrh } 854794b980Sdrh } 864794b980Sdrh } 874794b980Sdrh 884794b980Sdrh /* 89c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 90c4a3c779Sdrh */ 91c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 92c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 93c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 94c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 95c4a3c779Sdrh return 0; 96c4a3c779Sdrh } 97c4a3c779Sdrh 98c4a3c779Sdrh /* 99cce7d176Sdrh ** This routine walks an expression tree and resolves references to 100967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 101967e8b73Sdrh ** index to the table in the table list and a column offset. The opcode 102967e8b73Sdrh ** for such nodes is changed to TK_COLUMN. The iTable value is changed 10319a775c2Sdrh ** to the index of the referenced table in pTabList plus the pParse->nTab 104967e8b73Sdrh ** value. The iColumn value is changed to the index of the column of the 10519a775c2Sdrh ** referenced table. 10619a775c2Sdrh ** 107fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 108fef5208cSdrh ** forms: 109fef5208cSdrh ** 110fef5208cSdrh ** expr IN (exprlist) 111fef5208cSdrh ** and 112fef5208cSdrh ** expr IN (SELECT ...) 113fef5208cSdrh ** 114fef5208cSdrh ** The first form is handled by creating a set holding the list 115fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 116fef5208cSdrh ** a temporary table. 117fef5208cSdrh ** 118fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 11919a775c2Sdrh ** If it finds any, it generates code to write the value of that select 12019a775c2Sdrh ** into a memory cell. 121cce7d176Sdrh ** 122967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 123cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 124cce7d176Sdrh */ 125cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){ 126daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 127cce7d176Sdrh switch( pExpr->op ){ 128cce7d176Sdrh /* A lone identifier */ 129cce7d176Sdrh case TK_ID: { 130cce7d176Sdrh int cnt = 0; /* Number of matches */ 131cce7d176Sdrh int i; /* Loop counter */ 1326e142f54Sdrh char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 133daffd0e5Sdrh if( z==0 ) return 1; 134cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 135cce7d176Sdrh int j; 136cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 137cce7d176Sdrh if( pTab==0 ) continue; 138cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 1397020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 140cce7d176Sdrh cnt++; 14119a775c2Sdrh pExpr->iTable = i + pParse->nTab; 142967e8b73Sdrh pExpr->iColumn = j; 143cce7d176Sdrh } 144cce7d176Sdrh } 145cce7d176Sdrh } 146c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 147c4a3c779Sdrh pExpr->iColumn = -1; 148c4a3c779Sdrh pExpr->iTable = pParse->nTab; 149c4a3c779Sdrh cnt = 1 + (pTabList->nId>1); 150c4a3c779Sdrh } 151cce7d176Sdrh sqliteFree(z); 152cce7d176Sdrh if( cnt==0 ){ 153967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 154cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 155cce7d176Sdrh pParse->nErr++; 156cce7d176Sdrh return 1; 157cce7d176Sdrh }else if( cnt>1 ){ 158967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 159cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 160cce7d176Sdrh pParse->nErr++; 161cce7d176Sdrh return 1; 162cce7d176Sdrh } 163967e8b73Sdrh pExpr->op = TK_COLUMN; 164cce7d176Sdrh break; 165cce7d176Sdrh } 166cce7d176Sdrh 167967e8b73Sdrh /* A table name and column name: ID.ID */ 168cce7d176Sdrh case TK_DOT: { 169cce7d176Sdrh int cnt = 0; /* Number of matches */ 170c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 171cce7d176Sdrh int i; /* Loop counter */ 172cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 173cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 174cce7d176Sdrh 175cce7d176Sdrh pLeft = pExpr->pLeft; 176cce7d176Sdrh pRight = pExpr->pRight; 177cce7d176Sdrh assert( pLeft && pLeft->op==TK_ID ); 178cce7d176Sdrh assert( pRight && pRight->op==TK_ID ); 1796e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 1806e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 181daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 182daffd0e5Sdrh sqliteFree(zLeft); 183daffd0e5Sdrh sqliteFree(zRight); 184daffd0e5Sdrh return 1; 185daffd0e5Sdrh } 18687c40e88Sdrh sqliteDequote(zLeft); 18787c40e88Sdrh sqliteDequote(zRight); 188c4a3c779Sdrh pExpr->iTable = -1; 189cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 190cce7d176Sdrh int j; 191cce7d176Sdrh char *zTab; 192cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 193cce7d176Sdrh if( pTab==0 ) continue; 194cce7d176Sdrh if( pTabList->a[i].zAlias ){ 195cce7d176Sdrh zTab = pTabList->a[i].zAlias; 196cce7d176Sdrh }else{ 197cce7d176Sdrh zTab = pTab->zName; 198cce7d176Sdrh } 199cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 200c4a3c779Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab; 201cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 2027020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 203cce7d176Sdrh cnt++; 20419a775c2Sdrh pExpr->iTable = i + pParse->nTab; 205967e8b73Sdrh pExpr->iColumn = j; 206cce7d176Sdrh } 207cce7d176Sdrh } 208cce7d176Sdrh } 209c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 210c4a3c779Sdrh cnt = 1; 211c4a3c779Sdrh pExpr->iColumn = -1; 212c4a3c779Sdrh } 213cce7d176Sdrh sqliteFree(zLeft); 214cce7d176Sdrh sqliteFree(zRight); 215cce7d176Sdrh if( cnt==0 ){ 216967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 217cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 218cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 219cce7d176Sdrh pParse->nErr++; 220cce7d176Sdrh return 1; 221cce7d176Sdrh }else if( cnt>1 ){ 222967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 223cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 224cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 225cce7d176Sdrh pParse->nErr++; 226cce7d176Sdrh return 1; 227cce7d176Sdrh } 228cce7d176Sdrh sqliteExprDelete(pLeft); 229cce7d176Sdrh pExpr->pLeft = 0; 230cce7d176Sdrh sqliteExprDelete(pRight); 231cce7d176Sdrh pExpr->pRight = 0; 232967e8b73Sdrh pExpr->op = TK_COLUMN; 233cce7d176Sdrh break; 234cce7d176Sdrh } 235cce7d176Sdrh 236fef5208cSdrh case TK_IN: { 237d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 238fef5208cSdrh if( v==0 ) return 1; 239cfab11bcSdrh if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 240cfab11bcSdrh return 1; 241cfab11bcSdrh } 242fef5208cSdrh if( pExpr->pSelect ){ 243fef5208cSdrh /* Case 1: expr IN (SELECT ...) 244fef5208cSdrh ** 245fef5208cSdrh ** Generate code to write the results of the select into a temporary 2464794b980Sdrh ** table. The cursor number of the temporary table has already 2474794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 248fef5208cSdrh */ 249be0072d2Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 0, 0, 0); 250fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 251fef5208cSdrh }else if( pExpr->pList ){ 252fef5208cSdrh /* Case 2: expr IN (exprlist) 253fef5208cSdrh ** 254fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 255fef5208cSdrh ** in iTable. 256fef5208cSdrh */ 257fef5208cSdrh int i, iSet; 258fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 259fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 260fef5208cSdrh if( !isConstant(pE2) ){ 261fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 262fef5208cSdrh "right-hand side of IN operator must be constant", 0); 263fef5208cSdrh pParse->nErr++; 264fef5208cSdrh return 1; 265fef5208cSdrh } 2664794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 2674794b980Sdrh return 1; 2684794b980Sdrh } 269fef5208cSdrh } 270fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 271fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 272fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 273fef5208cSdrh switch( pE2->op ){ 274fef5208cSdrh case TK_FLOAT: 275fef5208cSdrh case TK_INTEGER: 276fef5208cSdrh case TK_STRING: { 277fef5208cSdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 278fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 279fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 280fef5208cSdrh break; 281fef5208cSdrh } 282fef5208cSdrh default: { 283fef5208cSdrh sqliteExprCode(pParse, pE2); 284fef5208cSdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 285fef5208cSdrh break; 286fef5208cSdrh } 287fef5208cSdrh } 288fef5208cSdrh } 289fef5208cSdrh } 290cfab11bcSdrh break; 291fef5208cSdrh } 292fef5208cSdrh 29319a775c2Sdrh case TK_SELECT: { 294fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 295fef5208cSdrh ** value of this select in a memory cell and record the number 296967e8b73Sdrh ** of the memory cell in iColumn. 297fef5208cSdrh */ 298967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 299967e8b73Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){ 30019a775c2Sdrh return 1; 30119a775c2Sdrh } 30219a775c2Sdrh break; 30319a775c2Sdrh } 30419a775c2Sdrh 305cce7d176Sdrh /* For all else, just recursively walk the tree */ 306cce7d176Sdrh default: { 307cce7d176Sdrh if( pExpr->pLeft 308cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 309cce7d176Sdrh return 1; 310cce7d176Sdrh } 311cce7d176Sdrh if( pExpr->pRight 312cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){ 313cce7d176Sdrh return 1; 314cce7d176Sdrh } 315cce7d176Sdrh if( pExpr->pList ){ 316cce7d176Sdrh int i; 317cce7d176Sdrh ExprList *pList = pExpr->pList; 318cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 319cce7d176Sdrh if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){ 320cce7d176Sdrh return 1; 321cce7d176Sdrh } 322cce7d176Sdrh } 323cce7d176Sdrh } 324cce7d176Sdrh } 325cce7d176Sdrh } 326cce7d176Sdrh return 0; 327cce7d176Sdrh } 328cce7d176Sdrh 329cce7d176Sdrh #if 0 /* NOT USED */ 330cce7d176Sdrh /* 331cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 332cce7d176Sdrh */ 333cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 334cce7d176Sdrh int n = strlen(zStr); 335cce7d176Sdrh if( n!=pToken->n ) return 0; 336cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 337cce7d176Sdrh } 338cce7d176Sdrh #endif 339cce7d176Sdrh 340cce7d176Sdrh /* 341cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 342cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 343cce7d176Sdrh */ 344cce7d176Sdrh int sqliteFuncId(Token *pToken){ 345cce7d176Sdrh static const struct { 346cce7d176Sdrh char *zName; 347cce7d176Sdrh int len; 348cce7d176Sdrh int id; 349cce7d176Sdrh } aFunc[] = { 350cce7d176Sdrh { "count", 5, FN_Count }, 351cce7d176Sdrh { "min", 3, FN_Min }, 352cce7d176Sdrh { "max", 3, FN_Max }, 353cce7d176Sdrh { "sum", 3, FN_Sum }, 3542282792aSdrh { "avg", 3, FN_Avg }, 3550bdaf62eSdrh { "fcnt", 4, FN_Fcnt }, /* Used for testing only */ 3566ec2733bSdrh { "length", 6, FN_Length}, 3576ec2733bSdrh { "substr", 6, FN_Substr}, 358cce7d176Sdrh }; 359cce7d176Sdrh int i; 360cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 361cce7d176Sdrh if( aFunc[i].len==pToken->n 362cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 363cce7d176Sdrh return aFunc[i].id; 364cce7d176Sdrh } 365cce7d176Sdrh } 366cce7d176Sdrh return FN_Unknown; 367cce7d176Sdrh } 368cce7d176Sdrh 369cce7d176Sdrh /* 370cce7d176Sdrh ** Error check the functions in an expression. Make sure all 371cce7d176Sdrh ** function names are recognized and all functions have the correct 372cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 373cce7d176Sdrh ** if anything is amiss. Return the number of errors. 374cce7d176Sdrh ** 375cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 376cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 377cce7d176Sdrh */ 378cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 379cce7d176Sdrh int nErr = 0; 380cce7d176Sdrh if( pExpr==0 ) return 0; 381cce7d176Sdrh switch( pExpr->op ){ 382cce7d176Sdrh case TK_FUNCTION: { 383cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 384cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 385cce7d176Sdrh int no_such_func = 0; 386cce7d176Sdrh int too_many_args = 0; 387cce7d176Sdrh int too_few_args = 0; 388cce7d176Sdrh int is_agg = 0; 389cce7d176Sdrh int i; 390967e8b73Sdrh pExpr->iColumn = id; 391cce7d176Sdrh switch( id ){ 392cce7d176Sdrh case FN_Unknown: { 393cce7d176Sdrh no_such_func = 1; 394cce7d176Sdrh break; 395cce7d176Sdrh } 396cce7d176Sdrh case FN_Count: { 397cce7d176Sdrh no_such_func = !allowAgg; 398cce7d176Sdrh too_many_args = n>1; 399cce7d176Sdrh is_agg = 1; 400cce7d176Sdrh break; 401cce7d176Sdrh } 402cce7d176Sdrh case FN_Max: 403cce7d176Sdrh case FN_Min: { 404cce7d176Sdrh too_few_args = allowAgg ? n<1 : n<2; 405cce7d176Sdrh is_agg = n==1; 406cce7d176Sdrh break; 407cce7d176Sdrh } 4082282792aSdrh case FN_Avg: 409cce7d176Sdrh case FN_Sum: { 410cce7d176Sdrh no_such_func = !allowAgg; 411cce7d176Sdrh too_many_args = n>1; 412cce7d176Sdrh too_few_args = n<1; 413cce7d176Sdrh is_agg = 1; 414cce7d176Sdrh break; 415cce7d176Sdrh } 4166ec2733bSdrh case FN_Length: { 4176ec2733bSdrh too_few_args = n<1; 4186ec2733bSdrh too_many_args = n>1; 4196ec2733bSdrh break; 4206ec2733bSdrh } 4216ec2733bSdrh case FN_Substr: { 4226ec2733bSdrh too_few_args = n<3; 4236ec2733bSdrh too_many_args = n>3; 4246ec2733bSdrh break; 4256ec2733bSdrh } 4260bdaf62eSdrh /* The "fcnt(*)" function always returns the number of fetch 4270bdaf62eSdrh ** operations that have occurred so far while processing the 4280bdaf62eSdrh ** SQL statement. This information can be used by test procedures 4290bdaf62eSdrh ** to verify that indices are being used properly to minimize 4300bdaf62eSdrh ** searching. All arguments to fcnt() are ignored. fcnt() has 4310bdaf62eSdrh ** no use (other than testing) that we are aware of. 4320bdaf62eSdrh */ 4330bdaf62eSdrh case FN_Fcnt: { 4340bdaf62eSdrh n = 0; 4350bdaf62eSdrh break; 4360bdaf62eSdrh } 4376ec2733bSdrh 438cce7d176Sdrh default: break; 439cce7d176Sdrh } 440cce7d176Sdrh if( no_such_func ){ 441cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 442cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 443cce7d176Sdrh pParse->nErr++; 444cce7d176Sdrh nErr++; 445cce7d176Sdrh }else if( too_many_args ){ 446cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 447cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 448cce7d176Sdrh pParse->nErr++; 449cce7d176Sdrh nErr++; 450cce7d176Sdrh }else if( too_few_args ){ 451cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 452cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 453cce7d176Sdrh pParse->nErr++; 454cce7d176Sdrh nErr++; 455cce7d176Sdrh } 4562282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 457cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 458cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 4594cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 4604cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 461cce7d176Sdrh } 462cce7d176Sdrh } 463cce7d176Sdrh default: { 464cce7d176Sdrh if( pExpr->pLeft ){ 4652282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 466cce7d176Sdrh } 467cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 4682282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 469cce7d176Sdrh } 470fef5208cSdrh if( nErr==0 && pExpr->pList ){ 471fef5208cSdrh int n = pExpr->pList->nExpr; 472fef5208cSdrh int i; 473fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 4742282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 4752282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 476fef5208cSdrh } 477fef5208cSdrh } 478cce7d176Sdrh break; 479cce7d176Sdrh } 480cce7d176Sdrh } 481cce7d176Sdrh return nErr; 482cce7d176Sdrh } 483cce7d176Sdrh 484cce7d176Sdrh /* 485cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 4861ccde15dSdrh ** expression and leave the result on the top of stack. 487cce7d176Sdrh */ 488cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 489cce7d176Sdrh Vdbe *v = pParse->pVdbe; 490cce7d176Sdrh int op; 491daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 492cce7d176Sdrh switch( pExpr->op ){ 493cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 494cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 495cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 496cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 497cce7d176Sdrh case TK_AND: op = OP_And; break; 498cce7d176Sdrh case TK_OR: op = OP_Or; break; 499cce7d176Sdrh case TK_LT: op = OP_Lt; break; 500cce7d176Sdrh case TK_LE: op = OP_Le; break; 501cce7d176Sdrh case TK_GT: op = OP_Gt; break; 502cce7d176Sdrh case TK_GE: op = OP_Ge; break; 503cce7d176Sdrh case TK_NE: op = OP_Ne; break; 504cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 505cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 506cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 507cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 508cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 509cce7d176Sdrh case TK_NOT: op = OP_Not; break; 510cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 511cce7d176Sdrh default: break; 512cce7d176Sdrh } 513cce7d176Sdrh switch( pExpr->op ){ 514967e8b73Sdrh case TK_COLUMN: { 5152282792aSdrh if( pParse->useAgg ){ 5162282792aSdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0); 517c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 518be0072d2Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn, 0, 0); 519c4a3c779Sdrh }else{ 520*3fc190ccSdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0, 0, 0); 5212282792aSdrh } 522cce7d176Sdrh break; 523cce7d176Sdrh } 524cce7d176Sdrh case TK_INTEGER: { 525cce7d176Sdrh int i = atoi(pExpr->token.z); 526cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); 527cce7d176Sdrh break; 528cce7d176Sdrh } 529cce7d176Sdrh case TK_FLOAT: { 530cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 531cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 532cce7d176Sdrh break; 533cce7d176Sdrh } 534cce7d176Sdrh case TK_STRING: { 535cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 536cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 537cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 538cce7d176Sdrh break; 539cce7d176Sdrh } 540cce7d176Sdrh case TK_NULL: { 541c61053b7Sdrh sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0); 542cce7d176Sdrh break; 543cce7d176Sdrh } 544cce7d176Sdrh case TK_AND: 545cce7d176Sdrh case TK_OR: 546cce7d176Sdrh case TK_PLUS: 547cce7d176Sdrh case TK_STAR: 548cce7d176Sdrh case TK_MINUS: 549cce7d176Sdrh case TK_SLASH: { 550cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 551cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 552cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 553cce7d176Sdrh break; 554cce7d176Sdrh } 5550040077dSdrh case TK_CONCAT: { 5560040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 5570040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 5580040077dSdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0, 0, 0); 5590040077dSdrh break; 5600040077dSdrh } 561cce7d176Sdrh case TK_LT: 562cce7d176Sdrh case TK_LE: 563cce7d176Sdrh case TK_GT: 564cce7d176Sdrh case TK_GE: 565cce7d176Sdrh case TK_NE: 566cce7d176Sdrh case TK_EQ: 567cce7d176Sdrh case TK_LIKE: 568cce7d176Sdrh case TK_GLOB: { 569cce7d176Sdrh int dest; 570cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 571cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 572cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 573cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 574cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 575cce7d176Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 576cce7d176Sdrh break; 577cce7d176Sdrh } 578cce7d176Sdrh case TK_UMINUS: { 5796e142f54Sdrh assert( pExpr->pLeft ); 5806e142f54Sdrh if( pExpr->pLeft->op==TK_INTEGER ){ 5816e142f54Sdrh int i = atoi(pExpr->pLeft->token.z); 5826e142f54Sdrh sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0); 5836e142f54Sdrh break; 5846e142f54Sdrh }else if( pExpr->pLeft->op==TK_FLOAT ){ 5856e142f54Sdrh Token *p = &pExpr->pLeft->token; 5866e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 5876e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 5886e142f54Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0); 5896e142f54Sdrh sqliteFree(z); 5906e142f54Sdrh break; 5916e142f54Sdrh } 5921ccde15dSdrh /* Fall through into TK_NOT */ 5936e142f54Sdrh } 5946e142f54Sdrh case TK_NOT: { 595cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 596cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 597cce7d176Sdrh break; 598cce7d176Sdrh } 599cce7d176Sdrh case TK_ISNULL: 600cce7d176Sdrh case TK_NOTNULL: { 601cce7d176Sdrh int dest; 6028be51133Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 603cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 604cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 605cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 6068be51133Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 607cce7d176Sdrh break; 608cce7d176Sdrh } 6092282792aSdrh case TK_AGG_FUNCTION: { 6102282792aSdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg, 0, 0); 611967e8b73Sdrh if( pExpr->iColumn==FN_Avg ){ 6122282792aSdrh assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); 6132282792aSdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount, 0, 0); 6142282792aSdrh sqliteVdbeAddOp(v, OP_Divide, 0, 0, 0, 0); 6152282792aSdrh } 6162282792aSdrh break; 6172282792aSdrh } 618cce7d176Sdrh case TK_FUNCTION: { 619967e8b73Sdrh int id = pExpr->iColumn; 620cce7d176Sdrh int op; 621cce7d176Sdrh int i; 622cce7d176Sdrh ExprList *pList = pExpr->pList; 6236ec2733bSdrh switch( id ){ 6246ec2733bSdrh case FN_Fcnt: { 6250bdaf62eSdrh sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0); 6260bdaf62eSdrh break; 6270bdaf62eSdrh } 6286ec2733bSdrh case FN_Min: 6296ec2733bSdrh case FN_Max: { 630cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 631cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 632cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 633cce7d176Sdrh if( i>0 ){ 634cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 635cce7d176Sdrh } 636cce7d176Sdrh } 637cce7d176Sdrh break; 638cce7d176Sdrh } 6396ec2733bSdrh case FN_Length: { 6406ec2733bSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 6416ec2733bSdrh sqliteVdbeAddOp(v, OP_Strlen, 0, 0, 0, 0); 6426ec2733bSdrh break; 6436ec2733bSdrh } 6446ec2733bSdrh case FN_Substr: { 6456ec2733bSdrh for(i=0; i<pList->nExpr; i++){ 6466ec2733bSdrh sqliteExprCode(pParse, pList->a[i].pExpr); 6476ec2733bSdrh } 6486ec2733bSdrh sqliteVdbeAddOp(v, OP_Substr, 0, 0, 0, 0); 6496ec2733bSdrh break; 6506ec2733bSdrh } 6516ec2733bSdrh default: { 6526ec2733bSdrh /* Can't happen! */ 6536ec2733bSdrh break; 6546ec2733bSdrh } 6556ec2733bSdrh } 6566ec2733bSdrh break; 6576ec2733bSdrh } 65819a775c2Sdrh case TK_SELECT: { 659967e8b73Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0, 0, 0); 66019a775c2Sdrh break; 66119a775c2Sdrh } 662fef5208cSdrh case TK_IN: { 663fef5208cSdrh int addr; 6644794b980Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 665fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 666fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 667fef5208cSdrh if( pExpr->pSelect ){ 668fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0); 669fef5208cSdrh }else{ 670fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0); 671fef5208cSdrh } 6724794b980Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 673fef5208cSdrh break; 674fef5208cSdrh } 675fef5208cSdrh case TK_BETWEEN: { 676fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 677fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 678fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 679fef5208cSdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0); 680fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 681fef5208cSdrh break; 682fef5208cSdrh } 683cce7d176Sdrh } 684cce7d176Sdrh return; 685cce7d176Sdrh } 686cce7d176Sdrh 687cce7d176Sdrh /* 688cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 689cce7d176Sdrh ** to the label "dest" if the expression is true but execution 690cce7d176Sdrh ** continues straight thru if the expression is false. 691cce7d176Sdrh */ 692cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 693cce7d176Sdrh Vdbe *v = pParse->pVdbe; 694cce7d176Sdrh int op = 0; 695daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 696cce7d176Sdrh switch( pExpr->op ){ 697cce7d176Sdrh case TK_LT: op = OP_Lt; break; 698cce7d176Sdrh case TK_LE: op = OP_Le; break; 699cce7d176Sdrh case TK_GT: op = OP_Gt; break; 700cce7d176Sdrh case TK_GE: op = OP_Ge; break; 701cce7d176Sdrh case TK_NE: op = OP_Ne; break; 702cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 703cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 704cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 705cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 706cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 707cce7d176Sdrh default: break; 708cce7d176Sdrh } 709cce7d176Sdrh switch( pExpr->op ){ 710cce7d176Sdrh case TK_AND: { 711cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 712cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 713cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 714cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 715cce7d176Sdrh break; 716cce7d176Sdrh } 717cce7d176Sdrh case TK_OR: { 718cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 719cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 720cce7d176Sdrh break; 721cce7d176Sdrh } 722cce7d176Sdrh case TK_NOT: { 723cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 724cce7d176Sdrh break; 725cce7d176Sdrh } 726cce7d176Sdrh case TK_LT: 727cce7d176Sdrh case TK_LE: 728cce7d176Sdrh case TK_GT: 729cce7d176Sdrh case TK_GE: 730cce7d176Sdrh case TK_NE: 731cce7d176Sdrh case TK_EQ: 732cce7d176Sdrh case TK_LIKE: 733cce7d176Sdrh case TK_GLOB: { 734cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 735cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 736cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 737cce7d176Sdrh break; 738cce7d176Sdrh } 739cce7d176Sdrh case TK_ISNULL: 740cce7d176Sdrh case TK_NOTNULL: { 741cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 742cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 743cce7d176Sdrh break; 744cce7d176Sdrh } 745fef5208cSdrh case TK_IN: { 746cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 747fef5208cSdrh if( pExpr->pSelect ){ 748fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0); 749fef5208cSdrh }else{ 750fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0); 751fef5208cSdrh } 752fef5208cSdrh break; 753fef5208cSdrh } 754fef5208cSdrh case TK_BETWEEN: { 755fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 756fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 757fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 758fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 759fef5208cSdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0); 760fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 761fef5208cSdrh sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0); 762fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 763fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl); 764fef5208cSdrh break; 765fef5208cSdrh } 766cce7d176Sdrh default: { 767cce7d176Sdrh sqliteExprCode(pParse, pExpr); 768cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 769cce7d176Sdrh break; 770cce7d176Sdrh } 771cce7d176Sdrh } 772cce7d176Sdrh } 773cce7d176Sdrh 774cce7d176Sdrh /* 77566b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 776cce7d176Sdrh ** to the label "dest" if the expression is false but execution 777cce7d176Sdrh ** continues straight thru if the expression is true. 778cce7d176Sdrh */ 779cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 780cce7d176Sdrh Vdbe *v = pParse->pVdbe; 781cce7d176Sdrh int op = 0; 782daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 783cce7d176Sdrh switch( pExpr->op ){ 784cce7d176Sdrh case TK_LT: op = OP_Ge; break; 785cce7d176Sdrh case TK_LE: op = OP_Gt; break; 786cce7d176Sdrh case TK_GT: op = OP_Le; break; 787cce7d176Sdrh case TK_GE: op = OP_Lt; break; 788cce7d176Sdrh case TK_NE: op = OP_Eq; break; 789cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 790cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 791cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 792cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 793cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 794cce7d176Sdrh default: break; 795cce7d176Sdrh } 796cce7d176Sdrh switch( pExpr->op ){ 797cce7d176Sdrh case TK_AND: { 798cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 799cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 800cce7d176Sdrh break; 801cce7d176Sdrh } 802cce7d176Sdrh case TK_OR: { 803cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 804cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 805cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 806cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 807cce7d176Sdrh break; 808cce7d176Sdrh } 809cce7d176Sdrh case TK_NOT: { 810cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 811cce7d176Sdrh break; 812cce7d176Sdrh } 813cce7d176Sdrh case TK_LT: 814cce7d176Sdrh case TK_LE: 815cce7d176Sdrh case TK_GT: 816cce7d176Sdrh case TK_GE: 817cce7d176Sdrh case TK_NE: 818cce7d176Sdrh case TK_EQ: { 819cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 820cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 821cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 822cce7d176Sdrh break; 823cce7d176Sdrh } 824cce7d176Sdrh case TK_LIKE: 825cce7d176Sdrh case TK_GLOB: { 826cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 827cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 828cce7d176Sdrh sqliteVdbeAddOp(v, op, 1, dest, 0, 0); 829cce7d176Sdrh break; 830cce7d176Sdrh } 831cce7d176Sdrh case TK_ISNULL: 832cce7d176Sdrh case TK_NOTNULL: { 833cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 834cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 835cce7d176Sdrh break; 836cce7d176Sdrh } 837fef5208cSdrh case TK_IN: { 838cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 839fef5208cSdrh if( pExpr->pSelect ){ 840fef5208cSdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0); 841fef5208cSdrh }else{ 842fef5208cSdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0); 843fef5208cSdrh } 844fef5208cSdrh break; 845fef5208cSdrh } 846fef5208cSdrh case TK_BETWEEN: { 847fef5208cSdrh int addr; 848fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 849fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 850fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 851fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 852fef5208cSdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0); 853fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0); 854fef5208cSdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0); 855fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 856fef5208cSdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0); 857fef5208cSdrh break; 858fef5208cSdrh } 859cce7d176Sdrh default: { 860cce7d176Sdrh sqliteExprCode(pParse, pExpr); 861cce7d176Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0); 862cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 863cce7d176Sdrh break; 864cce7d176Sdrh } 865cce7d176Sdrh } 866cce7d176Sdrh } 8672282792aSdrh 8682282792aSdrh /* 8692282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 8702282792aSdrh ** if they are identical and return FALSE if they differ in any way. 8712282792aSdrh */ 872d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 8732282792aSdrh int i; 8742282792aSdrh if( pA==0 ){ 8752282792aSdrh return pB==0; 8762282792aSdrh }else if( pB==0 ){ 8772282792aSdrh return 0; 8782282792aSdrh } 8792282792aSdrh if( pA->op!=pB->op ) return 0; 880d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 881d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 8822282792aSdrh if( pA->pList ){ 8832282792aSdrh if( pB->pList==0 ) return 0; 8842282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 8852282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 886d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 8872282792aSdrh return 0; 8882282792aSdrh } 8892282792aSdrh } 8902282792aSdrh }else if( pB->pList ){ 8912282792aSdrh return 0; 8922282792aSdrh } 8932282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 8942282792aSdrh if( pA->token.z ){ 8952282792aSdrh if( pB->token.z==0 ) return 0; 8962282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 8972282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 8982282792aSdrh } 8992282792aSdrh return 1; 9002282792aSdrh } 9012282792aSdrh 9022282792aSdrh /* 9032282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 9042282792aSdrh */ 9052282792aSdrh static int appendAggInfo(Parse *pParse){ 9062282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 9072282792aSdrh int amt = pParse->nAgg + 8; 9082282792aSdrh pParse->aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 9092282792aSdrh if( pParse->aAgg==0 ){ 910daffd0e5Sdrh pParse->nAgg = 0; 9112282792aSdrh return -1; 9122282792aSdrh } 9132282792aSdrh } 9142282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 9152282792aSdrh return pParse->nAgg++; 9162282792aSdrh } 9172282792aSdrh 9182282792aSdrh /* 9192282792aSdrh ** Analyze the given expression looking for aggregate functions and 9202282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 9212282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 9222282792aSdrh ** 9232282792aSdrh ** This routine should only be called after the expression has been 9242282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 9252282792aSdrh ** 9262282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 9272282792aSdrh ** the number of errors. 9282282792aSdrh */ 9292282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 9302282792aSdrh int i; 9312282792aSdrh AggExpr *aAgg; 9322282792aSdrh int nErr = 0; 9332282792aSdrh 9342282792aSdrh if( pExpr==0 ) return 0; 9352282792aSdrh switch( pExpr->op ){ 936967e8b73Sdrh case TK_COLUMN: { 9372282792aSdrh aAgg = pParse->aAgg; 9382282792aSdrh for(i=0; i<pParse->nAgg; i++){ 9392282792aSdrh if( aAgg[i].isAgg ) continue; 9402282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 941967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 9422282792aSdrh break; 9432282792aSdrh } 9442282792aSdrh } 9452282792aSdrh if( i>=pParse->nAgg ){ 9462282792aSdrh i = appendAggInfo(pParse); 9472282792aSdrh if( i<0 ) return 1; 9482282792aSdrh pParse->aAgg[i].isAgg = 0; 9492282792aSdrh pParse->aAgg[i].pExpr = pExpr; 9502282792aSdrh } 951aaf88729Sdrh pExpr->iAgg = i; 9522282792aSdrh break; 9532282792aSdrh } 9542282792aSdrh case TK_AGG_FUNCTION: { 955967e8b73Sdrh if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){ 9562282792aSdrh if( pParse->iAggCount>=0 ){ 9572282792aSdrh i = pParse->iAggCount; 9582282792aSdrh }else{ 9592282792aSdrh i = appendAggInfo(pParse); 9602282792aSdrh if( i<0 ) return 1; 9612282792aSdrh pParse->aAgg[i].isAgg = 1; 9622282792aSdrh pParse->aAgg[i].pExpr = 0; 9632282792aSdrh pParse->iAggCount = i; 9642282792aSdrh } 965967e8b73Sdrh if( pExpr->iColumn==FN_Count ){ 9662282792aSdrh pExpr->iAgg = i; 9672282792aSdrh break; 9682282792aSdrh } 9692282792aSdrh } 9702282792aSdrh aAgg = pParse->aAgg; 9712282792aSdrh for(i=0; i<pParse->nAgg; i++){ 9722282792aSdrh if( !aAgg[i].isAgg ) continue; 973d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 9742282792aSdrh break; 9752282792aSdrh } 9762282792aSdrh } 9772282792aSdrh if( i>=pParse->nAgg ){ 9782282792aSdrh i = appendAggInfo(pParse); 9792282792aSdrh if( i<0 ) return 1; 9802282792aSdrh pParse->aAgg[i].isAgg = 1; 9812282792aSdrh pParse->aAgg[i].pExpr = pExpr; 9822282792aSdrh } 9832282792aSdrh pExpr->iAgg = i; 9842282792aSdrh break; 9852282792aSdrh } 9862282792aSdrh default: { 9872282792aSdrh if( pExpr->pLeft ){ 9882282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 9892282792aSdrh } 9902282792aSdrh if( nErr==0 && pExpr->pRight ){ 9912282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 9922282792aSdrh } 9932282792aSdrh if( nErr==0 && pExpr->pList ){ 9942282792aSdrh int n = pExpr->pList->nExpr; 9952282792aSdrh int i; 9962282792aSdrh for(i=0; nErr==0 && i<n; i++){ 9972282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 9982282792aSdrh } 9992282792aSdrh } 10002282792aSdrh break; 10012282792aSdrh } 10022282792aSdrh } 10032282792aSdrh return nErr; 10042282792aSdrh } 1005