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*461c281aSdrh ** $Id: expr.c,v 1.65 2002/05/30 02:35:12 drh Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 18cce7d176Sdrh 19a2e00042Sdrh 20a2e00042Sdrh /* 21a76b5dfcSdrh ** Construct a new expression node and return a pointer to it. Memory 22a76b5dfcSdrh ** for this node is obtained from sqliteMalloc(). The calling function 23a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed. 24a76b5dfcSdrh */ 25a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){ 26a76b5dfcSdrh Expr *pNew; 27a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 28a76b5dfcSdrh if( pNew==0 ){ 29a76b5dfcSdrh sqliteExprDelete(pLeft); 30a76b5dfcSdrh sqliteExprDelete(pRight); 31a76b5dfcSdrh return 0; 32a76b5dfcSdrh } 33a76b5dfcSdrh pNew->op = op; 34a76b5dfcSdrh pNew->pLeft = pLeft; 35a76b5dfcSdrh pNew->pRight = pRight; 36a76b5dfcSdrh if( pToken ){ 37a76b5dfcSdrh pNew->token = *pToken; 38a76b5dfcSdrh }else{ 39a76b5dfcSdrh pNew->token.z = 0; 40a76b5dfcSdrh pNew->token.n = 0; 41a76b5dfcSdrh } 42a76b5dfcSdrh if( pLeft && pRight ){ 43a76b5dfcSdrh sqliteExprSpan(pNew, &pLeft->span, &pRight->span); 44a76b5dfcSdrh }else{ 45a76b5dfcSdrh pNew->span = pNew->token; 46a76b5dfcSdrh } 47a76b5dfcSdrh return pNew; 48a76b5dfcSdrh } 49a76b5dfcSdrh 50a76b5dfcSdrh /* 51a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all 52a76b5dfcSdrh ** text between the two given tokens. 53a76b5dfcSdrh */ 54a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ 55a76b5dfcSdrh if( pExpr ){ 56a76b5dfcSdrh pExpr->span.z = pLeft->z; 57a76b5dfcSdrh pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z); 58a76b5dfcSdrh } 59a76b5dfcSdrh } 60a76b5dfcSdrh 61a76b5dfcSdrh /* 62a76b5dfcSdrh ** Construct a new expression node for a function with multiple 63a76b5dfcSdrh ** arguments. 64a76b5dfcSdrh */ 65a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){ 66a76b5dfcSdrh Expr *pNew; 67a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 68a76b5dfcSdrh if( pNew==0 ){ 69a76b5dfcSdrh sqliteExprListDelete(pList); 70a76b5dfcSdrh return 0; 71a76b5dfcSdrh } 72a76b5dfcSdrh pNew->op = TK_FUNCTION; 73a76b5dfcSdrh pNew->pList = pList; 74a76b5dfcSdrh if( pToken ){ 75a76b5dfcSdrh pNew->token = *pToken; 76a76b5dfcSdrh }else{ 77a76b5dfcSdrh pNew->token.z = 0; 78a76b5dfcSdrh pNew->token.n = 0; 79a76b5dfcSdrh } 80a76b5dfcSdrh return pNew; 81a76b5dfcSdrh } 82a76b5dfcSdrh 83a76b5dfcSdrh /* 84a2e00042Sdrh ** Recursively delete an expression tree. 85a2e00042Sdrh */ 86a2e00042Sdrh void sqliteExprDelete(Expr *p){ 87a2e00042Sdrh if( p==0 ) return; 88a2e00042Sdrh if( p->pLeft ) sqliteExprDelete(p->pLeft); 89a2e00042Sdrh if( p->pRight ) sqliteExprDelete(p->pRight); 90a2e00042Sdrh if( p->pList ) sqliteExprListDelete(p->pList); 91a2e00042Sdrh if( p->pSelect ) sqliteSelectDelete(p->pSelect); 92a2e00042Sdrh sqliteFree(p); 93a2e00042Sdrh } 94a2e00042Sdrh 95cce7d176Sdrh /* 96a76b5dfcSdrh ** The following group of functions are used to translate the string 97a76b5dfcSdrh ** pointers of tokens in expression from one buffer to another. 98a76b5dfcSdrh ** 99a76b5dfcSdrh ** Normally, the Expr.token.z and Expr.span.z fields point into the 100a76b5dfcSdrh ** original input buffer of an SQL statement. This is usually OK 101a76b5dfcSdrh ** since the SQL statement is executed and the expression is deleted 102a76b5dfcSdrh ** before the input buffer is freed. Making the tokens point to the 103a76b5dfcSdrh ** original input buffer saves many calls to malloc() and thus helps 104a76b5dfcSdrh ** the library to run faster. 105a76b5dfcSdrh ** 106a76b5dfcSdrh ** But sometimes we need an expression to persist past the time when 107a76b5dfcSdrh ** the input buffer is freed. (Example: The SELECT clause of a 108a76b5dfcSdrh ** CREATE VIEW statement contains expressions that must persist for 109a76b5dfcSdrh ** the life of the view.) When that happens we have to make a 110a76b5dfcSdrh ** persistent copy of the input buffer and translate the Expr.token.z 111a76b5dfcSdrh ** and Expr.span.z fields to point to the copy rather than the 112a2ed5601Sdrh ** original input buffer. The following group of routines handle that 113a76b5dfcSdrh ** translation. 114a76b5dfcSdrh ** 115a76b5dfcSdrh ** The "offset" parameter is the distance from the original input buffer 116a76b5dfcSdrh ** to the persistent copy. These routines recursively walk the entire 117a76b5dfcSdrh ** expression tree and shift all tokens by "offset" amount. 118a76b5dfcSdrh ** 119a76b5dfcSdrh ** The work of figuring out the appropriate "offset" and making the 120a76b5dfcSdrh ** presistent copy of the input buffer is done by the calling routine. 121a76b5dfcSdrh */ 122a76b5dfcSdrh void sqliteExprMoveStrings(Expr *p, int offset){ 123a76b5dfcSdrh if( p==0 ) return; 124a76b5dfcSdrh if( p->token.z ) p->token.z += offset; 125a76b5dfcSdrh if( p->span.z ) p->span.z += offset; 126a76b5dfcSdrh if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset); 127a76b5dfcSdrh if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset); 128a76b5dfcSdrh if( p->pList ) sqliteExprListMoveStrings(p->pList, offset); 129a76b5dfcSdrh if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset); 130a76b5dfcSdrh } 131a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){ 132a76b5dfcSdrh int i; 133a76b5dfcSdrh if( pList==0 ) return; 134a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 135a76b5dfcSdrh sqliteExprMoveStrings(pList->a[i].pExpr, offset); 136a76b5dfcSdrh } 137a76b5dfcSdrh } 138a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){ 139a76b5dfcSdrh if( pSelect==0 ) return; 140a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pEList, offset); 141a76b5dfcSdrh sqliteExprMoveStrings(pSelect->pWhere, offset); 142a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pGroupBy, offset); 143a76b5dfcSdrh sqliteExprMoveStrings(pSelect->pHaving, offset); 144a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pOrderBy, offset); 145a76b5dfcSdrh sqliteSelectMoveStrings(pSelect->pPrior, offset); 146a76b5dfcSdrh } 147a76b5dfcSdrh 148a76b5dfcSdrh /* 149ff78bd2fSdrh ** The following group of routines make deep copies of expressions, 150ff78bd2fSdrh ** expression lists, ID lists, and select statements. The copies can 151ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines) 152ff78bd2fSdrh ** without effecting the originals. 153ff78bd2fSdrh ** 154ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to 155ff78bd2fSdrh ** string space that is allocated separately from the expression tree 156ff78bd2fSdrh ** itself. These routines do NOT duplicate that string space. 157ff78bd2fSdrh ** 158ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(), 159ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded 160ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines. 161ff78bd2fSdrh ** 162ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated. 163ff78bd2fSdrh */ 164ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){ 165ff78bd2fSdrh Expr *pNew; 166ff78bd2fSdrh if( p==0 ) return 0; 167ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 168ff78bd2fSdrh if( pNew==0 ) return 0; 169ff78bd2fSdrh pNew->op = p->op; 170ff78bd2fSdrh pNew->pLeft = sqliteExprDup(p->pLeft); 171ff78bd2fSdrh pNew->pRight = sqliteExprDup(p->pRight); 172ff78bd2fSdrh pNew->pList = sqliteExprListDup(p->pList); 173832508b7Sdrh pNew->iTable = p->iTable; 174832508b7Sdrh pNew->iColumn = p->iColumn; 175832508b7Sdrh pNew->iAgg = p->iAgg; 176ff78bd2fSdrh pNew->token = p->token; 177ff78bd2fSdrh pNew->span = p->span; 178ff78bd2fSdrh pNew->pSelect = sqliteSelectDup(p->pSelect); 179ff78bd2fSdrh return pNew; 180ff78bd2fSdrh } 181ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){ 182ff78bd2fSdrh ExprList *pNew; 183ff78bd2fSdrh int i; 184ff78bd2fSdrh if( p==0 ) return 0; 185ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 186ff78bd2fSdrh if( pNew==0 ) return 0; 187ff78bd2fSdrh pNew->nExpr = p->nExpr; 188ff78bd2fSdrh pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); 189e4697f5eSdrh if( pNew->a==0 ) return 0; 190ff78bd2fSdrh for(i=0; i<p->nExpr; i++){ 191ff78bd2fSdrh pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr); 192ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 193ff78bd2fSdrh pNew->a[i].sortOrder = p->a[i].sortOrder; 194ff78bd2fSdrh pNew->a[i].isAgg = p->a[i].isAgg; 195ff78bd2fSdrh pNew->a[i].done = 0; 196ff78bd2fSdrh } 197ff78bd2fSdrh return pNew; 198ff78bd2fSdrh } 199ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){ 200ad3cab52Sdrh SrcList *pNew; 201ad3cab52Sdrh int i; 202ad3cab52Sdrh if( p==0 ) return 0; 203ad3cab52Sdrh pNew = sqliteMalloc( sizeof(*pNew) ); 204ad3cab52Sdrh if( pNew==0 ) return 0; 205ad3cab52Sdrh pNew->nSrc = p->nSrc; 206ad3cab52Sdrh pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) ); 207ad3cab52Sdrh if( pNew->a==0 ) return 0; 208ad3cab52Sdrh for(i=0; i<p->nSrc; i++){ 209ad3cab52Sdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 210ad3cab52Sdrh pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias); 211ad3cab52Sdrh pNew->a[i].jointype = p->a[i].jointype; 212ad3cab52Sdrh pNew->a[i].pTab = 0; 213ad3cab52Sdrh pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect); 214ad3cab52Sdrh pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn); 215ad3cab52Sdrh pNew->a[i].pUsing = sqliteIdListDup(p->a[i].pUsing); 216ad3cab52Sdrh } 217ad3cab52Sdrh return pNew; 218ad3cab52Sdrh } 219ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){ 220ff78bd2fSdrh IdList *pNew; 221ff78bd2fSdrh int i; 222ff78bd2fSdrh if( p==0 ) return 0; 223ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 224ff78bd2fSdrh if( pNew==0 ) return 0; 225ff78bd2fSdrh pNew->nId = p->nId; 226ff78bd2fSdrh pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) ); 227e4697f5eSdrh if( pNew->a==0 ) return 0; 228ff78bd2fSdrh for(i=0; i<p->nId; i++){ 229ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 230ff78bd2fSdrh pNew->a[i].idx = p->a[i].idx; 231ff78bd2fSdrh } 232ff78bd2fSdrh return pNew; 233ff78bd2fSdrh } 234ff78bd2fSdrh Select *sqliteSelectDup(Select *p){ 235ff78bd2fSdrh Select *pNew; 236ff78bd2fSdrh if( p==0 ) return 0; 237ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 238ff78bd2fSdrh if( pNew==0 ) return 0; 239ff78bd2fSdrh pNew->isDistinct = p->isDistinct; 240ff78bd2fSdrh pNew->pEList = sqliteExprListDup(p->pEList); 241ad3cab52Sdrh pNew->pSrc = sqliteSrcListDup(p->pSrc); 242ff78bd2fSdrh pNew->pWhere = sqliteExprDup(p->pWhere); 243ff78bd2fSdrh pNew->pGroupBy = sqliteExprListDup(p->pGroupBy); 244ff78bd2fSdrh pNew->pHaving = sqliteExprDup(p->pHaving); 245ff78bd2fSdrh pNew->pOrderBy = sqliteExprListDup(p->pOrderBy); 246ff78bd2fSdrh pNew->op = p->op; 247ff78bd2fSdrh pNew->pPrior = sqliteSelectDup(p->pPrior); 248ff78bd2fSdrh pNew->nLimit = p->nLimit; 249ff78bd2fSdrh pNew->nOffset = p->nOffset; 250ff78bd2fSdrh pNew->zSelect = 0; 251ff78bd2fSdrh return pNew; 252ff78bd2fSdrh } 253ff78bd2fSdrh 254ff78bd2fSdrh 255ff78bd2fSdrh /* 256a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 257a76b5dfcSdrh ** initially NULL, then create a new expression list. 258a76b5dfcSdrh */ 259a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 260a76b5dfcSdrh int i; 261a76b5dfcSdrh if( pList==0 ){ 262a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 263a76b5dfcSdrh if( pList==0 ){ 264a76b5dfcSdrh sqliteExprDelete(pExpr); 265a76b5dfcSdrh return 0; 266a76b5dfcSdrh } 267a76b5dfcSdrh } 268a76b5dfcSdrh if( (pList->nExpr & 7)==0 ){ 269a76b5dfcSdrh int n = pList->nExpr + 8; 270a76b5dfcSdrh struct ExprList_item *a; 271a76b5dfcSdrh a = sqliteRealloc(pList->a, n*sizeof(pList->a[0])); 272a76b5dfcSdrh if( a==0 ){ 273a76b5dfcSdrh sqliteExprDelete(pExpr); 274a76b5dfcSdrh return pList; 275a76b5dfcSdrh } 276a76b5dfcSdrh pList->a = a; 277a76b5dfcSdrh } 278a76b5dfcSdrh if( pExpr || pName ){ 279a76b5dfcSdrh i = pList->nExpr++; 280a76b5dfcSdrh pList->a[i].pExpr = pExpr; 281a76b5dfcSdrh pList->a[i].zName = 0; 282a76b5dfcSdrh if( pName ){ 283a76b5dfcSdrh sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0); 284a76b5dfcSdrh sqliteDequote(pList->a[i].zName); 285a76b5dfcSdrh } 286a76b5dfcSdrh } 287a76b5dfcSdrh return pList; 288a76b5dfcSdrh } 289a76b5dfcSdrh 290a76b5dfcSdrh /* 291a76b5dfcSdrh ** Delete an entire expression list. 292a76b5dfcSdrh */ 293a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){ 294a76b5dfcSdrh int i; 295a76b5dfcSdrh if( pList==0 ) return; 296a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 297a76b5dfcSdrh sqliteExprDelete(pList->a[i].pExpr); 298a76b5dfcSdrh sqliteFree(pList->a[i].zName); 299a76b5dfcSdrh } 300a76b5dfcSdrh sqliteFree(pList->a); 301a76b5dfcSdrh sqliteFree(pList); 302a76b5dfcSdrh } 303a76b5dfcSdrh 304a76b5dfcSdrh /* 305fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 306fef5208cSdrh ** and 0 if it involves variables. 3072398937bSdrh ** 3082398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc") 3092398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is 3102398937bSdrh ** a constant. 311fef5208cSdrh */ 3129208643dSdrh int sqliteExprIsConstant(Expr *p){ 313fef5208cSdrh switch( p->op ){ 314fef5208cSdrh case TK_ID: 315967e8b73Sdrh case TK_COLUMN: 316fef5208cSdrh case TK_DOT: 317fef5208cSdrh return 0; 3182398937bSdrh case TK_STRING: 3192398937bSdrh return p->token.z[0]=='\''; 3209208643dSdrh case TK_INTEGER: 3219208643dSdrh case TK_FLOAT: 3229208643dSdrh return 1; 323fef5208cSdrh default: { 3249208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 3259208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 326fef5208cSdrh if( p->pList ){ 327fef5208cSdrh int i; 328fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 3299208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 330fef5208cSdrh } 331fef5208cSdrh } 3329208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 333fef5208cSdrh } 334fef5208cSdrh } 3359208643dSdrh return 0; 336fef5208cSdrh } 337fef5208cSdrh 338fef5208cSdrh /* 339c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 340c4a3c779Sdrh */ 341c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 342c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 343c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 344c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 345c4a3c779Sdrh return 0; 346c4a3c779Sdrh } 347c4a3c779Sdrh 348c4a3c779Sdrh /* 349cce7d176Sdrh ** This routine walks an expression tree and resolves references to 350967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 351aacc543eSdrh ** index to the table in the table list and a column offset. The 352aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 353aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 354832508b7Sdrh ** plus the "base" value. The base value will ultimately become the 355aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 356aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 357aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 358aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 359aacc543eSdrh ** alias for ROWID. 36019a775c2Sdrh ** 361fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 362fef5208cSdrh ** forms: 363fef5208cSdrh ** 364fef5208cSdrh ** expr IN (exprlist) 365fef5208cSdrh ** and 366fef5208cSdrh ** expr IN (SELECT ...) 367fef5208cSdrh ** 368fef5208cSdrh ** The first form is handled by creating a set holding the list 369fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 370fef5208cSdrh ** a temporary table. 371fef5208cSdrh ** 372fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 37319a775c2Sdrh ** If it finds any, it generates code to write the value of that select 37419a775c2Sdrh ** into a memory cell. 375cce7d176Sdrh ** 376967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 377cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 378cce7d176Sdrh */ 379a2e00042Sdrh int sqliteExprResolveIds( 380a2e00042Sdrh Parse *pParse, /* The parser context */ 381832508b7Sdrh int base, /* VDBE cursor number for first entry in pTabList */ 382ad3cab52Sdrh SrcList *pTabList, /* List of tables used to resolve column names */ 383a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 384a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 385a2e00042Sdrh ){ 386daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 387ad3cab52Sdrh assert( base+pTabList->nSrc<=pParse->nTab ); 388cce7d176Sdrh switch( pExpr->op ){ 3892398937bSdrh /* Double-quoted strings (ex: "abc") are used as identifiers if 3902398937bSdrh ** possible. Otherwise they remain as strings. Single-quoted 3912398937bSdrh ** strings (ex: 'abc') are always string literals. 3922398937bSdrh */ 3932398937bSdrh case TK_STRING: { 3942398937bSdrh if( pExpr->token.z[0]=='\'' ) break; 3952398937bSdrh /* Fall thru into the TK_ID case if this is a double-quoted string */ 3962398937bSdrh } 397a2e00042Sdrh /* A lone identifier. Try and match it as follows: 398a2e00042Sdrh ** 399a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 400a2e00042Sdrh ** 401a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 402a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 403a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 404a2e00042Sdrh ** 405a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 406a2e00042Sdrh */ 407cce7d176Sdrh case TK_ID: { 408cce7d176Sdrh int cnt = 0; /* Number of matches */ 409cce7d176Sdrh int i; /* Loop counter */ 410a76b5dfcSdrh char *z; 411a76b5dfcSdrh assert( pExpr->token.z ); 412a76b5dfcSdrh z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 4132f4392ffSdrh sqliteDequote(z); 414daffd0e5Sdrh if( z==0 ) return 1; 415ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 416cce7d176Sdrh int j; 417cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 418cce7d176Sdrh if( pTab==0 ) continue; 419417be79cSdrh assert( pTab->nCol>0 ); 420cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 4217020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 422cce7d176Sdrh cnt++; 423832508b7Sdrh pExpr->iTable = i + base; 4244a32431cSdrh if( j==pTab->iPKey ){ 4254a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 4264a32431cSdrh pExpr->iColumn = -1; 4274a32431cSdrh }else{ 428967e8b73Sdrh pExpr->iColumn = j; 429cce7d176Sdrh } 430a2e00042Sdrh pExpr->op = TK_COLUMN; 431a2e00042Sdrh } 432a2e00042Sdrh } 433a2e00042Sdrh } 434a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 435a2e00042Sdrh int j; 436a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 437a2e00042Sdrh char *zAs = pEList->a[j].zName; 438a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 439a2e00042Sdrh cnt++; 440a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 441a2e00042Sdrh pExpr->op = TK_AS; 442a2e00042Sdrh pExpr->iColumn = j; 44375148a27Sdrh pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr); 444cce7d176Sdrh } 445cce7d176Sdrh } 4464a32431cSdrh } 447c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 448c4a3c779Sdrh pExpr->iColumn = -1; 449832508b7Sdrh pExpr->iTable = base; 450ad3cab52Sdrh cnt = 1 + (pTabList->nSrc>1); 451a2e00042Sdrh pExpr->op = TK_COLUMN; 452c4a3c779Sdrh } 453cce7d176Sdrh sqliteFree(z); 4542398937bSdrh if( cnt==0 && pExpr->token.z[0]!='"' ){ 455967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 456cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 457cce7d176Sdrh pParse->nErr++; 458cce7d176Sdrh return 1; 459cce7d176Sdrh }else if( cnt>1 ){ 460967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 461cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 462cce7d176Sdrh pParse->nErr++; 463cce7d176Sdrh return 1; 464cce7d176Sdrh } 465cce7d176Sdrh break; 466cce7d176Sdrh } 467cce7d176Sdrh 468967e8b73Sdrh /* A table name and column name: ID.ID */ 469cce7d176Sdrh case TK_DOT: { 470cce7d176Sdrh int cnt = 0; /* Number of matches */ 471c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 472cce7d176Sdrh int i; /* Loop counter */ 473cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 474cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 475cce7d176Sdrh 476cce7d176Sdrh pLeft = pExpr->pLeft; 477cce7d176Sdrh pRight = pExpr->pRight; 478a76b5dfcSdrh assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); 479a76b5dfcSdrh assert( pRight && pRight->op==TK_ID && pRight->token.z ); 4806e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 4816e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 482daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 483daffd0e5Sdrh sqliteFree(zLeft); 484daffd0e5Sdrh sqliteFree(zRight); 485daffd0e5Sdrh return 1; 486daffd0e5Sdrh } 48787c40e88Sdrh sqliteDequote(zLeft); 48887c40e88Sdrh sqliteDequote(zRight); 489c4a3c779Sdrh pExpr->iTable = -1; 490ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 491cce7d176Sdrh int j; 492cce7d176Sdrh char *zTab; 493cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 494cce7d176Sdrh if( pTab==0 ) continue; 495417be79cSdrh assert( pTab->nCol>0 ); 496cce7d176Sdrh if( pTabList->a[i].zAlias ){ 497cce7d176Sdrh zTab = pTabList->a[i].zAlias; 498cce7d176Sdrh }else{ 499cce7d176Sdrh zTab = pTab->zName; 500cce7d176Sdrh } 501094b2bbfSdrh if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; 502832508b7Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + base; 503cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 5047020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 505cce7d176Sdrh cnt++; 506832508b7Sdrh pExpr->iTable = i + base; 5074a32431cSdrh if( j==pTab->iPKey ){ 5084a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 5094a32431cSdrh pExpr->iColumn = -1; 5104a32431cSdrh }else{ 511967e8b73Sdrh pExpr->iColumn = j; 512cce7d176Sdrh } 513cce7d176Sdrh } 514cce7d176Sdrh } 5154a32431cSdrh } 516c3f9bad2Sdanielk1977 517c3f9bad2Sdanielk1977 /* If we have not already resolved this *.* expression, then maybe 518c3f9bad2Sdanielk1977 * it is a new.* or old.* trigger argument reference */ 519c3f9bad2Sdanielk1977 if( cnt == 0 && pParse->trigStack != 0 ){ 520f29ce559Sdanielk1977 TriggerStack *pTriggerStack = pParse->trigStack; 521c3f9bad2Sdanielk1977 int t = 0; 522f29ce559Sdanielk1977 if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){ 523f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->newIdx; 524c3f9bad2Sdanielk1977 cntTab++; 525c3f9bad2Sdanielk1977 t = 1; 526c3f9bad2Sdanielk1977 } 527f29ce559Sdanielk1977 if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){ 528f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->oldIdx; 529c3f9bad2Sdanielk1977 cntTab++; 530c3f9bad2Sdanielk1977 t = 1; 531c3f9bad2Sdanielk1977 } 532c3f9bad2Sdanielk1977 533f29ce559Sdanielk1977 if( t ){ 534f29ce559Sdanielk1977 int j; 535f29ce559Sdanielk1977 for(j=0; j < pTriggerStack->pTab->nCol; j++) { 536f29ce559Sdanielk1977 if( sqliteStrICmp(pTriggerStack->pTab->aCol[j].zName, zRight)==0 ){ 537c3f9bad2Sdanielk1977 cnt++; 538c3f9bad2Sdanielk1977 pExpr->iColumn = j; 539c3f9bad2Sdanielk1977 } 540c3f9bad2Sdanielk1977 } 541c3f9bad2Sdanielk1977 } 542f29ce559Sdanielk1977 } 543c3f9bad2Sdanielk1977 544c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 545c4a3c779Sdrh cnt = 1; 546c4a3c779Sdrh pExpr->iColumn = -1; 547c4a3c779Sdrh } 548cce7d176Sdrh sqliteFree(zLeft); 549cce7d176Sdrh sqliteFree(zRight); 550cce7d176Sdrh if( cnt==0 ){ 551967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 552cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 553cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 554cce7d176Sdrh pParse->nErr++; 555cce7d176Sdrh return 1; 556cce7d176Sdrh }else if( cnt>1 ){ 557967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 558cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 559cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 560cce7d176Sdrh pParse->nErr++; 561cce7d176Sdrh return 1; 562cce7d176Sdrh } 563cce7d176Sdrh sqliteExprDelete(pLeft); 564cce7d176Sdrh pExpr->pLeft = 0; 565cce7d176Sdrh sqliteExprDelete(pRight); 566cce7d176Sdrh pExpr->pRight = 0; 567967e8b73Sdrh pExpr->op = TK_COLUMN; 568cce7d176Sdrh break; 569cce7d176Sdrh } 570cce7d176Sdrh 571fef5208cSdrh case TK_IN: { 572d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 573fef5208cSdrh if( v==0 ) return 1; 574832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 575cfab11bcSdrh return 1; 576cfab11bcSdrh } 577fef5208cSdrh if( pExpr->pSelect ){ 578fef5208cSdrh /* Case 1: expr IN (SELECT ...) 579fef5208cSdrh ** 580fef5208cSdrh ** Generate code to write the results of the select into a temporary 5814794b980Sdrh ** table. The cursor number of the temporary table has already 5824794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 583fef5208cSdrh */ 584832508b7Sdrh pExpr->iTable = pParse->nTab++; 585c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 586832508b7Sdrh sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0); 587fef5208cSdrh }else if( pExpr->pList ){ 588fef5208cSdrh /* Case 2: expr IN (exprlist) 589fef5208cSdrh ** 590fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 591fef5208cSdrh ** in iTable. 592fef5208cSdrh */ 593fef5208cSdrh int i, iSet; 594fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 595fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 5969208643dSdrh if( !sqliteExprIsConstant(pE2) ){ 597fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 598fef5208cSdrh "right-hand side of IN operator must be constant", 0); 599fef5208cSdrh pParse->nErr++; 600fef5208cSdrh return 1; 601fef5208cSdrh } 6024794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 6034794b980Sdrh return 1; 6044794b980Sdrh } 605fef5208cSdrh } 606fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 607fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 608fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 609fef5208cSdrh switch( pE2->op ){ 610fef5208cSdrh case TK_FLOAT: 611fef5208cSdrh case TK_INTEGER: 612fef5208cSdrh case TK_STRING: { 61399fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 614a76b5dfcSdrh assert( pE2->token.z ); 615fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 616fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 617fef5208cSdrh break; 618fef5208cSdrh } 619fef5208cSdrh default: { 620fef5208cSdrh sqliteExprCode(pParse, pE2); 62199fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 622fef5208cSdrh break; 623fef5208cSdrh } 624fef5208cSdrh } 625fef5208cSdrh } 626fef5208cSdrh } 627cfab11bcSdrh break; 628fef5208cSdrh } 629fef5208cSdrh 63019a775c2Sdrh case TK_SELECT: { 631fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 632fef5208cSdrh ** value of this select in a memory cell and record the number 633967e8b73Sdrh ** of the memory cell in iColumn. 634fef5208cSdrh */ 635967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 636832508b7Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){ 63719a775c2Sdrh return 1; 63819a775c2Sdrh } 63919a775c2Sdrh break; 64019a775c2Sdrh } 64119a775c2Sdrh 642cce7d176Sdrh /* For all else, just recursively walk the tree */ 643cce7d176Sdrh default: { 644cce7d176Sdrh if( pExpr->pLeft 645832508b7Sdrh && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 646cce7d176Sdrh return 1; 647cce7d176Sdrh } 648cce7d176Sdrh if( pExpr->pRight 649832508b7Sdrh && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){ 650cce7d176Sdrh return 1; 651cce7d176Sdrh } 652cce7d176Sdrh if( pExpr->pList ){ 653cce7d176Sdrh int i; 654cce7d176Sdrh ExprList *pList = pExpr->pList; 655cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 656832508b7Sdrh Expr *pArg = pList->a[i].pExpr; 657832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){ 658cce7d176Sdrh return 1; 659cce7d176Sdrh } 660cce7d176Sdrh } 661cce7d176Sdrh } 662cce7d176Sdrh } 663cce7d176Sdrh } 664cce7d176Sdrh return 0; 665cce7d176Sdrh } 666cce7d176Sdrh 667cce7d176Sdrh /* 668cce7d176Sdrh ** Error check the functions in an expression. Make sure all 669cce7d176Sdrh ** function names are recognized and all functions have the correct 670cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 671cce7d176Sdrh ** if anything is amiss. Return the number of errors. 672cce7d176Sdrh ** 673cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 674cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 675cce7d176Sdrh */ 676cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 677cce7d176Sdrh int nErr = 0; 678cce7d176Sdrh if( pExpr==0 ) return 0; 679cce7d176Sdrh switch( pExpr->op ){ 680cce7d176Sdrh case TK_FUNCTION: { 681cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 682cce7d176Sdrh int no_such_func = 0; 6838e0a2f90Sdrh int wrong_num_args = 0; 684cce7d176Sdrh int is_agg = 0; 685cce7d176Sdrh int i; 6860bce8354Sdrh FuncDef *pDef; 6870bce8354Sdrh 68889425d5eSdrh pDef = sqliteFindFunction(pParse->db, 68989425d5eSdrh pExpr->token.z, pExpr->token.n, n, 0); 6900bce8354Sdrh if( pDef==0 ){ 6910bce8354Sdrh pDef = sqliteFindFunction(pParse->db, 6928e0a2f90Sdrh pExpr->token.z, pExpr->token.n, -1, 0); 6930bce8354Sdrh if( pDef==0 ){ 694cce7d176Sdrh no_such_func = 1; 6958e0a2f90Sdrh }else{ 6968e0a2f90Sdrh wrong_num_args = 1; 6978e0a2f90Sdrh } 6988e0a2f90Sdrh }else{ 6990bce8354Sdrh is_agg = pDef->xFunc==0; 700cce7d176Sdrh } 7018e0a2f90Sdrh if( is_agg && !allowAgg ){ 7028e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1, 7038e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 7048e0a2f90Sdrh pParse->nErr++; 7058e0a2f90Sdrh nErr++; 7068e0a2f90Sdrh is_agg = 0; 7078e0a2f90Sdrh }else if( no_such_func ){ 708cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 709cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 710cce7d176Sdrh pParse->nErr++; 711cce7d176Sdrh nErr++; 7128e0a2f90Sdrh }else if( wrong_num_args ){ 7138e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, 7148e0a2f90Sdrh "wrong number of arguments to function ",-1, 7158e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 7168e0a2f90Sdrh pParse->nErr++; 7178e0a2f90Sdrh nErr++; 718cce7d176Sdrh } 7192282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 720cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 721cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 7224cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 7234cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 724cce7d176Sdrh } 725cce7d176Sdrh } 726cce7d176Sdrh default: { 727cce7d176Sdrh if( pExpr->pLeft ){ 7282282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 729cce7d176Sdrh } 730cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 7312282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 732cce7d176Sdrh } 733fef5208cSdrh if( nErr==0 && pExpr->pList ){ 734fef5208cSdrh int n = pExpr->pList->nExpr; 735fef5208cSdrh int i; 736fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 7372282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 7382282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 739fef5208cSdrh } 740fef5208cSdrh } 741cce7d176Sdrh break; 742cce7d176Sdrh } 743cce7d176Sdrh } 744cce7d176Sdrh return nErr; 745cce7d176Sdrh } 746cce7d176Sdrh 747cce7d176Sdrh /* 748cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 7491ccde15dSdrh ** expression and leave the result on the top of stack. 750cce7d176Sdrh */ 751cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 752cce7d176Sdrh Vdbe *v = pParse->pVdbe; 753cce7d176Sdrh int op; 754daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 755cce7d176Sdrh switch( pExpr->op ){ 756cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 757cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 758cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 759cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 760cce7d176Sdrh case TK_AND: op = OP_And; break; 761cce7d176Sdrh case TK_OR: op = OP_Or; break; 762cce7d176Sdrh case TK_LT: op = OP_Lt; break; 763cce7d176Sdrh case TK_LE: op = OP_Le; break; 764cce7d176Sdrh case TK_GT: op = OP_Gt; break; 765cce7d176Sdrh case TK_GE: op = OP_Ge; break; 766cce7d176Sdrh case TK_NE: op = OP_Ne; break; 767cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 768cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 769cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 770cce7d176Sdrh case TK_NOT: op = OP_Not; break; 771cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 772bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 773bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 774bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 775bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 776bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 777bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 778cce7d176Sdrh default: break; 779cce7d176Sdrh } 780cce7d176Sdrh switch( pExpr->op ){ 781967e8b73Sdrh case TK_COLUMN: { 7822282792aSdrh if( pParse->useAgg ){ 78399fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 784c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 78599fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 786c4a3c779Sdrh }else{ 78799fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 7882282792aSdrh } 789cce7d176Sdrh break; 790cce7d176Sdrh } 791cce7d176Sdrh case TK_INTEGER: { 792e6840900Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0); 793e6840900Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 794e6840900Sdrh break; 795e6840900Sdrh } 796e6840900Sdrh case TK_FLOAT: { 7977a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 798a76b5dfcSdrh assert( pExpr->token.z ); 7997a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 800cce7d176Sdrh break; 801cce7d176Sdrh } 802cce7d176Sdrh case TK_STRING: { 80399fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 804a76b5dfcSdrh assert( pExpr->token.z ); 805cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 806cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 807cce7d176Sdrh break; 808cce7d176Sdrh } 809cce7d176Sdrh case TK_NULL: { 81099fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 811cce7d176Sdrh break; 812cce7d176Sdrh } 813cce7d176Sdrh case TK_AND: 814cce7d176Sdrh case TK_OR: 815cce7d176Sdrh case TK_PLUS: 816cce7d176Sdrh case TK_STAR: 817cce7d176Sdrh case TK_MINUS: 818bf4133cbSdrh case TK_REM: 819bf4133cbSdrh case TK_BITAND: 820bf4133cbSdrh case TK_BITOR: 821f5905aa7Sdrh case TK_SLASH: 822f5905aa7Sdrh case TK_LT: 823f5905aa7Sdrh case TK_LE: 824f5905aa7Sdrh case TK_GT: 825f5905aa7Sdrh case TK_GE: 826f5905aa7Sdrh case TK_NE: 827f5905aa7Sdrh case TK_EQ: { 828cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 829cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 83099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 831cce7d176Sdrh break; 832cce7d176Sdrh } 833bf4133cbSdrh case TK_LSHIFT: 834bf4133cbSdrh case TK_RSHIFT: { 835bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 836bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 837bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 838bf4133cbSdrh break; 839bf4133cbSdrh } 8400040077dSdrh case TK_CONCAT: { 8410040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 8420040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 84399fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 8440040077dSdrh break; 8450040077dSdrh } 846cce7d176Sdrh case TK_UMINUS: { 8476e142f54Sdrh assert( pExpr->pLeft ); 8487a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 8496e142f54Sdrh Token *p = &pExpr->pLeft->token; 8506e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 8516e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 852e6840900Sdrh if( pExpr->pLeft->op==TK_INTEGER ){ 853e6840900Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0); 854e6840900Sdrh }else{ 85599fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 856e6840900Sdrh } 85799fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 8586e142f54Sdrh sqliteFree(z); 8596e142f54Sdrh break; 8606e142f54Sdrh } 8611ccde15dSdrh /* Fall through into TK_NOT */ 8626e142f54Sdrh } 863bf4133cbSdrh case TK_BITNOT: 8646e142f54Sdrh case TK_NOT: { 865cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 86699fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 867cce7d176Sdrh break; 868cce7d176Sdrh } 869cce7d176Sdrh case TK_ISNULL: 870cce7d176Sdrh case TK_NOTNULL: { 871cce7d176Sdrh int dest; 87299fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 873cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 874cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 875f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 87699fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 877cce7d176Sdrh break; 878cce7d176Sdrh } 8792282792aSdrh case TK_AGG_FUNCTION: { 88099fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 8812282792aSdrh break; 8822282792aSdrh } 883cce7d176Sdrh case TK_FUNCTION: { 884cce7d176Sdrh int i; 885cce7d176Sdrh ExprList *pList = pExpr->pList; 88689425d5eSdrh int nExpr = pList ? pList->nExpr : 0; 8870bce8354Sdrh FuncDef *pDef; 8880bce8354Sdrh pDef = sqliteFindFunction(pParse->db, 88989425d5eSdrh pExpr->token.z, pExpr->token.n, nExpr, 0); 8900bce8354Sdrh assert( pDef!=0 ); 89189425d5eSdrh for(i=0; i<nExpr; i++){ 8928e0a2f90Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 8938e0a2f90Sdrh } 89489425d5eSdrh sqliteVdbeAddOp(v, OP_Function, nExpr, 0); 8950bce8354Sdrh sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER); 8966ec2733bSdrh break; 8976ec2733bSdrh } 89819a775c2Sdrh case TK_SELECT: { 89999fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 90019a775c2Sdrh break; 90119a775c2Sdrh } 902fef5208cSdrh case TK_IN: { 903fef5208cSdrh int addr; 90499fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 905fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 906fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 907f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4); 908f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 909f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 910f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, addr+6); 911fef5208cSdrh if( pExpr->pSelect ){ 912f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6); 913fef5208cSdrh }else{ 914f5905aa7Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6); 915fef5208cSdrh } 91699fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 917fef5208cSdrh break; 918fef5208cSdrh } 919fef5208cSdrh case TK_BETWEEN: { 920f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pLeft); 921f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 922f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 923f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, 0); 924f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pull, 1, 0); 925f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 926f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, 0, 0); 927f5905aa7Sdrh sqliteVdbeAddOp(v, OP_And, 0, 0); 928fef5208cSdrh break; 929fef5208cSdrh } 930a2e00042Sdrh case TK_AS: { 931a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 932a2e00042Sdrh break; 933a2e00042Sdrh } 93417a7f8ddSdrh case TK_CASE: { 93517a7f8ddSdrh int expr_end_label; 936f5905aa7Sdrh int null_result_label; 937f5905aa7Sdrh int jumpInst; 938*461c281aSdrh int nullBypassInst; 939f5905aa7Sdrh int addr; 940f5905aa7Sdrh int nExpr; 94117a7f8ddSdrh int i; 94217a7f8ddSdrh 94317a7f8ddSdrh assert(pExpr->pList); 94417a7f8ddSdrh assert((pExpr->pList->nExpr % 2) == 0); 94517a7f8ddSdrh assert(pExpr->pList->nExpr > 0); 946f5905aa7Sdrh nExpr = pExpr->pList->nExpr; 947f5905aa7Sdrh expr_end_label = sqliteVdbeMakeLabel(v); 948f5905aa7Sdrh null_result_label = sqliteVdbeMakeLabel(v); 94917a7f8ddSdrh if( pExpr->pLeft ){ 95017a7f8ddSdrh sqliteExprCode(pParse, pExpr->pLeft); 951*461c281aSdrh nullBypassInst = sqliteVdbeAddOp(v, OP_IsNull, -1, 0); 952cce7d176Sdrh } 953f5905aa7Sdrh for(i=0; i<nExpr; i=i+2){ 95417a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i].pExpr); 955f5905aa7Sdrh sqliteVdbeAddOp(v, OP_IsNull, -1, null_result_label); 95617a7f8ddSdrh if( pExpr->pLeft ){ 957f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 1, 1); 958f5905aa7Sdrh jumpInst = sqliteVdbeAddOp(v, OP_Ne, 0, 0); 959f5905aa7Sdrh }else{ 960f5905aa7Sdrh jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 0, 0); 96117a7f8ddSdrh } 96217a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr); 963f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label); 964f5905aa7Sdrh if( i>=nExpr-2 ){ 965f5905aa7Sdrh sqliteVdbeResolveLabel(v, null_result_label); 966f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 967f5905aa7Sdrh if( pExpr->pRight!=0 ){ 968f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 969f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label); 97017a7f8ddSdrh } 971f5905aa7Sdrh } 972f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 973f5905aa7Sdrh sqliteVdbeChangeP2(v, jumpInst, addr); 97417a7f8ddSdrh } 97517a7f8ddSdrh if( pExpr->pRight ){ 97617a7f8ddSdrh sqliteExprCode(pParse, pExpr->pRight); 97717a7f8ddSdrh }else{ 978f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 97917a7f8ddSdrh } 980f5905aa7Sdrh sqliteVdbeResolveLabel(v, expr_end_label); 981f5905aa7Sdrh if( pExpr->pLeft ){ 982f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pull, 1, 0); 983f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 984*461c281aSdrh sqliteVdbeChangeP2(v, nullBypassInst, sqliteVdbeCurrentAddr(v)); 985f5905aa7Sdrh } 98617a7f8ddSdrh } 98717a7f8ddSdrh break; 98817a7f8ddSdrh } 989cce7d176Sdrh } 990cce7d176Sdrh 991cce7d176Sdrh /* 992cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 993cce7d176Sdrh ** to the label "dest" if the expression is true but execution 994cce7d176Sdrh ** continues straight thru if the expression is false. 995f5905aa7Sdrh ** 996f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then 997f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true. 998cce7d176Sdrh */ 999f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1000cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1001cce7d176Sdrh int op = 0; 1002daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1003cce7d176Sdrh switch( pExpr->op ){ 1004cce7d176Sdrh case TK_LT: op = OP_Lt; break; 1005cce7d176Sdrh case TK_LE: op = OP_Le; break; 1006cce7d176Sdrh case TK_GT: op = OP_Gt; break; 1007cce7d176Sdrh case TK_GE: op = OP_Ge; break; 1008cce7d176Sdrh case TK_NE: op = OP_Ne; break; 1009cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 1010cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 1011cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 1012cce7d176Sdrh default: break; 1013cce7d176Sdrh } 1014cce7d176Sdrh switch( pExpr->op ){ 1015cce7d176Sdrh case TK_AND: { 1016cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1017f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull); 1018f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1019cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1020cce7d176Sdrh break; 1021cce7d176Sdrh } 1022cce7d176Sdrh case TK_OR: { 1023f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1024f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1025cce7d176Sdrh break; 1026cce7d176Sdrh } 1027cce7d176Sdrh case TK_NOT: { 1028f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1029cce7d176Sdrh break; 1030cce7d176Sdrh } 1031cce7d176Sdrh case TK_LT: 1032cce7d176Sdrh case TK_LE: 1033cce7d176Sdrh case TK_GT: 1034cce7d176Sdrh case TK_GE: 1035cce7d176Sdrh case TK_NE: 10360ac65892Sdrh case TK_EQ: { 1037cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1038cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1039f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1040cce7d176Sdrh break; 1041cce7d176Sdrh } 1042cce7d176Sdrh case TK_ISNULL: 1043cce7d176Sdrh case TK_NOTNULL: { 1044cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1045f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1046cce7d176Sdrh break; 1047cce7d176Sdrh } 1048fef5208cSdrh case TK_IN: { 1049f5905aa7Sdrh int addr; 1050cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1051f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1052f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1053f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1054f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1055fef5208cSdrh if( pExpr->pSelect ){ 105699fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1057fef5208cSdrh }else{ 105899fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1059fef5208cSdrh } 1060fef5208cSdrh break; 1061fef5208cSdrh } 1062fef5208cSdrh case TK_BETWEEN: { 1063f5905aa7Sdrh int addr; 1064fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 106599fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1066fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1067f5905aa7Sdrh addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0); 1068fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1069f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest); 107099fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 1071f5905aa7Sdrh sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v)); 107299fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1073fef5208cSdrh break; 1074fef5208cSdrh } 1075cce7d176Sdrh default: { 1076cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1077f5905aa7Sdrh sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest); 1078cce7d176Sdrh break; 1079cce7d176Sdrh } 1080cce7d176Sdrh } 1081cce7d176Sdrh } 1082cce7d176Sdrh 1083cce7d176Sdrh /* 108466b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1085cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1086cce7d176Sdrh ** continues straight thru if the expression is true. 1087f5905aa7Sdrh ** 1088f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then 1089f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false. 1090cce7d176Sdrh */ 1091f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1092cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1093cce7d176Sdrh int op = 0; 1094daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1095cce7d176Sdrh switch( pExpr->op ){ 1096cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1097cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1098cce7d176Sdrh case TK_GT: op = OP_Le; break; 1099cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1100cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1101cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1102cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1103cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1104cce7d176Sdrh default: break; 1105cce7d176Sdrh } 1106cce7d176Sdrh switch( pExpr->op ){ 1107cce7d176Sdrh case TK_AND: { 1108f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1109f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1110cce7d176Sdrh break; 1111cce7d176Sdrh } 1112cce7d176Sdrh case TK_OR: { 1113cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1114f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull); 1115f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1116cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1117cce7d176Sdrh break; 1118cce7d176Sdrh } 1119cce7d176Sdrh case TK_NOT: { 1120f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1121cce7d176Sdrh break; 1122cce7d176Sdrh } 1123cce7d176Sdrh case TK_LT: 1124cce7d176Sdrh case TK_LE: 1125cce7d176Sdrh case TK_GT: 1126cce7d176Sdrh case TK_GE: 1127cce7d176Sdrh case TK_NE: 1128cce7d176Sdrh case TK_EQ: { 1129cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1130cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1131f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1132cce7d176Sdrh break; 1133cce7d176Sdrh } 1134cce7d176Sdrh case TK_ISNULL: 1135cce7d176Sdrh case TK_NOTNULL: { 1136cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1137f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1138cce7d176Sdrh break; 1139cce7d176Sdrh } 1140fef5208cSdrh case TK_IN: { 1141f5905aa7Sdrh int addr; 1142cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1143f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1144f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1145f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1146f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1147fef5208cSdrh if( pExpr->pSelect ){ 114899fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1149fef5208cSdrh }else{ 115099fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1151fef5208cSdrh } 1152fef5208cSdrh break; 1153fef5208cSdrh } 1154fef5208cSdrh case TK_BETWEEN: { 1155fef5208cSdrh int addr; 1156fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 115799fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1158fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1159fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1160f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3); 116199fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 116299fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 1163fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1164f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest); 1165fef5208cSdrh break; 1166fef5208cSdrh } 1167cce7d176Sdrh default: { 1168cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1169*461c281aSdrh sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest); 1170cce7d176Sdrh break; 1171cce7d176Sdrh } 1172cce7d176Sdrh } 1173cce7d176Sdrh } 11742282792aSdrh 11752282792aSdrh /* 11762282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 11772282792aSdrh ** if they are identical and return FALSE if they differ in any way. 11782282792aSdrh */ 1179d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 11802282792aSdrh int i; 11812282792aSdrh if( pA==0 ){ 11822282792aSdrh return pB==0; 11832282792aSdrh }else if( pB==0 ){ 11842282792aSdrh return 0; 11852282792aSdrh } 11862282792aSdrh if( pA->op!=pB->op ) return 0; 1187d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1188d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 11892282792aSdrh if( pA->pList ){ 11902282792aSdrh if( pB->pList==0 ) return 0; 11912282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 11922282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1193d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 11942282792aSdrh return 0; 11952282792aSdrh } 11962282792aSdrh } 11972282792aSdrh }else if( pB->pList ){ 11982282792aSdrh return 0; 11992282792aSdrh } 12002282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 12012282792aSdrh if( pA->token.z ){ 12022282792aSdrh if( pB->token.z==0 ) return 0; 12032282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 12042282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 12052282792aSdrh } 12062282792aSdrh return 1; 12072282792aSdrh } 12082282792aSdrh 12092282792aSdrh /* 12102282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 12112282792aSdrh */ 12122282792aSdrh static int appendAggInfo(Parse *pParse){ 12132282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 12142282792aSdrh int amt = pParse->nAgg + 8; 12156d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 12166d4abfbeSdrh if( aAgg==0 ){ 12172282792aSdrh return -1; 12182282792aSdrh } 12196d4abfbeSdrh pParse->aAgg = aAgg; 12202282792aSdrh } 12212282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 12222282792aSdrh return pParse->nAgg++; 12232282792aSdrh } 12242282792aSdrh 12252282792aSdrh /* 12262282792aSdrh ** Analyze the given expression looking for aggregate functions and 12272282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 12282282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 12292282792aSdrh ** 12302282792aSdrh ** This routine should only be called after the expression has been 12312282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 12322282792aSdrh ** 12332282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 12342282792aSdrh ** the number of errors. 12352282792aSdrh */ 12362282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 12372282792aSdrh int i; 12382282792aSdrh AggExpr *aAgg; 12392282792aSdrh int nErr = 0; 12402282792aSdrh 12412282792aSdrh if( pExpr==0 ) return 0; 12422282792aSdrh switch( pExpr->op ){ 1243967e8b73Sdrh case TK_COLUMN: { 12442282792aSdrh aAgg = pParse->aAgg; 12452282792aSdrh for(i=0; i<pParse->nAgg; i++){ 12462282792aSdrh if( aAgg[i].isAgg ) continue; 12472282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1248967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 12492282792aSdrh break; 12502282792aSdrh } 12512282792aSdrh } 12522282792aSdrh if( i>=pParse->nAgg ){ 12532282792aSdrh i = appendAggInfo(pParse); 12542282792aSdrh if( i<0 ) return 1; 12552282792aSdrh pParse->aAgg[i].isAgg = 0; 12562282792aSdrh pParse->aAgg[i].pExpr = pExpr; 12572282792aSdrh } 1258aaf88729Sdrh pExpr->iAgg = i; 12592282792aSdrh break; 12602282792aSdrh } 12612282792aSdrh case TK_AGG_FUNCTION: { 12622282792aSdrh aAgg = pParse->aAgg; 12632282792aSdrh for(i=0; i<pParse->nAgg; i++){ 12642282792aSdrh if( !aAgg[i].isAgg ) continue; 1265d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 12662282792aSdrh break; 12672282792aSdrh } 12682282792aSdrh } 12692282792aSdrh if( i>=pParse->nAgg ){ 12702282792aSdrh i = appendAggInfo(pParse); 12712282792aSdrh if( i<0 ) return 1; 12722282792aSdrh pParse->aAgg[i].isAgg = 1; 12732282792aSdrh pParse->aAgg[i].pExpr = pExpr; 12740bce8354Sdrh pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db, 1275f55f25f0Sdrh pExpr->token.z, pExpr->token.n, 1276f55f25f0Sdrh pExpr->pList ? pExpr->pList->nExpr : 0, 0); 12772282792aSdrh } 12782282792aSdrh pExpr->iAgg = i; 12792282792aSdrh break; 12802282792aSdrh } 12812282792aSdrh default: { 12822282792aSdrh if( pExpr->pLeft ){ 12832282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 12842282792aSdrh } 12852282792aSdrh if( nErr==0 && pExpr->pRight ){ 12862282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 12872282792aSdrh } 12882282792aSdrh if( nErr==0 && pExpr->pList ){ 12892282792aSdrh int n = pExpr->pList->nExpr; 12902282792aSdrh int i; 12912282792aSdrh for(i=0; nErr==0 && i<n; i++){ 12922282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 12932282792aSdrh } 12942282792aSdrh } 12952282792aSdrh break; 12962282792aSdrh } 12972282792aSdrh } 12982282792aSdrh return nErr; 12992282792aSdrh } 13008e0a2f90Sdrh 13018e0a2f90Sdrh /* 13028e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 13030bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that 13048e0a2f90Sdrh ** function, or return NULL if the function does not exist. 13058e0a2f90Sdrh ** 13060bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef 13078e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 13088e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 13098e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 13108e0a2f90Sdrh ** any number of arguments will be returned. 13118e0a2f90Sdrh ** 13128e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 13138e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 13148e0a2f90Sdrh ** or xStep is non-zero. 13158e0a2f90Sdrh */ 13160bce8354Sdrh FuncDef *sqliteFindFunction( 13178e0a2f90Sdrh sqlite *db, /* An open database */ 13188e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 13198e0a2f90Sdrh int nName, /* Number of characters in the name */ 13208e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 13218e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 13228e0a2f90Sdrh ){ 13230bce8354Sdrh FuncDef *pFirst, *p, *pMaybe; 13240bce8354Sdrh pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName); 13251350b030Sdrh if( p && !createFlag && nArg<0 ){ 13268e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 13278e0a2f90Sdrh return p; 13288e0a2f90Sdrh } 13298e0a2f90Sdrh pMaybe = 0; 13308e0a2f90Sdrh while( p && p->nArg!=nArg ){ 13318e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 13328e0a2f90Sdrh p = p->pNext; 13338e0a2f90Sdrh } 13348e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 13358e0a2f90Sdrh return 0; 13368e0a2f90Sdrh } 13378e0a2f90Sdrh if( p==0 && pMaybe ){ 13388e0a2f90Sdrh assert( createFlag==0 ); 13398e0a2f90Sdrh return pMaybe; 13408e0a2f90Sdrh } 134189425d5eSdrh if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){ 13428e0a2f90Sdrh p->nArg = nArg; 13438e0a2f90Sdrh p->pNext = pFirst; 13440bce8354Sdrh sqliteHashInsert(&db->aFunc, zName, nName, (void*)p); 13458e0a2f90Sdrh } 13468e0a2f90Sdrh return p; 13478e0a2f90Sdrh } 1348