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*4efc4754Sdrh ** $Id: expr.c,v 1.105 2004/01/16 15:55:38 drh Exp $ 16cce7d176Sdrh */ 17cce7d176Sdrh #include "sqliteInt.h" 1804738cb9Sdrh #include <ctype.h> 19a2e00042Sdrh 20a2e00042Sdrh /* 21a76b5dfcSdrh ** Construct a new expression node and return a pointer to it. Memory 22a76b5dfcSdrh ** for this node is obtained from sqliteMalloc(). The calling function 23a76b5dfcSdrh ** is responsible for making sure the node eventually gets freed. 24a76b5dfcSdrh */ 25a76b5dfcSdrh Expr *sqliteExpr(int op, Expr *pLeft, Expr *pRight, Token *pToken){ 26a76b5dfcSdrh Expr *pNew; 27a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 28a76b5dfcSdrh if( pNew==0 ){ 29*4efc4754Sdrh /* When malloc fails, we leak memory from pLeft and pRight */ 30a76b5dfcSdrh return 0; 31a76b5dfcSdrh } 32a76b5dfcSdrh pNew->op = op; 33a76b5dfcSdrh pNew->pLeft = pLeft; 34a76b5dfcSdrh pNew->pRight = pRight; 35a76b5dfcSdrh if( pToken ){ 364b59ab5eSdrh assert( pToken->dyn==0 ); 37a76b5dfcSdrh pNew->token = *pToken; 386977fea8Sdrh pNew->span = *pToken; 39a76b5dfcSdrh }else{ 40*4efc4754Sdrh assert( pNew->token.dyn==0 ); 41*4efc4754Sdrh assert( pNew->token.z==0 ); 42*4efc4754Sdrh assert( pNew->token.n==0 ); 436977fea8Sdrh if( pLeft && pRight ){ 446977fea8Sdrh sqliteExprSpan(pNew, &pLeft->span, &pRight->span); 456977fea8Sdrh }else{ 466977fea8Sdrh pNew->span = pNew->token; 476977fea8Sdrh } 48a76b5dfcSdrh } 49a76b5dfcSdrh return pNew; 50a76b5dfcSdrh } 51a76b5dfcSdrh 52a76b5dfcSdrh /* 536977fea8Sdrh ** Set the Expr.span field of the given expression to span all 54a76b5dfcSdrh ** text between the two given tokens. 55a76b5dfcSdrh */ 56a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ 57*4efc4754Sdrh assert( pRight!=0 ); 58*4efc4754Sdrh assert( pLeft!=0 ); 59*4efc4754Sdrh /* Note: pExpr might be NULL due to a prior malloc failure */ 60*4efc4754Sdrh if( pExpr && pRight->z && pLeft->z ){ 614b59ab5eSdrh if( pLeft->dyn==0 && pRight->dyn==0 ){ 626977fea8Sdrh pExpr->span.z = pLeft->z; 636977fea8Sdrh pExpr->span.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z); 644b59ab5eSdrh }else{ 656977fea8Sdrh pExpr->span.z = 0; 664b59ab5eSdrh } 67a76b5dfcSdrh } 68a76b5dfcSdrh } 69a76b5dfcSdrh 70a76b5dfcSdrh /* 71a76b5dfcSdrh ** Construct a new expression node for a function with multiple 72a76b5dfcSdrh ** arguments. 73a76b5dfcSdrh */ 74a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){ 75a76b5dfcSdrh Expr *pNew; 76a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 77a76b5dfcSdrh if( pNew==0 ){ 78*4efc4754Sdrh /* sqliteExprListDelete(pList); // Leak pList when malloc fails */ 79a76b5dfcSdrh return 0; 80a76b5dfcSdrh } 81a76b5dfcSdrh pNew->op = TK_FUNCTION; 82a76b5dfcSdrh pNew->pList = pList; 83a76b5dfcSdrh if( pToken ){ 844b59ab5eSdrh assert( pToken->dyn==0 ); 85a76b5dfcSdrh pNew->token = *pToken; 86a76b5dfcSdrh }else{ 87a76b5dfcSdrh pNew->token.z = 0; 88a76b5dfcSdrh } 896977fea8Sdrh pNew->span = pNew->token; 90a76b5dfcSdrh return pNew; 91a76b5dfcSdrh } 92a76b5dfcSdrh 93a76b5dfcSdrh /* 94a2e00042Sdrh ** Recursively delete an expression tree. 95a2e00042Sdrh */ 96a2e00042Sdrh void sqliteExprDelete(Expr *p){ 97a2e00042Sdrh if( p==0 ) return; 98*4efc4754Sdrh if( p->span.dyn ) sqliteFree((char*)p->span.z); 99*4efc4754Sdrh if( p->token.dyn ) sqliteFree((char*)p->token.z); 100*4efc4754Sdrh sqliteExprDelete(p->pLeft); 101*4efc4754Sdrh sqliteExprDelete(p->pRight); 102*4efc4754Sdrh sqliteExprListDelete(p->pList); 103*4efc4754Sdrh sqliteSelectDelete(p->pSelect); 104a2e00042Sdrh sqliteFree(p); 105a2e00042Sdrh } 106a2e00042Sdrh 107a76b5dfcSdrh 108a76b5dfcSdrh /* 109ff78bd2fSdrh ** The following group of routines make deep copies of expressions, 110ff78bd2fSdrh ** expression lists, ID lists, and select statements. The copies can 111ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines) 112ff78bd2fSdrh ** without effecting the originals. 113ff78bd2fSdrh ** 114ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(), 115ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded 116ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines. 117ff78bd2fSdrh ** 118ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated. 119ff78bd2fSdrh */ 120ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){ 121ff78bd2fSdrh Expr *pNew; 122ff78bd2fSdrh if( p==0 ) return 0; 123fcb78a49Sdrh pNew = sqliteMallocRaw( sizeof(*p) ); 124ff78bd2fSdrh if( pNew==0 ) return 0; 1253b167c75Sdrh memcpy(pNew, p, sizeof(*pNew)); 1266977fea8Sdrh if( p->token.z!=0 ){ 1274b59ab5eSdrh pNew->token.z = sqliteStrDup(p->token.z); 1284b59ab5eSdrh pNew->token.dyn = 1; 1294b59ab5eSdrh }else{ 130*4efc4754Sdrh assert( pNew->token.z==0 ); 1314b59ab5eSdrh } 1326977fea8Sdrh pNew->span.z = 0; 133ff78bd2fSdrh pNew->pLeft = sqliteExprDup(p->pLeft); 134ff78bd2fSdrh pNew->pRight = sqliteExprDup(p->pRight); 135ff78bd2fSdrh pNew->pList = sqliteExprListDup(p->pList); 136ff78bd2fSdrh pNew->pSelect = sqliteSelectDup(p->pSelect); 137ff78bd2fSdrh return pNew; 138ff78bd2fSdrh } 1394b59ab5eSdrh void sqliteTokenCopy(Token *pTo, Token *pFrom){ 1404b59ab5eSdrh if( pTo->dyn ) sqliteFree((char*)pTo->z); 1414b59ab5eSdrh if( pFrom->z ){ 1424b59ab5eSdrh pTo->n = pFrom->n; 1434b59ab5eSdrh pTo->z = sqliteStrNDup(pFrom->z, pFrom->n); 1444b59ab5eSdrh pTo->dyn = 1; 1454b59ab5eSdrh }else{ 1464b59ab5eSdrh pTo->z = 0; 1474b59ab5eSdrh } 1484b59ab5eSdrh } 149ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){ 150ff78bd2fSdrh ExprList *pNew; 151ff78bd2fSdrh int i; 152ff78bd2fSdrh if( p==0 ) return 0; 153ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 154ff78bd2fSdrh if( pNew==0 ) return 0; 1554305d103Sdrh pNew->nExpr = pNew->nAlloc = p->nExpr; 156ff78bd2fSdrh pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); 157e4697f5eSdrh if( pNew->a==0 ) return 0; 158ff78bd2fSdrh for(i=0; i<p->nExpr; i++){ 1594b59ab5eSdrh Expr *pNewExpr, *pOldExpr; 1604b59ab5eSdrh pNew->a[i].pExpr = pNewExpr = sqliteExprDup(pOldExpr = p->a[i].pExpr); 1616977fea8Sdrh if( pOldExpr->span.z!=0 && pNewExpr ){ 1626977fea8Sdrh /* Always make a copy of the span for top-level expressions in the 1634b59ab5eSdrh ** expression list. The logic in SELECT processing that determines 1644b59ab5eSdrh ** the names of columns in the result set needs this information */ 1656977fea8Sdrh sqliteTokenCopy(&pNewExpr->span, &pOldExpr->span); 1664b59ab5eSdrh } 1671f3e905cSdrh assert( pNewExpr==0 || pNewExpr->span.z!=0 1681f3e905cSdrh || pOldExpr->span.z==0 || sqlite_malloc_failed ); 169ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 170ff78bd2fSdrh pNew->a[i].sortOrder = p->a[i].sortOrder; 171ff78bd2fSdrh pNew->a[i].isAgg = p->a[i].isAgg; 172ff78bd2fSdrh pNew->a[i].done = 0; 173ff78bd2fSdrh } 174ff78bd2fSdrh return pNew; 175ff78bd2fSdrh } 176ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){ 177ad3cab52Sdrh SrcList *pNew; 178ad3cab52Sdrh int i; 179113088ecSdrh int nByte; 180ad3cab52Sdrh if( p==0 ) return 0; 181113088ecSdrh nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); 182*4efc4754Sdrh pNew = sqliteMallocRaw( nByte ); 183ad3cab52Sdrh if( pNew==0 ) return 0; 1844305d103Sdrh pNew->nSrc = pNew->nAlloc = p->nSrc; 185ad3cab52Sdrh for(i=0; i<p->nSrc; i++){ 186*4efc4754Sdrh struct SrcList_item *pNewItem = &pNew->a[i]; 187*4efc4754Sdrh struct SrcList_item *pOldItem = &p->a[i]; 188*4efc4754Sdrh pNewItem->zDatabase = sqliteStrDup(pOldItem->zDatabase); 189*4efc4754Sdrh pNewItem->zName = sqliteStrDup(pOldItem->zName); 190*4efc4754Sdrh pNewItem->zAlias = sqliteStrDup(pOldItem->zAlias); 191*4efc4754Sdrh pNewItem->jointype = pOldItem->jointype; 192*4efc4754Sdrh pNewItem->iCursor = pOldItem->iCursor; 193*4efc4754Sdrh pNewItem->pTab = 0; 194*4efc4754Sdrh pNewItem->pSelect = sqliteSelectDup(pOldItem->pSelect); 195*4efc4754Sdrh pNewItem->pOn = sqliteExprDup(pOldItem->pOn); 196*4efc4754Sdrh pNewItem->pUsing = sqliteIdListDup(pOldItem->pUsing); 197ad3cab52Sdrh } 198ad3cab52Sdrh return pNew; 199ad3cab52Sdrh } 200ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){ 201ff78bd2fSdrh IdList *pNew; 202ff78bd2fSdrh int i; 203ff78bd2fSdrh if( p==0 ) return 0; 204*4efc4754Sdrh pNew = sqliteMallocRaw( sizeof(*pNew) ); 205ff78bd2fSdrh if( pNew==0 ) return 0; 2064305d103Sdrh pNew->nId = pNew->nAlloc = p->nId; 207*4efc4754Sdrh pNew->a = sqliteMallocRaw( p->nId*sizeof(p->a[0]) ); 208e4697f5eSdrh if( pNew->a==0 ) return 0; 209ff78bd2fSdrh for(i=0; i<p->nId; i++){ 210*4efc4754Sdrh struct IdList_item *pNewItem = &pNew->a[i]; 211*4efc4754Sdrh struct IdList_item *pOldItem = &p->a[i]; 212*4efc4754Sdrh pNewItem->zName = sqliteStrDup(pOldItem->zName); 213*4efc4754Sdrh pNewItem->idx = pOldItem->idx; 214ff78bd2fSdrh } 215ff78bd2fSdrh return pNew; 216ff78bd2fSdrh } 217ff78bd2fSdrh Select *sqliteSelectDup(Select *p){ 218ff78bd2fSdrh Select *pNew; 219ff78bd2fSdrh if( p==0 ) return 0; 220*4efc4754Sdrh pNew = sqliteMallocRaw( sizeof(*p) ); 221ff78bd2fSdrh if( pNew==0 ) return 0; 222ff78bd2fSdrh pNew->isDistinct = p->isDistinct; 223ff78bd2fSdrh pNew->pEList = sqliteExprListDup(p->pEList); 224ad3cab52Sdrh pNew->pSrc = sqliteSrcListDup(p->pSrc); 225ff78bd2fSdrh pNew->pWhere = sqliteExprDup(p->pWhere); 226ff78bd2fSdrh pNew->pGroupBy = sqliteExprListDup(p->pGroupBy); 227ff78bd2fSdrh pNew->pHaving = sqliteExprDup(p->pHaving); 228ff78bd2fSdrh pNew->pOrderBy = sqliteExprListDup(p->pOrderBy); 229ff78bd2fSdrh pNew->op = p->op; 230ff78bd2fSdrh pNew->pPrior = sqliteSelectDup(p->pPrior); 231ff78bd2fSdrh pNew->nLimit = p->nLimit; 232ff78bd2fSdrh pNew->nOffset = p->nOffset; 233ff78bd2fSdrh pNew->zSelect = 0; 2347b58daeaSdrh pNew->iLimit = -1; 2357b58daeaSdrh pNew->iOffset = -1; 236ff78bd2fSdrh return pNew; 237ff78bd2fSdrh } 238ff78bd2fSdrh 239ff78bd2fSdrh 240ff78bd2fSdrh /* 241a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 242a76b5dfcSdrh ** initially NULL, then create a new expression list. 243a76b5dfcSdrh */ 244a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 245a76b5dfcSdrh int i; 246a76b5dfcSdrh if( pList==0 ){ 247a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 248a76b5dfcSdrh if( pList==0 ){ 249*4efc4754Sdrh /* sqliteExprDelete(pExpr); // Leak memory if malloc fails */ 250a76b5dfcSdrh return 0; 251a76b5dfcSdrh } 252*4efc4754Sdrh assert( pList->nAlloc==0 ); 253a76b5dfcSdrh } 2544305d103Sdrh if( pList->nAlloc<=pList->nExpr ){ 2554305d103Sdrh pList->nAlloc = pList->nAlloc*2 + 4; 256*4efc4754Sdrh pList->a = sqliteRealloc(pList->a, pList->nAlloc*sizeof(pList->a[0])); 257*4efc4754Sdrh if( pList->a==0 ){ 258*4efc4754Sdrh /* sqliteExprDelete(pExpr); // Leak memory if malloc fails */ 259*4efc4754Sdrh pList->nExpr = pList->nAlloc = 0; 260a76b5dfcSdrh return pList; 261a76b5dfcSdrh } 262a76b5dfcSdrh } 263*4efc4754Sdrh assert( pList->a!=0 ); 264*4efc4754Sdrh if( pExpr || pName ){ 265*4efc4754Sdrh struct ExprList_item *pItem = &pList->a[pList->nExpr++]; 266*4efc4754Sdrh memset(pItem, 0, sizeof(*pItem)); 267*4efc4754Sdrh pItem->pExpr = pExpr; 268a76b5dfcSdrh if( pName ){ 269*4efc4754Sdrh sqliteSetNString(&pItem->zName, pName->z, pName->n, 0); 270*4efc4754Sdrh sqliteDequote(pItem->zName); 271a76b5dfcSdrh } 272a76b5dfcSdrh } 273a76b5dfcSdrh return pList; 274a76b5dfcSdrh } 275a76b5dfcSdrh 276a76b5dfcSdrh /* 277a76b5dfcSdrh ** Delete an entire expression list. 278a76b5dfcSdrh */ 279a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){ 280a76b5dfcSdrh int i; 281a76b5dfcSdrh if( pList==0 ) return; 282a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 283a76b5dfcSdrh sqliteExprDelete(pList->a[i].pExpr); 284a76b5dfcSdrh sqliteFree(pList->a[i].zName); 285a76b5dfcSdrh } 286a76b5dfcSdrh sqliteFree(pList->a); 287a76b5dfcSdrh sqliteFree(pList); 288a76b5dfcSdrh } 289a76b5dfcSdrh 290a76b5dfcSdrh /* 291fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 292fef5208cSdrh ** and 0 if it involves variables. 2932398937bSdrh ** 2942398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc") 2952398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is 2962398937bSdrh ** a constant. 297fef5208cSdrh */ 2989208643dSdrh int sqliteExprIsConstant(Expr *p){ 299fef5208cSdrh switch( p->op ){ 300fef5208cSdrh case TK_ID: 301967e8b73Sdrh case TK_COLUMN: 302fef5208cSdrh case TK_DOT: 3037bdc0c1dSdrh case TK_FUNCTION: 304fef5208cSdrh return 0; 3057bdc0c1dSdrh case TK_NULL: 3062398937bSdrh case TK_STRING: 3079208643dSdrh case TK_INTEGER: 3089208643dSdrh case TK_FLOAT: 30950457896Sdrh case TK_VARIABLE: 3109208643dSdrh return 1; 311fef5208cSdrh default: { 3129208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 3139208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 314fef5208cSdrh if( p->pList ){ 315fef5208cSdrh int i; 316fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 3179208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 318fef5208cSdrh } 319fef5208cSdrh } 3209208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 321fef5208cSdrh } 322fef5208cSdrh } 3239208643dSdrh return 0; 324fef5208cSdrh } 325fef5208cSdrh 326fef5208cSdrh /* 327202b2df7Sdrh ** If the given expression codes a constant integer that is small enough 328202b2df7Sdrh ** to fit in a 32-bit integer, return 1 and put the value of the integer 329202b2df7Sdrh ** in *pValue. If the expression is not an integer or if it is too big 330202b2df7Sdrh ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. 331e4de1febSdrh */ 332e4de1febSdrh int sqliteExprIsInteger(Expr *p, int *pValue){ 333e4de1febSdrh switch( p->op ){ 334e4de1febSdrh case TK_INTEGER: { 335202b2df7Sdrh if( sqliteFitsIn32Bits(p->token.z) ){ 336e4de1febSdrh *pValue = atoi(p->token.z); 337e4de1febSdrh return 1; 338e4de1febSdrh } 339202b2df7Sdrh break; 340202b2df7Sdrh } 341e4de1febSdrh case TK_STRING: { 342bd790ee3Sdrh const char *z = p->token.z; 343e4de1febSdrh int n = p->token.n; 344bd790ee3Sdrh if( n>0 && z[0]=='-' ){ z++; n--; } 345e4de1febSdrh while( n>0 && *z && isdigit(*z) ){ z++; n--; } 346202b2df7Sdrh if( n==0 && sqliteFitsIn32Bits(p->token.z) ){ 347e4de1febSdrh *pValue = atoi(p->token.z); 348e4de1febSdrh return 1; 349e4de1febSdrh } 350e4de1febSdrh break; 351e4de1febSdrh } 3524b59ab5eSdrh case TK_UPLUS: { 3534b59ab5eSdrh return sqliteExprIsInteger(p->pLeft, pValue); 3544b59ab5eSdrh } 355e4de1febSdrh case TK_UMINUS: { 356e4de1febSdrh int v; 357e4de1febSdrh if( sqliteExprIsInteger(p->pLeft, &v) ){ 358e4de1febSdrh *pValue = -v; 359e4de1febSdrh return 1; 360e4de1febSdrh } 361e4de1febSdrh break; 362e4de1febSdrh } 363e4de1febSdrh default: break; 364e4de1febSdrh } 365e4de1febSdrh return 0; 366e4de1febSdrh } 367e4de1febSdrh 368e4de1febSdrh /* 369c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 370c4a3c779Sdrh */ 371a9f9d1c0Sdrh int sqliteIsRowid(const char *z){ 372c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 373c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 374c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 375c4a3c779Sdrh return 0; 376c4a3c779Sdrh } 377c4a3c779Sdrh 378c4a3c779Sdrh /* 379cce7d176Sdrh ** This routine walks an expression tree and resolves references to 380967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 381aacc543eSdrh ** index to the table in the table list and a column offset. The 382aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 383aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 384832508b7Sdrh ** plus the "base" value. The base value will ultimately become the 385aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 386aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 387aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 388aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 389aacc543eSdrh ** alias for ROWID. 39019a775c2Sdrh ** 391fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 392fef5208cSdrh ** forms: 393fef5208cSdrh ** 394fef5208cSdrh ** expr IN (exprlist) 395fef5208cSdrh ** and 396fef5208cSdrh ** expr IN (SELECT ...) 397fef5208cSdrh ** 398fef5208cSdrh ** The first form is handled by creating a set holding the list 399fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 400fef5208cSdrh ** a temporary table. 401fef5208cSdrh ** 402fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 40319a775c2Sdrh ** If it finds any, it generates code to write the value of that select 40419a775c2Sdrh ** into a memory cell. 405cce7d176Sdrh ** 406967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 407cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 408cce7d176Sdrh */ 409a2e00042Sdrh int sqliteExprResolveIds( 410a2e00042Sdrh Parse *pParse, /* The parser context */ 411ad3cab52Sdrh SrcList *pTabList, /* List of tables used to resolve column names */ 412a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 413a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 414a2e00042Sdrh ){ 4156a3ea0e6Sdrh int i; 4166a3ea0e6Sdrh 417daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 4186a3ea0e6Sdrh for(i=0; i<pTabList->nSrc; i++){ 4196a3ea0e6Sdrh assert( pTabList->a[i].iCursor>=0 && pTabList->a[i].iCursor<pParse->nTab ); 4206a3ea0e6Sdrh } 421cce7d176Sdrh switch( pExpr->op ){ 4222398937bSdrh /* Double-quoted strings (ex: "abc") are used as identifiers if 4232398937bSdrh ** possible. Otherwise they remain as strings. Single-quoted 4242398937bSdrh ** strings (ex: 'abc') are always string literals. 4252398937bSdrh */ 4262398937bSdrh case TK_STRING: { 4272398937bSdrh if( pExpr->token.z[0]=='\'' ) break; 4282398937bSdrh /* Fall thru into the TK_ID case if this is a double-quoted string */ 4292398937bSdrh } 430a2e00042Sdrh /* A lone identifier. Try and match it as follows: 431a2e00042Sdrh ** 432a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 433a2e00042Sdrh ** 434a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 435a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 436a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 437a2e00042Sdrh ** 438a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 439a2e00042Sdrh */ 440cce7d176Sdrh case TK_ID: { 441cce7d176Sdrh int cnt = 0; /* Number of matches */ 442a76b5dfcSdrh char *z; 443e22a334bSdrh int iDb = -1; 444e22a334bSdrh 445a76b5dfcSdrh assert( pExpr->token.z ); 446a76b5dfcSdrh z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 4472f4392ffSdrh sqliteDequote(z); 448daffd0e5Sdrh if( z==0 ) return 1; 449ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 450cce7d176Sdrh int j; 451cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 452cce7d176Sdrh if( pTab==0 ) continue; 453e22a334bSdrh iDb = pTab->iDb; 454417be79cSdrh assert( pTab->nCol>0 ); 455cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 4567020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 457cce7d176Sdrh cnt++; 4586a3ea0e6Sdrh pExpr->iTable = pTabList->a[i].iCursor; 459e22a334bSdrh pExpr->iDb = pTab->iDb; 4604a32431cSdrh if( j==pTab->iPKey ){ 4614a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 4624a32431cSdrh pExpr->iColumn = -1; 463c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 4644a32431cSdrh }else{ 465967e8b73Sdrh pExpr->iColumn = j; 466c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 467cce7d176Sdrh } 468a2e00042Sdrh pExpr->op = TK_COLUMN; 469a2e00042Sdrh } 470a2e00042Sdrh } 471a2e00042Sdrh } 472a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 473a2e00042Sdrh int j; 474a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 475a2e00042Sdrh char *zAs = pEList->a[j].zName; 476a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 477a2e00042Sdrh cnt++; 478a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 479a2e00042Sdrh pExpr->op = TK_AS; 480a2e00042Sdrh pExpr->iColumn = j; 48175148a27Sdrh pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr); 482cce7d176Sdrh } 483cce7d176Sdrh } 4844a32431cSdrh } 485e22a334bSdrh if( cnt==0 && iDb>=0 && sqliteIsRowid(z) ){ 486c4a3c779Sdrh pExpr->iColumn = -1; 4876a3ea0e6Sdrh pExpr->iTable = pTabList->a[0].iCursor; 488e22a334bSdrh pExpr->iDb = iDb; 489ad3cab52Sdrh cnt = 1 + (pTabList->nSrc>1); 490a2e00042Sdrh pExpr->op = TK_COLUMN; 491c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 492c4a3c779Sdrh } 493cce7d176Sdrh sqliteFree(z); 4942398937bSdrh if( cnt==0 && pExpr->token.z[0]!='"' ){ 495da93d238Sdrh sqliteErrorMsg(pParse, "no such column: %T", &pExpr->token); 496cce7d176Sdrh return 1; 497cce7d176Sdrh }else if( cnt>1 ){ 498da93d238Sdrh sqliteErrorMsg(pParse, "ambiguous column name: %T", &pExpr->token); 499cce7d176Sdrh return 1; 500cce7d176Sdrh } 501ed6c8671Sdrh if( pExpr->op==TK_COLUMN ){ 5026a3ea0e6Sdrh sqliteAuthRead(pParse, pExpr, pTabList); 503ed6c8671Sdrh } 504cce7d176Sdrh break; 505cce7d176Sdrh } 506cce7d176Sdrh 507d24cc427Sdrh /* A table name and column name: ID.ID 508d24cc427Sdrh ** Or a database, table and column: ID.ID.ID 509d24cc427Sdrh */ 510cce7d176Sdrh case TK_DOT: { 511cce7d176Sdrh int cnt = 0; /* Number of matches */ 512c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 513cce7d176Sdrh int i; /* Loop counter */ 514cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 515cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 516d24cc427Sdrh char *zDb; /* Name of database holding table */ 517d24cc427Sdrh sqlite *db = pParse->db; 518cce7d176Sdrh 519cce7d176Sdrh pRight = pExpr->pRight; 520d24cc427Sdrh if( pRight->op==TK_ID ){ 521d24cc427Sdrh pLeft = pExpr->pLeft; 522d24cc427Sdrh zDb = 0; 523d24cc427Sdrh }else{ 524d24cc427Sdrh Expr *pDb = pExpr->pLeft; 525d24cc427Sdrh assert( pDb && pDb->op==TK_ID && pDb->token.z ); 526d24cc427Sdrh zDb = sqliteStrNDup(pDb->token.z, pDb->token.n); 527d24cc427Sdrh pLeft = pRight->pLeft; 528d24cc427Sdrh pRight = pRight->pRight; 529d24cc427Sdrh } 530a76b5dfcSdrh assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); 531a76b5dfcSdrh assert( pRight && pRight->op==TK_ID && pRight->token.z ); 5326e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 5336e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 534daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 535daffd0e5Sdrh sqliteFree(zLeft); 536daffd0e5Sdrh sqliteFree(zRight); 537d24cc427Sdrh sqliteFree(zDb); 538daffd0e5Sdrh return 1; 539daffd0e5Sdrh } 540d24cc427Sdrh sqliteDequote(zDb); 54187c40e88Sdrh sqliteDequote(zLeft); 54287c40e88Sdrh sqliteDequote(zRight); 543c4a3c779Sdrh pExpr->iTable = -1; 544ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 545cce7d176Sdrh int j; 546cce7d176Sdrh char *zTab; 547cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 548cce7d176Sdrh if( pTab==0 ) continue; 549417be79cSdrh assert( pTab->nCol>0 ); 550cce7d176Sdrh if( pTabList->a[i].zAlias ){ 551cce7d176Sdrh zTab = pTabList->a[i].zAlias; 552d24cc427Sdrh if( sqliteStrICmp(zTab, zLeft)!=0 ) continue; 553cce7d176Sdrh }else{ 554cce7d176Sdrh zTab = pTab->zName; 555094b2bbfSdrh if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; 556d24cc427Sdrh if( zDb!=0 && sqliteStrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){ 557d24cc427Sdrh continue; 558d24cc427Sdrh } 559d24cc427Sdrh } 560e22a334bSdrh if( 0==(cntTab++) ){ 5616a3ea0e6Sdrh pExpr->iTable = pTabList->a[i].iCursor; 562e22a334bSdrh pExpr->iDb = pTab->iDb; 563e22a334bSdrh } 564cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 5657020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 566cce7d176Sdrh cnt++; 5676a3ea0e6Sdrh pExpr->iTable = pTabList->a[i].iCursor; 568e22a334bSdrh pExpr->iDb = pTab->iDb; 56970ce3f0cSdrh /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ 57070ce3f0cSdrh pExpr->iColumn = j==pTab->iPKey ? -1 : j; 571c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 572cce7d176Sdrh } 573cce7d176Sdrh } 5744a32431cSdrh } 575c3f9bad2Sdanielk1977 576c3f9bad2Sdanielk1977 /* If we have not already resolved this *.* expression, then maybe 577c3f9bad2Sdanielk1977 * it is a new.* or old.* trigger argument reference */ 578c3f9bad2Sdanielk1977 if( cnt == 0 && pParse->trigStack != 0 ){ 579f29ce559Sdanielk1977 TriggerStack *pTriggerStack = pParse->trigStack; 580c3f9bad2Sdanielk1977 int t = 0; 581f29ce559Sdanielk1977 if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){ 582f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->newIdx; 583e22a334bSdrh assert( pTriggerStack->pTab ); 584e22a334bSdrh pExpr->iDb = pTriggerStack->pTab->iDb; 585c3f9bad2Sdanielk1977 cntTab++; 586c3f9bad2Sdanielk1977 t = 1; 587c3f9bad2Sdanielk1977 } 588f29ce559Sdanielk1977 if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){ 589f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->oldIdx; 590e22a334bSdrh assert( pTriggerStack->pTab ); 591e22a334bSdrh pExpr->iDb = pTriggerStack->pTab->iDb; 592c3f9bad2Sdanielk1977 cntTab++; 593c3f9bad2Sdanielk1977 t = 1; 594c3f9bad2Sdanielk1977 } 595c3f9bad2Sdanielk1977 596f29ce559Sdanielk1977 if( t ){ 597f29ce559Sdanielk1977 int j; 598c9b84a1fSdrh Table *pTab = pTriggerStack->pTab; 599c9b84a1fSdrh for(j=0; j < pTab->nCol; j++) { 600c9b84a1fSdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 601c3f9bad2Sdanielk1977 cnt++; 60270ce3f0cSdrh pExpr->iColumn = j==pTab->iPKey ? -1 : j; 603c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 604c3f9bad2Sdanielk1977 } 605c3f9bad2Sdanielk1977 } 606c3f9bad2Sdanielk1977 } 607f29ce559Sdanielk1977 } 608c3f9bad2Sdanielk1977 609c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 610c4a3c779Sdrh cnt = 1; 611c4a3c779Sdrh pExpr->iColumn = -1; 612c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 613c4a3c779Sdrh } 614d24cc427Sdrh sqliteFree(zDb); 615cce7d176Sdrh sqliteFree(zLeft); 616cce7d176Sdrh sqliteFree(zRight); 617cce7d176Sdrh if( cnt==0 ){ 618da93d238Sdrh sqliteErrorMsg(pParse, "no such column: %T.%T", 619da93d238Sdrh &pLeft->token, &pRight->token); 620cce7d176Sdrh return 1; 621cce7d176Sdrh }else if( cnt>1 ){ 622da93d238Sdrh sqliteErrorMsg(pParse, "ambiguous column name: %T.%T", 623da93d238Sdrh &pLeft->token, &pRight->token); 624cce7d176Sdrh return 1; 625cce7d176Sdrh } 626d24cc427Sdrh sqliteExprDelete(pExpr->pLeft); 627cce7d176Sdrh pExpr->pLeft = 0; 628d24cc427Sdrh sqliteExprDelete(pExpr->pRight); 629cce7d176Sdrh pExpr->pRight = 0; 630967e8b73Sdrh pExpr->op = TK_COLUMN; 6316a3ea0e6Sdrh sqliteAuthRead(pParse, pExpr, pTabList); 632cce7d176Sdrh break; 633cce7d176Sdrh } 634cce7d176Sdrh 635fef5208cSdrh case TK_IN: { 636d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 637fef5208cSdrh if( v==0 ) return 1; 6386a3ea0e6Sdrh if( sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 639cfab11bcSdrh return 1; 640cfab11bcSdrh } 641fef5208cSdrh if( pExpr->pSelect ){ 642fef5208cSdrh /* Case 1: expr IN (SELECT ...) 643fef5208cSdrh ** 644fef5208cSdrh ** Generate code to write the results of the select into a temporary 6454794b980Sdrh ** table. The cursor number of the temporary table has already 6464794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 647fef5208cSdrh */ 648832508b7Sdrh pExpr->iTable = pParse->nTab++; 649c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 650832508b7Sdrh sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0); 651fef5208cSdrh }else if( pExpr->pList ){ 652fef5208cSdrh /* Case 2: expr IN (exprlist) 653fef5208cSdrh ** 654fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 655fef5208cSdrh ** in iTable. 656fef5208cSdrh */ 657fef5208cSdrh int i, iSet; 658fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 659fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 6609208643dSdrh if( !sqliteExprIsConstant(pE2) ){ 661da93d238Sdrh sqliteErrorMsg(pParse, 662da93d238Sdrh "right-hand side of IN operator must be constant"); 663fef5208cSdrh return 1; 664fef5208cSdrh } 6654794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 6664794b980Sdrh return 1; 6674794b980Sdrh } 668fef5208cSdrh } 669fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 670fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 671fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 672fef5208cSdrh switch( pE2->op ){ 673fef5208cSdrh case TK_FLOAT: 674fef5208cSdrh case TK_INTEGER: 675fef5208cSdrh case TK_STRING: { 67699fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 677a76b5dfcSdrh assert( pE2->token.z ); 678fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 679fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 680fef5208cSdrh break; 681fef5208cSdrh } 682fef5208cSdrh default: { 683fef5208cSdrh sqliteExprCode(pParse, pE2); 68499fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 685fef5208cSdrh break; 686fef5208cSdrh } 687fef5208cSdrh } 688fef5208cSdrh } 689fef5208cSdrh } 690cfab11bcSdrh break; 691fef5208cSdrh } 692fef5208cSdrh 69319a775c2Sdrh case TK_SELECT: { 694fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 695fef5208cSdrh ** value of this select in a memory cell and record the number 696967e8b73Sdrh ** of the memory cell in iColumn. 697fef5208cSdrh */ 698967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 699832508b7Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){ 70019a775c2Sdrh return 1; 70119a775c2Sdrh } 70219a775c2Sdrh break; 70319a775c2Sdrh } 70419a775c2Sdrh 705cce7d176Sdrh /* For all else, just recursively walk the tree */ 706cce7d176Sdrh default: { 707cce7d176Sdrh if( pExpr->pLeft 7086a3ea0e6Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pLeft) ){ 709cce7d176Sdrh return 1; 710cce7d176Sdrh } 711cce7d176Sdrh if( pExpr->pRight 7126a3ea0e6Sdrh && sqliteExprResolveIds(pParse, pTabList, pEList, pExpr->pRight) ){ 713cce7d176Sdrh return 1; 714cce7d176Sdrh } 715cce7d176Sdrh if( pExpr->pList ){ 716cce7d176Sdrh int i; 717cce7d176Sdrh ExprList *pList = pExpr->pList; 718cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 719832508b7Sdrh Expr *pArg = pList->a[i].pExpr; 7206a3ea0e6Sdrh if( sqliteExprResolveIds(pParse, pTabList, pEList, pArg) ){ 721cce7d176Sdrh return 1; 722cce7d176Sdrh } 723cce7d176Sdrh } 724cce7d176Sdrh } 725cce7d176Sdrh } 726cce7d176Sdrh } 727cce7d176Sdrh return 0; 728cce7d176Sdrh } 729cce7d176Sdrh 730cce7d176Sdrh /* 7314b59ab5eSdrh ** pExpr is a node that defines a function of some kind. It might 7324b59ab5eSdrh ** be a syntactic function like "count(x)" or it might be a function 7334b59ab5eSdrh ** that implements an operator, like "a LIKE b". 7344b59ab5eSdrh ** 7354b59ab5eSdrh ** This routine makes *pzName point to the name of the function and 7364b59ab5eSdrh ** *pnName hold the number of characters in the function name. 7374b59ab5eSdrh */ 7384b59ab5eSdrh static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){ 7394b59ab5eSdrh switch( pExpr->op ){ 7404b59ab5eSdrh case TK_FUNCTION: { 7414b59ab5eSdrh *pzName = pExpr->token.z; 7426977fea8Sdrh *pnName = pExpr->token.n; 7434b59ab5eSdrh break; 7444b59ab5eSdrh } 7454b59ab5eSdrh case TK_LIKE: { 7464b59ab5eSdrh *pzName = "like"; 7474b59ab5eSdrh *pnName = 4; 7484b59ab5eSdrh break; 7494b59ab5eSdrh } 7504b59ab5eSdrh case TK_GLOB: { 7514b59ab5eSdrh *pzName = "glob"; 7524b59ab5eSdrh *pnName = 4; 7534b59ab5eSdrh break; 7544b59ab5eSdrh } 7554b59ab5eSdrh default: { 7564b59ab5eSdrh *pzName = "can't happen"; 7574b59ab5eSdrh *pnName = 12; 7584b59ab5eSdrh break; 7594b59ab5eSdrh } 7604b59ab5eSdrh } 7614b59ab5eSdrh } 7624b59ab5eSdrh 7634b59ab5eSdrh /* 764cce7d176Sdrh ** Error check the functions in an expression. Make sure all 765cce7d176Sdrh ** function names are recognized and all functions have the correct 766cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 767cce7d176Sdrh ** if anything is amiss. Return the number of errors. 768cce7d176Sdrh ** 769cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 770cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 771cce7d176Sdrh */ 772cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 773cce7d176Sdrh int nErr = 0; 774cce7d176Sdrh if( pExpr==0 ) return 0; 775cce7d176Sdrh switch( pExpr->op ){ 7764b59ab5eSdrh case TK_GLOB: 7774b59ab5eSdrh case TK_LIKE: 778cce7d176Sdrh case TK_FUNCTION: { 779c9b84a1fSdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; /* Number of arguments */ 780c9b84a1fSdrh int no_such_func = 0; /* True if no such function exists */ 781c9b84a1fSdrh int is_type_of = 0; /* True if is the special TypeOf() function */ 782c9b84a1fSdrh int wrong_num_args = 0; /* True if wrong number of arguments */ 783c9b84a1fSdrh int is_agg = 0; /* True if is an aggregate function */ 784cce7d176Sdrh int i; 7854b59ab5eSdrh int nId; /* Number of characters in function name */ 7864b59ab5eSdrh const char *zId; /* The function name. */ 7870bce8354Sdrh FuncDef *pDef; 7880bce8354Sdrh 7894b59ab5eSdrh getFunctionName(pExpr, &zId, &nId); 7904b59ab5eSdrh pDef = sqliteFindFunction(pParse->db, zId, nId, n, 0); 7910bce8354Sdrh if( pDef==0 ){ 7924b59ab5eSdrh pDef = sqliteFindFunction(pParse->db, zId, nId, -1, 0); 7930bce8354Sdrh if( pDef==0 ){ 7944b59ab5eSdrh if( n==1 && nId==6 && sqliteStrNICmp(zId, "typeof", 6)==0 ){ 795c9b84a1fSdrh is_type_of = 1; 796c9b84a1fSdrh }else { 797cce7d176Sdrh no_such_func = 1; 798c9b84a1fSdrh } 7998e0a2f90Sdrh }else{ 8008e0a2f90Sdrh wrong_num_args = 1; 8018e0a2f90Sdrh } 8028e0a2f90Sdrh }else{ 8030bce8354Sdrh is_agg = pDef->xFunc==0; 804cce7d176Sdrh } 8058e0a2f90Sdrh if( is_agg && !allowAgg ){ 8068e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1, 8074b59ab5eSdrh zId, nId, "()", 2, 0); 8088e0a2f90Sdrh pParse->nErr++; 8098e0a2f90Sdrh nErr++; 8108e0a2f90Sdrh is_agg = 0; 8118e0a2f90Sdrh }else if( no_such_func ){ 8124b59ab5eSdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, zId,nId,0); 813cce7d176Sdrh pParse->nErr++; 814cce7d176Sdrh nErr++; 8158e0a2f90Sdrh }else if( wrong_num_args ){ 8168e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, 8174b59ab5eSdrh "wrong number of arguments to function ", -1, zId, nId, "()", 2, 0); 8188e0a2f90Sdrh pParse->nErr++; 8198e0a2f90Sdrh nErr++; 820cce7d176Sdrh } 8212282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 822cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 823cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 8244cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 8254cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 826cce7d176Sdrh } 827c9b84a1fSdrh if( pDef==0 ){ 828c9b84a1fSdrh if( is_type_of ){ 829c9b84a1fSdrh pExpr->op = TK_STRING; 830c9b84a1fSdrh if( sqliteExprType(pExpr->pList->a[0].pExpr)==SQLITE_SO_NUM ){ 831c9b84a1fSdrh pExpr->token.z = "numeric"; 832c9b84a1fSdrh pExpr->token.n = 7; 833c9b84a1fSdrh }else{ 834c9b84a1fSdrh pExpr->token.z = "text"; 835c9b84a1fSdrh pExpr->token.n = 4; 836c9b84a1fSdrh } 837c9b84a1fSdrh } 838c9b84a1fSdrh }else if( pDef->dataType>=0 ){ 839c9b84a1fSdrh if( pDef->dataType<n ){ 840c9b84a1fSdrh pExpr->dataType = 841c9b84a1fSdrh sqliteExprType(pExpr->pList->a[pDef->dataType].pExpr); 842c9b84a1fSdrh }else{ 843c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 844c9b84a1fSdrh } 845c9b84a1fSdrh }else if( pDef->dataType==SQLITE_ARGS ){ 846c9b84a1fSdrh pDef->dataType = SQLITE_SO_TEXT; 847c9b84a1fSdrh for(i=0; i<n; i++){ 848c9b84a1fSdrh if( sqliteExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){ 849c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 850c9b84a1fSdrh break; 851c9b84a1fSdrh } 852c9b84a1fSdrh } 853c9b84a1fSdrh }else if( pDef->dataType==SQLITE_NUMERIC ){ 854c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 855c9b84a1fSdrh }else{ 856c9b84a1fSdrh pExpr->dataType = SQLITE_SO_TEXT; 857c9b84a1fSdrh } 858cce7d176Sdrh } 859cce7d176Sdrh default: { 860cce7d176Sdrh if( pExpr->pLeft ){ 8612282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 862cce7d176Sdrh } 863cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 8642282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 865cce7d176Sdrh } 866fef5208cSdrh if( nErr==0 && pExpr->pList ){ 867fef5208cSdrh int n = pExpr->pList->nExpr; 868fef5208cSdrh int i; 869fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 8702282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 8712282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 872fef5208cSdrh } 873fef5208cSdrh } 874cce7d176Sdrh break; 875cce7d176Sdrh } 876cce7d176Sdrh } 877cce7d176Sdrh return nErr; 878cce7d176Sdrh } 879cce7d176Sdrh 880cce7d176Sdrh /* 881c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the 882c9b84a1fSdrh ** given expression should sort as numeric values or as text. 883c9b84a1fSdrh ** 884c9b84a1fSdrh ** The sqliteExprResolveIds() and sqliteExprCheck() routines must have 885c9b84a1fSdrh ** both been called on the expression before it is passed to this routine. 886c9b84a1fSdrh */ 887c9b84a1fSdrh int sqliteExprType(Expr *p){ 888c9b84a1fSdrh if( p==0 ) return SQLITE_SO_NUM; 889c9b84a1fSdrh while( p ) switch( p->op ){ 890c9b84a1fSdrh case TK_PLUS: 891c9b84a1fSdrh case TK_MINUS: 892c9b84a1fSdrh case TK_STAR: 893c9b84a1fSdrh case TK_SLASH: 894c9b84a1fSdrh case TK_AND: 895c9b84a1fSdrh case TK_OR: 896c9b84a1fSdrh case TK_ISNULL: 897c9b84a1fSdrh case TK_NOTNULL: 898c9b84a1fSdrh case TK_NOT: 899c9b84a1fSdrh case TK_UMINUS: 9004b59ab5eSdrh case TK_UPLUS: 901c9b84a1fSdrh case TK_BITAND: 902c9b84a1fSdrh case TK_BITOR: 903c9b84a1fSdrh case TK_BITNOT: 904c9b84a1fSdrh case TK_LSHIFT: 905c9b84a1fSdrh case TK_RSHIFT: 906c9b84a1fSdrh case TK_REM: 907c9b84a1fSdrh case TK_INTEGER: 908c9b84a1fSdrh case TK_FLOAT: 909c9b84a1fSdrh case TK_IN: 910c9b84a1fSdrh case TK_BETWEEN: 9114b59ab5eSdrh case TK_GLOB: 9124b59ab5eSdrh case TK_LIKE: 913c9b84a1fSdrh return SQLITE_SO_NUM; 914c9b84a1fSdrh 915c9b84a1fSdrh case TK_STRING: 916c9b84a1fSdrh case TK_NULL: 917c9b84a1fSdrh case TK_CONCAT: 91850457896Sdrh case TK_VARIABLE: 919c9b84a1fSdrh return SQLITE_SO_TEXT; 920c9b84a1fSdrh 921c9b84a1fSdrh case TK_LT: 922c9b84a1fSdrh case TK_LE: 923c9b84a1fSdrh case TK_GT: 924c9b84a1fSdrh case TK_GE: 925c9b84a1fSdrh case TK_NE: 926c9b84a1fSdrh case TK_EQ: 927c9b84a1fSdrh if( sqliteExprType(p->pLeft)==SQLITE_SO_NUM ){ 928c9b84a1fSdrh return SQLITE_SO_NUM; 929c9b84a1fSdrh } 930c9b84a1fSdrh p = p->pRight; 931c9b84a1fSdrh break; 932c9b84a1fSdrh 933c9b84a1fSdrh case TK_AS: 934c9b84a1fSdrh p = p->pLeft; 935c9b84a1fSdrh break; 936c9b84a1fSdrh 937c9b84a1fSdrh case TK_COLUMN: 938c9b84a1fSdrh case TK_FUNCTION: 939c9b84a1fSdrh case TK_AGG_FUNCTION: 940c9b84a1fSdrh return p->dataType; 941c9b84a1fSdrh 942c9b84a1fSdrh case TK_SELECT: 943c9b84a1fSdrh assert( p->pSelect ); 944c9b84a1fSdrh assert( p->pSelect->pEList ); 945c9b84a1fSdrh assert( p->pSelect->pEList->nExpr>0 ); 946c9b84a1fSdrh p = p->pSelect->pEList->a[0].pExpr; 947c9b84a1fSdrh break; 948c9b84a1fSdrh 949b1363206Sdrh case TK_CASE: { 950b1363206Sdrh if( p->pRight && sqliteExprType(p->pRight)==SQLITE_SO_NUM ){ 951b1363206Sdrh return SQLITE_SO_NUM; 952b1363206Sdrh } 953b1363206Sdrh if( p->pList ){ 954b1363206Sdrh int i; 955b1363206Sdrh ExprList *pList = p->pList; 956b1363206Sdrh for(i=1; i<pList->nExpr; i+=2){ 957b1363206Sdrh if( sqliteExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){ 958b1363206Sdrh return SQLITE_SO_NUM; 959b1363206Sdrh } 960b1363206Sdrh } 961b1363206Sdrh } 962b1363206Sdrh return SQLITE_SO_TEXT; 963b1363206Sdrh } 964b1363206Sdrh 965c9b84a1fSdrh default: 966c9b84a1fSdrh assert( p->op==TK_ABORT ); /* Can't Happen */ 967c9b84a1fSdrh break; 968c9b84a1fSdrh } 969c9b84a1fSdrh return SQLITE_SO_NUM; 970c9b84a1fSdrh } 971c9b84a1fSdrh 972c9b84a1fSdrh /* 973cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 9741ccde15dSdrh ** expression and leave the result on the top of stack. 975cce7d176Sdrh */ 976cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 977cce7d176Sdrh Vdbe *v = pParse->pVdbe; 978cce7d176Sdrh int op; 979daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 980cce7d176Sdrh switch( pExpr->op ){ 981cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 982cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 983cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 984cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 985cce7d176Sdrh case TK_AND: op = OP_And; break; 986cce7d176Sdrh case TK_OR: op = OP_Or; break; 987cce7d176Sdrh case TK_LT: op = OP_Lt; break; 988cce7d176Sdrh case TK_LE: op = OP_Le; break; 989cce7d176Sdrh case TK_GT: op = OP_Gt; break; 990cce7d176Sdrh case TK_GE: op = OP_Ge; break; 991cce7d176Sdrh case TK_NE: op = OP_Ne; break; 992cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 993cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 994cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 995cce7d176Sdrh case TK_NOT: op = OP_Not; break; 996cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 997bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 998bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 999bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 1000bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 1001bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 1002bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 1003cce7d176Sdrh default: break; 1004cce7d176Sdrh } 1005cce7d176Sdrh switch( pExpr->op ){ 1006967e8b73Sdrh case TK_COLUMN: { 10072282792aSdrh if( pParse->useAgg ){ 100899fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 1009c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 101099fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 1011c4a3c779Sdrh }else{ 101299fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 10132282792aSdrh } 1014cce7d176Sdrh break; 1015cce7d176Sdrh } 1016cce7d176Sdrh case TK_INTEGER: { 1017202b2df7Sdrh if( !sqliteFitsIn32Bits(pExpr->token.z) ){ 1018d9e30930Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1019d9e30930Sdrh }else{ 1020202b2df7Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0); 1021d9e30930Sdrh } 1022e6840900Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 1023e6840900Sdrh break; 1024e6840900Sdrh } 1025e6840900Sdrh case TK_FLOAT: { 10267a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1027a76b5dfcSdrh assert( pExpr->token.z ); 10287a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 1029cce7d176Sdrh break; 1030cce7d176Sdrh } 1031cce7d176Sdrh case TK_STRING: { 103299fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 1033a76b5dfcSdrh assert( pExpr->token.z ); 1034cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 1035cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 1036cce7d176Sdrh break; 1037cce7d176Sdrh } 1038cce7d176Sdrh case TK_NULL: { 103999fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1040cce7d176Sdrh break; 1041cce7d176Sdrh } 104250457896Sdrh case TK_VARIABLE: { 10437c972decSdrh sqliteVdbeAddOp(v, OP_Variable, pExpr->iTable, 0); 104450457896Sdrh break; 104550457896Sdrh } 1046c9b84a1fSdrh case TK_LT: 1047c9b84a1fSdrh case TK_LE: 1048c9b84a1fSdrh case TK_GT: 1049c9b84a1fSdrh case TK_GE: 1050c9b84a1fSdrh case TK_NE: 1051c9b84a1fSdrh case TK_EQ: { 1052491791a8Sdrh if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 1053c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1054c9b84a1fSdrh } 1055c9b84a1fSdrh /* Fall through into the next case */ 1056c9b84a1fSdrh } 1057cce7d176Sdrh case TK_AND: 1058cce7d176Sdrh case TK_OR: 1059cce7d176Sdrh case TK_PLUS: 1060cce7d176Sdrh case TK_STAR: 1061cce7d176Sdrh case TK_MINUS: 1062bf4133cbSdrh case TK_REM: 1063bf4133cbSdrh case TK_BITAND: 1064bf4133cbSdrh case TK_BITOR: 1065c9b84a1fSdrh case TK_SLASH: { 1066cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1067cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 106899fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 1069cce7d176Sdrh break; 1070cce7d176Sdrh } 1071bf4133cbSdrh case TK_LSHIFT: 1072bf4133cbSdrh case TK_RSHIFT: { 1073bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 1074bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 1075bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 1076bf4133cbSdrh break; 1077bf4133cbSdrh } 10780040077dSdrh case TK_CONCAT: { 10790040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 10800040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 108199fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 10820040077dSdrh break; 10830040077dSdrh } 10844b59ab5eSdrh case TK_UPLUS: { 10854b59ab5eSdrh Expr *pLeft = pExpr->pLeft; 10864b59ab5eSdrh if( pLeft && pLeft->op==TK_INTEGER ){ 1087202b2df7Sdrh if( sqliteFitsIn32Bits(pLeft->token.z) ){ 10884b59ab5eSdrh sqliteVdbeAddOp(v, OP_Integer, atoi(pLeft->token.z), 0); 1089202b2df7Sdrh }else{ 1090202b2df7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1091202b2df7Sdrh } 10924b59ab5eSdrh sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n); 10934b59ab5eSdrh }else if( pLeft && pLeft->op==TK_FLOAT ){ 10944b59ab5eSdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 10954b59ab5eSdrh sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n); 10964b59ab5eSdrh }else{ 10974b59ab5eSdrh sqliteExprCode(pParse, pExpr->pLeft); 10984b59ab5eSdrh } 10994b59ab5eSdrh break; 11004b59ab5eSdrh } 1101cce7d176Sdrh case TK_UMINUS: { 11026e142f54Sdrh assert( pExpr->pLeft ); 11037a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 11046e142f54Sdrh Token *p = &pExpr->pLeft->token; 11056e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 11066e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 1107202b2df7Sdrh if( pExpr->pLeft->op==TK_INTEGER && sqliteFitsIn32Bits(z) ){ 1108e6840900Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0); 1109e6840900Sdrh }else{ 111099fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1111e6840900Sdrh } 111299fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 11136e142f54Sdrh sqliteFree(z); 11146e142f54Sdrh break; 11156e142f54Sdrh } 11161ccde15dSdrh /* Fall through into TK_NOT */ 11176e142f54Sdrh } 1118bf4133cbSdrh case TK_BITNOT: 11196e142f54Sdrh case TK_NOT: { 1120cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 112199fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 1122cce7d176Sdrh break; 1123cce7d176Sdrh } 1124cce7d176Sdrh case TK_ISNULL: 1125cce7d176Sdrh case TK_NOTNULL: { 1126cce7d176Sdrh int dest; 112799fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 1128cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1129cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 1130f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 113199fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 1132cce7d176Sdrh break; 1133cce7d176Sdrh } 11342282792aSdrh case TK_AGG_FUNCTION: { 113599fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 11362282792aSdrh break; 11372282792aSdrh } 11384b59ab5eSdrh case TK_GLOB: 11394b59ab5eSdrh case TK_LIKE: 1140cce7d176Sdrh case TK_FUNCTION: { 1141cce7d176Sdrh int i; 1142cce7d176Sdrh ExprList *pList = pExpr->pList; 114389425d5eSdrh int nExpr = pList ? pList->nExpr : 0; 11440bce8354Sdrh FuncDef *pDef; 11454b59ab5eSdrh int nId; 11464b59ab5eSdrh const char *zId; 11474b59ab5eSdrh getFunctionName(pExpr, &zId, &nId); 11484b59ab5eSdrh pDef = sqliteFindFunction(pParse->db, zId, nId, nExpr, 0); 11490bce8354Sdrh assert( pDef!=0 ); 115089425d5eSdrh for(i=0; i<nExpr; i++){ 11518e0a2f90Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 11528e0a2f90Sdrh } 115389425d5eSdrh sqliteVdbeAddOp(v, OP_Function, nExpr, 0); 11540bce8354Sdrh sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER); 11556ec2733bSdrh break; 11566ec2733bSdrh } 115719a775c2Sdrh case TK_SELECT: { 115899fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 115919a775c2Sdrh break; 116019a775c2Sdrh } 1161fef5208cSdrh case TK_IN: { 1162fef5208cSdrh int addr; 116399fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 1164fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 1165fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1166f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4); 1167f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1168f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1169f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, addr+6); 1170fef5208cSdrh if( pExpr->pSelect ){ 1171f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6); 1172fef5208cSdrh }else{ 1173f5905aa7Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6); 1174fef5208cSdrh } 117599fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 1176fef5208cSdrh break; 1177fef5208cSdrh } 1178fef5208cSdrh case TK_BETWEEN: { 1179f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1180f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1181f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1182f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, 0); 1183f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pull, 1, 0); 1184f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1185f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, 0, 0); 1186f5905aa7Sdrh sqliteVdbeAddOp(v, OP_And, 0, 0); 1187fef5208cSdrh break; 1188fef5208cSdrh } 1189a2e00042Sdrh case TK_AS: { 1190a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1191a2e00042Sdrh break; 1192a2e00042Sdrh } 119317a7f8ddSdrh case TK_CASE: { 119417a7f8ddSdrh int expr_end_label; 1195f5905aa7Sdrh int jumpInst; 1196f5905aa7Sdrh int addr; 1197f5905aa7Sdrh int nExpr; 119817a7f8ddSdrh int i; 119917a7f8ddSdrh 120017a7f8ddSdrh assert(pExpr->pList); 120117a7f8ddSdrh assert((pExpr->pList->nExpr % 2) == 0); 120217a7f8ddSdrh assert(pExpr->pList->nExpr > 0); 1203f5905aa7Sdrh nExpr = pExpr->pList->nExpr; 1204f5905aa7Sdrh expr_end_label = sqliteVdbeMakeLabel(v); 120517a7f8ddSdrh if( pExpr->pLeft ){ 120617a7f8ddSdrh sqliteExprCode(pParse, pExpr->pLeft); 1207cce7d176Sdrh } 1208f5905aa7Sdrh for(i=0; i<nExpr; i=i+2){ 120917a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i].pExpr); 121017a7f8ddSdrh if( pExpr->pLeft ){ 1211f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 1, 1); 1212f570f011Sdrh jumpInst = sqliteVdbeAddOp(v, OP_Ne, 1, 0); 1213f570f011Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1214f5905aa7Sdrh }else{ 1215f570f011Sdrh jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 1, 0); 121617a7f8ddSdrh } 121717a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr); 1218f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label); 1219f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1220f5905aa7Sdrh sqliteVdbeChangeP2(v, jumpInst, addr); 122117a7f8ddSdrh } 1222f570f011Sdrh if( pExpr->pLeft ){ 1223f570f011Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1224f570f011Sdrh } 122517a7f8ddSdrh if( pExpr->pRight ){ 122617a7f8ddSdrh sqliteExprCode(pParse, pExpr->pRight); 122717a7f8ddSdrh }else{ 1228f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 122917a7f8ddSdrh } 1230f5905aa7Sdrh sqliteVdbeResolveLabel(v, expr_end_label); 12316f34903eSdanielk1977 break; 12326f34903eSdanielk1977 } 12336f34903eSdanielk1977 case TK_RAISE: { 12346f34903eSdanielk1977 if( !pParse->trigStack ){ 1235da93d238Sdrh sqliteErrorMsg(pParse, 1236da93d238Sdrh "RAISE() may only be used within a trigger-program"); 12376f34903eSdanielk1977 pParse->nErr++; 12386f34903eSdanielk1977 return; 12396f34903eSdanielk1977 } 12406f34903eSdanielk1977 if( pExpr->iColumn == OE_Rollback || 12416f34903eSdanielk1977 pExpr->iColumn == OE_Abort || 12426f34903eSdanielk1977 pExpr->iColumn == OE_Fail ){ 12436f34903eSdanielk1977 char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 12446f34903eSdanielk1977 sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn); 12456f34903eSdanielk1977 sqliteDequote(msg); 12466f34903eSdanielk1977 sqliteVdbeChangeP3(v, -1, msg, 0); 12476f34903eSdanielk1977 sqliteFree(msg); 12486f34903eSdanielk1977 } else { 12496f34903eSdanielk1977 assert( pExpr->iColumn == OE_Ignore ); 12506f34903eSdanielk1977 sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump); 1251483750baSdrh sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", 0); 12526f34903eSdanielk1977 } 125317a7f8ddSdrh } 125417a7f8ddSdrh break; 125517a7f8ddSdrh } 1256cce7d176Sdrh } 1257cce7d176Sdrh 1258cce7d176Sdrh /* 1259cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 1260cce7d176Sdrh ** to the label "dest" if the expression is true but execution 1261cce7d176Sdrh ** continues straight thru if the expression is false. 1262f5905aa7Sdrh ** 1263f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then 1264f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true. 1265cce7d176Sdrh */ 1266f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1267cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1268cce7d176Sdrh int op = 0; 1269daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1270cce7d176Sdrh switch( pExpr->op ){ 1271cce7d176Sdrh case TK_LT: op = OP_Lt; break; 1272cce7d176Sdrh case TK_LE: op = OP_Le; break; 1273cce7d176Sdrh case TK_GT: op = OP_Gt; break; 1274cce7d176Sdrh case TK_GE: op = OP_Ge; break; 1275cce7d176Sdrh case TK_NE: op = OP_Ne; break; 1276cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 1277cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 1278cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 1279cce7d176Sdrh default: break; 1280cce7d176Sdrh } 1281cce7d176Sdrh switch( pExpr->op ){ 1282cce7d176Sdrh case TK_AND: { 1283cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1284f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull); 1285f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1286cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1287cce7d176Sdrh break; 1288cce7d176Sdrh } 1289cce7d176Sdrh case TK_OR: { 1290f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1291f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1292cce7d176Sdrh break; 1293cce7d176Sdrh } 1294cce7d176Sdrh case TK_NOT: { 1295f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1296cce7d176Sdrh break; 1297cce7d176Sdrh } 1298cce7d176Sdrh case TK_LT: 1299cce7d176Sdrh case TK_LE: 1300cce7d176Sdrh case TK_GT: 1301cce7d176Sdrh case TK_GE: 1302cce7d176Sdrh case TK_NE: 13030ac65892Sdrh case TK_EQ: { 1304cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1305cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1306491791a8Sdrh if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 1307c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1308c9b84a1fSdrh } 1309f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1310cce7d176Sdrh break; 1311cce7d176Sdrh } 1312cce7d176Sdrh case TK_ISNULL: 1313cce7d176Sdrh case TK_NOTNULL: { 1314cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1315f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1316cce7d176Sdrh break; 1317cce7d176Sdrh } 1318fef5208cSdrh case TK_IN: { 1319f5905aa7Sdrh int addr; 1320cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1321f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1322f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1323f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1324f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1325fef5208cSdrh if( pExpr->pSelect ){ 132699fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1327fef5208cSdrh }else{ 132899fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1329fef5208cSdrh } 1330fef5208cSdrh break; 1331fef5208cSdrh } 1332fef5208cSdrh case TK_BETWEEN: { 1333f5905aa7Sdrh int addr; 1334fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 133599fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1336fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1337f5905aa7Sdrh addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0); 1338fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1339f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest); 134099fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 1341f5905aa7Sdrh sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v)); 134299fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1343fef5208cSdrh break; 1344fef5208cSdrh } 1345cce7d176Sdrh default: { 1346cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1347f5905aa7Sdrh sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest); 1348cce7d176Sdrh break; 1349cce7d176Sdrh } 1350cce7d176Sdrh } 1351cce7d176Sdrh } 1352cce7d176Sdrh 1353cce7d176Sdrh /* 135466b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1355cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1356cce7d176Sdrh ** continues straight thru if the expression is true. 1357f5905aa7Sdrh ** 1358f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then 1359f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false. 1360cce7d176Sdrh */ 1361f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1362cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1363cce7d176Sdrh int op = 0; 1364daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1365cce7d176Sdrh switch( pExpr->op ){ 1366cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1367cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1368cce7d176Sdrh case TK_GT: op = OP_Le; break; 1369cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1370cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1371cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1372cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1373cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1374cce7d176Sdrh default: break; 1375cce7d176Sdrh } 1376cce7d176Sdrh switch( pExpr->op ){ 1377cce7d176Sdrh case TK_AND: { 1378f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1379f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1380cce7d176Sdrh break; 1381cce7d176Sdrh } 1382cce7d176Sdrh case TK_OR: { 1383cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1384f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull); 1385f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1386cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1387cce7d176Sdrh break; 1388cce7d176Sdrh } 1389cce7d176Sdrh case TK_NOT: { 1390f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1391cce7d176Sdrh break; 1392cce7d176Sdrh } 1393cce7d176Sdrh case TK_LT: 1394cce7d176Sdrh case TK_LE: 1395cce7d176Sdrh case TK_GT: 1396cce7d176Sdrh case TK_GE: 1397cce7d176Sdrh case TK_NE: 1398cce7d176Sdrh case TK_EQ: { 1399491791a8Sdrh if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 14008f619ccdSdrh /* Convert numeric comparison opcodes into text comparison opcodes. 14018f619ccdSdrh ** This step depends on the fact that the text comparision opcodes are 14028f619ccdSdrh ** always 6 greater than their corresponding numeric comparison 14038f619ccdSdrh ** opcodes. 14048f619ccdSdrh */ 14058f619ccdSdrh assert( OP_Eq+6 == OP_StrEq ); 14068f619ccdSdrh op += 6; 1407c9b84a1fSdrh } 1408cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1409cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1410f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1411cce7d176Sdrh break; 1412cce7d176Sdrh } 1413cce7d176Sdrh case TK_ISNULL: 1414cce7d176Sdrh case TK_NOTNULL: { 1415cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1416f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1417cce7d176Sdrh break; 1418cce7d176Sdrh } 1419fef5208cSdrh case TK_IN: { 1420f5905aa7Sdrh int addr; 1421cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1422f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1423f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1424f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1425f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1426fef5208cSdrh if( pExpr->pSelect ){ 142799fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1428fef5208cSdrh }else{ 142999fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1430fef5208cSdrh } 1431fef5208cSdrh break; 1432fef5208cSdrh } 1433fef5208cSdrh case TK_BETWEEN: { 1434fef5208cSdrh int addr; 1435fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 143699fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1437fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1438fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1439f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3); 144099fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 144199fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 1442fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1443f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest); 1444fef5208cSdrh break; 1445fef5208cSdrh } 1446cce7d176Sdrh default: { 1447cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1448461c281aSdrh sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest); 1449cce7d176Sdrh break; 1450cce7d176Sdrh } 1451cce7d176Sdrh } 1452cce7d176Sdrh } 14532282792aSdrh 14542282792aSdrh /* 14552282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 14562282792aSdrh ** if they are identical and return FALSE if they differ in any way. 14572282792aSdrh */ 1458d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 14592282792aSdrh int i; 14602282792aSdrh if( pA==0 ){ 14612282792aSdrh return pB==0; 14622282792aSdrh }else if( pB==0 ){ 14632282792aSdrh return 0; 14642282792aSdrh } 14652282792aSdrh if( pA->op!=pB->op ) return 0; 1466d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1467d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 14682282792aSdrh if( pA->pList ){ 14692282792aSdrh if( pB->pList==0 ) return 0; 14702282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 14712282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1472d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 14732282792aSdrh return 0; 14742282792aSdrh } 14752282792aSdrh } 14762282792aSdrh }else if( pB->pList ){ 14772282792aSdrh return 0; 14782282792aSdrh } 14792282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 14802f2c01e5Sdrh if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0; 14812282792aSdrh if( pA->token.z ){ 14822282792aSdrh if( pB->token.z==0 ) return 0; 14836977fea8Sdrh if( pB->token.n!=pA->token.n ) return 0; 14846977fea8Sdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, pB->token.n)!=0 ) return 0; 14852282792aSdrh } 14862282792aSdrh return 1; 14872282792aSdrh } 14882282792aSdrh 14892282792aSdrh /* 14902282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 14912282792aSdrh */ 14922282792aSdrh static int appendAggInfo(Parse *pParse){ 14932282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 14942282792aSdrh int amt = pParse->nAgg + 8; 14956d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 14966d4abfbeSdrh if( aAgg==0 ){ 14972282792aSdrh return -1; 14982282792aSdrh } 14996d4abfbeSdrh pParse->aAgg = aAgg; 15002282792aSdrh } 15012282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 15022282792aSdrh return pParse->nAgg++; 15032282792aSdrh } 15042282792aSdrh 15052282792aSdrh /* 15062282792aSdrh ** Analyze the given expression looking for aggregate functions and 15072282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 15082282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 15092282792aSdrh ** 15102282792aSdrh ** This routine should only be called after the expression has been 15112282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 15122282792aSdrh ** 15132282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 15142282792aSdrh ** the number of errors. 15152282792aSdrh */ 15162282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 15172282792aSdrh int i; 15182282792aSdrh AggExpr *aAgg; 15192282792aSdrh int nErr = 0; 15202282792aSdrh 15212282792aSdrh if( pExpr==0 ) return 0; 15222282792aSdrh switch( pExpr->op ){ 1523967e8b73Sdrh case TK_COLUMN: { 15242282792aSdrh aAgg = pParse->aAgg; 15252282792aSdrh for(i=0; i<pParse->nAgg; i++){ 15262282792aSdrh if( aAgg[i].isAgg ) continue; 15272282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1528967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 15292282792aSdrh break; 15302282792aSdrh } 15312282792aSdrh } 15322282792aSdrh if( i>=pParse->nAgg ){ 15332282792aSdrh i = appendAggInfo(pParse); 15342282792aSdrh if( i<0 ) return 1; 15352282792aSdrh pParse->aAgg[i].isAgg = 0; 15362282792aSdrh pParse->aAgg[i].pExpr = pExpr; 15372282792aSdrh } 1538aaf88729Sdrh pExpr->iAgg = i; 15392282792aSdrh break; 15402282792aSdrh } 15412282792aSdrh case TK_AGG_FUNCTION: { 15422282792aSdrh aAgg = pParse->aAgg; 15432282792aSdrh for(i=0; i<pParse->nAgg; i++){ 15442282792aSdrh if( !aAgg[i].isAgg ) continue; 1545d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 15462282792aSdrh break; 15472282792aSdrh } 15482282792aSdrh } 15492282792aSdrh if( i>=pParse->nAgg ){ 15502282792aSdrh i = appendAggInfo(pParse); 15512282792aSdrh if( i<0 ) return 1; 15522282792aSdrh pParse->aAgg[i].isAgg = 1; 15532282792aSdrh pParse->aAgg[i].pExpr = pExpr; 15540bce8354Sdrh pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db, 15556977fea8Sdrh pExpr->token.z, pExpr->token.n, 1556f55f25f0Sdrh pExpr->pList ? pExpr->pList->nExpr : 0, 0); 15572282792aSdrh } 15582282792aSdrh pExpr->iAgg = i; 15592282792aSdrh break; 15602282792aSdrh } 15612282792aSdrh default: { 15622282792aSdrh if( pExpr->pLeft ){ 15632282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 15642282792aSdrh } 15652282792aSdrh if( nErr==0 && pExpr->pRight ){ 15662282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 15672282792aSdrh } 15682282792aSdrh if( nErr==0 && pExpr->pList ){ 15692282792aSdrh int n = pExpr->pList->nExpr; 15702282792aSdrh int i; 15712282792aSdrh for(i=0; nErr==0 && i<n; i++){ 15722282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 15732282792aSdrh } 15742282792aSdrh } 15752282792aSdrh break; 15762282792aSdrh } 15772282792aSdrh } 15782282792aSdrh return nErr; 15792282792aSdrh } 15808e0a2f90Sdrh 15818e0a2f90Sdrh /* 15828e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 15830bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that 15848e0a2f90Sdrh ** function, or return NULL if the function does not exist. 15858e0a2f90Sdrh ** 15860bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef 15878e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 15888e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 15898e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 15908e0a2f90Sdrh ** any number of arguments will be returned. 15918e0a2f90Sdrh ** 15928e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 15938e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 15948e0a2f90Sdrh ** or xStep is non-zero. 15958e0a2f90Sdrh */ 15960bce8354Sdrh FuncDef *sqliteFindFunction( 15978e0a2f90Sdrh sqlite *db, /* An open database */ 15988e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 15998e0a2f90Sdrh int nName, /* Number of characters in the name */ 16008e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 16018e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 16028e0a2f90Sdrh ){ 16030bce8354Sdrh FuncDef *pFirst, *p, *pMaybe; 16040bce8354Sdrh pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName); 16051350b030Sdrh if( p && !createFlag && nArg<0 ){ 16068e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 16078e0a2f90Sdrh return p; 16088e0a2f90Sdrh } 16098e0a2f90Sdrh pMaybe = 0; 16108e0a2f90Sdrh while( p && p->nArg!=nArg ){ 16118e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 16128e0a2f90Sdrh p = p->pNext; 16138e0a2f90Sdrh } 16148e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 16158e0a2f90Sdrh return 0; 16168e0a2f90Sdrh } 16178e0a2f90Sdrh if( p==0 && pMaybe ){ 16188e0a2f90Sdrh assert( createFlag==0 ); 16198e0a2f90Sdrh return pMaybe; 16208e0a2f90Sdrh } 162189425d5eSdrh if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){ 16228e0a2f90Sdrh p->nArg = nArg; 16238e0a2f90Sdrh p->pNext = pFirst; 1624c9b84a1fSdrh p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC; 16250bce8354Sdrh sqliteHashInsert(&db->aFunc, zName, nName, (void*)p); 16268e0a2f90Sdrh } 16278e0a2f90Sdrh return p; 16288e0a2f90Sdrh } 1629