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*a2ed5601Sdrh ** $Id: expr.c,v 1.45 2002/02/26 23:55:31 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 114*a2ed5601Sdrh ** 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 /* 151a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 152a76b5dfcSdrh ** initially NULL, then create a new expression list. 153a76b5dfcSdrh */ 154a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 155a76b5dfcSdrh int i; 156a76b5dfcSdrh if( pList==0 ){ 157a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 158a76b5dfcSdrh if( pList==0 ){ 159a76b5dfcSdrh sqliteExprDelete(pExpr); 160a76b5dfcSdrh return 0; 161a76b5dfcSdrh } 162a76b5dfcSdrh } 163a76b5dfcSdrh if( (pList->nExpr & 7)==0 ){ 164a76b5dfcSdrh int n = pList->nExpr + 8; 165a76b5dfcSdrh struct ExprList_item *a; 166a76b5dfcSdrh a = sqliteRealloc(pList->a, n*sizeof(pList->a[0])); 167a76b5dfcSdrh if( a==0 ){ 168a76b5dfcSdrh sqliteExprDelete(pExpr); 169a76b5dfcSdrh return pList; 170a76b5dfcSdrh } 171a76b5dfcSdrh pList->a = a; 172a76b5dfcSdrh } 173a76b5dfcSdrh if( pExpr || pName ){ 174a76b5dfcSdrh i = pList->nExpr++; 175a76b5dfcSdrh pList->a[i].pExpr = pExpr; 176a76b5dfcSdrh pList->a[i].zName = 0; 177a76b5dfcSdrh if( pName ){ 178a76b5dfcSdrh sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0); 179a76b5dfcSdrh sqliteDequote(pList->a[i].zName); 180a76b5dfcSdrh } 181a76b5dfcSdrh } 182a76b5dfcSdrh return pList; 183a76b5dfcSdrh } 184a76b5dfcSdrh 185a76b5dfcSdrh /* 186a76b5dfcSdrh ** Delete an entire expression list. 187a76b5dfcSdrh */ 188a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){ 189a76b5dfcSdrh int i; 190a76b5dfcSdrh if( pList==0 ) return; 191a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 192a76b5dfcSdrh sqliteExprDelete(pList->a[i].pExpr); 193a76b5dfcSdrh sqliteFree(pList->a[i].zName); 194a76b5dfcSdrh } 195a76b5dfcSdrh sqliteFree(pList->a); 196a76b5dfcSdrh sqliteFree(pList); 197a76b5dfcSdrh } 198a76b5dfcSdrh 199a76b5dfcSdrh /* 200fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 201fef5208cSdrh ** and 0 if it involves variables. 202fef5208cSdrh */ 2039208643dSdrh int sqliteExprIsConstant(Expr *p){ 204fef5208cSdrh switch( p->op ){ 205fef5208cSdrh case TK_ID: 206967e8b73Sdrh case TK_COLUMN: 207fef5208cSdrh case TK_DOT: 208fef5208cSdrh return 0; 2099208643dSdrh case TK_INTEGER: 2109208643dSdrh case TK_FLOAT: 2119208643dSdrh case TK_STRING: 2129208643dSdrh return 1; 213fef5208cSdrh default: { 2149208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 2159208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 216fef5208cSdrh if( p->pList ){ 217fef5208cSdrh int i; 218fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 2199208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 220fef5208cSdrh } 221fef5208cSdrh } 2229208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 223fef5208cSdrh } 224fef5208cSdrh } 2259208643dSdrh return 0; 226fef5208cSdrh } 227fef5208cSdrh 228fef5208cSdrh /* 2294794b980Sdrh ** Walk the expression tree and process operators of the form: 2304794b980Sdrh ** 2314794b980Sdrh ** expr IN (SELECT ...) 2324794b980Sdrh ** 233967e8b73Sdrh ** These operators have to be processed before column names are 2344794b980Sdrh ** resolved because each such operator increments pParse->nTab 2351ccde15dSdrh ** to reserve cursor numbers for its own use. But pParse->nTab 236aacc543eSdrh ** needs to be constant once we begin resolving column names. For 237aacc543eSdrh ** that reason, this procedure needs to be called on every expression 238aacc543eSdrh ** before sqliteExprResolveIds() is called on any expression. 2394794b980Sdrh ** 2404794b980Sdrh ** Actually, the processing of IN-SELECT is only started by this 2414794b980Sdrh ** routine. This routine allocates a cursor number to the IN-SELECT 2424794b980Sdrh ** and then moves on. The code generation is done by 2434794b980Sdrh ** sqliteExprResolveIds() which must be called afterwards. 2444794b980Sdrh */ 2454794b980Sdrh void sqliteExprResolveInSelect(Parse *pParse, Expr *pExpr){ 2464794b980Sdrh if( pExpr==0 ) return; 2474794b980Sdrh if( pExpr->op==TK_IN && pExpr->pSelect!=0 ){ 2484794b980Sdrh pExpr->iTable = pParse->nTab++; 2494794b980Sdrh }else{ 2504794b980Sdrh if( pExpr->pLeft ) sqliteExprResolveInSelect(pParse, pExpr->pLeft); 2514794b980Sdrh if( pExpr->pRight ) sqliteExprResolveInSelect(pParse, pExpr->pRight); 2524794b980Sdrh if( pExpr->pList ){ 2534794b980Sdrh int i; 2544794b980Sdrh ExprList *pList = pExpr->pList; 2554794b980Sdrh for(i=0; i<pList->nExpr; i++){ 2564794b980Sdrh sqliteExprResolveInSelect(pParse, pList->a[i].pExpr); 2574794b980Sdrh } 2584794b980Sdrh } 2594794b980Sdrh } 2604794b980Sdrh } 2614794b980Sdrh 2624794b980Sdrh /* 263c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 264c4a3c779Sdrh */ 265c4a3c779Sdrh static int sqliteIsRowid(const char *z){ 266c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 267c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 268c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 269c4a3c779Sdrh return 0; 270c4a3c779Sdrh } 271c4a3c779Sdrh 272c4a3c779Sdrh /* 273cce7d176Sdrh ** This routine walks an expression tree and resolves references to 274967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 275aacc543eSdrh ** index to the table in the table list and a column offset. The 276aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 277aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 278aacc543eSdrh ** plus the pParse->nTab value. This value will ultimately become the 279aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 280aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 281aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 282aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 283aacc543eSdrh ** alias for ROWID. 28419a775c2Sdrh ** 285fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 286fef5208cSdrh ** forms: 287fef5208cSdrh ** 288fef5208cSdrh ** expr IN (exprlist) 289fef5208cSdrh ** and 290fef5208cSdrh ** expr IN (SELECT ...) 291fef5208cSdrh ** 292fef5208cSdrh ** The first form is handled by creating a set holding the list 293fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 294fef5208cSdrh ** a temporary table. 295fef5208cSdrh ** 296fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 29719a775c2Sdrh ** If it finds any, it generates code to write the value of that select 29819a775c2Sdrh ** into a memory cell. 299cce7d176Sdrh ** 300967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 301cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 302cce7d176Sdrh */ 303a2e00042Sdrh int sqliteExprResolveIds( 304a2e00042Sdrh Parse *pParse, /* The parser context */ 305a2e00042Sdrh IdList *pTabList, /* List of tables used to resolve column names */ 306a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 307a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 308a2e00042Sdrh ){ 309daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 310cce7d176Sdrh switch( pExpr->op ){ 311a2e00042Sdrh /* A lone identifier. Try and match it as follows: 312a2e00042Sdrh ** 313a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 314a2e00042Sdrh ** 315a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 316a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 317a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 318a2e00042Sdrh ** 319a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 320a2e00042Sdrh */ 321cce7d176Sdrh case TK_ID: { 322cce7d176Sdrh int cnt = 0; /* Number of matches */ 323cce7d176Sdrh int i; /* Loop counter */ 324a76b5dfcSdrh char *z; 325a76b5dfcSdrh assert( pExpr->token.z ); 326a76b5dfcSdrh z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 3272f4392ffSdrh sqliteDequote(z); 328daffd0e5Sdrh if( z==0 ) return 1; 329cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 330cce7d176Sdrh int j; 331cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 332cce7d176Sdrh if( pTab==0 ) continue; 333cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 3347020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 335cce7d176Sdrh cnt++; 33619a775c2Sdrh pExpr->iTable = i + pParse->nTab; 3374a32431cSdrh if( j==pTab->iPKey ){ 3384a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 3394a32431cSdrh pExpr->iColumn = -1; 3404a32431cSdrh }else{ 341967e8b73Sdrh pExpr->iColumn = j; 342cce7d176Sdrh } 343a2e00042Sdrh pExpr->op = TK_COLUMN; 344a2e00042Sdrh } 345a2e00042Sdrh } 346a2e00042Sdrh } 347a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 348a2e00042Sdrh int j; 349a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 350a2e00042Sdrh char *zAs = pEList->a[j].zName; 351a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 352a2e00042Sdrh cnt++; 353a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 354a2e00042Sdrh pExpr->op = TK_AS; 355a2e00042Sdrh pExpr->iColumn = j; 356a2e00042Sdrh pExpr->pLeft = pEList->a[j].pExpr; 357cce7d176Sdrh } 358cce7d176Sdrh } 3594a32431cSdrh } 360c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 361c4a3c779Sdrh pExpr->iColumn = -1; 362c4a3c779Sdrh pExpr->iTable = pParse->nTab; 363c4a3c779Sdrh cnt = 1 + (pTabList->nId>1); 364a2e00042Sdrh pExpr->op = TK_COLUMN; 365c4a3c779Sdrh } 366cce7d176Sdrh sqliteFree(z); 367cce7d176Sdrh if( cnt==0 ){ 368967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 369cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 370cce7d176Sdrh pParse->nErr++; 371cce7d176Sdrh return 1; 372cce7d176Sdrh }else if( cnt>1 ){ 373967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 374cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 375cce7d176Sdrh pParse->nErr++; 376cce7d176Sdrh return 1; 377cce7d176Sdrh } 378cce7d176Sdrh break; 379cce7d176Sdrh } 380cce7d176Sdrh 381967e8b73Sdrh /* A table name and column name: ID.ID */ 382cce7d176Sdrh case TK_DOT: { 383cce7d176Sdrh int cnt = 0; /* Number of matches */ 384c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 385cce7d176Sdrh int i; /* Loop counter */ 386cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 387cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 388cce7d176Sdrh 389cce7d176Sdrh pLeft = pExpr->pLeft; 390cce7d176Sdrh pRight = pExpr->pRight; 391a76b5dfcSdrh assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); 392a76b5dfcSdrh assert( pRight && pRight->op==TK_ID && pRight->token.z ); 3936e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 3946e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 395daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 396daffd0e5Sdrh sqliteFree(zLeft); 397daffd0e5Sdrh sqliteFree(zRight); 398daffd0e5Sdrh return 1; 399daffd0e5Sdrh } 40087c40e88Sdrh sqliteDequote(zLeft); 40187c40e88Sdrh sqliteDequote(zRight); 402c4a3c779Sdrh pExpr->iTable = -1; 403cce7d176Sdrh for(i=0; i<pTabList->nId; i++){ 404cce7d176Sdrh int j; 405cce7d176Sdrh char *zTab; 406cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 407cce7d176Sdrh if( pTab==0 ) continue; 408cce7d176Sdrh if( pTabList->a[i].zAlias ){ 409cce7d176Sdrh zTab = pTabList->a[i].zAlias; 410cce7d176Sdrh }else{ 411cce7d176Sdrh zTab = pTab->zName; 412cce7d176Sdrh } 413cce7d176Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 414c4a3c779Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + pParse->nTab; 415cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 4167020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 417cce7d176Sdrh cnt++; 41819a775c2Sdrh pExpr->iTable = i + pParse->nTab; 4194a32431cSdrh if( j==pTab->iPKey ){ 4204a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 4214a32431cSdrh pExpr->iColumn = -1; 4224a32431cSdrh }else{ 423967e8b73Sdrh pExpr->iColumn = j; 424cce7d176Sdrh } 425cce7d176Sdrh } 426cce7d176Sdrh } 4274a32431cSdrh } 428c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 429c4a3c779Sdrh cnt = 1; 430c4a3c779Sdrh pExpr->iColumn = -1; 431c4a3c779Sdrh } 432cce7d176Sdrh sqliteFree(zLeft); 433cce7d176Sdrh sqliteFree(zRight); 434cce7d176Sdrh if( cnt==0 ){ 435967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 436cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 437cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 438cce7d176Sdrh pParse->nErr++; 439cce7d176Sdrh return 1; 440cce7d176Sdrh }else if( cnt>1 ){ 441967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 442cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 443cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 444cce7d176Sdrh pParse->nErr++; 445cce7d176Sdrh return 1; 446cce7d176Sdrh } 447cce7d176Sdrh sqliteExprDelete(pLeft); 448cce7d176Sdrh pExpr->pLeft = 0; 449cce7d176Sdrh sqliteExprDelete(pRight); 450cce7d176Sdrh pExpr->pRight = 0; 451967e8b73Sdrh pExpr->op = TK_COLUMN; 452cce7d176Sdrh break; 453cce7d176Sdrh } 454cce7d176Sdrh 455fef5208cSdrh case TK_IN: { 456d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 457fef5208cSdrh if( v==0 ) return 1; 458a2e00042Sdrh if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 459cfab11bcSdrh return 1; 460cfab11bcSdrh } 461fef5208cSdrh if( pExpr->pSelect ){ 462fef5208cSdrh /* Case 1: expr IN (SELECT ...) 463fef5208cSdrh ** 464fef5208cSdrh ** Generate code to write the results of the select into a temporary 4654794b980Sdrh ** table. The cursor number of the temporary table has already 4664794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 467fef5208cSdrh */ 468c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 469fef5208cSdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable) ); 470fef5208cSdrh }else if( pExpr->pList ){ 471fef5208cSdrh /* Case 2: expr IN (exprlist) 472fef5208cSdrh ** 473fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 474fef5208cSdrh ** in iTable. 475fef5208cSdrh */ 476fef5208cSdrh int i, iSet; 477fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 478fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 4799208643dSdrh if( !sqliteExprIsConstant(pE2) ){ 480fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 481fef5208cSdrh "right-hand side of IN operator must be constant", 0); 482fef5208cSdrh pParse->nErr++; 483fef5208cSdrh return 1; 484fef5208cSdrh } 4854794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 4864794b980Sdrh return 1; 4874794b980Sdrh } 488fef5208cSdrh } 489fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 490fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 491fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 492fef5208cSdrh switch( pE2->op ){ 493fef5208cSdrh case TK_FLOAT: 494fef5208cSdrh case TK_INTEGER: 495fef5208cSdrh case TK_STRING: { 49699fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 497a76b5dfcSdrh assert( pE2->token.z ); 498fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 499fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 500fef5208cSdrh break; 501fef5208cSdrh } 502fef5208cSdrh default: { 503fef5208cSdrh sqliteExprCode(pParse, pE2); 50499fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 505fef5208cSdrh break; 506fef5208cSdrh } 507fef5208cSdrh } 508fef5208cSdrh } 509fef5208cSdrh } 510cfab11bcSdrh break; 511fef5208cSdrh } 512fef5208cSdrh 51319a775c2Sdrh case TK_SELECT: { 514fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 515fef5208cSdrh ** value of this select in a memory cell and record the number 516967e8b73Sdrh ** of the memory cell in iColumn. 517fef5208cSdrh */ 518967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 519967e8b73Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn) ){ 52019a775c2Sdrh return 1; 52119a775c2Sdrh } 52219a775c2Sdrh break; 52319a775c2Sdrh } 52419a775c2Sdrh 525cce7d176Sdrh /* For all else, just recursively walk the tree */ 526cce7d176Sdrh default: { 527cce7d176Sdrh if( pExpr->pLeft 528a2e00042Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 529cce7d176Sdrh return 1; 530cce7d176Sdrh } 531cce7d176Sdrh if( pExpr->pRight 532a2e00042Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){ 533cce7d176Sdrh return 1; 534cce7d176Sdrh } 535cce7d176Sdrh if( pExpr->pList ){ 536cce7d176Sdrh int i; 537cce7d176Sdrh ExprList *pList = pExpr->pList; 538cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 539a2e00042Sdrh if( sqliteExprResolveIds(pParse,pTabList,pEList,pList->a[i].pExpr) ){ 540cce7d176Sdrh return 1; 541cce7d176Sdrh } 542cce7d176Sdrh } 543cce7d176Sdrh } 544cce7d176Sdrh } 545cce7d176Sdrh } 546cce7d176Sdrh return 0; 547cce7d176Sdrh } 548cce7d176Sdrh 549cce7d176Sdrh #if 0 /* NOT USED */ 550cce7d176Sdrh /* 551cce7d176Sdrh ** Compare a token against a string. Return TRUE if they match. 552cce7d176Sdrh */ 553cce7d176Sdrh static int sqliteTokenCmp(Token *pToken, const char *zStr){ 554cce7d176Sdrh int n = strlen(zStr); 555cce7d176Sdrh if( n!=pToken->n ) return 0; 556cce7d176Sdrh return sqliteStrNICmp(pToken->z, zStr, n)==0; 557cce7d176Sdrh } 558cce7d176Sdrh #endif 559cce7d176Sdrh 560cce7d176Sdrh /* 561cce7d176Sdrh ** Convert a function name into its integer identifier. Return the 562cce7d176Sdrh ** identifier. Return FN_Unknown if the function name is unknown. 563cce7d176Sdrh */ 564cce7d176Sdrh int sqliteFuncId(Token *pToken){ 565cce7d176Sdrh static const struct { 566cce7d176Sdrh char *zName; 567cce7d176Sdrh int len; 568cce7d176Sdrh int id; 569cce7d176Sdrh } aFunc[] = { 570cce7d176Sdrh { "count", 5, FN_Count }, 571cce7d176Sdrh { "min", 3, FN_Min }, 572cce7d176Sdrh { "max", 3, FN_Max }, 573cce7d176Sdrh { "sum", 3, FN_Sum }, 5742282792aSdrh { "avg", 3, FN_Avg }, 5756ec2733bSdrh { "length", 6, FN_Length }, 5766ec2733bSdrh { "substr", 6, FN_Substr }, 577bf4133cbSdrh { "abs", 3, FN_Abs }, 578bf4133cbSdrh { "round", 5, FN_Round }, 579cce7d176Sdrh }; 580cce7d176Sdrh int i; 581cce7d176Sdrh for(i=0; i<ArraySize(aFunc); i++){ 582cce7d176Sdrh if( aFunc[i].len==pToken->n 583cce7d176Sdrh && sqliteStrNICmp(pToken->z, aFunc[i].zName, aFunc[i].len)==0 ){ 584cce7d176Sdrh return aFunc[i].id; 585cce7d176Sdrh } 586cce7d176Sdrh } 587cce7d176Sdrh return FN_Unknown; 588cce7d176Sdrh } 589cce7d176Sdrh 590cce7d176Sdrh /* 591cce7d176Sdrh ** Error check the functions in an expression. Make sure all 592cce7d176Sdrh ** function names are recognized and all functions have the correct 593cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 594cce7d176Sdrh ** if anything is amiss. Return the number of errors. 595cce7d176Sdrh ** 596cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 597cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 598cce7d176Sdrh */ 599cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 600cce7d176Sdrh int nErr = 0; 601cce7d176Sdrh if( pExpr==0 ) return 0; 602cce7d176Sdrh switch( pExpr->op ){ 603cce7d176Sdrh case TK_FUNCTION: { 604cce7d176Sdrh int id = sqliteFuncId(&pExpr->token); 605cce7d176Sdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; 606cce7d176Sdrh int no_such_func = 0; 607cce7d176Sdrh int too_many_args = 0; 608cce7d176Sdrh int too_few_args = 0; 6098e0a2f90Sdrh int wrong_num_args = 0; 610cce7d176Sdrh int is_agg = 0; 611cce7d176Sdrh int i; 612967e8b73Sdrh pExpr->iColumn = id; 613cce7d176Sdrh switch( id ){ 614cce7d176Sdrh case FN_Unknown: { 6158e0a2f90Sdrh UserFunc *pUser = sqliteFindUserFunction(pParse->db, 6168e0a2f90Sdrh pExpr->token.z, pExpr->token.n, n, 0); 6178e0a2f90Sdrh if( pUser==0 ){ 6188e0a2f90Sdrh pUser = sqliteFindUserFunction(pParse->db, 6198e0a2f90Sdrh pExpr->token.z, pExpr->token.n, -1, 0); 6208e0a2f90Sdrh if( pUser==0 ){ 621cce7d176Sdrh no_such_func = 1; 6228e0a2f90Sdrh }else{ 6238e0a2f90Sdrh wrong_num_args = 1; 6248e0a2f90Sdrh } 6258e0a2f90Sdrh }else{ 6268e0a2f90Sdrh is_agg = pUser->xFunc==0; 6278e0a2f90Sdrh } 628cce7d176Sdrh break; 629cce7d176Sdrh } 630cce7d176Sdrh case FN_Count: { 631cce7d176Sdrh too_many_args = n>1; 632cce7d176Sdrh is_agg = 1; 633cce7d176Sdrh break; 634cce7d176Sdrh } 635cce7d176Sdrh case FN_Max: 636cce7d176Sdrh case FN_Min: { 6378e0a2f90Sdrh too_few_args = n<1; 638cce7d176Sdrh is_agg = n==1; 639cce7d176Sdrh break; 640cce7d176Sdrh } 6412282792aSdrh case FN_Avg: 642cce7d176Sdrh case FN_Sum: { 643cce7d176Sdrh too_many_args = n>1; 644cce7d176Sdrh too_few_args = n<1; 645cce7d176Sdrh is_agg = 1; 646cce7d176Sdrh break; 647cce7d176Sdrh } 648bf4133cbSdrh case FN_Abs: 6496ec2733bSdrh case FN_Length: { 6506ec2733bSdrh too_few_args = n<1; 6516ec2733bSdrh too_many_args = n>1; 6526ec2733bSdrh break; 6536ec2733bSdrh } 654bf4133cbSdrh case FN_Round: { 655bf4133cbSdrh too_few_args = n<1; 656bf4133cbSdrh too_many_args = n>2; 657bf4133cbSdrh break; 658bf4133cbSdrh } 6596ec2733bSdrh case FN_Substr: { 6606ec2733bSdrh too_few_args = n<3; 6616ec2733bSdrh too_many_args = n>3; 6626ec2733bSdrh break; 6636ec2733bSdrh } 664cce7d176Sdrh default: break; 665cce7d176Sdrh } 6668e0a2f90Sdrh if( is_agg && !allowAgg ){ 6678e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1, 6688e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 6698e0a2f90Sdrh pParse->nErr++; 6708e0a2f90Sdrh nErr++; 6718e0a2f90Sdrh is_agg = 0; 6728e0a2f90Sdrh }else if( no_such_func ){ 673cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, 674cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 675cce7d176Sdrh pParse->nErr++; 676cce7d176Sdrh nErr++; 677cce7d176Sdrh }else if( too_many_args ){ 678cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too many arguments to function ",-1, 679cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 680cce7d176Sdrh pParse->nErr++; 681cce7d176Sdrh nErr++; 682cce7d176Sdrh }else if( too_few_args ){ 683cce7d176Sdrh sqliteSetNString(&pParse->zErrMsg, "too few arguments to function ",-1, 684cce7d176Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 685cce7d176Sdrh pParse->nErr++; 686cce7d176Sdrh nErr++; 6878e0a2f90Sdrh }else if( wrong_num_args ){ 6888e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, 6898e0a2f90Sdrh "wrong number of arguments to function ",-1, 6908e0a2f90Sdrh pExpr->token.z, pExpr->token.n, "()", 2, 0); 6918e0a2f90Sdrh pParse->nErr++; 6928e0a2f90Sdrh nErr++; 693cce7d176Sdrh } 6942282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 695cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 696cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 6974cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 6984cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 699cce7d176Sdrh } 700cce7d176Sdrh } 701cce7d176Sdrh default: { 702cce7d176Sdrh if( pExpr->pLeft ){ 7032282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 704cce7d176Sdrh } 705cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 7062282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 707cce7d176Sdrh } 708fef5208cSdrh if( nErr==0 && pExpr->pList ){ 709fef5208cSdrh int n = pExpr->pList->nExpr; 710fef5208cSdrh int i; 711fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 7122282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 7132282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 714fef5208cSdrh } 715fef5208cSdrh } 716cce7d176Sdrh break; 717cce7d176Sdrh } 718cce7d176Sdrh } 719cce7d176Sdrh return nErr; 720cce7d176Sdrh } 721cce7d176Sdrh 722cce7d176Sdrh /* 723cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 7241ccde15dSdrh ** expression and leave the result on the top of stack. 725cce7d176Sdrh */ 726cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 727cce7d176Sdrh Vdbe *v = pParse->pVdbe; 728cce7d176Sdrh int op; 729daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 730cce7d176Sdrh switch( pExpr->op ){ 731cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 732cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 733cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 734cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 735cce7d176Sdrh case TK_AND: op = OP_And; break; 736cce7d176Sdrh case TK_OR: op = OP_Or; break; 737cce7d176Sdrh case TK_LT: op = OP_Lt; break; 738cce7d176Sdrh case TK_LE: op = OP_Le; break; 739cce7d176Sdrh case TK_GT: op = OP_Gt; break; 740cce7d176Sdrh case TK_GE: op = OP_Ge; break; 741cce7d176Sdrh case TK_NE: op = OP_Ne; break; 742cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 743cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 744cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 745cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 746cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 747cce7d176Sdrh case TK_NOT: op = OP_Not; break; 748cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 749bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 750bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 751bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 752bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 753bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 754bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 755cce7d176Sdrh default: break; 756cce7d176Sdrh } 757cce7d176Sdrh switch( pExpr->op ){ 758967e8b73Sdrh case TK_COLUMN: { 7592282792aSdrh if( pParse->useAgg ){ 76099fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 761c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 76299fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 763c4a3c779Sdrh }else{ 76499fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 7652282792aSdrh } 766cce7d176Sdrh break; 767cce7d176Sdrh } 768ef6764a1Sdrh case TK_FLOAT: 769cce7d176Sdrh case TK_INTEGER: { 7707a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 771a76b5dfcSdrh assert( pExpr->token.z ); 7727a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 773cce7d176Sdrh break; 774cce7d176Sdrh } 775cce7d176Sdrh case TK_STRING: { 77699fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 777a76b5dfcSdrh assert( pExpr->token.z ); 778cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 779cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 780cce7d176Sdrh break; 781cce7d176Sdrh } 782cce7d176Sdrh case TK_NULL: { 78399fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 784cce7d176Sdrh break; 785cce7d176Sdrh } 786cce7d176Sdrh case TK_AND: 787cce7d176Sdrh case TK_OR: 788cce7d176Sdrh case TK_PLUS: 789cce7d176Sdrh case TK_STAR: 790cce7d176Sdrh case TK_MINUS: 791bf4133cbSdrh case TK_REM: 792bf4133cbSdrh case TK_BITAND: 793bf4133cbSdrh case TK_BITOR: 794cce7d176Sdrh case TK_SLASH: { 795cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 796cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 79799fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 798cce7d176Sdrh break; 799cce7d176Sdrh } 800bf4133cbSdrh case TK_LSHIFT: 801bf4133cbSdrh case TK_RSHIFT: { 802bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 803bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 804bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 805bf4133cbSdrh break; 806bf4133cbSdrh } 8070040077dSdrh case TK_CONCAT: { 8080040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 8090040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 81099fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 8110040077dSdrh break; 8120040077dSdrh } 813cce7d176Sdrh case TK_LT: 814cce7d176Sdrh case TK_LE: 815cce7d176Sdrh case TK_GT: 816cce7d176Sdrh case TK_GE: 817cce7d176Sdrh case TK_NE: 818cce7d176Sdrh case TK_EQ: 819cce7d176Sdrh case TK_LIKE: 820cce7d176Sdrh case TK_GLOB: { 821cce7d176Sdrh int dest; 82299fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 823cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 824cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 825cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 82699fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 82799fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 828cce7d176Sdrh break; 829cce7d176Sdrh } 830cce7d176Sdrh case TK_UMINUS: { 8316e142f54Sdrh assert( pExpr->pLeft ); 8327a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 8336e142f54Sdrh Token *p = &pExpr->pLeft->token; 8346e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 8356e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 83699fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 83799fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 8386e142f54Sdrh sqliteFree(z); 8396e142f54Sdrh break; 8406e142f54Sdrh } 8411ccde15dSdrh /* Fall through into TK_NOT */ 8426e142f54Sdrh } 843bf4133cbSdrh case TK_BITNOT: 8446e142f54Sdrh case TK_NOT: { 845cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 84699fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 847cce7d176Sdrh break; 848cce7d176Sdrh } 849cce7d176Sdrh case TK_ISNULL: 850cce7d176Sdrh case TK_NOTNULL: { 851cce7d176Sdrh int dest; 85299fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 853cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 854cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 85599fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 85699fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 857cce7d176Sdrh break; 858cce7d176Sdrh } 8592282792aSdrh case TK_AGG_FUNCTION: { 86099fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 861967e8b73Sdrh if( pExpr->iColumn==FN_Avg ){ 8622282792aSdrh assert( pParse->iAggCount>=0 && pParse->iAggCount<pParse->nAgg ); 86399fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pParse->iAggCount); 86499fcd718Sdrh sqliteVdbeAddOp(v, OP_Divide, 0, 0); 8652282792aSdrh } 8662282792aSdrh break; 8672282792aSdrh } 868cce7d176Sdrh case TK_FUNCTION: { 869967e8b73Sdrh int id = pExpr->iColumn; 870cce7d176Sdrh int op; 871cce7d176Sdrh int i; 872cce7d176Sdrh ExprList *pList = pExpr->pList; 8736ec2733bSdrh switch( id ){ 8746ec2733bSdrh case FN_Min: 8756ec2733bSdrh case FN_Max: { 876cce7d176Sdrh op = id==FN_Min ? OP_Min : OP_Max; 877cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 878cce7d176Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 879cce7d176Sdrh if( i>0 ){ 88099fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 881cce7d176Sdrh } 882cce7d176Sdrh } 883cce7d176Sdrh break; 884cce7d176Sdrh } 885bf4133cbSdrh case FN_Abs: { 886bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 887bf4133cbSdrh sqliteVdbeAddOp(v, OP_AbsValue, 0, 0); 888bf4133cbSdrh break; 889bf4133cbSdrh } 890bf4133cbSdrh case FN_Round: { 891bf4133cbSdrh if( pList->nExpr==2 ){ 892bf4133cbSdrh sqliteExprCode(pParse, pList->a[1].pExpr); 893bf4133cbSdrh }else{ 894bf4133cbSdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 895bf4133cbSdrh } 896bf4133cbSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 897bf4133cbSdrh sqliteVdbeAddOp(v, OP_Precision, 0, 0); 898bf4133cbSdrh break; 899bf4133cbSdrh } 9006ec2733bSdrh case FN_Length: { 9016ec2733bSdrh sqliteExprCode(pParse, pList->a[0].pExpr); 90299fcd718Sdrh sqliteVdbeAddOp(v, OP_Strlen, 0, 0); 9036ec2733bSdrh break; 9046ec2733bSdrh } 9056ec2733bSdrh case FN_Substr: { 9066ec2733bSdrh for(i=0; i<pList->nExpr; i++){ 9076ec2733bSdrh sqliteExprCode(pParse, pList->a[i].pExpr); 9086ec2733bSdrh } 90999fcd718Sdrh sqliteVdbeAddOp(v, OP_Substr, 0, 0); 9106ec2733bSdrh break; 9116ec2733bSdrh } 9128e0a2f90Sdrh case FN_Unknown: { 9138e0a2f90Sdrh UserFunc *pUser; 9148e0a2f90Sdrh pUser = sqliteFindUserFunction(pParse->db, 9158e0a2f90Sdrh pExpr->token.z, pExpr->token.n, pList->nExpr, 0); 9168e0a2f90Sdrh assert( pUser!=0 ); 9178e0a2f90Sdrh for(i=0; i<pList->nExpr; i++){ 9188e0a2f90Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 9198e0a2f90Sdrh } 9208e0a2f90Sdrh sqliteVdbeAddOp(v, OP_UserFunc, pList->nExpr, 0); 9218e0a2f90Sdrh sqliteVdbeChangeP3(v, -1, (char*)pUser->xFunc, P3_POINTER); 9228e0a2f90Sdrh break; 9238e0a2f90Sdrh } 9246ec2733bSdrh default: { 9256ec2733bSdrh /* Can't happen! */ 9266ec2733bSdrh break; 9276ec2733bSdrh } 9286ec2733bSdrh } 9296ec2733bSdrh break; 9306ec2733bSdrh } 93119a775c2Sdrh case TK_SELECT: { 93299fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 93319a775c2Sdrh break; 93419a775c2Sdrh } 935fef5208cSdrh case TK_IN: { 936fef5208cSdrh int addr; 93799fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 938fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 939fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 940fef5208cSdrh if( pExpr->pSelect ){ 94199fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+2); 942fef5208cSdrh }else{ 94399fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+2); 944fef5208cSdrh } 94599fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 946fef5208cSdrh break; 947fef5208cSdrh } 948fef5208cSdrh case TK_BETWEEN: { 949fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 95099fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 951fef5208cSdrh sqliteExprIfFalse(pParse, pExpr, lbl); 95299fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, 1, 0); 953fef5208cSdrh sqliteVdbeResolveLabel(v, lbl); 954fef5208cSdrh break; 955fef5208cSdrh } 956a2e00042Sdrh case TK_AS: { 957a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 958a2e00042Sdrh break; 959a2e00042Sdrh } 960cce7d176Sdrh } 961cce7d176Sdrh return; 962cce7d176Sdrh } 963cce7d176Sdrh 964cce7d176Sdrh /* 965cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 966cce7d176Sdrh ** to the label "dest" if the expression is true but execution 967cce7d176Sdrh ** continues straight thru if the expression is false. 968cce7d176Sdrh */ 969cce7d176Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest){ 970cce7d176Sdrh Vdbe *v = pParse->pVdbe; 971cce7d176Sdrh int op = 0; 972daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 973cce7d176Sdrh switch( pExpr->op ){ 974cce7d176Sdrh case TK_LT: op = OP_Lt; break; 975cce7d176Sdrh case TK_LE: op = OP_Le; break; 976cce7d176Sdrh case TK_GT: op = OP_Gt; break; 977cce7d176Sdrh case TK_GE: op = OP_Ge; break; 978cce7d176Sdrh case TK_NE: op = OP_Ne; break; 979cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 980cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 981cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 982cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 983cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 984cce7d176Sdrh default: break; 985cce7d176Sdrh } 986cce7d176Sdrh switch( pExpr->op ){ 987cce7d176Sdrh case TK_AND: { 988cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 989cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2); 990cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 991cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 992cce7d176Sdrh break; 993cce7d176Sdrh } 994cce7d176Sdrh case TK_OR: { 995cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 996cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest); 997cce7d176Sdrh break; 998cce7d176Sdrh } 999cce7d176Sdrh case TK_NOT: { 1000cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 1001cce7d176Sdrh break; 1002cce7d176Sdrh } 1003cce7d176Sdrh case TK_LT: 1004cce7d176Sdrh case TK_LE: 1005cce7d176Sdrh case TK_GT: 1006cce7d176Sdrh case TK_GE: 1007cce7d176Sdrh case TK_NE: 1008cce7d176Sdrh case TK_EQ: 1009cce7d176Sdrh case TK_LIKE: 1010cce7d176Sdrh case TK_GLOB: { 1011cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1012cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 101399fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1014cce7d176Sdrh break; 1015cce7d176Sdrh } 1016cce7d176Sdrh case TK_ISNULL: 1017cce7d176Sdrh case TK_NOTNULL: { 1018cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 101999fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1020cce7d176Sdrh break; 1021cce7d176Sdrh } 1022fef5208cSdrh case TK_IN: { 1023cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1024fef5208cSdrh if( pExpr->pSelect ){ 102599fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1026fef5208cSdrh }else{ 102799fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1028fef5208cSdrh } 1029fef5208cSdrh break; 1030fef5208cSdrh } 1031fef5208cSdrh case TK_BETWEEN: { 1032fef5208cSdrh int lbl = sqliteVdbeMakeLabel(v); 1033fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 103499fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1035fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 103699fcd718Sdrh sqliteVdbeAddOp(v, OP_Lt, 0, lbl); 1037fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 103899fcd718Sdrh sqliteVdbeAddOp(v, OP_Le, 0, dest); 103999fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 104099fcd718Sdrh sqliteVdbeResolveLabel(v, lbl); 104199fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1042fef5208cSdrh break; 1043fef5208cSdrh } 1044cce7d176Sdrh default: { 1045cce7d176Sdrh sqliteExprCode(pParse, pExpr); 104699fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 1047cce7d176Sdrh break; 1048cce7d176Sdrh } 1049cce7d176Sdrh } 1050cce7d176Sdrh } 1051cce7d176Sdrh 1052cce7d176Sdrh /* 105366b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1054cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1055cce7d176Sdrh ** continues straight thru if the expression is true. 1056cce7d176Sdrh */ 1057cce7d176Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest){ 1058cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1059cce7d176Sdrh int op = 0; 1060daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1061cce7d176Sdrh switch( pExpr->op ){ 1062cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1063cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1064cce7d176Sdrh case TK_GT: op = OP_Le; break; 1065cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1066cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1067cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1068cce7d176Sdrh case TK_LIKE: op = OP_Like; break; 1069cce7d176Sdrh case TK_GLOB: op = OP_Glob; break; 1070cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1071cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1072cce7d176Sdrh default: break; 1073cce7d176Sdrh } 1074cce7d176Sdrh switch( pExpr->op ){ 1075cce7d176Sdrh case TK_AND: { 1076cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest); 1077cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 1078cce7d176Sdrh break; 1079cce7d176Sdrh } 1080cce7d176Sdrh case TK_OR: { 1081cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1082cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2); 1083cce7d176Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest); 1084cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1085cce7d176Sdrh break; 1086cce7d176Sdrh } 1087cce7d176Sdrh case TK_NOT: { 1088cce7d176Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest); 1089cce7d176Sdrh break; 1090cce7d176Sdrh } 1091cce7d176Sdrh case TK_LT: 1092cce7d176Sdrh case TK_LE: 1093cce7d176Sdrh case TK_GT: 1094cce7d176Sdrh case TK_GE: 1095cce7d176Sdrh case TK_NE: 1096cce7d176Sdrh case TK_EQ: { 1097cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1098cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 109999fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1100cce7d176Sdrh break; 1101cce7d176Sdrh } 1102cce7d176Sdrh case TK_LIKE: 1103cce7d176Sdrh case TK_GLOB: { 1104cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1105cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 110699fcd718Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1107cce7d176Sdrh break; 1108cce7d176Sdrh } 1109cce7d176Sdrh case TK_ISNULL: 1110cce7d176Sdrh case TK_NOTNULL: { 1111cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 111299fcd718Sdrh sqliteVdbeAddOp(v, op, 0, dest); 1113cce7d176Sdrh break; 1114cce7d176Sdrh } 1115fef5208cSdrh case TK_IN: { 1116cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1117fef5208cSdrh if( pExpr->pSelect ){ 111899fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1119fef5208cSdrh }else{ 112099fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1121fef5208cSdrh } 1122fef5208cSdrh break; 1123fef5208cSdrh } 1124fef5208cSdrh case TK_BETWEEN: { 1125fef5208cSdrh int addr; 1126fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 112799fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1128fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1129fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 113099fcd718Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, addr+3); 113199fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 113299fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 1133fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 113499fcd718Sdrh sqliteVdbeAddOp(v, OP_Gt, 0, dest); 1135fef5208cSdrh break; 1136fef5208cSdrh } 1137cce7d176Sdrh default: { 1138cce7d176Sdrh sqliteExprCode(pParse, pExpr); 113999fcd718Sdrh sqliteVdbeAddOp(v, OP_Not, 0, 0); 114099fcd718Sdrh sqliteVdbeAddOp(v, OP_If, 0, dest); 1141cce7d176Sdrh break; 1142cce7d176Sdrh } 1143cce7d176Sdrh } 1144cce7d176Sdrh } 11452282792aSdrh 11462282792aSdrh /* 11472282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 11482282792aSdrh ** if they are identical and return FALSE if they differ in any way. 11492282792aSdrh */ 1150d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 11512282792aSdrh int i; 11522282792aSdrh if( pA==0 ){ 11532282792aSdrh return pB==0; 11542282792aSdrh }else if( pB==0 ){ 11552282792aSdrh return 0; 11562282792aSdrh } 11572282792aSdrh if( pA->op!=pB->op ) return 0; 1158d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1159d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 11602282792aSdrh if( pA->pList ){ 11612282792aSdrh if( pB->pList==0 ) return 0; 11622282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 11632282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1164d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 11652282792aSdrh return 0; 11662282792aSdrh } 11672282792aSdrh } 11682282792aSdrh }else if( pB->pList ){ 11692282792aSdrh return 0; 11702282792aSdrh } 11712282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 11722282792aSdrh if( pA->token.z ){ 11732282792aSdrh if( pB->token.z==0 ) return 0; 11742282792aSdrh if( pB->token.n!=pA->token.n ) return 0; 11752282792aSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pA->token.n)!=0 ) return 0; 11762282792aSdrh } 11772282792aSdrh return 1; 11782282792aSdrh } 11792282792aSdrh 11802282792aSdrh /* 11812282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 11822282792aSdrh */ 11832282792aSdrh static int appendAggInfo(Parse *pParse){ 11842282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 11852282792aSdrh int amt = pParse->nAgg + 8; 11866d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 11876d4abfbeSdrh if( aAgg==0 ){ 11882282792aSdrh return -1; 11892282792aSdrh } 11906d4abfbeSdrh pParse->aAgg = aAgg; 11912282792aSdrh } 11922282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 11932282792aSdrh return pParse->nAgg++; 11942282792aSdrh } 11952282792aSdrh 11962282792aSdrh /* 11972282792aSdrh ** Analyze the given expression looking for aggregate functions and 11982282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 11992282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 12002282792aSdrh ** 12012282792aSdrh ** This routine should only be called after the expression has been 12022282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 12032282792aSdrh ** 12042282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 12052282792aSdrh ** the number of errors. 12062282792aSdrh */ 12072282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 12082282792aSdrh int i; 12092282792aSdrh AggExpr *aAgg; 12102282792aSdrh int nErr = 0; 12112282792aSdrh 12122282792aSdrh if( pExpr==0 ) return 0; 12132282792aSdrh switch( pExpr->op ){ 1214967e8b73Sdrh case TK_COLUMN: { 12152282792aSdrh aAgg = pParse->aAgg; 12162282792aSdrh for(i=0; i<pParse->nAgg; i++){ 12172282792aSdrh if( aAgg[i].isAgg ) continue; 12182282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1219967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 12202282792aSdrh break; 12212282792aSdrh } 12222282792aSdrh } 12232282792aSdrh if( i>=pParse->nAgg ){ 12242282792aSdrh i = appendAggInfo(pParse); 12252282792aSdrh if( i<0 ) return 1; 12262282792aSdrh pParse->aAgg[i].isAgg = 0; 12272282792aSdrh pParse->aAgg[i].pExpr = pExpr; 12282282792aSdrh } 1229aaf88729Sdrh pExpr->iAgg = i; 12302282792aSdrh break; 12312282792aSdrh } 12322282792aSdrh case TK_AGG_FUNCTION: { 1233967e8b73Sdrh if( pExpr->iColumn==FN_Count || pExpr->iColumn==FN_Avg ){ 12342282792aSdrh if( pParse->iAggCount>=0 ){ 12352282792aSdrh i = pParse->iAggCount; 12362282792aSdrh }else{ 12372282792aSdrh i = appendAggInfo(pParse); 12382282792aSdrh if( i<0 ) return 1; 12392282792aSdrh pParse->aAgg[i].isAgg = 1; 12402282792aSdrh pParse->aAgg[i].pExpr = 0; 12412282792aSdrh pParse->iAggCount = i; 12422282792aSdrh } 1243967e8b73Sdrh if( pExpr->iColumn==FN_Count ){ 12442282792aSdrh pExpr->iAgg = i; 12452282792aSdrh break; 12462282792aSdrh } 12472282792aSdrh } 12482282792aSdrh aAgg = pParse->aAgg; 12492282792aSdrh for(i=0; i<pParse->nAgg; i++){ 12502282792aSdrh if( !aAgg[i].isAgg ) continue; 1251d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 12522282792aSdrh break; 12532282792aSdrh } 12542282792aSdrh } 12552282792aSdrh if( i>=pParse->nAgg ){ 12562282792aSdrh i = appendAggInfo(pParse); 12572282792aSdrh if( i<0 ) return 1; 12582282792aSdrh pParse->aAgg[i].isAgg = 1; 12592282792aSdrh pParse->aAgg[i].pExpr = pExpr; 1260e5095355Sdrh if( pExpr->iColumn==FN_Unknown ){ 1261e5095355Sdrh pParse->aAgg[i].pUser = sqliteFindUserFunction(pParse->db, 1262e5095355Sdrh pExpr->token.z, pExpr->token.n, pExpr->pList->nExpr, 0); 1263e5095355Sdrh }else{ 1264e5095355Sdrh pParse->aAgg[i].pUser = 0; 1265e5095355Sdrh } 12662282792aSdrh } 12672282792aSdrh pExpr->iAgg = i; 12682282792aSdrh break; 12692282792aSdrh } 12702282792aSdrh default: { 12712282792aSdrh if( pExpr->pLeft ){ 12722282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 12732282792aSdrh } 12742282792aSdrh if( nErr==0 && pExpr->pRight ){ 12752282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 12762282792aSdrh } 12772282792aSdrh if( nErr==0 && pExpr->pList ){ 12782282792aSdrh int n = pExpr->pList->nExpr; 12792282792aSdrh int i; 12802282792aSdrh for(i=0; nErr==0 && i<n; i++){ 12812282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 12822282792aSdrh } 12832282792aSdrh } 12842282792aSdrh break; 12852282792aSdrh } 12862282792aSdrh } 12872282792aSdrh return nErr; 12882282792aSdrh } 12898e0a2f90Sdrh 12908e0a2f90Sdrh /* 12918e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 12928e0a2f90Sdrh ** Return a pointer to the UserFunc structure that defines that 12938e0a2f90Sdrh ** function, or return NULL if the function does not exist. 12948e0a2f90Sdrh ** 12958e0a2f90Sdrh ** If the createFlag argument is true, then a new (blank) UserFunc 12968e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 12978e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 12988e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 12998e0a2f90Sdrh ** any number of arguments will be returned. 13008e0a2f90Sdrh ** 13018e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 13028e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 13038e0a2f90Sdrh ** or xStep is non-zero. 13048e0a2f90Sdrh */ 13058e0a2f90Sdrh UserFunc *sqliteFindUserFunction( 13068e0a2f90Sdrh sqlite *db, /* An open database */ 13078e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 13088e0a2f90Sdrh int nName, /* Number of characters in the name */ 13098e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 13108e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 13118e0a2f90Sdrh ){ 13128e0a2f90Sdrh UserFunc *pFirst, *p, *pMaybe; 13138e0a2f90Sdrh pFirst = p = (UserFunc*)sqliteHashFind(&db->userFunc, zName, nName); 13148e0a2f90Sdrh if( !createFlag && nArg<0 ){ 13158e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 13168e0a2f90Sdrh return p; 13178e0a2f90Sdrh } 13188e0a2f90Sdrh pMaybe = 0; 13198e0a2f90Sdrh while( p && p->nArg!=nArg ){ 13208e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 13218e0a2f90Sdrh p = p->pNext; 13228e0a2f90Sdrh } 13238e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 13248e0a2f90Sdrh return 0; 13258e0a2f90Sdrh } 13268e0a2f90Sdrh if( p==0 && pMaybe ){ 13278e0a2f90Sdrh assert( createFlag==0 ); 13288e0a2f90Sdrh return pMaybe; 13298e0a2f90Sdrh } 13308e0a2f90Sdrh if( p==0 && createFlag ){ 13318e0a2f90Sdrh p = sqliteMalloc( sizeof(*p) ); 13328e0a2f90Sdrh p->nArg = nArg; 13338e0a2f90Sdrh p->pNext = pFirst; 13348e0a2f90Sdrh sqliteHashInsert(&db->userFunc, zName, nName, (void*)p); 13358e0a2f90Sdrh } 13368e0a2f90Sdrh return p; 13378e0a2f90Sdrh } 1338