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*fef5208cSdrh ** $Id: expr.c,v 1.7 2000/06/06 01:50:43 drh Exp $ 27cce7d176Sdrh */ 28cce7d176Sdrh #include "sqliteInt.h" 29cce7d176Sdrh 30cce7d176Sdrh /* 31*fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 32*fef5208cSdrh ** and 0 if it involves variables. 33*fef5208cSdrh */ 34*fef5208cSdrh static int isConstant(Expr *p){ 35*fef5208cSdrh switch( p->op ){ 36*fef5208cSdrh case TK_ID: 37*fef5208cSdrh case TK_FIELD: 38*fef5208cSdrh case TK_DOT: 39*fef5208cSdrh return 0; 40*fef5208cSdrh default: { 41*fef5208cSdrh if( p->pLeft && !isConstant(p->pLeft) ) return 0; 42*fef5208cSdrh if( p->pRight && !isConstant(p->pRight) ) return 0; 43*fef5208cSdrh if( p->pList ){ 44*fef5208cSdrh int i; 45*fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 46*fef5208cSdrh if( !isConstant(p->pList->a[i].pExpr) ) return 0; 47*fef5208cSdrh } 48*fef5208cSdrh } 49*fef5208cSdrh break; 50*fef5208cSdrh } 51*fef5208cSdrh } 52*fef5208cSdrh return 1; 53*fef5208cSdrh } 54*fef5208cSdrh 55*fef5208cSdrh /* 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 ** 64*fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 65*fef5208cSdrh ** forms: 66*fef5208cSdrh ** 67*fef5208cSdrh ** expr IN (exprlist) 68*fef5208cSdrh ** and 69*fef5208cSdrh ** expr IN (SELECT ...) 70*fef5208cSdrh ** 71*fef5208cSdrh ** The first form is handled by creating a set holding the list 72*fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 73*fef5208cSdrh ** a temporary table. 74*fef5208cSdrh ** 75*fef5208cSdrh ** 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 176*fef5208cSdrh case TK_IN: { 177*fef5208cSdrh Vdbe *v = pParse->pVdbe; 178*fef5208cSdrh if( v==0 ){ 179*fef5208cSdrh v = pParse->pVdbe = sqliteVdbeCreate(pParse->db->pBe); 180*fef5208cSdrh } 181*fef5208cSdrh if( v==0 ) return 1; 182*fef5208cSdrh if( pExpr->pSelect ){ 183*fef5208cSdrh /* Case 1: expr IN (SELECT ...) 184*fef5208cSdrh ** 185*fef5208cSdrh ** Generate code to write the results of the select into a temporary 186*fef5208cSdrh ** table. The cursor number of the temporary table is stored in 187*fef5208cSdrh ** iTable. 188*fef5208cSdrh */ 189*fef5208cSdrh pExpr->iTable = pParse->nTab++; 190*fef5208cSdrh sqliteVdbeAddOp(v, OP_Open, pExpr->iTable, 0, 0, 0); 191*fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 192*fef5208cSdrh }else if( pExpr->pList ){ 193*fef5208cSdrh /* Case 2: expr IN (exprlist) 194*fef5208cSdrh ** 195*fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 196*fef5208cSdrh ** in iTable. 197*fef5208cSdrh */ 198*fef5208cSdrh int i, iSet; 199*fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 200*fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 201*fef5208cSdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 202*fef5208cSdrh return 1; 203*fef5208cSdrh } 204*fef5208cSdrh if( !isConstant(pE2) ){ 205*fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 206*fef5208cSdrh "right-hand side of IN operator must be constant", 0); 207*fef5208cSdrh pParse->nErr++; 208*fef5208cSdrh return 1; 209*fef5208cSdrh } 210*fef5208cSdrh } 211*fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 212*fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 213*fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 214*fef5208cSdrh switch( pE2->op ){ 215*fef5208cSdrh case TK_FLOAT: 216*fef5208cSdrh case TK_INTEGER: 217*fef5208cSdrh case TK_STRING: { 218*fef5208cSdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 219*fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 220*fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 221*fef5208cSdrh break; 222*fef5208cSdrh } 223*fef5208cSdrh default: { 224*fef5208cSdrh sqliteExprCode(pParse, pE2); 225*fef5208cSdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0, 0, 0); 226*fef5208cSdrh break; 227*fef5208cSdrh } 228*fef5208cSdrh } 229*fef5208cSdrh } 230*fef5208cSdrh } 231*fef5208cSdrh } 232*fef5208cSdrh 23319a775c2Sdrh case TK_SELECT: { 234*fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 235*fef5208cSdrh ** value of this select in a memory cell and record the number 236*fef5208cSdrh ** of the memory cell in iField. 237*fef5208cSdrh */ 23819a775c2Sdrh pExpr->iField = pParse->nMem++; 239*fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iField) ){ 24019a775c2Sdrh return 1; 24119a775c2Sdrh } 24219a775c2Sdrh break; 24319a775c2Sdrh } 24419a775c2Sdrh 245cce7d176Sdrh /* For all else, just recursively walk the tree */ 246cce7d176Sdrh default: { 247cce7d176Sdrh if( pExpr->pLeft 248cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pLeft) ){ 249cce7d176Sdrh return 1; 250cce7d176Sdrh } 251cce7d176Sdrh if( pExpr->pRight 252cce7d176Sdrh && sqliteExprResolveIds(pParse, pTabList, pExpr->pRight) ){ 253cce7d176Sdrh return 1; 254cce7d176Sdrh } 255cce7d176Sdrh if( pExpr->pList ){ 256cce7d176Sdrh int i; 257cce7d176Sdrh ExprList *pList = pExpr->pList; 258cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 259cce7d176Sdrh if( sqliteExprResolveIds(pParse, pTabList, pList->a[i].pExpr) ){ 260cce7d176Sdrh return 1; 261cce7d176Sdrh } 262cce7d176Sdrh } 263cce7d176Sdrh } 264cce7d176Sdrh } 265cce7d176Sdrh } 266cce7d176Sdrh return 0; 267cce7d176Sdrh } 268cce7d176Sdrh 269cce7d176Sdrh #if 0 /* NOT USED */ 270cce7d176Sdrh /* 271cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 272cce7d176Sdrh */ 273cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 274cce7d176Sdrh int n = strlen(zStr); 275cce7d176Sdrh if( n!=pToken->n ) return 0; 276cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 277cce7d176Sdrh } 278cce7d176Sdrh #endif 279cce7d176Sdrh 280cce7d176Sdrh /* 281cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 282cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 283cce7d176Sdrh */ 284cce7d176Sdrh int sqliteFuncId(Token *pToken){ 285cce7d176Sdrh static const struct { 286cce7d176Sdrh char *zName; 287cce7d176Sdrh int len; 288cce7d176Sdrh int id; 289cce7d176Sdrh } aFunc[] = { 290cce7d176Sdrh { "count", 5, FN_Count }, 291cce7d176Sdrh { "min", 3, FN_Min }, 292cce7d176Sdrh { "max", 3, FN_Max }, 293cce7d176Sdrh { "sum", 3, FN_Sum }, 294cce7d176Sdrh }; 295cce7d176Sdrh int i; 296cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 297cce7d176Sdrh if( aFunc[i].len==pToken->n 298cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 299cce7d176Sdrh return aFunc[i].id; 300cce7d176Sdrh } 301cce7d176Sdrh } 302cce7d176Sdrh return FN_Unknown; 303cce7d176Sdrh } 304cce7d176Sdrh 305cce7d176Sdrh /* 306cce7d176Sdrh ** Error check the functions in an expression. Make sure all 307cce7d176Sdrh ** function names are recognized and all functions have the correct 308cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 309cce7d176Sdrh ** if anything is amiss. Return the number of errors. 310cce7d176Sdrh ** 311cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 312cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 313cce7d176Sdrh */ 314cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 315cce7d176Sdrh int nErr = 0; 316cce7d176Sdrh if( pExpr==0 ) return 0; 317cce7d176Sdrh if( pIsAgg ) *pIsAgg = 0; 318cce7d176Sdrh switch( pExpr->op ){ 319cce7d176Sdrh case TK_FUNCTION: { 320cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 321cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 322cce7d176Sdrh int no_such_func = 0; 323cce7d176Sdrh int too_many_args = 0; 324cce7d176Sdrh int too_few_args = 0; 325cce7d176Sdrh int is_agg = 0; 326cce7d176Sdrh int i; 327cce7d176Sdrh switch( id ){ 328cce7d176Sdrh case FN_Unknown: { 329cce7d176Sdrh no_such_func = 1; 330cce7d176Sdrh break; 331cce7d176Sdrh } 332cce7d176Sdrh case FN_Count: { 333cce7d176Sdrh no_such_func = !allowAgg; 334cce7d176Sdrh too_many_args = n>1; 335cce7d176Sdrh is_agg = 1; 336cce7d176Sdrh break; 337cce7d176Sdrh } 338cce7d176Sdrh case FN_Max: 339cce7d176Sdrh case FN_Min: { 340cce7d176Sdrh too_few_args = allowAgg ? n<1 : n<2; 341cce7d176Sdrh is_agg = n==1; 342cce7d176Sdrh break; 343cce7d176Sdrh } 344cce7d176Sdrh case FN_Sum: { 345cce7d176Sdrh no_such_func = !allowAgg; 346cce7d176Sdrh too_many_args = n>1; 347cce7d176Sdrh too_few_args = n<1; 348cce7d176Sdrh is_agg = 1; 349cce7d176Sdrh break; 350cce7d176Sdrh } 351cce7d176Sdrh default: break; 352cce7d176Sdrh } 353cce7d176Sdrh if( no_such_func ){ 354cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 355cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 356cce7d176Sdrh pParse->nErr++; 357cce7d176Sdrh nErr++; 358cce7d176Sdrh }else if( too_many_args ){ 359cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 360cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 361cce7d176Sdrh pParse->nErr++; 362cce7d176Sdrh nErr++; 363cce7d176Sdrh }else if( too_few_args ){ 364cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 365cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 366cce7d176Sdrh pParse->nErr++; 367cce7d176Sdrh nErr++; 368cce7d176Sdrh } 369cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 370cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 371cce7d176Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 0, 0); 372cce7d176Sdrh } 373cce7d176Sdrh } 374cce7d176Sdrh default: { 375cce7d176Sdrh if( pExpr->pLeft ){ 376cce7d176Sdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, 0, 0); 377cce7d176Sdrh } 378cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 379cce7d176Sdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, 0, 0); 380cce7d176Sdrh } 381*fef5208cSdrh if( nErr==0 && pExpr->pList ){ 382*fef5208cSdrh int n = pExpr->pList->nExpr; 383*fef5208cSdrh int i; 384*fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 385*fef5208cSdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 0, 0); 386*fef5208cSdrh } 387*fef5208cSdrh } 388cce7d176Sdrh break; 389cce7d176Sdrh } 390cce7d176Sdrh } 391cce7d176Sdrh return nErr; 392cce7d176Sdrh } 393cce7d176Sdrh 394cce7d176Sdrh /* 395cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 396cce7d176Sdrh ** expression and leave the result on the stack. 397cce7d176Sdrh */ 398cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 399cce7d176Sdrh Vdbe *v = pParse->pVdbe; 400cce7d176Sdrh int op; 401cce7d176Sdrh switch( pExpr->op ){ 402cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 403cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 404cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 405cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 406cce7d176Sdrh case TK_AND: op = OP_And; break; 407cce7d176Sdrh case TK_OR: op = OP_Or; break; 408cce7d176Sdrh case TK_LT: op = OP_Lt; break; 409cce7d176Sdrh case TK_LE: op = OP_Le; break; 410cce7d176Sdrh case TK_GT: op = OP_Gt; break; 411cce7d176Sdrh case TK_GE: op = OP_Ge; break; 412cce7d176Sdrh case TK_NE: op = OP_Ne; break; 413cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 414cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 415cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 416cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 417cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 418cce7d176Sdrh case TK_NOT: op = OP_Not; break; 419cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 420cce7d176Sdrh default: break; 421cce7d176Sdrh } 422cce7d176Sdrh switch( pExpr->op ){ 423cce7d176Sdrh case TK_FIELD: { 424cce7d176Sdrh sqliteVdbeAddOp(v, OP_Field, pExpr->iTable, pExpr->iField, 0, 0); 425cce7d176Sdrh break; 426cce7d176Sdrh } 427cce7d176Sdrh case TK_INTEGER: { 428cce7d176Sdrh int i = atoi(pExpr->token.z); 429cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, i, 0, 0, 0); 430cce7d176Sdrh break; 431cce7d176Sdrh } 432cce7d176Sdrh case TK_FLOAT: { 433cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 434cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 435cce7d176Sdrh break; 436cce7d176Sdrh } 437cce7d176Sdrh case TK_STRING: { 438cce7d176Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0, 0, 0); 439cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 440cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 441cce7d176Sdrh break; 442cce7d176Sdrh } 443cce7d176Sdrh case TK_NULL: { 444c61053b7Sdrh sqliteVdbeAddOp(v, OP_Null, 0, 0, 0, 0); 445cce7d176Sdrh break; 446cce7d176Sdrh } 447cce7d176Sdrh case TK_AND: 448cce7d176Sdrh case TK_OR: 449cce7d176Sdrh case TK_PLUS: 450cce7d176Sdrh case TK_STAR: 451cce7d176Sdrh case TK_MINUS: 452cce7d176Sdrh case TK_SLASH: { 453cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 454cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 455cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 456cce7d176Sdrh break; 457cce7d176Sdrh } 458cce7d176Sdrh case TK_LT: 459cce7d176Sdrh case TK_LE: 460cce7d176Sdrh case TK_GT: 461cce7d176Sdrh case TK_GE: 462cce7d176Sdrh case TK_NE: 463cce7d176Sdrh case TK_EQ: 464cce7d176Sdrh case TK_LIKE: 465cce7d176Sdrh case TK_GLOB: { 466cce7d176Sdrh int dest; 467cce7d176Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 468cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 469cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 470cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 471cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 472cce7d176Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 473cce7d176Sdrh break; 474cce7d176Sdrh } 475cce7d176Sdrh case TK_NOT: 476cce7d176Sdrh case TK_UMINUS: { 477cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 478cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 479cce7d176Sdrh break; 480cce7d176Sdrh } 481cce7d176Sdrh case TK_ISNULL: 482cce7d176Sdrh case TK_NOTNULL: { 483cce7d176Sdrh int dest; 4848be51133Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0, 0, 0); 485cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 486cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 487cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 4888be51133Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0); 489cce7d176Sdrh break; 490cce7d176Sdrh } 491cce7d176Sdrh case TK_FUNCTION: { 492cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 493cce7d176Sdrh int op; 494cce7d176Sdrh int i; 495cce7d176Sdrh ExprList *pList = pExpr->pList; 496cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 497cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 498cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 499cce7d176Sdrh if( i>0 ){ 500cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, 0, 0, 0); 501cce7d176Sdrh } 502cce7d176Sdrh } 503cce7d176Sdrh break; 504cce7d176Sdrh } 50519a775c2Sdrh case TK_SELECT: { 50619a775c2Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iField, 0, 0, 0); 50719a775c2Sdrh break; 50819a775c2Sdrh } 509*fef5208cSdrh case TK_IN: { 510*fef5208cSdrh int addr; 511*fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 512*fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 513*fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 514*fef5208cSdrh if( pExpr->pSelect ){ 515*fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2, 0, 0); 516*fef5208cSdrh }else{ 517*fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2, 0, 0); 518*fef5208cSdrh } 519*fef5208cSdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0); 520*fef5208cSdrh break; 521*fef5208cSdrh } 522*fef5208cSdrh case TK_BETWEEN: { 523*fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 524*fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 525*fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 526*fef5208cSdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0, 0, 0); 527*fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 528*fef5208cSdrh break; 529*fef5208cSdrh } 530cce7d176Sdrh } 531cce7d176Sdrh return; 532cce7d176Sdrh } 533cce7d176Sdrh 534cce7d176Sdrh /* 535cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 536cce7d176Sdrh ** to the label "dest" if the expression is true but execution 537cce7d176Sdrh ** continues straight thru if the expression is false. 538cce7d176Sdrh */ 539cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 540cce7d176Sdrh Vdbe *v = pParse->pVdbe; 541cce7d176Sdrh int op = 0; 542cce7d176Sdrh switch( pExpr->op ){ 543cce7d176Sdrh case TK_LT: op = OP_Lt; break; 544cce7d176Sdrh case TK_LE: op = OP_Le; break; 545cce7d176Sdrh case TK_GT: op = OP_Gt; break; 546cce7d176Sdrh case TK_GE: op = OP_Ge; break; 547cce7d176Sdrh case TK_NE: op = OP_Ne; break; 548cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 549cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 550cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 551cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 552cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 553cce7d176Sdrh default: break; 554cce7d176Sdrh } 555cce7d176Sdrh switch( pExpr->op ){ 556cce7d176Sdrh case TK_AND: { 557cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 558cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 559cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 560cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 561cce7d176Sdrh break; 562cce7d176Sdrh } 563cce7d176Sdrh case TK_OR: { 564cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 565cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 566cce7d176Sdrh break; 567cce7d176Sdrh } 568cce7d176Sdrh case TK_NOT: { 569cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 570cce7d176Sdrh break; 571cce7d176Sdrh } 572cce7d176Sdrh case TK_LT: 573cce7d176Sdrh case TK_LE: 574cce7d176Sdrh case TK_GT: 575cce7d176Sdrh case TK_GE: 576cce7d176Sdrh case TK_NE: 577cce7d176Sdrh case TK_EQ: 578cce7d176Sdrh case TK_LIKE: 579cce7d176Sdrh case TK_GLOB: { 580cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 581cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 582cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 583cce7d176Sdrh break; 584cce7d176Sdrh } 585cce7d176Sdrh case TK_ISNULL: 586cce7d176Sdrh case TK_NOTNULL: { 587cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 588cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 589cce7d176Sdrh break; 590cce7d176Sdrh } 591*fef5208cSdrh case TK_IN: { 592*fef5208cSdrh if( pExpr->pSelect ){ 593*fef5208cSdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest, 0, 0); 594*fef5208cSdrh }else{ 595*fef5208cSdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest, 0, 0); 596*fef5208cSdrh } 597*fef5208cSdrh break; 598*fef5208cSdrh } 599*fef5208cSdrh case TK_BETWEEN: { 600*fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 601*fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 602*fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 603*fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 604*fef5208cSdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl, 0, 0); 605*fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 606*fef5208cSdrh sqliteVdbeAddOp(v, OP_Le, 0, dest, 0, 0); 607*fef5208cSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0, 0, 0); 608*fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, lbl); 609*fef5208cSdrh break; 610*fef5208cSdrh } 611cce7d176Sdrh default: { 612cce7d176Sdrh sqliteExprCode(pParse, pExpr); 613cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 614cce7d176Sdrh break; 615cce7d176Sdrh } 616cce7d176Sdrh } 617cce7d176Sdrh } 618cce7d176Sdrh 619cce7d176Sdrh /* 620cce7d176Sdrh ** Generate code for boolean expression such that a jump is made 621cce7d176Sdrh ** to the label "dest" if the expression is false but execution 622cce7d176Sdrh ** continues straight thru if the expression is true. 623cce7d176Sdrh */ 624cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 625cce7d176Sdrh Vdbe *v = pParse->pVdbe; 626cce7d176Sdrh int op = 0; 627cce7d176Sdrh switch( pExpr->op ){ 628cce7d176Sdrh case TK_LT: op = OP_Ge; break; 629cce7d176Sdrh case TK_LE: op = OP_Gt; break; 630cce7d176Sdrh case TK_GT: op = OP_Le; break; 631cce7d176Sdrh case TK_GE: op = OP_Lt; break; 632cce7d176Sdrh case TK_NE: op = OP_Eq; break; 633cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 634cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 635cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 636cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 637cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 638cce7d176Sdrh default: break; 639cce7d176Sdrh } 640cce7d176Sdrh switch( pExpr->op ){ 641cce7d176Sdrh case TK_AND: { 642cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 643cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 644cce7d176Sdrh break; 645cce7d176Sdrh } 646cce7d176Sdrh case TK_OR: { 647cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 648cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 649cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 650cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 651cce7d176Sdrh break; 652cce7d176Sdrh } 653cce7d176Sdrh case TK_NOT: { 654cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 655cce7d176Sdrh break; 656cce7d176Sdrh } 657cce7d176Sdrh case TK_LT: 658cce7d176Sdrh case TK_LE: 659cce7d176Sdrh case TK_GT: 660cce7d176Sdrh case TK_GE: 661cce7d176Sdrh case TK_NE: 662cce7d176Sdrh case TK_EQ: { 663cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 664cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 665cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 666cce7d176Sdrh break; 667cce7d176Sdrh } 668cce7d176Sdrh case TK_LIKE: 669cce7d176Sdrh case TK_GLOB: { 670cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 671cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 672cce7d176Sdrh sqliteVdbeAddOp(v, op, 1, dest, 0, 0); 673cce7d176Sdrh break; 674cce7d176Sdrh } 675cce7d176Sdrh case TK_ISNULL: 676cce7d176Sdrh case TK_NOTNULL: { 677cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 678cce7d176Sdrh sqliteVdbeAddOp(v, op, 0, dest, 0, 0); 679cce7d176Sdrh break; 680cce7d176Sdrh } 681*fef5208cSdrh case TK_IN: { 682*fef5208cSdrh if( pExpr->pSelect ){ 683*fef5208cSdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest, 0, 0); 684*fef5208cSdrh }else{ 685*fef5208cSdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest, 0, 0); 686*fef5208cSdrh } 687*fef5208cSdrh break; 688*fef5208cSdrh } 689*fef5208cSdrh case TK_BETWEEN: { 690*fef5208cSdrh int addr; 691*fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 692*fef5208cSdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0, 0, 0); 693*fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 694*fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 695*fef5208cSdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3, 0, 0); 696*fef5208cSdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0, 0, 0); 697*fef5208cSdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest, 0, 0); 698*fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 699*fef5208cSdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest, 0, 0); 700*fef5208cSdrh break; 701*fef5208cSdrh } 702cce7d176Sdrh default: { 703cce7d176Sdrh sqliteExprCode(pParse, pExpr); 704cce7d176Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0, 0, 0); 705cce7d176Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest, 0, 0); 706cce7d176Sdrh break; 707cce7d176Sdrh } 708cce7d176Sdrh } 709cce7d176Sdrh } 710