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*8f619ccdSdrh ** $Id: expr.c,v 1.81 2002/09/08 00:04:52 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 ){ 29a76b5dfcSdrh sqliteExprDelete(pLeft); 30a76b5dfcSdrh sqliteExprDelete(pRight); 31a76b5dfcSdrh return 0; 32a76b5dfcSdrh } 33a76b5dfcSdrh pNew->op = op; 34a76b5dfcSdrh pNew->pLeft = pLeft; 35a76b5dfcSdrh pNew->pRight = pRight; 36a76b5dfcSdrh if( pToken ){ 374b59ab5eSdrh assert( pToken->dyn==0 ); 38a76b5dfcSdrh pNew->token = *pToken; 394b59ab5eSdrh pNew->token.base = 1; 404b59ab5eSdrh }else if( pLeft && pRight ){ 414b59ab5eSdrh sqliteExprSpan(pNew, &pLeft->token, &pRight->token); 42a76b5dfcSdrh }else{ 434b59ab5eSdrh pNew->token.dyn = 0; 444b59ab5eSdrh pNew->token.base = 1; 45a76b5dfcSdrh pNew->token.z = 0; 46a76b5dfcSdrh pNew->token.n = 0; 47a76b5dfcSdrh } 48a76b5dfcSdrh return pNew; 49a76b5dfcSdrh } 50a76b5dfcSdrh 51a76b5dfcSdrh /* 52a76b5dfcSdrh ** Set the Expr.token field of the given expression to span all 53a76b5dfcSdrh ** text between the two given tokens. 54a76b5dfcSdrh */ 55a76b5dfcSdrh void sqliteExprSpan(Expr *pExpr, Token *pLeft, Token *pRight){ 56a76b5dfcSdrh if( pExpr ){ 574b59ab5eSdrh assert( pExpr->token.dyn==0 ); 584b59ab5eSdrh if( pLeft->dyn==0 && pRight->dyn==0 ){ 594b59ab5eSdrh pExpr->token.z = pLeft->z; 604b59ab5eSdrh pExpr->token.n = pRight->n + Addr(pRight->z) - Addr(pLeft->z); 614b59ab5eSdrh pExpr->token.base = 0; 624b59ab5eSdrh }else{ 634b59ab5eSdrh pExpr->token.z = 0; 644b59ab5eSdrh pExpr->token.n = 0; 654b59ab5eSdrh pExpr->token.dyn = 0; 664b59ab5eSdrh pExpr->token.base = 0; 674b59ab5eSdrh } 68a76b5dfcSdrh } 69a76b5dfcSdrh } 70a76b5dfcSdrh 71a76b5dfcSdrh /* 72a76b5dfcSdrh ** Construct a new expression node for a function with multiple 73a76b5dfcSdrh ** arguments. 74a76b5dfcSdrh */ 75a76b5dfcSdrh Expr *sqliteExprFunction(ExprList *pList, Token *pToken){ 76a76b5dfcSdrh Expr *pNew; 77a76b5dfcSdrh pNew = sqliteMalloc( sizeof(Expr) ); 78a76b5dfcSdrh if( pNew==0 ){ 79a76b5dfcSdrh sqliteExprListDelete(pList); 80a76b5dfcSdrh return 0; 81a76b5dfcSdrh } 82a76b5dfcSdrh pNew->op = TK_FUNCTION; 83a76b5dfcSdrh pNew->pList = pList; 844b59ab5eSdrh 854b59ab5eSdrh /* Expr.token.n is the length of the entire function 864b59ab5eSdrh ** call, including the function arguments. The parser 874b59ab5eSdrh ** will extend token.n to cover the either length of the string. 884b59ab5eSdrh ** Expr.nFuncName is the length of just the function name. 894b59ab5eSdrh */ 904b59ab5eSdrh pNew->token.dyn = 0; 914b59ab5eSdrh pNew->token.base = 1; 92a76b5dfcSdrh if( pToken ){ 934b59ab5eSdrh assert( pToken->dyn==0 ); 94a76b5dfcSdrh pNew->token = *pToken; 954b59ab5eSdrh pNew->nFuncName = pToken->n>255 ? 255 : pToken->n; 96a76b5dfcSdrh }else{ 97a76b5dfcSdrh pNew->token.z = 0; 98a76b5dfcSdrh pNew->token.n = 0; 99a76b5dfcSdrh } 100a76b5dfcSdrh return pNew; 101a76b5dfcSdrh } 102a76b5dfcSdrh 103a76b5dfcSdrh /* 104a2e00042Sdrh ** Recursively delete an expression tree. 105a2e00042Sdrh */ 106a2e00042Sdrh void sqliteExprDelete(Expr *p){ 107a2e00042Sdrh if( p==0 ) return; 1084b59ab5eSdrh if( p->token.dyn && p->token.z ) sqliteFree((char*)p->token.z); 109a2e00042Sdrh if( p->pLeft ) sqliteExprDelete(p->pLeft); 110a2e00042Sdrh if( p->pRight ) sqliteExprDelete(p->pRight); 111a2e00042Sdrh if( p->pList ) sqliteExprListDelete(p->pList); 112a2e00042Sdrh if( p->pSelect ) sqliteSelectDelete(p->pSelect); 113a2e00042Sdrh sqliteFree(p); 114a2e00042Sdrh } 115a2e00042Sdrh 116a76b5dfcSdrh 117a76b5dfcSdrh /* 118ff78bd2fSdrh ** The following group of routines make deep copies of expressions, 119ff78bd2fSdrh ** expression lists, ID lists, and select statements. The copies can 120ff78bd2fSdrh ** be deleted (by being passed to their respective ...Delete() routines) 121ff78bd2fSdrh ** without effecting the originals. 122ff78bd2fSdrh ** 123ad3cab52Sdrh ** The expression list, ID, and source lists return by sqliteExprListDup(), 124ad3cab52Sdrh ** sqliteIdListDup(), and sqliteSrcListDup() can not be further expanded 125ad3cab52Sdrh ** by subsequent calls to sqlite*ListAppend() routines. 126ff78bd2fSdrh ** 127ad3cab52Sdrh ** Any tables that the SrcList might point to are not duplicated. 128ff78bd2fSdrh */ 129ff78bd2fSdrh Expr *sqliteExprDup(Expr *p){ 130ff78bd2fSdrh Expr *pNew; 131ff78bd2fSdrh if( p==0 ) return 0; 132ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 133ff78bd2fSdrh if( pNew==0 ) return 0; 1343b167c75Sdrh memcpy(pNew, p, sizeof(*pNew)); 1354b59ab5eSdrh /* Only make a copy of the token if it is a base token (meaning that 1364b59ab5eSdrh ** it covers a single term of an expression - not two or more terms) 1374b59ab5eSdrh ** or if it is already dynamically allocated. So, for example, in 1384b59ab5eSdrh ** a complex expression like "a+b+c", the token "b" would be duplicated 1394b59ab5eSdrh ** but "a+b" would not be. */ 1404b59ab5eSdrh if( p->token.z!=0 && (p->token.base || p->token.dyn) ){ 1414b59ab5eSdrh pNew->token.z = sqliteStrDup(p->token.z); 1424b59ab5eSdrh pNew->token.dyn = 1; 1434b59ab5eSdrh }else{ 1444b59ab5eSdrh pNew->token.z = 0; 1454b59ab5eSdrh pNew->token.n = 0; 1464b59ab5eSdrh pNew->token.dyn = 0; 1474b59ab5eSdrh } 148ff78bd2fSdrh pNew->pLeft = sqliteExprDup(p->pLeft); 149ff78bd2fSdrh pNew->pRight = sqliteExprDup(p->pRight); 150ff78bd2fSdrh pNew->pList = sqliteExprListDup(p->pList); 151ff78bd2fSdrh pNew->pSelect = sqliteSelectDup(p->pSelect); 152ff78bd2fSdrh return pNew; 153ff78bd2fSdrh } 1544b59ab5eSdrh void sqliteTokenCopy(Token *pTo, Token *pFrom){ 1554b59ab5eSdrh if( pTo->dyn ) sqliteFree((char*)pTo->z); 1564b59ab5eSdrh pTo->base = pFrom->base; 1574b59ab5eSdrh if( pFrom->z ){ 1584b59ab5eSdrh pTo->n = pFrom->n; 1594b59ab5eSdrh pTo->z = sqliteStrNDup(pFrom->z, pFrom->n); 1604b59ab5eSdrh pTo->dyn = 1; 1614b59ab5eSdrh }else{ 1624b59ab5eSdrh pTo->n = 0; 1634b59ab5eSdrh pTo->z = 0; 1644b59ab5eSdrh pTo->dyn = 0; 1654b59ab5eSdrh } 1664b59ab5eSdrh } 167ff78bd2fSdrh ExprList *sqliteExprListDup(ExprList *p){ 168ff78bd2fSdrh ExprList *pNew; 169ff78bd2fSdrh int i; 170ff78bd2fSdrh if( p==0 ) return 0; 171ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 172ff78bd2fSdrh if( pNew==0 ) return 0; 173ff78bd2fSdrh pNew->nExpr = p->nExpr; 174ff78bd2fSdrh pNew->a = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); 175e4697f5eSdrh if( pNew->a==0 ) return 0; 176ff78bd2fSdrh for(i=0; i<p->nExpr; i++){ 1774b59ab5eSdrh Expr *pNewExpr, *pOldExpr; 1784b59ab5eSdrh pNew->a[i].pExpr = pNewExpr = sqliteExprDup(pOldExpr = p->a[i].pExpr); 1794b59ab5eSdrh if( pOldExpr->token.z!=0 && pNewExpr && pNewExpr->token.z==0 ){ 1804b59ab5eSdrh /* Always make a copy of the token for top-level expressions in the 1814b59ab5eSdrh ** expression list. The logic in SELECT processing that determines 1824b59ab5eSdrh ** the names of columns in the result set needs this information */ 1834b59ab5eSdrh sqliteTokenCopy(&pNew->a[i].pExpr->token, &p->a[i].pExpr->token); 1844b59ab5eSdrh } 185ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 186ff78bd2fSdrh pNew->a[i].sortOrder = p->a[i].sortOrder; 187ff78bd2fSdrh pNew->a[i].isAgg = p->a[i].isAgg; 188ff78bd2fSdrh pNew->a[i].done = 0; 189ff78bd2fSdrh } 190ff78bd2fSdrh return pNew; 191ff78bd2fSdrh } 192ad3cab52Sdrh SrcList *sqliteSrcListDup(SrcList *p){ 193ad3cab52Sdrh SrcList *pNew; 194ad3cab52Sdrh int i; 195ad3cab52Sdrh if( p==0 ) return 0; 196ad3cab52Sdrh pNew = sqliteMalloc( sizeof(*pNew) ); 197ad3cab52Sdrh if( pNew==0 ) return 0; 198ad3cab52Sdrh pNew->nSrc = p->nSrc; 199ad3cab52Sdrh pNew->a = sqliteMalloc( p->nSrc*sizeof(p->a[0]) ); 2006f34903eSdanielk1977 if( pNew->a==0 && p->nSrc != 0 ) return 0; 201ad3cab52Sdrh for(i=0; i<p->nSrc; i++){ 202ad3cab52Sdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 203ad3cab52Sdrh pNew->a[i].zAlias = sqliteStrDup(p->a[i].zAlias); 204ad3cab52Sdrh pNew->a[i].jointype = p->a[i].jointype; 205ad3cab52Sdrh pNew->a[i].pTab = 0; 206ad3cab52Sdrh pNew->a[i].pSelect = sqliteSelectDup(p->a[i].pSelect); 207ad3cab52Sdrh pNew->a[i].pOn = sqliteExprDup(p->a[i].pOn); 208ad3cab52Sdrh pNew->a[i].pUsing = sqliteIdListDup(p->a[i].pUsing); 209ad3cab52Sdrh } 210ad3cab52Sdrh return pNew; 211ad3cab52Sdrh } 212ff78bd2fSdrh IdList *sqliteIdListDup(IdList *p){ 213ff78bd2fSdrh IdList *pNew; 214ff78bd2fSdrh int i; 215ff78bd2fSdrh if( p==0 ) return 0; 216ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*pNew) ); 217ff78bd2fSdrh if( pNew==0 ) return 0; 218ff78bd2fSdrh pNew->nId = p->nId; 219ff78bd2fSdrh pNew->a = sqliteMalloc( p->nId*sizeof(p->a[0]) ); 220e4697f5eSdrh if( pNew->a==0 ) return 0; 221ff78bd2fSdrh for(i=0; i<p->nId; i++){ 222ff78bd2fSdrh pNew->a[i].zName = sqliteStrDup(p->a[i].zName); 223ff78bd2fSdrh pNew->a[i].idx = p->a[i].idx; 224ff78bd2fSdrh } 225ff78bd2fSdrh return pNew; 226ff78bd2fSdrh } 227ff78bd2fSdrh Select *sqliteSelectDup(Select *p){ 228ff78bd2fSdrh Select *pNew; 229ff78bd2fSdrh if( p==0 ) return 0; 230ff78bd2fSdrh pNew = sqliteMalloc( sizeof(*p) ); 231ff78bd2fSdrh if( pNew==0 ) return 0; 232ff78bd2fSdrh pNew->isDistinct = p->isDistinct; 233ff78bd2fSdrh pNew->pEList = sqliteExprListDup(p->pEList); 234ad3cab52Sdrh pNew->pSrc = sqliteSrcListDup(p->pSrc); 235ff78bd2fSdrh pNew->pWhere = sqliteExprDup(p->pWhere); 236ff78bd2fSdrh pNew->pGroupBy = sqliteExprListDup(p->pGroupBy); 237ff78bd2fSdrh pNew->pHaving = sqliteExprDup(p->pHaving); 238ff78bd2fSdrh pNew->pOrderBy = sqliteExprListDup(p->pOrderBy); 239ff78bd2fSdrh pNew->op = p->op; 240ff78bd2fSdrh pNew->pPrior = sqliteSelectDup(p->pPrior); 241ff78bd2fSdrh pNew->nLimit = p->nLimit; 242ff78bd2fSdrh pNew->nOffset = p->nOffset; 243ff78bd2fSdrh pNew->zSelect = 0; 244ff78bd2fSdrh return pNew; 245ff78bd2fSdrh } 246ff78bd2fSdrh 247ff78bd2fSdrh 248ff78bd2fSdrh /* 249a76b5dfcSdrh ** Add a new element to the end of an expression list. If pList is 250a76b5dfcSdrh ** initially NULL, then create a new expression list. 251a76b5dfcSdrh */ 252a76b5dfcSdrh ExprList *sqliteExprListAppend(ExprList *pList, Expr *pExpr, Token *pName){ 253a76b5dfcSdrh int i; 254a76b5dfcSdrh if( pList==0 ){ 255a76b5dfcSdrh pList = sqliteMalloc( sizeof(ExprList) ); 256a76b5dfcSdrh if( pList==0 ){ 257a76b5dfcSdrh sqliteExprDelete(pExpr); 258a76b5dfcSdrh return 0; 259a76b5dfcSdrh } 260a76b5dfcSdrh } 261a76b5dfcSdrh if( (pList->nExpr & 7)==0 ){ 262a76b5dfcSdrh int n = pList->nExpr + 8; 263a76b5dfcSdrh struct ExprList_item *a; 264a76b5dfcSdrh a = sqliteRealloc(pList->a, n*sizeof(pList->a[0])); 265a76b5dfcSdrh if( a==0 ){ 266a76b5dfcSdrh sqliteExprDelete(pExpr); 267a76b5dfcSdrh return pList; 268a76b5dfcSdrh } 269a76b5dfcSdrh pList->a = a; 270a76b5dfcSdrh } 271a76b5dfcSdrh if( pExpr || pName ){ 272a76b5dfcSdrh i = pList->nExpr++; 273a76b5dfcSdrh pList->a[i].pExpr = pExpr; 274a76b5dfcSdrh pList->a[i].zName = 0; 275a76b5dfcSdrh if( pName ){ 276a76b5dfcSdrh sqliteSetNString(&pList->a[i].zName, pName->z, pName->n, 0); 277a76b5dfcSdrh sqliteDequote(pList->a[i].zName); 278a76b5dfcSdrh } 279a76b5dfcSdrh } 280a76b5dfcSdrh return pList; 281a76b5dfcSdrh } 282a76b5dfcSdrh 283a76b5dfcSdrh /* 284a76b5dfcSdrh ** Delete an entire expression list. 285a76b5dfcSdrh */ 286a76b5dfcSdrh void sqliteExprListDelete(ExprList *pList){ 287a76b5dfcSdrh int i; 288a76b5dfcSdrh if( pList==0 ) return; 289a76b5dfcSdrh for(i=0; i<pList->nExpr; i++){ 290a76b5dfcSdrh sqliteExprDelete(pList->a[i].pExpr); 291a76b5dfcSdrh sqliteFree(pList->a[i].zName); 292a76b5dfcSdrh } 293a76b5dfcSdrh sqliteFree(pList->a); 294a76b5dfcSdrh sqliteFree(pList); 295a76b5dfcSdrh } 296a76b5dfcSdrh 297a76b5dfcSdrh /* 298fef5208cSdrh ** Walk an expression tree. Return 1 if the expression is constant 299fef5208cSdrh ** and 0 if it involves variables. 3002398937bSdrh ** 3012398937bSdrh ** For the purposes of this function, a double-quoted string (ex: "abc") 3022398937bSdrh ** is considered a variable but a single-quoted string (ex: 'abc') is 3032398937bSdrh ** a constant. 304fef5208cSdrh */ 3059208643dSdrh int sqliteExprIsConstant(Expr *p){ 306fef5208cSdrh switch( p->op ){ 307fef5208cSdrh case TK_ID: 308967e8b73Sdrh case TK_COLUMN: 309fef5208cSdrh case TK_DOT: 310fef5208cSdrh return 0; 3112398937bSdrh case TK_STRING: 3122398937bSdrh return p->token.z[0]=='\''; 3139208643dSdrh case TK_INTEGER: 3149208643dSdrh case TK_FLOAT: 3159208643dSdrh return 1; 316fef5208cSdrh default: { 3179208643dSdrh if( p->pLeft && !sqliteExprIsConstant(p->pLeft) ) return 0; 3189208643dSdrh if( p->pRight && !sqliteExprIsConstant(p->pRight) ) return 0; 319fef5208cSdrh if( p->pList ){ 320fef5208cSdrh int i; 321fef5208cSdrh for(i=0; i<p->pList->nExpr; i++){ 3229208643dSdrh if( !sqliteExprIsConstant(p->pList->a[i].pExpr) ) return 0; 323fef5208cSdrh } 324fef5208cSdrh } 3259208643dSdrh return p->pLeft!=0 || p->pRight!=0 || (p->pList && p->pList->nExpr>0); 326fef5208cSdrh } 327fef5208cSdrh } 3289208643dSdrh return 0; 329fef5208cSdrh } 330fef5208cSdrh 331fef5208cSdrh /* 332e4de1febSdrh ** If the given expression codes a constant integer, return 1 and put 333e4de1febSdrh ** the value of the integer in *pValue. If the expression is not an 334e4de1febSdrh ** integer, return 0 and leave *pValue unchanged. 335e4de1febSdrh */ 336e4de1febSdrh int sqliteExprIsInteger(Expr *p, int *pValue){ 337e4de1febSdrh switch( p->op ){ 338e4de1febSdrh case TK_INTEGER: { 339e4de1febSdrh *pValue = atoi(p->token.z); 340e4de1febSdrh return 1; 341e4de1febSdrh } 342e4de1febSdrh case TK_STRING: { 343bd790ee3Sdrh const char *z = p->token.z; 344e4de1febSdrh int n = p->token.n; 345bd790ee3Sdrh if( n>0 && z[0]=='-' ){ z++; n--; } 346e4de1febSdrh while( n>0 && *z && isdigit(*z) ){ z++; n--; } 347e4de1febSdrh if( n==0 ){ 348e4de1febSdrh *pValue = atoi(p->token.z); 349e4de1febSdrh return 1; 350e4de1febSdrh } 351e4de1febSdrh break; 352e4de1febSdrh } 3534b59ab5eSdrh case TK_UPLUS: { 3544b59ab5eSdrh return sqliteExprIsInteger(p->pLeft, pValue); 3554b59ab5eSdrh } 356e4de1febSdrh case TK_UMINUS: { 357e4de1febSdrh int v; 358e4de1febSdrh if( sqliteExprIsInteger(p->pLeft, &v) ){ 359e4de1febSdrh *pValue = -v; 360e4de1febSdrh return 1; 361e4de1febSdrh } 362e4de1febSdrh break; 363e4de1febSdrh } 364e4de1febSdrh default: break; 365e4de1febSdrh } 366e4de1febSdrh return 0; 367e4de1febSdrh } 368e4de1febSdrh 369e4de1febSdrh /* 370c4a3c779Sdrh ** Return TRUE if the given string is a row-id column name. 371c4a3c779Sdrh */ 372a9f9d1c0Sdrh int sqliteIsRowid(const char *z){ 373c4a3c779Sdrh if( sqliteStrICmp(z, "_ROWID_")==0 ) return 1; 374c4a3c779Sdrh if( sqliteStrICmp(z, "ROWID")==0 ) return 1; 375c4a3c779Sdrh if( sqliteStrICmp(z, "OID")==0 ) return 1; 376c4a3c779Sdrh return 0; 377c4a3c779Sdrh } 378c4a3c779Sdrh 379c4a3c779Sdrh /* 380cce7d176Sdrh ** This routine walks an expression tree and resolves references to 381967e8b73Sdrh ** table columns. Nodes of the form ID.ID or ID resolve into an 382aacc543eSdrh ** index to the table in the table list and a column offset. The 383aacc543eSdrh ** Expr.opcode for such nodes is changed to TK_COLUMN. The Expr.iTable 384aacc543eSdrh ** value is changed to the index of the referenced table in pTabList 385832508b7Sdrh ** plus the "base" value. The base value will ultimately become the 386aacc543eSdrh ** VDBE cursor number for a cursor that is pointing into the referenced 387aacc543eSdrh ** table. The Expr.iColumn value is changed to the index of the column 388aacc543eSdrh ** of the referenced table. The Expr.iColumn value for the special 389aacc543eSdrh ** ROWID column is -1. Any INTEGER PRIMARY KEY column is tried as an 390aacc543eSdrh ** alias for ROWID. 39119a775c2Sdrh ** 392fef5208cSdrh ** We also check for instances of the IN operator. IN comes in two 393fef5208cSdrh ** forms: 394fef5208cSdrh ** 395fef5208cSdrh ** expr IN (exprlist) 396fef5208cSdrh ** and 397fef5208cSdrh ** expr IN (SELECT ...) 398fef5208cSdrh ** 399fef5208cSdrh ** The first form is handled by creating a set holding the list 400fef5208cSdrh ** of allowed values. The second form causes the SELECT to generate 401fef5208cSdrh ** a temporary table. 402fef5208cSdrh ** 403fef5208cSdrh ** This routine also looks for scalar SELECTs that are part of an expression. 40419a775c2Sdrh ** If it finds any, it generates code to write the value of that select 40519a775c2Sdrh ** into a memory cell. 406cce7d176Sdrh ** 407967e8b73Sdrh ** Unknown columns or tables provoke an error. The function returns 408cce7d176Sdrh ** the number of errors seen and leaves an error message on pParse->zErrMsg. 409cce7d176Sdrh */ 410a2e00042Sdrh int sqliteExprResolveIds( 411a2e00042Sdrh Parse *pParse, /* The parser context */ 412832508b7Sdrh int base, /* VDBE cursor number for first entry in pTabList */ 413ad3cab52Sdrh SrcList *pTabList, /* List of tables used to resolve column names */ 414a2e00042Sdrh ExprList *pEList, /* List of expressions used to resolve "AS" */ 415a2e00042Sdrh Expr *pExpr /* The expression to be analyzed. */ 416a2e00042Sdrh ){ 417daffd0e5Sdrh if( pExpr==0 || pTabList==0 ) return 0; 418ad3cab52Sdrh assert( base+pTabList->nSrc<=pParse->nTab ); 419cce7d176Sdrh switch( pExpr->op ){ 4202398937bSdrh /* Double-quoted strings (ex: "abc") are used as identifiers if 4212398937bSdrh ** possible. Otherwise they remain as strings. Single-quoted 4222398937bSdrh ** strings (ex: 'abc') are always string literals. 4232398937bSdrh */ 4242398937bSdrh case TK_STRING: { 4252398937bSdrh if( pExpr->token.z[0]=='\'' ) break; 4262398937bSdrh /* Fall thru into the TK_ID case if this is a double-quoted string */ 4272398937bSdrh } 428a2e00042Sdrh /* A lone identifier. Try and match it as follows: 429a2e00042Sdrh ** 430a2e00042Sdrh ** 1. To the name of a column of one of the tables in pTabList 431a2e00042Sdrh ** 432a2e00042Sdrh ** 2. To the right side of an AS keyword in the column list of 433a2e00042Sdrh ** a SELECT statement. (For example, match against 'x' in 434a2e00042Sdrh ** "SELECT a+b AS 'x' FROM t1".) 435a2e00042Sdrh ** 436a2e00042Sdrh ** 3. One of the special names "ROWID", "OID", or "_ROWID_". 437a2e00042Sdrh */ 438cce7d176Sdrh case TK_ID: { 439cce7d176Sdrh int cnt = 0; /* Number of matches */ 440cce7d176Sdrh int i; /* Loop counter */ 441a76b5dfcSdrh char *z; 442a76b5dfcSdrh assert( pExpr->token.z ); 443a76b5dfcSdrh z = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 4442f4392ffSdrh sqliteDequote(z); 445daffd0e5Sdrh if( z==0 ) return 1; 446ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 447cce7d176Sdrh int j; 448cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 449cce7d176Sdrh if( pTab==0 ) continue; 450417be79cSdrh assert( pTab->nCol>0 ); 451cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 4527020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, z)==0 ){ 453cce7d176Sdrh cnt++; 454832508b7Sdrh pExpr->iTable = i + base; 4554a32431cSdrh if( j==pTab->iPKey ){ 4564a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 4574a32431cSdrh pExpr->iColumn = -1; 458c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 4594a32431cSdrh }else{ 460967e8b73Sdrh pExpr->iColumn = j; 461c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 462cce7d176Sdrh } 463a2e00042Sdrh pExpr->op = TK_COLUMN; 464a2e00042Sdrh } 465a2e00042Sdrh } 466a2e00042Sdrh } 467a2e00042Sdrh if( cnt==0 && pEList!=0 ){ 468a2e00042Sdrh int j; 469a2e00042Sdrh for(j=0; j<pEList->nExpr; j++){ 470a2e00042Sdrh char *zAs = pEList->a[j].zName; 471a2e00042Sdrh if( zAs!=0 && sqliteStrICmp(zAs, z)==0 ){ 472a2e00042Sdrh cnt++; 473a2e00042Sdrh assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 474a2e00042Sdrh pExpr->op = TK_AS; 475a2e00042Sdrh pExpr->iColumn = j; 47675148a27Sdrh pExpr->pLeft = sqliteExprDup(pEList->a[j].pExpr); 477cce7d176Sdrh } 478cce7d176Sdrh } 4794a32431cSdrh } 480c4a3c779Sdrh if( cnt==0 && sqliteIsRowid(z) ){ 481c4a3c779Sdrh pExpr->iColumn = -1; 482832508b7Sdrh pExpr->iTable = base; 483ad3cab52Sdrh cnt = 1 + (pTabList->nSrc>1); 484a2e00042Sdrh pExpr->op = TK_COLUMN; 485c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 486c4a3c779Sdrh } 487cce7d176Sdrh sqliteFree(z); 4882398937bSdrh if( cnt==0 && pExpr->token.z[0]!='"' ){ 489967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 490cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 491cce7d176Sdrh pParse->nErr++; 492cce7d176Sdrh return 1; 493cce7d176Sdrh }else if( cnt>1 ){ 494967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 495cce7d176Sdrh pExpr->token.z, pExpr->token.n, 0); 496cce7d176Sdrh pParse->nErr++; 497cce7d176Sdrh return 1; 498cce7d176Sdrh } 499cce7d176Sdrh break; 500cce7d176Sdrh } 501cce7d176Sdrh 502967e8b73Sdrh /* A table name and column name: ID.ID */ 503cce7d176Sdrh case TK_DOT: { 504cce7d176Sdrh int cnt = 0; /* Number of matches */ 505c4a3c779Sdrh int cntTab = 0; /* Number of matching tables */ 506cce7d176Sdrh int i; /* Loop counter */ 507cce7d176Sdrh Expr *pLeft, *pRight; /* Left and right subbranches of the expr */ 508cce7d176Sdrh char *zLeft, *zRight; /* Text of an identifier */ 509cce7d176Sdrh 510cce7d176Sdrh pLeft = pExpr->pLeft; 511cce7d176Sdrh pRight = pExpr->pRight; 512a76b5dfcSdrh assert( pLeft && pLeft->op==TK_ID && pLeft->token.z ); 513a76b5dfcSdrh assert( pRight && pRight->op==TK_ID && pRight->token.z ); 5146e142f54Sdrh zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n); 5156e142f54Sdrh zRight = sqliteStrNDup(pRight->token.z, pRight->token.n); 516daffd0e5Sdrh if( zLeft==0 || zRight==0 ){ 517daffd0e5Sdrh sqliteFree(zLeft); 518daffd0e5Sdrh sqliteFree(zRight); 519daffd0e5Sdrh return 1; 520daffd0e5Sdrh } 52187c40e88Sdrh sqliteDequote(zLeft); 52287c40e88Sdrh sqliteDequote(zRight); 523c4a3c779Sdrh pExpr->iTable = -1; 524ad3cab52Sdrh for(i=0; i<pTabList->nSrc; i++){ 525cce7d176Sdrh int j; 526cce7d176Sdrh char *zTab; 527cce7d176Sdrh Table *pTab = pTabList->a[i].pTab; 528cce7d176Sdrh if( pTab==0 ) continue; 529417be79cSdrh assert( pTab->nCol>0 ); 530cce7d176Sdrh if( pTabList->a[i].zAlias ){ 531cce7d176Sdrh zTab = pTabList->a[i].zAlias; 532cce7d176Sdrh }else{ 533cce7d176Sdrh zTab = pTab->zName; 534cce7d176Sdrh } 535094b2bbfSdrh if( zTab==0 || sqliteStrICmp(zTab, zLeft)!=0 ) continue; 536832508b7Sdrh if( 0==(cntTab++) ) pExpr->iTable = i + base; 537cce7d176Sdrh for(j=0; j<pTab->nCol; j++){ 5387020f651Sdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 539cce7d176Sdrh cnt++; 540832508b7Sdrh pExpr->iTable = i + base; 5414a32431cSdrh if( j==pTab->iPKey ){ 5424a32431cSdrh /* Substitute the record number for the INTEGER PRIMARY KEY */ 5434a32431cSdrh pExpr->iColumn = -1; 5444a32431cSdrh }else{ 545967e8b73Sdrh pExpr->iColumn = j; 546cce7d176Sdrh } 547c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 548cce7d176Sdrh } 549cce7d176Sdrh } 5504a32431cSdrh } 551c3f9bad2Sdanielk1977 552c3f9bad2Sdanielk1977 /* If we have not already resolved this *.* expression, then maybe 553c3f9bad2Sdanielk1977 * it is a new.* or old.* trigger argument reference */ 554c3f9bad2Sdanielk1977 if( cnt == 0 && pParse->trigStack != 0 ){ 555f29ce559Sdanielk1977 TriggerStack *pTriggerStack = pParse->trigStack; 556c3f9bad2Sdanielk1977 int t = 0; 557f29ce559Sdanielk1977 if( pTriggerStack->newIdx != -1 && sqliteStrICmp("new", zLeft) == 0 ){ 558f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->newIdx; 559c3f9bad2Sdanielk1977 cntTab++; 560c3f9bad2Sdanielk1977 t = 1; 561c3f9bad2Sdanielk1977 } 562f29ce559Sdanielk1977 if( pTriggerStack->oldIdx != -1 && sqliteStrICmp("old", zLeft) == 0 ){ 563f29ce559Sdanielk1977 pExpr->iTable = pTriggerStack->oldIdx; 564c3f9bad2Sdanielk1977 cntTab++; 565c3f9bad2Sdanielk1977 t = 1; 566c3f9bad2Sdanielk1977 } 567c3f9bad2Sdanielk1977 568f29ce559Sdanielk1977 if( t ){ 569f29ce559Sdanielk1977 int j; 570c9b84a1fSdrh Table *pTab = pTriggerStack->pTab; 571c9b84a1fSdrh for(j=0; j < pTab->nCol; j++) { 572c9b84a1fSdrh if( sqliteStrICmp(pTab->aCol[j].zName, zRight)==0 ){ 573c3f9bad2Sdanielk1977 cnt++; 574c3f9bad2Sdanielk1977 pExpr->iColumn = j; 575c9b84a1fSdrh pExpr->dataType = pTab->aCol[j].sortOrder & SQLITE_SO_TYPEMASK; 576c3f9bad2Sdanielk1977 } 577c3f9bad2Sdanielk1977 } 578c3f9bad2Sdanielk1977 } 579f29ce559Sdanielk1977 } 580c3f9bad2Sdanielk1977 581c4a3c779Sdrh if( cnt==0 && cntTab==1 && sqliteIsRowid(zRight) ){ 582c4a3c779Sdrh cnt = 1; 583c4a3c779Sdrh pExpr->iColumn = -1; 584c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 585c4a3c779Sdrh } 586cce7d176Sdrh sqliteFree(zLeft); 587cce7d176Sdrh sqliteFree(zRight); 588cce7d176Sdrh if( cnt==0 ){ 589967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "no such column: ", -1, 590cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 591cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 592cce7d176Sdrh pParse->nErr++; 593cce7d176Sdrh return 1; 594cce7d176Sdrh }else if( cnt>1 ){ 595967e8b73Sdrh sqliteSetNString(&pParse->zErrMsg, "ambiguous column name: ", -1, 596cce7d176Sdrh pLeft->token.z, pLeft->token.n, ".", 1, 597cce7d176Sdrh pRight->token.z, pRight->token.n, 0); 598cce7d176Sdrh pParse->nErr++; 599cce7d176Sdrh return 1; 600cce7d176Sdrh } 601cce7d176Sdrh sqliteExprDelete(pLeft); 602cce7d176Sdrh pExpr->pLeft = 0; 603cce7d176Sdrh sqliteExprDelete(pRight); 604cce7d176Sdrh pExpr->pRight = 0; 605967e8b73Sdrh pExpr->op = TK_COLUMN; 606cce7d176Sdrh break; 607cce7d176Sdrh } 608cce7d176Sdrh 609fef5208cSdrh case TK_IN: { 610d8bc7086Sdrh Vdbe *v = sqliteGetVdbe(pParse); 611fef5208cSdrh if( v==0 ) return 1; 612832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 613cfab11bcSdrh return 1; 614cfab11bcSdrh } 615fef5208cSdrh if( pExpr->pSelect ){ 616fef5208cSdrh /* Case 1: expr IN (SELECT ...) 617fef5208cSdrh ** 618fef5208cSdrh ** Generate code to write the results of the select into a temporary 6194794b980Sdrh ** table. The cursor number of the temporary table has already 6204794b980Sdrh ** been put in iTable by sqliteExprResolveInSelect(). 621fef5208cSdrh */ 622832508b7Sdrh pExpr->iTable = pParse->nTab++; 623c6b52df3Sdrh sqliteVdbeAddOp(v, OP_OpenTemp, pExpr->iTable, 1); 624832508b7Sdrh sqliteSelect(pParse, pExpr->pSelect, SRT_Set, pExpr->iTable, 0,0,0); 625fef5208cSdrh }else if( pExpr->pList ){ 626fef5208cSdrh /* Case 2: expr IN (exprlist) 627fef5208cSdrh ** 628fef5208cSdrh ** Create a set to put the exprlist values in. The Set id is stored 629fef5208cSdrh ** in iTable. 630fef5208cSdrh */ 631fef5208cSdrh int i, iSet; 632fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 633fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 6349208643dSdrh if( !sqliteExprIsConstant(pE2) ){ 635fef5208cSdrh sqliteSetString(&pParse->zErrMsg, 636fef5208cSdrh "right-hand side of IN operator must be constant", 0); 637fef5208cSdrh pParse->nErr++; 638fef5208cSdrh return 1; 639fef5208cSdrh } 6404794b980Sdrh if( sqliteExprCheck(pParse, pE2, 0, 0) ){ 6414794b980Sdrh return 1; 6424794b980Sdrh } 643fef5208cSdrh } 644fef5208cSdrh iSet = pExpr->iTable = pParse->nSet++; 645fef5208cSdrh for(i=0; i<pExpr->pList->nExpr; i++){ 646fef5208cSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 647fef5208cSdrh switch( pE2->op ){ 648fef5208cSdrh case TK_FLOAT: 649fef5208cSdrh case TK_INTEGER: 650fef5208cSdrh case TK_STRING: { 65199fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 652a76b5dfcSdrh assert( pE2->token.z ); 653fef5208cSdrh sqliteVdbeChangeP3(v, addr, pE2->token.z, pE2->token.n); 654fef5208cSdrh sqliteVdbeDequoteP3(v, addr); 655fef5208cSdrh break; 656fef5208cSdrh } 657fef5208cSdrh default: { 658fef5208cSdrh sqliteExprCode(pParse, pE2); 65999fcd718Sdrh sqliteVdbeAddOp(v, OP_SetInsert, iSet, 0); 660fef5208cSdrh break; 661fef5208cSdrh } 662fef5208cSdrh } 663fef5208cSdrh } 664fef5208cSdrh } 665cfab11bcSdrh break; 666fef5208cSdrh } 667fef5208cSdrh 66819a775c2Sdrh case TK_SELECT: { 669fef5208cSdrh /* This has to be a scalar SELECT. Generate code to put the 670fef5208cSdrh ** value of this select in a memory cell and record the number 671967e8b73Sdrh ** of the memory cell in iColumn. 672fef5208cSdrh */ 673967e8b73Sdrh pExpr->iColumn = pParse->nMem++; 674832508b7Sdrh if( sqliteSelect(pParse, pExpr->pSelect, SRT_Mem, pExpr->iColumn,0,0,0) ){ 67519a775c2Sdrh return 1; 67619a775c2Sdrh } 67719a775c2Sdrh break; 67819a775c2Sdrh } 67919a775c2Sdrh 680cce7d176Sdrh /* For all else, just recursively walk the tree */ 681cce7d176Sdrh default: { 682cce7d176Sdrh if( pExpr->pLeft 683832508b7Sdrh && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pLeft) ){ 684cce7d176Sdrh return 1; 685cce7d176Sdrh } 686cce7d176Sdrh if( pExpr->pRight 687832508b7Sdrh && sqliteExprResolveIds(pParse, base, pTabList, pEList, pExpr->pRight) ){ 688cce7d176Sdrh return 1; 689cce7d176Sdrh } 690cce7d176Sdrh if( pExpr->pList ){ 691cce7d176Sdrh int i; 692cce7d176Sdrh ExprList *pList = pExpr->pList; 693cce7d176Sdrh for(i=0; i<pList->nExpr; i++){ 694832508b7Sdrh Expr *pArg = pList->a[i].pExpr; 695832508b7Sdrh if( sqliteExprResolveIds(pParse, base, pTabList, pEList, pArg) ){ 696cce7d176Sdrh return 1; 697cce7d176Sdrh } 698cce7d176Sdrh } 699cce7d176Sdrh } 700cce7d176Sdrh } 701cce7d176Sdrh } 702cce7d176Sdrh return 0; 703cce7d176Sdrh } 704cce7d176Sdrh 705cce7d176Sdrh /* 7064b59ab5eSdrh ** pExpr is a node that defines a function of some kind. It might 7074b59ab5eSdrh ** be a syntactic function like "count(x)" or it might be a function 7084b59ab5eSdrh ** that implements an operator, like "a LIKE b". 7094b59ab5eSdrh ** 7104b59ab5eSdrh ** This routine makes *pzName point to the name of the function and 7114b59ab5eSdrh ** *pnName hold the number of characters in the function name. 7124b59ab5eSdrh */ 7134b59ab5eSdrh static void getFunctionName(Expr *pExpr, const char **pzName, int *pnName){ 7144b59ab5eSdrh switch( pExpr->op ){ 7154b59ab5eSdrh case TK_FUNCTION: { 7164b59ab5eSdrh *pzName = pExpr->token.z; 7174b59ab5eSdrh *pnName = pExpr->nFuncName; 7184b59ab5eSdrh break; 7194b59ab5eSdrh } 7204b59ab5eSdrh case TK_LIKE: { 7214b59ab5eSdrh *pzName = "like"; 7224b59ab5eSdrh *pnName = 4; 7234b59ab5eSdrh break; 7244b59ab5eSdrh } 7254b59ab5eSdrh case TK_GLOB: { 7264b59ab5eSdrh *pzName = "glob"; 7274b59ab5eSdrh *pnName = 4; 7284b59ab5eSdrh break; 7294b59ab5eSdrh } 7304b59ab5eSdrh default: { 7314b59ab5eSdrh *pzName = "can't happen"; 7324b59ab5eSdrh *pnName = 12; 7334b59ab5eSdrh break; 7344b59ab5eSdrh } 7354b59ab5eSdrh } 7364b59ab5eSdrh } 7374b59ab5eSdrh 7384b59ab5eSdrh /* 739cce7d176Sdrh ** Error check the functions in an expression. Make sure all 740cce7d176Sdrh ** function names are recognized and all functions have the correct 741cce7d176Sdrh ** number of arguments. Leave an error message in pParse->zErrMsg 742cce7d176Sdrh ** if anything is amiss. Return the number of errors. 743cce7d176Sdrh ** 744cce7d176Sdrh ** if pIsAgg is not null and this expression is an aggregate function 745cce7d176Sdrh ** (like count(*) or max(value)) then write a 1 into *pIsAgg. 746cce7d176Sdrh */ 747cce7d176Sdrh int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ 748cce7d176Sdrh int nErr = 0; 749cce7d176Sdrh if( pExpr==0 ) return 0; 750cce7d176Sdrh switch( pExpr->op ){ 7514b59ab5eSdrh case TK_GLOB: 7524b59ab5eSdrh case TK_LIKE: 753cce7d176Sdrh case TK_FUNCTION: { 754c9b84a1fSdrh int n = pExpr->pList ? pExpr->pList->nExpr : 0; /* Number of arguments */ 755c9b84a1fSdrh int no_such_func = 0; /* True if no such function exists */ 756c9b84a1fSdrh int is_type_of = 0; /* True if is the special TypeOf() function */ 757c9b84a1fSdrh int wrong_num_args = 0; /* True if wrong number of arguments */ 758c9b84a1fSdrh int is_agg = 0; /* True if is an aggregate function */ 759cce7d176Sdrh int i; 7604b59ab5eSdrh int nId; /* Number of characters in function name */ 7614b59ab5eSdrh const char *zId; /* The function name. */ 7620bce8354Sdrh FuncDef *pDef; 7630bce8354Sdrh 7644b59ab5eSdrh getFunctionName(pExpr, &zId, &nId); 7654b59ab5eSdrh pDef = sqliteFindFunction(pParse->db, zId, nId, n, 0); 7660bce8354Sdrh if( pDef==0 ){ 7674b59ab5eSdrh pDef = sqliteFindFunction(pParse->db, zId, nId, -1, 0); 7680bce8354Sdrh if( pDef==0 ){ 7694b59ab5eSdrh if( n==1 && nId==6 && sqliteStrNICmp(zId, "typeof", 6)==0 ){ 770c9b84a1fSdrh is_type_of = 1; 771c9b84a1fSdrh }else { 772cce7d176Sdrh no_such_func = 1; 773c9b84a1fSdrh } 7748e0a2f90Sdrh }else{ 7758e0a2f90Sdrh wrong_num_args = 1; 7768e0a2f90Sdrh } 7778e0a2f90Sdrh }else{ 7780bce8354Sdrh is_agg = pDef->xFunc==0; 779cce7d176Sdrh } 7808e0a2f90Sdrh if( is_agg && !allowAgg ){ 7818e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, "misuse of aggregate function ", -1, 7824b59ab5eSdrh zId, nId, "()", 2, 0); 7838e0a2f90Sdrh pParse->nErr++; 7848e0a2f90Sdrh nErr++; 7858e0a2f90Sdrh is_agg = 0; 7868e0a2f90Sdrh }else if( no_such_func ){ 7874b59ab5eSdrh sqliteSetNString(&pParse->zErrMsg, "no such function: ", -1, zId,nId,0); 788cce7d176Sdrh pParse->nErr++; 789cce7d176Sdrh nErr++; 7908e0a2f90Sdrh }else if( wrong_num_args ){ 7918e0a2f90Sdrh sqliteSetNString(&pParse->zErrMsg, 7924b59ab5eSdrh "wrong number of arguments to function ", -1, zId, nId, "()", 2, 0); 7938e0a2f90Sdrh pParse->nErr++; 7948e0a2f90Sdrh nErr++; 795cce7d176Sdrh } 7962282792aSdrh if( is_agg ) pExpr->op = TK_AGG_FUNCTION; 797cce7d176Sdrh if( is_agg && pIsAgg ) *pIsAgg = 1; 798cce7d176Sdrh for(i=0; nErr==0 && i<n; i++){ 7994cfa7934Sdrh nErr = sqliteExprCheck(pParse, pExpr->pList->a[i].pExpr, 8004cfa7934Sdrh allowAgg && !is_agg, pIsAgg); 801cce7d176Sdrh } 802c9b84a1fSdrh if( pDef==0 ){ 803c9b84a1fSdrh if( is_type_of ){ 804c9b84a1fSdrh pExpr->op = TK_STRING; 805c9b84a1fSdrh if( sqliteExprType(pExpr->pList->a[0].pExpr)==SQLITE_SO_NUM ){ 806c9b84a1fSdrh pExpr->token.z = "numeric"; 807c9b84a1fSdrh pExpr->token.n = 7; 808c9b84a1fSdrh }else{ 809c9b84a1fSdrh pExpr->token.z = "text"; 810c9b84a1fSdrh pExpr->token.n = 4; 811c9b84a1fSdrh } 812c9b84a1fSdrh } 813c9b84a1fSdrh }else if( pDef->dataType>=0 ){ 814c9b84a1fSdrh if( pDef->dataType<n ){ 815c9b84a1fSdrh pExpr->dataType = 816c9b84a1fSdrh sqliteExprType(pExpr->pList->a[pDef->dataType].pExpr); 817c9b84a1fSdrh }else{ 818c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 819c9b84a1fSdrh } 820c9b84a1fSdrh }else if( pDef->dataType==SQLITE_ARGS ){ 821c9b84a1fSdrh pDef->dataType = SQLITE_SO_TEXT; 822c9b84a1fSdrh for(i=0; i<n; i++){ 823c9b84a1fSdrh if( sqliteExprType(pExpr->pList->a[i].pExpr)==SQLITE_SO_NUM ){ 824c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 825c9b84a1fSdrh break; 826c9b84a1fSdrh } 827c9b84a1fSdrh } 828c9b84a1fSdrh }else if( pDef->dataType==SQLITE_NUMERIC ){ 829c9b84a1fSdrh pExpr->dataType = SQLITE_SO_NUM; 830c9b84a1fSdrh }else{ 831c9b84a1fSdrh pExpr->dataType = SQLITE_SO_TEXT; 832c9b84a1fSdrh } 833cce7d176Sdrh } 834cce7d176Sdrh default: { 835cce7d176Sdrh if( pExpr->pLeft ){ 8362282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pLeft, allowAgg, pIsAgg); 837cce7d176Sdrh } 838cce7d176Sdrh if( nErr==0 && pExpr->pRight ){ 8392282792aSdrh nErr = sqliteExprCheck(pParse, pExpr->pRight, allowAgg, pIsAgg); 840cce7d176Sdrh } 841fef5208cSdrh if( nErr==0 && pExpr->pList ){ 842fef5208cSdrh int n = pExpr->pList->nExpr; 843fef5208cSdrh int i; 844fef5208cSdrh for(i=0; nErr==0 && i<n; i++){ 8452282792aSdrh Expr *pE2 = pExpr->pList->a[i].pExpr; 8462282792aSdrh nErr = sqliteExprCheck(pParse, pE2, allowAgg, pIsAgg); 847fef5208cSdrh } 848fef5208cSdrh } 849cce7d176Sdrh break; 850cce7d176Sdrh } 851cce7d176Sdrh } 852cce7d176Sdrh return nErr; 853cce7d176Sdrh } 854cce7d176Sdrh 855cce7d176Sdrh /* 856c9b84a1fSdrh ** Return either SQLITE_SO_NUM or SQLITE_SO_TEXT to indicate whether the 857c9b84a1fSdrh ** given expression should sort as numeric values or as text. 858c9b84a1fSdrh ** 859c9b84a1fSdrh ** The sqliteExprResolveIds() and sqliteExprCheck() routines must have 860c9b84a1fSdrh ** both been called on the expression before it is passed to this routine. 861c9b84a1fSdrh */ 862c9b84a1fSdrh int sqliteExprType(Expr *p){ 863c9b84a1fSdrh if( p==0 ) return SQLITE_SO_NUM; 864c9b84a1fSdrh while( p ) switch( p->op ){ 865c9b84a1fSdrh case TK_PLUS: 866c9b84a1fSdrh case TK_MINUS: 867c9b84a1fSdrh case TK_STAR: 868c9b84a1fSdrh case TK_SLASH: 869c9b84a1fSdrh case TK_AND: 870c9b84a1fSdrh case TK_OR: 871c9b84a1fSdrh case TK_ISNULL: 872c9b84a1fSdrh case TK_NOTNULL: 873c9b84a1fSdrh case TK_NOT: 874c9b84a1fSdrh case TK_UMINUS: 8754b59ab5eSdrh case TK_UPLUS: 876c9b84a1fSdrh case TK_BITAND: 877c9b84a1fSdrh case TK_BITOR: 878c9b84a1fSdrh case TK_BITNOT: 879c9b84a1fSdrh case TK_LSHIFT: 880c9b84a1fSdrh case TK_RSHIFT: 881c9b84a1fSdrh case TK_REM: 882c9b84a1fSdrh case TK_INTEGER: 883c9b84a1fSdrh case TK_FLOAT: 884c9b84a1fSdrh case TK_IN: 885c9b84a1fSdrh case TK_BETWEEN: 8864b59ab5eSdrh case TK_GLOB: 8874b59ab5eSdrh case TK_LIKE: 888c9b84a1fSdrh return SQLITE_SO_NUM; 889c9b84a1fSdrh 890c9b84a1fSdrh case TK_STRING: 891c9b84a1fSdrh case TK_NULL: 892c9b84a1fSdrh case TK_CONCAT: 893c9b84a1fSdrh return SQLITE_SO_TEXT; 894c9b84a1fSdrh 895c9b84a1fSdrh case TK_LT: 896c9b84a1fSdrh case TK_LE: 897c9b84a1fSdrh case TK_GT: 898c9b84a1fSdrh case TK_GE: 899c9b84a1fSdrh case TK_NE: 900c9b84a1fSdrh case TK_EQ: 901c9b84a1fSdrh if( sqliteExprType(p->pLeft)==SQLITE_SO_NUM ){ 902c9b84a1fSdrh return SQLITE_SO_NUM; 903c9b84a1fSdrh } 904c9b84a1fSdrh p = p->pRight; 905c9b84a1fSdrh break; 906c9b84a1fSdrh 907c9b84a1fSdrh case TK_AS: 908c9b84a1fSdrh p = p->pLeft; 909c9b84a1fSdrh break; 910c9b84a1fSdrh 911c9b84a1fSdrh case TK_COLUMN: 912c9b84a1fSdrh case TK_FUNCTION: 913c9b84a1fSdrh case TK_AGG_FUNCTION: 914c9b84a1fSdrh return p->dataType; 915c9b84a1fSdrh 916c9b84a1fSdrh case TK_SELECT: 917c9b84a1fSdrh assert( p->pSelect ); 918c9b84a1fSdrh assert( p->pSelect->pEList ); 919c9b84a1fSdrh assert( p->pSelect->pEList->nExpr>0 ); 920c9b84a1fSdrh p = p->pSelect->pEList->a[0].pExpr; 921c9b84a1fSdrh break; 922c9b84a1fSdrh 923b1363206Sdrh case TK_CASE: { 924b1363206Sdrh if( p->pRight && sqliteExprType(p->pRight)==SQLITE_SO_NUM ){ 925b1363206Sdrh return SQLITE_SO_NUM; 926b1363206Sdrh } 927b1363206Sdrh if( p->pList ){ 928b1363206Sdrh int i; 929b1363206Sdrh ExprList *pList = p->pList; 930b1363206Sdrh for(i=1; i<pList->nExpr; i+=2){ 931b1363206Sdrh if( sqliteExprType(pList->a[i].pExpr)==SQLITE_SO_NUM ){ 932b1363206Sdrh return SQLITE_SO_NUM; 933b1363206Sdrh } 934b1363206Sdrh } 935b1363206Sdrh } 936b1363206Sdrh return SQLITE_SO_TEXT; 937b1363206Sdrh } 938b1363206Sdrh 939c9b84a1fSdrh default: 940c9b84a1fSdrh assert( p->op==TK_ABORT ); /* Can't Happen */ 941c9b84a1fSdrh break; 942c9b84a1fSdrh } 943c9b84a1fSdrh return SQLITE_SO_NUM; 944c9b84a1fSdrh } 945c9b84a1fSdrh 946c9b84a1fSdrh /* 947cce7d176Sdrh ** Generate code into the current Vdbe to evaluate the given 9481ccde15dSdrh ** expression and leave the result on the top of stack. 949cce7d176Sdrh */ 950cce7d176Sdrh void sqliteExprCode(Parse *pParse, Expr *pExpr){ 951cce7d176Sdrh Vdbe *v = pParse->pVdbe; 952cce7d176Sdrh int op; 953daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 954cce7d176Sdrh switch( pExpr->op ){ 955cce7d176Sdrh case TK_PLUS: op = OP_Add; break; 956cce7d176Sdrh case TK_MINUS: op = OP_Subtract; break; 957cce7d176Sdrh case TK_STAR: op = OP_Multiply; break; 958cce7d176Sdrh case TK_SLASH: op = OP_Divide; break; 959cce7d176Sdrh case TK_AND: op = OP_And; break; 960cce7d176Sdrh case TK_OR: op = OP_Or; break; 961cce7d176Sdrh case TK_LT: op = OP_Lt; break; 962cce7d176Sdrh case TK_LE: op = OP_Le; break; 963cce7d176Sdrh case TK_GT: op = OP_Gt; break; 964cce7d176Sdrh case TK_GE: op = OP_Ge; break; 965cce7d176Sdrh case TK_NE: op = OP_Ne; break; 966cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 967cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 968cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 969cce7d176Sdrh case TK_NOT: op = OP_Not; break; 970cce7d176Sdrh case TK_UMINUS: op = OP_Negative; break; 971bf4133cbSdrh case TK_BITAND: op = OP_BitAnd; break; 972bf4133cbSdrh case TK_BITOR: op = OP_BitOr; break; 973bf4133cbSdrh case TK_BITNOT: op = OP_BitNot; break; 974bf4133cbSdrh case TK_LSHIFT: op = OP_ShiftLeft; break; 975bf4133cbSdrh case TK_RSHIFT: op = OP_ShiftRight; break; 976bf4133cbSdrh case TK_REM: op = OP_Remainder; break; 977cce7d176Sdrh default: break; 978cce7d176Sdrh } 979cce7d176Sdrh switch( pExpr->op ){ 980967e8b73Sdrh case TK_COLUMN: { 9812282792aSdrh if( pParse->useAgg ){ 98299fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 983c4a3c779Sdrh }else if( pExpr->iColumn>=0 ){ 98499fcd718Sdrh sqliteVdbeAddOp(v, OP_Column, pExpr->iTable, pExpr->iColumn); 985c4a3c779Sdrh }else{ 98699fcd718Sdrh sqliteVdbeAddOp(v, OP_Recno, pExpr->iTable, 0); 9872282792aSdrh } 988cce7d176Sdrh break; 989cce7d176Sdrh } 990cce7d176Sdrh case TK_INTEGER: { 991d9e30930Sdrh int iVal = atoi(pExpr->token.z); 992d9e30930Sdrh char zBuf[30]; 993d9e30930Sdrh sprintf(zBuf,"%d",iVal); 994d9e30930Sdrh if( strlen(zBuf)!=pExpr->token.n 995d9e30930Sdrh || strncmp(pExpr->token.z,zBuf,pExpr->token.n)!=0 ){ 996d9e30930Sdrh /* If the integer value cannot be represented exactly in 32 bits, 997d9e30930Sdrh ** then code it as a string instead. */ 998d9e30930Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 999d9e30930Sdrh }else{ 1000d9e30930Sdrh sqliteVdbeAddOp(v, OP_Integer, iVal, 0); 1001d9e30930Sdrh } 1002e6840900Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 1003e6840900Sdrh break; 1004e6840900Sdrh } 1005e6840900Sdrh case TK_FLOAT: { 10067a7c7390Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1007a76b5dfcSdrh assert( pExpr->token.z ); 10087a7c7390Sdrh sqliteVdbeChangeP3(v, -1, pExpr->token.z, pExpr->token.n); 1009cce7d176Sdrh break; 1010cce7d176Sdrh } 1011cce7d176Sdrh case TK_STRING: { 101299fcd718Sdrh int addr = sqliteVdbeAddOp(v, OP_String, 0, 0); 1013a76b5dfcSdrh assert( pExpr->token.z ); 1014cce7d176Sdrh sqliteVdbeChangeP3(v, addr, pExpr->token.z, pExpr->token.n); 1015cce7d176Sdrh sqliteVdbeDequoteP3(v, addr); 1016cce7d176Sdrh break; 1017cce7d176Sdrh } 1018cce7d176Sdrh case TK_NULL: { 101999fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1020cce7d176Sdrh break; 1021cce7d176Sdrh } 1022c9b84a1fSdrh case TK_LT: 1023c9b84a1fSdrh case TK_LE: 1024c9b84a1fSdrh case TK_GT: 1025c9b84a1fSdrh case TK_GE: 1026c9b84a1fSdrh case TK_NE: 1027c9b84a1fSdrh case TK_EQ: { 1028491791a8Sdrh if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 1029c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1030c9b84a1fSdrh } 1031c9b84a1fSdrh /* Fall through into the next case */ 1032c9b84a1fSdrh } 1033cce7d176Sdrh case TK_AND: 1034cce7d176Sdrh case TK_OR: 1035cce7d176Sdrh case TK_PLUS: 1036cce7d176Sdrh case TK_STAR: 1037cce7d176Sdrh case TK_MINUS: 1038bf4133cbSdrh case TK_REM: 1039bf4133cbSdrh case TK_BITAND: 1040bf4133cbSdrh case TK_BITOR: 1041c9b84a1fSdrh case TK_SLASH: { 1042cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1043cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 104499fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 1045cce7d176Sdrh break; 1046cce7d176Sdrh } 1047bf4133cbSdrh case TK_LSHIFT: 1048bf4133cbSdrh case TK_RSHIFT: { 1049bf4133cbSdrh sqliteExprCode(pParse, pExpr->pRight); 1050bf4133cbSdrh sqliteExprCode(pParse, pExpr->pLeft); 1051bf4133cbSdrh sqliteVdbeAddOp(v, op, 0, 0); 1052bf4133cbSdrh break; 1053bf4133cbSdrh } 10540040077dSdrh case TK_CONCAT: { 10550040077dSdrh sqliteExprCode(pParse, pExpr->pLeft); 10560040077dSdrh sqliteExprCode(pParse, pExpr->pRight); 105799fcd718Sdrh sqliteVdbeAddOp(v, OP_Concat, 2, 0); 10580040077dSdrh break; 10590040077dSdrh } 10604b59ab5eSdrh case TK_UPLUS: { 10614b59ab5eSdrh Expr *pLeft = pExpr->pLeft; 10624b59ab5eSdrh if( pLeft && pLeft->op==TK_INTEGER ){ 10634b59ab5eSdrh sqliteVdbeAddOp(v, OP_Integer, atoi(pLeft->token.z), 0); 10644b59ab5eSdrh sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n); 10654b59ab5eSdrh }else if( pLeft && pLeft->op==TK_FLOAT ){ 10664b59ab5eSdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 10674b59ab5eSdrh sqliteVdbeChangeP3(v, -1, pLeft->token.z, pLeft->token.n); 10684b59ab5eSdrh }else{ 10694b59ab5eSdrh sqliteExprCode(pParse, pExpr->pLeft); 10704b59ab5eSdrh } 10714b59ab5eSdrh break; 10724b59ab5eSdrh } 1073cce7d176Sdrh case TK_UMINUS: { 10746e142f54Sdrh assert( pExpr->pLeft ); 10757a7c7390Sdrh if( pExpr->pLeft->op==TK_FLOAT || pExpr->pLeft->op==TK_INTEGER ){ 10766e142f54Sdrh Token *p = &pExpr->pLeft->token; 10776e142f54Sdrh char *z = sqliteMalloc( p->n + 2 ); 10786e142f54Sdrh sprintf(z, "-%.*s", p->n, p->z); 1079e6840900Sdrh if( pExpr->pLeft->op==TK_INTEGER ){ 1080e6840900Sdrh sqliteVdbeAddOp(v, OP_Integer, atoi(z), 0); 1081e6840900Sdrh }else{ 108299fcd718Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1083e6840900Sdrh } 108499fcd718Sdrh sqliteVdbeChangeP3(v, -1, z, p->n+1); 10856e142f54Sdrh sqliteFree(z); 10866e142f54Sdrh break; 10876e142f54Sdrh } 10881ccde15dSdrh /* Fall through into TK_NOT */ 10896e142f54Sdrh } 1090bf4133cbSdrh case TK_BITNOT: 10916e142f54Sdrh case TK_NOT: { 1092cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 109399fcd718Sdrh sqliteVdbeAddOp(v, op, 0, 0); 1094cce7d176Sdrh break; 1095cce7d176Sdrh } 1096cce7d176Sdrh case TK_ISNULL: 1097cce7d176Sdrh case TK_NOTNULL: { 1098cce7d176Sdrh int dest; 109999fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 1100cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1101cce7d176Sdrh dest = sqliteVdbeCurrentAddr(v) + 2; 1102f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 110399fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 1104cce7d176Sdrh break; 1105cce7d176Sdrh } 11062282792aSdrh case TK_AGG_FUNCTION: { 110799fcd718Sdrh sqliteVdbeAddOp(v, OP_AggGet, 0, pExpr->iAgg); 11082282792aSdrh break; 11092282792aSdrh } 11104b59ab5eSdrh case TK_GLOB: 11114b59ab5eSdrh case TK_LIKE: 1112cce7d176Sdrh case TK_FUNCTION: { 1113cce7d176Sdrh int i; 1114cce7d176Sdrh ExprList *pList = pExpr->pList; 111589425d5eSdrh int nExpr = pList ? pList->nExpr : 0; 11160bce8354Sdrh FuncDef *pDef; 11174b59ab5eSdrh int nId; 11184b59ab5eSdrh const char *zId; 11194b59ab5eSdrh getFunctionName(pExpr, &zId, &nId); 11204b59ab5eSdrh pDef = sqliteFindFunction(pParse->db, zId, nId, nExpr, 0); 11210bce8354Sdrh assert( pDef!=0 ); 112289425d5eSdrh for(i=0; i<nExpr; i++){ 11238e0a2f90Sdrh sqliteExprCode(pParse, pList->a[i].pExpr); 11248e0a2f90Sdrh } 112589425d5eSdrh sqliteVdbeAddOp(v, OP_Function, nExpr, 0); 11260bce8354Sdrh sqliteVdbeChangeP3(v, -1, (char*)pDef, P3_POINTER); 11276ec2733bSdrh break; 11286ec2733bSdrh } 112919a775c2Sdrh case TK_SELECT: { 113099fcd718Sdrh sqliteVdbeAddOp(v, OP_MemLoad, pExpr->iColumn, 0); 113119a775c2Sdrh break; 113219a775c2Sdrh } 1133fef5208cSdrh case TK_IN: { 1134fef5208cSdrh int addr; 113599fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 1, 0); 1136fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 1137fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1138f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+4); 1139f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1140f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 1141f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, addr+6); 1142fef5208cSdrh if( pExpr->pSelect ){ 1143f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, addr+6); 1144fef5208cSdrh }else{ 1145f5905aa7Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, addr+6); 1146fef5208cSdrh } 114799fcd718Sdrh sqliteVdbeAddOp(v, OP_AddImm, -1, 0); 1148fef5208cSdrh break; 1149fef5208cSdrh } 1150fef5208cSdrh case TK_BETWEEN: { 1151f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1152f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1153f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1154f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, 0, 0); 1155f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pull, 1, 0); 1156f5905aa7Sdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1157f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, 0, 0); 1158f5905aa7Sdrh sqliteVdbeAddOp(v, OP_And, 0, 0); 1159fef5208cSdrh break; 1160fef5208cSdrh } 1161a2e00042Sdrh case TK_AS: { 1162a2e00042Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1163a2e00042Sdrh break; 1164a2e00042Sdrh } 116517a7f8ddSdrh case TK_CASE: { 116617a7f8ddSdrh int expr_end_label; 1167f5905aa7Sdrh int jumpInst; 1168f5905aa7Sdrh int addr; 1169f5905aa7Sdrh int nExpr; 117017a7f8ddSdrh int i; 117117a7f8ddSdrh 117217a7f8ddSdrh assert(pExpr->pList); 117317a7f8ddSdrh assert((pExpr->pList->nExpr % 2) == 0); 117417a7f8ddSdrh assert(pExpr->pList->nExpr > 0); 1175f5905aa7Sdrh nExpr = pExpr->pList->nExpr; 1176f5905aa7Sdrh expr_end_label = sqliteVdbeMakeLabel(v); 117717a7f8ddSdrh if( pExpr->pLeft ){ 117817a7f8ddSdrh sqliteExprCode(pParse, pExpr->pLeft); 1179cce7d176Sdrh } 1180f5905aa7Sdrh for(i=0; i<nExpr; i=i+2){ 118117a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i].pExpr); 118217a7f8ddSdrh if( pExpr->pLeft ){ 1183f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Dup, 1, 1); 1184f570f011Sdrh jumpInst = sqliteVdbeAddOp(v, OP_Ne, 1, 0); 1185f570f011Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1186f5905aa7Sdrh }else{ 1187f570f011Sdrh jumpInst = sqliteVdbeAddOp(v, OP_IfNot, 1, 0); 118817a7f8ddSdrh } 118917a7f8ddSdrh sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr); 1190f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, expr_end_label); 1191f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1192f5905aa7Sdrh sqliteVdbeChangeP2(v, jumpInst, addr); 119317a7f8ddSdrh } 1194f570f011Sdrh if( pExpr->pLeft ){ 1195f570f011Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1196f570f011Sdrh } 119717a7f8ddSdrh if( pExpr->pRight ){ 119817a7f8ddSdrh sqliteExprCode(pParse, pExpr->pRight); 119917a7f8ddSdrh }else{ 1200f5905aa7Sdrh sqliteVdbeAddOp(v, OP_String, 0, 0); 120117a7f8ddSdrh } 1202f5905aa7Sdrh sqliteVdbeResolveLabel(v, expr_end_label); 12036f34903eSdanielk1977 break; 12046f34903eSdanielk1977 } 12056f34903eSdanielk1977 case TK_RAISE: { 12066f34903eSdanielk1977 if( !pParse->trigStack ){ 12076f34903eSdanielk1977 sqliteSetNString(&pParse->zErrMsg, 12086f34903eSdanielk1977 "RAISE() may only be used within a trigger-program", -1, 0); 12096f34903eSdanielk1977 pParse->nErr++; 12106f34903eSdanielk1977 return; 12116f34903eSdanielk1977 } 12126f34903eSdanielk1977 if( pExpr->iColumn == OE_Rollback || 12136f34903eSdanielk1977 pExpr->iColumn == OE_Abort || 12146f34903eSdanielk1977 pExpr->iColumn == OE_Fail ){ 12156f34903eSdanielk1977 char * msg = sqliteStrNDup(pExpr->token.z, pExpr->token.n); 12166f34903eSdanielk1977 sqliteVdbeAddOp(v, OP_Halt, SQLITE_CONSTRAINT, pExpr->iColumn); 12176f34903eSdanielk1977 sqliteDequote(msg); 12186f34903eSdanielk1977 sqliteVdbeChangeP3(v, -1, msg, 0); 12196f34903eSdanielk1977 sqliteFree(msg); 12206f34903eSdanielk1977 } else { 12216f34903eSdanielk1977 assert( pExpr->iColumn == OE_Ignore ); 12226f34903eSdanielk1977 sqliteVdbeAddOp(v, OP_Goto, 0, pParse->trigStack->ignoreJump); 12236f34903eSdanielk1977 sqliteVdbeChangeP3(v, -1, "(IGNORE jump)", -1); 12246f34903eSdanielk1977 } 122517a7f8ddSdrh } 122617a7f8ddSdrh break; 122717a7f8ddSdrh } 1228cce7d176Sdrh } 1229cce7d176Sdrh 1230cce7d176Sdrh /* 1231cce7d176Sdrh ** Generate code for a boolean expression such that a jump is made 1232cce7d176Sdrh ** to the label "dest" if the expression is true but execution 1233cce7d176Sdrh ** continues straight thru if the expression is false. 1234f5905aa7Sdrh ** 1235f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false), then 1236f5905aa7Sdrh ** take the jump if the jumpIfNull flag is true. 1237cce7d176Sdrh */ 1238f5905aa7Sdrh void sqliteExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1239cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1240cce7d176Sdrh int op = 0; 1241daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1242cce7d176Sdrh switch( pExpr->op ){ 1243cce7d176Sdrh case TK_LT: op = OP_Lt; break; 1244cce7d176Sdrh case TK_LE: op = OP_Le; break; 1245cce7d176Sdrh case TK_GT: op = OP_Gt; break; 1246cce7d176Sdrh case TK_GE: op = OP_Ge; break; 1247cce7d176Sdrh case TK_NE: op = OP_Ne; break; 1248cce7d176Sdrh case TK_EQ: op = OP_Eq; break; 1249cce7d176Sdrh case TK_ISNULL: op = OP_IsNull; break; 1250cce7d176Sdrh case TK_NOTNULL: op = OP_NotNull; break; 1251cce7d176Sdrh default: break; 1252cce7d176Sdrh } 1253cce7d176Sdrh switch( pExpr->op ){ 1254cce7d176Sdrh case TK_AND: { 1255cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1256f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, d2, !jumpIfNull); 1257f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1258cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1259cce7d176Sdrh break; 1260cce7d176Sdrh } 1261cce7d176Sdrh case TK_OR: { 1262f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1263f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 1264cce7d176Sdrh break; 1265cce7d176Sdrh } 1266cce7d176Sdrh case TK_NOT: { 1267f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1268cce7d176Sdrh break; 1269cce7d176Sdrh } 1270cce7d176Sdrh case TK_LT: 1271cce7d176Sdrh case TK_LE: 1272cce7d176Sdrh case TK_GT: 1273cce7d176Sdrh case TK_GE: 1274cce7d176Sdrh case TK_NE: 12750ac65892Sdrh case TK_EQ: { 1276cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1277cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1278491791a8Sdrh if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 1279c9b84a1fSdrh op += 6; /* Convert numeric opcodes to text opcodes */ 1280c9b84a1fSdrh } 1281f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1282cce7d176Sdrh break; 1283cce7d176Sdrh } 1284cce7d176Sdrh case TK_ISNULL: 1285cce7d176Sdrh case TK_NOTNULL: { 1286cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1287f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1288cce7d176Sdrh break; 1289cce7d176Sdrh } 1290fef5208cSdrh case TK_IN: { 1291f5905aa7Sdrh int addr; 1292cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1293f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1294f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1295f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1296f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1297fef5208cSdrh if( pExpr->pSelect ){ 129899fcd718Sdrh sqliteVdbeAddOp(v, OP_Found, pExpr->iTable, dest); 1299fef5208cSdrh }else{ 130099fcd718Sdrh sqliteVdbeAddOp(v, OP_SetFound, pExpr->iTable, dest); 1301fef5208cSdrh } 1302fef5208cSdrh break; 1303fef5208cSdrh } 1304fef5208cSdrh case TK_BETWEEN: { 1305f5905aa7Sdrh int addr; 1306fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 130799fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1308fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1309f5905aa7Sdrh addr = sqliteVdbeAddOp(v, OP_Lt, !jumpIfNull, 0); 1310fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1311f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Le, jumpIfNull, dest); 131299fcd718Sdrh sqliteVdbeAddOp(v, OP_Integer, 0, 0); 1313f5905aa7Sdrh sqliteVdbeChangeP2(v, addr, sqliteVdbeCurrentAddr(v)); 131499fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1315fef5208cSdrh break; 1316fef5208cSdrh } 1317cce7d176Sdrh default: { 1318cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1319f5905aa7Sdrh sqliteVdbeAddOp(v, OP_If, jumpIfNull, dest); 1320cce7d176Sdrh break; 1321cce7d176Sdrh } 1322cce7d176Sdrh } 1323cce7d176Sdrh } 1324cce7d176Sdrh 1325cce7d176Sdrh /* 132666b89c8fSdrh ** Generate code for a boolean expression such that a jump is made 1327cce7d176Sdrh ** to the label "dest" if the expression is false but execution 1328cce7d176Sdrh ** continues straight thru if the expression is true. 1329f5905aa7Sdrh ** 1330f5905aa7Sdrh ** If the expression evaluates to NULL (neither true nor false) then 1331f5905aa7Sdrh ** jump if jumpIfNull is true or fall through if jumpIfNull is false. 1332cce7d176Sdrh */ 1333f5905aa7Sdrh void sqliteExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 1334cce7d176Sdrh Vdbe *v = pParse->pVdbe; 1335cce7d176Sdrh int op = 0; 1336daffd0e5Sdrh if( v==0 || pExpr==0 ) return; 1337cce7d176Sdrh switch( pExpr->op ){ 1338cce7d176Sdrh case TK_LT: op = OP_Ge; break; 1339cce7d176Sdrh case TK_LE: op = OP_Gt; break; 1340cce7d176Sdrh case TK_GT: op = OP_Le; break; 1341cce7d176Sdrh case TK_GE: op = OP_Lt; break; 1342cce7d176Sdrh case TK_NE: op = OP_Eq; break; 1343cce7d176Sdrh case TK_EQ: op = OP_Ne; break; 1344cce7d176Sdrh case TK_ISNULL: op = OP_NotNull; break; 1345cce7d176Sdrh case TK_NOTNULL: op = OP_IsNull; break; 1346cce7d176Sdrh default: break; 1347cce7d176Sdrh } 1348cce7d176Sdrh switch( pExpr->op ){ 1349cce7d176Sdrh case TK_AND: { 1350f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 1351f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1352cce7d176Sdrh break; 1353cce7d176Sdrh } 1354cce7d176Sdrh case TK_OR: { 1355cce7d176Sdrh int d2 = sqliteVdbeMakeLabel(v); 1356f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, d2, !jumpIfNull); 1357f5905aa7Sdrh sqliteExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 1358cce7d176Sdrh sqliteVdbeResolveLabel(v, d2); 1359cce7d176Sdrh break; 1360cce7d176Sdrh } 1361cce7d176Sdrh case TK_NOT: { 1362f5905aa7Sdrh sqliteExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 1363cce7d176Sdrh break; 1364cce7d176Sdrh } 1365cce7d176Sdrh case TK_LT: 1366cce7d176Sdrh case TK_LE: 1367cce7d176Sdrh case TK_GT: 1368cce7d176Sdrh case TK_GE: 1369cce7d176Sdrh case TK_NE: 1370cce7d176Sdrh case TK_EQ: { 1371491791a8Sdrh if( pParse->db->file_format>=4 && sqliteExprType(pExpr)==SQLITE_SO_TEXT ){ 1372*8f619ccdSdrh /* Convert numeric comparison opcodes into text comparison opcodes. 1373*8f619ccdSdrh ** This step depends on the fact that the text comparision opcodes are 1374*8f619ccdSdrh ** always 6 greater than their corresponding numeric comparison 1375*8f619ccdSdrh ** opcodes. 1376*8f619ccdSdrh */ 1377*8f619ccdSdrh assert( OP_Eq+6 == OP_StrEq ); 1378*8f619ccdSdrh op += 6; 1379c9b84a1fSdrh } 1380cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1381cce7d176Sdrh sqliteExprCode(pParse, pExpr->pRight); 1382f5905aa7Sdrh sqliteVdbeAddOp(v, op, jumpIfNull, dest); 1383cce7d176Sdrh break; 1384cce7d176Sdrh } 1385cce7d176Sdrh case TK_ISNULL: 1386cce7d176Sdrh case TK_NOTNULL: { 1387cce7d176Sdrh sqliteExprCode(pParse, pExpr->pLeft); 1388f5905aa7Sdrh sqliteVdbeAddOp(v, op, 1, dest); 1389cce7d176Sdrh break; 1390cce7d176Sdrh } 1391fef5208cSdrh case TK_IN: { 1392f5905aa7Sdrh int addr; 1393cfab11bcSdrh sqliteExprCode(pParse, pExpr->pLeft); 1394f5905aa7Sdrh addr = sqliteVdbeCurrentAddr(v); 1395f5905aa7Sdrh sqliteVdbeAddOp(v, OP_NotNull, -1, addr+3); 1396f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 1397f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, jumpIfNull ? dest : addr+4); 1398fef5208cSdrh if( pExpr->pSelect ){ 139999fcd718Sdrh sqliteVdbeAddOp(v, OP_NotFound, pExpr->iTable, dest); 1400fef5208cSdrh }else{ 140199fcd718Sdrh sqliteVdbeAddOp(v, OP_SetNotFound, pExpr->iTable, dest); 1402fef5208cSdrh } 1403fef5208cSdrh break; 1404fef5208cSdrh } 1405fef5208cSdrh case TK_BETWEEN: { 1406fef5208cSdrh int addr; 1407fef5208cSdrh sqliteExprCode(pParse, pExpr->pLeft); 140899fcd718Sdrh sqliteVdbeAddOp(v, OP_Dup, 0, 0); 1409fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[0].pExpr); 1410fef5208cSdrh addr = sqliteVdbeCurrentAddr(v); 1411f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Ge, !jumpIfNull, addr+3); 141299fcd718Sdrh sqliteVdbeAddOp(v, OP_Pop, 1, 0); 141399fcd718Sdrh sqliteVdbeAddOp(v, OP_Goto, 0, dest); 1414fef5208cSdrh sqliteExprCode(pParse, pExpr->pList->a[1].pExpr); 1415f5905aa7Sdrh sqliteVdbeAddOp(v, OP_Gt, jumpIfNull, dest); 1416fef5208cSdrh break; 1417fef5208cSdrh } 1418cce7d176Sdrh default: { 1419cce7d176Sdrh sqliteExprCode(pParse, pExpr); 1420461c281aSdrh sqliteVdbeAddOp(v, OP_IfNot, jumpIfNull, dest); 1421cce7d176Sdrh break; 1422cce7d176Sdrh } 1423cce7d176Sdrh } 1424cce7d176Sdrh } 14252282792aSdrh 14262282792aSdrh /* 14272282792aSdrh ** Do a deep comparison of two expression trees. Return TRUE (non-zero) 14282282792aSdrh ** if they are identical and return FALSE if they differ in any way. 14292282792aSdrh */ 1430d8bc7086Sdrh int sqliteExprCompare(Expr *pA, Expr *pB){ 14312282792aSdrh int i; 14322282792aSdrh if( pA==0 ){ 14332282792aSdrh return pB==0; 14342282792aSdrh }else if( pB==0 ){ 14352282792aSdrh return 0; 14362282792aSdrh } 14372282792aSdrh if( pA->op!=pB->op ) return 0; 1438d8bc7086Sdrh if( !sqliteExprCompare(pA->pLeft, pB->pLeft) ) return 0; 1439d8bc7086Sdrh if( !sqliteExprCompare(pA->pRight, pB->pRight) ) return 0; 14402282792aSdrh if( pA->pList ){ 14412282792aSdrh if( pB->pList==0 ) return 0; 14422282792aSdrh if( pA->pList->nExpr!=pB->pList->nExpr ) return 0; 14432282792aSdrh for(i=0; i<pA->pList->nExpr; i++){ 1444d8bc7086Sdrh if( !sqliteExprCompare(pA->pList->a[i].pExpr, pB->pList->a[i].pExpr) ){ 14452282792aSdrh return 0; 14462282792aSdrh } 14472282792aSdrh } 14482282792aSdrh }else if( pB->pList ){ 14492282792aSdrh return 0; 14502282792aSdrh } 14512282792aSdrh if( pA->pSelect || pB->pSelect ) return 0; 14522f2c01e5Sdrh if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 0; 14532282792aSdrh if( pA->token.z ){ 14544b59ab5eSdrh int n; 14552282792aSdrh if( pB->token.z==0 ) return 0; 14564b59ab5eSdrh if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ 14574b59ab5eSdrh n = pA->nFuncName; 14584b59ab5eSdrh if( pB->nFuncName!=n ) return 0; 14594b59ab5eSdrh }else{ 14604b59ab5eSdrh n = pA->token.n; 14614b59ab5eSdrh if( pB->token.n!=n ) return 0; 14624b59ab5eSdrh } 14634b59ab5eSdrh if( sqliteStrNICmp(pA->token.z, pB->token.z, n)!=0 ) return 0; 14642282792aSdrh } 14652282792aSdrh return 1; 14662282792aSdrh } 14672282792aSdrh 14682282792aSdrh /* 14692282792aSdrh ** Add a new element to the pParse->aAgg[] array and return its index. 14702282792aSdrh */ 14712282792aSdrh static int appendAggInfo(Parse *pParse){ 14722282792aSdrh if( (pParse->nAgg & 0x7)==0 ){ 14732282792aSdrh int amt = pParse->nAgg + 8; 14746d4abfbeSdrh AggExpr *aAgg = sqliteRealloc(pParse->aAgg, amt*sizeof(pParse->aAgg[0])); 14756d4abfbeSdrh if( aAgg==0 ){ 14762282792aSdrh return -1; 14772282792aSdrh } 14786d4abfbeSdrh pParse->aAgg = aAgg; 14792282792aSdrh } 14802282792aSdrh memset(&pParse->aAgg[pParse->nAgg], 0, sizeof(pParse->aAgg[0])); 14812282792aSdrh return pParse->nAgg++; 14822282792aSdrh } 14832282792aSdrh 14842282792aSdrh /* 14852282792aSdrh ** Analyze the given expression looking for aggregate functions and 14862282792aSdrh ** for variables that need to be added to the pParse->aAgg[] array. 14872282792aSdrh ** Make additional entries to the pParse->aAgg[] array as necessary. 14882282792aSdrh ** 14892282792aSdrh ** This routine should only be called after the expression has been 14902282792aSdrh ** analyzed by sqliteExprResolveIds() and sqliteExprCheck(). 14912282792aSdrh ** 14922282792aSdrh ** If errors are seen, leave an error message in zErrMsg and return 14932282792aSdrh ** the number of errors. 14942282792aSdrh */ 14952282792aSdrh int sqliteExprAnalyzeAggregates(Parse *pParse, Expr *pExpr){ 14962282792aSdrh int i; 14972282792aSdrh AggExpr *aAgg; 14982282792aSdrh int nErr = 0; 14992282792aSdrh 15002282792aSdrh if( pExpr==0 ) return 0; 15012282792aSdrh switch( pExpr->op ){ 1502967e8b73Sdrh case TK_COLUMN: { 15032282792aSdrh aAgg = pParse->aAgg; 15042282792aSdrh for(i=0; i<pParse->nAgg; i++){ 15052282792aSdrh if( aAgg[i].isAgg ) continue; 15062282792aSdrh if( aAgg[i].pExpr->iTable==pExpr->iTable 1507967e8b73Sdrh && aAgg[i].pExpr->iColumn==pExpr->iColumn ){ 15082282792aSdrh break; 15092282792aSdrh } 15102282792aSdrh } 15112282792aSdrh if( i>=pParse->nAgg ){ 15122282792aSdrh i = appendAggInfo(pParse); 15132282792aSdrh if( i<0 ) return 1; 15142282792aSdrh pParse->aAgg[i].isAgg = 0; 15152282792aSdrh pParse->aAgg[i].pExpr = pExpr; 15162282792aSdrh } 1517aaf88729Sdrh pExpr->iAgg = i; 15182282792aSdrh break; 15192282792aSdrh } 15202282792aSdrh case TK_AGG_FUNCTION: { 15212282792aSdrh aAgg = pParse->aAgg; 15222282792aSdrh for(i=0; i<pParse->nAgg; i++){ 15232282792aSdrh if( !aAgg[i].isAgg ) continue; 1524d8bc7086Sdrh if( sqliteExprCompare(aAgg[i].pExpr, pExpr) ){ 15252282792aSdrh break; 15262282792aSdrh } 15272282792aSdrh } 15282282792aSdrh if( i>=pParse->nAgg ){ 15292282792aSdrh i = appendAggInfo(pParse); 15302282792aSdrh if( i<0 ) return 1; 15312282792aSdrh pParse->aAgg[i].isAgg = 1; 15322282792aSdrh pParse->aAgg[i].pExpr = pExpr; 15330bce8354Sdrh pParse->aAgg[i].pFunc = sqliteFindFunction(pParse->db, 15344b59ab5eSdrh pExpr->token.z, pExpr->nFuncName, 1535f55f25f0Sdrh pExpr->pList ? pExpr->pList->nExpr : 0, 0); 15362282792aSdrh } 15372282792aSdrh pExpr->iAgg = i; 15382282792aSdrh break; 15392282792aSdrh } 15402282792aSdrh default: { 15412282792aSdrh if( pExpr->pLeft ){ 15422282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pLeft); 15432282792aSdrh } 15442282792aSdrh if( nErr==0 && pExpr->pRight ){ 15452282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pRight); 15462282792aSdrh } 15472282792aSdrh if( nErr==0 && pExpr->pList ){ 15482282792aSdrh int n = pExpr->pList->nExpr; 15492282792aSdrh int i; 15502282792aSdrh for(i=0; nErr==0 && i<n; i++){ 15512282792aSdrh nErr = sqliteExprAnalyzeAggregates(pParse, pExpr->pList->a[i].pExpr); 15522282792aSdrh } 15532282792aSdrh } 15542282792aSdrh break; 15552282792aSdrh } 15562282792aSdrh } 15572282792aSdrh return nErr; 15582282792aSdrh } 15598e0a2f90Sdrh 15608e0a2f90Sdrh /* 15618e0a2f90Sdrh ** Locate a user function given a name and a number of arguments. 15620bce8354Sdrh ** Return a pointer to the FuncDef structure that defines that 15638e0a2f90Sdrh ** function, or return NULL if the function does not exist. 15648e0a2f90Sdrh ** 15650bce8354Sdrh ** If the createFlag argument is true, then a new (blank) FuncDef 15668e0a2f90Sdrh ** structure is created and liked into the "db" structure if a 15678e0a2f90Sdrh ** no matching function previously existed. When createFlag is true 15688e0a2f90Sdrh ** and the nArg parameter is -1, then only a function that accepts 15698e0a2f90Sdrh ** any number of arguments will be returned. 15708e0a2f90Sdrh ** 15718e0a2f90Sdrh ** If createFlag is false and nArg is -1, then the first valid 15728e0a2f90Sdrh ** function found is returned. A function is valid if either xFunc 15738e0a2f90Sdrh ** or xStep is non-zero. 15748e0a2f90Sdrh */ 15750bce8354Sdrh FuncDef *sqliteFindFunction( 15768e0a2f90Sdrh sqlite *db, /* An open database */ 15778e0a2f90Sdrh const char *zName, /* Name of the function. Not null-terminated */ 15788e0a2f90Sdrh int nName, /* Number of characters in the name */ 15798e0a2f90Sdrh int nArg, /* Number of arguments. -1 means any number */ 15808e0a2f90Sdrh int createFlag /* Create new entry if true and does not otherwise exist */ 15818e0a2f90Sdrh ){ 15820bce8354Sdrh FuncDef *pFirst, *p, *pMaybe; 15830bce8354Sdrh pFirst = p = (FuncDef*)sqliteHashFind(&db->aFunc, zName, nName); 15841350b030Sdrh if( p && !createFlag && nArg<0 ){ 15858e0a2f90Sdrh while( p && p->xFunc==0 && p->xStep==0 ){ p = p->pNext; } 15868e0a2f90Sdrh return p; 15878e0a2f90Sdrh } 15888e0a2f90Sdrh pMaybe = 0; 15898e0a2f90Sdrh while( p && p->nArg!=nArg ){ 15908e0a2f90Sdrh if( p->nArg<0 && !createFlag && (p->xFunc || p->xStep) ) pMaybe = p; 15918e0a2f90Sdrh p = p->pNext; 15928e0a2f90Sdrh } 15938e0a2f90Sdrh if( p && !createFlag && p->xFunc==0 && p->xStep==0 ){ 15948e0a2f90Sdrh return 0; 15958e0a2f90Sdrh } 15968e0a2f90Sdrh if( p==0 && pMaybe ){ 15978e0a2f90Sdrh assert( createFlag==0 ); 15988e0a2f90Sdrh return pMaybe; 15998e0a2f90Sdrh } 160089425d5eSdrh if( p==0 && createFlag && (p = sqliteMalloc(sizeof(*p)))!=0 ){ 16018e0a2f90Sdrh p->nArg = nArg; 16028e0a2f90Sdrh p->pNext = pFirst; 1603c9b84a1fSdrh p->dataType = pFirst ? pFirst->dataType : SQLITE_NUMERIC; 16040bce8354Sdrh sqliteHashInsert(&db->aFunc, zName, nName, (void*)p); 16058e0a2f90Sdrh } 16068e0a2f90Sdrh return p; 16078e0a2f90Sdrh } 1608