1cce7d176Sdrh /* 2cce7d176Sdrh ** Copyright (c) 1999, 2000 D. Richard Hipp 3cce7d176Sdrh ** 4cce7d176Sdrh ** This program is free software; you can redistribute it and/or 5cce7d176Sdrh ** modify it under the terms of the GNU General Public 6cce7d176Sdrh ** License as published by the Free Software Foundation; either 7cce7d176Sdrh ** version 2 of the License, or (at your option) any later version. 8cce7d176Sdrh ** 9cce7d176Sdrh ** This program is distributed in the hope that it will be useful, 10cce7d176Sdrh ** but WITHOUT ANY WARRANTY; without even the implied warranty of 11cce7d176Sdrh ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cce7d176Sdrh ** General Public License for more details. 13cce7d176Sdrh ** 14cce7d176Sdrh ** You should have received a copy of the GNU General Public 15cce7d176Sdrh ** License along with this library; if not, write to the 16cce7d176Sdrh ** Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17cce7d176Sdrh ** Boston, MA 02111-1307, USA. 18cce7d176Sdrh ** 19cce7d176Sdrh ** Author contact information: 20cce7d176Sdrh ** [email protected] 21cce7d176Sdrh ** http://www.hwaci.com/drh/ 22cce7d176Sdrh ** 23cce7d176Sdrh ************************************************************************* 24cce7d176Sdrh ** This file contains C code routines used for processing expressions 25cce7d176Sdrh ** 26*cfab11bcSdrh ** $Id: expr.c,v 1.8 2000/06/06 03:31:22 drh Exp $ 27cce7d176Sdrh */ 28cce7d176Sdrh #include "sqliteInt.h" 29cce7d176Sdrh 30cce7d176Sdrh /* 31fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 32fef5208cSdrh ** and 0 if it involves variables. 33fef5208cSdrh */ 34fef5208cSdrh static int isConstant(Expr *p){ 35fef5208cSdrh switch( p->op ){ 36fef5208cSdrh case TK_ID: 37fef5208cSdrh case TK_FIELD: 38fef5208cSdrh case TK_DOT: 39fef5208cSdrh return 0; 40fef5208cSdrh default: { 41fef5208cSdrh if( p->pLeft && !isConstant(p->pLeft) ) return 0; 42fef5208cSdrh if( p->pRight && !isConstant(p->pRight) ) return 0; 43fef5208cSdrh if( p->pList ){ 44fef5208cSdrh int i; 45fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 46fef5208cSdrh if( !isConstant(p->pList->a[i].pExpr) ) return 0; 47fef5208cSdrh } 48fef5208cSdrh } 49fef5208cSdrh break; 50fef5208cSdrh } 51fef5208cSdrh } 52fef5208cSdrh return 1; 53fef5208cSdrh } 54fef5208cSdrh 55fef5208cSdrh /* 56cce7d176Sdrh ** This routine walks an expression tree and resolves references to 57cce7d176Sdrh ** table fields. Nodes of the form ID.ID or ID resolve into an 58cce7d176Sdrh ** index to the table in the table list and a field offset. The opcode 59cce7d176Sdrh ** for such nodes is changed to TK_FIELD. The iTable value is changed 6019a775c2Sdrh ** to the index of the referenced table in pTabList plus the pParse->nTab 6119a775c2Sdrh ** value. The iField value is changed to the index of the field of the 6219a775c2Sdrh ** referenced table. 6319a775c2Sdrh ** 64fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 65fef5208cSdrh ** forms: 66fef5208cSdrh ** 67fef5208cSdrh ** expr IN (exprlist) 68fef5208cSdrh ** and 69fef5208cSdrh ** expr IN (SELECT ...) 70fef5208cSdrh ** 71fef5208cSdrh ** The first form is handled by creating a set holding the list 72fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 73fef5208cSdrh ** a temporary table. 74fef5208cSdrh ** 75fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 7619a775c2Sdrh ** If it finds any, it generates code to write the value of that select 7719a775c2Sdrh ** into a memory cell. 78cce7d176Sdrh ** 79cce7d176Sdrh ** Unknown fields or tables provoke an error. The function returns 80cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 81cce7d176Sdrh */ 82cce7d176Sdrh int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){ 83cce7d176Sdrh if( pExpr==0 ) return 0; 84cce7d176Sdrh switch( pExpr->op ){ 85cce7d176Sdrh /* A lone identifier */ 86cce7d176Sdrh case TK_ID: { 87cce7d176Sdrh int cnt = 0; /* Number of matches */ 88cce7d176Sdrh int i; /* Loop counter */ 89cce7d176Sdrh char *z = 0; 90cce7d176Sdrh sqliteSetNString(&z, pExpr->token.z, pExpr->token.n, 0); 91cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 92cce7d176Sdrh int j; 93cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 94cce7d176Sdrh if( pTab==0 ) continue; 95cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 967020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 97cce7d176Sdrh cnt++; 9819a775c2Sdrh pExpr->iTable = i + pParse->nTab; 99cce7d176Sdrh pExpr->iField = j; 100cce7d176Sdrh } 101cce7d176Sdrh } 102cce7d176Sdrh } 103cce7d176Sdrh sqliteFree(z); 104cce7d176Sdrh if( cnt==0 ){ 105cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1, 106cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 107cce7d176Sdrh pParse->nErr++; 108cce7d176Sdrh return 1; 109cce7d176Sdrh }else if( cnt>1 ){ 110cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1, 111cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 112cce7d176Sdrh pParse->nErr++; 113cce7d176Sdrh return 1; 114cce7d176Sdrh } 115cce7d176Sdrh pExpr->op = TK_FIELD; 116cce7d176Sdrh break; 117cce7d176Sdrh } 118cce7d176Sdrh 119cce7d176Sdrh /* A table name and field name: ID.ID */ 120cce7d176Sdrh case TK_DOT: { 121cce7d176Sdrh int cnt = 0; /* Number of matches */ 122cce7d176Sdrh int i; /* Loop counter */ 123cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 124cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 125cce7d176Sdrh 126cce7d176Sdrh pLeft = pExpr->pLeft; 127cce7d176Sdrh pRight = pExpr->pRight; 128cce7d176Sdrh assert( pLeft && pLeft->op==TK_ID ); 129cce7d176Sdrh assert( pRight && pRight->op==TK_ID ); 130cce7d176Sdrh zLeft = 0; 131cce7d176Sdrh sqliteSetNString(&zLeft, pLeft->token.z, pLeft->token.n, 0); 132cce7d176Sdrh zRight = 0; 133cce7d176Sdrh sqliteSetNString(&zRight, pRight->token.z, pRight->token.n, 0); 134cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 135cce7d176Sdrh int j; 136cce7d176Sdrh char *zTab; 137cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 138cce7d176Sdrh if( pTab==0 ) continue; 139cce7d176Sdrh if( pTabList->a[i].zAlias ){ 140cce7d176Sdrh zTab = pTabList->a[i].zAlias; 141cce7d176Sdrh }else{ 142cce7d176Sdrh zTab = pTab->zName; 143cce7d176Sdrh } 144cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 145cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 1467020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 147cce7d176Sdrh cnt++; 14819a775c2Sdrh pExpr->iTable = i + pParse->nTab; 149cce7d176Sdrh pExpr->iField = j; 150cce7d176Sdrh } 151cce7d176Sdrh } 152cce7d176Sdrh } 153cce7d176Sdrh sqliteFree(zLeft); 154cce7d176Sdrh sqliteFree(zRight); 155cce7d176Sdrh if( cnt==0 ){ 156cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such field: ", -1, 157cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 158cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 159cce7d176Sdrh pParse->nErr++; 160cce7d176Sdrh return 1; 161cce7d176Sdrh }else if( cnt>1 ){ 162cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous field name: ", -1, 163cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 164cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 165cce7d176Sdrh pParse->nErr++; 166cce7d176Sdrh return 1; 167cce7d176Sdrh } 168cce7d176Sdrh sqliteExprDelete(pLeft); 169cce7d176Sdrh pExpr->pLeft = 0; 170cce7d176Sdrh sqliteExprDelete(pRight); 171cce7d176Sdrh pExpr->pRight = 0; 172cce7d176Sdrh pExpr->op = TK_FIELD; 173cce7d176Sdrh break; 174cce7d176Sdrh } 175cce7d176Sdrh 176fef5208cSdrh case TK_IN: { 177fef5208cSdrh Vdbe *v = pParse->pVdbe; 178fef5208cSdrh if( v==0 ){ 179fef5208cSdrh v = pParse->pVdbe = sqliteVdbeCreate(pParse->db->pBe); 180fef5208cSdrh } 181fef5208cSdrh if( v==0 ) return 1; 182*cfab11bcSdrh if( sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 183*cfab11bcSdrh return 1; 184*cfab11bcSdrh } 185fef5208cSdrh if( pExpr->pSelect ){ 186fef5208cSdrh /* Case 1: expr IN (SELECT ...) 187fef5208cSdrh ** 188fef5208cSdrh ** Generate code to write the results of the select into a temporary 189fef5208cSdrh ** table. The cursor number of the temporary table is stored in 190fef5208cSdrh ** iTable. 191fef5208cSdrh */ 192fef5208cSdrh pExpr->iTable = pParse->nTab++; 193fef5208cSdrh sqliteVdbeAddOp(v, OP_Open, pExpr->iTable, 0, 0, 0); 194fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 195fef5208cSdrh }else if( pExpr->pList ){ 196fef5208cSdrh /* Case 2: expr IN (exprlist) 197fef5208cSdrh ** 198fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 199fef5208cSdrh ** in iTable. 200fef5208cSdrh */ 201fef5208cSdrh int i, iSet; 202fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 203fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 204fef5208cSdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 205fef5208cSdrh return 1; 206fef5208cSdrh } 207fef5208cSdrh if( !isConstant(pE2) ){ 208fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 209fef5208cSdrh "right-hand side of IN operator must be constant", 0); 210fef5208cSdrh pParse->nErr++; 211fef5208cSdrh return 1; 212fef5208cSdrh } 213fef5208cSdrh } 214fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 215fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 216fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 217fef5208cSdrh switch( pE2->op ){ 218fef5208cSdrh case TK_FLOAT: 219fef5208cSdrh case TK_INTEGER: 220fef5208cSdrh case TK_STRING: { 221fef5208cSdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 222fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 223fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 224fef5208cSdrh break; 225fef5208cSdrh } 226fef5208cSdrh default: { 227fef5208cSdrh sqliteExprCode(pParse, pE2); 228fef5208cSdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 229fef5208cSdrh break; 230fef5208cSdrh } 231fef5208cSdrh } 232fef5208cSdrh } 233fef5208cSdrh } 234*cfab11bcSdrh break; 235fef5208cSdrh } 236fef5208cSdrh 23719a775c2Sdrh case TK_SELECT: { 238fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 239fef5208cSdrh ** value of this select in a memory cell and record the number 240fef5208cSdrh ** of the memory cell in iField. 241fef5208cSdrh */ 24219a775c2Sdrh pExpr->iField = pParse->nMem++; 243fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iField) ){ 24419a775c2Sdrh return 1; 24519a775c2Sdrh } 24619a775c2Sdrh break; 24719a775c2Sdrh } 24819a775c2Sdrh 249cce7d176Sdrh /* For all else, just recursively walk the tree */ 250cce7d176Sdrh default: { 251cce7d176Sdrh if( pExpr->pLeft 252cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 253cce7d176Sdrh return 1; 254cce7d176Sdrh } 255cce7d176Sdrh if( pExpr->pRight 256cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){ 257cce7d176Sdrh return 1; 258cce7d176Sdrh } 259cce7d176Sdrh if( pExpr->pList ){ 260cce7d176Sdrh int i; 261cce7d176Sdrh ExprList *pList = pExpr->pList; 262cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 263cce7d176Sdrh if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){ 264cce7d176Sdrh return 1; 265cce7d176Sdrh } 266cce7d176Sdrh } 267cce7d176Sdrh } 268cce7d176Sdrh } 269cce7d176Sdrh } 270cce7d176Sdrh return 0; 271cce7d176Sdrh } 272cce7d176Sdrh 273cce7d176Sdrh #if 0 /* NOT USED */ 274cce7d176Sdrh /* 275cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 276cce7d176Sdrh */ 277cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 278cce7d176Sdrh int n = strlen(zStr); 279cce7d176Sdrh if( n!=pToken->n ) return 0; 280cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 281cce7d176Sdrh } 282cce7d176Sdrh #endif 283cce7d176Sdrh 284cce7d176Sdrh /* 285cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 286cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 287cce7d176Sdrh */ 288cce7d176Sdrh int sqliteFuncId(Token *pToken){ 289cce7d176Sdrh static const struct { 290cce7d176Sdrh char *zName; 291cce7d176Sdrh int len; 292cce7d176Sdrh int id; 293cce7d176Sdrh } aFunc[] = { 294cce7d176Sdrh { "count", 5, FN_Count }, 295cce7d176Sdrh { "min", 3, FN_Min }, 296cce7d176Sdrh { "max", 3, FN_Max }, 297cce7d176Sdrh { "sum", 3, FN_Sum }, 298cce7d176Sdrh }; 299cce7d176Sdrh int i; 300cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 301cce7d176Sdrh if( aFunc[i].len==pToken->n 302cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 303cce7d176Sdrh return aFunc[i].id; 304cce7d176Sdrh } 305cce7d176Sdrh } 306cce7d176Sdrh return FN_Unknown; 307cce7d176Sdrh } 308cce7d176Sdrh 309cce7d176Sdrh /* 310cce7d176Sdrh ** Error check the functions in an expression. Make sure all 311cce7d176Sdrh ** function names are recognized and all functions have the correct 312cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 313cce7d176Sdrh ** if anything is amiss. Return the number of errors. 314cce7d176Sdrh ** 315cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 316cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 317cce7d176Sdrh */ 318cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 319cce7d176Sdrh int nErr = 0; 320cce7d176Sdrh if( pExpr==0 ) return 0; 321cce7d176Sdrh if( pIsAgg ) *pIsAgg = 0; 322cce7d176Sdrh switch( pExpr->op ){ 323cce7d176Sdrh case TK_FUNCTION: { 324cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 325cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 326cce7d176Sdrh int no_such_func = 0; 327cce7d176Sdrh int too_many_args = 0; 328cce7d176Sdrh int too_few_args = 0; 329cce7d176Sdrh int is_agg = 0; 330cce7d176Sdrh int i; 331cce7d176Sdrh switch( id ){ 332cce7d176Sdrh case FN_Unknown: { 333cce7d176Sdrh no_such_func = 1; 334cce7d176Sdrh break; 335cce7d176Sdrh } 336cce7d176Sdrh case FN_Count: { 337cce7d176Sdrh no_such_func = !allowAgg; 338cce7d176Sdrh too_many_args = n>1; 339cce7d176Sdrh is_agg = 1; 340cce7d176Sdrh break; 341cce7d176Sdrh } 342cce7d176Sdrh case FN_Max: 343cce7d176Sdrh case FN_Min: { 344cce7d176Sdrh too_few_args = allowAgg ? n<1 : n<2; 345cce7d176Sdrh is_agg = n==1; 346cce7d176Sdrh break; 347cce7d176Sdrh } 348cce7d176Sdrh case FN_Sum: { 349cce7d176Sdrh no_such_func = !allowAgg; 350cce7d176Sdrh too_many_args = n>1; 351cce7d176Sdrh too_few_args = n<1; 352cce7d176Sdrh is_agg = 1; 353cce7d176Sdrh break; 354cce7d176Sdrh } 355cce7d176Sdrh default: break; 356cce7d176Sdrh } 357cce7d176Sdrh if( no_such_func ){ 358cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 359cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 360cce7d176Sdrh pParse->nErr++; 361cce7d176Sdrh nErr++; 362cce7d176Sdrh }else if( too_many_args ){ 363cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 364cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 365cce7d176Sdrh pParse->nErr++; 366cce7d176Sdrh nErr++; 367cce7d176Sdrh }else if( too_few_args ){ 368cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 369cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 370cce7d176Sdrh pParse->nErr++; 371cce7d176Sdrh nErr++; 372cce7d176Sdrh } 373cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 374cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 375cce7d176Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 0, 0); 376cce7d176Sdrh } 377cce7d176Sdrh } 378cce7d176Sdrh default: { 379cce7d176Sdrh if( pExpr->pLeft ){ 380cce7d176Sdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, 0, 0); 381cce7d176Sdrh } 382cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 383cce7d176Sdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, 0, 0); 384cce7d176Sdrh } 385fef5208cSdrh if( nErr==0 && pExpr->pList ){ 386fef5208cSdrh int n = pExpr->pList->nExpr; 387fef5208cSdrh int i; 388fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 389fef5208cSdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 0, 0); 390fef5208cSdrh } 391fef5208cSdrh } 392cce7d176Sdrh break; 393cce7d176Sdrh } 394cce7d176Sdrh } 395cce7d176Sdrh return nErr; 396cce7d176Sdrh } 397cce7d176Sdrh 398cce7d176Sdrh /* 399cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 400cce7d176Sdrh ** expression and leave the result on the stack. 401cce7d176Sdrh */ 402cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 403cce7d176Sdrh Vdbe *v = pParse->pVdbe; 404cce7d176Sdrh int op; 405cce7d176Sdrh switch( pExpr->op ){ 406cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 407cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 408cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 409cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 410cce7d176Sdrh case TK_AND: op = OP_And; break; 411cce7d176Sdrh case TK_OR: op = OP_Or; break; 412cce7d176Sdrh case TK_LT: op = OP_Lt; break; 413cce7d176Sdrh case TK_LE: op = OP_Le; break; 414cce7d176Sdrh case TK_GT: op = OP_Gt; break; 415cce7d176Sdrh case TK_GE: op = OP_Ge; break; 416cce7d176Sdrh case TK_NE: op = OP_Ne; break; 417cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 418cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 419cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 420cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 421cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 422cce7d176Sdrh case TK_NOT: op = OP_Not; break; 423cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 424cce7d176Sdrh default: break; 425cce7d176Sdrh } 426cce7d176Sdrh switch( pExpr->op ){ 427cce7d176Sdrh case TK_FIELD: { 428cce7d176Sdrh sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iField, 0, 0); 429cce7d176Sdrh break; 430cce7d176Sdrh } 431cce7d176Sdrh case TK_INTEGER: { 432cce7d176Sdrh int i = atoi(pExpr->token.z); 433cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); 434cce7d176Sdrh break; 435cce7d176Sdrh } 436cce7d176Sdrh case TK_FLOAT: { 437cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 438cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 439cce7d176Sdrh break; 440cce7d176Sdrh } 441cce7d176Sdrh case TK_STRING: { 442cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 443cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 444cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 445cce7d176Sdrh break; 446cce7d176Sdrh } 447cce7d176Sdrh case TK_NULL: { 448c61053b7Sdrh sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0); 449cce7d176Sdrh break; 450cce7d176Sdrh } 451cce7d176Sdrh case TK_AND: 452cce7d176Sdrh case TK_OR: 453cce7d176Sdrh case TK_PLUS: 454cce7d176Sdrh case TK_STAR: 455cce7d176Sdrh case TK_MINUS: 456cce7d176Sdrh case TK_SLASH: { 457cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 458cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 459cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 460cce7d176Sdrh break; 461cce7d176Sdrh } 462cce7d176Sdrh case TK_LT: 463cce7d176Sdrh case TK_LE: 464cce7d176Sdrh case TK_GT: 465cce7d176Sdrh case TK_GE: 466cce7d176Sdrh case TK_NE: 467cce7d176Sdrh case TK_EQ: 468cce7d176Sdrh case TK_LIKE: 469cce7d176Sdrh case TK_GLOB: { 470cce7d176Sdrh int dest; 471cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 472cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 473cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 474cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 475cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 476cce7d176Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 477cce7d176Sdrh break; 478cce7d176Sdrh } 479cce7d176Sdrh case TK_NOT: 480cce7d176Sdrh case TK_UMINUS: { 481cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 482cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 483cce7d176Sdrh break; 484cce7d176Sdrh } 485cce7d176Sdrh case TK_ISNULL: 486cce7d176Sdrh case TK_NOTNULL: { 487cce7d176Sdrh int dest; 4888be51133Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 489cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 490cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 491cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 4928be51133Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 493cce7d176Sdrh break; 494cce7d176Sdrh } 495cce7d176Sdrh case TK_FUNCTION: { 496cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 497cce7d176Sdrh int op; 498cce7d176Sdrh int i; 499cce7d176Sdrh ExprList *pList = pExpr->pList; 500cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 501cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 502cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 503cce7d176Sdrh if( i>0 ){ 504cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 505cce7d176Sdrh } 506cce7d176Sdrh } 507cce7d176Sdrh break; 508cce7d176Sdrh } 50919a775c2Sdrh case TK_SELECT: { 51019a775c2Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iField, 0, 0, 0); 51119a775c2Sdrh break; 51219a775c2Sdrh } 513fef5208cSdrh case TK_IN: { 514fef5208cSdrh int addr; 515fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 516fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 517fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 518fef5208cSdrh if( pExpr->pSelect ){ 519fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0); 520fef5208cSdrh }else{ 521fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0); 522fef5208cSdrh } 523fef5208cSdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0); 524fef5208cSdrh break; 525fef5208cSdrh } 526fef5208cSdrh case TK_BETWEEN: { 527fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 528fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 529fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 530fef5208cSdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0); 531fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 532fef5208cSdrh break; 533fef5208cSdrh } 534cce7d176Sdrh } 535cce7d176Sdrh return; 536cce7d176Sdrh } 537cce7d176Sdrh 538cce7d176Sdrh /* 539cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 540cce7d176Sdrh ** to the label "dest" if the expression is true but execution 541cce7d176Sdrh ** continues straight thru if the expression is false. 542cce7d176Sdrh */ 543cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 544cce7d176Sdrh Vdbe *v = pParse->pVdbe; 545cce7d176Sdrh int op = 0; 546cce7d176Sdrh switch( pExpr->op ){ 547cce7d176Sdrh case TK_LT: op = OP_Lt; break; 548cce7d176Sdrh case TK_LE: op = OP_Le; break; 549cce7d176Sdrh case TK_GT: op = OP_Gt; break; 550cce7d176Sdrh case TK_GE: op = OP_Ge; break; 551cce7d176Sdrh case TK_NE: op = OP_Ne; break; 552cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 553cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 554cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 555cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 556cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 557cce7d176Sdrh default: break; 558cce7d176Sdrh } 559cce7d176Sdrh switch( pExpr->op ){ 560cce7d176Sdrh case TK_AND: { 561cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 562cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 563cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 564cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 565cce7d176Sdrh break; 566cce7d176Sdrh } 567cce7d176Sdrh case TK_OR: { 568cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 569cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 570cce7d176Sdrh break; 571cce7d176Sdrh } 572cce7d176Sdrh case TK_NOT: { 573cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 574cce7d176Sdrh break; 575cce7d176Sdrh } 576cce7d176Sdrh case TK_LT: 577cce7d176Sdrh case TK_LE: 578cce7d176Sdrh case TK_GT: 579cce7d176Sdrh case TK_GE: 580cce7d176Sdrh case TK_NE: 581cce7d176Sdrh case TK_EQ: 582cce7d176Sdrh case TK_LIKE: 583cce7d176Sdrh case TK_GLOB: { 584cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 585cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 586cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 587cce7d176Sdrh break; 588cce7d176Sdrh } 589cce7d176Sdrh case TK_ISNULL: 590cce7d176Sdrh case TK_NOTNULL: { 591cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 592cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 593cce7d176Sdrh break; 594cce7d176Sdrh } 595fef5208cSdrh case TK_IN: { 596*cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 597fef5208cSdrh if( pExpr->pSelect ){ 598fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0); 599fef5208cSdrh }else{ 600fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0); 601fef5208cSdrh } 602fef5208cSdrh break; 603fef5208cSdrh } 604fef5208cSdrh case TK_BETWEEN: { 605fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 606fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 607fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 608fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 609fef5208cSdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0); 610fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 611fef5208cSdrh sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0); 612fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 613fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl); 614fef5208cSdrh break; 615fef5208cSdrh } 616cce7d176Sdrh default: { 617cce7d176Sdrh sqliteExprCode(pParse, pExpr); 618cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 619cce7d176Sdrh break; 620cce7d176Sdrh } 621cce7d176Sdrh } 622cce7d176Sdrh } 623cce7d176Sdrh 624cce7d176Sdrh /* 625cce7d176Sdrh ** Generate code for boolean expression such that a jump is made 626cce7d176Sdrh ** to the label "dest" if the expression is false but execution 627cce7d176Sdrh ** continues straight thru if the expression is true. 628cce7d176Sdrh */ 629cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 630cce7d176Sdrh Vdbe *v = pParse->pVdbe; 631cce7d176Sdrh int op = 0; 632cce7d176Sdrh switch( pExpr->op ){ 633cce7d176Sdrh case TK_LT: op = OP_Ge; break; 634cce7d176Sdrh case TK_LE: op = OP_Gt; break; 635cce7d176Sdrh case TK_GT: op = OP_Le; break; 636cce7d176Sdrh case TK_GE: op = OP_Lt; break; 637cce7d176Sdrh case TK_NE: op = OP_Eq; break; 638cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 639cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 640cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 641cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 642cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 643cce7d176Sdrh default: break; 644cce7d176Sdrh } 645cce7d176Sdrh switch( pExpr->op ){ 646cce7d176Sdrh case TK_AND: { 647cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 648cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 649cce7d176Sdrh break; 650cce7d176Sdrh } 651cce7d176Sdrh case TK_OR: { 652cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 653cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 654cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 655cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 656cce7d176Sdrh break; 657cce7d176Sdrh } 658cce7d176Sdrh case TK_NOT: { 659cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 660cce7d176Sdrh break; 661cce7d176Sdrh } 662cce7d176Sdrh case TK_LT: 663cce7d176Sdrh case TK_LE: 664cce7d176Sdrh case TK_GT: 665cce7d176Sdrh case TK_GE: 666cce7d176Sdrh case TK_NE: 667cce7d176Sdrh case TK_EQ: { 668cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 669cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 670cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 671cce7d176Sdrh break; 672cce7d176Sdrh } 673cce7d176Sdrh case TK_LIKE: 674cce7d176Sdrh case TK_GLOB: { 675cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 676cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 677cce7d176Sdrh sqliteVdbeAddOp(v, op, 1, dest, 0, 0); 678cce7d176Sdrh break; 679cce7d176Sdrh } 680cce7d176Sdrh case TK_ISNULL: 681cce7d176Sdrh case TK_NOTNULL: { 682cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 683cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 684cce7d176Sdrh break; 685cce7d176Sdrh } 686fef5208cSdrh case TK_IN: { 687*cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 688fef5208cSdrh if( pExpr->pSelect ){ 689fef5208cSdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0); 690fef5208cSdrh }else{ 691fef5208cSdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0); 692fef5208cSdrh } 693fef5208cSdrh break; 694fef5208cSdrh } 695fef5208cSdrh case TK_BETWEEN: { 696fef5208cSdrh int addr; 697fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 698fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 699fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 700fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 701fef5208cSdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0); 702fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0); 703fef5208cSdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0); 704fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 705fef5208cSdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0); 706fef5208cSdrh break; 707fef5208cSdrh } 708cce7d176Sdrh default: { 709cce7d176Sdrh sqliteExprCode(pParse, pExpr); 710cce7d176Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0); 711cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 712cce7d176Sdrh break; 713cce7d176Sdrh } 714cce7d176Sdrh } 715cce7d176Sdrh } 716