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*9208643dSdrh ** $Id: expr.c,v 1.39 2002/01/22 14:11:29 drh Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 18cce7d176Sdrh 19a2e00042Sdrh 20a2e00042Sdrh /* 21a2e00042Sdrh ** Recursively delete an expression tree. 22a2e00042Sdrh */ 23a2e00042Sdrh void sqliteExprDelete(Expr *p){ 24a2e00042Sdrh if( p==0 ) return; 25a2e00042Sdrh if( p->op!=TK_AS ){ 26a2e00042Sdrh if( p->pLeft ) sqliteExprDelete(p->pLeft); 27a2e00042Sdrh if( p->pRight ) sqliteExprDelete(p->pRight); 28a2e00042Sdrh } 29a2e00042Sdrh if( p->pList ) sqliteExprListDelete(p->pList); 30a2e00042Sdrh if( p->pSelect ) sqliteSelectDelete(p->pSelect); 31a2e00042Sdrh sqliteFree(p); 32a2e00042Sdrh } 33a2e00042Sdrh 34cce7d176Sdrh /* 35fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 36fef5208cSdrh ** and 0 if it involves variables. 37fef5208cSdrh */ 38*9208643dSdrh int sqliteExprIsConstant(Expr *p){ 39fef5208cSdrh switch( p->op ){ 40fef5208cSdrh case TK_ID: 41967e8b73Sdrh case TK_COLUMN: 42fef5208cSdrh case TK_DOT: 43fef5208cSdrh return 0; 44*9208643dSdrh case TK_INTEGER: 45*9208643dSdrh case TK_FLOAT: 46*9208643dSdrh case TK_STRING: 47*9208643dSdrh return 1; 48fef5208cSdrh default: { 49*9208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 50*9208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 51fef5208cSdrh if( p->pList ){ 52fef5208cSdrh int i; 53fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 54*9208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 55fef5208cSdrh } 56fef5208cSdrh } 57*9208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 58fef5208cSdrh } 59fef5208cSdrh } 60*9208643dSdrh return 0; 61fef5208cSdrh } 62fef5208cSdrh 63fef5208cSdrh /* 644794b980Sdrh ** Walk the expression tree and process operators of the form: 654794b980Sdrh ** 664794b980Sdrh ** expr IN (SELECT ...) 674794b980Sdrh ** 68967e8b73Sdrh ** These operators have to be processed before column names are 694794b980Sdrh ** resolved because each such operator increments pParse->nTab 701ccde15dSdrh ** to reserve cursor numbers for its own use. But pParse->nTab 71aacc543eSdrh ** needs to be constant once we begin resolving column names. For 72aacc543eSdrh ** that reason, this procedure needs to be called on every expression 73aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression. 744794b980Sdrh ** 754794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this 764794b980Sdrh ** routine. This routine allocates a cursor number to the IN-SELECT 774794b980Sdrh ** and then moves on. The code generation is done by 784794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards. 794794b980Sdrh */ 804794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){ 814794b980Sdrh if( pExpr==0 ) return; 824794b980Sdrh if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){ 834794b980Sdrh pExpr->iTable = pParse->nTab++; 844794b980Sdrh }else{ 854794b980Sdrh if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft); 864794b980Sdrh if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight); 874794b980Sdrh if( pExpr->pList ){ 884794b980Sdrh int i; 894794b980Sdrh ExprList *pList = pExpr->pList; 904794b980Sdrh for(i=0; i<pList->nExpr; i++){ 914794b980Sdrh sqliteExprResolveInSelect(pParse, pList->a[i].pExpr); 924794b980Sdrh } 934794b980Sdrh } 944794b980Sdrh } 954794b980Sdrh } 964794b980Sdrh 974794b980Sdrh /* 98c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 99c4a3c779Sdrh */ 100c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 101c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 102c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 103c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 104c4a3c779Sdrh return 0; 105c4a3c779Sdrh } 106c4a3c779Sdrh 107c4a3c779Sdrh /* 108cce7d176Sdrh ** This routine walks an expression tree and resolves references to 109967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 110aacc543eSdrh ** index to the table in the table list and a column offset. The 111aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 112aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 113aacc543eSdrh ** plus the pParse->nTab value. This value will ultimately become the 114aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 115aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 116aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 117aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 118aacc543eSdrh ** alias for ROWID. 11919a775c2Sdrh ** 120fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 121fef5208cSdrh ** forms: 122fef5208cSdrh ** 123fef5208cSdrh ** expr IN (exprlist) 124fef5208cSdrh ** and 125fef5208cSdrh ** expr IN (SELECT ...) 126fef5208cSdrh ** 127fef5208cSdrh ** The first form is handled by creating a set holding the list 128fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 129fef5208cSdrh ** a temporary table. 130fef5208cSdrh ** 131fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 13219a775c2Sdrh ** If it finds any, it generates code to write the value of that select 13319a775c2Sdrh ** into a memory cell. 134cce7d176Sdrh ** 135967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 136cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 137cce7d176Sdrh */ 138a2e00042Sdrh int sqliteExprResolveIds( 139a2e00042Sdrh Parse *pParse, /* The parser context */ 140a2e00042Sdrh IdList *pTabList, /* List of tables used to resolve column names */ 141a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 142a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 143a2e00042Sdrh ){ 144daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 145cce7d176Sdrh switch( pExpr->op ){ 146a2e00042Sdrh /* A lone identifier. Try and match it as follows: 147a2e00042Sdrh ** 148a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 149a2e00042Sdrh ** 150a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 151a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 152a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 153a2e00042Sdrh ** 154a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 155a2e00042Sdrh */ 156cce7d176Sdrh case TK_ID: { 157cce7d176Sdrh int cnt = 0; /* Number of matches */ 158cce7d176Sdrh int i; /* Loop counter */ 1596e142f54Sdrh char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 160daffd0e5Sdrh if( z==0 ) return 1; 161cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 162cce7d176Sdrh int j; 163cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 164cce7d176Sdrh if( pTab==0 ) continue; 165cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 1667020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 167cce7d176Sdrh cnt++; 16819a775c2Sdrh pExpr->iTable = i + pParse->nTab; 1694a32431cSdrh if( j==pTab->iPKey ){ 1704a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 1714a32431cSdrh pExpr->iColumn = -1; 1724a32431cSdrh }else{ 173967e8b73Sdrh pExpr->iColumn = j; 174cce7d176Sdrh } 175a2e00042Sdrh pExpr->op = TK_COLUMN; 176a2e00042Sdrh } 177a2e00042Sdrh } 178a2e00042Sdrh } 179a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 180a2e00042Sdrh int j; 181a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 182a2e00042Sdrh char *zAs = pEList->a[j].zName; 183a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 184a2e00042Sdrh cnt++; 185a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 186a2e00042Sdrh pExpr->op = TK_AS; 187a2e00042Sdrh pExpr->iColumn = j; 188a2e00042Sdrh pExpr->pLeft = pEList->a[j].pExpr; 189cce7d176Sdrh } 190cce7d176Sdrh } 1914a32431cSdrh } 192c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 193c4a3c779Sdrh pExpr->iColumn = -1; 194c4a3c779Sdrh pExpr->iTable = pParse->nTab; 195c4a3c779Sdrh cnt = 1 + (pTabList->nId>1); 196a2e00042Sdrh pExpr->op = TK_COLUMN; 197c4a3c779Sdrh } 198cce7d176Sdrh sqliteFree(z); 199cce7d176Sdrh if( cnt==0 ){ 200967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 201cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 202cce7d176Sdrh pParse->nErr++; 203cce7d176Sdrh return 1; 204cce7d176Sdrh }else if( cnt>1 ){ 205967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 206cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 207cce7d176Sdrh pParse->nErr++; 208cce7d176Sdrh return 1; 209cce7d176Sdrh } 210cce7d176Sdrh break; 211cce7d176Sdrh } 212cce7d176Sdrh 213967e8b73Sdrh /* A table name and column name: ID.ID */ 214cce7d176Sdrh case TK_DOT: { 215cce7d176Sdrh int cnt = 0; /* Number of matches */ 216c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 217cce7d176Sdrh int i; /* Loop counter */ 218cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 219cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 220cce7d176Sdrh 221cce7d176Sdrh pLeft = pExpr->pLeft; 222cce7d176Sdrh pRight = pExpr->pRight; 223cce7d176Sdrh assert( pLeft && pLeft->op==TK_ID ); 224cce7d176Sdrh assert( pRight && pRight->op==TK_ID ); 2256e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 2266e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 227daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 228daffd0e5Sdrh sqliteFree(zLeft); 229daffd0e5Sdrh sqliteFree(zRight); 230daffd0e5Sdrh return 1; 231daffd0e5Sdrh } 23287c40e88Sdrh sqliteDequote(zLeft); 23387c40e88Sdrh sqliteDequote(zRight); 234c4a3c779Sdrh pExpr->iTable = -1; 235cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 236cce7d176Sdrh int j; 237cce7d176Sdrh char *zTab; 238cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 239cce7d176Sdrh if( pTab==0 ) continue; 240cce7d176Sdrh if( pTabList->a[i].zAlias ){ 241cce7d176Sdrh zTab = pTabList->a[i].zAlias; 242cce7d176Sdrh }else{ 243cce7d176Sdrh zTab = pTab->zName; 244cce7d176Sdrh } 245cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 246c4a3c779Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab; 247cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 2487020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 249cce7d176Sdrh cnt++; 25019a775c2Sdrh pExpr->iTable = i + pParse->nTab; 2514a32431cSdrh if( j==pTab->iPKey ){ 2524a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 2534a32431cSdrh pExpr->iColumn = -1; 2544a32431cSdrh }else{ 255967e8b73Sdrh pExpr->iColumn = j; 256cce7d176Sdrh } 257cce7d176Sdrh } 258cce7d176Sdrh } 2594a32431cSdrh } 260c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 261c4a3c779Sdrh cnt = 1; 262c4a3c779Sdrh pExpr->iColumn = -1; 263c4a3c779Sdrh } 264cce7d176Sdrh sqliteFree(zLeft); 265cce7d176Sdrh sqliteFree(zRight); 266cce7d176Sdrh if( cnt==0 ){ 267967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 268cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 269cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 270cce7d176Sdrh pParse->nErr++; 271cce7d176Sdrh return 1; 272cce7d176Sdrh }else if( cnt>1 ){ 273967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 274cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 275cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 276cce7d176Sdrh pParse->nErr++; 277cce7d176Sdrh return 1; 278cce7d176Sdrh } 279cce7d176Sdrh sqliteExprDelete(pLeft); 280cce7d176Sdrh pExpr->pLeft = 0; 281cce7d176Sdrh sqliteExprDelete(pRight); 282cce7d176Sdrh pExpr->pRight = 0; 283967e8b73Sdrh pExpr->op = TK_COLUMN; 284cce7d176Sdrh break; 285cce7d176Sdrh } 286cce7d176Sdrh 287fef5208cSdrh case TK_IN: { 288d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 289fef5208cSdrh if( v==0 ) return 1; 290a2e00042Sdrh if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 291cfab11bcSdrh return 1; 292cfab11bcSdrh } 293fef5208cSdrh if( pExpr->pSelect ){ 294fef5208cSdrh /* Case 1: expr IN (SELECT ...) 295fef5208cSdrh ** 296fef5208cSdrh ** Generate code to write the results of the select into a temporary 2974794b980Sdrh ** table. The cursor number of the temporary table has already 2984794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 299fef5208cSdrh */ 300c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 301fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 302fef5208cSdrh }else if( pExpr->pList ){ 303fef5208cSdrh /* Case 2: expr IN (exprlist) 304fef5208cSdrh ** 305fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 306fef5208cSdrh ** in iTable. 307fef5208cSdrh */ 308fef5208cSdrh int i, iSet; 309fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 310fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 311*9208643dSdrh if( !sqliteExprIsConstant(pE2) ){ 312fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 313fef5208cSdrh "right-hand side of IN operator must be constant", 0); 314fef5208cSdrh pParse->nErr++; 315fef5208cSdrh return 1; 316fef5208cSdrh } 3174794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 3184794b980Sdrh return 1; 3194794b980Sdrh } 320fef5208cSdrh } 321fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 322fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 323fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 324fef5208cSdrh switch( pE2->op ){ 325fef5208cSdrh case TK_FLOAT: 326fef5208cSdrh case TK_INTEGER: 327fef5208cSdrh case TK_STRING: { 32899fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 329fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 330fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 331fef5208cSdrh break; 332fef5208cSdrh } 333fef5208cSdrh default: { 334fef5208cSdrh sqliteExprCode(pParse, pE2); 33599fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 336fef5208cSdrh break; 337fef5208cSdrh } 338fef5208cSdrh } 339fef5208cSdrh } 340fef5208cSdrh } 341cfab11bcSdrh break; 342fef5208cSdrh } 343fef5208cSdrh 34419a775c2Sdrh case TK_SELECT: { 345fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 346fef5208cSdrh ** value of this select in a memory cell and record the number 347967e8b73Sdrh ** of the memory cell in iColumn. 348fef5208cSdrh */ 349967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 350967e8b73Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){ 35119a775c2Sdrh return 1; 35219a775c2Sdrh } 35319a775c2Sdrh break; 35419a775c2Sdrh } 35519a775c2Sdrh 356cce7d176Sdrh /* For all else, just recursively walk the tree */ 357cce7d176Sdrh default: { 358cce7d176Sdrh if( pExpr->pLeft 359a2e00042Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 360cce7d176Sdrh return 1; 361cce7d176Sdrh } 362cce7d176Sdrh if( pExpr->pRight 363a2e00042Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){ 364cce7d176Sdrh return 1; 365cce7d176Sdrh } 366cce7d176Sdrh if( pExpr->pList ){ 367cce7d176Sdrh int i; 368cce7d176Sdrh ExprList *pList = pExpr->pList; 369cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 370a2e00042Sdrh if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){ 371cce7d176Sdrh return 1; 372cce7d176Sdrh } 373cce7d176Sdrh } 374cce7d176Sdrh } 375cce7d176Sdrh } 376cce7d176Sdrh } 377cce7d176Sdrh return 0; 378cce7d176Sdrh } 379cce7d176Sdrh 380cce7d176Sdrh #if 0 /* NOT USED */ 381cce7d176Sdrh /* 382cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 383cce7d176Sdrh */ 384cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 385cce7d176Sdrh int n = strlen(zStr); 386cce7d176Sdrh if( n!=pToken->n ) return 0; 387cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 388cce7d176Sdrh } 389cce7d176Sdrh #endif 390cce7d176Sdrh 391cce7d176Sdrh /* 392cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 393cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 394cce7d176Sdrh */ 395cce7d176Sdrh int sqliteFuncId(Token *pToken){ 396cce7d176Sdrh static const struct { 397cce7d176Sdrh char *zName; 398cce7d176Sdrh int len; 399cce7d176Sdrh int id; 400cce7d176Sdrh } aFunc[] = { 401cce7d176Sdrh { "count", 5, FN_Count }, 402cce7d176Sdrh { "min", 3, FN_Min }, 403cce7d176Sdrh { "max", 3, FN_Max }, 404cce7d176Sdrh { "sum", 3, FN_Sum }, 4052282792aSdrh { "avg", 3, FN_Avg }, 4066ec2733bSdrh { "length", 6, FN_Length }, 4076ec2733bSdrh { "substr", 6, FN_Substr }, 408bf4133cbSdrh { "abs", 3, FN_Abs }, 409bf4133cbSdrh { "round", 5, FN_Round }, 410cce7d176Sdrh }; 411cce7d176Sdrh int i; 412cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 413cce7d176Sdrh if( aFunc[i].len==pToken->n 414cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 415cce7d176Sdrh return aFunc[i].id; 416cce7d176Sdrh } 417cce7d176Sdrh } 418cce7d176Sdrh return FN_Unknown; 419cce7d176Sdrh } 420cce7d176Sdrh 421cce7d176Sdrh /* 422cce7d176Sdrh ** Error check the functions in an expression. Make sure all 423cce7d176Sdrh ** function names are recognized and all functions have the correct 424cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 425cce7d176Sdrh ** if anything is amiss. Return the number of errors. 426cce7d176Sdrh ** 427cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 428cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 429cce7d176Sdrh */ 430cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 431cce7d176Sdrh int nErr = 0; 432cce7d176Sdrh if( pExpr==0 ) return 0; 433cce7d176Sdrh switch( pExpr->op ){ 434cce7d176Sdrh case TK_FUNCTION: { 435cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 436cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 437cce7d176Sdrh int no_such_func = 0; 438cce7d176Sdrh int too_many_args = 0; 439cce7d176Sdrh int too_few_args = 0; 440cce7d176Sdrh int is_agg = 0; 441cce7d176Sdrh int i; 442967e8b73Sdrh pExpr->iColumn = id; 443cce7d176Sdrh switch( id ){ 444cce7d176Sdrh case FN_Unknown: { 445cce7d176Sdrh no_such_func = 1; 446cce7d176Sdrh break; 447cce7d176Sdrh } 448cce7d176Sdrh case FN_Count: { 449cce7d176Sdrh no_such_func = !allowAgg; 450cce7d176Sdrh too_many_args = n>1; 451cce7d176Sdrh is_agg = 1; 452cce7d176Sdrh break; 453cce7d176Sdrh } 454cce7d176Sdrh case FN_Max: 455cce7d176Sdrh case FN_Min: { 456cce7d176Sdrh too_few_args = allowAgg ? n<1 : n<2; 457cce7d176Sdrh is_agg = n==1; 458cce7d176Sdrh break; 459cce7d176Sdrh } 4602282792aSdrh case FN_Avg: 461cce7d176Sdrh case FN_Sum: { 462cce7d176Sdrh no_such_func = !allowAgg; 463cce7d176Sdrh too_many_args = n>1; 464cce7d176Sdrh too_few_args = n<1; 465cce7d176Sdrh is_agg = 1; 466cce7d176Sdrh break; 467cce7d176Sdrh } 468bf4133cbSdrh case FN_Abs: 4696ec2733bSdrh case FN_Length: { 4706ec2733bSdrh too_few_args = n<1; 4716ec2733bSdrh too_many_args = n>1; 4726ec2733bSdrh break; 4736ec2733bSdrh } 474bf4133cbSdrh case FN_Round: { 475bf4133cbSdrh too_few_args = n<1; 476bf4133cbSdrh too_many_args = n>2; 477bf4133cbSdrh break; 478bf4133cbSdrh } 4796ec2733bSdrh case FN_Substr: { 4806ec2733bSdrh too_few_args = n<3; 4816ec2733bSdrh too_many_args = n>3; 4826ec2733bSdrh break; 4836ec2733bSdrh } 484cce7d176Sdrh default: break; 485cce7d176Sdrh } 486cce7d176Sdrh if( no_such_func ){ 487cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 488cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 489cce7d176Sdrh pParse->nErr++; 490cce7d176Sdrh nErr++; 491cce7d176Sdrh }else if( too_many_args ){ 492cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 493cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 494cce7d176Sdrh pParse->nErr++; 495cce7d176Sdrh nErr++; 496cce7d176Sdrh }else if( too_few_args ){ 497cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 498cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 499cce7d176Sdrh pParse->nErr++; 500cce7d176Sdrh nErr++; 501cce7d176Sdrh } 5022282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 503cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 504cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 5054cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 5064cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 507cce7d176Sdrh } 508cce7d176Sdrh } 509cce7d176Sdrh default: { 510cce7d176Sdrh if( pExpr->pLeft ){ 5112282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 512cce7d176Sdrh } 513cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 5142282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 515cce7d176Sdrh } 516fef5208cSdrh if( nErr==0 && pExpr->pList ){ 517fef5208cSdrh int n = pExpr->pList->nExpr; 518fef5208cSdrh int i; 519fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 5202282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 5212282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 522fef5208cSdrh } 523fef5208cSdrh } 524cce7d176Sdrh break; 525cce7d176Sdrh } 526cce7d176Sdrh } 527cce7d176Sdrh return nErr; 528cce7d176Sdrh } 529cce7d176Sdrh 530cce7d176Sdrh /* 531cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 5321ccde15dSdrh ** expression and leave the result on the top of stack. 533cce7d176Sdrh */ 534cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 535cce7d176Sdrh Vdbe *v = pParse->pVdbe; 536cce7d176Sdrh int op; 537daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 538cce7d176Sdrh switch( pExpr->op ){ 539cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 540cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 541cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 542cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 543cce7d176Sdrh case TK_AND: op = OP_And; break; 544cce7d176Sdrh case TK_OR: op = OP_Or; break; 545cce7d176Sdrh case TK_LT: op = OP_Lt; break; 546cce7d176Sdrh case TK_LE: op = OP_Le; break; 547cce7d176Sdrh case TK_GT: op = OP_Gt; break; 548cce7d176Sdrh case TK_GE: op = OP_Ge; break; 549cce7d176Sdrh case TK_NE: op = OP_Ne; break; 550cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 551cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 552cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 553cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 554cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 555cce7d176Sdrh case TK_NOT: op = OP_Not; break; 556cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 557bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 558bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 559bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 560bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 561bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 562bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 563cce7d176Sdrh default: break; 564cce7d176Sdrh } 565cce7d176Sdrh switch( pExpr->op ){ 566967e8b73Sdrh case TK_COLUMN: { 5672282792aSdrh if( pParse->useAgg ){ 56899fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 569c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 57099fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 571c4a3c779Sdrh }else{ 57299fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 5732282792aSdrh } 574cce7d176Sdrh break; 575cce7d176Sdrh } 576cce7d176Sdrh case TK_INTEGER: { 5777a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 5787a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 579cce7d176Sdrh break; 580cce7d176Sdrh } 581cce7d176Sdrh case TK_FLOAT: { 58299fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 583cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 584cce7d176Sdrh break; 585cce7d176Sdrh } 586cce7d176Sdrh case TK_STRING: { 58799fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 588cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 589cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 590cce7d176Sdrh break; 591cce7d176Sdrh } 592cce7d176Sdrh case TK_NULL: { 59399fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 594cce7d176Sdrh break; 595cce7d176Sdrh } 596cce7d176Sdrh case TK_AND: 597cce7d176Sdrh case TK_OR: 598cce7d176Sdrh case TK_PLUS: 599cce7d176Sdrh case TK_STAR: 600cce7d176Sdrh case TK_MINUS: 601bf4133cbSdrh case TK_REM: 602bf4133cbSdrh case TK_BITAND: 603bf4133cbSdrh case TK_BITOR: 604cce7d176Sdrh case TK_SLASH: { 605cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 606cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 60799fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 608cce7d176Sdrh break; 609cce7d176Sdrh } 610bf4133cbSdrh case TK_LSHIFT: 611bf4133cbSdrh case TK_RSHIFT: { 612bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 613bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 614bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 615bf4133cbSdrh break; 616bf4133cbSdrh } 6170040077dSdrh case TK_CONCAT: { 6180040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 6190040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 62099fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 6210040077dSdrh break; 6220040077dSdrh } 623cce7d176Sdrh case TK_LT: 624cce7d176Sdrh case TK_LE: 625cce7d176Sdrh case TK_GT: 626cce7d176Sdrh case TK_GE: 627cce7d176Sdrh case TK_NE: 628cce7d176Sdrh case TK_EQ: 629cce7d176Sdrh case TK_LIKE: 630cce7d176Sdrh case TK_GLOB: { 631cce7d176Sdrh int dest; 63299fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 633cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 634cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 635cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 63699fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 63799fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 638cce7d176Sdrh break; 639cce7d176Sdrh } 640cce7d176Sdrh case TK_UMINUS: { 6416e142f54Sdrh assert( pExpr->pLeft ); 6427a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 6436e142f54Sdrh Token *p = &pExpr->pLeft->token; 6446e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 6456e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 64699fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 64799fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 6486e142f54Sdrh sqliteFree(z); 6496e142f54Sdrh break; 6506e142f54Sdrh } 6511ccde15dSdrh /* Fall through into TK_NOT */ 6526e142f54Sdrh } 653bf4133cbSdrh case TK_BITNOT: 6546e142f54Sdrh case TK_NOT: { 655cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 65699fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 657cce7d176Sdrh break; 658cce7d176Sdrh } 659cce7d176Sdrh case TK_ISNULL: 660cce7d176Sdrh case TK_NOTNULL: { 661cce7d176Sdrh int dest; 66299fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 663cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 664cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 66599fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 66699fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 667cce7d176Sdrh break; 668cce7d176Sdrh } 6692282792aSdrh case TK_AGG_FUNCTION: { 67099fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 671967e8b73Sdrh if( pExpr->iColumn==FN_Avg ){ 6722282792aSdrh assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); 67399fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount); 67499fcd718Sdrh sqliteVdbeAddOp(v, OP_Divide, 0, 0); 6752282792aSdrh } 6762282792aSdrh break; 6772282792aSdrh } 678cce7d176Sdrh case TK_FUNCTION: { 679967e8b73Sdrh int id = pExpr->iColumn; 680cce7d176Sdrh int op; 681cce7d176Sdrh int i; 682cce7d176Sdrh ExprList *pList = pExpr->pList; 6836ec2733bSdrh switch( id ){ 6846ec2733bSdrh case FN_Min: 6856ec2733bSdrh case FN_Max: { 686cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 687cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 688cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 689cce7d176Sdrh if( i>0 ){ 69099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 691cce7d176Sdrh } 692cce7d176Sdrh } 693cce7d176Sdrh break; 694cce7d176Sdrh } 695bf4133cbSdrh case FN_Abs: { 696bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 697bf4133cbSdrh sqliteVdbeAddOp(v, OP_AbsValue, 0, 0); 698bf4133cbSdrh break; 699bf4133cbSdrh } 700bf4133cbSdrh case FN_Round: { 701bf4133cbSdrh if( pList->nExpr==2 ){ 702bf4133cbSdrh sqliteExprCode(pParse, pList->a[1].pExpr); 703bf4133cbSdrh }else{ 704bf4133cbSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 705bf4133cbSdrh } 706bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 707bf4133cbSdrh sqliteVdbeAddOp(v, OP_Precision, 0, 0); 708bf4133cbSdrh break; 709bf4133cbSdrh } 7106ec2733bSdrh case FN_Length: { 7116ec2733bSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 71299fcd718Sdrh sqliteVdbeAddOp(v, OP_Strlen, 0, 0); 7136ec2733bSdrh break; 7146ec2733bSdrh } 7156ec2733bSdrh case FN_Substr: { 7166ec2733bSdrh for(i=0; i<pList->nExpr; i++){ 7176ec2733bSdrh sqliteExprCode(pParse, pList->a[i].pExpr); 7186ec2733bSdrh } 71999fcd718Sdrh sqliteVdbeAddOp(v, OP_Substr, 0, 0); 7206ec2733bSdrh break; 7216ec2733bSdrh } 7226ec2733bSdrh default: { 7236ec2733bSdrh /* Can't happen! */ 7246ec2733bSdrh break; 7256ec2733bSdrh } 7266ec2733bSdrh } 7276ec2733bSdrh break; 7286ec2733bSdrh } 72919a775c2Sdrh case TK_SELECT: { 73099fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 73119a775c2Sdrh break; 73219a775c2Sdrh } 733fef5208cSdrh case TK_IN: { 734fef5208cSdrh int addr; 73599fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 736fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 737fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 738fef5208cSdrh if( pExpr->pSelect ){ 73999fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2); 740fef5208cSdrh }else{ 74199fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2); 742fef5208cSdrh } 74399fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 744fef5208cSdrh break; 745fef5208cSdrh } 746fef5208cSdrh case TK_BETWEEN: { 747fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 74899fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 749fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 75099fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0); 751fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 752fef5208cSdrh break; 753fef5208cSdrh } 754a2e00042Sdrh case TK_AS: { 755a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 756a2e00042Sdrh break; 757a2e00042Sdrh } 758cce7d176Sdrh } 759cce7d176Sdrh return; 760cce7d176Sdrh } 761cce7d176Sdrh 762cce7d176Sdrh /* 763cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 764cce7d176Sdrh ** to the label "dest" if the expression is true but execution 765cce7d176Sdrh ** continues straight thru if the expression is false. 766cce7d176Sdrh */ 767cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 768cce7d176Sdrh Vdbe *v = pParse->pVdbe; 769cce7d176Sdrh int op = 0; 770daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 771cce7d176Sdrh switch( pExpr->op ){ 772cce7d176Sdrh case TK_LT: op = OP_Lt; break; 773cce7d176Sdrh case TK_LE: op = OP_Le; break; 774cce7d176Sdrh case TK_GT: op = OP_Gt; break; 775cce7d176Sdrh case TK_GE: op = OP_Ge; break; 776cce7d176Sdrh case TK_NE: op = OP_Ne; break; 777cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 778cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 779cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 780cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 781cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 782cce7d176Sdrh default: break; 783cce7d176Sdrh } 784cce7d176Sdrh switch( pExpr->op ){ 785cce7d176Sdrh case TK_AND: { 786cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 787cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 788cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 789cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 790cce7d176Sdrh break; 791cce7d176Sdrh } 792cce7d176Sdrh case TK_OR: { 793cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 794cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 795cce7d176Sdrh break; 796cce7d176Sdrh } 797cce7d176Sdrh case TK_NOT: { 798cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 799cce7d176Sdrh break; 800cce7d176Sdrh } 801cce7d176Sdrh case TK_LT: 802cce7d176Sdrh case TK_LE: 803cce7d176Sdrh case TK_GT: 804cce7d176Sdrh case TK_GE: 805cce7d176Sdrh case TK_NE: 806cce7d176Sdrh case TK_EQ: 807cce7d176Sdrh case TK_LIKE: 808cce7d176Sdrh case TK_GLOB: { 809cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 810cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 81199fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 812cce7d176Sdrh break; 813cce7d176Sdrh } 814cce7d176Sdrh case TK_ISNULL: 815cce7d176Sdrh case TK_NOTNULL: { 816cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 81799fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 818cce7d176Sdrh break; 819cce7d176Sdrh } 820fef5208cSdrh case TK_IN: { 821cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 822fef5208cSdrh if( pExpr->pSelect ){ 82399fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 824fef5208cSdrh }else{ 82599fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 826fef5208cSdrh } 827fef5208cSdrh break; 828fef5208cSdrh } 829fef5208cSdrh case TK_BETWEEN: { 830fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 831fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 83299fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 833fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 83499fcd718Sdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl); 835fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 83699fcd718Sdrh sqliteVdbeAddOp(v, OP_Le, 0, dest); 83799fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 83899fcd718Sdrh sqliteVdbeResolveLabel(v, lbl); 83999fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 840fef5208cSdrh break; 841fef5208cSdrh } 842cce7d176Sdrh default: { 843cce7d176Sdrh sqliteExprCode(pParse, pExpr); 84499fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 845cce7d176Sdrh break; 846cce7d176Sdrh } 847cce7d176Sdrh } 848cce7d176Sdrh } 849cce7d176Sdrh 850cce7d176Sdrh /* 85166b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 852cce7d176Sdrh ** to the label "dest" if the expression is false but execution 853cce7d176Sdrh ** continues straight thru if the expression is true. 854cce7d176Sdrh */ 855cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 856cce7d176Sdrh Vdbe *v = pParse->pVdbe; 857cce7d176Sdrh int op = 0; 858daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 859cce7d176Sdrh switch( pExpr->op ){ 860cce7d176Sdrh case TK_LT: op = OP_Ge; break; 861cce7d176Sdrh case TK_LE: op = OP_Gt; break; 862cce7d176Sdrh case TK_GT: op = OP_Le; break; 863cce7d176Sdrh case TK_GE: op = OP_Lt; break; 864cce7d176Sdrh case TK_NE: op = OP_Eq; break; 865cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 866cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 867cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 868cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 869cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 870cce7d176Sdrh default: break; 871cce7d176Sdrh } 872cce7d176Sdrh switch( pExpr->op ){ 873cce7d176Sdrh case TK_AND: { 874cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 875cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 876cce7d176Sdrh break; 877cce7d176Sdrh } 878cce7d176Sdrh case TK_OR: { 879cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 880cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 881cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 882cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 883cce7d176Sdrh break; 884cce7d176Sdrh } 885cce7d176Sdrh case TK_NOT: { 886cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 887cce7d176Sdrh break; 888cce7d176Sdrh } 889cce7d176Sdrh case TK_LT: 890cce7d176Sdrh case TK_LE: 891cce7d176Sdrh case TK_GT: 892cce7d176Sdrh case TK_GE: 893cce7d176Sdrh case TK_NE: 894cce7d176Sdrh case TK_EQ: { 895cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 896cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 89799fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 898cce7d176Sdrh break; 899cce7d176Sdrh } 900cce7d176Sdrh case TK_LIKE: 901cce7d176Sdrh case TK_GLOB: { 902cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 903cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 90499fcd718Sdrh sqliteVdbeAddOp(v, op, 1, dest); 905cce7d176Sdrh break; 906cce7d176Sdrh } 907cce7d176Sdrh case TK_ISNULL: 908cce7d176Sdrh case TK_NOTNULL: { 909cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 91099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 911cce7d176Sdrh break; 912cce7d176Sdrh } 913fef5208cSdrh case TK_IN: { 914cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 915fef5208cSdrh if( pExpr->pSelect ){ 91699fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 917fef5208cSdrh }else{ 91899fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 919fef5208cSdrh } 920fef5208cSdrh break; 921fef5208cSdrh } 922fef5208cSdrh case TK_BETWEEN: { 923fef5208cSdrh int addr; 924fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 92599fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 926fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 927fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 92899fcd718Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); 92999fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 93099fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 931fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 93299fcd718Sdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest); 933fef5208cSdrh break; 934fef5208cSdrh } 935cce7d176Sdrh default: { 936cce7d176Sdrh sqliteExprCode(pParse, pExpr); 93799fcd718Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0); 93899fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 939cce7d176Sdrh break; 940cce7d176Sdrh } 941cce7d176Sdrh } 942cce7d176Sdrh } 9432282792aSdrh 9442282792aSdrh /* 9452282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 9462282792aSdrh ** if they are identical and return FALSE if they differ in any way. 9472282792aSdrh */ 948d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 9492282792aSdrh int i; 9502282792aSdrh if( pA==0 ){ 9512282792aSdrh return pB==0; 9522282792aSdrh }else if( pB==0 ){ 9532282792aSdrh return 0; 9542282792aSdrh } 9552282792aSdrh if( pA->op!=pB->op ) return 0; 956d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 957d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 9582282792aSdrh if( pA->pList ){ 9592282792aSdrh if( pB->pList==0 ) return 0; 9602282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 9612282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 962d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 9632282792aSdrh return 0; 9642282792aSdrh } 9652282792aSdrh } 9662282792aSdrh }else if( pB->pList ){ 9672282792aSdrh return 0; 9682282792aSdrh } 9692282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 9702282792aSdrh if( pA->token.z ){ 9712282792aSdrh if( pB->token.z==0 ) return 0; 9722282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 9732282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 9742282792aSdrh } 9752282792aSdrh return 1; 9762282792aSdrh } 9772282792aSdrh 9782282792aSdrh /* 9792282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 9802282792aSdrh */ 9812282792aSdrh static int appendAggInfo(Parse *pParse){ 9822282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 9832282792aSdrh int amt = pParse->nAgg + 8; 9846d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 9856d4abfbeSdrh if( aAgg==0 ){ 9862282792aSdrh return -1; 9872282792aSdrh } 9886d4abfbeSdrh pParse->aAgg = aAgg; 9892282792aSdrh } 9902282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 9912282792aSdrh return pParse->nAgg++; 9922282792aSdrh } 9932282792aSdrh 9942282792aSdrh /* 9952282792aSdrh ** Analyze the given expression looking for aggregate functions and 9962282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 9972282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 9982282792aSdrh ** 9992282792aSdrh ** This routine should only be called after the expression has been 10002282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 10012282792aSdrh ** 10022282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 10032282792aSdrh ** the number of errors. 10042282792aSdrh */ 10052282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 10062282792aSdrh int i; 10072282792aSdrh AggExpr *aAgg; 10082282792aSdrh int nErr = 0; 10092282792aSdrh 10102282792aSdrh if( pExpr==0 ) return 0; 10112282792aSdrh switch( pExpr->op ){ 1012967e8b73Sdrh case TK_COLUMN: { 10132282792aSdrh aAgg = pParse->aAgg; 10142282792aSdrh for(i=0; i<pParse->nAgg; i++){ 10152282792aSdrh if( aAgg[i].isAgg ) continue; 10162282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1017967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 10182282792aSdrh break; 10192282792aSdrh } 10202282792aSdrh } 10212282792aSdrh if( i>=pParse->nAgg ){ 10222282792aSdrh i = appendAggInfo(pParse); 10232282792aSdrh if( i<0 ) return 1; 10242282792aSdrh pParse->aAgg[i].isAgg = 0; 10252282792aSdrh pParse->aAgg[i].pExpr = pExpr; 10262282792aSdrh } 1027aaf88729Sdrh pExpr->iAgg = i; 10282282792aSdrh break; 10292282792aSdrh } 10302282792aSdrh case TK_AGG_FUNCTION: { 1031967e8b73Sdrh if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){ 10322282792aSdrh if( pParse->iAggCount>=0 ){ 10332282792aSdrh i = pParse->iAggCount; 10342282792aSdrh }else{ 10352282792aSdrh i = appendAggInfo(pParse); 10362282792aSdrh if( i<0 ) return 1; 10372282792aSdrh pParse->aAgg[i].isAgg = 1; 10382282792aSdrh pParse->aAgg[i].pExpr = 0; 10392282792aSdrh pParse->iAggCount = i; 10402282792aSdrh } 1041967e8b73Sdrh if( pExpr->iColumn==FN_Count ){ 10422282792aSdrh pExpr->iAgg = i; 10432282792aSdrh break; 10442282792aSdrh } 10452282792aSdrh } 10462282792aSdrh aAgg = pParse->aAgg; 10472282792aSdrh for(i=0; i<pParse->nAgg; i++){ 10482282792aSdrh if( !aAgg[i].isAgg ) continue; 1049d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 10502282792aSdrh break; 10512282792aSdrh } 10522282792aSdrh } 10532282792aSdrh if( i>=pParse->nAgg ){ 10542282792aSdrh i = appendAggInfo(pParse); 10552282792aSdrh if( i<0 ) return 1; 10562282792aSdrh pParse->aAgg[i].isAgg = 1; 10572282792aSdrh pParse->aAgg[i].pExpr = pExpr; 10582282792aSdrh } 10592282792aSdrh pExpr->iAgg = i; 10602282792aSdrh break; 10612282792aSdrh } 10622282792aSdrh default: { 10632282792aSdrh if( pExpr->pLeft ){ 10642282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 10652282792aSdrh } 10662282792aSdrh if( nErr==0 && pExpr->pRight ){ 10672282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 10682282792aSdrh } 10692282792aSdrh if( nErr==0 && pExpr->pList ){ 10702282792aSdrh int n = pExpr->pList->nExpr; 10712282792aSdrh int i; 10722282792aSdrh for(i=0; nErr==0 && i<n; i++){ 10732282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 10742282792aSdrh } 10752282792aSdrh } 10762282792aSdrh break; 10772282792aSdrh } 10782282792aSdrh } 10792282792aSdrh return nErr; 10802282792aSdrh } 1081