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*ff78bd2fSdrh ** $Id: expr.c,v 1.46 2002/02/27 01:47:12 drh Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 18cce7d176Sdrh 19a2e00042Sdrh 20a2e00042Sdrh /* 21a76b5dfcSdrh ** Construct a new expression node and return a pointer to it. Memory 22a76b5dfcSdrh ** for this node is obtained from sqliteMalloc(). The calling function 23a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed. 24a76b5dfcSdrh */ 25a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){ 26a76b5dfcSdrh Expr *pNew; 27a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 28a76b5dfcSdrh if( pNew==0 ){ 29a76b5dfcSdrh sqliteExprDelete(pLeft); 30a76b5dfcSdrh sqliteExprDelete(pRight); 31a76b5dfcSdrh return 0; 32a76b5dfcSdrh } 33a76b5dfcSdrh pNew->op = op; 34a76b5dfcSdrh pNew->pLeft = pLeft; 35a76b5dfcSdrh pNew->pRight = pRight; 36a76b5dfcSdrh if( pToken ){ 37a76b5dfcSdrh pNew->token = *pToken; 38a76b5dfcSdrh }else{ 39a76b5dfcSdrh pNew->token.z = 0; 40a76b5dfcSdrh pNew->token.n = 0; 41a76b5dfcSdrh } 42a76b5dfcSdrh if( pLeft && pRight ){ 43a76b5dfcSdrh sqliteExprSpan(pNew, &pLeft->span, &pRight->span); 44a76b5dfcSdrh }else{ 45a76b5dfcSdrh pNew->span = pNew->token; 46a76b5dfcSdrh } 47a76b5dfcSdrh return pNew; 48a76b5dfcSdrh } 49a76b5dfcSdrh 50a76b5dfcSdrh /* 51a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all 52a76b5dfcSdrh ** text between the two given tokens. 53a76b5dfcSdrh */ 54a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ 55a76b5dfcSdrh if( pExpr ){ 56a76b5dfcSdrh pExpr->span.z = pLeft->z; 57a76b5dfcSdrh pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z); 58a76b5dfcSdrh } 59a76b5dfcSdrh } 60a76b5dfcSdrh 61a76b5dfcSdrh /* 62a76b5dfcSdrh ** Construct a new expression node for a function with multiple 63a76b5dfcSdrh ** arguments. 64a76b5dfcSdrh */ 65a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){ 66a76b5dfcSdrh Expr *pNew; 67a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 68a76b5dfcSdrh if( pNew==0 ){ 69a76b5dfcSdrh sqliteExprListDelete(pList); 70a76b5dfcSdrh return 0; 71a76b5dfcSdrh } 72a76b5dfcSdrh pNew->op = TK_FUNCTION; 73a76b5dfcSdrh pNew->pList = pList; 74a76b5dfcSdrh if( pToken ){ 75a76b5dfcSdrh pNew->token = *pToken; 76a76b5dfcSdrh }else{ 77a76b5dfcSdrh pNew->token.z = 0; 78a76b5dfcSdrh pNew->token.n = 0; 79a76b5dfcSdrh } 80a76b5dfcSdrh return pNew; 81a76b5dfcSdrh } 82a76b5dfcSdrh 83a76b5dfcSdrh /* 84a2e00042Sdrh ** Recursively delete an expression tree. 85a2e00042Sdrh */ 86a2e00042Sdrh void sqliteExprDelete(Expr *p){ 87a2e00042Sdrh if( p==0 ) return; 88a2e00042Sdrh if( p->op!=TK_AS ){ 89a2e00042Sdrh if( p->pLeft ) sqliteExprDelete(p->pLeft); 90a2e00042Sdrh if( p->pRight ) sqliteExprDelete(p->pRight); 91a2e00042Sdrh } 92a2e00042Sdrh if( p->pList ) sqliteExprListDelete(p->pList); 93a2e00042Sdrh if( p->pSelect ) sqliteSelectDelete(p->pSelect); 94a2e00042Sdrh sqliteFree(p); 95a2e00042Sdrh } 96a2e00042Sdrh 97cce7d176Sdrh /* 98a76b5dfcSdrh ** The following group of functions are used to translate the string 99a76b5dfcSdrh ** pointers of tokens in expression from one buffer to another. 100a76b5dfcSdrh ** 101a76b5dfcSdrh ** Normally, the Expr.token.z and Expr.span.z fields point into the 102a76b5dfcSdrh ** original input buffer of an SQL statement. This is usually OK 103a76b5dfcSdrh ** since the SQL statement is executed and the expression is deleted 104a76b5dfcSdrh ** before the input buffer is freed. Making the tokens point to the 105a76b5dfcSdrh ** original input buffer saves many calls to malloc() and thus helps 106a76b5dfcSdrh ** the library to run faster. 107a76b5dfcSdrh ** 108a76b5dfcSdrh ** But sometimes we need an expression to persist past the time when 109a76b5dfcSdrh ** the input buffer is freed. (Example: The SELECT clause of a 110a76b5dfcSdrh ** CREATE VIEW statement contains expressions that must persist for 111a76b5dfcSdrh ** the life of the view.) When that happens we have to make a 112a76b5dfcSdrh ** persistent copy of the input buffer and translate the Expr.token.z 113a76b5dfcSdrh ** and Expr.span.z fields to point to the copy rather than the 114a2ed5601Sdrh ** original input buffer. The following group of routines handle that 115a76b5dfcSdrh ** translation. 116a76b5dfcSdrh ** 117a76b5dfcSdrh ** The "offset" parameter is the distance from the original input buffer 118a76b5dfcSdrh ** to the persistent copy. These routines recursively walk the entire 119a76b5dfcSdrh ** expression tree and shift all tokens by "offset" amount. 120a76b5dfcSdrh ** 121a76b5dfcSdrh ** The work of figuring out the appropriate "offset" and making the 122a76b5dfcSdrh ** presistent copy of the input buffer is done by the calling routine. 123a76b5dfcSdrh */ 124a76b5dfcSdrh void sqliteExprMoveStrings(Expr *p, int offset){ 125a76b5dfcSdrh if( p==0 ) return; 126a76b5dfcSdrh if( p->token.z ) p->token.z += offset; 127a76b5dfcSdrh if( p->span.z ) p->span.z += offset; 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 /* 151*ff78bd2fSdrh ** The following group of routines make deep copies of expressions, 152*ff78bd2fSdrh ** expression lists, ID lists, and select statements. The copies can 153*ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines) 154*ff78bd2fSdrh ** without effecting the originals. 155*ff78bd2fSdrh ** 156*ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to 157*ff78bd2fSdrh ** string space that is allocated separately from the expression tree 158*ff78bd2fSdrh ** itself. These routines do NOT duplicate that string space. 159*ff78bd2fSdrh ** 160*ff78bd2fSdrh ** The expression list and ID list return by sqliteExprListDup() and 161*ff78bd2fSdrh ** sqliteIdListDup() can not be further expanded by subsequent calls 162*ff78bd2fSdrh ** to sqliteExprListAppend() or sqliteIdListAppend(). 163*ff78bd2fSdrh ** 164*ff78bd2fSdrh ** Any tables that the ID list might point to are not duplicated. 165*ff78bd2fSdrh */ 166*ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){ 167*ff78bd2fSdrh Expr *pNew; 168*ff78bd2fSdrh if( p==0 ) return 0; 169*ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 170*ff78bd2fSdrh if( pNew==0 ) return 0; 171*ff78bd2fSdrh pNew->op = p->op; 172*ff78bd2fSdrh pNew->pLeft = sqliteExprDup(p->pLeft); 173*ff78bd2fSdrh pNew->pRight = sqliteExprDup(p->pRight); 174*ff78bd2fSdrh pNew->pList = sqliteExprListDup(p->pList); 175*ff78bd2fSdrh pNew->token = p->token; 176*ff78bd2fSdrh pNew->span = p->span; 177*ff78bd2fSdrh pNew->pSelect = sqliteSelectDup(p->pSelect); 178*ff78bd2fSdrh return pNew; 179*ff78bd2fSdrh } 180*ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){ 181*ff78bd2fSdrh ExprList *pNew; 182*ff78bd2fSdrh int i; 183*ff78bd2fSdrh if( p==0 ) return 0; 184*ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 185*ff78bd2fSdrh if( pNew==0 ) return 0; 186*ff78bd2fSdrh pNew->nExpr = p->nExpr; 187*ff78bd2fSdrh pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); 188*ff78bd2fSdrh for(i=0; i<p->nExpr; i++){ 189*ff78bd2fSdrh pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr); 190*ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 191*ff78bd2fSdrh pNew->a[i].sortOrder = p->a[i].sortOrder; 192*ff78bd2fSdrh pNew->a[i].isAgg = p->a[i].isAgg; 193*ff78bd2fSdrh pNew->a[i].done = 0; 194*ff78bd2fSdrh } 195*ff78bd2fSdrh return pNew; 196*ff78bd2fSdrh } 197*ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){ 198*ff78bd2fSdrh IdList *pNew; 199*ff78bd2fSdrh int i; 200*ff78bd2fSdrh if( p==0 ) return 0; 201*ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 202*ff78bd2fSdrh if( pNew==0 ) return 0; 203*ff78bd2fSdrh pNew->nId = p->nId; 204*ff78bd2fSdrh pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) ); 205*ff78bd2fSdrh for(i=0; i<p->nId; i++){ 206*ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 207*ff78bd2fSdrh pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias); 208*ff78bd2fSdrh pNew->a[i].idx = p->a[i].idx; 209*ff78bd2fSdrh pNew->a[i].pTab = 0; 210*ff78bd2fSdrh pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect); 211*ff78bd2fSdrh } 212*ff78bd2fSdrh return pNew; 213*ff78bd2fSdrh } 214*ff78bd2fSdrh Select *sqliteSelectDup(Select *p){ 215*ff78bd2fSdrh Select *pNew; 216*ff78bd2fSdrh if( p==0 ) return 0; 217*ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 218*ff78bd2fSdrh if( pNew==0 ) return 0; 219*ff78bd2fSdrh pNew->isDistinct = p->isDistinct; 220*ff78bd2fSdrh pNew->pEList = sqliteExprListDup(p->pEList); 221*ff78bd2fSdrh pNew->pSrc = sqliteIdListDup(p->pSrc); 222*ff78bd2fSdrh pNew->pWhere = sqliteExprDup(p->pWhere); 223*ff78bd2fSdrh pNew->pGroupBy = sqliteExprListDup(p->pGroupBy); 224*ff78bd2fSdrh pNew->pHaving = sqliteExprDup(p->pHaving); 225*ff78bd2fSdrh pNew->pOrderBy = sqliteExprListDup(p->pOrderBy); 226*ff78bd2fSdrh pNew->op = p->op; 227*ff78bd2fSdrh pNew->pPrior = sqliteSelectDup(p->pPrior); 228*ff78bd2fSdrh pNew->nLimit = p->nLimit; 229*ff78bd2fSdrh pNew->nOffset = p->nOffset; 230*ff78bd2fSdrh pNew->zSelect = 0; 231*ff78bd2fSdrh return pNew; 232*ff78bd2fSdrh } 233*ff78bd2fSdrh 234*ff78bd2fSdrh 235*ff78bd2fSdrh /* 236a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 237a76b5dfcSdrh ** initially NULL, then create a new expression list. 238a76b5dfcSdrh */ 239a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 240a76b5dfcSdrh int i; 241a76b5dfcSdrh if( pList==0 ){ 242a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 243a76b5dfcSdrh if( pList==0 ){ 244a76b5dfcSdrh sqliteExprDelete(pExpr); 245a76b5dfcSdrh return 0; 246a76b5dfcSdrh } 247a76b5dfcSdrh } 248a76b5dfcSdrh if( (pList->nExpr & 7)==0 ){ 249a76b5dfcSdrh int n = pList->nExpr + 8; 250a76b5dfcSdrh struct ExprList_item *a; 251a76b5dfcSdrh a = sqliteRealloc(pList->a, n*sizeof(pList->a[0])); 252a76b5dfcSdrh if( a==0 ){ 253a76b5dfcSdrh sqliteExprDelete(pExpr); 254a76b5dfcSdrh return pList; 255a76b5dfcSdrh } 256a76b5dfcSdrh pList->a = a; 257a76b5dfcSdrh } 258a76b5dfcSdrh if( pExpr || pName ){ 259a76b5dfcSdrh i = pList->nExpr++; 260a76b5dfcSdrh pList->a[i].pExpr = pExpr; 261a76b5dfcSdrh pList->a[i].zName = 0; 262a76b5dfcSdrh if( pName ){ 263a76b5dfcSdrh sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0); 264a76b5dfcSdrh sqliteDequote(pList->a[i].zName); 265a76b5dfcSdrh } 266a76b5dfcSdrh } 267a76b5dfcSdrh return pList; 268a76b5dfcSdrh } 269a76b5dfcSdrh 270a76b5dfcSdrh /* 271a76b5dfcSdrh ** Delete an entire expression list. 272a76b5dfcSdrh */ 273a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){ 274a76b5dfcSdrh int i; 275a76b5dfcSdrh if( pList==0 ) return; 276a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 277a76b5dfcSdrh sqliteExprDelete(pList->a[i].pExpr); 278a76b5dfcSdrh sqliteFree(pList->a[i].zName); 279a76b5dfcSdrh } 280a76b5dfcSdrh sqliteFree(pList->a); 281a76b5dfcSdrh sqliteFree(pList); 282a76b5dfcSdrh } 283a76b5dfcSdrh 284a76b5dfcSdrh /* 285fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 286fef5208cSdrh ** and 0 if it involves variables. 287fef5208cSdrh */ 2889208643dSdrh int sqliteExprIsConstant(Expr *p){ 289fef5208cSdrh switch( p->op ){ 290fef5208cSdrh case TK_ID: 291967e8b73Sdrh case TK_COLUMN: 292fef5208cSdrh case TK_DOT: 293fef5208cSdrh return 0; 2949208643dSdrh case TK_INTEGER: 2959208643dSdrh case TK_FLOAT: 2969208643dSdrh case TK_STRING: 2979208643dSdrh return 1; 298fef5208cSdrh default: { 2999208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 3009208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 301fef5208cSdrh if( p->pList ){ 302fef5208cSdrh int i; 303fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 3049208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 305fef5208cSdrh } 306fef5208cSdrh } 3079208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 308fef5208cSdrh } 309fef5208cSdrh } 3109208643dSdrh return 0; 311fef5208cSdrh } 312fef5208cSdrh 313fef5208cSdrh /* 3144794b980Sdrh ** Walk the expression tree and process operators of the form: 3154794b980Sdrh ** 3164794b980Sdrh ** expr IN (SELECT ...) 3174794b980Sdrh ** 318967e8b73Sdrh ** These operators have to be processed before column names are 3194794b980Sdrh ** resolved because each such operator increments pParse->nTab 3201ccde15dSdrh ** to reserve cursor numbers for its own use. But pParse->nTab 321aacc543eSdrh ** needs to be constant once we begin resolving column names. For 322aacc543eSdrh ** that reason, this procedure needs to be called on every expression 323aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression. 3244794b980Sdrh ** 3254794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this 3264794b980Sdrh ** routine. This routine allocates a cursor number to the IN-SELECT 3274794b980Sdrh ** and then moves on. The code generation is done by 3284794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards. 3294794b980Sdrh */ 3304794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){ 3314794b980Sdrh if( pExpr==0 ) return; 3324794b980Sdrh if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){ 3334794b980Sdrh pExpr->iTable = pParse->nTab++; 3344794b980Sdrh }else{ 3354794b980Sdrh if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft); 3364794b980Sdrh if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight); 3374794b980Sdrh if( pExpr->pList ){ 3384794b980Sdrh int i; 3394794b980Sdrh ExprList *pList = pExpr->pList; 3404794b980Sdrh for(i=0; i<pList->nExpr; i++){ 3414794b980Sdrh sqliteExprResolveInSelect(pParse, pList->a[i].pExpr); 3424794b980Sdrh } 3434794b980Sdrh } 3444794b980Sdrh } 3454794b980Sdrh } 3464794b980Sdrh 3474794b980Sdrh /* 348c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 349c4a3c779Sdrh */ 350c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 351c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 352c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 353c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 354c4a3c779Sdrh return 0; 355c4a3c779Sdrh } 356c4a3c779Sdrh 357c4a3c779Sdrh /* 358cce7d176Sdrh ** This routine walks an expression tree and resolves references to 359967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 360aacc543eSdrh ** index to the table in the table list and a column offset. The 361aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 362aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 363aacc543eSdrh ** plus the pParse->nTab value. This value will ultimately become the 364aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 365aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 366aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 367aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 368aacc543eSdrh ** alias for ROWID. 36919a775c2Sdrh ** 370fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 371fef5208cSdrh ** forms: 372fef5208cSdrh ** 373fef5208cSdrh ** expr IN (exprlist) 374fef5208cSdrh ** and 375fef5208cSdrh ** expr IN (SELECT ...) 376fef5208cSdrh ** 377fef5208cSdrh ** The first form is handled by creating a set holding the list 378fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 379fef5208cSdrh ** a temporary table. 380fef5208cSdrh ** 381fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 38219a775c2Sdrh ** If it finds any, it generates code to write the value of that select 38319a775c2Sdrh ** into a memory cell. 384cce7d176Sdrh ** 385967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 386cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 387cce7d176Sdrh */ 388a2e00042Sdrh int sqliteExprResolveIds( 389a2e00042Sdrh Parse *pParse, /* The parser context */ 390a2e00042Sdrh IdList *pTabList, /* List of tables used to resolve column names */ 391a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 392a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 393a2e00042Sdrh ){ 394daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 395cce7d176Sdrh switch( pExpr->op ){ 396a2e00042Sdrh /* A lone identifier. Try and match it as follows: 397a2e00042Sdrh ** 398a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 399a2e00042Sdrh ** 400a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 401a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 402a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 403a2e00042Sdrh ** 404a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 405a2e00042Sdrh */ 406cce7d176Sdrh case TK_ID: { 407cce7d176Sdrh int cnt = 0; /* Number of matches */ 408cce7d176Sdrh int i; /* Loop counter */ 409a76b5dfcSdrh char *z; 410a76b5dfcSdrh assert( pExpr->token.z ); 411a76b5dfcSdrh z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 4122f4392ffSdrh sqliteDequote(z); 413daffd0e5Sdrh if( z==0 ) return 1; 414cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 415cce7d176Sdrh int j; 416cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 417cce7d176Sdrh if( pTab==0 ) continue; 418cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 4197020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 420cce7d176Sdrh cnt++; 42119a775c2Sdrh pExpr->iTable = i + pParse->nTab; 4224a32431cSdrh if( j==pTab->iPKey ){ 4234a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 4244a32431cSdrh pExpr->iColumn = -1; 4254a32431cSdrh }else{ 426967e8b73Sdrh pExpr->iColumn = j; 427cce7d176Sdrh } 428a2e00042Sdrh pExpr->op = TK_COLUMN; 429a2e00042Sdrh } 430a2e00042Sdrh } 431a2e00042Sdrh } 432a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 433a2e00042Sdrh int j; 434a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 435a2e00042Sdrh char *zAs = pEList->a[j].zName; 436a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 437a2e00042Sdrh cnt++; 438a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 439a2e00042Sdrh pExpr->op = TK_AS; 440a2e00042Sdrh pExpr->iColumn = j; 441a2e00042Sdrh pExpr->pLeft = pEList->a[j].pExpr; 442cce7d176Sdrh } 443cce7d176Sdrh } 4444a32431cSdrh } 445c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 446c4a3c779Sdrh pExpr->iColumn = -1; 447c4a3c779Sdrh pExpr->iTable = pParse->nTab; 448c4a3c779Sdrh cnt = 1 + (pTabList->nId>1); 449a2e00042Sdrh pExpr->op = TK_COLUMN; 450c4a3c779Sdrh } 451cce7d176Sdrh sqliteFree(z); 452cce7d176Sdrh if( cnt==0 ){ 453967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 454cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 455cce7d176Sdrh pParse->nErr++; 456cce7d176Sdrh return 1; 457cce7d176Sdrh }else if( cnt>1 ){ 458967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 459cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 460cce7d176Sdrh pParse->nErr++; 461cce7d176Sdrh return 1; 462cce7d176Sdrh } 463cce7d176Sdrh break; 464cce7d176Sdrh } 465cce7d176Sdrh 466967e8b73Sdrh /* A table name and column name: ID.ID */ 467cce7d176Sdrh case TK_DOT: { 468cce7d176Sdrh int cnt = 0; /* Number of matches */ 469c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 470cce7d176Sdrh int i; /* Loop counter */ 471cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 472cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 473cce7d176Sdrh 474cce7d176Sdrh pLeft = pExpr->pLeft; 475cce7d176Sdrh pRight = pExpr->pRight; 476a76b5dfcSdrh assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); 477a76b5dfcSdrh assert( pRight && pRight->op==TK_ID && pRight->token.z ); 4786e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 4796e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 480daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 481daffd0e5Sdrh sqliteFree(zLeft); 482daffd0e5Sdrh sqliteFree(zRight); 483daffd0e5Sdrh return 1; 484daffd0e5Sdrh } 48587c40e88Sdrh sqliteDequote(zLeft); 48687c40e88Sdrh sqliteDequote(zRight); 487c4a3c779Sdrh pExpr->iTable = -1; 488cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 489cce7d176Sdrh int j; 490cce7d176Sdrh char *zTab; 491cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 492cce7d176Sdrh if( pTab==0 ) continue; 493cce7d176Sdrh if( pTabList->a[i].zAlias ){ 494cce7d176Sdrh zTab = pTabList->a[i].zAlias; 495cce7d176Sdrh }else{ 496cce7d176Sdrh zTab = pTab->zName; 497cce7d176Sdrh } 498cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 499c4a3c779Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab; 500cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 5017020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 502cce7d176Sdrh cnt++; 50319a775c2Sdrh pExpr->iTable = i + pParse->nTab; 5044a32431cSdrh if( j==pTab->iPKey ){ 5054a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 5064a32431cSdrh pExpr->iColumn = -1; 5074a32431cSdrh }else{ 508967e8b73Sdrh pExpr->iColumn = j; 509cce7d176Sdrh } 510cce7d176Sdrh } 511cce7d176Sdrh } 5124a32431cSdrh } 513c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 514c4a3c779Sdrh cnt = 1; 515c4a3c779Sdrh pExpr->iColumn = -1; 516c4a3c779Sdrh } 517cce7d176Sdrh sqliteFree(zLeft); 518cce7d176Sdrh sqliteFree(zRight); 519cce7d176Sdrh if( cnt==0 ){ 520967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 521cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 522cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 523cce7d176Sdrh pParse->nErr++; 524cce7d176Sdrh return 1; 525cce7d176Sdrh }else if( cnt>1 ){ 526967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 527cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 528cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 529cce7d176Sdrh pParse->nErr++; 530cce7d176Sdrh return 1; 531cce7d176Sdrh } 532cce7d176Sdrh sqliteExprDelete(pLeft); 533cce7d176Sdrh pExpr->pLeft = 0; 534cce7d176Sdrh sqliteExprDelete(pRight); 535cce7d176Sdrh pExpr->pRight = 0; 536967e8b73Sdrh pExpr->op = TK_COLUMN; 537cce7d176Sdrh break; 538cce7d176Sdrh } 539cce7d176Sdrh 540fef5208cSdrh case TK_IN: { 541d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 542fef5208cSdrh if( v==0 ) return 1; 543a2e00042Sdrh if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 544cfab11bcSdrh return 1; 545cfab11bcSdrh } 546fef5208cSdrh if( pExpr->pSelect ){ 547fef5208cSdrh /* Case 1: expr IN (SELECT ...) 548fef5208cSdrh ** 549fef5208cSdrh ** Generate code to write the results of the select into a temporary 5504794b980Sdrh ** table. The cursor number of the temporary table has already 5514794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 552fef5208cSdrh */ 553c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 554fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 555fef5208cSdrh }else if( pExpr->pList ){ 556fef5208cSdrh /* Case 2: expr IN (exprlist) 557fef5208cSdrh ** 558fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 559fef5208cSdrh ** in iTable. 560fef5208cSdrh */ 561fef5208cSdrh int i, iSet; 562fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 563fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 5649208643dSdrh if( !sqliteExprIsConstant(pE2) ){ 565fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 566fef5208cSdrh "right-hand side of IN operator must be constant", 0); 567fef5208cSdrh pParse->nErr++; 568fef5208cSdrh return 1; 569fef5208cSdrh } 5704794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 5714794b980Sdrh return 1; 5724794b980Sdrh } 573fef5208cSdrh } 574fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 575fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 576fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 577fef5208cSdrh switch( pE2->op ){ 578fef5208cSdrh case TK_FLOAT: 579fef5208cSdrh case TK_INTEGER: 580fef5208cSdrh case TK_STRING: { 58199fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 582a76b5dfcSdrh assert( pE2->token.z ); 583fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 584fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 585fef5208cSdrh break; 586fef5208cSdrh } 587fef5208cSdrh default: { 588fef5208cSdrh sqliteExprCode(pParse, pE2); 58999fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 590fef5208cSdrh break; 591fef5208cSdrh } 592fef5208cSdrh } 593fef5208cSdrh } 594fef5208cSdrh } 595cfab11bcSdrh break; 596fef5208cSdrh } 597fef5208cSdrh 59819a775c2Sdrh case TK_SELECT: { 599fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 600fef5208cSdrh ** value of this select in a memory cell and record the number 601967e8b73Sdrh ** of the memory cell in iColumn. 602fef5208cSdrh */ 603967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 604967e8b73Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){ 60519a775c2Sdrh return 1; 60619a775c2Sdrh } 60719a775c2Sdrh break; 60819a775c2Sdrh } 60919a775c2Sdrh 610cce7d176Sdrh /* For all else, just recursively walk the tree */ 611cce7d176Sdrh default: { 612cce7d176Sdrh if( pExpr->pLeft 613a2e00042Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 614cce7d176Sdrh return 1; 615cce7d176Sdrh } 616cce7d176Sdrh if( pExpr->pRight 617a2e00042Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){ 618cce7d176Sdrh return 1; 619cce7d176Sdrh } 620cce7d176Sdrh if( pExpr->pList ){ 621cce7d176Sdrh int i; 622cce7d176Sdrh ExprList *pList = pExpr->pList; 623cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 624a2e00042Sdrh if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){ 625cce7d176Sdrh return 1; 626cce7d176Sdrh } 627cce7d176Sdrh } 628cce7d176Sdrh } 629cce7d176Sdrh } 630cce7d176Sdrh } 631cce7d176Sdrh return 0; 632cce7d176Sdrh } 633cce7d176Sdrh 634cce7d176Sdrh #if 0 /* NOT USED */ 635cce7d176Sdrh /* 636cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 637cce7d176Sdrh */ 638cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 639cce7d176Sdrh int n = strlen(zStr); 640cce7d176Sdrh if( n!=pToken->n ) return 0; 641cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 642cce7d176Sdrh } 643cce7d176Sdrh #endif 644cce7d176Sdrh 645cce7d176Sdrh /* 646cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 647cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 648cce7d176Sdrh */ 649cce7d176Sdrh int sqliteFuncId(Token *pToken){ 650cce7d176Sdrh static const struct { 651cce7d176Sdrh char *zName; 652cce7d176Sdrh int len; 653cce7d176Sdrh int id; 654cce7d176Sdrh } aFunc[] = { 655cce7d176Sdrh { "count", 5, FN_Count }, 656cce7d176Sdrh { "min", 3, FN_Min }, 657cce7d176Sdrh { "max", 3, FN_Max }, 658cce7d176Sdrh { "sum", 3, FN_Sum }, 6592282792aSdrh { "avg", 3, FN_Avg }, 6606ec2733bSdrh { "length", 6, FN_Length }, 6616ec2733bSdrh { "substr", 6, FN_Substr }, 662bf4133cbSdrh { "abs", 3, FN_Abs }, 663bf4133cbSdrh { "round", 5, FN_Round }, 664cce7d176Sdrh }; 665cce7d176Sdrh int i; 666cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 667cce7d176Sdrh if( aFunc[i].len==pToken->n 668cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 669cce7d176Sdrh return aFunc[i].id; 670cce7d176Sdrh } 671cce7d176Sdrh } 672cce7d176Sdrh return FN_Unknown; 673cce7d176Sdrh } 674cce7d176Sdrh 675cce7d176Sdrh /* 676cce7d176Sdrh ** Error check the functions in an expression. Make sure all 677cce7d176Sdrh ** function names are recognized and all functions have the correct 678cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 679cce7d176Sdrh ** if anything is amiss. Return the number of errors. 680cce7d176Sdrh ** 681cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 682cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 683cce7d176Sdrh */ 684cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 685cce7d176Sdrh int nErr = 0; 686cce7d176Sdrh if( pExpr==0 ) return 0; 687cce7d176Sdrh switch( pExpr->op ){ 688cce7d176Sdrh case TK_FUNCTION: { 689cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 690cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 691cce7d176Sdrh int no_such_func = 0; 692cce7d176Sdrh int too_many_args = 0; 693cce7d176Sdrh int too_few_args = 0; 6948e0a2f90Sdrh int wrong_num_args = 0; 695cce7d176Sdrh int is_agg = 0; 696cce7d176Sdrh int i; 697967e8b73Sdrh pExpr->iColumn = id; 698cce7d176Sdrh switch( id ){ 699cce7d176Sdrh case FN_Unknown: { 7008e0a2f90Sdrh UserFunc *pUser = sqliteFindUserFunction(pParse->db, 7018e0a2f90Sdrh pExpr->token.z, pExpr->token.n, n, 0); 7028e0a2f90Sdrh if( pUser==0 ){ 7038e0a2f90Sdrh pUser = sqliteFindUserFunction(pParse->db, 7048e0a2f90Sdrh pExpr->token.z, pExpr->token.n, -1, 0); 7058e0a2f90Sdrh if( pUser==0 ){ 706cce7d176Sdrh no_such_func = 1; 7078e0a2f90Sdrh }else{ 7088e0a2f90Sdrh wrong_num_args = 1; 7098e0a2f90Sdrh } 7108e0a2f90Sdrh }else{ 7118e0a2f90Sdrh is_agg = pUser->xFunc==0; 7128e0a2f90Sdrh } 713cce7d176Sdrh break; 714cce7d176Sdrh } 715cce7d176Sdrh case FN_Count: { 716cce7d176Sdrh too_many_args = n>1; 717cce7d176Sdrh is_agg = 1; 718cce7d176Sdrh break; 719cce7d176Sdrh } 720cce7d176Sdrh case FN_Max: 721cce7d176Sdrh case FN_Min: { 7228e0a2f90Sdrh too_few_args = n<1; 723cce7d176Sdrh is_agg = n==1; 724cce7d176Sdrh break; 725cce7d176Sdrh } 7262282792aSdrh case FN_Avg: 727cce7d176Sdrh case FN_Sum: { 728cce7d176Sdrh too_many_args = n>1; 729cce7d176Sdrh too_few_args = n<1; 730cce7d176Sdrh is_agg = 1; 731cce7d176Sdrh break; 732cce7d176Sdrh } 733bf4133cbSdrh case FN_Abs: 7346ec2733bSdrh case FN_Length: { 7356ec2733bSdrh too_few_args = n<1; 7366ec2733bSdrh too_many_args = n>1; 7376ec2733bSdrh break; 7386ec2733bSdrh } 739bf4133cbSdrh case FN_Round: { 740bf4133cbSdrh too_few_args = n<1; 741bf4133cbSdrh too_many_args = n>2; 742bf4133cbSdrh break; 743bf4133cbSdrh } 7446ec2733bSdrh case FN_Substr: { 7456ec2733bSdrh too_few_args = n<3; 7466ec2733bSdrh too_many_args = n>3; 7476ec2733bSdrh break; 7486ec2733bSdrh } 749cce7d176Sdrh default: break; 750cce7d176Sdrh } 7518e0a2f90Sdrh if( is_agg && !allowAgg ){ 7528e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1, 7538e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 7548e0a2f90Sdrh pParse->nErr++; 7558e0a2f90Sdrh nErr++; 7568e0a2f90Sdrh is_agg = 0; 7578e0a2f90Sdrh }else if( no_such_func ){ 758cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 759cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 760cce7d176Sdrh pParse->nErr++; 761cce7d176Sdrh nErr++; 762cce7d176Sdrh }else if( too_many_args ){ 763cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 764cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 765cce7d176Sdrh pParse->nErr++; 766cce7d176Sdrh nErr++; 767cce7d176Sdrh }else if( too_few_args ){ 768cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 769cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 770cce7d176Sdrh pParse->nErr++; 771cce7d176Sdrh nErr++; 7728e0a2f90Sdrh }else if( wrong_num_args ){ 7738e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, 7748e0a2f90Sdrh "wrong number of arguments to function ",-1, 7758e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 7768e0a2f90Sdrh pParse->nErr++; 7778e0a2f90Sdrh nErr++; 778cce7d176Sdrh } 7792282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 780cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 781cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 7824cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 7834cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 784cce7d176Sdrh } 785cce7d176Sdrh } 786cce7d176Sdrh default: { 787cce7d176Sdrh if( pExpr->pLeft ){ 7882282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 789cce7d176Sdrh } 790cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 7912282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 792cce7d176Sdrh } 793fef5208cSdrh if( nErr==0 && pExpr->pList ){ 794fef5208cSdrh int n = pExpr->pList->nExpr; 795fef5208cSdrh int i; 796fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 7972282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 7982282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 799fef5208cSdrh } 800fef5208cSdrh } 801cce7d176Sdrh break; 802cce7d176Sdrh } 803cce7d176Sdrh } 804cce7d176Sdrh return nErr; 805cce7d176Sdrh } 806cce7d176Sdrh 807cce7d176Sdrh /* 808cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 8091ccde15dSdrh ** expression and leave the result on the top of stack. 810cce7d176Sdrh */ 811cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 812cce7d176Sdrh Vdbe *v = pParse->pVdbe; 813cce7d176Sdrh int op; 814daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 815cce7d176Sdrh switch( pExpr->op ){ 816cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 817cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 818cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 819cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 820cce7d176Sdrh case TK_AND: op = OP_And; break; 821cce7d176Sdrh case TK_OR: op = OP_Or; break; 822cce7d176Sdrh case TK_LT: op = OP_Lt; break; 823cce7d176Sdrh case TK_LE: op = OP_Le; break; 824cce7d176Sdrh case TK_GT: op = OP_Gt; break; 825cce7d176Sdrh case TK_GE: op = OP_Ge; break; 826cce7d176Sdrh case TK_NE: op = OP_Ne; break; 827cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 828cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 829cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 830cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 831cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 832cce7d176Sdrh case TK_NOT: op = OP_Not; break; 833cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 834bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 835bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 836bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 837bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 838bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 839bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 840cce7d176Sdrh default: break; 841cce7d176Sdrh } 842cce7d176Sdrh switch( pExpr->op ){ 843967e8b73Sdrh case TK_COLUMN: { 8442282792aSdrh if( pParse->useAgg ){ 84599fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 846c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 84799fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 848c4a3c779Sdrh }else{ 84999fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 8502282792aSdrh } 851cce7d176Sdrh break; 852cce7d176Sdrh } 853ef6764a1Sdrh case TK_FLOAT: 854cce7d176Sdrh case TK_INTEGER: { 8557a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 856a76b5dfcSdrh assert( pExpr->token.z ); 8577a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 858cce7d176Sdrh break; 859cce7d176Sdrh } 860cce7d176Sdrh case TK_STRING: { 86199fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 862a76b5dfcSdrh assert( pExpr->token.z ); 863cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 864cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 865cce7d176Sdrh break; 866cce7d176Sdrh } 867cce7d176Sdrh case TK_NULL: { 86899fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 869cce7d176Sdrh break; 870cce7d176Sdrh } 871cce7d176Sdrh case TK_AND: 872cce7d176Sdrh case TK_OR: 873cce7d176Sdrh case TK_PLUS: 874cce7d176Sdrh case TK_STAR: 875cce7d176Sdrh case TK_MINUS: 876bf4133cbSdrh case TK_REM: 877bf4133cbSdrh case TK_BITAND: 878bf4133cbSdrh case TK_BITOR: 879cce7d176Sdrh case TK_SLASH: { 880cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 881cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 88299fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 883cce7d176Sdrh break; 884cce7d176Sdrh } 885bf4133cbSdrh case TK_LSHIFT: 886bf4133cbSdrh case TK_RSHIFT: { 887bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 888bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 889bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 890bf4133cbSdrh break; 891bf4133cbSdrh } 8920040077dSdrh case TK_CONCAT: { 8930040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 8940040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 89599fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 8960040077dSdrh break; 8970040077dSdrh } 898cce7d176Sdrh case TK_LT: 899cce7d176Sdrh case TK_LE: 900cce7d176Sdrh case TK_GT: 901cce7d176Sdrh case TK_GE: 902cce7d176Sdrh case TK_NE: 903cce7d176Sdrh case TK_EQ: 904cce7d176Sdrh case TK_LIKE: 905cce7d176Sdrh case TK_GLOB: { 906cce7d176Sdrh int dest; 90799fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 908cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 909cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 910cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 91199fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 91299fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 913cce7d176Sdrh break; 914cce7d176Sdrh } 915cce7d176Sdrh case TK_UMINUS: { 9166e142f54Sdrh assert( pExpr->pLeft ); 9177a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 9186e142f54Sdrh Token *p = &pExpr->pLeft->token; 9196e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 9206e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 92199fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 92299fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 9236e142f54Sdrh sqliteFree(z); 9246e142f54Sdrh break; 9256e142f54Sdrh } 9261ccde15dSdrh /* Fall through into TK_NOT */ 9276e142f54Sdrh } 928bf4133cbSdrh case TK_BITNOT: 9296e142f54Sdrh case TK_NOT: { 930cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 93199fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 932cce7d176Sdrh break; 933cce7d176Sdrh } 934cce7d176Sdrh case TK_ISNULL: 935cce7d176Sdrh case TK_NOTNULL: { 936cce7d176Sdrh int dest; 93799fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 938cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 939cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 94099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 94199fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 942cce7d176Sdrh break; 943cce7d176Sdrh } 9442282792aSdrh case TK_AGG_FUNCTION: { 94599fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 946967e8b73Sdrh if( pExpr->iColumn==FN_Avg ){ 9472282792aSdrh assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); 94899fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount); 94999fcd718Sdrh sqliteVdbeAddOp(v, OP_Divide, 0, 0); 9502282792aSdrh } 9512282792aSdrh break; 9522282792aSdrh } 953cce7d176Sdrh case TK_FUNCTION: { 954967e8b73Sdrh int id = pExpr->iColumn; 955cce7d176Sdrh int op; 956cce7d176Sdrh int i; 957cce7d176Sdrh ExprList *pList = pExpr->pList; 9586ec2733bSdrh switch( id ){ 9596ec2733bSdrh case FN_Min: 9606ec2733bSdrh case FN_Max: { 961cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 962cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 963cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 964cce7d176Sdrh if( i>0 ){ 96599fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 966cce7d176Sdrh } 967cce7d176Sdrh } 968cce7d176Sdrh break; 969cce7d176Sdrh } 970bf4133cbSdrh case FN_Abs: { 971bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 972bf4133cbSdrh sqliteVdbeAddOp(v, OP_AbsValue, 0, 0); 973bf4133cbSdrh break; 974bf4133cbSdrh } 975bf4133cbSdrh case FN_Round: { 976bf4133cbSdrh if( pList->nExpr==2 ){ 977bf4133cbSdrh sqliteExprCode(pParse, pList->a[1].pExpr); 978bf4133cbSdrh }else{ 979bf4133cbSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 980bf4133cbSdrh } 981bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 982bf4133cbSdrh sqliteVdbeAddOp(v, OP_Precision, 0, 0); 983bf4133cbSdrh break; 984bf4133cbSdrh } 9856ec2733bSdrh case FN_Length: { 9866ec2733bSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 98799fcd718Sdrh sqliteVdbeAddOp(v, OP_Strlen, 0, 0); 9886ec2733bSdrh break; 9896ec2733bSdrh } 9906ec2733bSdrh case FN_Substr: { 9916ec2733bSdrh for(i=0; i<pList->nExpr; i++){ 9926ec2733bSdrh sqliteExprCode(pParse, pList->a[i].pExpr); 9936ec2733bSdrh } 99499fcd718Sdrh sqliteVdbeAddOp(v, OP_Substr, 0, 0); 9956ec2733bSdrh break; 9966ec2733bSdrh } 9978e0a2f90Sdrh case FN_Unknown: { 9988e0a2f90Sdrh UserFunc *pUser; 9998e0a2f90Sdrh pUser = sqliteFindUserFunction(pParse->db, 10008e0a2f90Sdrh pExpr->token.z, pExpr->token.n, pList->nExpr, 0); 10018e0a2f90Sdrh assert( pUser!=0 ); 10028e0a2f90Sdrh for(i=0; i<pList->nExpr; i++){ 10038e0a2f90Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 10048e0a2f90Sdrh } 10058e0a2f90Sdrh sqliteVdbeAddOp(v, OP_UserFunc, pList->nExpr, 0); 10068e0a2f90Sdrh sqliteVdbeChangeP3(v, -1, (char*)pUser->xFunc, P3_POINTER); 10078e0a2f90Sdrh break; 10088e0a2f90Sdrh } 10096ec2733bSdrh default: { 10106ec2733bSdrh /* Can't happen! */ 10116ec2733bSdrh break; 10126ec2733bSdrh } 10136ec2733bSdrh } 10146ec2733bSdrh break; 10156ec2733bSdrh } 101619a775c2Sdrh case TK_SELECT: { 101799fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 101819a775c2Sdrh break; 101919a775c2Sdrh } 1020fef5208cSdrh case TK_IN: { 1021fef5208cSdrh int addr; 102299fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 1023fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 1024fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1025fef5208cSdrh if( pExpr->pSelect ){ 102699fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2); 1027fef5208cSdrh }else{ 102899fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2); 1029fef5208cSdrh } 103099fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 1031fef5208cSdrh break; 1032fef5208cSdrh } 1033fef5208cSdrh case TK_BETWEEN: { 1034fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 103599fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 1036fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 103799fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0); 1038fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 1039fef5208cSdrh break; 1040fef5208cSdrh } 1041a2e00042Sdrh case TK_AS: { 1042a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1043a2e00042Sdrh break; 1044a2e00042Sdrh } 1045cce7d176Sdrh } 1046cce7d176Sdrh return; 1047cce7d176Sdrh } 1048cce7d176Sdrh 1049cce7d176Sdrh /* 1050cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 1051cce7d176Sdrh ** to the label "dest" if the expression is true but execution 1052cce7d176Sdrh ** continues straight thru if the expression is false. 1053cce7d176Sdrh */ 1054cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 1055cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1056cce7d176Sdrh int op = 0; 1057daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1058cce7d176Sdrh switch( pExpr->op ){ 1059cce7d176Sdrh case TK_LT: op = OP_Lt; break; 1060cce7d176Sdrh case TK_LE: op = OP_Le; break; 1061cce7d176Sdrh case TK_GT: op = OP_Gt; break; 1062cce7d176Sdrh case TK_GE: op = OP_Ge; break; 1063cce7d176Sdrh case TK_NE: op = OP_Ne; break; 1064cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 1065cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 1066cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 1067cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 1068cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 1069cce7d176Sdrh default: break; 1070cce7d176Sdrh } 1071cce7d176Sdrh switch( pExpr->op ){ 1072cce7d176Sdrh case TK_AND: { 1073cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1074cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 1075cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 1076cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1077cce7d176Sdrh break; 1078cce7d176Sdrh } 1079cce7d176Sdrh case TK_OR: { 1080cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 1081cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 1082cce7d176Sdrh break; 1083cce7d176Sdrh } 1084cce7d176Sdrh case TK_NOT: { 1085cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 1086cce7d176Sdrh break; 1087cce7d176Sdrh } 1088cce7d176Sdrh case TK_LT: 1089cce7d176Sdrh case TK_LE: 1090cce7d176Sdrh case TK_GT: 1091cce7d176Sdrh case TK_GE: 1092cce7d176Sdrh case TK_NE: 1093cce7d176Sdrh case TK_EQ: 1094cce7d176Sdrh case TK_LIKE: 1095cce7d176Sdrh case TK_GLOB: { 1096cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1097cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 109899fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1099cce7d176Sdrh break; 1100cce7d176Sdrh } 1101cce7d176Sdrh case TK_ISNULL: 1102cce7d176Sdrh case TK_NOTNULL: { 1103cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 110499fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1105cce7d176Sdrh break; 1106cce7d176Sdrh } 1107fef5208cSdrh case TK_IN: { 1108cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1109fef5208cSdrh if( pExpr->pSelect ){ 111099fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1111fef5208cSdrh }else{ 111299fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1113fef5208cSdrh } 1114fef5208cSdrh break; 1115fef5208cSdrh } 1116fef5208cSdrh case TK_BETWEEN: { 1117fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 1118fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 111999fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1120fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 112199fcd718Sdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl); 1122fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 112399fcd718Sdrh sqliteVdbeAddOp(v, OP_Le, 0, dest); 112499fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 112599fcd718Sdrh sqliteVdbeResolveLabel(v, lbl); 112699fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1127fef5208cSdrh break; 1128fef5208cSdrh } 1129cce7d176Sdrh default: { 1130cce7d176Sdrh sqliteExprCode(pParse, pExpr); 113199fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 1132cce7d176Sdrh break; 1133cce7d176Sdrh } 1134cce7d176Sdrh } 1135cce7d176Sdrh } 1136cce7d176Sdrh 1137cce7d176Sdrh /* 113866b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1139cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1140cce7d176Sdrh ** continues straight thru if the expression is true. 1141cce7d176Sdrh */ 1142cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 1143cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1144cce7d176Sdrh int op = 0; 1145daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1146cce7d176Sdrh switch( pExpr->op ){ 1147cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1148cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1149cce7d176Sdrh case TK_GT: op = OP_Le; break; 1150cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1151cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1152cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1153cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 1154cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 1155cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1156cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1157cce7d176Sdrh default: break; 1158cce7d176Sdrh } 1159cce7d176Sdrh switch( pExpr->op ){ 1160cce7d176Sdrh case TK_AND: { 1161cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 1162cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 1163cce7d176Sdrh break; 1164cce7d176Sdrh } 1165cce7d176Sdrh case TK_OR: { 1166cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1167cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 1168cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 1169cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1170cce7d176Sdrh break; 1171cce7d176Sdrh } 1172cce7d176Sdrh case TK_NOT: { 1173cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 1174cce7d176Sdrh break; 1175cce7d176Sdrh } 1176cce7d176Sdrh case TK_LT: 1177cce7d176Sdrh case TK_LE: 1178cce7d176Sdrh case TK_GT: 1179cce7d176Sdrh case TK_GE: 1180cce7d176Sdrh case TK_NE: 1181cce7d176Sdrh case TK_EQ: { 1182cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1183cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 118499fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1185cce7d176Sdrh break; 1186cce7d176Sdrh } 1187cce7d176Sdrh case TK_LIKE: 1188cce7d176Sdrh case TK_GLOB: { 1189cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1190cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 119199fcd718Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1192cce7d176Sdrh break; 1193cce7d176Sdrh } 1194cce7d176Sdrh case TK_ISNULL: 1195cce7d176Sdrh case TK_NOTNULL: { 1196cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 119799fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1198cce7d176Sdrh break; 1199cce7d176Sdrh } 1200fef5208cSdrh case TK_IN: { 1201cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1202fef5208cSdrh if( pExpr->pSelect ){ 120399fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1204fef5208cSdrh }else{ 120599fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1206fef5208cSdrh } 1207fef5208cSdrh break; 1208fef5208cSdrh } 1209fef5208cSdrh case TK_BETWEEN: { 1210fef5208cSdrh int addr; 1211fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 121299fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1213fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1214fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 121599fcd718Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); 121699fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 121799fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 1218fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 121999fcd718Sdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest); 1220fef5208cSdrh break; 1221fef5208cSdrh } 1222cce7d176Sdrh default: { 1223cce7d176Sdrh sqliteExprCode(pParse, pExpr); 122499fcd718Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0); 122599fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 1226cce7d176Sdrh break; 1227cce7d176Sdrh } 1228cce7d176Sdrh } 1229cce7d176Sdrh } 12302282792aSdrh 12312282792aSdrh /* 12322282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 12332282792aSdrh ** if they are identical and return FALSE if they differ in any way. 12342282792aSdrh */ 1235d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 12362282792aSdrh int i; 12372282792aSdrh if( pA==0 ){ 12382282792aSdrh return pB==0; 12392282792aSdrh }else if( pB==0 ){ 12402282792aSdrh return 0; 12412282792aSdrh } 12422282792aSdrh if( pA->op!=pB->op ) return 0; 1243d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1244d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 12452282792aSdrh if( pA->pList ){ 12462282792aSdrh if( pB->pList==0 ) return 0; 12472282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 12482282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1249d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 12502282792aSdrh return 0; 12512282792aSdrh } 12522282792aSdrh } 12532282792aSdrh }else if( pB->pList ){ 12542282792aSdrh return 0; 12552282792aSdrh } 12562282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 12572282792aSdrh if( pA->token.z ){ 12582282792aSdrh if( pB->token.z==0 ) return 0; 12592282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 12602282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 12612282792aSdrh } 12622282792aSdrh return 1; 12632282792aSdrh } 12642282792aSdrh 12652282792aSdrh /* 12662282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 12672282792aSdrh */ 12682282792aSdrh static int appendAggInfo(Parse *pParse){ 12692282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 12702282792aSdrh int amt = pParse->nAgg + 8; 12716d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 12726d4abfbeSdrh if( aAgg==0 ){ 12732282792aSdrh return -1; 12742282792aSdrh } 12756d4abfbeSdrh pParse->aAgg = aAgg; 12762282792aSdrh } 12772282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 12782282792aSdrh return pParse->nAgg++; 12792282792aSdrh } 12802282792aSdrh 12812282792aSdrh /* 12822282792aSdrh ** Analyze the given expression looking for aggregate functions and 12832282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 12842282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 12852282792aSdrh ** 12862282792aSdrh ** This routine should only be called after the expression has been 12872282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 12882282792aSdrh ** 12892282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 12902282792aSdrh ** the number of errors. 12912282792aSdrh */ 12922282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 12932282792aSdrh int i; 12942282792aSdrh AggExpr *aAgg; 12952282792aSdrh int nErr = 0; 12962282792aSdrh 12972282792aSdrh if( pExpr==0 ) return 0; 12982282792aSdrh switch( pExpr->op ){ 1299967e8b73Sdrh case TK_COLUMN: { 13002282792aSdrh aAgg = pParse->aAgg; 13012282792aSdrh for(i=0; i<pParse->nAgg; i++){ 13022282792aSdrh if( aAgg[i].isAgg ) continue; 13032282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1304967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 13052282792aSdrh break; 13062282792aSdrh } 13072282792aSdrh } 13082282792aSdrh if( i>=pParse->nAgg ){ 13092282792aSdrh i = appendAggInfo(pParse); 13102282792aSdrh if( i<0 ) return 1; 13112282792aSdrh pParse->aAgg[i].isAgg = 0; 13122282792aSdrh pParse->aAgg[i].pExpr = pExpr; 13132282792aSdrh } 1314aaf88729Sdrh pExpr->iAgg = i; 13152282792aSdrh break; 13162282792aSdrh } 13172282792aSdrh case TK_AGG_FUNCTION: { 1318967e8b73Sdrh if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){ 13192282792aSdrh if( pParse->iAggCount>=0 ){ 13202282792aSdrh i = pParse->iAggCount; 13212282792aSdrh }else{ 13222282792aSdrh i = appendAggInfo(pParse); 13232282792aSdrh if( i<0 ) return 1; 13242282792aSdrh pParse->aAgg[i].isAgg = 1; 13252282792aSdrh pParse->aAgg[i].pExpr = 0; 13262282792aSdrh pParse->iAggCount = i; 13272282792aSdrh } 1328967e8b73Sdrh if( pExpr->iColumn==FN_Count ){ 13292282792aSdrh pExpr->iAgg = i; 13302282792aSdrh break; 13312282792aSdrh } 13322282792aSdrh } 13332282792aSdrh aAgg = pParse->aAgg; 13342282792aSdrh for(i=0; i<pParse->nAgg; i++){ 13352282792aSdrh if( !aAgg[i].isAgg ) continue; 1336d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 13372282792aSdrh break; 13382282792aSdrh } 13392282792aSdrh } 13402282792aSdrh if( i>=pParse->nAgg ){ 13412282792aSdrh i = appendAggInfo(pParse); 13422282792aSdrh if( i<0 ) return 1; 13432282792aSdrh pParse->aAgg[i].isAgg = 1; 13442282792aSdrh pParse->aAgg[i].pExpr = pExpr; 1345e5095355Sdrh if( pExpr->iColumn==FN_Unknown ){ 1346e5095355Sdrh pParse->aAgg[i].pUser = sqliteFindUserFunction(pParse->db, 1347e5095355Sdrh pExpr->token.z, pExpr->token.n, pExpr->pList->nExpr, 0); 1348e5095355Sdrh }else{ 1349e5095355Sdrh pParse->aAgg[i].pUser = 0; 1350e5095355Sdrh } 13512282792aSdrh } 13522282792aSdrh pExpr->iAgg = i; 13532282792aSdrh break; 13542282792aSdrh } 13552282792aSdrh default: { 13562282792aSdrh if( pExpr->pLeft ){ 13572282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 13582282792aSdrh } 13592282792aSdrh if( nErr==0 && pExpr->pRight ){ 13602282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 13612282792aSdrh } 13622282792aSdrh if( nErr==0 && pExpr->pList ){ 13632282792aSdrh int n = pExpr->pList->nExpr; 13642282792aSdrh int i; 13652282792aSdrh for(i=0; nErr==0 && i<n; i++){ 13662282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 13672282792aSdrh } 13682282792aSdrh } 13692282792aSdrh break; 13702282792aSdrh } 13712282792aSdrh } 13722282792aSdrh return nErr; 13732282792aSdrh } 13748e0a2f90Sdrh 13758e0a2f90Sdrh /* 13768e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 13778e0a2f90Sdrh ** Return a pointer to the UserFunc structure that defines that 13788e0a2f90Sdrh ** function, or return NULL if the function does not exist. 13798e0a2f90Sdrh ** 13808e0a2f90Sdrh ** If the createFlag argument is true, then a new (blank) UserFunc 13818e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 13828e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 13838e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 13848e0a2f90Sdrh ** any number of arguments will be returned. 13858e0a2f90Sdrh ** 13868e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 13878e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 13888e0a2f90Sdrh ** or xStep is non-zero. 13898e0a2f90Sdrh */ 13908e0a2f90Sdrh UserFunc *sqliteFindUserFunction( 13918e0a2f90Sdrh sqlite *db, /* An open database */ 13928e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 13938e0a2f90Sdrh int nName, /* Number of characters in the name */ 13948e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 13958e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 13968e0a2f90Sdrh ){ 13978e0a2f90Sdrh UserFunc *pFirst, *p, *pMaybe; 13988e0a2f90Sdrh pFirst = p = (UserFunc*)sqliteHashFind(&db->userFunc, zName, nName); 13998e0a2f90Sdrh if( !createFlag && nArg<0 ){ 14008e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 14018e0a2f90Sdrh return p; 14028e0a2f90Sdrh } 14038e0a2f90Sdrh pMaybe = 0; 14048e0a2f90Sdrh while( p && p->nArg!=nArg ){ 14058e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 14068e0a2f90Sdrh p = p->pNext; 14078e0a2f90Sdrh } 14088e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 14098e0a2f90Sdrh return 0; 14108e0a2f90Sdrh } 14118e0a2f90Sdrh if( p==0 && pMaybe ){ 14128e0a2f90Sdrh assert( createFlag==0 ); 14138e0a2f90Sdrh return pMaybe; 14148e0a2f90Sdrh } 14158e0a2f90Sdrh if( p==0 && createFlag ){ 14168e0a2f90Sdrh p = sqliteMalloc( sizeof(*p) ); 14178e0a2f90Sdrh p->nArg = nArg; 14188e0a2f90Sdrh p->pNext = pFirst; 14198e0a2f90Sdrh sqliteHashInsert(&db->userFunc, zName, nName, (void*)p); 14208e0a2f90Sdrh } 14218e0a2f90Sdrh return p; 14228e0a2f90Sdrh } 1423