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*2f2c01e5Sdrh ** $Id: expr.c,v 1.77 2002/07/02 13:05:05 drh Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 1804738cb9Sdrh #include <ctype.h> 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; 1243b167c75Sdrh if( !p->staticToken ){ 125a76b5dfcSdrh if( p->token.z ) p->token.z += offset; 126a76b5dfcSdrh if( p->span.z ) p->span.z += offset; 1273b167c75Sdrh } 128a76b5dfcSdrh if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset); 129a76b5dfcSdrh if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset); 130a76b5dfcSdrh if( p->pList ) sqliteExprListMoveStrings(p->pList, offset); 131a76b5dfcSdrh if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset); 132a76b5dfcSdrh } 133a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){ 134a76b5dfcSdrh int i; 135a76b5dfcSdrh if( pList==0 ) return; 136a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 137a76b5dfcSdrh sqliteExprMoveStrings(pList->a[i].pExpr, offset); 138a76b5dfcSdrh } 139a76b5dfcSdrh } 140a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){ 141a76b5dfcSdrh if( pSelect==0 ) return; 142a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pEList, offset); 143a76b5dfcSdrh sqliteExprMoveStrings(pSelect->pWhere, offset); 144a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pGroupBy, offset); 145a76b5dfcSdrh sqliteExprMoveStrings(pSelect->pHaving, offset); 146a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pOrderBy, offset); 147a76b5dfcSdrh sqliteSelectMoveStrings(pSelect->pPrior, offset); 148a76b5dfcSdrh } 149a76b5dfcSdrh 150a76b5dfcSdrh /* 151ff78bd2fSdrh ** The following group of routines make deep copies of expressions, 152ff78bd2fSdrh ** expression lists, ID lists, and select statements. The copies can 153ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines) 154ff78bd2fSdrh ** without effecting the originals. 155ff78bd2fSdrh ** 156ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to 157ff78bd2fSdrh ** string space that is allocated separately from the expression tree 158ff78bd2fSdrh ** itself. These routines do NOT duplicate that string space. 159ff78bd2fSdrh ** 160ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(), 161ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded 162ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines. 163ff78bd2fSdrh ** 164ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated. 165ff78bd2fSdrh */ 166ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){ 167ff78bd2fSdrh Expr *pNew; 168ff78bd2fSdrh if( p==0 ) return 0; 169ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 170ff78bd2fSdrh if( pNew==0 ) return 0; 1713b167c75Sdrh memcpy(pNew, p, sizeof(*pNew)); 172ff78bd2fSdrh pNew->pLeft = sqliteExprDup(p->pLeft); 173ff78bd2fSdrh pNew->pRight = sqliteExprDup(p->pRight); 174ff78bd2fSdrh pNew->pList = sqliteExprListDup(p->pList); 175ff78bd2fSdrh pNew->pSelect = sqliteSelectDup(p->pSelect); 176ff78bd2fSdrh return pNew; 177ff78bd2fSdrh } 178ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){ 179ff78bd2fSdrh ExprList *pNew; 180ff78bd2fSdrh int i; 181ff78bd2fSdrh if( p==0 ) return 0; 182ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 183ff78bd2fSdrh if( pNew==0 ) return 0; 184ff78bd2fSdrh pNew->nExpr = p->nExpr; 185ff78bd2fSdrh pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); 186e4697f5eSdrh if( pNew->a==0 ) return 0; 187ff78bd2fSdrh for(i=0; i<p->nExpr; i++){ 188ff78bd2fSdrh pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr); 189ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 190ff78bd2fSdrh pNew->a[i].sortOrder = p->a[i].sortOrder; 191ff78bd2fSdrh pNew->a[i].isAgg = p->a[i].isAgg; 192ff78bd2fSdrh pNew->a[i].done = 0; 193ff78bd2fSdrh } 194ff78bd2fSdrh return pNew; 195ff78bd2fSdrh } 196ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){ 197ad3cab52Sdrh SrcList *pNew; 198ad3cab52Sdrh int i; 199ad3cab52Sdrh if( p==0 ) return 0; 200ad3cab52Sdrh pNew = sqliteMalloc( sizeof(*pNew) ); 201ad3cab52Sdrh if( pNew==0 ) return 0; 202ad3cab52Sdrh pNew->nSrc = p->nSrc; 203ad3cab52Sdrh pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) ); 2046f34903eSdanielk1977 if( pNew->a==0 && p->nSrc != 0 ) return 0; 205ad3cab52Sdrh for(i=0; i<p->nSrc; i++){ 206ad3cab52Sdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 207ad3cab52Sdrh pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias); 208ad3cab52Sdrh pNew->a[i].jointype = p->a[i].jointype; 209ad3cab52Sdrh pNew->a[i].pTab = 0; 210ad3cab52Sdrh pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect); 211ad3cab52Sdrh pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn); 212ad3cab52Sdrh pNew->a[i].pUsing = sqliteIdListDup(p->a[i].pUsing); 213ad3cab52Sdrh } 214ad3cab52Sdrh return pNew; 215ad3cab52Sdrh } 216ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){ 217ff78bd2fSdrh IdList *pNew; 218ff78bd2fSdrh int i; 219ff78bd2fSdrh if( p==0 ) return 0; 220ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 221ff78bd2fSdrh if( pNew==0 ) return 0; 222ff78bd2fSdrh pNew->nId = p->nId; 223ff78bd2fSdrh pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) ); 224e4697f5eSdrh if( pNew->a==0 ) return 0; 225ff78bd2fSdrh for(i=0; i<p->nId; i++){ 226ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 227ff78bd2fSdrh pNew->a[i].idx = p->a[i].idx; 228ff78bd2fSdrh } 229ff78bd2fSdrh return pNew; 230ff78bd2fSdrh } 231ff78bd2fSdrh Select *sqliteSelectDup(Select *p){ 232ff78bd2fSdrh Select *pNew; 233ff78bd2fSdrh if( p==0 ) return 0; 234ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 235ff78bd2fSdrh if( pNew==0 ) return 0; 236ff78bd2fSdrh pNew->isDistinct = p->isDistinct; 237ff78bd2fSdrh pNew->pEList = sqliteExprListDup(p->pEList); 238ad3cab52Sdrh pNew->pSrc = sqliteSrcListDup(p->pSrc); 239ff78bd2fSdrh pNew->pWhere = sqliteExprDup(p->pWhere); 240ff78bd2fSdrh pNew->pGroupBy = sqliteExprListDup(p->pGroupBy); 241ff78bd2fSdrh pNew->pHaving = sqliteExprDup(p->pHaving); 242ff78bd2fSdrh pNew->pOrderBy = sqliteExprListDup(p->pOrderBy); 243ff78bd2fSdrh pNew->op = p->op; 244ff78bd2fSdrh pNew->pPrior = sqliteSelectDup(p->pPrior); 245ff78bd2fSdrh pNew->nLimit = p->nLimit; 246ff78bd2fSdrh pNew->nOffset = p->nOffset; 247ff78bd2fSdrh pNew->zSelect = 0; 248ff78bd2fSdrh return pNew; 249ff78bd2fSdrh } 250ff78bd2fSdrh 251ff78bd2fSdrh 252ff78bd2fSdrh /* 253a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 254a76b5dfcSdrh ** initially NULL, then create a new expression list. 255a76b5dfcSdrh */ 256a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 257a76b5dfcSdrh int i; 258a76b5dfcSdrh if( pList==0 ){ 259a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 260a76b5dfcSdrh if( pList==0 ){ 261a76b5dfcSdrh sqliteExprDelete(pExpr); 262a76b5dfcSdrh return 0; 263a76b5dfcSdrh } 264a76b5dfcSdrh } 265a76b5dfcSdrh if( (pList->nExpr & 7)==0 ){ 266a76b5dfcSdrh int n = pList->nExpr + 8; 267a76b5dfcSdrh struct ExprList_item *a; 268a76b5dfcSdrh a = sqliteRealloc(pList->a, n*sizeof(pList->a[0])); 269a76b5dfcSdrh if( a==0 ){ 270a76b5dfcSdrh sqliteExprDelete(pExpr); 271a76b5dfcSdrh return pList; 272a76b5dfcSdrh } 273a76b5dfcSdrh pList->a = a; 274a76b5dfcSdrh } 275a76b5dfcSdrh if( pExpr || pName ){ 276a76b5dfcSdrh i = pList->nExpr++; 277a76b5dfcSdrh pList->a[i].pExpr = pExpr; 278a76b5dfcSdrh pList->a[i].zName = 0; 279a76b5dfcSdrh if( pName ){ 280a76b5dfcSdrh sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0); 281a76b5dfcSdrh sqliteDequote(pList->a[i].zName); 282a76b5dfcSdrh } 283a76b5dfcSdrh } 284a76b5dfcSdrh return pList; 285a76b5dfcSdrh } 286a76b5dfcSdrh 287a76b5dfcSdrh /* 288a76b5dfcSdrh ** Delete an entire expression list. 289a76b5dfcSdrh */ 290a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){ 291a76b5dfcSdrh int i; 292a76b5dfcSdrh if( pList==0 ) return; 293a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 294a76b5dfcSdrh sqliteExprDelete(pList->a[i].pExpr); 295a76b5dfcSdrh sqliteFree(pList->a[i].zName); 296a76b5dfcSdrh } 297a76b5dfcSdrh sqliteFree(pList->a); 298a76b5dfcSdrh sqliteFree(pList); 299a76b5dfcSdrh } 300a76b5dfcSdrh 301a76b5dfcSdrh /* 302fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 303fef5208cSdrh ** and 0 if it involves variables. 3042398937bSdrh ** 3052398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc") 3062398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is 3072398937bSdrh ** a constant. 308fef5208cSdrh */ 3099208643dSdrh int sqliteExprIsConstant(Expr *p){ 310fef5208cSdrh switch( p->op ){ 311fef5208cSdrh case TK_ID: 312967e8b73Sdrh case TK_COLUMN: 313fef5208cSdrh case TK_DOT: 314fef5208cSdrh return 0; 3152398937bSdrh case TK_STRING: 3162398937bSdrh return p->token.z[0]=='\''; 3179208643dSdrh case TK_INTEGER: 3189208643dSdrh case TK_FLOAT: 3199208643dSdrh return 1; 320fef5208cSdrh default: { 3219208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 3229208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 323fef5208cSdrh if( p->pList ){ 324fef5208cSdrh int i; 325fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 3269208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 327fef5208cSdrh } 328fef5208cSdrh } 3299208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 330fef5208cSdrh } 331fef5208cSdrh } 3329208643dSdrh return 0; 333fef5208cSdrh } 334fef5208cSdrh 335fef5208cSdrh /* 336e4de1febSdrh ** If the given expression codes a constant integer, return 1 and put 337e4de1febSdrh ** the value of the integer in *pValue. If the expression is not an 338e4de1febSdrh ** integer, return 0 and leave *pValue unchanged. 339e4de1febSdrh */ 340e4de1febSdrh int sqliteExprIsInteger(Expr *p, int *pValue){ 341e4de1febSdrh switch( p->op ){ 342e4de1febSdrh case TK_INTEGER: { 343e4de1febSdrh *pValue = atoi(p->token.z); 344e4de1febSdrh return 1; 345e4de1febSdrh } 346e4de1febSdrh case TK_STRING: { 347bd790ee3Sdrh const char *z = p->token.z; 348e4de1febSdrh int n = p->token.n; 349bd790ee3Sdrh if( n>0 && z[0]=='-' ){ z++; n--; } 350e4de1febSdrh while( n>0 && *z && isdigit(*z) ){ z++; n--; } 351e4de1febSdrh if( n==0 ){ 352e4de1febSdrh *pValue = atoi(p->token.z); 353e4de1febSdrh return 1; 354e4de1febSdrh } 355e4de1febSdrh break; 356e4de1febSdrh } 357e4de1febSdrh case TK_UMINUS: { 358e4de1febSdrh int v; 359e4de1febSdrh if( sqliteExprIsInteger(p->pLeft, &v) ){ 360e4de1febSdrh *pValue = -v; 361e4de1febSdrh return 1; 362e4de1febSdrh } 363e4de1febSdrh break; 364e4de1febSdrh } 365e4de1febSdrh default: break; 366e4de1febSdrh } 367e4de1febSdrh return 0; 368e4de1febSdrh } 369e4de1febSdrh 370e4de1febSdrh /* 371c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 372c4a3c779Sdrh */ 373a9f9d1c0Sdrh int sqliteIsRowid(const char *z){ 374c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 375c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 376c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 377c4a3c779Sdrh return 0; 378c4a3c779Sdrh } 379c4a3c779Sdrh 380c4a3c779Sdrh /* 381cce7d176Sdrh ** This routine walks an expression tree and resolves references to 382967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 383aacc543eSdrh ** index to the table in the table list and a column offset. The 384aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 385aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 386832508b7Sdrh ** plus the "base" value. The base value will ultimately become the 387aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 388aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 389aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 390aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 391aacc543eSdrh ** alias for ROWID. 39219a775c2Sdrh ** 393fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 394fef5208cSdrh ** forms: 395fef5208cSdrh ** 396fef5208cSdrh ** expr IN (exprlist) 397fef5208cSdrh ** and 398fef5208cSdrh ** expr IN (SELECT ...) 399fef5208cSdrh ** 400fef5208cSdrh ** The first form is handled by creating a set holding the list 401fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 402fef5208cSdrh ** a temporary table. 403fef5208cSdrh ** 404fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 40519a775c2Sdrh ** If it finds any, it generates code to write the value of that select 40619a775c2Sdrh ** into a memory cell. 407cce7d176Sdrh ** 408967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 409cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 410cce7d176Sdrh */ 411a2e00042Sdrh int sqliteExprResolveIds( 412a2e00042Sdrh Parse *pParse, /* The parser context */ 413832508b7Sdrh int base, /* VDBE cursor number for first entry in pTabList */ 414ad3cab52Sdrh SrcList *pTabList, /* List of tables used to resolve column names */ 415a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 416a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 417a2e00042Sdrh ){ 418daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 419ad3cab52Sdrh assert( base+pTabList->nSrc<=pParse->nTab ); 420cce7d176Sdrh switch( pExpr->op ){ 4212398937bSdrh /* Double-quoted strings (ex: "abc") are used as identifiers if 4222398937bSdrh ** possible. Otherwise they remain as strings. Single-quoted 4232398937bSdrh ** strings (ex: 'abc') are always string literals. 4242398937bSdrh */ 4252398937bSdrh case TK_STRING: { 4262398937bSdrh if( pExpr->token.z[0]=='\'' ) break; 4272398937bSdrh /* Fall thru into the TK_ID case if this is a double-quoted string */ 4282398937bSdrh } 429a2e00042Sdrh /* A lone identifier. Try and match it as follows: 430a2e00042Sdrh ** 431a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 432a2e00042Sdrh ** 433a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 434a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 435a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 436a2e00042Sdrh ** 437a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 438a2e00042Sdrh */ 439cce7d176Sdrh case TK_ID: { 440cce7d176Sdrh int cnt = 0; /* Number of matches */ 441cce7d176Sdrh int i; /* Loop counter */ 442a76b5dfcSdrh char *z; 443a76b5dfcSdrh assert( pExpr->token.z ); 444a76b5dfcSdrh z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 4452f4392ffSdrh sqliteDequote(z); 446daffd0e5Sdrh if( z==0 ) return 1; 447ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 448cce7d176Sdrh int j; 449cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 450cce7d176Sdrh if( pTab==0 ) continue; 451417be79cSdrh assert( pTab->nCol>0 ); 452cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 4537020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 454cce7d176Sdrh cnt++; 455832508b7Sdrh pExpr->iTable = i + base; 4564a32431cSdrh if( j==pTab->iPKey ){ 4574a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 4584a32431cSdrh pExpr->iColumn = -1; 459c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 4604a32431cSdrh }else{ 461967e8b73Sdrh pExpr->iColumn = j; 462c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 463cce7d176Sdrh } 464a2e00042Sdrh pExpr->op = TK_COLUMN; 465a2e00042Sdrh } 466a2e00042Sdrh } 467a2e00042Sdrh } 468a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 469a2e00042Sdrh int j; 470a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 471a2e00042Sdrh char *zAs = pEList->a[j].zName; 472a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 473a2e00042Sdrh cnt++; 474a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 475a2e00042Sdrh pExpr->op = TK_AS; 476a2e00042Sdrh pExpr->iColumn = j; 47775148a27Sdrh pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr); 478cce7d176Sdrh } 479cce7d176Sdrh } 4804a32431cSdrh } 481c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 482c4a3c779Sdrh pExpr->iColumn = -1; 483832508b7Sdrh pExpr->iTable = base; 484ad3cab52Sdrh cnt = 1 + (pTabList->nSrc>1); 485a2e00042Sdrh pExpr->op = TK_COLUMN; 486c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 487c4a3c779Sdrh } 488cce7d176Sdrh sqliteFree(z); 4892398937bSdrh if( cnt==0 && pExpr->token.z[0]!='"' ){ 490967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 491cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 492cce7d176Sdrh pParse->nErr++; 493cce7d176Sdrh return 1; 494cce7d176Sdrh }else if( cnt>1 ){ 495967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 496cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 497cce7d176Sdrh pParse->nErr++; 498cce7d176Sdrh return 1; 499cce7d176Sdrh } 500cce7d176Sdrh break; 501cce7d176Sdrh } 502cce7d176Sdrh 503967e8b73Sdrh /* A table name and column name: ID.ID */ 504cce7d176Sdrh case TK_DOT: { 505cce7d176Sdrh int cnt = 0; /* Number of matches */ 506c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 507cce7d176Sdrh int i; /* Loop counter */ 508cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 509cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 510cce7d176Sdrh 511cce7d176Sdrh pLeft = pExpr->pLeft; 512cce7d176Sdrh pRight = pExpr->pRight; 513a76b5dfcSdrh assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); 514a76b5dfcSdrh assert( pRight && pRight->op==TK_ID && pRight->token.z ); 5156e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 5166e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 517daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 518daffd0e5Sdrh sqliteFree(zLeft); 519daffd0e5Sdrh sqliteFree(zRight); 520daffd0e5Sdrh return 1; 521daffd0e5Sdrh } 52287c40e88Sdrh sqliteDequote(zLeft); 52387c40e88Sdrh sqliteDequote(zRight); 524c4a3c779Sdrh pExpr->iTable = -1; 525ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 526cce7d176Sdrh int j; 527cce7d176Sdrh char *zTab; 528cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 529cce7d176Sdrh if( pTab==0 ) continue; 530417be79cSdrh assert( pTab->nCol>0 ); 531cce7d176Sdrh if( pTabList->a[i].zAlias ){ 532cce7d176Sdrh zTab = pTabList->a[i].zAlias; 533cce7d176Sdrh }else{ 534cce7d176Sdrh zTab = pTab->zName; 535cce7d176Sdrh } 536094b2bbfSdrh if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; 537832508b7Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + base; 538cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 5397020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 540cce7d176Sdrh cnt++; 541832508b7Sdrh pExpr->iTable = i + base; 5424a32431cSdrh if( j==pTab->iPKey ){ 5434a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 5444a32431cSdrh pExpr->iColumn = -1; 5454a32431cSdrh }else{ 546967e8b73Sdrh pExpr->iColumn = j; 547cce7d176Sdrh } 548c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 549cce7d176Sdrh } 550cce7d176Sdrh } 5514a32431cSdrh } 552c3f9bad2Sdanielk1977 553c3f9bad2Sdanielk1977 /* If we have not already resolved this *.* expression, then maybe 554c3f9bad2Sdanielk1977 * it is a new.* or old.* trigger argument reference */ 555c3f9bad2Sdanielk1977 if( cnt == 0 && pParse->trigStack != 0 ){ 556f29ce559Sdanielk1977 TriggerStack *pTriggerStack = pParse->trigStack; 557c3f9bad2Sdanielk1977 int t = 0; 558f29ce559Sdanielk1977 if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){ 559f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->newIdx; 560c3f9bad2Sdanielk1977 cntTab++; 561c3f9bad2Sdanielk1977 t = 1; 562c3f9bad2Sdanielk1977 } 563f29ce559Sdanielk1977 if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){ 564f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->oldIdx; 565c3f9bad2Sdanielk1977 cntTab++; 566c3f9bad2Sdanielk1977 t = 1; 567c3f9bad2Sdanielk1977 } 568c3f9bad2Sdanielk1977 569f29ce559Sdanielk1977 if( t ){ 570f29ce559Sdanielk1977 int j; 571c9b84a1fSdrh Table *pTab = pTriggerStack->pTab; 572c9b84a1fSdrh for(j=0; j < pTab->nCol; j++) { 573c9b84a1fSdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 574c3f9bad2Sdanielk1977 cnt++; 575c3f9bad2Sdanielk1977 pExpr->iColumn = j; 576c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 577c3f9bad2Sdanielk1977 } 578c3f9bad2Sdanielk1977 } 579c3f9bad2Sdanielk1977 } 580f29ce559Sdanielk1977 } 581c3f9bad2Sdanielk1977 582c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 583c4a3c779Sdrh cnt = 1; 584c4a3c779Sdrh pExpr->iColumn = -1; 585c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 586c4a3c779Sdrh } 587cce7d176Sdrh sqliteFree(zLeft); 588cce7d176Sdrh sqliteFree(zRight); 589cce7d176Sdrh if( cnt==0 ){ 590967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 591cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 592cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 593cce7d176Sdrh pParse->nErr++; 594cce7d176Sdrh return 1; 595cce7d176Sdrh }else if( cnt>1 ){ 596967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 597cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 598cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 599cce7d176Sdrh pParse->nErr++; 600cce7d176Sdrh return 1; 601cce7d176Sdrh } 602cce7d176Sdrh sqliteExprDelete(pLeft); 603cce7d176Sdrh pExpr->pLeft = 0; 604cce7d176Sdrh sqliteExprDelete(pRight); 605cce7d176Sdrh pExpr->pRight = 0; 606967e8b73Sdrh pExpr->op = TK_COLUMN; 607cce7d176Sdrh break; 608cce7d176Sdrh } 609cce7d176Sdrh 610fef5208cSdrh case TK_IN: { 611d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 612fef5208cSdrh if( v==0 ) return 1; 613832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 614cfab11bcSdrh return 1; 615cfab11bcSdrh } 616fef5208cSdrh if( pExpr->pSelect ){ 617fef5208cSdrh /* Case 1: expr IN (SELECT ...) 618fef5208cSdrh ** 619fef5208cSdrh ** Generate code to write the results of the select into a temporary 6204794b980Sdrh ** table. The cursor number of the temporary table has already 6214794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 622fef5208cSdrh */ 623832508b7Sdrh pExpr->iTable = pParse->nTab++; 624c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 625832508b7Sdrh sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0); 626fef5208cSdrh }else if( pExpr->pList ){ 627fef5208cSdrh /* Case 2: expr IN (exprlist) 628fef5208cSdrh ** 629fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 630fef5208cSdrh ** in iTable. 631fef5208cSdrh */ 632fef5208cSdrh int i, iSet; 633fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 634fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 6359208643dSdrh if( !sqliteExprIsConstant(pE2) ){ 636fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 637fef5208cSdrh "right-hand side of IN operator must be constant", 0); 638fef5208cSdrh pParse->nErr++; 639fef5208cSdrh return 1; 640fef5208cSdrh } 6414794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 6424794b980Sdrh return 1; 6434794b980Sdrh } 644fef5208cSdrh } 645fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 646fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 647fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 648fef5208cSdrh switch( pE2->op ){ 649fef5208cSdrh case TK_FLOAT: 650fef5208cSdrh case TK_INTEGER: 651fef5208cSdrh case TK_STRING: { 65299fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 653a76b5dfcSdrh assert( pE2->token.z ); 654fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 655fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 656fef5208cSdrh break; 657fef5208cSdrh } 658fef5208cSdrh default: { 659fef5208cSdrh sqliteExprCode(pParse, pE2); 66099fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 661fef5208cSdrh break; 662fef5208cSdrh } 663fef5208cSdrh } 664fef5208cSdrh } 665fef5208cSdrh } 666cfab11bcSdrh break; 667fef5208cSdrh } 668fef5208cSdrh 66919a775c2Sdrh case TK_SELECT: { 670fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 671fef5208cSdrh ** value of this select in a memory cell and record the number 672967e8b73Sdrh ** of the memory cell in iColumn. 673fef5208cSdrh */ 674967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 675832508b7Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){ 67619a775c2Sdrh return 1; 67719a775c2Sdrh } 67819a775c2Sdrh break; 67919a775c2Sdrh } 68019a775c2Sdrh 681cce7d176Sdrh /* For all else, just recursively walk the tree */ 682cce7d176Sdrh default: { 683cce7d176Sdrh if( pExpr->pLeft 684832508b7Sdrh && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 685cce7d176Sdrh return 1; 686cce7d176Sdrh } 687cce7d176Sdrh if( pExpr->pRight 688832508b7Sdrh && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){ 689cce7d176Sdrh return 1; 690cce7d176Sdrh } 691cce7d176Sdrh if( pExpr->pList ){ 692cce7d176Sdrh int i; 693cce7d176Sdrh ExprList *pList = pExpr->pList; 694cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 695832508b7Sdrh Expr *pArg = pList->a[i].pExpr; 696832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){ 697cce7d176Sdrh return 1; 698cce7d176Sdrh } 699cce7d176Sdrh } 700cce7d176Sdrh } 701cce7d176Sdrh } 702cce7d176Sdrh } 703cce7d176Sdrh return 0; 704cce7d176Sdrh } 705cce7d176Sdrh 706cce7d176Sdrh /* 707cce7d176Sdrh ** Error check the functions in an expression. Make sure all 708cce7d176Sdrh ** function names are recognized and all functions have the correct 709cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 710cce7d176Sdrh ** if anything is amiss. Return the number of errors. 711cce7d176Sdrh ** 712cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 713cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 714cce7d176Sdrh */ 715cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 716cce7d176Sdrh int nErr = 0; 717cce7d176Sdrh if( pExpr==0 ) return 0; 718cce7d176Sdrh switch( pExpr->op ){ 719cce7d176Sdrh case TK_FUNCTION: { 720c9b84a1fSdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; /* Number of arguments */ 721c9b84a1fSdrh int no_such_func = 0; /* True if no such function exists */ 722c9b84a1fSdrh int is_type_of = 0; /* True if is the special TypeOf() function */ 723c9b84a1fSdrh int wrong_num_args = 0; /* True if wrong number of arguments */ 724c9b84a1fSdrh int is_agg = 0; /* True if is an aggregate function */ 725cce7d176Sdrh int i; 7260bce8354Sdrh FuncDef *pDef; 7270bce8354Sdrh 72889425d5eSdrh pDef = sqliteFindFunction(pParse->db, 72989425d5eSdrh pExpr->token.z, pExpr->token.n, n, 0); 7300bce8354Sdrh if( pDef==0 ){ 7310bce8354Sdrh pDef = sqliteFindFunction(pParse->db, 7328e0a2f90Sdrh pExpr->token.z, pExpr->token.n, -1, 0); 7330bce8354Sdrh if( pDef==0 ){ 734c9b84a1fSdrh if( n==1 && pExpr->token.n==6 735c9b84a1fSdrh && sqliteStrNICmp(pExpr->token.z, "typeof", 6)==0 ){ 736c9b84a1fSdrh is_type_of = 1; 737c9b84a1fSdrh }else { 738cce7d176Sdrh no_such_func = 1; 739c9b84a1fSdrh } 7408e0a2f90Sdrh }else{ 7418e0a2f90Sdrh wrong_num_args = 1; 7428e0a2f90Sdrh } 7438e0a2f90Sdrh }else{ 7440bce8354Sdrh is_agg = pDef->xFunc==0; 745cce7d176Sdrh } 7468e0a2f90Sdrh if( is_agg && !allowAgg ){ 7478e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1, 7488e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 7498e0a2f90Sdrh pParse->nErr++; 7508e0a2f90Sdrh nErr++; 7518e0a2f90Sdrh is_agg = 0; 7528e0a2f90Sdrh }else if( no_such_func ){ 753cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 754cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 755cce7d176Sdrh pParse->nErr++; 756cce7d176Sdrh nErr++; 7578e0a2f90Sdrh }else if( wrong_num_args ){ 7588e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, 7598e0a2f90Sdrh "wrong number of arguments to function ",-1, 7608e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 7618e0a2f90Sdrh pParse->nErr++; 7628e0a2f90Sdrh nErr++; 763cce7d176Sdrh } 7642282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 765cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 766cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 7674cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 7684cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 769cce7d176Sdrh } 770c9b84a1fSdrh if( pDef==0 ){ 771c9b84a1fSdrh if( is_type_of ){ 772c9b84a1fSdrh pExpr->op = TK_STRING; 773c9b84a1fSdrh if( sqliteExprType(pExpr->pList->a[0].pExpr)==SQLITE_SO_NUM ){ 774c9b84a1fSdrh pExpr->token.z = "numeric"; 775c9b84a1fSdrh pExpr->token.n = 7; 776c9b84a1fSdrh }else{ 777c9b84a1fSdrh pExpr->token.z = "text"; 778c9b84a1fSdrh pExpr->token.n = 4; 779c9b84a1fSdrh } 780c9b84a1fSdrh } 781c9b84a1fSdrh }else if( pDef->dataType>=0 ){ 782c9b84a1fSdrh if( pDef->dataType<n ){ 783c9b84a1fSdrh pExpr->dataType = 784c9b84a1fSdrh sqliteExprType(pExpr->pList->a[pDef->dataType].pExpr); 785c9b84a1fSdrh }else{ 786c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 787c9b84a1fSdrh } 788c9b84a1fSdrh }else if( pDef->dataType==SQLITE_ARGS ){ 789c9b84a1fSdrh pDef->dataType = SQLITE_SO_TEXT; 790c9b84a1fSdrh for(i=0; i<n; i++){ 791c9b84a1fSdrh if( sqliteExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){ 792c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 793c9b84a1fSdrh break; 794c9b84a1fSdrh } 795c9b84a1fSdrh } 796c9b84a1fSdrh }else if( pDef->dataType==SQLITE_NUMERIC ){ 797c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 798c9b84a1fSdrh }else{ 799c9b84a1fSdrh pExpr->dataType = SQLITE_SO_TEXT; 800c9b84a1fSdrh } 801cce7d176Sdrh } 802cce7d176Sdrh default: { 803cce7d176Sdrh if( pExpr->pLeft ){ 8042282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 805cce7d176Sdrh } 806cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 8072282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 808cce7d176Sdrh } 809fef5208cSdrh if( nErr==0 && pExpr->pList ){ 810fef5208cSdrh int n = pExpr->pList->nExpr; 811fef5208cSdrh int i; 812fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 8132282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 8142282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 815fef5208cSdrh } 816fef5208cSdrh } 817cce7d176Sdrh break; 818cce7d176Sdrh } 819cce7d176Sdrh } 820cce7d176Sdrh return nErr; 821cce7d176Sdrh } 822cce7d176Sdrh 823cce7d176Sdrh /* 824c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the 825c9b84a1fSdrh ** given expression should sort as numeric values or as text. 826c9b84a1fSdrh ** 827c9b84a1fSdrh ** The sqliteExprResolveIds() and sqliteExprCheck() routines must have 828c9b84a1fSdrh ** both been called on the expression before it is passed to this routine. 829c9b84a1fSdrh */ 830c9b84a1fSdrh int sqliteExprType(Expr *p){ 831c9b84a1fSdrh if( p==0 ) return SQLITE_SO_NUM; 832c9b84a1fSdrh while( p ) switch( p->op ){ 833c9b84a1fSdrh case TK_PLUS: 834c9b84a1fSdrh case TK_MINUS: 835c9b84a1fSdrh case TK_STAR: 836c9b84a1fSdrh case TK_SLASH: 837c9b84a1fSdrh case TK_AND: 838c9b84a1fSdrh case TK_OR: 839c9b84a1fSdrh case TK_ISNULL: 840c9b84a1fSdrh case TK_NOTNULL: 841c9b84a1fSdrh case TK_NOT: 842c9b84a1fSdrh case TK_UMINUS: 843c9b84a1fSdrh case TK_BITAND: 844c9b84a1fSdrh case TK_BITOR: 845c9b84a1fSdrh case TK_BITNOT: 846c9b84a1fSdrh case TK_LSHIFT: 847c9b84a1fSdrh case TK_RSHIFT: 848c9b84a1fSdrh case TK_REM: 849c9b84a1fSdrh case TK_INTEGER: 850c9b84a1fSdrh case TK_FLOAT: 851c9b84a1fSdrh case TK_IN: 852c9b84a1fSdrh case TK_BETWEEN: 853c9b84a1fSdrh return SQLITE_SO_NUM; 854c9b84a1fSdrh 855c9b84a1fSdrh case TK_STRING: 856c9b84a1fSdrh case TK_NULL: 857c9b84a1fSdrh case TK_CONCAT: 858c9b84a1fSdrh return SQLITE_SO_TEXT; 859c9b84a1fSdrh 860c9b84a1fSdrh case TK_LT: 861c9b84a1fSdrh case TK_LE: 862c9b84a1fSdrh case TK_GT: 863c9b84a1fSdrh case TK_GE: 864c9b84a1fSdrh case TK_NE: 865c9b84a1fSdrh case TK_EQ: 866c9b84a1fSdrh if( sqliteExprType(p->pLeft)==SQLITE_SO_NUM ){ 867c9b84a1fSdrh return SQLITE_SO_NUM; 868c9b84a1fSdrh } 869c9b84a1fSdrh p = p->pRight; 870c9b84a1fSdrh break; 871c9b84a1fSdrh 872c9b84a1fSdrh case TK_AS: 873c9b84a1fSdrh p = p->pLeft; 874c9b84a1fSdrh break; 875c9b84a1fSdrh 876c9b84a1fSdrh case TK_COLUMN: 877c9b84a1fSdrh case TK_FUNCTION: 878c9b84a1fSdrh case TK_AGG_FUNCTION: 879c9b84a1fSdrh return p->dataType; 880c9b84a1fSdrh 881c9b84a1fSdrh case TK_SELECT: 882c9b84a1fSdrh assert( p->pSelect ); 883c9b84a1fSdrh assert( p->pSelect->pEList ); 884c9b84a1fSdrh assert( p->pSelect->pEList->nExpr>0 ); 885c9b84a1fSdrh p = p->pSelect->pEList->a[0].pExpr; 886c9b84a1fSdrh break; 887c9b84a1fSdrh 888b1363206Sdrh case TK_CASE: { 889b1363206Sdrh if( p->pRight && sqliteExprType(p->pRight)==SQLITE_SO_NUM ){ 890b1363206Sdrh return SQLITE_SO_NUM; 891b1363206Sdrh } 892b1363206Sdrh if( p->pList ){ 893b1363206Sdrh int i; 894b1363206Sdrh ExprList *pList = p->pList; 895b1363206Sdrh for(i=1; i<pList->nExpr; i+=2){ 896b1363206Sdrh if( sqliteExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){ 897b1363206Sdrh return SQLITE_SO_NUM; 898b1363206Sdrh } 899b1363206Sdrh } 900b1363206Sdrh } 901b1363206Sdrh return SQLITE_SO_TEXT; 902b1363206Sdrh } 903b1363206Sdrh 904c9b84a1fSdrh default: 905c9b84a1fSdrh assert( p->op==TK_ABORT ); /* Can't Happen */ 906c9b84a1fSdrh break; 907c9b84a1fSdrh } 908c9b84a1fSdrh return SQLITE_SO_NUM; 909c9b84a1fSdrh } 910c9b84a1fSdrh 911c9b84a1fSdrh /* 912cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 9131ccde15dSdrh ** expression and leave the result on the top of stack. 914cce7d176Sdrh */ 915cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 916cce7d176Sdrh Vdbe *v = pParse->pVdbe; 917cce7d176Sdrh int op; 918daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 919cce7d176Sdrh switch( pExpr->op ){ 920cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 921cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 922cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 923cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 924cce7d176Sdrh case TK_AND: op = OP_And; break; 925cce7d176Sdrh case TK_OR: op = OP_Or; break; 926cce7d176Sdrh case TK_LT: op = OP_Lt; break; 927cce7d176Sdrh case TK_LE: op = OP_Le; break; 928cce7d176Sdrh case TK_GT: op = OP_Gt; break; 929cce7d176Sdrh case TK_GE: op = OP_Ge; break; 930cce7d176Sdrh case TK_NE: op = OP_Ne; break; 931cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 932cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 933cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 934cce7d176Sdrh case TK_NOT: op = OP_Not; break; 935cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 936bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 937bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 938bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 939bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 940bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 941bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 942cce7d176Sdrh default: break; 943cce7d176Sdrh } 944cce7d176Sdrh switch( pExpr->op ){ 945967e8b73Sdrh case TK_COLUMN: { 9462282792aSdrh if( pParse->useAgg ){ 94799fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 948c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 94999fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 950c4a3c779Sdrh }else{ 95199fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 9522282792aSdrh } 953cce7d176Sdrh break; 954cce7d176Sdrh } 955cce7d176Sdrh case TK_INTEGER: { 956d9e30930Sdrh int iVal = atoi(pExpr->token.z); 957d9e30930Sdrh char zBuf[30]; 958d9e30930Sdrh sprintf(zBuf,"%d",iVal); 959d9e30930Sdrh if( strlen(zBuf)!=pExpr->token.n 960d9e30930Sdrh || strncmp(pExpr->token.z,zBuf,pExpr->token.n)!=0 ){ 961d9e30930Sdrh /* If the integer value cannot be represented exactly in 32 bits, 962d9e30930Sdrh ** then code it as a string instead. */ 963d9e30930Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 964d9e30930Sdrh }else{ 965d9e30930Sdrh sqliteVdbeAddOp(v, OP_Integer, iVal, 0); 966d9e30930Sdrh } 967e6840900Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 968e6840900Sdrh break; 969e6840900Sdrh } 970e6840900Sdrh case TK_FLOAT: { 9717a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 972a76b5dfcSdrh assert( pExpr->token.z ); 9737a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 974cce7d176Sdrh break; 975cce7d176Sdrh } 976cce7d176Sdrh case TK_STRING: { 97799fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 978a76b5dfcSdrh assert( pExpr->token.z ); 979cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 980cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 981cce7d176Sdrh break; 982cce7d176Sdrh } 983cce7d176Sdrh case TK_NULL: { 98499fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 985cce7d176Sdrh break; 986cce7d176Sdrh } 987c9b84a1fSdrh case TK_LT: 988c9b84a1fSdrh case TK_LE: 989c9b84a1fSdrh case TK_GT: 990c9b84a1fSdrh case TK_GE: 991c9b84a1fSdrh case TK_NE: 992c9b84a1fSdrh case TK_EQ: { 993c9b84a1fSdrh if( pParse->db->file_format>=3 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 994c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 995c9b84a1fSdrh } 996c9b84a1fSdrh /* Fall through into the next case */ 997c9b84a1fSdrh } 998cce7d176Sdrh case TK_AND: 999cce7d176Sdrh case TK_OR: 1000cce7d176Sdrh case TK_PLUS: 1001cce7d176Sdrh case TK_STAR: 1002cce7d176Sdrh case TK_MINUS: 1003bf4133cbSdrh case TK_REM: 1004bf4133cbSdrh case TK_BITAND: 1005bf4133cbSdrh case TK_BITOR: 1006c9b84a1fSdrh case TK_SLASH: { 1007cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1008cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 100999fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 1010cce7d176Sdrh break; 1011cce7d176Sdrh } 1012bf4133cbSdrh case TK_LSHIFT: 1013bf4133cbSdrh case TK_RSHIFT: { 1014bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 1015bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 1016bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 1017bf4133cbSdrh break; 1018bf4133cbSdrh } 10190040077dSdrh case TK_CONCAT: { 10200040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 10210040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 102299fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 10230040077dSdrh break; 10240040077dSdrh } 1025cce7d176Sdrh case TK_UMINUS: { 10266e142f54Sdrh assert( pExpr->pLeft ); 10277a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 10286e142f54Sdrh Token *p = &pExpr->pLeft->token; 10296e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 10306e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 1031e6840900Sdrh if( pExpr->pLeft->op==TK_INTEGER ){ 1032e6840900Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0); 1033e6840900Sdrh }else{ 103499fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1035e6840900Sdrh } 103699fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 10376e142f54Sdrh sqliteFree(z); 10386e142f54Sdrh break; 10396e142f54Sdrh } 10401ccde15dSdrh /* Fall through into TK_NOT */ 10416e142f54Sdrh } 1042bf4133cbSdrh case TK_BITNOT: 10436e142f54Sdrh case TK_NOT: { 1044cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 104599fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 1046cce7d176Sdrh break; 1047cce7d176Sdrh } 1048cce7d176Sdrh case TK_ISNULL: 1049cce7d176Sdrh case TK_NOTNULL: { 1050cce7d176Sdrh int dest; 105199fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 1052cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1053cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 1054f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 105599fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 1056cce7d176Sdrh break; 1057cce7d176Sdrh } 10582282792aSdrh case TK_AGG_FUNCTION: { 105999fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 10602282792aSdrh break; 10612282792aSdrh } 1062cce7d176Sdrh case TK_FUNCTION: { 1063cce7d176Sdrh int i; 1064cce7d176Sdrh ExprList *pList = pExpr->pList; 106589425d5eSdrh int nExpr = pList ? pList->nExpr : 0; 10660bce8354Sdrh FuncDef *pDef; 10670bce8354Sdrh pDef = sqliteFindFunction(pParse->db, 106889425d5eSdrh pExpr->token.z, pExpr->token.n, nExpr, 0); 10690bce8354Sdrh assert( pDef!=0 ); 107089425d5eSdrh for(i=0; i<nExpr; i++){ 10718e0a2f90Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 10728e0a2f90Sdrh } 107389425d5eSdrh sqliteVdbeAddOp(v, OP_Function, nExpr, 0); 10740bce8354Sdrh sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER); 10756ec2733bSdrh break; 10766ec2733bSdrh } 107719a775c2Sdrh case TK_SELECT: { 107899fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 107919a775c2Sdrh break; 108019a775c2Sdrh } 1081fef5208cSdrh case TK_IN: { 1082fef5208cSdrh int addr; 108399fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 1084fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 1085fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1086f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4); 1087f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1088f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1089f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, addr+6); 1090fef5208cSdrh if( pExpr->pSelect ){ 1091f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6); 1092fef5208cSdrh }else{ 1093f5905aa7Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6); 1094fef5208cSdrh } 109599fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 1096fef5208cSdrh break; 1097fef5208cSdrh } 1098fef5208cSdrh case TK_BETWEEN: { 1099f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1100f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1101f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1102f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, 0); 1103f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pull, 1, 0); 1104f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1105f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, 0, 0); 1106f5905aa7Sdrh sqliteVdbeAddOp(v, OP_And, 0, 0); 1107fef5208cSdrh break; 1108fef5208cSdrh } 1109a2e00042Sdrh case TK_AS: { 1110a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1111a2e00042Sdrh break; 1112a2e00042Sdrh } 111317a7f8ddSdrh case TK_CASE: { 111417a7f8ddSdrh int expr_end_label; 1115f5905aa7Sdrh int jumpInst; 1116f5905aa7Sdrh int addr; 1117f5905aa7Sdrh int nExpr; 111817a7f8ddSdrh int i; 111917a7f8ddSdrh 112017a7f8ddSdrh assert(pExpr->pList); 112117a7f8ddSdrh assert((pExpr->pList->nExpr % 2) == 0); 112217a7f8ddSdrh assert(pExpr->pList->nExpr > 0); 1123f5905aa7Sdrh nExpr = pExpr->pList->nExpr; 1124f5905aa7Sdrh expr_end_label = sqliteVdbeMakeLabel(v); 112517a7f8ddSdrh if( pExpr->pLeft ){ 112617a7f8ddSdrh sqliteExprCode(pParse, pExpr->pLeft); 1127cce7d176Sdrh } 1128f5905aa7Sdrh for(i=0; i<nExpr; i=i+2){ 112917a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i].pExpr); 113017a7f8ddSdrh if( pExpr->pLeft ){ 1131f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 1, 1); 1132f570f011Sdrh jumpInst = sqliteVdbeAddOp(v, OP_Ne, 1, 0); 1133f570f011Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1134f5905aa7Sdrh }else{ 1135f570f011Sdrh jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 1, 0); 113617a7f8ddSdrh } 113717a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr); 1138f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label); 1139f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1140f5905aa7Sdrh sqliteVdbeChangeP2(v, jumpInst, addr); 114117a7f8ddSdrh } 1142f570f011Sdrh if( pExpr->pLeft ){ 1143f570f011Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1144f570f011Sdrh } 114517a7f8ddSdrh if( pExpr->pRight ){ 114617a7f8ddSdrh sqliteExprCode(pParse, pExpr->pRight); 114717a7f8ddSdrh }else{ 1148f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 114917a7f8ddSdrh } 1150f5905aa7Sdrh sqliteVdbeResolveLabel(v, expr_end_label); 11516f34903eSdanielk1977 break; 11526f34903eSdanielk1977 } 11536f34903eSdanielk1977 case TK_RAISE: { 11546f34903eSdanielk1977 if( !pParse->trigStack ){ 11556f34903eSdanielk1977 sqliteSetNString(&pParse->zErrMsg, 11566f34903eSdanielk1977 "RAISE() may only be used within a trigger-program", -1, 0); 11576f34903eSdanielk1977 pParse->nErr++; 11586f34903eSdanielk1977 return; 11596f34903eSdanielk1977 } 11606f34903eSdanielk1977 if( pExpr->iColumn == OE_Rollback || 11616f34903eSdanielk1977 pExpr->iColumn == OE_Abort || 11626f34903eSdanielk1977 pExpr->iColumn == OE_Fail ){ 11636f34903eSdanielk1977 char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 11646f34903eSdanielk1977 sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn); 11656f34903eSdanielk1977 sqliteDequote(msg); 11666f34903eSdanielk1977 sqliteVdbeChangeP3(v, -1, msg, 0); 11676f34903eSdanielk1977 sqliteFree(msg); 11686f34903eSdanielk1977 } else { 11696f34903eSdanielk1977 assert( pExpr->iColumn == OE_Ignore ); 11706f34903eSdanielk1977 sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump); 11716f34903eSdanielk1977 sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", -1); 11726f34903eSdanielk1977 } 117317a7f8ddSdrh } 117417a7f8ddSdrh break; 117517a7f8ddSdrh } 1176cce7d176Sdrh } 1177cce7d176Sdrh 1178cce7d176Sdrh /* 1179cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 1180cce7d176Sdrh ** to the label "dest" if the expression is true but execution 1181cce7d176Sdrh ** continues straight thru if the expression is false. 1182f5905aa7Sdrh ** 1183f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then 1184f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true. 1185cce7d176Sdrh */ 1186f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1187cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1188cce7d176Sdrh int op = 0; 1189daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1190cce7d176Sdrh switch( pExpr->op ){ 1191cce7d176Sdrh case TK_LT: op = OP_Lt; break; 1192cce7d176Sdrh case TK_LE: op = OP_Le; break; 1193cce7d176Sdrh case TK_GT: op = OP_Gt; break; 1194cce7d176Sdrh case TK_GE: op = OP_Ge; break; 1195cce7d176Sdrh case TK_NE: op = OP_Ne; break; 1196cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 1197cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 1198cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 1199cce7d176Sdrh default: break; 1200cce7d176Sdrh } 1201cce7d176Sdrh switch( pExpr->op ){ 1202cce7d176Sdrh case TK_AND: { 1203cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1204f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull); 1205f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1206cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1207cce7d176Sdrh break; 1208cce7d176Sdrh } 1209cce7d176Sdrh case TK_OR: { 1210f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1211f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1212cce7d176Sdrh break; 1213cce7d176Sdrh } 1214cce7d176Sdrh case TK_NOT: { 1215f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1216cce7d176Sdrh break; 1217cce7d176Sdrh } 1218cce7d176Sdrh case TK_LT: 1219cce7d176Sdrh case TK_LE: 1220cce7d176Sdrh case TK_GT: 1221cce7d176Sdrh case TK_GE: 1222cce7d176Sdrh case TK_NE: 12230ac65892Sdrh case TK_EQ: { 1224cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1225cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1226c9b84a1fSdrh if( pParse->db->file_format>=3 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 1227c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1228c9b84a1fSdrh } 1229f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1230cce7d176Sdrh break; 1231cce7d176Sdrh } 1232cce7d176Sdrh case TK_ISNULL: 1233cce7d176Sdrh case TK_NOTNULL: { 1234cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1235f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1236cce7d176Sdrh break; 1237cce7d176Sdrh } 1238fef5208cSdrh case TK_IN: { 1239f5905aa7Sdrh int addr; 1240cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1241f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1242f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1243f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1244f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1245fef5208cSdrh if( pExpr->pSelect ){ 124699fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1247fef5208cSdrh }else{ 124899fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1249fef5208cSdrh } 1250fef5208cSdrh break; 1251fef5208cSdrh } 1252fef5208cSdrh case TK_BETWEEN: { 1253f5905aa7Sdrh int addr; 1254fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 125599fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1256fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1257f5905aa7Sdrh addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0); 1258fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1259f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest); 126099fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 1261f5905aa7Sdrh sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v)); 126299fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1263fef5208cSdrh break; 1264fef5208cSdrh } 1265cce7d176Sdrh default: { 1266cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1267f5905aa7Sdrh sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest); 1268cce7d176Sdrh break; 1269cce7d176Sdrh } 1270cce7d176Sdrh } 1271cce7d176Sdrh } 1272cce7d176Sdrh 1273cce7d176Sdrh /* 127466b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1275cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1276cce7d176Sdrh ** continues straight thru if the expression is true. 1277f5905aa7Sdrh ** 1278f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then 1279f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false. 1280cce7d176Sdrh */ 1281f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1282cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1283cce7d176Sdrh int op = 0; 1284daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1285cce7d176Sdrh switch( pExpr->op ){ 1286cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1287cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1288cce7d176Sdrh case TK_GT: op = OP_Le; break; 1289cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1290cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1291cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1292cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1293cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1294cce7d176Sdrh default: break; 1295cce7d176Sdrh } 1296cce7d176Sdrh switch( pExpr->op ){ 1297cce7d176Sdrh case TK_AND: { 1298f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1299f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1300cce7d176Sdrh break; 1301cce7d176Sdrh } 1302cce7d176Sdrh case TK_OR: { 1303cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1304f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull); 1305f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1306cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1307cce7d176Sdrh break; 1308cce7d176Sdrh } 1309cce7d176Sdrh case TK_NOT: { 1310f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1311cce7d176Sdrh break; 1312cce7d176Sdrh } 1313cce7d176Sdrh case TK_LT: 1314cce7d176Sdrh case TK_LE: 1315cce7d176Sdrh case TK_GT: 1316cce7d176Sdrh case TK_GE: 1317cce7d176Sdrh case TK_NE: 1318cce7d176Sdrh case TK_EQ: { 1319c9b84a1fSdrh if( pParse->db->file_format>=3 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 1320c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1321c9b84a1fSdrh } 1322cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1323cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1324f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1325cce7d176Sdrh break; 1326cce7d176Sdrh } 1327cce7d176Sdrh case TK_ISNULL: 1328cce7d176Sdrh case TK_NOTNULL: { 1329cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1330f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1331cce7d176Sdrh break; 1332cce7d176Sdrh } 1333fef5208cSdrh case TK_IN: { 1334f5905aa7Sdrh int addr; 1335cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1336f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1337f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1338f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1339f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1340fef5208cSdrh if( pExpr->pSelect ){ 134199fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1342fef5208cSdrh }else{ 134399fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1344fef5208cSdrh } 1345fef5208cSdrh break; 1346fef5208cSdrh } 1347fef5208cSdrh case TK_BETWEEN: { 1348fef5208cSdrh int addr; 1349fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 135099fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1351fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1352fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1353f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3); 135499fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 135599fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 1356fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1357f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest); 1358fef5208cSdrh break; 1359fef5208cSdrh } 1360cce7d176Sdrh default: { 1361cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1362461c281aSdrh sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest); 1363cce7d176Sdrh break; 1364cce7d176Sdrh } 1365cce7d176Sdrh } 1366cce7d176Sdrh } 13672282792aSdrh 13682282792aSdrh /* 13692282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 13702282792aSdrh ** if they are identical and return FALSE if they differ in any way. 13712282792aSdrh */ 1372d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 13732282792aSdrh int i; 13742282792aSdrh if( pA==0 ){ 13752282792aSdrh return pB==0; 13762282792aSdrh }else if( pB==0 ){ 13772282792aSdrh return 0; 13782282792aSdrh } 13792282792aSdrh if( pA->op!=pB->op ) return 0; 1380d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1381d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 13822282792aSdrh if( pA->pList ){ 13832282792aSdrh if( pB->pList==0 ) return 0; 13842282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 13852282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1386d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 13872282792aSdrh return 0; 13882282792aSdrh } 13892282792aSdrh } 13902282792aSdrh }else if( pB->pList ){ 13912282792aSdrh return 0; 13922282792aSdrh } 13932282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 1394*2f2c01e5Sdrh if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0; 13952282792aSdrh if( pA->token.z ){ 13962282792aSdrh if( pB->token.z==0 ) return 0; 13972282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 13982282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 13992282792aSdrh } 14002282792aSdrh return 1; 14012282792aSdrh } 14022282792aSdrh 14032282792aSdrh /* 14042282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 14052282792aSdrh */ 14062282792aSdrh static int appendAggInfo(Parse *pParse){ 14072282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 14082282792aSdrh int amt = pParse->nAgg + 8; 14096d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 14106d4abfbeSdrh if( aAgg==0 ){ 14112282792aSdrh return -1; 14122282792aSdrh } 14136d4abfbeSdrh pParse->aAgg = aAgg; 14142282792aSdrh } 14152282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 14162282792aSdrh return pParse->nAgg++; 14172282792aSdrh } 14182282792aSdrh 14192282792aSdrh /* 14202282792aSdrh ** Analyze the given expression looking for aggregate functions and 14212282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 14222282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 14232282792aSdrh ** 14242282792aSdrh ** This routine should only be called after the expression has been 14252282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 14262282792aSdrh ** 14272282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 14282282792aSdrh ** the number of errors. 14292282792aSdrh */ 14302282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 14312282792aSdrh int i; 14322282792aSdrh AggExpr *aAgg; 14332282792aSdrh int nErr = 0; 14342282792aSdrh 14352282792aSdrh if( pExpr==0 ) return 0; 14362282792aSdrh switch( pExpr->op ){ 1437967e8b73Sdrh case TK_COLUMN: { 14382282792aSdrh aAgg = pParse->aAgg; 14392282792aSdrh for(i=0; i<pParse->nAgg; i++){ 14402282792aSdrh if( aAgg[i].isAgg ) continue; 14412282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1442967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 14432282792aSdrh break; 14442282792aSdrh } 14452282792aSdrh } 14462282792aSdrh if( i>=pParse->nAgg ){ 14472282792aSdrh i = appendAggInfo(pParse); 14482282792aSdrh if( i<0 ) return 1; 14492282792aSdrh pParse->aAgg[i].isAgg = 0; 14502282792aSdrh pParse->aAgg[i].pExpr = pExpr; 14512282792aSdrh } 1452aaf88729Sdrh pExpr->iAgg = i; 14532282792aSdrh break; 14542282792aSdrh } 14552282792aSdrh case TK_AGG_FUNCTION: { 14562282792aSdrh aAgg = pParse->aAgg; 14572282792aSdrh for(i=0; i<pParse->nAgg; i++){ 14582282792aSdrh if( !aAgg[i].isAgg ) continue; 1459d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 14602282792aSdrh break; 14612282792aSdrh } 14622282792aSdrh } 14632282792aSdrh if( i>=pParse->nAgg ){ 14642282792aSdrh i = appendAggInfo(pParse); 14652282792aSdrh if( i<0 ) return 1; 14662282792aSdrh pParse->aAgg[i].isAgg = 1; 14672282792aSdrh pParse->aAgg[i].pExpr = pExpr; 14680bce8354Sdrh pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db, 1469f55f25f0Sdrh pExpr->token.z, pExpr->token.n, 1470f55f25f0Sdrh pExpr->pList ? pExpr->pList->nExpr : 0, 0); 14712282792aSdrh } 14722282792aSdrh pExpr->iAgg = i; 14732282792aSdrh break; 14742282792aSdrh } 14752282792aSdrh default: { 14762282792aSdrh if( pExpr->pLeft ){ 14772282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 14782282792aSdrh } 14792282792aSdrh if( nErr==0 && pExpr->pRight ){ 14802282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 14812282792aSdrh } 14822282792aSdrh if( nErr==0 && pExpr->pList ){ 14832282792aSdrh int n = pExpr->pList->nExpr; 14842282792aSdrh int i; 14852282792aSdrh for(i=0; nErr==0 && i<n; i++){ 14862282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 14872282792aSdrh } 14882282792aSdrh } 14892282792aSdrh break; 14902282792aSdrh } 14912282792aSdrh } 14922282792aSdrh return nErr; 14932282792aSdrh } 14948e0a2f90Sdrh 14958e0a2f90Sdrh /* 14968e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 14970bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that 14988e0a2f90Sdrh ** function, or return NULL if the function does not exist. 14998e0a2f90Sdrh ** 15000bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef 15018e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 15028e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 15038e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 15048e0a2f90Sdrh ** any number of arguments will be returned. 15058e0a2f90Sdrh ** 15068e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 15078e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 15088e0a2f90Sdrh ** or xStep is non-zero. 15098e0a2f90Sdrh */ 15100bce8354Sdrh FuncDef *sqliteFindFunction( 15118e0a2f90Sdrh sqlite *db, /* An open database */ 15128e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 15138e0a2f90Sdrh int nName, /* Number of characters in the name */ 15148e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 15158e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 15168e0a2f90Sdrh ){ 15170bce8354Sdrh FuncDef *pFirst, *p, *pMaybe; 15180bce8354Sdrh pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName); 15191350b030Sdrh if( p && !createFlag && nArg<0 ){ 15208e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 15218e0a2f90Sdrh return p; 15228e0a2f90Sdrh } 15238e0a2f90Sdrh pMaybe = 0; 15248e0a2f90Sdrh while( p && p->nArg!=nArg ){ 15258e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 15268e0a2f90Sdrh p = p->pNext; 15278e0a2f90Sdrh } 15288e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 15298e0a2f90Sdrh return 0; 15308e0a2f90Sdrh } 15318e0a2f90Sdrh if( p==0 && pMaybe ){ 15328e0a2f90Sdrh assert( createFlag==0 ); 15338e0a2f90Sdrh return pMaybe; 15348e0a2f90Sdrh } 153589425d5eSdrh if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){ 15368e0a2f90Sdrh p->nArg = nArg; 15378e0a2f90Sdrh p->pNext = pFirst; 1538c9b84a1fSdrh p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC; 15390bce8354Sdrh sqliteHashInsert(&db->aFunc, zName, nName, (void*)p); 15408e0a2f90Sdrh } 15418e0a2f90Sdrh return p; 15428e0a2f90Sdrh } 1543