1cce7d176Sdrh /* 2b19a2bc6Sdrh ** 2001 September 15 3cce7d176Sdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 6cce7d176Sdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 10cce7d176Sdrh ** 11cce7d176Sdrh ************************************************************************* 121ccde15dSdrh ** This file contains routines used for analyzing expressions and 13b19a2bc6Sdrh ** for generating VDBE code that evaluates expressions in SQLite. 14cce7d176Sdrh ** 15*aacc543eSdrh ** $Id: expr.c,v 1.37 2002/01/06 17:07:40 drh Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 18cce7d176Sdrh 19cce7d176Sdrh /* 20fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 21fef5208cSdrh ** and 0 if it involves variables. 22fef5208cSdrh */ 23fef5208cSdrh static int isConstant(Expr *p){ 24fef5208cSdrh switch( p->op ){ 25fef5208cSdrh case TK_ID: 26967e8b73Sdrh case TK_COLUMN: 27fef5208cSdrh case TK_DOT: 28fef5208cSdrh return 0; 29fef5208cSdrh default: { 30fef5208cSdrh if( p->pLeft && !isConstant(p->pLeft) ) return 0; 31fef5208cSdrh if( p->pRight && !isConstant(p->pRight) ) return 0; 32fef5208cSdrh if( p->pList ){ 33fef5208cSdrh int i; 34fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 35fef5208cSdrh if( !isConstant(p->pList->a[i].pExpr) ) return 0; 36fef5208cSdrh } 37fef5208cSdrh } 38fef5208cSdrh break; 39fef5208cSdrh } 40fef5208cSdrh } 41fef5208cSdrh return 1; 42fef5208cSdrh } 43fef5208cSdrh 44fef5208cSdrh /* 454794b980Sdrh ** Walk the expression tree and process operators of the form: 464794b980Sdrh ** 474794b980Sdrh ** expr IN (SELECT ...) 484794b980Sdrh ** 49967e8b73Sdrh ** These operators have to be processed before column names are 504794b980Sdrh ** resolved because each such operator increments pParse->nTab 511ccde15dSdrh ** to reserve cursor numbers for its own use. But pParse->nTab 52*aacc543eSdrh ** needs to be constant once we begin resolving column names. For 53*aacc543eSdrh ** that reason, this procedure needs to be called on every expression 54*aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression. 554794b980Sdrh ** 564794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this 574794b980Sdrh ** routine. This routine allocates a cursor number to the IN-SELECT 584794b980Sdrh ** and then moves on. The code generation is done by 594794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards. 604794b980Sdrh */ 614794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){ 624794b980Sdrh if( pExpr==0 ) return; 634794b980Sdrh if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){ 644794b980Sdrh pExpr->iTable = pParse->nTab++; 654794b980Sdrh }else{ 664794b980Sdrh if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft); 674794b980Sdrh if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight); 684794b980Sdrh if( pExpr->pList ){ 694794b980Sdrh int i; 704794b980Sdrh ExprList *pList = pExpr->pList; 714794b980Sdrh for(i=0; i<pList->nExpr; i++){ 724794b980Sdrh sqliteExprResolveInSelect(pParse, pList->a[i].pExpr); 734794b980Sdrh } 744794b980Sdrh } 754794b980Sdrh } 764794b980Sdrh } 774794b980Sdrh 784794b980Sdrh /* 79c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 80c4a3c779Sdrh */ 81c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 82c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 83c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 84c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 85c4a3c779Sdrh return 0; 86c4a3c779Sdrh } 87c4a3c779Sdrh 88c4a3c779Sdrh /* 89cce7d176Sdrh ** This routine walks an expression tree and resolves references to 90967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 91*aacc543eSdrh ** index to the table in the table list and a column offset. The 92*aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 93*aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 94*aacc543eSdrh ** plus the pParse->nTab value. This value will ultimately become the 95*aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 96*aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 97*aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 98*aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 99*aacc543eSdrh ** alias for ROWID. 10019a775c2Sdrh ** 101fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 102fef5208cSdrh ** forms: 103fef5208cSdrh ** 104fef5208cSdrh ** expr IN (exprlist) 105fef5208cSdrh ** and 106fef5208cSdrh ** expr IN (SELECT ...) 107fef5208cSdrh ** 108fef5208cSdrh ** The first form is handled by creating a set holding the list 109fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 110fef5208cSdrh ** a temporary table. 111fef5208cSdrh ** 112fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 11319a775c2Sdrh ** If it finds any, it generates code to write the value of that select 11419a775c2Sdrh ** into a memory cell. 115cce7d176Sdrh ** 116967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 117cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 118cce7d176Sdrh */ 119cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){ 120daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 121cce7d176Sdrh switch( pExpr->op ){ 122cce7d176Sdrh /* A lone identifier */ 123cce7d176Sdrh case TK_ID: { 124cce7d176Sdrh int cnt = 0; /* Number of matches */ 125cce7d176Sdrh int i; /* Loop counter */ 1266e142f54Sdrh char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 127daffd0e5Sdrh if( z==0 ) return 1; 128cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 129cce7d176Sdrh int j; 130cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 131cce7d176Sdrh if( pTab==0 ) continue; 132cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 1337020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 134cce7d176Sdrh cnt++; 13519a775c2Sdrh pExpr->iTable = i + pParse->nTab; 1364a32431cSdrh if( j==pTab->iPKey ){ 1374a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 1384a32431cSdrh pExpr->iColumn = -1; 1394a32431cSdrh }else{ 140967e8b73Sdrh pExpr->iColumn = j; 141cce7d176Sdrh } 142cce7d176Sdrh } 143cce7d176Sdrh } 1444a32431cSdrh } 145c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 146c4a3c779Sdrh pExpr->iColumn = -1; 147c4a3c779Sdrh pExpr->iTable = pParse->nTab; 148c4a3c779Sdrh cnt = 1 + (pTabList->nId>1); 149c4a3c779Sdrh } 150cce7d176Sdrh sqliteFree(z); 151cce7d176Sdrh if( cnt==0 ){ 152967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 153cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 154cce7d176Sdrh pParse->nErr++; 155cce7d176Sdrh return 1; 156cce7d176Sdrh }else if( cnt>1 ){ 157967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 158cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 159cce7d176Sdrh pParse->nErr++; 160cce7d176Sdrh return 1; 161cce7d176Sdrh } 162967e8b73Sdrh pExpr->op = TK_COLUMN; 163cce7d176Sdrh break; 164cce7d176Sdrh } 165cce7d176Sdrh 166967e8b73Sdrh /* A table name and column name: ID.ID */ 167cce7d176Sdrh case TK_DOT: { 168cce7d176Sdrh int cnt = 0; /* Number of matches */ 169c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 170cce7d176Sdrh int i; /* Loop counter */ 171cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 172cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 173cce7d176Sdrh 174cce7d176Sdrh pLeft = pExpr->pLeft; 175cce7d176Sdrh pRight = pExpr->pRight; 176cce7d176Sdrh assert( pLeft && pLeft->op==TK_ID ); 177cce7d176Sdrh assert( pRight && pRight->op==TK_ID ); 1786e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 1796e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 180daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 181daffd0e5Sdrh sqliteFree(zLeft); 182daffd0e5Sdrh sqliteFree(zRight); 183daffd0e5Sdrh return 1; 184daffd0e5Sdrh } 18587c40e88Sdrh sqliteDequote(zLeft); 18687c40e88Sdrh sqliteDequote(zRight); 187c4a3c779Sdrh pExpr->iTable = -1; 188cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 189cce7d176Sdrh int j; 190cce7d176Sdrh char *zTab; 191cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 192cce7d176Sdrh if( pTab==0 ) continue; 193cce7d176Sdrh if( pTabList->a[i].zAlias ){ 194cce7d176Sdrh zTab = pTabList->a[i].zAlias; 195cce7d176Sdrh }else{ 196cce7d176Sdrh zTab = pTab->zName; 197cce7d176Sdrh } 198cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 199c4a3c779Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab; 200cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 2017020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 202cce7d176Sdrh cnt++; 20319a775c2Sdrh pExpr->iTable = i + pParse->nTab; 2044a32431cSdrh if( j==pTab->iPKey ){ 2054a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 2064a32431cSdrh pExpr->iColumn = -1; 2074a32431cSdrh }else{ 208967e8b73Sdrh pExpr->iColumn = j; 209cce7d176Sdrh } 210cce7d176Sdrh } 211cce7d176Sdrh } 2124a32431cSdrh } 213c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 214c4a3c779Sdrh cnt = 1; 215c4a3c779Sdrh pExpr->iColumn = -1; 216c4a3c779Sdrh } 217cce7d176Sdrh sqliteFree(zLeft); 218cce7d176Sdrh sqliteFree(zRight); 219cce7d176Sdrh if( cnt==0 ){ 220967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 221cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 222cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 223cce7d176Sdrh pParse->nErr++; 224cce7d176Sdrh return 1; 225cce7d176Sdrh }else if( cnt>1 ){ 226967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 227cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 228cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 229cce7d176Sdrh pParse->nErr++; 230cce7d176Sdrh return 1; 231cce7d176Sdrh } 232cce7d176Sdrh sqliteExprDelete(pLeft); 233cce7d176Sdrh pExpr->pLeft = 0; 234cce7d176Sdrh sqliteExprDelete(pRight); 235cce7d176Sdrh pExpr->pRight = 0; 236967e8b73Sdrh pExpr->op = TK_COLUMN; 237cce7d176Sdrh break; 238cce7d176Sdrh } 239cce7d176Sdrh 240fef5208cSdrh case TK_IN: { 241d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 242fef5208cSdrh if( v==0 ) return 1; 243cfab11bcSdrh if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 244cfab11bcSdrh return 1; 245cfab11bcSdrh } 246fef5208cSdrh if( pExpr->pSelect ){ 247fef5208cSdrh /* Case 1: expr IN (SELECT ...) 248fef5208cSdrh ** 249fef5208cSdrh ** Generate code to write the results of the select into a temporary 2504794b980Sdrh ** table. The cursor number of the temporary table has already 2514794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 252fef5208cSdrh */ 253c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 254fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 255fef5208cSdrh }else if( pExpr->pList ){ 256fef5208cSdrh /* Case 2: expr IN (exprlist) 257fef5208cSdrh ** 258fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 259fef5208cSdrh ** in iTable. 260fef5208cSdrh */ 261fef5208cSdrh int i, iSet; 262fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 263fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 264fef5208cSdrh if( !isConstant(pE2) ){ 265fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 266fef5208cSdrh "right-hand side of IN operator must be constant", 0); 267fef5208cSdrh pParse->nErr++; 268fef5208cSdrh return 1; 269fef5208cSdrh } 2704794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 2714794b980Sdrh return 1; 2724794b980Sdrh } 273fef5208cSdrh } 274fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 275fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 276fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 277fef5208cSdrh switch( pE2->op ){ 278fef5208cSdrh case TK_FLOAT: 279fef5208cSdrh case TK_INTEGER: 280fef5208cSdrh case TK_STRING: { 28199fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 282fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 283fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 284fef5208cSdrh break; 285fef5208cSdrh } 286fef5208cSdrh default: { 287fef5208cSdrh sqliteExprCode(pParse, pE2); 28899fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 289fef5208cSdrh break; 290fef5208cSdrh } 291fef5208cSdrh } 292fef5208cSdrh } 293fef5208cSdrh } 294cfab11bcSdrh break; 295fef5208cSdrh } 296fef5208cSdrh 29719a775c2Sdrh case TK_SELECT: { 298fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 299fef5208cSdrh ** value of this select in a memory cell and record the number 300967e8b73Sdrh ** of the memory cell in iColumn. 301fef5208cSdrh */ 302967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 303967e8b73Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){ 30419a775c2Sdrh return 1; 30519a775c2Sdrh } 30619a775c2Sdrh break; 30719a775c2Sdrh } 30819a775c2Sdrh 309cce7d176Sdrh /* For all else, just recursively walk the tree */ 310cce7d176Sdrh default: { 311cce7d176Sdrh if( pExpr->pLeft 312cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 313cce7d176Sdrh return 1; 314cce7d176Sdrh } 315cce7d176Sdrh if( pExpr->pRight 316cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){ 317cce7d176Sdrh return 1; 318cce7d176Sdrh } 319cce7d176Sdrh if( pExpr->pList ){ 320cce7d176Sdrh int i; 321cce7d176Sdrh ExprList *pList = pExpr->pList; 322cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 323cce7d176Sdrh if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){ 324cce7d176Sdrh return 1; 325cce7d176Sdrh } 326cce7d176Sdrh } 327cce7d176Sdrh } 328cce7d176Sdrh } 329cce7d176Sdrh } 330cce7d176Sdrh return 0; 331cce7d176Sdrh } 332cce7d176Sdrh 333cce7d176Sdrh #if 0 /* NOT USED */ 334cce7d176Sdrh /* 335cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 336cce7d176Sdrh */ 337cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 338cce7d176Sdrh int n = strlen(zStr); 339cce7d176Sdrh if( n!=pToken->n ) return 0; 340cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 341cce7d176Sdrh } 342cce7d176Sdrh #endif 343cce7d176Sdrh 344cce7d176Sdrh /* 345cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 346cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 347cce7d176Sdrh */ 348cce7d176Sdrh int sqliteFuncId(Token *pToken){ 349cce7d176Sdrh static const struct { 350cce7d176Sdrh char *zName; 351cce7d176Sdrh int len; 352cce7d176Sdrh int id; 353cce7d176Sdrh } aFunc[] = { 354cce7d176Sdrh { "count", 5, FN_Count }, 355cce7d176Sdrh { "min", 3, FN_Min }, 356cce7d176Sdrh { "max", 3, FN_Max }, 357cce7d176Sdrh { "sum", 3, FN_Sum }, 3582282792aSdrh { "avg", 3, FN_Avg }, 3596ec2733bSdrh { "length", 6, FN_Length }, 3606ec2733bSdrh { "substr", 6, FN_Substr }, 361bf4133cbSdrh { "abs", 3, FN_Abs }, 362bf4133cbSdrh { "round", 5, FN_Round }, 363cce7d176Sdrh }; 364cce7d176Sdrh int i; 365cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 366cce7d176Sdrh if( aFunc[i].len==pToken->n 367cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 368cce7d176Sdrh return aFunc[i].id; 369cce7d176Sdrh } 370cce7d176Sdrh } 371cce7d176Sdrh return FN_Unknown; 372cce7d176Sdrh } 373cce7d176Sdrh 374cce7d176Sdrh /* 375cce7d176Sdrh ** Error check the functions in an expression. Make sure all 376cce7d176Sdrh ** function names are recognized and all functions have the correct 377cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 378cce7d176Sdrh ** if anything is amiss. Return the number of errors. 379cce7d176Sdrh ** 380cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 381cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 382cce7d176Sdrh */ 383cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 384cce7d176Sdrh int nErr = 0; 385cce7d176Sdrh if( pExpr==0 ) return 0; 386cce7d176Sdrh switch( pExpr->op ){ 387cce7d176Sdrh case TK_FUNCTION: { 388cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 389cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 390cce7d176Sdrh int no_such_func = 0; 391cce7d176Sdrh int too_many_args = 0; 392cce7d176Sdrh int too_few_args = 0; 393cce7d176Sdrh int is_agg = 0; 394cce7d176Sdrh int i; 395967e8b73Sdrh pExpr->iColumn = id; 396cce7d176Sdrh switch( id ){ 397cce7d176Sdrh case FN_Unknown: { 398cce7d176Sdrh no_such_func = 1; 399cce7d176Sdrh break; 400cce7d176Sdrh } 401cce7d176Sdrh case FN_Count: { 402cce7d176Sdrh no_such_func = !allowAgg; 403cce7d176Sdrh too_many_args = n>1; 404cce7d176Sdrh is_agg = 1; 405cce7d176Sdrh break; 406cce7d176Sdrh } 407cce7d176Sdrh case FN_Max: 408cce7d176Sdrh case FN_Min: { 409cce7d176Sdrh too_few_args = allowAgg ? n<1 : n<2; 410cce7d176Sdrh is_agg = n==1; 411cce7d176Sdrh break; 412cce7d176Sdrh } 4132282792aSdrh case FN_Avg: 414cce7d176Sdrh case FN_Sum: { 415cce7d176Sdrh no_such_func = !allowAgg; 416cce7d176Sdrh too_many_args = n>1; 417cce7d176Sdrh too_few_args = n<1; 418cce7d176Sdrh is_agg = 1; 419cce7d176Sdrh break; 420cce7d176Sdrh } 421bf4133cbSdrh case FN_Abs: 4226ec2733bSdrh case FN_Length: { 4236ec2733bSdrh too_few_args = n<1; 4246ec2733bSdrh too_many_args = n>1; 4256ec2733bSdrh break; 4266ec2733bSdrh } 427bf4133cbSdrh case FN_Round: { 428bf4133cbSdrh too_few_args = n<1; 429bf4133cbSdrh too_many_args = n>2; 430bf4133cbSdrh break; 431bf4133cbSdrh } 4326ec2733bSdrh case FN_Substr: { 4336ec2733bSdrh too_few_args = n<3; 4346ec2733bSdrh too_many_args = n>3; 4356ec2733bSdrh break; 4366ec2733bSdrh } 437cce7d176Sdrh default: break; 438cce7d176Sdrh } 439cce7d176Sdrh if( no_such_func ){ 440cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 441cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 442cce7d176Sdrh pParse->nErr++; 443cce7d176Sdrh nErr++; 444cce7d176Sdrh }else if( too_many_args ){ 445cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 446cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 447cce7d176Sdrh pParse->nErr++; 448cce7d176Sdrh nErr++; 449cce7d176Sdrh }else if( too_few_args ){ 450cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 451cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 452cce7d176Sdrh pParse->nErr++; 453cce7d176Sdrh nErr++; 454cce7d176Sdrh } 4552282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 456cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 457cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 4584cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 4594cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 460cce7d176Sdrh } 461cce7d176Sdrh } 462cce7d176Sdrh default: { 463cce7d176Sdrh if( pExpr->pLeft ){ 4642282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 465cce7d176Sdrh } 466cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 4672282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 468cce7d176Sdrh } 469fef5208cSdrh if( nErr==0 && pExpr->pList ){ 470fef5208cSdrh int n = pExpr->pList->nExpr; 471fef5208cSdrh int i; 472fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 4732282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 4742282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 475fef5208cSdrh } 476fef5208cSdrh } 477cce7d176Sdrh break; 478cce7d176Sdrh } 479cce7d176Sdrh } 480cce7d176Sdrh return nErr; 481cce7d176Sdrh } 482cce7d176Sdrh 483cce7d176Sdrh /* 484cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 4851ccde15dSdrh ** expression and leave the result on the top of stack. 486cce7d176Sdrh */ 487cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 488cce7d176Sdrh Vdbe *v = pParse->pVdbe; 489cce7d176Sdrh int op; 490daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 491cce7d176Sdrh switch( pExpr->op ){ 492cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 493cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 494cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 495cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 496cce7d176Sdrh case TK_AND: op = OP_And; break; 497cce7d176Sdrh case TK_OR: op = OP_Or; break; 498cce7d176Sdrh case TK_LT: op = OP_Lt; break; 499cce7d176Sdrh case TK_LE: op = OP_Le; break; 500cce7d176Sdrh case TK_GT: op = OP_Gt; break; 501cce7d176Sdrh case TK_GE: op = OP_Ge; break; 502cce7d176Sdrh case TK_NE: op = OP_Ne; break; 503cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 504cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 505cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 506cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 507cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 508cce7d176Sdrh case TK_NOT: op = OP_Not; break; 509cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 510bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 511bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 512bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 513bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 514bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 515bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 516cce7d176Sdrh default: break; 517cce7d176Sdrh } 518cce7d176Sdrh switch( pExpr->op ){ 519967e8b73Sdrh case TK_COLUMN: { 5202282792aSdrh if( pParse->useAgg ){ 52199fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 522c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 52399fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 524c4a3c779Sdrh }else{ 52599fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 5262282792aSdrh } 527cce7d176Sdrh break; 528cce7d176Sdrh } 529cce7d176Sdrh case TK_INTEGER: { 5307a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 5317a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 532cce7d176Sdrh break; 533cce7d176Sdrh } 534cce7d176Sdrh case TK_FLOAT: { 53599fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 536cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 537cce7d176Sdrh break; 538cce7d176Sdrh } 539cce7d176Sdrh case TK_STRING: { 54099fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 541cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 542cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 543cce7d176Sdrh break; 544cce7d176Sdrh } 545cce7d176Sdrh case TK_NULL: { 54699fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 547cce7d176Sdrh break; 548cce7d176Sdrh } 549cce7d176Sdrh case TK_AND: 550cce7d176Sdrh case TK_OR: 551cce7d176Sdrh case TK_PLUS: 552cce7d176Sdrh case TK_STAR: 553cce7d176Sdrh case TK_MINUS: 554bf4133cbSdrh case TK_REM: 555bf4133cbSdrh case TK_BITAND: 556bf4133cbSdrh case TK_BITOR: 557cce7d176Sdrh case TK_SLASH: { 558cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 559cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 56099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 561cce7d176Sdrh break; 562cce7d176Sdrh } 563bf4133cbSdrh case TK_LSHIFT: 564bf4133cbSdrh case TK_RSHIFT: { 565bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 566bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 567bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 568bf4133cbSdrh break; 569bf4133cbSdrh } 5700040077dSdrh case TK_CONCAT: { 5710040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 5720040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 57399fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 5740040077dSdrh break; 5750040077dSdrh } 576cce7d176Sdrh case TK_LT: 577cce7d176Sdrh case TK_LE: 578cce7d176Sdrh case TK_GT: 579cce7d176Sdrh case TK_GE: 580cce7d176Sdrh case TK_NE: 581cce7d176Sdrh case TK_EQ: 582cce7d176Sdrh case TK_LIKE: 583cce7d176Sdrh case TK_GLOB: { 584cce7d176Sdrh int dest; 58599fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 586cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 587cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 588cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 58999fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 59099fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 591cce7d176Sdrh break; 592cce7d176Sdrh } 593cce7d176Sdrh case TK_UMINUS: { 5946e142f54Sdrh assert( pExpr->pLeft ); 5957a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 5966e142f54Sdrh Token *p = &pExpr->pLeft->token; 5976e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 5986e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 59999fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 60099fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 6016e142f54Sdrh sqliteFree(z); 6026e142f54Sdrh break; 6036e142f54Sdrh } 6041ccde15dSdrh /* Fall through into TK_NOT */ 6056e142f54Sdrh } 606bf4133cbSdrh case TK_BITNOT: 6076e142f54Sdrh case TK_NOT: { 608cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 60999fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 610cce7d176Sdrh break; 611cce7d176Sdrh } 612cce7d176Sdrh case TK_ISNULL: 613cce7d176Sdrh case TK_NOTNULL: { 614cce7d176Sdrh int dest; 61599fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 616cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 617cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 61899fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 61999fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 620cce7d176Sdrh break; 621cce7d176Sdrh } 6222282792aSdrh case TK_AGG_FUNCTION: { 62399fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 624967e8b73Sdrh if( pExpr->iColumn==FN_Avg ){ 6252282792aSdrh assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); 62699fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount); 62799fcd718Sdrh sqliteVdbeAddOp(v, OP_Divide, 0, 0); 6282282792aSdrh } 6292282792aSdrh break; 6302282792aSdrh } 631cce7d176Sdrh case TK_FUNCTION: { 632967e8b73Sdrh int id = pExpr->iColumn; 633cce7d176Sdrh int op; 634cce7d176Sdrh int i; 635cce7d176Sdrh ExprList *pList = pExpr->pList; 6366ec2733bSdrh switch( id ){ 6376ec2733bSdrh case FN_Min: 6386ec2733bSdrh case FN_Max: { 639cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 640cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 641cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 642cce7d176Sdrh if( i>0 ){ 64399fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 644cce7d176Sdrh } 645cce7d176Sdrh } 646cce7d176Sdrh break; 647cce7d176Sdrh } 648bf4133cbSdrh case FN_Abs: { 649bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 650bf4133cbSdrh sqliteVdbeAddOp(v, OP_AbsValue, 0, 0); 651bf4133cbSdrh break; 652bf4133cbSdrh } 653bf4133cbSdrh case FN_Round: { 654bf4133cbSdrh if( pList->nExpr==2 ){ 655bf4133cbSdrh sqliteExprCode(pParse, pList->a[1].pExpr); 656bf4133cbSdrh }else{ 657bf4133cbSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 658bf4133cbSdrh } 659bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 660bf4133cbSdrh sqliteVdbeAddOp(v, OP_Precision, 0, 0); 661bf4133cbSdrh break; 662bf4133cbSdrh } 6636ec2733bSdrh case FN_Length: { 6646ec2733bSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 66599fcd718Sdrh sqliteVdbeAddOp(v, OP_Strlen, 0, 0); 6666ec2733bSdrh break; 6676ec2733bSdrh } 6686ec2733bSdrh case FN_Substr: { 6696ec2733bSdrh for(i=0; i<pList->nExpr; i++){ 6706ec2733bSdrh sqliteExprCode(pParse, pList->a[i].pExpr); 6716ec2733bSdrh } 67299fcd718Sdrh sqliteVdbeAddOp(v, OP_Substr, 0, 0); 6736ec2733bSdrh break; 6746ec2733bSdrh } 6756ec2733bSdrh default: { 6766ec2733bSdrh /* Can't happen! */ 6776ec2733bSdrh break; 6786ec2733bSdrh } 6796ec2733bSdrh } 6806ec2733bSdrh break; 6816ec2733bSdrh } 68219a775c2Sdrh case TK_SELECT: { 68399fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 68419a775c2Sdrh break; 68519a775c2Sdrh } 686fef5208cSdrh case TK_IN: { 687fef5208cSdrh int addr; 68899fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 689fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 690fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 691fef5208cSdrh if( pExpr->pSelect ){ 69299fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2); 693fef5208cSdrh }else{ 69499fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2); 695fef5208cSdrh } 69699fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 697fef5208cSdrh break; 698fef5208cSdrh } 699fef5208cSdrh case TK_BETWEEN: { 700fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 70199fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 702fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 70399fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0); 704fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 705fef5208cSdrh break; 706fef5208cSdrh } 707cce7d176Sdrh } 708cce7d176Sdrh return; 709cce7d176Sdrh } 710cce7d176Sdrh 711cce7d176Sdrh /* 712cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 713cce7d176Sdrh ** to the label "dest" if the expression is true but execution 714cce7d176Sdrh ** continues straight thru if the expression is false. 715cce7d176Sdrh */ 716cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 717cce7d176Sdrh Vdbe *v = pParse->pVdbe; 718cce7d176Sdrh int op = 0; 719daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 720cce7d176Sdrh switch( pExpr->op ){ 721cce7d176Sdrh case TK_LT: op = OP_Lt; break; 722cce7d176Sdrh case TK_LE: op = OP_Le; break; 723cce7d176Sdrh case TK_GT: op = OP_Gt; break; 724cce7d176Sdrh case TK_GE: op = OP_Ge; break; 725cce7d176Sdrh case TK_NE: op = OP_Ne; break; 726cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 727cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 728cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 729cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 730cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 731cce7d176Sdrh default: break; 732cce7d176Sdrh } 733cce7d176Sdrh switch( pExpr->op ){ 734cce7d176Sdrh case TK_AND: { 735cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 736cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 737cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 738cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 739cce7d176Sdrh break; 740cce7d176Sdrh } 741cce7d176Sdrh case TK_OR: { 742cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 743cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 744cce7d176Sdrh break; 745cce7d176Sdrh } 746cce7d176Sdrh case TK_NOT: { 747cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 748cce7d176Sdrh break; 749cce7d176Sdrh } 750cce7d176Sdrh case TK_LT: 751cce7d176Sdrh case TK_LE: 752cce7d176Sdrh case TK_GT: 753cce7d176Sdrh case TK_GE: 754cce7d176Sdrh case TK_NE: 755cce7d176Sdrh case TK_EQ: 756cce7d176Sdrh case TK_LIKE: 757cce7d176Sdrh case TK_GLOB: { 758cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 759cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 76099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 761cce7d176Sdrh break; 762cce7d176Sdrh } 763cce7d176Sdrh case TK_ISNULL: 764cce7d176Sdrh case TK_NOTNULL: { 765cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 76699fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 767cce7d176Sdrh break; 768cce7d176Sdrh } 769fef5208cSdrh case TK_IN: { 770cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 771fef5208cSdrh if( pExpr->pSelect ){ 77299fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 773fef5208cSdrh }else{ 77499fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 775fef5208cSdrh } 776fef5208cSdrh break; 777fef5208cSdrh } 778fef5208cSdrh case TK_BETWEEN: { 779fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 780fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 78199fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 782fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 78399fcd718Sdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl); 784fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 78599fcd718Sdrh sqliteVdbeAddOp(v, OP_Le, 0, dest); 78699fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 78799fcd718Sdrh sqliteVdbeResolveLabel(v, lbl); 78899fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 789fef5208cSdrh break; 790fef5208cSdrh } 791cce7d176Sdrh default: { 792cce7d176Sdrh sqliteExprCode(pParse, pExpr); 79399fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 794cce7d176Sdrh break; 795cce7d176Sdrh } 796cce7d176Sdrh } 797cce7d176Sdrh } 798cce7d176Sdrh 799cce7d176Sdrh /* 80066b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 801cce7d176Sdrh ** to the label "dest" if the expression is false but execution 802cce7d176Sdrh ** continues straight thru if the expression is true. 803cce7d176Sdrh */ 804cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 805cce7d176Sdrh Vdbe *v = pParse->pVdbe; 806cce7d176Sdrh int op = 0; 807daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 808cce7d176Sdrh switch( pExpr->op ){ 809cce7d176Sdrh case TK_LT: op = OP_Ge; break; 810cce7d176Sdrh case TK_LE: op = OP_Gt; break; 811cce7d176Sdrh case TK_GT: op = OP_Le; break; 812cce7d176Sdrh case TK_GE: op = OP_Lt; break; 813cce7d176Sdrh case TK_NE: op = OP_Eq; break; 814cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 815cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 816cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 817cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 818cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 819cce7d176Sdrh default: break; 820cce7d176Sdrh } 821cce7d176Sdrh switch( pExpr->op ){ 822cce7d176Sdrh case TK_AND: { 823cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 824cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 825cce7d176Sdrh break; 826cce7d176Sdrh } 827cce7d176Sdrh case TK_OR: { 828cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 829cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 830cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 831cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 832cce7d176Sdrh break; 833cce7d176Sdrh } 834cce7d176Sdrh case TK_NOT: { 835cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 836cce7d176Sdrh break; 837cce7d176Sdrh } 838cce7d176Sdrh case TK_LT: 839cce7d176Sdrh case TK_LE: 840cce7d176Sdrh case TK_GT: 841cce7d176Sdrh case TK_GE: 842cce7d176Sdrh case TK_NE: 843cce7d176Sdrh case TK_EQ: { 844cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 845cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 84699fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 847cce7d176Sdrh break; 848cce7d176Sdrh } 849cce7d176Sdrh case TK_LIKE: 850cce7d176Sdrh case TK_GLOB: { 851cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 852cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 85399fcd718Sdrh sqliteVdbeAddOp(v, op, 1, dest); 854cce7d176Sdrh break; 855cce7d176Sdrh } 856cce7d176Sdrh case TK_ISNULL: 857cce7d176Sdrh case TK_NOTNULL: { 858cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 85999fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 860cce7d176Sdrh break; 861cce7d176Sdrh } 862fef5208cSdrh case TK_IN: { 863cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 864fef5208cSdrh if( pExpr->pSelect ){ 86599fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 866fef5208cSdrh }else{ 86799fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 868fef5208cSdrh } 869fef5208cSdrh break; 870fef5208cSdrh } 871fef5208cSdrh case TK_BETWEEN: { 872fef5208cSdrh int addr; 873fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 87499fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 875fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 876fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 87799fcd718Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); 87899fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 87999fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 880fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 88199fcd718Sdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest); 882fef5208cSdrh break; 883fef5208cSdrh } 884cce7d176Sdrh default: { 885cce7d176Sdrh sqliteExprCode(pParse, pExpr); 88699fcd718Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0); 88799fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 888cce7d176Sdrh break; 889cce7d176Sdrh } 890cce7d176Sdrh } 891cce7d176Sdrh } 8922282792aSdrh 8932282792aSdrh /* 8942282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 8952282792aSdrh ** if they are identical and return FALSE if they differ in any way. 8962282792aSdrh */ 897d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 8982282792aSdrh int i; 8992282792aSdrh if( pA==0 ){ 9002282792aSdrh return pB==0; 9012282792aSdrh }else if( pB==0 ){ 9022282792aSdrh return 0; 9032282792aSdrh } 9042282792aSdrh if( pA->op!=pB->op ) return 0; 905d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 906d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 9072282792aSdrh if( pA->pList ){ 9082282792aSdrh if( pB->pList==0 ) return 0; 9092282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 9102282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 911d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 9122282792aSdrh return 0; 9132282792aSdrh } 9142282792aSdrh } 9152282792aSdrh }else if( pB->pList ){ 9162282792aSdrh return 0; 9172282792aSdrh } 9182282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 9192282792aSdrh if( pA->token.z ){ 9202282792aSdrh if( pB->token.z==0 ) return 0; 9212282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 9222282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 9232282792aSdrh } 9242282792aSdrh return 1; 9252282792aSdrh } 9262282792aSdrh 9272282792aSdrh /* 9282282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 9292282792aSdrh */ 9302282792aSdrh static int appendAggInfo(Parse *pParse){ 9312282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 9322282792aSdrh int amt = pParse->nAgg + 8; 9336d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 9346d4abfbeSdrh if( aAgg==0 ){ 9352282792aSdrh return -1; 9362282792aSdrh } 9376d4abfbeSdrh pParse->aAgg = aAgg; 9382282792aSdrh } 9392282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 9402282792aSdrh return pParse->nAgg++; 9412282792aSdrh } 9422282792aSdrh 9432282792aSdrh /* 9442282792aSdrh ** Analyze the given expression looking for aggregate functions and 9452282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 9462282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 9472282792aSdrh ** 9482282792aSdrh ** This routine should only be called after the expression has been 9492282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 9502282792aSdrh ** 9512282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 9522282792aSdrh ** the number of errors. 9532282792aSdrh */ 9542282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 9552282792aSdrh int i; 9562282792aSdrh AggExpr *aAgg; 9572282792aSdrh int nErr = 0; 9582282792aSdrh 9592282792aSdrh if( pExpr==0 ) return 0; 9602282792aSdrh switch( pExpr->op ){ 961967e8b73Sdrh case TK_COLUMN: { 9622282792aSdrh aAgg = pParse->aAgg; 9632282792aSdrh for(i=0; i<pParse->nAgg; i++){ 9642282792aSdrh if( aAgg[i].isAgg ) continue; 9652282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 966967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 9672282792aSdrh break; 9682282792aSdrh } 9692282792aSdrh } 9702282792aSdrh if( i>=pParse->nAgg ){ 9712282792aSdrh i = appendAggInfo(pParse); 9722282792aSdrh if( i<0 ) return 1; 9732282792aSdrh pParse->aAgg[i].isAgg = 0; 9742282792aSdrh pParse->aAgg[i].pExpr = pExpr; 9752282792aSdrh } 976aaf88729Sdrh pExpr->iAgg = i; 9772282792aSdrh break; 9782282792aSdrh } 9792282792aSdrh case TK_AGG_FUNCTION: { 980967e8b73Sdrh if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){ 9812282792aSdrh if( pParse->iAggCount>=0 ){ 9822282792aSdrh i = pParse->iAggCount; 9832282792aSdrh }else{ 9842282792aSdrh i = appendAggInfo(pParse); 9852282792aSdrh if( i<0 ) return 1; 9862282792aSdrh pParse->aAgg[i].isAgg = 1; 9872282792aSdrh pParse->aAgg[i].pExpr = 0; 9882282792aSdrh pParse->iAggCount = i; 9892282792aSdrh } 990967e8b73Sdrh if( pExpr->iColumn==FN_Count ){ 9912282792aSdrh pExpr->iAgg = i; 9922282792aSdrh break; 9932282792aSdrh } 9942282792aSdrh } 9952282792aSdrh aAgg = pParse->aAgg; 9962282792aSdrh for(i=0; i<pParse->nAgg; i++){ 9972282792aSdrh if( !aAgg[i].isAgg ) continue; 998d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 9992282792aSdrh break; 10002282792aSdrh } 10012282792aSdrh } 10022282792aSdrh if( i>=pParse->nAgg ){ 10032282792aSdrh i = appendAggInfo(pParse); 10042282792aSdrh if( i<0 ) return 1; 10052282792aSdrh pParse->aAgg[i].isAgg = 1; 10062282792aSdrh pParse->aAgg[i].pExpr = pExpr; 10072282792aSdrh } 10082282792aSdrh pExpr->iAgg = i; 10092282792aSdrh break; 10102282792aSdrh } 10112282792aSdrh default: { 10122282792aSdrh if( pExpr->pLeft ){ 10132282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 10142282792aSdrh } 10152282792aSdrh if( nErr==0 && pExpr->pRight ){ 10162282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 10172282792aSdrh } 10182282792aSdrh if( nErr==0 && pExpr->pList ){ 10192282792aSdrh int n = pExpr->pList->nExpr; 10202282792aSdrh int i; 10212282792aSdrh for(i=0; nErr==0 && i<n; i++){ 10222282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 10232282792aSdrh } 10242282792aSdrh } 10252282792aSdrh break; 10262282792aSdrh } 10272282792aSdrh } 10282282792aSdrh return nErr; 10292282792aSdrh } 1030