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*4adee20fSdanielk1977 ** $Id: expr.c,v 1.115 2004/05/08 08:23:24 danielk1977 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 */ 25*4adee20fSdanielk1977 Expr *sqlite3Expr(int op, Expr *pLeft, Expr *pRight, Token *pToken){ 26a76b5dfcSdrh Expr *pNew; 27a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 28a76b5dfcSdrh if( pNew==0 ){ 294efc4754Sdrh /* 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{ 404efc4754Sdrh assert( pNew->token.dyn==0 ); 414efc4754Sdrh assert( pNew->token.z==0 ); 424efc4754Sdrh assert( pNew->token.n==0 ); 436977fea8Sdrh if( pLeft && pRight ){ 44*4adee20fSdanielk1977 sqlite3ExprSpan(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 */ 56*4adee20fSdanielk1977 void sqlite3ExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ 574efc4754Sdrh assert( pRight!=0 ); 584efc4754Sdrh assert( pLeft!=0 ); 594efc4754Sdrh /* Note: pExpr might be NULL due to a prior malloc failure */ 604efc4754Sdrh 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 */ 74*4adee20fSdanielk1977 Expr *sqlite3ExprFunction(ExprList *pList, Token *pToken){ 75a76b5dfcSdrh Expr *pNew; 76a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 77a76b5dfcSdrh if( pNew==0 ){ 78*4adee20fSdanielk1977 /* sqlite3ExprListDelete(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 */ 96*4adee20fSdanielk1977 void sqlite3ExprDelete(Expr *p){ 97a2e00042Sdrh if( p==0 ) return; 984efc4754Sdrh if( p->span.dyn ) sqliteFree((char*)p->span.z); 994efc4754Sdrh if( p->token.dyn ) sqliteFree((char*)p->token.z); 100*4adee20fSdanielk1977 sqlite3ExprDelete(p->pLeft); 101*4adee20fSdanielk1977 sqlite3ExprDelete(p->pRight); 102*4adee20fSdanielk1977 sqlite3ExprListDelete(p->pList); 103*4adee20fSdanielk1977 sqlite3SelectDelete(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 ** 114*4adee20fSdanielk1977 ** The expression list, ID, and source lists return by sqlite3ExprListDup(), 115*4adee20fSdanielk1977 ** sqlite3IdListDup(), and sqlite3SrcListDup() 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 */ 120*4adee20fSdanielk1977 Expr *sqlite3ExprDup(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{ 1304efc4754Sdrh assert( pNew->token.z==0 ); 1314b59ab5eSdrh } 1326977fea8Sdrh pNew->span.z = 0; 133*4adee20fSdanielk1977 pNew->pLeft = sqlite3ExprDup(p->pLeft); 134*4adee20fSdanielk1977 pNew->pRight = sqlite3ExprDup(p->pRight); 135*4adee20fSdanielk1977 pNew->pList = sqlite3ExprListDup(p->pList); 136*4adee20fSdanielk1977 pNew->pSelect = sqlite3SelectDup(p->pSelect); 137ff78bd2fSdrh return pNew; 138ff78bd2fSdrh } 139*4adee20fSdanielk1977 void sqlite3TokenCopy(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 } 149*4adee20fSdanielk1977 ExprList *sqlite3ExprListDup(ExprList *p){ 150ff78bd2fSdrh ExprList *pNew; 1513e7bc9caSdrh struct ExprList_item *pItem; 152ff78bd2fSdrh int i; 153ff78bd2fSdrh if( p==0 ) return 0; 154ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 155ff78bd2fSdrh if( pNew==0 ) return 0; 1564305d103Sdrh pNew->nExpr = pNew->nAlloc = p->nExpr; 1573e7bc9caSdrh pNew->a = pItem = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); 1581bdd9b57Sdrh if( pItem==0 ) return 0; /* Leaks memory after a malloc failure */ 1591bdd9b57Sdrh for(i=0; i<p->nExpr; i++, pItem++){ 1604b59ab5eSdrh Expr *pNewExpr, *pOldExpr; 161*4adee20fSdanielk1977 pItem->pExpr = pNewExpr = sqlite3ExprDup(pOldExpr = p->a[i].pExpr); 1626977fea8Sdrh if( pOldExpr->span.z!=0 && pNewExpr ){ 1636977fea8Sdrh /* Always make a copy of the span for top-level expressions in the 1644b59ab5eSdrh ** expression list. The logic in SELECT processing that determines 1654b59ab5eSdrh ** the names of columns in the result set needs this information */ 166*4adee20fSdanielk1977 sqlite3TokenCopy(&pNewExpr->span, &pOldExpr->span); 1674b59ab5eSdrh } 1681f3e905cSdrh assert( pNewExpr==0 || pNewExpr->span.z!=0 1691f3e905cSdrh || pOldExpr->span.z==0 || sqlite_malloc_failed ); 1703e7bc9caSdrh pItem->zName = sqliteStrDup(p->a[i].zName); 1713e7bc9caSdrh pItem->sortOrder = p->a[i].sortOrder; 1723e7bc9caSdrh pItem->isAgg = p->a[i].isAgg; 1733e7bc9caSdrh pItem->done = 0; 174ff78bd2fSdrh } 175ff78bd2fSdrh return pNew; 176ff78bd2fSdrh } 177*4adee20fSdanielk1977 SrcList *sqlite3SrcListDup(SrcList *p){ 178ad3cab52Sdrh SrcList *pNew; 179ad3cab52Sdrh int i; 180113088ecSdrh int nByte; 181ad3cab52Sdrh if( p==0 ) return 0; 182113088ecSdrh nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); 1834efc4754Sdrh pNew = sqliteMallocRaw( nByte ); 184ad3cab52Sdrh if( pNew==0 ) return 0; 1854305d103Sdrh pNew->nSrc = pNew->nAlloc = p->nSrc; 186ad3cab52Sdrh for(i=0; i<p->nSrc; i++){ 1874efc4754Sdrh struct SrcList_item *pNewItem = &pNew->a[i]; 1884efc4754Sdrh struct SrcList_item *pOldItem = &p->a[i]; 1894efc4754Sdrh pNewItem->zDatabase = sqliteStrDup(pOldItem->zDatabase); 1904efc4754Sdrh pNewItem->zName = sqliteStrDup(pOldItem->zName); 1914efc4754Sdrh pNewItem->zAlias = sqliteStrDup(pOldItem->zAlias); 1924efc4754Sdrh pNewItem->jointype = pOldItem->jointype; 1934efc4754Sdrh pNewItem->iCursor = pOldItem->iCursor; 1944efc4754Sdrh pNewItem->pTab = 0; 195*4adee20fSdanielk1977 pNewItem->pSelect = sqlite3SelectDup(pOldItem->pSelect); 196*4adee20fSdanielk1977 pNewItem->pOn = sqlite3ExprDup(pOldItem->pOn); 197*4adee20fSdanielk1977 pNewItem->pUsing = sqlite3IdListDup(pOldItem->pUsing); 198ad3cab52Sdrh } 199ad3cab52Sdrh return pNew; 200ad3cab52Sdrh } 201*4adee20fSdanielk1977 IdList *sqlite3IdListDup(IdList *p){ 202ff78bd2fSdrh IdList *pNew; 203ff78bd2fSdrh int i; 204ff78bd2fSdrh if( p==0 ) return 0; 2054efc4754Sdrh pNew = sqliteMallocRaw( sizeof(*pNew) ); 206ff78bd2fSdrh if( pNew==0 ) return 0; 2074305d103Sdrh pNew->nId = pNew->nAlloc = p->nId; 2084efc4754Sdrh pNew->a = sqliteMallocRaw( p->nId*sizeof(p->a[0]) ); 209e4697f5eSdrh if( pNew->a==0 ) return 0; 210ff78bd2fSdrh for(i=0; i<p->nId; i++){ 2114efc4754Sdrh struct IdList_item *pNewItem = &pNew->a[i]; 2124efc4754Sdrh struct IdList_item *pOldItem = &p->a[i]; 2134efc4754Sdrh pNewItem->zName = sqliteStrDup(pOldItem->zName); 2144efc4754Sdrh pNewItem->idx = pOldItem->idx; 215ff78bd2fSdrh } 216ff78bd2fSdrh return pNew; 217ff78bd2fSdrh } 218*4adee20fSdanielk1977 Select *sqlite3SelectDup(Select *p){ 219ff78bd2fSdrh Select *pNew; 220ff78bd2fSdrh if( p==0 ) return 0; 2214efc4754Sdrh pNew = sqliteMallocRaw( sizeof(*p) ); 222ff78bd2fSdrh if( pNew==0 ) return 0; 223ff78bd2fSdrh pNew->isDistinct = p->isDistinct; 224*4adee20fSdanielk1977 pNew->pEList = sqlite3ExprListDup(p->pEList); 225*4adee20fSdanielk1977 pNew->pSrc = sqlite3SrcListDup(p->pSrc); 226*4adee20fSdanielk1977 pNew->pWhere = sqlite3ExprDup(p->pWhere); 227*4adee20fSdanielk1977 pNew->pGroupBy = sqlite3ExprListDup(p->pGroupBy); 228*4adee20fSdanielk1977 pNew->pHaving = sqlite3ExprDup(p->pHaving); 229*4adee20fSdanielk1977 pNew->pOrderBy = sqlite3ExprListDup(p->pOrderBy); 230ff78bd2fSdrh pNew->op = p->op; 231*4adee20fSdanielk1977 pNew->pPrior = sqlite3SelectDup(p->pPrior); 232ff78bd2fSdrh pNew->nLimit = p->nLimit; 233ff78bd2fSdrh pNew->nOffset = p->nOffset; 234ff78bd2fSdrh pNew->zSelect = 0; 2357b58daeaSdrh pNew->iLimit = -1; 2367b58daeaSdrh pNew->iOffset = -1; 237ff78bd2fSdrh return pNew; 238ff78bd2fSdrh } 239ff78bd2fSdrh 240ff78bd2fSdrh 241ff78bd2fSdrh /* 242a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 243a76b5dfcSdrh ** initially NULL, then create a new expression list. 244a76b5dfcSdrh */ 245*4adee20fSdanielk1977 ExprList *sqlite3ExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 246a76b5dfcSdrh if( pList==0 ){ 247a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 248a76b5dfcSdrh if( pList==0 ){ 249*4adee20fSdanielk1977 /* sqlite3ExprDelete(pExpr); // Leak memory if malloc fails */ 250a76b5dfcSdrh return 0; 251a76b5dfcSdrh } 2524efc4754Sdrh assert( pList->nAlloc==0 ); 253a76b5dfcSdrh } 2544305d103Sdrh if( pList->nAlloc<=pList->nExpr ){ 2554305d103Sdrh pList->nAlloc = pList->nAlloc*2 + 4; 2564efc4754Sdrh pList->a = sqliteRealloc(pList->a, pList->nAlloc*sizeof(pList->a[0])); 2574efc4754Sdrh if( pList->a==0 ){ 258*4adee20fSdanielk1977 /* sqlite3ExprDelete(pExpr); // Leak memory if malloc fails */ 2594efc4754Sdrh pList->nExpr = pList->nAlloc = 0; 260a76b5dfcSdrh return pList; 261a76b5dfcSdrh } 262a76b5dfcSdrh } 2634efc4754Sdrh assert( pList->a!=0 ); 2644efc4754Sdrh if( pExpr || pName ){ 2654efc4754Sdrh struct ExprList_item *pItem = &pList->a[pList->nExpr++]; 2664efc4754Sdrh memset(pItem, 0, sizeof(*pItem)); 2674efc4754Sdrh pItem->pExpr = pExpr; 268a76b5dfcSdrh if( pName ){ 269*4adee20fSdanielk1977 sqlite3SetNString(&pItem->zName, pName->z, pName->n, 0); 270*4adee20fSdanielk1977 sqlite3Dequote(pItem->zName); 271a76b5dfcSdrh } 272a76b5dfcSdrh } 273a76b5dfcSdrh return pList; 274a76b5dfcSdrh } 275a76b5dfcSdrh 276a76b5dfcSdrh /* 277a76b5dfcSdrh ** Delete an entire expression list. 278a76b5dfcSdrh */ 279*4adee20fSdanielk1977 void sqlite3ExprListDelete(ExprList *pList){ 280a76b5dfcSdrh int i; 281a76b5dfcSdrh if( pList==0 ) return; 2821bdd9b57Sdrh assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) ); 2831bdd9b57Sdrh assert( pList->nExpr<=pList->nAlloc ); 284a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 285*4adee20fSdanielk1977 sqlite3ExprDelete(pList->a[i].pExpr); 286a76b5dfcSdrh sqliteFree(pList->a[i].zName); 287a76b5dfcSdrh } 288a76b5dfcSdrh sqliteFree(pList->a); 289a76b5dfcSdrh sqliteFree(pList); 290a76b5dfcSdrh } 291a76b5dfcSdrh 292a76b5dfcSdrh /* 293fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 294fef5208cSdrh ** and 0 if it involves variables. 2952398937bSdrh ** 2962398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc") 2972398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is 2982398937bSdrh ** a constant. 299fef5208cSdrh */ 300*4adee20fSdanielk1977 int sqlite3ExprIsConstant(Expr *p){ 301fef5208cSdrh switch( p->op ){ 302fef5208cSdrh case TK_ID: 303967e8b73Sdrh case TK_COLUMN: 304fef5208cSdrh case TK_DOT: 3057bdc0c1dSdrh case TK_FUNCTION: 306fef5208cSdrh return 0; 3077bdc0c1dSdrh case TK_NULL: 3082398937bSdrh case TK_STRING: 3099208643dSdrh case TK_INTEGER: 3109208643dSdrh case TK_FLOAT: 31150457896Sdrh case TK_VARIABLE: 3129208643dSdrh return 1; 313fef5208cSdrh default: { 314*4adee20fSdanielk1977 if( p->pLeft && !sqlite3ExprIsConstant(p->pLeft) ) return 0; 315*4adee20fSdanielk1977 if( p->pRight && !sqlite3ExprIsConstant(p->pRight) ) return 0; 316fef5208cSdrh if( p->pList ){ 317fef5208cSdrh int i; 318fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 319*4adee20fSdanielk1977 if( !sqlite3ExprIsConstant(p->pList->a[i].pExpr) ) return 0; 320fef5208cSdrh } 321fef5208cSdrh } 3229208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 323fef5208cSdrh } 324fef5208cSdrh } 3259208643dSdrh return 0; 326fef5208cSdrh } 327fef5208cSdrh 328fef5208cSdrh /* 329202b2df7Sdrh ** If the given expression codes a constant integer that is small enough 330202b2df7Sdrh ** to fit in a 32-bit integer, return 1 and put the value of the integer 331202b2df7Sdrh ** in *pValue. If the expression is not an integer or if it is too big 332202b2df7Sdrh ** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. 333e4de1febSdrh */ 334*4adee20fSdanielk1977 int sqlite3ExprIsInteger(Expr *p, int *pValue){ 335e4de1febSdrh switch( p->op ){ 336e4de1febSdrh case TK_INTEGER: { 337*4adee20fSdanielk1977 if( sqlite3FitsIn32Bits(p->token.z) ){ 338e4de1febSdrh *pValue = atoi(p->token.z); 339e4de1febSdrh return 1; 340e4de1febSdrh } 341202b2df7Sdrh break; 342202b2df7Sdrh } 343e4de1febSdrh case TK_STRING: { 344bd790ee3Sdrh const char *z = p->token.z; 345e4de1febSdrh int n = p->token.n; 346bd790ee3Sdrh if( n>0 && z[0]=='-' ){ z++; n--; } 347e4de1febSdrh while( n>0 && *z && isdigit(*z) ){ z++; n--; } 348*4adee20fSdanielk1977 if( n==0 && sqlite3FitsIn32Bits(p->token.z) ){ 349e4de1febSdrh *pValue = atoi(p->token.z); 350e4de1febSdrh return 1; 351e4de1febSdrh } 352e4de1febSdrh break; 353e4de1febSdrh } 3544b59ab5eSdrh case TK_UPLUS: { 355*4adee20fSdanielk1977 return sqlite3ExprIsInteger(p->pLeft, pValue); 3564b59ab5eSdrh } 357e4de1febSdrh case TK_UMINUS: { 358e4de1febSdrh int v; 359*4adee20fSdanielk1977 if( sqlite3ExprIsInteger(p->pLeft, &v) ){ 360e4de1febSdrh *pValue = -v; 361e4de1febSdrh return 1; 362e4de1febSdrh } 363e4de1febSdrh break; 364e4de1febSdrh } 365e4de1febSdrh default: break; 366e4de1febSdrh } 367e4de1febSdrh return 0; 368e4de1febSdrh } 369e4de1febSdrh 370e4de1febSdrh /* 371c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 372c4a3c779Sdrh */ 373*4adee20fSdanielk1977 int sqlite3IsRowid(const char *z){ 374*4adee20fSdanielk1977 if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1; 375*4adee20fSdanielk1977 if( sqlite3StrICmp(z, "ROWID")==0 ) return 1; 376*4adee20fSdanielk1977 if( sqlite3StrICmp(z, "OID")==0 ) return 1; 377c4a3c779Sdrh return 0; 378c4a3c779Sdrh } 379c4a3c779Sdrh 380c4a3c779Sdrh /* 3818141f61eSdrh ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up 3828141f61eSdrh ** that name in the set of source tables in pSrcList and make the pExpr 3838141f61eSdrh ** expression node refer back to that source column. The following changes 3848141f61eSdrh ** are made to pExpr: 3858141f61eSdrh ** 3868141f61eSdrh ** pExpr->iDb Set the index in db->aDb[] of the database holding 3878141f61eSdrh ** the table. 3888141f61eSdrh ** pExpr->iTable Set to the cursor number for the table obtained 3898141f61eSdrh ** from pSrcList. 3908141f61eSdrh ** pExpr->iColumn Set to the column number within the table. 3918141f61eSdrh ** pExpr->dataType Set to the appropriate data type for the column. 3928141f61eSdrh ** pExpr->op Set to TK_COLUMN. 3938141f61eSdrh ** pExpr->pLeft Any expression this points to is deleted 3948141f61eSdrh ** pExpr->pRight Any expression this points to is deleted. 3958141f61eSdrh ** 3968141f61eSdrh ** The pDbToken is the name of the database (the "X"). This value may be 3978141f61eSdrh ** NULL meaning that name is of the form Y.Z or Z. Any available database 3988141f61eSdrh ** can be used. The pTableToken is the name of the table (the "Y"). This 3998141f61eSdrh ** value can be NULL if pDbToken is also NULL. If pTableToken is NULL it 4008141f61eSdrh ** means that the form of the name is Z and that columns from any table 4018141f61eSdrh ** can be used. 4028141f61eSdrh ** 4038141f61eSdrh ** If the name cannot be resolved unambiguously, leave an error message 4048141f61eSdrh ** in pParse and return non-zero. Return zero on success. 4058141f61eSdrh */ 4068141f61eSdrh static int lookupName( 4078141f61eSdrh Parse *pParse, /* The parsing context */ 4088141f61eSdrh Token *pDbToken, /* Name of the database containing table, or NULL */ 4098141f61eSdrh Token *pTableToken, /* Name of table containing column, or NULL */ 4108141f61eSdrh Token *pColumnToken, /* Name of the column. */ 4118141f61eSdrh SrcList *pSrcList, /* List of tables used to resolve column names */ 4128141f61eSdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 4138141f61eSdrh Expr *pExpr /* Make this EXPR node point to the selected column */ 4148141f61eSdrh ){ 4158141f61eSdrh char *zDb = 0; /* Name of the database. The "X" in X.Y.Z */ 4168141f61eSdrh char *zTab = 0; /* Name of the table. The "Y" in X.Y.Z or Y.Z */ 4178141f61eSdrh char *zCol = 0; /* Name of the column. The "Z" */ 4188141f61eSdrh int i, j; /* Loop counters */ 4198141f61eSdrh int cnt = 0; /* Number of matching column names */ 4208141f61eSdrh int cntTab = 0; /* Number of matching table names */ 4217e26d750Sdrh sqlite *db = pParse->db; /* The database */ 4228141f61eSdrh 4238141f61eSdrh assert( pColumnToken && pColumnToken->z ); /* The Z in X.Y.Z cannot be NULL */ 4248141f61eSdrh if( pDbToken && pDbToken->z ){ 4258141f61eSdrh zDb = sqliteStrNDup(pDbToken->z, pDbToken->n); 426*4adee20fSdanielk1977 sqlite3Dequote(zDb); 4278141f61eSdrh }else{ 4288141f61eSdrh zDb = 0; 4298141f61eSdrh } 4308141f61eSdrh if( pTableToken && pTableToken->z ){ 4318141f61eSdrh zTab = sqliteStrNDup(pTableToken->z, pTableToken->n); 432*4adee20fSdanielk1977 sqlite3Dequote(zTab); 4338141f61eSdrh }else{ 4348141f61eSdrh assert( zDb==0 ); 4358141f61eSdrh zTab = 0; 4368141f61eSdrh } 4378141f61eSdrh zCol = sqliteStrNDup(pColumnToken->z, pColumnToken->n); 438*4adee20fSdanielk1977 sqlite3Dequote(zCol); 4398141f61eSdrh if( sqlite_malloc_failed ){ 4408141f61eSdrh return 1; /* Leak memory (zDb and zTab) if malloc fails */ 4418141f61eSdrh } 4428141f61eSdrh assert( zTab==0 || pEList==0 ); 4438141f61eSdrh 4448141f61eSdrh pExpr->iTable = -1; 4458141f61eSdrh for(i=0; i<pSrcList->nSrc; i++){ 4468141f61eSdrh struct SrcList_item *pItem = &pSrcList->a[i]; 4478141f61eSdrh Table *pTab = pItem->pTab; 4488141f61eSdrh Column *pCol; 4498141f61eSdrh 4508141f61eSdrh if( pTab==0 ) continue; 4518141f61eSdrh assert( pTab->nCol>0 ); 4528141f61eSdrh if( zTab ){ 4538141f61eSdrh if( pItem->zAlias ){ 4548141f61eSdrh char *zTabName = pItem->zAlias; 455*4adee20fSdanielk1977 if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue; 4568141f61eSdrh }else{ 4578141f61eSdrh char *zTabName = pTab->zName; 458*4adee20fSdanielk1977 if( zTabName==0 || sqlite3StrICmp(zTabName, zTab)!=0 ) continue; 459*4adee20fSdanielk1977 if( zDb!=0 && sqlite3StrICmp(db->aDb[pTab->iDb].zName, zDb)!=0 ){ 4608141f61eSdrh continue; 4618141f61eSdrh } 4628141f61eSdrh } 4638141f61eSdrh } 4648141f61eSdrh if( 0==(cntTab++) ){ 4658141f61eSdrh pExpr->iTable = pItem->iCursor; 4668141f61eSdrh pExpr->iDb = pTab->iDb; 4678141f61eSdrh } 4688141f61eSdrh for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){ 469*4adee20fSdanielk1977 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ 4708141f61eSdrh cnt++; 4718141f61eSdrh pExpr->iTable = pItem->iCursor; 4728141f61eSdrh pExpr->iDb = pTab->iDb; 4738141f61eSdrh /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ 4748141f61eSdrh pExpr->iColumn = j==pTab->iPKey ? -1 : j; 4758141f61eSdrh pExpr->dataType = pCol->sortOrder & SQLITE_SO_TYPEMASK; 4768141f61eSdrh break; 4778141f61eSdrh } 4788141f61eSdrh } 4798141f61eSdrh } 4808141f61eSdrh 4818141f61eSdrh /* If we have not already resolved the name, then maybe 4828141f61eSdrh ** it is a new.* or old.* trigger argument reference 4838141f61eSdrh */ 4848141f61eSdrh if( zDb==0 && zTab!=0 && cnt==0 && pParse->trigStack!=0 ){ 4858141f61eSdrh TriggerStack *pTriggerStack = pParse->trigStack; 4868141f61eSdrh Table *pTab = 0; 487*4adee20fSdanielk1977 if( pTriggerStack->newIdx != -1 && sqlite3StrICmp("new", zTab) == 0 ){ 4888141f61eSdrh pExpr->iTable = pTriggerStack->newIdx; 4898141f61eSdrh assert( pTriggerStack->pTab ); 4908141f61eSdrh pTab = pTriggerStack->pTab; 491*4adee20fSdanielk1977 }else if( pTriggerStack->oldIdx != -1 && sqlite3StrICmp("old", zTab) == 0 ){ 4928141f61eSdrh pExpr->iTable = pTriggerStack->oldIdx; 4938141f61eSdrh assert( pTriggerStack->pTab ); 4948141f61eSdrh pTab = pTriggerStack->pTab; 4958141f61eSdrh } 4968141f61eSdrh 4978141f61eSdrh if( pTab ){ 4988141f61eSdrh int j; 4998141f61eSdrh Column *pCol = pTab->aCol; 5008141f61eSdrh 5018141f61eSdrh pExpr->iDb = pTab->iDb; 5028141f61eSdrh cntTab++; 5038141f61eSdrh for(j=0; j < pTab->nCol; j++, pCol++) { 504*4adee20fSdanielk1977 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ 5058141f61eSdrh cnt++; 5068141f61eSdrh pExpr->iColumn = j==pTab->iPKey ? -1 : j; 5078141f61eSdrh pExpr->dataType = pCol->sortOrder & SQLITE_SO_TYPEMASK; 5088141f61eSdrh break; 5098141f61eSdrh } 5108141f61eSdrh } 5118141f61eSdrh } 5128141f61eSdrh } 5138141f61eSdrh 5148141f61eSdrh /* 5158141f61eSdrh ** Perhaps the name is a reference to the ROWID 5168141f61eSdrh */ 517*4adee20fSdanielk1977 if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){ 5188141f61eSdrh cnt = 1; 5198141f61eSdrh pExpr->iColumn = -1; 5208141f61eSdrh pExpr->dataType = SQLITE_SO_NUM; 5218141f61eSdrh } 5228141f61eSdrh 5238141f61eSdrh /* 5248141f61eSdrh ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z 5258141f61eSdrh ** might refer to an result-set alias. This happens, for example, when 5268141f61eSdrh ** we are resolving names in the WHERE clause of the following command: 5278141f61eSdrh ** 5288141f61eSdrh ** SELECT a+b AS x FROM table WHERE x<10; 5298141f61eSdrh ** 5308141f61eSdrh ** In cases like this, replace pExpr with a copy of the expression that 5318141f61eSdrh ** forms the result set entry ("a+b" in the example) and return immediately. 5328141f61eSdrh ** Note that the expression in the result set should have already been 5338141f61eSdrh ** resolved by the time the WHERE clause is resolved. 5348141f61eSdrh */ 5358141f61eSdrh if( cnt==0 && pEList!=0 ){ 5368141f61eSdrh for(j=0; j<pEList->nExpr; j++){ 5378141f61eSdrh char *zAs = pEList->a[j].zName; 538*4adee20fSdanielk1977 if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ 5398141f61eSdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 5408141f61eSdrh pExpr->op = TK_AS; 5418141f61eSdrh pExpr->iColumn = j; 542*4adee20fSdanielk1977 pExpr->pLeft = sqlite3ExprDup(pEList->a[j].pExpr); 5438141f61eSdrh sqliteFree(zCol); 5448141f61eSdrh assert( zTab==0 && zDb==0 ); 5458141f61eSdrh return 0; 5468141f61eSdrh } 5478141f61eSdrh } 5488141f61eSdrh } 5498141f61eSdrh 5508141f61eSdrh /* 5518141f61eSdrh ** If X and Y are NULL (in other words if only the column name Z is 5528141f61eSdrh ** supplied) and the value of Z is enclosed in double-quotes, then 5538141f61eSdrh ** Z is a string literal if it doesn't match any column names. In that 5548141f61eSdrh ** case, we need to return right away and not make any changes to 5558141f61eSdrh ** pExpr. 5568141f61eSdrh */ 5578141f61eSdrh if( cnt==0 && zTab==0 && pColumnToken->z[0]=='"' ){ 5588141f61eSdrh sqliteFree(zCol); 5598141f61eSdrh return 0; 5608141f61eSdrh } 5618141f61eSdrh 5628141f61eSdrh /* 5638141f61eSdrh ** cnt==0 means there was not match. cnt>1 means there were two or 5648141f61eSdrh ** more matches. Either way, we have an error. 5658141f61eSdrh */ 5668141f61eSdrh if( cnt!=1 ){ 5678141f61eSdrh char *z = 0; 5688141f61eSdrh char *zErr; 5698141f61eSdrh zErr = cnt==0 ? "no such column: %s" : "ambiguous column name: %s"; 5708141f61eSdrh if( zDb ){ 571*4adee20fSdanielk1977 sqlite3SetString(&z, zDb, ".", zTab, ".", zCol, 0); 5728141f61eSdrh }else if( zTab ){ 573*4adee20fSdanielk1977 sqlite3SetString(&z, zTab, ".", zCol, 0); 5748141f61eSdrh }else{ 5758141f61eSdrh z = sqliteStrDup(zCol); 5768141f61eSdrh } 577*4adee20fSdanielk1977 sqlite3ErrorMsg(pParse, zErr, z); 5788141f61eSdrh sqliteFree(z); 5798141f61eSdrh } 5808141f61eSdrh 5818141f61eSdrh /* Clean up and return 5828141f61eSdrh */ 5838141f61eSdrh sqliteFree(zDb); 5848141f61eSdrh sqliteFree(zTab); 5858141f61eSdrh sqliteFree(zCol); 586*4adee20fSdanielk1977 sqlite3ExprDelete(pExpr->pLeft); 5878141f61eSdrh pExpr->pLeft = 0; 588*4adee20fSdanielk1977 sqlite3ExprDelete(pExpr->pRight); 5898141f61eSdrh pExpr->pRight = 0; 5908141f61eSdrh pExpr->op = TK_COLUMN; 591*4adee20fSdanielk1977 sqlite3AuthRead(pParse, pExpr, pSrcList); 5928141f61eSdrh return cnt!=1; 5938141f61eSdrh } 5948141f61eSdrh 5958141f61eSdrh /* 596cce7d176Sdrh ** This routine walks an expression tree and resolves references to 597967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 598aacc543eSdrh ** index to the table in the table list and a column offset. The 599aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 600aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 601832508b7Sdrh ** plus the "base" value. The base value will ultimately become the 602aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 603aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 604aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 605aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 606aacc543eSdrh ** alias for ROWID. 60719a775c2Sdrh ** 608fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 609fef5208cSdrh ** forms: 610fef5208cSdrh ** 611fef5208cSdrh ** expr IN (exprlist) 612fef5208cSdrh ** and 613fef5208cSdrh ** expr IN (SELECT ...) 614fef5208cSdrh ** 615fef5208cSdrh ** The first form is handled by creating a set holding the list 616fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 617fef5208cSdrh ** a temporary table. 618fef5208cSdrh ** 619fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 62019a775c2Sdrh ** If it finds any, it generates code to write the value of that select 62119a775c2Sdrh ** into a memory cell. 622cce7d176Sdrh ** 623967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 624cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 625cce7d176Sdrh */ 626*4adee20fSdanielk1977 int sqlite3ExprResolveIds( 627a2e00042Sdrh Parse *pParse, /* The parser context */ 6288141f61eSdrh SrcList *pSrcList, /* List of tables used to resolve column names */ 629a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 630a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 631a2e00042Sdrh ){ 6326a3ea0e6Sdrh int i; 6336a3ea0e6Sdrh 6348141f61eSdrh if( pExpr==0 || pSrcList==0 ) return 0; 6358141f61eSdrh for(i=0; i<pSrcList->nSrc; i++){ 6368141f61eSdrh assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab ); 6376a3ea0e6Sdrh } 638cce7d176Sdrh switch( pExpr->op ){ 6392398937bSdrh /* Double-quoted strings (ex: "abc") are used as identifiers if 6402398937bSdrh ** possible. Otherwise they remain as strings. Single-quoted 6412398937bSdrh ** strings (ex: 'abc') are always string literals. 6422398937bSdrh */ 6432398937bSdrh case TK_STRING: { 6442398937bSdrh if( pExpr->token.z[0]=='\'' ) break; 6452398937bSdrh /* Fall thru into the TK_ID case if this is a double-quoted string */ 6462398937bSdrh } 6478141f61eSdrh /* A lone identifier is the name of a columnd. 648a2e00042Sdrh */ 649cce7d176Sdrh case TK_ID: { 6508141f61eSdrh if( lookupName(pParse, 0, 0, &pExpr->token, pSrcList, pEList, pExpr) ){ 651cce7d176Sdrh return 1; 652ed6c8671Sdrh } 653cce7d176Sdrh break; 654cce7d176Sdrh } 655cce7d176Sdrh 656d24cc427Sdrh /* A table name and column name: ID.ID 657d24cc427Sdrh ** Or a database, table and column: ID.ID.ID 658d24cc427Sdrh */ 659cce7d176Sdrh case TK_DOT: { 6608141f61eSdrh Token *pColumn; 6618141f61eSdrh Token *pTable; 6628141f61eSdrh Token *pDb; 6638141f61eSdrh Expr *pRight; 664cce7d176Sdrh 665cce7d176Sdrh pRight = pExpr->pRight; 666d24cc427Sdrh if( pRight->op==TK_ID ){ 6678141f61eSdrh pDb = 0; 6688141f61eSdrh pTable = &pExpr->pLeft->token; 6698141f61eSdrh pColumn = &pRight->token; 670d24cc427Sdrh }else{ 6718141f61eSdrh assert( pRight->op==TK_DOT ); 6728141f61eSdrh pDb = &pExpr->pLeft->token; 6738141f61eSdrh pTable = &pRight->pLeft->token; 6748141f61eSdrh pColumn = &pRight->pRight->token; 675d24cc427Sdrh } 6768141f61eSdrh if( lookupName(pParse, pDb, pTable, pColumn, pSrcList, 0, pExpr) ){ 677daffd0e5Sdrh return 1; 678daffd0e5Sdrh } 679cce7d176Sdrh break; 680cce7d176Sdrh } 681cce7d176Sdrh 682fef5208cSdrh case TK_IN: { 683*4adee20fSdanielk1977 Vdbe *v = sqlite3GetVdbe(pParse); 684fef5208cSdrh if( v==0 ) return 1; 685*4adee20fSdanielk1977 if( sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){ 686cfab11bcSdrh return 1; 687cfab11bcSdrh } 688fef5208cSdrh if( pExpr->pSelect ){ 689fef5208cSdrh /* Case 1: expr IN (SELECT ...) 690fef5208cSdrh ** 691fef5208cSdrh ** Generate code to write the results of the select into a temporary 6924794b980Sdrh ** table. The cursor number of the temporary table has already 693*4adee20fSdanielk1977 ** been put in iTable by sqlite3ExprResolveInSelect(). 694fef5208cSdrh */ 695832508b7Sdrh pExpr->iTable = pParse->nTab++; 696*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 697*4adee20fSdanielk1977 sqlite3Select(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0); 698fef5208cSdrh }else if( pExpr->pList ){ 699fef5208cSdrh /* Case 2: expr IN (exprlist) 700fef5208cSdrh ** 701fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 702fef5208cSdrh ** in iTable. 703fef5208cSdrh */ 704fef5208cSdrh int i, iSet; 705fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 706fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 707*4adee20fSdanielk1977 if( !sqlite3ExprIsConstant(pE2) ){ 708*4adee20fSdanielk1977 sqlite3ErrorMsg(pParse, 709da93d238Sdrh "right-hand side of IN operator must be constant"); 710fef5208cSdrh return 1; 711fef5208cSdrh } 712*4adee20fSdanielk1977 if( sqlite3ExprCheck(pParse, pE2, 0, 0) ){ 7134794b980Sdrh return 1; 7144794b980Sdrh } 715fef5208cSdrh } 716fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 717fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 718fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 719fef5208cSdrh switch( pE2->op ){ 720fef5208cSdrh case TK_FLOAT: 721fef5208cSdrh case TK_INTEGER: 722fef5208cSdrh case TK_STRING: { 723701a0aebSdrh int addr; 724a76b5dfcSdrh assert( pE2->token.z ); 725*4adee20fSdanielk1977 addr = sqlite3VdbeOp3(v, OP_SetInsert, iSet, 0, 726701a0aebSdrh pE2->token.z, pE2->token.n); 727*4adee20fSdanielk1977 sqlite3VdbeDequoteP3(v, addr); 728fef5208cSdrh break; 729fef5208cSdrh } 730fef5208cSdrh default: { 731*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pE2); 732*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_SetInsert, iSet, 0); 733fef5208cSdrh break; 734fef5208cSdrh } 735fef5208cSdrh } 736fef5208cSdrh } 737fef5208cSdrh } 738cfab11bcSdrh break; 739fef5208cSdrh } 740fef5208cSdrh 74119a775c2Sdrh case TK_SELECT: { 742fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 743fef5208cSdrh ** value of this select in a memory cell and record the number 744967e8b73Sdrh ** of the memory cell in iColumn. 745fef5208cSdrh */ 746967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 747*4adee20fSdanielk1977 if( sqlite3Select(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){ 74819a775c2Sdrh return 1; 74919a775c2Sdrh } 75019a775c2Sdrh break; 75119a775c2Sdrh } 75219a775c2Sdrh 753cce7d176Sdrh /* For all else, just recursively walk the tree */ 754cce7d176Sdrh default: { 755cce7d176Sdrh if( pExpr->pLeft 756*4adee20fSdanielk1977 && sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pLeft) ){ 757cce7d176Sdrh return 1; 758cce7d176Sdrh } 759cce7d176Sdrh if( pExpr->pRight 760*4adee20fSdanielk1977 && sqlite3ExprResolveIds(pParse, pSrcList, pEList, pExpr->pRight) ){ 761cce7d176Sdrh return 1; 762cce7d176Sdrh } 763cce7d176Sdrh if( pExpr->pList ){ 764cce7d176Sdrh int i; 765cce7d176Sdrh ExprList *pList = pExpr->pList; 766cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 767832508b7Sdrh Expr *pArg = pList->a[i].pExpr; 768*4adee20fSdanielk1977 if( sqlite3ExprResolveIds(pParse, pSrcList, pEList, pArg) ){ 769cce7d176Sdrh return 1; 770cce7d176Sdrh } 771cce7d176Sdrh } 772cce7d176Sdrh } 773cce7d176Sdrh } 774cce7d176Sdrh } 775cce7d176Sdrh return 0; 776cce7d176Sdrh } 777cce7d176Sdrh 778cce7d176Sdrh /* 7794b59ab5eSdrh ** pExpr is a node that defines a function of some kind. It might 7804b59ab5eSdrh ** be a syntactic function like "count(x)" or it might be a function 7814b59ab5eSdrh ** that implements an operator, like "a LIKE b". 7824b59ab5eSdrh ** 7834b59ab5eSdrh ** This routine makes *pzName point to the name of the function and 7844b59ab5eSdrh ** *pnName hold the number of characters in the function name. 7854b59ab5eSdrh */ 7864b59ab5eSdrh static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){ 7874b59ab5eSdrh switch( pExpr->op ){ 7884b59ab5eSdrh case TK_FUNCTION: { 7894b59ab5eSdrh *pzName = pExpr->token.z; 7906977fea8Sdrh *pnName = pExpr->token.n; 7914b59ab5eSdrh break; 7924b59ab5eSdrh } 7934b59ab5eSdrh case TK_LIKE: { 7944b59ab5eSdrh *pzName = "like"; 7954b59ab5eSdrh *pnName = 4; 7964b59ab5eSdrh break; 7974b59ab5eSdrh } 7984b59ab5eSdrh case TK_GLOB: { 7994b59ab5eSdrh *pzName = "glob"; 8004b59ab5eSdrh *pnName = 4; 8014b59ab5eSdrh break; 8024b59ab5eSdrh } 8034b59ab5eSdrh default: { 8044b59ab5eSdrh *pzName = "can't happen"; 8054b59ab5eSdrh *pnName = 12; 8064b59ab5eSdrh break; 8074b59ab5eSdrh } 8084b59ab5eSdrh } 8094b59ab5eSdrh } 8104b59ab5eSdrh 8114b59ab5eSdrh /* 812cce7d176Sdrh ** Error check the functions in an expression. Make sure all 813cce7d176Sdrh ** function names are recognized and all functions have the correct 814cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 815cce7d176Sdrh ** if anything is amiss. Return the number of errors. 816cce7d176Sdrh ** 817cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 818cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 819cce7d176Sdrh */ 820*4adee20fSdanielk1977 int sqlite3ExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 821cce7d176Sdrh int nErr = 0; 822cce7d176Sdrh if( pExpr==0 ) return 0; 823cce7d176Sdrh switch( pExpr->op ){ 8244b59ab5eSdrh case TK_GLOB: 8254b59ab5eSdrh case TK_LIKE: 826cce7d176Sdrh case TK_FUNCTION: { 827c9b84a1fSdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; /* Number of arguments */ 828c9b84a1fSdrh int no_such_func = 0; /* True if no such function exists */ 829c9b84a1fSdrh int wrong_num_args = 0; /* True if wrong number of arguments */ 830c9b84a1fSdrh int is_agg = 0; /* True if is an aggregate function */ 831cce7d176Sdrh int i; 8324b59ab5eSdrh int nId; /* Number of characters in function name */ 8334b59ab5eSdrh const char *zId; /* The function name. */ 8340bce8354Sdrh FuncDef *pDef; 8350bce8354Sdrh 8364b59ab5eSdrh getFunctionName(pExpr, &zId, &nId); 837*4adee20fSdanielk1977 pDef = sqlite3FindFunction(pParse->db, zId, nId, n, 0); 8380bce8354Sdrh if( pDef==0 ){ 839*4adee20fSdanielk1977 pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, 0); 8400bce8354Sdrh if( pDef==0 ){ 841cce7d176Sdrh no_such_func = 1; 8428e0a2f90Sdrh }else{ 8438e0a2f90Sdrh wrong_num_args = 1; 8448e0a2f90Sdrh } 8458e0a2f90Sdrh }else{ 8460bce8354Sdrh is_agg = pDef->xFunc==0; 847cce7d176Sdrh } 8488e0a2f90Sdrh if( is_agg && !allowAgg ){ 849*4adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId, zId); 8508e0a2f90Sdrh nErr++; 8518e0a2f90Sdrh is_agg = 0; 8528e0a2f90Sdrh }else if( no_such_func ){ 853*4adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); 854cce7d176Sdrh nErr++; 8558e0a2f90Sdrh }else if( wrong_num_args ){ 856*4adee20fSdanielk1977 sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", 857f7a9e1acSdrh nId, zId); 8588e0a2f90Sdrh nErr++; 859cce7d176Sdrh } 860f7a9e1acSdrh if( is_agg ){ 861f7a9e1acSdrh pExpr->op = TK_AGG_FUNCTION; 862f7a9e1acSdrh if( pIsAgg ) *pIsAgg = 1; 863f7a9e1acSdrh } 864cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 865*4adee20fSdanielk1977 nErr = sqlite3ExprCheck(pParse, pExpr->pList->a[i].pExpr, 8664cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 867cce7d176Sdrh } 868c9b84a1fSdrh if( pDef==0 ){ 869268380caSdrh /* Already reported an error */ 870c9b84a1fSdrh }else if( pDef->dataType>=0 ){ 871c9b84a1fSdrh if( pDef->dataType<n ){ 872c9b84a1fSdrh pExpr->dataType = 873*4adee20fSdanielk1977 sqlite3ExprType(pExpr->pList->a[pDef->dataType].pExpr); 874c9b84a1fSdrh }else{ 875c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 876c9b84a1fSdrh } 877c9b84a1fSdrh }else if( pDef->dataType==SQLITE_ARGS ){ 878c9b84a1fSdrh pDef->dataType = SQLITE_SO_TEXT; 879c9b84a1fSdrh for(i=0; i<n; i++){ 880*4adee20fSdanielk1977 if( sqlite3ExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){ 881c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 882c9b84a1fSdrh break; 883c9b84a1fSdrh } 884c9b84a1fSdrh } 885c9b84a1fSdrh }else if( pDef->dataType==SQLITE_NUMERIC ){ 886c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 887c9b84a1fSdrh }else{ 888c9b84a1fSdrh pExpr->dataType = SQLITE_SO_TEXT; 889c9b84a1fSdrh } 890cce7d176Sdrh } 891cce7d176Sdrh default: { 892cce7d176Sdrh if( pExpr->pLeft ){ 893*4adee20fSdanielk1977 nErr = sqlite3ExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 894cce7d176Sdrh } 895cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 896*4adee20fSdanielk1977 nErr = sqlite3ExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 897cce7d176Sdrh } 898fef5208cSdrh if( nErr==0 && pExpr->pList ){ 899fef5208cSdrh int n = pExpr->pList->nExpr; 900fef5208cSdrh int i; 901fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 9022282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 903*4adee20fSdanielk1977 nErr = sqlite3ExprCheck(pParse, pE2, allowAgg, pIsAgg); 904fef5208cSdrh } 905fef5208cSdrh } 906cce7d176Sdrh break; 907cce7d176Sdrh } 908cce7d176Sdrh } 909cce7d176Sdrh return nErr; 910cce7d176Sdrh } 911cce7d176Sdrh 912cce7d176Sdrh /* 913c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the 914c9b84a1fSdrh ** given expression should sort as numeric values or as text. 915c9b84a1fSdrh ** 916*4adee20fSdanielk1977 ** The sqlite3ExprResolveIds() and sqlite3ExprCheck() routines must have 917c9b84a1fSdrh ** both been called on the expression before it is passed to this routine. 918c9b84a1fSdrh */ 919*4adee20fSdanielk1977 int sqlite3ExprType(Expr *p){ 920c9b84a1fSdrh if( p==0 ) return SQLITE_SO_NUM; 921c9b84a1fSdrh while( p ) switch( p->op ){ 922c9b84a1fSdrh case TK_PLUS: 923c9b84a1fSdrh case TK_MINUS: 924c9b84a1fSdrh case TK_STAR: 925c9b84a1fSdrh case TK_SLASH: 926c9b84a1fSdrh case TK_AND: 927c9b84a1fSdrh case TK_OR: 928c9b84a1fSdrh case TK_ISNULL: 929c9b84a1fSdrh case TK_NOTNULL: 930c9b84a1fSdrh case TK_NOT: 931c9b84a1fSdrh case TK_UMINUS: 9324b59ab5eSdrh case TK_UPLUS: 933c9b84a1fSdrh case TK_BITAND: 934c9b84a1fSdrh case TK_BITOR: 935c9b84a1fSdrh case TK_BITNOT: 936c9b84a1fSdrh case TK_LSHIFT: 937c9b84a1fSdrh case TK_RSHIFT: 938c9b84a1fSdrh case TK_REM: 939c9b84a1fSdrh case TK_INTEGER: 940c9b84a1fSdrh case TK_FLOAT: 941c9b84a1fSdrh case TK_IN: 942c9b84a1fSdrh case TK_BETWEEN: 9434b59ab5eSdrh case TK_GLOB: 9444b59ab5eSdrh case TK_LIKE: 945c9b84a1fSdrh return SQLITE_SO_NUM; 946c9b84a1fSdrh 947c9b84a1fSdrh case TK_STRING: 948c9b84a1fSdrh case TK_NULL: 949c9b84a1fSdrh case TK_CONCAT: 95050457896Sdrh case TK_VARIABLE: 951c9b84a1fSdrh return SQLITE_SO_TEXT; 952c9b84a1fSdrh 953c9b84a1fSdrh case TK_LT: 954c9b84a1fSdrh case TK_LE: 955c9b84a1fSdrh case TK_GT: 956c9b84a1fSdrh case TK_GE: 957c9b84a1fSdrh case TK_NE: 958c9b84a1fSdrh case TK_EQ: 959*4adee20fSdanielk1977 if( sqlite3ExprType(p->pLeft)==SQLITE_SO_NUM ){ 960c9b84a1fSdrh return SQLITE_SO_NUM; 961c9b84a1fSdrh } 962c9b84a1fSdrh p = p->pRight; 963c9b84a1fSdrh break; 964c9b84a1fSdrh 965c9b84a1fSdrh case TK_AS: 966c9b84a1fSdrh p = p->pLeft; 967c9b84a1fSdrh break; 968c9b84a1fSdrh 969c9b84a1fSdrh case TK_COLUMN: 970c9b84a1fSdrh case TK_FUNCTION: 971c9b84a1fSdrh case TK_AGG_FUNCTION: 972c9b84a1fSdrh return p->dataType; 973c9b84a1fSdrh 974c9b84a1fSdrh case TK_SELECT: 975c9b84a1fSdrh assert( p->pSelect ); 976c9b84a1fSdrh assert( p->pSelect->pEList ); 977c9b84a1fSdrh assert( p->pSelect->pEList->nExpr>0 ); 978c9b84a1fSdrh p = p->pSelect->pEList->a[0].pExpr; 979c9b84a1fSdrh break; 980c9b84a1fSdrh 981b1363206Sdrh case TK_CASE: { 982*4adee20fSdanielk1977 if( p->pRight && sqlite3ExprType(p->pRight)==SQLITE_SO_NUM ){ 983b1363206Sdrh return SQLITE_SO_NUM; 984b1363206Sdrh } 985b1363206Sdrh if( p->pList ){ 986b1363206Sdrh int i; 987b1363206Sdrh ExprList *pList = p->pList; 988b1363206Sdrh for(i=1; i<pList->nExpr; i+=2){ 989*4adee20fSdanielk1977 if( sqlite3ExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){ 990b1363206Sdrh return SQLITE_SO_NUM; 991b1363206Sdrh } 992b1363206Sdrh } 993b1363206Sdrh } 994b1363206Sdrh return SQLITE_SO_TEXT; 995b1363206Sdrh } 996b1363206Sdrh 997c9b84a1fSdrh default: 998c9b84a1fSdrh assert( p->op==TK_ABORT ); /* Can't Happen */ 999c9b84a1fSdrh break; 1000c9b84a1fSdrh } 1001c9b84a1fSdrh return SQLITE_SO_NUM; 1002c9b84a1fSdrh } 1003c9b84a1fSdrh 1004c9b84a1fSdrh /* 1005cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 10061ccde15dSdrh ** expression and leave the result on the top of stack. 1007cce7d176Sdrh */ 1008*4adee20fSdanielk1977 void sqlite3ExprCode(Parse *pParse, Expr *pExpr){ 1009cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1010cce7d176Sdrh int op; 1011daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1012cce7d176Sdrh switch( pExpr->op ){ 1013cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 1014cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 1015cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 1016cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 1017cce7d176Sdrh case TK_AND: op = OP_And; break; 1018cce7d176Sdrh case TK_OR: op = OP_Or; break; 1019cce7d176Sdrh case TK_LT: op = OP_Lt; break; 1020cce7d176Sdrh case TK_LE: op = OP_Le; break; 1021cce7d176Sdrh case TK_GT: op = OP_Gt; break; 1022cce7d176Sdrh case TK_GE: op = OP_Ge; break; 1023cce7d176Sdrh case TK_NE: op = OP_Ne; break; 1024cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 1025cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 1026cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 1027cce7d176Sdrh case TK_NOT: op = OP_Not; break; 1028cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 1029bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 1030bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 1031bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 1032bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 1033bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 1034bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 1035cce7d176Sdrh default: break; 1036cce7d176Sdrh } 1037cce7d176Sdrh switch( pExpr->op ){ 1038967e8b73Sdrh case TK_COLUMN: { 10392282792aSdrh if( pParse->useAgg ){ 1040*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 1041c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 1042*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 1043c4a3c779Sdrh }else{ 1044*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 10452282792aSdrh } 1046cce7d176Sdrh break; 1047cce7d176Sdrh } 104851e9a445Sdrh case TK_STRING: 104951e9a445Sdrh case TK_FLOAT: 1050cce7d176Sdrh case TK_INTEGER: { 1051*4adee20fSdanielk1977 if( pExpr->op==TK_INTEGER && sqlite3FitsIn32Bits(pExpr->token.z) ){ 1052*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Integer, atoi(pExpr->token.z), 0); 105351e9a445Sdrh }else{ 1054*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_String, 0, 0); 105551e9a445Sdrh } 1056a76b5dfcSdrh assert( pExpr->token.z ); 1057*4adee20fSdanielk1977 sqlite3VdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 1058*4adee20fSdanielk1977 sqlite3VdbeDequoteP3(v, -1); 1059cce7d176Sdrh break; 1060cce7d176Sdrh } 1061cce7d176Sdrh case TK_NULL: { 1062*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_String, 0, 0); 1063cce7d176Sdrh break; 1064cce7d176Sdrh } 106550457896Sdrh case TK_VARIABLE: { 1066*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Variable, pExpr->iTable, 0); 106750457896Sdrh break; 106850457896Sdrh } 1069c9b84a1fSdrh case TK_LT: 1070c9b84a1fSdrh case TK_LE: 1071c9b84a1fSdrh case TK_GT: 1072c9b84a1fSdrh case TK_GE: 1073c9b84a1fSdrh case TK_NE: 1074c9b84a1fSdrh case TK_EQ: { 1075*4adee20fSdanielk1977 if( pParse->db->file_format>=4 && sqlite3ExprType(pExpr)==SQLITE_SO_TEXT ){ 1076c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1077c9b84a1fSdrh } 1078c9b84a1fSdrh /* Fall through into the next case */ 1079c9b84a1fSdrh } 1080cce7d176Sdrh case TK_AND: 1081cce7d176Sdrh case TK_OR: 1082cce7d176Sdrh case TK_PLUS: 1083cce7d176Sdrh case TK_STAR: 1084cce7d176Sdrh case TK_MINUS: 1085bf4133cbSdrh case TK_REM: 1086bf4133cbSdrh case TK_BITAND: 1087bf4133cbSdrh case TK_BITOR: 1088c9b84a1fSdrh case TK_SLASH: { 1089*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1090*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pRight); 1091*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, 0, 0); 1092cce7d176Sdrh break; 1093cce7d176Sdrh } 1094bf4133cbSdrh case TK_LSHIFT: 1095bf4133cbSdrh case TK_RSHIFT: { 1096*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pRight); 1097*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1098*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, 0, 0); 1099bf4133cbSdrh break; 1100bf4133cbSdrh } 11010040077dSdrh case TK_CONCAT: { 1102*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1103*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pRight); 1104*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Concat, 2, 0); 11050040077dSdrh break; 11060040077dSdrh } 1107cce7d176Sdrh case TK_UMINUS: { 11086e142f54Sdrh assert( pExpr->pLeft ); 11097a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 11106e142f54Sdrh Token *p = &pExpr->pLeft->token; 11116e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 11126e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 1113*4adee20fSdanielk1977 if( pExpr->pLeft->op==TK_INTEGER && sqlite3FitsIn32Bits(z) ){ 1114*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Integer, atoi(z), 0); 1115e6840900Sdrh }else{ 1116*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_String, 0, 0); 1117e6840900Sdrh } 1118*4adee20fSdanielk1977 sqlite3VdbeChangeP3(v, -1, z, p->n+1); 11196e142f54Sdrh sqliteFree(z); 11206e142f54Sdrh break; 11216e142f54Sdrh } 11221ccde15dSdrh /* Fall through into TK_NOT */ 11236e142f54Sdrh } 1124bf4133cbSdrh case TK_BITNOT: 11256e142f54Sdrh case TK_NOT: { 1126*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1127*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, 0, 0); 1128cce7d176Sdrh break; 1129cce7d176Sdrh } 1130cce7d176Sdrh case TK_ISNULL: 1131cce7d176Sdrh case TK_NOTNULL: { 1132cce7d176Sdrh int dest; 1133*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Integer, 1, 0); 1134*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1135*4adee20fSdanielk1977 dest = sqlite3VdbeCurrentAddr(v) + 2; 1136*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, 1, dest); 1137*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_AddImm, -1, 0); 1138cce7d176Sdrh break; 1139cce7d176Sdrh } 11402282792aSdrh case TK_AGG_FUNCTION: { 1141*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 11422282792aSdrh break; 11432282792aSdrh } 11444b59ab5eSdrh case TK_GLOB: 11454b59ab5eSdrh case TK_LIKE: 1146cce7d176Sdrh case TK_FUNCTION: { 1147cce7d176Sdrh ExprList *pList = pExpr->pList; 114889425d5eSdrh int nExpr = pList ? pList->nExpr : 0; 11490bce8354Sdrh FuncDef *pDef; 11504b59ab5eSdrh int nId; 11514b59ab5eSdrh const char *zId; 11524b59ab5eSdrh getFunctionName(pExpr, &zId, &nId); 1153*4adee20fSdanielk1977 pDef = sqlite3FindFunction(pParse->db, zId, nId, nExpr, 0); 11540bce8354Sdrh assert( pDef!=0 ); 1155*4adee20fSdanielk1977 nExpr = sqlite3ExprCodeExprList(pParse, pList, pDef->includeTypes); 1156*4adee20fSdanielk1977 sqlite3VdbeOp3(v, OP_Function, nExpr, 0, (char*)pDef, P3_POINTER); 11576ec2733bSdrh break; 11586ec2733bSdrh } 115919a775c2Sdrh case TK_SELECT: { 1160*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 116119a775c2Sdrh break; 116219a775c2Sdrh } 1163fef5208cSdrh case TK_IN: { 1164fef5208cSdrh int addr; 1165*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Integer, 1, 0); 1166*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1167*4adee20fSdanielk1977 addr = sqlite3VdbeCurrentAddr(v); 1168*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+4); 1169*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pop, 2, 0); 1170*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_String, 0, 0); 1171*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Goto, 0, addr+6); 1172fef5208cSdrh if( pExpr->pSelect ){ 1173*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, addr+6); 1174fef5208cSdrh }else{ 1175*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6); 1176fef5208cSdrh } 1177*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_AddImm, -1, 0); 1178fef5208cSdrh break; 1179fef5208cSdrh } 1180fef5208cSdrh case TK_BETWEEN: { 1181*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1182*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Dup, 0, 0); 1183*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr); 1184*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Ge, 0, 0); 1185*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pull, 1, 0); 1186*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr); 1187*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Le, 0, 0); 1188*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_And, 0, 0); 1189fef5208cSdrh break; 1190fef5208cSdrh } 119151e9a445Sdrh case TK_UPLUS: 1192a2e00042Sdrh case TK_AS: { 1193*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1194a2e00042Sdrh break; 1195a2e00042Sdrh } 119617a7f8ddSdrh case TK_CASE: { 119717a7f8ddSdrh int expr_end_label; 1198f5905aa7Sdrh int jumpInst; 1199f5905aa7Sdrh int addr; 1200f5905aa7Sdrh int nExpr; 120117a7f8ddSdrh int i; 120217a7f8ddSdrh 120317a7f8ddSdrh assert(pExpr->pList); 120417a7f8ddSdrh assert((pExpr->pList->nExpr % 2) == 0); 120517a7f8ddSdrh assert(pExpr->pList->nExpr > 0); 1206f5905aa7Sdrh nExpr = pExpr->pList->nExpr; 1207*4adee20fSdanielk1977 expr_end_label = sqlite3VdbeMakeLabel(v); 120817a7f8ddSdrh if( pExpr->pLeft ){ 1209*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1210cce7d176Sdrh } 1211f5905aa7Sdrh for(i=0; i<nExpr; i=i+2){ 1212*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[i].pExpr); 121317a7f8ddSdrh if( pExpr->pLeft ){ 1214*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Dup, 1, 1); 1215*4adee20fSdanielk1977 jumpInst = sqlite3VdbeAddOp(v, OP_Ne, 1, 0); 1216*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pop, 1, 0); 1217f5905aa7Sdrh }else{ 1218*4adee20fSdanielk1977 jumpInst = sqlite3VdbeAddOp(v, OP_IfNot, 1, 0); 121917a7f8ddSdrh } 1220*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[i+1].pExpr); 1221*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Goto, 0, expr_end_label); 1222*4adee20fSdanielk1977 addr = sqlite3VdbeCurrentAddr(v); 1223*4adee20fSdanielk1977 sqlite3VdbeChangeP2(v, jumpInst, addr); 122417a7f8ddSdrh } 1225f570f011Sdrh if( pExpr->pLeft ){ 1226*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pop, 1, 0); 1227f570f011Sdrh } 122817a7f8ddSdrh if( pExpr->pRight ){ 1229*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pRight); 123017a7f8ddSdrh }else{ 1231*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_String, 0, 0); 123217a7f8ddSdrh } 1233*4adee20fSdanielk1977 sqlite3VdbeResolveLabel(v, expr_end_label); 12346f34903eSdanielk1977 break; 12356f34903eSdanielk1977 } 12366f34903eSdanielk1977 case TK_RAISE: { 12376f34903eSdanielk1977 if( !pParse->trigStack ){ 1238*4adee20fSdanielk1977 sqlite3ErrorMsg(pParse, 1239da93d238Sdrh "RAISE() may only be used within a trigger-program"); 12406f34903eSdanielk1977 pParse->nErr++; 12416f34903eSdanielk1977 return; 12426f34903eSdanielk1977 } 12436f34903eSdanielk1977 if( pExpr->iColumn == OE_Rollback || 12446f34903eSdanielk1977 pExpr->iColumn == OE_Abort || 12456f34903eSdanielk1977 pExpr->iColumn == OE_Fail ){ 1246*4adee20fSdanielk1977 sqlite3VdbeOp3(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn, 1247701a0aebSdrh pExpr->token.z, pExpr->token.n); 1248*4adee20fSdanielk1977 sqlite3VdbeDequoteP3(v, -1); 12496f34903eSdanielk1977 } else { 12506f34903eSdanielk1977 assert( pExpr->iColumn == OE_Ignore ); 1251*4adee20fSdanielk1977 sqlite3VdbeOp3(v, OP_Goto, 0, pParse->trigStack->ignoreJump, 1252701a0aebSdrh "(IGNORE jump)", 0); 12536f34903eSdanielk1977 } 125417a7f8ddSdrh } 125517a7f8ddSdrh break; 125617a7f8ddSdrh } 1257cce7d176Sdrh } 1258cce7d176Sdrh 1259cce7d176Sdrh /* 1260268380caSdrh ** Generate code that pushes the value of every element of the given 1261268380caSdrh ** expression list onto the stack. If the includeTypes flag is true, 1262268380caSdrh ** then also push a string that is the datatype of each element onto 1263268380caSdrh ** the stack after the value. 1264268380caSdrh ** 1265268380caSdrh ** Return the number of elements pushed onto the stack. 1266268380caSdrh */ 1267*4adee20fSdanielk1977 int sqlite3ExprCodeExprList( 1268268380caSdrh Parse *pParse, /* Parsing context */ 1269268380caSdrh ExprList *pList, /* The expression list to be coded */ 1270268380caSdrh int includeTypes /* TRUE to put datatypes on the stack too */ 1271268380caSdrh ){ 1272268380caSdrh struct ExprList_item *pItem; 1273268380caSdrh int i, n; 1274268380caSdrh Vdbe *v; 1275268380caSdrh if( pList==0 ) return 0; 1276*4adee20fSdanielk1977 v = sqlite3GetVdbe(pParse); 1277268380caSdrh n = pList->nExpr; 1278268380caSdrh for(pItem=pList->a, i=0; i<n; i++, pItem++){ 1279*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pItem->pExpr); 1280268380caSdrh if( includeTypes ){ 1281*4adee20fSdanielk1977 sqlite3VdbeOp3(v, OP_String, 0, 0, 1282*4adee20fSdanielk1977 sqlite3ExprType(pItem->pExpr)==SQLITE_SO_NUM ? "numeric" : "text", 1283268380caSdrh P3_STATIC); 1284268380caSdrh } 1285268380caSdrh } 1286268380caSdrh return includeTypes ? n*2 : n; 1287268380caSdrh } 1288268380caSdrh 1289268380caSdrh /* 1290cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 1291cce7d176Sdrh ** to the label "dest" if the expression is true but execution 1292cce7d176Sdrh ** continues straight thru if the expression is false. 1293f5905aa7Sdrh ** 1294f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then 1295f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true. 1296cce7d176Sdrh */ 1297*4adee20fSdanielk1977 void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1298cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1299cce7d176Sdrh int op = 0; 1300daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1301cce7d176Sdrh switch( pExpr->op ){ 1302cce7d176Sdrh case TK_LT: op = OP_Lt; break; 1303cce7d176Sdrh case TK_LE: op = OP_Le; break; 1304cce7d176Sdrh case TK_GT: op = OP_Gt; break; 1305cce7d176Sdrh case TK_GE: op = OP_Ge; break; 1306cce7d176Sdrh case TK_NE: op = OP_Ne; break; 1307cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 1308cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 1309cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 1310cce7d176Sdrh default: break; 1311cce7d176Sdrh } 1312cce7d176Sdrh switch( pExpr->op ){ 1313cce7d176Sdrh case TK_AND: { 1314*4adee20fSdanielk1977 int d2 = sqlite3VdbeMakeLabel(v); 1315*4adee20fSdanielk1977 sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull); 1316*4adee20fSdanielk1977 sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1317*4adee20fSdanielk1977 sqlite3VdbeResolveLabel(v, d2); 1318cce7d176Sdrh break; 1319cce7d176Sdrh } 1320cce7d176Sdrh case TK_OR: { 1321*4adee20fSdanielk1977 sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1322*4adee20fSdanielk1977 sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1323cce7d176Sdrh break; 1324cce7d176Sdrh } 1325cce7d176Sdrh case TK_NOT: { 1326*4adee20fSdanielk1977 sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1327cce7d176Sdrh break; 1328cce7d176Sdrh } 1329cce7d176Sdrh case TK_LT: 1330cce7d176Sdrh case TK_LE: 1331cce7d176Sdrh case TK_GT: 1332cce7d176Sdrh case TK_GE: 1333cce7d176Sdrh case TK_NE: 13340ac65892Sdrh case TK_EQ: { 1335*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1336*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pRight); 1337*4adee20fSdanielk1977 if( pParse->db->file_format>=4 && sqlite3ExprType(pExpr)==SQLITE_SO_TEXT ){ 1338c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1339c9b84a1fSdrh } 1340*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, jumpIfNull, dest); 1341cce7d176Sdrh break; 1342cce7d176Sdrh } 1343cce7d176Sdrh case TK_ISNULL: 1344cce7d176Sdrh case TK_NOTNULL: { 1345*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1346*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, 1, dest); 1347cce7d176Sdrh break; 1348cce7d176Sdrh } 1349fef5208cSdrh case TK_IN: { 1350f5905aa7Sdrh int addr; 1351*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1352*4adee20fSdanielk1977 addr = sqlite3VdbeCurrentAddr(v); 1353*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+3); 1354*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pop, 1, 0); 1355*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1356fef5208cSdrh if( pExpr->pSelect ){ 1357*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1358fef5208cSdrh }else{ 1359*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1360fef5208cSdrh } 1361fef5208cSdrh break; 1362fef5208cSdrh } 1363fef5208cSdrh case TK_BETWEEN: { 1364f5905aa7Sdrh int addr; 1365*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1366*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Dup, 0, 0); 1367*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr); 1368*4adee20fSdanielk1977 addr = sqlite3VdbeAddOp(v, OP_Lt, !jumpIfNull, 0); 1369*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr); 1370*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Le, jumpIfNull, dest); 1371*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Integer, 0, 0); 1372*4adee20fSdanielk1977 sqlite3VdbeChangeP2(v, addr, sqlite3VdbeCurrentAddr(v)); 1373*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pop, 1, 0); 1374fef5208cSdrh break; 1375fef5208cSdrh } 1376cce7d176Sdrh default: { 1377*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr); 1378*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_If, jumpIfNull, dest); 1379cce7d176Sdrh break; 1380cce7d176Sdrh } 1381cce7d176Sdrh } 1382cce7d176Sdrh } 1383cce7d176Sdrh 1384cce7d176Sdrh /* 138566b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1386cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1387cce7d176Sdrh ** continues straight thru if the expression is true. 1388f5905aa7Sdrh ** 1389f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then 1390f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false. 1391cce7d176Sdrh */ 1392*4adee20fSdanielk1977 void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1393cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1394cce7d176Sdrh int op = 0; 1395daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1396cce7d176Sdrh switch( pExpr->op ){ 1397cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1398cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1399cce7d176Sdrh case TK_GT: op = OP_Le; break; 1400cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1401cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1402cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1403cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1404cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1405cce7d176Sdrh default: break; 1406cce7d176Sdrh } 1407cce7d176Sdrh switch( pExpr->op ){ 1408cce7d176Sdrh case TK_AND: { 1409*4adee20fSdanielk1977 sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1410*4adee20fSdanielk1977 sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1411cce7d176Sdrh break; 1412cce7d176Sdrh } 1413cce7d176Sdrh case TK_OR: { 1414*4adee20fSdanielk1977 int d2 = sqlite3VdbeMakeLabel(v); 1415*4adee20fSdanielk1977 sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull); 1416*4adee20fSdanielk1977 sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1417*4adee20fSdanielk1977 sqlite3VdbeResolveLabel(v, d2); 1418cce7d176Sdrh break; 1419cce7d176Sdrh } 1420cce7d176Sdrh case TK_NOT: { 1421*4adee20fSdanielk1977 sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1422cce7d176Sdrh break; 1423cce7d176Sdrh } 1424cce7d176Sdrh case TK_LT: 1425cce7d176Sdrh case TK_LE: 1426cce7d176Sdrh case TK_GT: 1427cce7d176Sdrh case TK_GE: 1428cce7d176Sdrh case TK_NE: 1429cce7d176Sdrh case TK_EQ: { 1430*4adee20fSdanielk1977 if( pParse->db->file_format>=4 && sqlite3ExprType(pExpr)==SQLITE_SO_TEXT ){ 14318f619ccdSdrh /* Convert numeric comparison opcodes into text comparison opcodes. 14328f619ccdSdrh ** This step depends on the fact that the text comparision opcodes are 14338f619ccdSdrh ** always 6 greater than their corresponding numeric comparison 14348f619ccdSdrh ** opcodes. 14358f619ccdSdrh */ 14368f619ccdSdrh assert( OP_Eq+6 == OP_StrEq ); 14378f619ccdSdrh op += 6; 1438c9b84a1fSdrh } 1439*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1440*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pRight); 1441*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, jumpIfNull, dest); 1442cce7d176Sdrh break; 1443cce7d176Sdrh } 1444cce7d176Sdrh case TK_ISNULL: 1445cce7d176Sdrh case TK_NOTNULL: { 1446*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1447*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, op, 1, dest); 1448cce7d176Sdrh break; 1449cce7d176Sdrh } 1450fef5208cSdrh case TK_IN: { 1451f5905aa7Sdrh int addr; 1452*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1453*4adee20fSdanielk1977 addr = sqlite3VdbeCurrentAddr(v); 1454*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_NotNull, -1, addr+3); 1455*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pop, 1, 0); 1456*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1457fef5208cSdrh if( pExpr->pSelect ){ 1458*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1459fef5208cSdrh }else{ 1460*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1461fef5208cSdrh } 1462fef5208cSdrh break; 1463fef5208cSdrh } 1464fef5208cSdrh case TK_BETWEEN: { 1465fef5208cSdrh int addr; 1466*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pLeft); 1467*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Dup, 0, 0); 1468*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[0].pExpr); 1469*4adee20fSdanielk1977 addr = sqlite3VdbeCurrentAddr(v); 1470*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3); 1471*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Pop, 1, 0); 1472*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Goto, 0, dest); 1473*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr->pList->a[1].pExpr); 1474*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_Gt, jumpIfNull, dest); 1475fef5208cSdrh break; 1476fef5208cSdrh } 1477cce7d176Sdrh default: { 1478*4adee20fSdanielk1977 sqlite3ExprCode(pParse, pExpr); 1479*4adee20fSdanielk1977 sqlite3VdbeAddOp(v, OP_IfNot, jumpIfNull, dest); 1480cce7d176Sdrh break; 1481cce7d176Sdrh } 1482cce7d176Sdrh } 1483cce7d176Sdrh } 14842282792aSdrh 14852282792aSdrh /* 14862282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 14872282792aSdrh ** if they are identical and return FALSE if they differ in any way. 14882282792aSdrh */ 1489*4adee20fSdanielk1977 int sqlite3ExprCompare(Expr *pA, Expr *pB){ 14902282792aSdrh int i; 14912282792aSdrh if( pA==0 ){ 14922282792aSdrh return pB==0; 14932282792aSdrh }else if( pB==0 ){ 14942282792aSdrh return 0; 14952282792aSdrh } 14962282792aSdrh if( pA->op!=pB->op ) return 0; 1497*4adee20fSdanielk1977 if( !sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1498*4adee20fSdanielk1977 if( !sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 0; 14992282792aSdrh if( pA->pList ){ 15002282792aSdrh if( pB->pList==0 ) return 0; 15012282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 15022282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1503*4adee20fSdanielk1977 if( !sqlite3ExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 15042282792aSdrh return 0; 15052282792aSdrh } 15062282792aSdrh } 15072282792aSdrh }else if( pB->pList ){ 15082282792aSdrh return 0; 15092282792aSdrh } 15102282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 15112f2c01e5Sdrh if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0; 15122282792aSdrh if( pA->token.z ){ 15132282792aSdrh if( pB->token.z==0 ) return 0; 15146977fea8Sdrh if( pB->token.n!=pA->token.n ) return 0; 1515*4adee20fSdanielk1977 if( sqlite3StrNICmp(pA->token.z, pB->token.z, pB->token.n)!=0 ) return 0; 15162282792aSdrh } 15172282792aSdrh return 1; 15182282792aSdrh } 15192282792aSdrh 15202282792aSdrh /* 15212282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 15222282792aSdrh */ 15232282792aSdrh static int appendAggInfo(Parse *pParse){ 15242282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 15252282792aSdrh int amt = pParse->nAgg + 8; 15266d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 15276d4abfbeSdrh if( aAgg==0 ){ 15282282792aSdrh return -1; 15292282792aSdrh } 15306d4abfbeSdrh pParse->aAgg = aAgg; 15312282792aSdrh } 15322282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 15332282792aSdrh return pParse->nAgg++; 15342282792aSdrh } 15352282792aSdrh 15362282792aSdrh /* 15372282792aSdrh ** Analyze the given expression looking for aggregate functions and 15382282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 15392282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 15402282792aSdrh ** 15412282792aSdrh ** This routine should only be called after the expression has been 1542*4adee20fSdanielk1977 ** analyzed by sqlite3ExprResolveIds() and sqlite3ExprCheck(). 15432282792aSdrh ** 15442282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 15452282792aSdrh ** the number of errors. 15462282792aSdrh */ 1547*4adee20fSdanielk1977 int sqlite3ExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 15482282792aSdrh int i; 15492282792aSdrh AggExpr *aAgg; 15502282792aSdrh int nErr = 0; 15512282792aSdrh 15522282792aSdrh if( pExpr==0 ) return 0; 15532282792aSdrh switch( pExpr->op ){ 1554967e8b73Sdrh case TK_COLUMN: { 15552282792aSdrh aAgg = pParse->aAgg; 15562282792aSdrh for(i=0; i<pParse->nAgg; i++){ 15572282792aSdrh if( aAgg[i].isAgg ) continue; 15582282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1559967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 15602282792aSdrh break; 15612282792aSdrh } 15622282792aSdrh } 15632282792aSdrh if( i>=pParse->nAgg ){ 15642282792aSdrh i = appendAggInfo(pParse); 15652282792aSdrh if( i<0 ) return 1; 15662282792aSdrh pParse->aAgg[i].isAgg = 0; 15672282792aSdrh pParse->aAgg[i].pExpr = pExpr; 15682282792aSdrh } 1569aaf88729Sdrh pExpr->iAgg = i; 15702282792aSdrh break; 15712282792aSdrh } 15722282792aSdrh case TK_AGG_FUNCTION: { 15732282792aSdrh aAgg = pParse->aAgg; 15742282792aSdrh for(i=0; i<pParse->nAgg; i++){ 15752282792aSdrh if( !aAgg[i].isAgg ) continue; 1576*4adee20fSdanielk1977 if( sqlite3ExprCompare(aAgg[i].pExpr, pExpr) ){ 15772282792aSdrh break; 15782282792aSdrh } 15792282792aSdrh } 15802282792aSdrh if( i>=pParse->nAgg ){ 15812282792aSdrh i = appendAggInfo(pParse); 15822282792aSdrh if( i<0 ) return 1; 15832282792aSdrh pParse->aAgg[i].isAgg = 1; 15842282792aSdrh pParse->aAgg[i].pExpr = pExpr; 1585*4adee20fSdanielk1977 pParse->aAgg[i].pFunc = sqlite3FindFunction(pParse->db, 15866977fea8Sdrh pExpr->token.z, pExpr->token.n, 1587f55f25f0Sdrh pExpr->pList ? pExpr->pList->nExpr : 0, 0); 15882282792aSdrh } 15892282792aSdrh pExpr->iAgg = i; 15902282792aSdrh break; 15912282792aSdrh } 15922282792aSdrh default: { 15932282792aSdrh if( pExpr->pLeft ){ 1594*4adee20fSdanielk1977 nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pLeft); 15952282792aSdrh } 15962282792aSdrh if( nErr==0 && pExpr->pRight ){ 1597*4adee20fSdanielk1977 nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pRight); 15982282792aSdrh } 15992282792aSdrh if( nErr==0 && pExpr->pList ){ 16002282792aSdrh int n = pExpr->pList->nExpr; 16012282792aSdrh int i; 16022282792aSdrh for(i=0; nErr==0 && i<n; i++){ 1603*4adee20fSdanielk1977 nErr = sqlite3ExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 16042282792aSdrh } 16052282792aSdrh } 16062282792aSdrh break; 16072282792aSdrh } 16082282792aSdrh } 16092282792aSdrh return nErr; 16102282792aSdrh } 16118e0a2f90Sdrh 16128e0a2f90Sdrh /* 16138e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 16140bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that 16158e0a2f90Sdrh ** function, or return NULL if the function does not exist. 16168e0a2f90Sdrh ** 16170bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef 16188e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 16198e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 16208e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 16218e0a2f90Sdrh ** any number of arguments will be returned. 16228e0a2f90Sdrh ** 16238e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 16248e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 16258e0a2f90Sdrh ** or xStep is non-zero. 16268e0a2f90Sdrh */ 1627*4adee20fSdanielk1977 FuncDef *sqlite3FindFunction( 16288e0a2f90Sdrh sqlite *db, /* An open database */ 16298e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 16308e0a2f90Sdrh int nName, /* Number of characters in the name */ 16318e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 16328e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 16338e0a2f90Sdrh ){ 16340bce8354Sdrh FuncDef *pFirst, *p, *pMaybe; 1635*4adee20fSdanielk1977 pFirst = p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName, nName); 16361350b030Sdrh if( p && !createFlag && nArg<0 ){ 16378e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 16388e0a2f90Sdrh return p; 16398e0a2f90Sdrh } 16408e0a2f90Sdrh pMaybe = 0; 16418e0a2f90Sdrh while( p && p->nArg!=nArg ){ 16428e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 16438e0a2f90Sdrh p = p->pNext; 16448e0a2f90Sdrh } 16458e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 16468e0a2f90Sdrh return 0; 16478e0a2f90Sdrh } 16488e0a2f90Sdrh if( p==0 && pMaybe ){ 16498e0a2f90Sdrh assert( createFlag==0 ); 16508e0a2f90Sdrh return pMaybe; 16518e0a2f90Sdrh } 165289425d5eSdrh if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){ 16538e0a2f90Sdrh p->nArg = nArg; 16548e0a2f90Sdrh p->pNext = pFirst; 1655c9b84a1fSdrh p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC; 1656*4adee20fSdanielk1977 sqlite3HashInsert(&db->aFunc, zName, nName, (void*)p); 16578e0a2f90Sdrh } 16588e0a2f90Sdrh return p; 16598e0a2f90Sdrh } 1660*4adee20fSdanielk1977 1661*4adee20fSdanielk1977 1662*4adee20fSdanielk1977 1663