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*f29ce559Sdanielk1977 ** $Id: expr.c,v 1.60 2002/05/19 23:43:14 danielk1977 Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 18cce7d176Sdrh 19a2e00042Sdrh 20a2e00042Sdrh /* 21a76b5dfcSdrh ** Construct a new expression node and return a pointer to it. Memory 22a76b5dfcSdrh ** for this node is obtained from sqliteMalloc(). The calling function 23a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed. 24a76b5dfcSdrh */ 25a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){ 26a76b5dfcSdrh Expr *pNew; 27a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 28a76b5dfcSdrh if( pNew==0 ){ 29a76b5dfcSdrh sqliteExprDelete(pLeft); 30a76b5dfcSdrh sqliteExprDelete(pRight); 31a76b5dfcSdrh return 0; 32a76b5dfcSdrh } 33a76b5dfcSdrh pNew->op = op; 34a76b5dfcSdrh pNew->pLeft = pLeft; 35a76b5dfcSdrh pNew->pRight = pRight; 36a76b5dfcSdrh if( pToken ){ 37a76b5dfcSdrh pNew->token = *pToken; 38a76b5dfcSdrh }else{ 39a76b5dfcSdrh pNew->token.z = 0; 40a76b5dfcSdrh pNew->token.n = 0; 41a76b5dfcSdrh } 42a76b5dfcSdrh if( pLeft && pRight ){ 43a76b5dfcSdrh sqliteExprSpan(pNew, &pLeft->span, &pRight->span); 44a76b5dfcSdrh }else{ 45a76b5dfcSdrh pNew->span = pNew->token; 46a76b5dfcSdrh } 47a76b5dfcSdrh return pNew; 48a76b5dfcSdrh } 49a76b5dfcSdrh 50a76b5dfcSdrh /* 51a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all 52a76b5dfcSdrh ** text between the two given tokens. 53a76b5dfcSdrh */ 54a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ 55a76b5dfcSdrh if( pExpr ){ 56a76b5dfcSdrh pExpr->span.z = pLeft->z; 57a76b5dfcSdrh pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z); 58a76b5dfcSdrh } 59a76b5dfcSdrh } 60a76b5dfcSdrh 61a76b5dfcSdrh /* 62a76b5dfcSdrh ** Construct a new expression node for a function with multiple 63a76b5dfcSdrh ** arguments. 64a76b5dfcSdrh */ 65a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){ 66a76b5dfcSdrh Expr *pNew; 67a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 68a76b5dfcSdrh if( pNew==0 ){ 69a76b5dfcSdrh sqliteExprListDelete(pList); 70a76b5dfcSdrh return 0; 71a76b5dfcSdrh } 72a76b5dfcSdrh pNew->op = TK_FUNCTION; 73a76b5dfcSdrh pNew->pList = pList; 74a76b5dfcSdrh if( pToken ){ 75a76b5dfcSdrh pNew->token = *pToken; 76a76b5dfcSdrh }else{ 77a76b5dfcSdrh pNew->token.z = 0; 78a76b5dfcSdrh pNew->token.n = 0; 79a76b5dfcSdrh } 80a76b5dfcSdrh return pNew; 81a76b5dfcSdrh } 82a76b5dfcSdrh 83a76b5dfcSdrh /* 84a2e00042Sdrh ** Recursively delete an expression tree. 85a2e00042Sdrh */ 86a2e00042Sdrh void sqliteExprDelete(Expr *p){ 87a2e00042Sdrh if( p==0 ) return; 88a2e00042Sdrh if( p->pLeft ) sqliteExprDelete(p->pLeft); 89a2e00042Sdrh if( p->pRight ) sqliteExprDelete(p->pRight); 90a2e00042Sdrh if( p->pList ) sqliteExprListDelete(p->pList); 91a2e00042Sdrh if( p->pSelect ) sqliteSelectDelete(p->pSelect); 92a2e00042Sdrh sqliteFree(p); 93a2e00042Sdrh } 94a2e00042Sdrh 95cce7d176Sdrh /* 96a76b5dfcSdrh ** The following group of functions are used to translate the string 97a76b5dfcSdrh ** pointers of tokens in expression from one buffer to another. 98a76b5dfcSdrh ** 99a76b5dfcSdrh ** Normally, the Expr.token.z and Expr.span.z fields point into the 100a76b5dfcSdrh ** original input buffer of an SQL statement. This is usually OK 101a76b5dfcSdrh ** since the SQL statement is executed and the expression is deleted 102a76b5dfcSdrh ** before the input buffer is freed. Making the tokens point to the 103a76b5dfcSdrh ** original input buffer saves many calls to malloc() and thus helps 104a76b5dfcSdrh ** the library to run faster. 105a76b5dfcSdrh ** 106a76b5dfcSdrh ** But sometimes we need an expression to persist past the time when 107a76b5dfcSdrh ** the input buffer is freed. (Example: The SELECT clause of a 108a76b5dfcSdrh ** CREATE VIEW statement contains expressions that must persist for 109a76b5dfcSdrh ** the life of the view.) When that happens we have to make a 110a76b5dfcSdrh ** persistent copy of the input buffer and translate the Expr.token.z 111a76b5dfcSdrh ** and Expr.span.z fields to point to the copy rather than the 112a2ed5601Sdrh ** original input buffer. The following group of routines handle that 113a76b5dfcSdrh ** translation. 114a76b5dfcSdrh ** 115a76b5dfcSdrh ** The "offset" parameter is the distance from the original input buffer 116a76b5dfcSdrh ** to the persistent copy. These routines recursively walk the entire 117a76b5dfcSdrh ** expression tree and shift all tokens by "offset" amount. 118a76b5dfcSdrh ** 119a76b5dfcSdrh ** The work of figuring out the appropriate "offset" and making the 120a76b5dfcSdrh ** presistent copy of the input buffer is done by the calling routine. 121a76b5dfcSdrh */ 122a76b5dfcSdrh void sqliteExprMoveStrings(Expr *p, int offset){ 123a76b5dfcSdrh if( p==0 ) return; 124a76b5dfcSdrh if( p->token.z ) p->token.z += offset; 125a76b5dfcSdrh if( p->span.z ) p->span.z += offset; 126a76b5dfcSdrh if( p->pLeft ) sqliteExprMoveStrings(p->pLeft, offset); 127a76b5dfcSdrh if( p->pRight ) sqliteExprMoveStrings(p->pRight, offset); 128a76b5dfcSdrh if( p->pList ) sqliteExprListMoveStrings(p->pList, offset); 129a76b5dfcSdrh if( p->pSelect ) sqliteSelectMoveStrings(p->pSelect, offset); 130a76b5dfcSdrh } 131a76b5dfcSdrh void sqliteExprListMoveStrings(ExprList *pList, int offset){ 132a76b5dfcSdrh int i; 133a76b5dfcSdrh if( pList==0 ) return; 134a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 135a76b5dfcSdrh sqliteExprMoveStrings(pList->a[i].pExpr, offset); 136a76b5dfcSdrh } 137a76b5dfcSdrh } 138a76b5dfcSdrh void sqliteSelectMoveStrings(Select *pSelect, int offset){ 139a76b5dfcSdrh if( pSelect==0 ) return; 140a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pEList, offset); 141a76b5dfcSdrh sqliteExprMoveStrings(pSelect->pWhere, offset); 142a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pGroupBy, offset); 143a76b5dfcSdrh sqliteExprMoveStrings(pSelect->pHaving, offset); 144a76b5dfcSdrh sqliteExprListMoveStrings(pSelect->pOrderBy, offset); 145a76b5dfcSdrh sqliteSelectMoveStrings(pSelect->pPrior, offset); 146a76b5dfcSdrh } 147a76b5dfcSdrh 148a76b5dfcSdrh /* 149ff78bd2fSdrh ** The following group of routines make deep copies of expressions, 150ff78bd2fSdrh ** expression lists, ID lists, and select statements. The copies can 151ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines) 152ff78bd2fSdrh ** without effecting the originals. 153ff78bd2fSdrh ** 154ff78bd2fSdrh ** Note, however, that the Expr.token.z and Expr.span.z fields point to 155ff78bd2fSdrh ** string space that is allocated separately from the expression tree 156ff78bd2fSdrh ** itself. These routines do NOT duplicate that string space. 157ff78bd2fSdrh ** 158ff78bd2fSdrh ** The expression list and ID list return by sqliteExprListDup() and 159ff78bd2fSdrh ** sqliteIdListDup() can not be further expanded by subsequent calls 160ff78bd2fSdrh ** to sqliteExprListAppend() or sqliteIdListAppend(). 161ff78bd2fSdrh ** 162ff78bd2fSdrh ** Any tables that the ID list might point to are not duplicated. 163ff78bd2fSdrh */ 164ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){ 165ff78bd2fSdrh Expr *pNew; 166ff78bd2fSdrh if( p==0 ) return 0; 167ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 168ff78bd2fSdrh if( pNew==0 ) return 0; 169ff78bd2fSdrh pNew->op = p->op; 170ff78bd2fSdrh pNew->pLeft = sqliteExprDup(p->pLeft); 171ff78bd2fSdrh pNew->pRight = sqliteExprDup(p->pRight); 172ff78bd2fSdrh pNew->pList = sqliteExprListDup(p->pList); 173832508b7Sdrh pNew->iTable = p->iTable; 174832508b7Sdrh pNew->iColumn = p->iColumn; 175832508b7Sdrh pNew->iAgg = p->iAgg; 176ff78bd2fSdrh pNew->token = p->token; 177ff78bd2fSdrh pNew->span = p->span; 178ff78bd2fSdrh pNew->pSelect = sqliteSelectDup(p->pSelect); 179ff78bd2fSdrh return pNew; 180ff78bd2fSdrh } 181ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){ 182ff78bd2fSdrh ExprList *pNew; 183ff78bd2fSdrh int i; 184ff78bd2fSdrh if( p==0 ) return 0; 185ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 186ff78bd2fSdrh if( pNew==0 ) return 0; 187ff78bd2fSdrh pNew->nExpr = p->nExpr; 188ff78bd2fSdrh pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); 189ff78bd2fSdrh for(i=0; i<p->nExpr; i++){ 190ff78bd2fSdrh pNew->a[i].pExpr = sqliteExprDup(p->a[i].pExpr); 191ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 192ff78bd2fSdrh pNew->a[i].sortOrder = p->a[i].sortOrder; 193ff78bd2fSdrh pNew->a[i].isAgg = p->a[i].isAgg; 194ff78bd2fSdrh pNew->a[i].done = 0; 195ff78bd2fSdrh } 196ff78bd2fSdrh return pNew; 197ff78bd2fSdrh } 198ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){ 199ff78bd2fSdrh IdList *pNew; 200ff78bd2fSdrh int i; 201ff78bd2fSdrh if( p==0 ) return 0; 202ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 203ff78bd2fSdrh if( pNew==0 ) return 0; 204ff78bd2fSdrh pNew->nId = p->nId; 205ff78bd2fSdrh pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) ); 206ff78bd2fSdrh for(i=0; i<p->nId; i++){ 207ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 208ff78bd2fSdrh pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias); 209ff78bd2fSdrh pNew->a[i].idx = p->a[i].idx; 210ff78bd2fSdrh pNew->a[i].pTab = 0; 211ff78bd2fSdrh pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect); 212ff78bd2fSdrh } 213ff78bd2fSdrh return pNew; 214ff78bd2fSdrh } 215ff78bd2fSdrh Select *sqliteSelectDup(Select *p){ 216ff78bd2fSdrh Select *pNew; 217ff78bd2fSdrh if( p==0 ) return 0; 218ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 219ff78bd2fSdrh if( pNew==0 ) return 0; 220ff78bd2fSdrh pNew->isDistinct = p->isDistinct; 221ff78bd2fSdrh pNew->pEList = sqliteExprListDup(p->pEList); 222ff78bd2fSdrh pNew->pSrc = sqliteIdListDup(p->pSrc); 223ff78bd2fSdrh pNew->pWhere = sqliteExprDup(p->pWhere); 224ff78bd2fSdrh pNew->pGroupBy = sqliteExprListDup(p->pGroupBy); 225ff78bd2fSdrh pNew->pHaving = sqliteExprDup(p->pHaving); 226ff78bd2fSdrh pNew->pOrderBy = sqliteExprListDup(p->pOrderBy); 227ff78bd2fSdrh pNew->op = p->op; 228ff78bd2fSdrh pNew->pPrior = sqliteSelectDup(p->pPrior); 229ff78bd2fSdrh pNew->nLimit = p->nLimit; 230ff78bd2fSdrh pNew->nOffset = p->nOffset; 231ff78bd2fSdrh pNew->zSelect = 0; 232ff78bd2fSdrh return pNew; 233ff78bd2fSdrh } 234ff78bd2fSdrh 235ff78bd2fSdrh 236ff78bd2fSdrh /* 237a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 238a76b5dfcSdrh ** initially NULL, then create a new expression list. 239a76b5dfcSdrh */ 240a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 241a76b5dfcSdrh int i; 242a76b5dfcSdrh if( pList==0 ){ 243a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 244a76b5dfcSdrh if( pList==0 ){ 245a76b5dfcSdrh sqliteExprDelete(pExpr); 246a76b5dfcSdrh return 0; 247a76b5dfcSdrh } 248a76b5dfcSdrh } 249a76b5dfcSdrh if( (pList->nExpr & 7)==0 ){ 250a76b5dfcSdrh int n = pList->nExpr + 8; 251a76b5dfcSdrh struct ExprList_item *a; 252a76b5dfcSdrh a = sqliteRealloc(pList->a, n*sizeof(pList->a[0])); 253a76b5dfcSdrh if( a==0 ){ 254a76b5dfcSdrh sqliteExprDelete(pExpr); 255a76b5dfcSdrh return pList; 256a76b5dfcSdrh } 257a76b5dfcSdrh pList->a = a; 258a76b5dfcSdrh } 259a76b5dfcSdrh if( pExpr || pName ){ 260a76b5dfcSdrh i = pList->nExpr++; 261a76b5dfcSdrh pList->a[i].pExpr = pExpr; 262a76b5dfcSdrh pList->a[i].zName = 0; 263a76b5dfcSdrh if( pName ){ 264a76b5dfcSdrh sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0); 265a76b5dfcSdrh sqliteDequote(pList->a[i].zName); 266a76b5dfcSdrh } 267a76b5dfcSdrh } 268a76b5dfcSdrh return pList; 269a76b5dfcSdrh } 270a76b5dfcSdrh 271a76b5dfcSdrh /* 272a76b5dfcSdrh ** Delete an entire expression list. 273a76b5dfcSdrh */ 274a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){ 275a76b5dfcSdrh int i; 276a76b5dfcSdrh if( pList==0 ) return; 277a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 278a76b5dfcSdrh sqliteExprDelete(pList->a[i].pExpr); 279a76b5dfcSdrh sqliteFree(pList->a[i].zName); 280a76b5dfcSdrh } 281a76b5dfcSdrh sqliteFree(pList->a); 282a76b5dfcSdrh sqliteFree(pList); 283a76b5dfcSdrh } 284a76b5dfcSdrh 285a76b5dfcSdrh /* 286fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 287fef5208cSdrh ** and 0 if it involves variables. 288fef5208cSdrh */ 2899208643dSdrh int sqliteExprIsConstant(Expr *p){ 290fef5208cSdrh switch( p->op ){ 291fef5208cSdrh case TK_ID: 292967e8b73Sdrh case TK_COLUMN: 293fef5208cSdrh case TK_DOT: 294fef5208cSdrh return 0; 2959208643dSdrh case TK_INTEGER: 2969208643dSdrh case TK_FLOAT: 2979208643dSdrh case TK_STRING: 2989208643dSdrh return 1; 299fef5208cSdrh default: { 3009208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 3019208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 302fef5208cSdrh if( p->pList ){ 303fef5208cSdrh int i; 304fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 3059208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 306fef5208cSdrh } 307fef5208cSdrh } 3089208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 309fef5208cSdrh } 310fef5208cSdrh } 3119208643dSdrh return 0; 312fef5208cSdrh } 313fef5208cSdrh 314fef5208cSdrh /* 315c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 316c4a3c779Sdrh */ 317c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 318c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 319c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 320c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 321c4a3c779Sdrh return 0; 322c4a3c779Sdrh } 323c4a3c779Sdrh 324c4a3c779Sdrh /* 325cce7d176Sdrh ** This routine walks an expression tree and resolves references to 326967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 327aacc543eSdrh ** index to the table in the table list and a column offset. The 328aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 329aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 330832508b7Sdrh ** plus the "base" value. The base value will ultimately become the 331aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 332aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 333aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 334aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 335aacc543eSdrh ** alias for ROWID. 33619a775c2Sdrh ** 337fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 338fef5208cSdrh ** forms: 339fef5208cSdrh ** 340fef5208cSdrh ** expr IN (exprlist) 341fef5208cSdrh ** and 342fef5208cSdrh ** expr IN (SELECT ...) 343fef5208cSdrh ** 344fef5208cSdrh ** The first form is handled by creating a set holding the list 345fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 346fef5208cSdrh ** a temporary table. 347fef5208cSdrh ** 348fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 34919a775c2Sdrh ** If it finds any, it generates code to write the value of that select 35019a775c2Sdrh ** into a memory cell. 351cce7d176Sdrh ** 352967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 353cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 354cce7d176Sdrh */ 355a2e00042Sdrh int sqliteExprResolveIds( 356a2e00042Sdrh Parse *pParse, /* The parser context */ 357832508b7Sdrh int base, /* VDBE cursor number for first entry in pTabList */ 358a2e00042Sdrh IdList *pTabList, /* List of tables used to resolve column names */ 359a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 360a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 361a2e00042Sdrh ){ 362daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 363832508b7Sdrh assert( base+pTabList->nId<=pParse->nTab ); 364cce7d176Sdrh switch( pExpr->op ){ 365a2e00042Sdrh /* A lone identifier. Try and match it as follows: 366a2e00042Sdrh ** 367a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 368a2e00042Sdrh ** 369a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 370a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 371a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 372a2e00042Sdrh ** 373a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 374a2e00042Sdrh */ 375cce7d176Sdrh case TK_ID: { 376cce7d176Sdrh int cnt = 0; /* Number of matches */ 377cce7d176Sdrh int i; /* Loop counter */ 378a76b5dfcSdrh char *z; 379a76b5dfcSdrh assert( pExpr->token.z ); 380a76b5dfcSdrh z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 3812f4392ffSdrh sqliteDequote(z); 382daffd0e5Sdrh if( z==0 ) return 1; 383cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 384cce7d176Sdrh int j; 385cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 386cce7d176Sdrh if( pTab==0 ) continue; 387417be79cSdrh assert( pTab->nCol>0 ); 388cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 3897020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 390cce7d176Sdrh cnt++; 391832508b7Sdrh pExpr->iTable = i + base; 3924a32431cSdrh if( j==pTab->iPKey ){ 3934a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 3944a32431cSdrh pExpr->iColumn = -1; 3954a32431cSdrh }else{ 396967e8b73Sdrh pExpr->iColumn = j; 397cce7d176Sdrh } 398a2e00042Sdrh pExpr->op = TK_COLUMN; 399a2e00042Sdrh } 400a2e00042Sdrh } 401a2e00042Sdrh } 402a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 403a2e00042Sdrh int j; 404a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 405a2e00042Sdrh char *zAs = pEList->a[j].zName; 406a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 407a2e00042Sdrh cnt++; 408a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 409a2e00042Sdrh pExpr->op = TK_AS; 410a2e00042Sdrh pExpr->iColumn = j; 41175148a27Sdrh pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr); 412cce7d176Sdrh } 413cce7d176Sdrh } 4144a32431cSdrh } 415c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 416c4a3c779Sdrh pExpr->iColumn = -1; 417832508b7Sdrh pExpr->iTable = base; 418c4a3c779Sdrh cnt = 1 + (pTabList->nId>1); 419a2e00042Sdrh pExpr->op = TK_COLUMN; 420c4a3c779Sdrh } 421cce7d176Sdrh sqliteFree(z); 422cce7d176Sdrh if( cnt==0 ){ 423967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 424cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 425cce7d176Sdrh pParse->nErr++; 426cce7d176Sdrh return 1; 427cce7d176Sdrh }else if( cnt>1 ){ 428967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 429cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 430cce7d176Sdrh pParse->nErr++; 431cce7d176Sdrh return 1; 432cce7d176Sdrh } 433cce7d176Sdrh break; 434cce7d176Sdrh } 435cce7d176Sdrh 436967e8b73Sdrh /* A table name and column name: ID.ID */ 437cce7d176Sdrh case TK_DOT: { 438cce7d176Sdrh int cnt = 0; /* Number of matches */ 439c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 440cce7d176Sdrh int i; /* Loop counter */ 441cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 442cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 443cce7d176Sdrh 444cce7d176Sdrh pLeft = pExpr->pLeft; 445cce7d176Sdrh pRight = pExpr->pRight; 446a76b5dfcSdrh assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); 447a76b5dfcSdrh assert( pRight && pRight->op==TK_ID && pRight->token.z ); 4486e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 4496e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 450daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 451daffd0e5Sdrh sqliteFree(zLeft); 452daffd0e5Sdrh sqliteFree(zRight); 453daffd0e5Sdrh return 1; 454daffd0e5Sdrh } 45587c40e88Sdrh sqliteDequote(zLeft); 45687c40e88Sdrh sqliteDequote(zRight); 457c4a3c779Sdrh pExpr->iTable = -1; 458cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 459cce7d176Sdrh int j; 460cce7d176Sdrh char *zTab; 461cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 462cce7d176Sdrh if( pTab==0 ) continue; 463417be79cSdrh assert( pTab->nCol>0 ); 464cce7d176Sdrh if( pTabList->a[i].zAlias ){ 465cce7d176Sdrh zTab = pTabList->a[i].zAlias; 466cce7d176Sdrh }else{ 467cce7d176Sdrh zTab = pTab->zName; 468cce7d176Sdrh } 469094b2bbfSdrh if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; 470832508b7Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + base; 471cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 4727020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 473cce7d176Sdrh cnt++; 474832508b7Sdrh pExpr->iTable = i + base; 4754a32431cSdrh if( j==pTab->iPKey ){ 4764a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 4774a32431cSdrh pExpr->iColumn = -1; 4784a32431cSdrh }else{ 479967e8b73Sdrh pExpr->iColumn = j; 480cce7d176Sdrh } 481cce7d176Sdrh } 482cce7d176Sdrh } 4834a32431cSdrh } 484c3f9bad2Sdanielk1977 485c3f9bad2Sdanielk1977 /* If we have not already resolved this *.* expression, then maybe 486c3f9bad2Sdanielk1977 * it is a new.* or old.* trigger argument reference */ 487c3f9bad2Sdanielk1977 if( cnt == 0 && pParse->trigStack != 0 ){ 488*f29ce559Sdanielk1977 TriggerStack *pTriggerStack = pParse->trigStack; 489c3f9bad2Sdanielk1977 int t = 0; 490*f29ce559Sdanielk1977 if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){ 491*f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->newIdx; 492c3f9bad2Sdanielk1977 cntTab++; 493c3f9bad2Sdanielk1977 t = 1; 494c3f9bad2Sdanielk1977 } 495*f29ce559Sdanielk1977 if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){ 496*f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->oldIdx; 497c3f9bad2Sdanielk1977 cntTab++; 498c3f9bad2Sdanielk1977 t = 1; 499c3f9bad2Sdanielk1977 } 500c3f9bad2Sdanielk1977 501*f29ce559Sdanielk1977 if( t ){ 502*f29ce559Sdanielk1977 int j; 503*f29ce559Sdanielk1977 for(j=0; j < pTriggerStack->pTab->nCol; j++) { 504*f29ce559Sdanielk1977 if( sqliteStrICmp(pTriggerStack->pTab->aCol[j].zName, zRight)==0 ){ 505c3f9bad2Sdanielk1977 cnt++; 506c3f9bad2Sdanielk1977 pExpr->iColumn = j; 507c3f9bad2Sdanielk1977 } 508c3f9bad2Sdanielk1977 } 509c3f9bad2Sdanielk1977 } 510*f29ce559Sdanielk1977 } 511c3f9bad2Sdanielk1977 512c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 513c4a3c779Sdrh cnt = 1; 514c4a3c779Sdrh pExpr->iColumn = -1; 515c4a3c779Sdrh } 516cce7d176Sdrh sqliteFree(zLeft); 517cce7d176Sdrh sqliteFree(zRight); 518cce7d176Sdrh if( cnt==0 ){ 519967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 520cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 521cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 522cce7d176Sdrh pParse->nErr++; 523cce7d176Sdrh return 1; 524cce7d176Sdrh }else if( cnt>1 ){ 525967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 526cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 527cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 528cce7d176Sdrh pParse->nErr++; 529cce7d176Sdrh return 1; 530cce7d176Sdrh } 531cce7d176Sdrh sqliteExprDelete(pLeft); 532cce7d176Sdrh pExpr->pLeft = 0; 533cce7d176Sdrh sqliteExprDelete(pRight); 534cce7d176Sdrh pExpr->pRight = 0; 535967e8b73Sdrh pExpr->op = TK_COLUMN; 536cce7d176Sdrh break; 537cce7d176Sdrh } 538cce7d176Sdrh 539fef5208cSdrh case TK_IN: { 540d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 541fef5208cSdrh if( v==0 ) return 1; 542832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 543cfab11bcSdrh return 1; 544cfab11bcSdrh } 545fef5208cSdrh if( pExpr->pSelect ){ 546fef5208cSdrh /* Case 1: expr IN (SELECT ...) 547fef5208cSdrh ** 548fef5208cSdrh ** Generate code to write the results of the select into a temporary 5494794b980Sdrh ** table. The cursor number of the temporary table has already 5504794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 551fef5208cSdrh */ 552832508b7Sdrh pExpr->iTable = pParse->nTab++; 553c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 554832508b7Sdrh sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0); 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++; 604832508b7Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){ 60519a775c2Sdrh return 1; 60619a775c2Sdrh } 60719a775c2Sdrh break; 60819a775c2Sdrh } 60919a775c2Sdrh 610cce7d176Sdrh /* For all else, just recursively walk the tree */ 611cce7d176Sdrh default: { 612cce7d176Sdrh if( pExpr->pLeft 613832508b7Sdrh && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 614cce7d176Sdrh return 1; 615cce7d176Sdrh } 616cce7d176Sdrh if( pExpr->pRight 617832508b7Sdrh && sqliteExprResolveIds(pParse, base, 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++){ 624832508b7Sdrh Expr *pArg = pList->a[i].pExpr; 625832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){ 626cce7d176Sdrh return 1; 627cce7d176Sdrh } 628cce7d176Sdrh } 629cce7d176Sdrh } 630cce7d176Sdrh } 631cce7d176Sdrh } 632cce7d176Sdrh return 0; 633cce7d176Sdrh } 634cce7d176Sdrh 635cce7d176Sdrh /* 636cce7d176Sdrh ** Error check the functions in an expression. Make sure all 637cce7d176Sdrh ** function names are recognized and all functions have the correct 638cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 639cce7d176Sdrh ** if anything is amiss. Return the number of errors. 640cce7d176Sdrh ** 641cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 642cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 643cce7d176Sdrh */ 644cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 645cce7d176Sdrh int nErr = 0; 646cce7d176Sdrh if( pExpr==0 ) return 0; 647cce7d176Sdrh switch( pExpr->op ){ 648cce7d176Sdrh case TK_FUNCTION: { 649cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 650cce7d176Sdrh int no_such_func = 0; 6518e0a2f90Sdrh int wrong_num_args = 0; 652cce7d176Sdrh int is_agg = 0; 653cce7d176Sdrh int i; 6540bce8354Sdrh FuncDef *pDef; 6550bce8354Sdrh 65689425d5eSdrh pDef = sqliteFindFunction(pParse->db, 65789425d5eSdrh pExpr->token.z, pExpr->token.n, n, 0); 6580bce8354Sdrh if( pDef==0 ){ 6590bce8354Sdrh pDef = sqliteFindFunction(pParse->db, 6608e0a2f90Sdrh pExpr->token.z, pExpr->token.n, -1, 0); 6610bce8354Sdrh if( pDef==0 ){ 662cce7d176Sdrh no_such_func = 1; 6638e0a2f90Sdrh }else{ 6648e0a2f90Sdrh wrong_num_args = 1; 6658e0a2f90Sdrh } 6668e0a2f90Sdrh }else{ 6670bce8354Sdrh is_agg = pDef->xFunc==0; 668cce7d176Sdrh } 6698e0a2f90Sdrh if( is_agg && !allowAgg ){ 6708e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1, 6718e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 6728e0a2f90Sdrh pParse->nErr++; 6738e0a2f90Sdrh nErr++; 6748e0a2f90Sdrh is_agg = 0; 6758e0a2f90Sdrh }else if( no_such_func ){ 676cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 677cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 678cce7d176Sdrh pParse->nErr++; 679cce7d176Sdrh nErr++; 6808e0a2f90Sdrh }else if( wrong_num_args ){ 6818e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, 6828e0a2f90Sdrh "wrong number of arguments to function ",-1, 6838e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 6848e0a2f90Sdrh pParse->nErr++; 6858e0a2f90Sdrh nErr++; 686cce7d176Sdrh } 6872282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 688cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 689cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 6904cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 6914cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 692cce7d176Sdrh } 693cce7d176Sdrh } 694cce7d176Sdrh default: { 695cce7d176Sdrh if( pExpr->pLeft ){ 6962282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 697cce7d176Sdrh } 698cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 6992282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 700cce7d176Sdrh } 701fef5208cSdrh if( nErr==0 && pExpr->pList ){ 702fef5208cSdrh int n = pExpr->pList->nExpr; 703fef5208cSdrh int i; 704fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 7052282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 7062282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 707fef5208cSdrh } 708fef5208cSdrh } 709cce7d176Sdrh break; 710cce7d176Sdrh } 711cce7d176Sdrh } 712cce7d176Sdrh return nErr; 713cce7d176Sdrh } 714cce7d176Sdrh 715cce7d176Sdrh /* 716cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 7171ccde15dSdrh ** expression and leave the result on the top of stack. 718cce7d176Sdrh */ 719cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 720cce7d176Sdrh Vdbe *v = pParse->pVdbe; 721cce7d176Sdrh int op; 722daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 723cce7d176Sdrh switch( pExpr->op ){ 724cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 725cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 726cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 727cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 728cce7d176Sdrh case TK_AND: op = OP_And; break; 729cce7d176Sdrh case TK_OR: op = OP_Or; break; 730cce7d176Sdrh case TK_LT: op = OP_Lt; break; 731cce7d176Sdrh case TK_LE: op = OP_Le; break; 732cce7d176Sdrh case TK_GT: op = OP_Gt; break; 733cce7d176Sdrh case TK_GE: op = OP_Ge; break; 734cce7d176Sdrh case TK_NE: op = OP_Ne; break; 735cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 736cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 737cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 738cce7d176Sdrh case TK_NOT: op = OP_Not; break; 739cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 740bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 741bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 742bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 743bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 744bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 745bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 746cce7d176Sdrh default: break; 747cce7d176Sdrh } 748cce7d176Sdrh switch( pExpr->op ){ 749967e8b73Sdrh case TK_COLUMN: { 7502282792aSdrh if( pParse->useAgg ){ 75199fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 752c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 75399fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 754c4a3c779Sdrh }else{ 75599fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 7562282792aSdrh } 757cce7d176Sdrh break; 758cce7d176Sdrh } 759cce7d176Sdrh case TK_INTEGER: { 760e6840900Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0); 761e6840900Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 762e6840900Sdrh break; 763e6840900Sdrh } 764e6840900Sdrh case TK_FLOAT: { 7657a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 766a76b5dfcSdrh assert( pExpr->token.z ); 7677a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 768cce7d176Sdrh break; 769cce7d176Sdrh } 770cce7d176Sdrh case TK_STRING: { 77199fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 772a76b5dfcSdrh assert( pExpr->token.z ); 773cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 774cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 775cce7d176Sdrh break; 776cce7d176Sdrh } 777cce7d176Sdrh case TK_NULL: { 77899fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 779cce7d176Sdrh break; 780cce7d176Sdrh } 781cce7d176Sdrh case TK_AND: 782cce7d176Sdrh case TK_OR: 783cce7d176Sdrh case TK_PLUS: 784cce7d176Sdrh case TK_STAR: 785cce7d176Sdrh case TK_MINUS: 786bf4133cbSdrh case TK_REM: 787bf4133cbSdrh case TK_BITAND: 788bf4133cbSdrh case TK_BITOR: 789cce7d176Sdrh case TK_SLASH: { 790cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 791cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 79299fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 793cce7d176Sdrh break; 794cce7d176Sdrh } 795bf4133cbSdrh case TK_LSHIFT: 796bf4133cbSdrh case TK_RSHIFT: { 797bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 798bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 799bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 800bf4133cbSdrh break; 801bf4133cbSdrh } 8020040077dSdrh case TK_CONCAT: { 8030040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 8040040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 80599fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 8060040077dSdrh break; 8070040077dSdrh } 808cce7d176Sdrh case TK_LT: 809cce7d176Sdrh case TK_LE: 810cce7d176Sdrh case TK_GT: 811cce7d176Sdrh case TK_GE: 812cce7d176Sdrh case TK_NE: 8130ac65892Sdrh case TK_EQ: { 814cce7d176Sdrh int dest; 81599fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 816cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 817cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 818cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 81999fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 82099fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 821cce7d176Sdrh break; 822cce7d176Sdrh } 823cce7d176Sdrh case TK_UMINUS: { 8246e142f54Sdrh assert( pExpr->pLeft ); 8257a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 8266e142f54Sdrh Token *p = &pExpr->pLeft->token; 8276e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 8286e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 829e6840900Sdrh if( pExpr->pLeft->op==TK_INTEGER ){ 830e6840900Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0); 831e6840900Sdrh }else{ 83299fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 833e6840900Sdrh } 83499fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 8356e142f54Sdrh sqliteFree(z); 8366e142f54Sdrh break; 8376e142f54Sdrh } 8381ccde15dSdrh /* Fall through into TK_NOT */ 8396e142f54Sdrh } 840bf4133cbSdrh case TK_BITNOT: 8416e142f54Sdrh case TK_NOT: { 842cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 84399fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 844cce7d176Sdrh break; 845cce7d176Sdrh } 846cce7d176Sdrh case TK_ISNULL: 847cce7d176Sdrh case TK_NOTNULL: { 848cce7d176Sdrh int dest; 84999fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 850cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 851cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 85299fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 85399fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 854cce7d176Sdrh break; 855cce7d176Sdrh } 8562282792aSdrh case TK_AGG_FUNCTION: { 85799fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 8582282792aSdrh break; 8592282792aSdrh } 860cce7d176Sdrh case TK_FUNCTION: { 861cce7d176Sdrh int i; 862cce7d176Sdrh ExprList *pList = pExpr->pList; 86389425d5eSdrh int nExpr = pList ? pList->nExpr : 0; 8640bce8354Sdrh FuncDef *pDef; 8650bce8354Sdrh pDef = sqliteFindFunction(pParse->db, 86689425d5eSdrh pExpr->token.z, pExpr->token.n, nExpr, 0); 8670bce8354Sdrh assert( pDef!=0 ); 86889425d5eSdrh for(i=0; i<nExpr; i++){ 8698e0a2f90Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 8708e0a2f90Sdrh } 87189425d5eSdrh sqliteVdbeAddOp(v, OP_Function, nExpr, 0); 8720bce8354Sdrh sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER); 8736ec2733bSdrh break; 8746ec2733bSdrh } 87519a775c2Sdrh case TK_SELECT: { 87699fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 87719a775c2Sdrh break; 87819a775c2Sdrh } 879fef5208cSdrh case TK_IN: { 880fef5208cSdrh int addr; 88199fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 882fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 883fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 884fef5208cSdrh if( pExpr->pSelect ){ 88599fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2); 886fef5208cSdrh }else{ 88799fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2); 888fef5208cSdrh } 88999fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 890fef5208cSdrh break; 891fef5208cSdrh } 892fef5208cSdrh case TK_BETWEEN: { 893fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 89499fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 895fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 89699fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0); 897fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 898fef5208cSdrh break; 899fef5208cSdrh } 900a2e00042Sdrh case TK_AS: { 901a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 902a2e00042Sdrh break; 903a2e00042Sdrh } 90417a7f8ddSdrh case TK_CASE: { 90517a7f8ddSdrh int expr_end_label; 90617a7f8ddSdrh int next_when_label; 90717a7f8ddSdrh int i; 90817a7f8ddSdrh 90917a7f8ddSdrh assert(pExpr->pList); 91017a7f8ddSdrh assert((pExpr->pList->nExpr % 2) == 0); 91117a7f8ddSdrh assert(pExpr->pList->nExpr > 0); 91217a7f8ddSdrh expr_end_label = sqliteVdbeMakeLabel(pParse->pVdbe); 91317a7f8ddSdrh if( pExpr->pLeft ){ 91417a7f8ddSdrh sqliteExprCode(pParse, pExpr->pLeft); 915cce7d176Sdrh } 91617a7f8ddSdrh for(i=0; i<pExpr->pList->nExpr; i=i+2){ 91717a7f8ddSdrh if( i!=0 ){ 91817a7f8ddSdrh sqliteVdbeResolveLabel(pParse->pVdbe, next_when_label); 91917a7f8ddSdrh } 92017a7f8ddSdrh next_when_label = sqliteVdbeMakeLabel(pParse->pVdbe); 92117a7f8ddSdrh if( pExpr->pLeft ){ 92217a7f8ddSdrh sqliteVdbeAddOp(pParse->pVdbe, OP_Dup, 0, 1); 92317a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i].pExpr); 92417a7f8ddSdrh sqliteVdbeAddOp(pParse->pVdbe, OP_Ne, 0, next_when_label); 92517a7f8ddSdrh }else{ 92617a7f8ddSdrh sqliteExprIfFalse(pParse, pExpr->pList->a[i].pExpr, next_when_label); 92717a7f8ddSdrh } 92817a7f8ddSdrh if( pExpr->pLeft ){ 92917a7f8ddSdrh sqliteVdbeAddOp(pParse->pVdbe, OP_Pop, 1, 0); 93017a7f8ddSdrh } 93117a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr); 93217a7f8ddSdrh sqliteVdbeAddOp(pParse->pVdbe, OP_Goto, 0, expr_end_label); 93317a7f8ddSdrh } 93417a7f8ddSdrh sqliteVdbeResolveLabel(pParse->pVdbe, next_when_label); 93517a7f8ddSdrh if( pExpr->pLeft ){ 93617a7f8ddSdrh sqliteVdbeAddOp(pParse->pVdbe, OP_Pop, 1, 0); 93717a7f8ddSdrh } 93817a7f8ddSdrh if( pExpr->pRight ){ 93917a7f8ddSdrh sqliteExprCode(pParse, pExpr->pRight); 94017a7f8ddSdrh }else{ 94117a7f8ddSdrh sqliteVdbeAddOp(pParse->pVdbe, OP_String, 0, 0); 94217a7f8ddSdrh } 94317a7f8ddSdrh sqliteVdbeResolveLabel(pParse->pVdbe, expr_end_label); 94417a7f8ddSdrh } 94517a7f8ddSdrh break; 94617a7f8ddSdrh } 947cce7d176Sdrh } 948cce7d176Sdrh 949cce7d176Sdrh /* 950cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 951cce7d176Sdrh ** to the label "dest" if the expression is true but execution 952cce7d176Sdrh ** continues straight thru if the expression is false. 953cce7d176Sdrh */ 954cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 955cce7d176Sdrh Vdbe *v = pParse->pVdbe; 956cce7d176Sdrh int op = 0; 957daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 958cce7d176Sdrh switch( pExpr->op ){ 959cce7d176Sdrh case TK_LT: op = OP_Lt; break; 960cce7d176Sdrh case TK_LE: op = OP_Le; break; 961cce7d176Sdrh case TK_GT: op = OP_Gt; break; 962cce7d176Sdrh case TK_GE: op = OP_Ge; break; 963cce7d176Sdrh case TK_NE: op = OP_Ne; break; 964cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 965cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 966cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 967cce7d176Sdrh default: break; 968cce7d176Sdrh } 969cce7d176Sdrh switch( pExpr->op ){ 970cce7d176Sdrh case TK_AND: { 971cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 972cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 973cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 974cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 975cce7d176Sdrh break; 976cce7d176Sdrh } 977cce7d176Sdrh case TK_OR: { 978cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 979cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 980cce7d176Sdrh break; 981cce7d176Sdrh } 982cce7d176Sdrh case TK_NOT: { 983cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 984cce7d176Sdrh break; 985cce7d176Sdrh } 986cce7d176Sdrh case TK_LT: 987cce7d176Sdrh case TK_LE: 988cce7d176Sdrh case TK_GT: 989cce7d176Sdrh case TK_GE: 990cce7d176Sdrh case TK_NE: 9910ac65892Sdrh case TK_EQ: { 992cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 993cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 99499fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 995cce7d176Sdrh break; 996cce7d176Sdrh } 997cce7d176Sdrh case TK_ISNULL: 998cce7d176Sdrh case TK_NOTNULL: { 999cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 100099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1001cce7d176Sdrh break; 1002cce7d176Sdrh } 1003fef5208cSdrh case TK_IN: { 1004cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1005fef5208cSdrh if( pExpr->pSelect ){ 100699fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1007fef5208cSdrh }else{ 100899fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1009fef5208cSdrh } 1010fef5208cSdrh break; 1011fef5208cSdrh } 1012fef5208cSdrh case TK_BETWEEN: { 1013fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 1014fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 101599fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1016fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 101799fcd718Sdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl); 1018fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 101999fcd718Sdrh sqliteVdbeAddOp(v, OP_Le, 0, dest); 102099fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 102199fcd718Sdrh sqliteVdbeResolveLabel(v, lbl); 102299fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1023fef5208cSdrh break; 1024fef5208cSdrh } 1025cce7d176Sdrh default: { 1026cce7d176Sdrh sqliteExprCode(pParse, pExpr); 102799fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 1028cce7d176Sdrh break; 1029cce7d176Sdrh } 1030cce7d176Sdrh } 1031cce7d176Sdrh } 1032cce7d176Sdrh 1033cce7d176Sdrh /* 103466b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1035cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1036cce7d176Sdrh ** continues straight thru if the expression is true. 1037cce7d176Sdrh */ 1038cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 1039cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1040cce7d176Sdrh int op = 0; 1041daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1042cce7d176Sdrh switch( pExpr->op ){ 1043cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1044cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1045cce7d176Sdrh case TK_GT: op = OP_Le; break; 1046cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1047cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1048cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1049cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1050cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1051cce7d176Sdrh default: break; 1052cce7d176Sdrh } 1053cce7d176Sdrh switch( pExpr->op ){ 1054cce7d176Sdrh case TK_AND: { 1055cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 1056cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 1057cce7d176Sdrh break; 1058cce7d176Sdrh } 1059cce7d176Sdrh case TK_OR: { 1060cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1061cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 1062cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 1063cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1064cce7d176Sdrh break; 1065cce7d176Sdrh } 1066cce7d176Sdrh case TK_NOT: { 1067cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 1068cce7d176Sdrh break; 1069cce7d176Sdrh } 1070cce7d176Sdrh case TK_LT: 1071cce7d176Sdrh case TK_LE: 1072cce7d176Sdrh case TK_GT: 1073cce7d176Sdrh case TK_GE: 1074cce7d176Sdrh case TK_NE: 1075cce7d176Sdrh case TK_EQ: { 1076cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1077cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 107899fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1079cce7d176Sdrh break; 1080cce7d176Sdrh } 1081cce7d176Sdrh case TK_ISNULL: 1082cce7d176Sdrh case TK_NOTNULL: { 1083cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 108499fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1085cce7d176Sdrh break; 1086cce7d176Sdrh } 1087fef5208cSdrh case TK_IN: { 1088cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1089fef5208cSdrh if( pExpr->pSelect ){ 109099fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1091fef5208cSdrh }else{ 109299fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1093fef5208cSdrh } 1094fef5208cSdrh break; 1095fef5208cSdrh } 1096fef5208cSdrh case TK_BETWEEN: { 1097fef5208cSdrh int addr; 1098fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 109999fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1100fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1101fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 110299fcd718Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); 110399fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 110499fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 1105fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 110699fcd718Sdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest); 1107fef5208cSdrh break; 1108fef5208cSdrh } 1109cce7d176Sdrh default: { 1110cce7d176Sdrh sqliteExprCode(pParse, pExpr); 111199fcd718Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0); 111299fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 1113cce7d176Sdrh break; 1114cce7d176Sdrh } 1115cce7d176Sdrh } 1116cce7d176Sdrh } 11172282792aSdrh 11182282792aSdrh /* 11192282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 11202282792aSdrh ** if they are identical and return FALSE if they differ in any way. 11212282792aSdrh */ 1122d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 11232282792aSdrh int i; 11242282792aSdrh if( pA==0 ){ 11252282792aSdrh return pB==0; 11262282792aSdrh }else if( pB==0 ){ 11272282792aSdrh return 0; 11282282792aSdrh } 11292282792aSdrh if( pA->op!=pB->op ) return 0; 1130d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1131d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 11322282792aSdrh if( pA->pList ){ 11332282792aSdrh if( pB->pList==0 ) return 0; 11342282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 11352282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1136d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 11372282792aSdrh return 0; 11382282792aSdrh } 11392282792aSdrh } 11402282792aSdrh }else if( pB->pList ){ 11412282792aSdrh return 0; 11422282792aSdrh } 11432282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 11442282792aSdrh if( pA->token.z ){ 11452282792aSdrh if( pB->token.z==0 ) return 0; 11462282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 11472282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 11482282792aSdrh } 11492282792aSdrh return 1; 11502282792aSdrh } 11512282792aSdrh 11522282792aSdrh /* 11532282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 11542282792aSdrh */ 11552282792aSdrh static int appendAggInfo(Parse *pParse){ 11562282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 11572282792aSdrh int amt = pParse->nAgg + 8; 11586d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 11596d4abfbeSdrh if( aAgg==0 ){ 11602282792aSdrh return -1; 11612282792aSdrh } 11626d4abfbeSdrh pParse->aAgg = aAgg; 11632282792aSdrh } 11642282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 11652282792aSdrh return pParse->nAgg++; 11662282792aSdrh } 11672282792aSdrh 11682282792aSdrh /* 11692282792aSdrh ** Analyze the given expression looking for aggregate functions and 11702282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 11712282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 11722282792aSdrh ** 11732282792aSdrh ** This routine should only be called after the expression has been 11742282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 11752282792aSdrh ** 11762282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 11772282792aSdrh ** the number of errors. 11782282792aSdrh */ 11792282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 11802282792aSdrh int i; 11812282792aSdrh AggExpr *aAgg; 11822282792aSdrh int nErr = 0; 11832282792aSdrh 11842282792aSdrh if( pExpr==0 ) return 0; 11852282792aSdrh switch( pExpr->op ){ 1186967e8b73Sdrh case TK_COLUMN: { 11872282792aSdrh aAgg = pParse->aAgg; 11882282792aSdrh for(i=0; i<pParse->nAgg; i++){ 11892282792aSdrh if( aAgg[i].isAgg ) continue; 11902282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1191967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 11922282792aSdrh break; 11932282792aSdrh } 11942282792aSdrh } 11952282792aSdrh if( i>=pParse->nAgg ){ 11962282792aSdrh i = appendAggInfo(pParse); 11972282792aSdrh if( i<0 ) return 1; 11982282792aSdrh pParse->aAgg[i].isAgg = 0; 11992282792aSdrh pParse->aAgg[i].pExpr = pExpr; 12002282792aSdrh } 1201aaf88729Sdrh pExpr->iAgg = i; 12022282792aSdrh break; 12032282792aSdrh } 12042282792aSdrh case TK_AGG_FUNCTION: { 12052282792aSdrh aAgg = pParse->aAgg; 12062282792aSdrh for(i=0; i<pParse->nAgg; i++){ 12072282792aSdrh if( !aAgg[i].isAgg ) continue; 1208d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 12092282792aSdrh break; 12102282792aSdrh } 12112282792aSdrh } 12122282792aSdrh if( i>=pParse->nAgg ){ 12132282792aSdrh i = appendAggInfo(pParse); 12142282792aSdrh if( i<0 ) return 1; 12152282792aSdrh pParse->aAgg[i].isAgg = 1; 12162282792aSdrh pParse->aAgg[i].pExpr = pExpr; 12170bce8354Sdrh pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db, 1218f55f25f0Sdrh pExpr->token.z, pExpr->token.n, 1219f55f25f0Sdrh pExpr->pList ? pExpr->pList->nExpr : 0, 0); 12202282792aSdrh } 12212282792aSdrh pExpr->iAgg = i; 12222282792aSdrh break; 12232282792aSdrh } 12242282792aSdrh default: { 12252282792aSdrh if( pExpr->pLeft ){ 12262282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 12272282792aSdrh } 12282282792aSdrh if( nErr==0 && pExpr->pRight ){ 12292282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 12302282792aSdrh } 12312282792aSdrh if( nErr==0 && pExpr->pList ){ 12322282792aSdrh int n = pExpr->pList->nExpr; 12332282792aSdrh int i; 12342282792aSdrh for(i=0; nErr==0 && i<n; i++){ 12352282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 12362282792aSdrh } 12372282792aSdrh } 12382282792aSdrh break; 12392282792aSdrh } 12402282792aSdrh } 12412282792aSdrh return nErr; 12422282792aSdrh } 12438e0a2f90Sdrh 12448e0a2f90Sdrh /* 12458e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 12460bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that 12478e0a2f90Sdrh ** function, or return NULL if the function does not exist. 12488e0a2f90Sdrh ** 12490bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef 12508e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 12518e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 12528e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 12538e0a2f90Sdrh ** any number of arguments will be returned. 12548e0a2f90Sdrh ** 12558e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 12568e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 12578e0a2f90Sdrh ** or xStep is non-zero. 12588e0a2f90Sdrh */ 12590bce8354Sdrh FuncDef *sqliteFindFunction( 12608e0a2f90Sdrh sqlite *db, /* An open database */ 12618e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 12628e0a2f90Sdrh int nName, /* Number of characters in the name */ 12638e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 12648e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 12658e0a2f90Sdrh ){ 12660bce8354Sdrh FuncDef *pFirst, *p, *pMaybe; 12670bce8354Sdrh pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName); 12681350b030Sdrh if( p && !createFlag && nArg<0 ){ 12698e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 12708e0a2f90Sdrh return p; 12718e0a2f90Sdrh } 12728e0a2f90Sdrh pMaybe = 0; 12738e0a2f90Sdrh while( p && p->nArg!=nArg ){ 12748e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 12758e0a2f90Sdrh p = p->pNext; 12768e0a2f90Sdrh } 12778e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 12788e0a2f90Sdrh return 0; 12798e0a2f90Sdrh } 12808e0a2f90Sdrh if( p==0 && pMaybe ){ 12818e0a2f90Sdrh assert( createFlag==0 ); 12828e0a2f90Sdrh return pMaybe; 12838e0a2f90Sdrh } 128489425d5eSdrh if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){ 12858e0a2f90Sdrh p->nArg = nArg; 12868e0a2f90Sdrh p->pNext = pFirst; 12870bce8354Sdrh sqliteHashInsert(&db->aFunc, zName, nName, (void*)p); 12888e0a2f90Sdrh } 12898e0a2f90Sdrh return p; 12908e0a2f90Sdrh } 1291