15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains routines used for analyzing expressions and 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for generating VDBE code that evaluates expressions in SQLite. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the 'affinity' of the expression pExpr if any. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pExpr is a column, a reference to a column via an 'AS' alias, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or a sub-select with a column as the return value, then the 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** affinity of that column is returned. Otherwise, 0x00 is returned, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indicating no affinity for the expression. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** i.e. the WHERE clause expresssions in the following statements all 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have an affinity: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** CREATE TABLE t1(a); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT * FROM t1 WHERE a; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT a AS b FROM t1 WHERE b; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT * FROM t1 WHERE (select a from t1); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char sqlite3ExprAffinity(Expr *pExpr){ 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op = pExpr->op; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_SELECT ){ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->flags&EP_xIsSelect ); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CAST 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_CAST ){ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3AffinityType(pExpr->u.zToken); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && pExpr->pTab!=0 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* op==TK_REGISTER && pExpr->pTab!=0 happens when pExpr was originally 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** a TK_COLUMN but was previously evaluated and cached in a register */ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j = pExpr->iColumn; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j<0 ) return SQLITE_AFF_INTEGER; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->pTab && j<pExpr->pTab->nCol ); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pExpr->pTab->aCol[j].affinity; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pExpr->affinity; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the explicit collating sequence for an expression to the 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** collating sequence supplied in the second argument. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprSetColl(Expr *pExpr, CollSeq *pColl){ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr && pColl ){ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pColl = pColl; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->flags |= EP_ExpCollate; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pExpr; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the collating sequence for expression pExpr to be the collating 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence named by pToken. Return a pointer to the revised expression. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The collating sequence is marked as "explicit" using the EP_ExpCollate 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** flag. An explicit collating sequence will override implicit 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** collating sequences. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprSetCollByToken(Parse *pParse, Expr *pExpr, Token *pCollName){ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zColl = 0; /* Dequoted name of collation sequence */ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColl = sqlite3NameFromToken(db, pCollName); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3LocateCollSeq(pParse, zColl); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprSetColl(pExpr, pColl); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, zColl); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pExpr; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the default collation sequence for the expression pExpr. If 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** there is no default collation type, return 0. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl = 0; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p = pExpr; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( p ){ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = p->pColl; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColl ) break; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = p->op; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pTab!=0 && ( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER || op==TK_TRIGGER 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) )){ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** a TK_COLUMN but was previously evaluated and cached in a register */ 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zColl; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j = p->iColumn; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j>=0 ){ 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColl = p->pTab->aCol[j].zColl; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pColl = pColl; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op!=TK_CAST && op!=TK_UPLUS ){ 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = p->pLeft; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3CheckCollSeq(pParse, pColl) ){ 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = 0; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pColl; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr is an operand of a comparison operator. aff2 is the 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type affinity of the other operand. This routine returns the 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type affinity that should be used for the comparison operator. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char sqlite3CompareAffinity(Expr *pExpr, char aff2){ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char aff1 = sqlite3ExprAffinity(pExpr); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aff1 && aff2 ){ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Both sides of the comparison are columns. If one has numeric 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** affinity, use that. Otherwise use no affinity. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_AFF_NUMERIC; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_AFF_NONE; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( !aff1 && !aff2 ){ 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Neither side of the comparison is a column. Compare the 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** results directly. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_AFF_NONE; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* One side is a column, the other is not. Use the columns affinity. */ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( aff1==0 || aff2==0 ); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (aff1 + aff2); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr is a comparison operator. Return the type affinity that should 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be applied to both operands prior to doing the comparison. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char comparisonAffinity(Expr *pExpr){ 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char aff; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op==TK_EQ || pExpr->op==TK_IN || pExpr->op==TK_LT || 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op==TK_GT || pExpr->op==TK_GE || pExpr->op==TK_LE || 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op==TK_NE || pExpr->op==TK_IS || pExpr->op==TK_ISNOT ); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->pLeft ); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aff = sqlite3ExprAffinity(pExpr->pLeft); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->pRight ){ 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aff = sqlite3CompareAffinity(pExpr->pRight, aff); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( !aff ){ 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aff = SQLITE_AFF_NONE; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aff; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr is a comparison expression, eg. '=', '<', IN(...) etc. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** idx_affinity is the affinity of an indexed column. Return true 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the index with affinity idx_affinity may be used to implement 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the comparison in pExpr. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char aff = comparisonAffinity(pExpr); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( aff ){ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_AFF_NONE: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SQLITE_AFF_TEXT: 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return idx_affinity==SQLITE_AFF_TEXT; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3IsNumericAffinity(idx_affinity); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the P5 value that should be used for a binary comparison 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** opcode (OP_Eq, OP_Ge etc.) used to compare pExpr1 and pExpr2. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static u8 binaryCompareP5(Expr *pExpr1, Expr *pExpr2, int jumpIfNull){ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 aff = (char)sqlite3ExprAffinity(pExpr2); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aff = (u8)sqlite3CompareAffinity(pExpr1, aff) | (u8)jumpIfNull; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aff; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a pointer to the collation sequence that should be used by 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a binary comparison operator comparing pLeft and pRight. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the left hand expression has a collating sequence type, then it is 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used. Otherwise the collation sequence for the right hand expression 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is used, or the default (BINARY) if neither expression has a collating 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Argument pRight (but not pLeft) may be a null pointer. In this case, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is not considered. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollSeq *sqlite3BinaryCompareCollSeq( 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pRight 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pLeft ); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pLeft->flags & EP_ExpCollate ){ 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pLeft->pColl ); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = pLeft->pColl; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pRight && pRight->flags & EP_ExpCollate ){ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pRight->pColl ); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = pRight->pColl; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3ExprCollSeq(pParse, pLeft); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pColl ){ 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3ExprCollSeq(pParse, pRight); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pColl; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a comparison operator. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int codeCompare( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parsing (and code generating) context */ 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft, /* The left operand */ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pRight, /* The right operand */ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int opcode, /* The comparison opcode */ 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int in1, int in2, /* Register holding operands */ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dest, /* Jump here if true. */ 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int jumpIfNull /* If true, jump if either operand is NULL */ 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int p5; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *p4; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p5 = binaryCompareP5(pLeft, pRight, jumpIfNull); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void*)p4, P4_COLLSEQ); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(pParse->pVdbe, (u8)p5); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return addr; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_EXPR_DEPTH>0 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check that argument nHeight is less than or equal to the maximum 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression depth allowed. If it is not, leave an error message in 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pParse. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCheckHeight(Parse *pParse, int nHeight){ 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = SQLITE_OK; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mxHeight = pParse->db->aLimit[SQLITE_LIMIT_EXPR_DEPTH]; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nHeight>mxHeight ){ 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Expression tree is too large (maximum depth %d)", mxHeight 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = SQLITE_ERROR; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* The following three functions, heightOfExpr(), heightOfExprList() 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and heightOfSelect(), are used to determine the maximum height 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of any expression tree referenced by the structure passed as the 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** first argument. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If this maximum height is greater than the current value pointed 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to by pnHeight, the second parameter, then set *pnHeight to that 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void heightOfExpr(Expr *p, int *pnHeight){ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->nHeight>*pnHeight ){ 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pnHeight = p->nHeight; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void heightOfExprList(ExprList *p, int *pnHeight){ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<p->nExpr; i++){ 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExpr(p->a[i].pExpr, pnHeight); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void heightOfSelect(Select *p, int *pnHeight){ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExpr(p->pWhere, pnHeight); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExpr(p->pHaving, pnHeight); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExpr(p->pLimit, pnHeight); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExpr(p->pOffset, pnHeight); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExprList(p->pEList, pnHeight); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExprList(p->pGroupBy, pnHeight); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExprList(p->pOrderBy, pnHeight); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfSelect(p->pPrior, pnHeight); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the Expr.nHeight variable in the structure passed as an 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument. An expression with no children, Expr.pList or 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.pSelect member has a height of 1. Any other expression 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has a height equal to the maximum height of any other 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** referenced Expr plus one. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void exprSetHeight(Expr *p){ 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nHeight = 0; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExpr(p->pLeft, &nHeight); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExpr(p->pRight, &nHeight); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(p, EP_xIsSelect) ){ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfSelect(p->x.pSelect, &nHeight); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfExprList(p->x.pList, &nHeight); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nHeight = nHeight + 1; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the Expr.nHeight variable using the exprSetHeight() function. If 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the height is greater than the maximum allowed expression depth, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** leave an error in pParse. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprSetHeight(Parse *pParse, Expr *p){ 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprSetHeight(p); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCheckHeight(pParse, p->nHeight); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the maximum height of any expression tree referenced 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by the select statement passed as an argument. 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3SelectExprHeight(Select *p){ 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nHeight = 0; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) heightOfSelect(p, &nHeight); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return nHeight; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #define exprSetHeight(y) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_MAX_EXPR_DEPTH>0 */ 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is the core allocator for Expr nodes. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Construct a new expression node and return a pointer to it. Memory 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for this node and for the pToken argument is a single allocation 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** obtained from sqlite3DbMalloc(). The calling function 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is responsible for making sure the node eventually gets freed. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If dequote is true, then the token (if it exists) is dequoted. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If dequote is false, no dequoting is performance. The deQuote 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter is ignored if pToken is NULL or if the token does not 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** appear to be quoted. If the quotes were of the form "..." (double-quotes) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then the EP_DblQuoted flag is set on the expression node. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Special case: If op==TK_INTEGER and pToken points to a string that 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be translated into a 32-bit integer, then the token is not 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stored in u.zToken. Instead, the integer values is written 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into u.iValue and the EP_IntValue flag is set. No extra storage 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is allocated to hold the integer text and the dequote flag is ignored. 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprAlloc( 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op, /* Expression opcode */ 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Token *pToken, /* Token argument. Might be NULL */ 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dequote /* True to dequote */ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pNew; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nExtra = 0; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iValue = 0; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pToken ){ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op!=TK_INTEGER || pToken->z==0 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || sqlite3GetInt32(pToken->z, &iValue)==0 ){ 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nExtra = pToken->n+1; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iValue>=0 ); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3DbMallocZero(db, sizeof(Expr)+nExtra); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew ){ 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->op = (u8)op; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->iAgg = -1; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pToken ){ 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nExtra==0 ){ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->flags |= EP_IntValue; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->u.iValue = iValue; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int c; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->u.zToken = (char*)&pNew[1]; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(pNew->u.zToken, pToken->z, pToken->n); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->u.zToken[pToken->n] = 0; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( dequote && nExtra>=3 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3Dequote(pNew->u.zToken); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( c=='"' ) pNew->flags |= EP_DblQuoted; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_EXPR_DEPTH>0 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->nHeight = 1; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a new expression node from a zero-terminated token that has 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** already been dequoted. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3Expr( 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op, /* Expression opcode */ 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zToken /* Token argument. Might be NULL */ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token x; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x.z = zToken; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x.n = zToken ? sqlite3Strlen30(zToken) : 0; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3ExprAlloc(db, op, &x, 0); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Attach subtrees pLeft and pRight to the Expr node pRoot. 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pRoot==NULL that means that a memory allocation error has occurred. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In that case, delete the subtrees pLeft and pRight. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAttachSubtrees( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pRoot, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pRight 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRoot==0 ){ 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db->mallocFailed ); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pLeft); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pRight); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight ){ 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRoot->pRight = pRight; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight->flags & EP_ExpCollate ){ 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRoot->flags |= EP_ExpCollate; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRoot->pColl = pRight->pColl; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pLeft ){ 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRoot->pLeft = pLeft; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pLeft->flags & EP_ExpCollate ){ 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRoot->flags |= EP_ExpCollate; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRoot->pColl = pLeft->pColl; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprSetHeight(pRoot); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a Expr node which joins as many as two subtrees. 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** One or both of the subtrees can be NULL. Return a pointer to the new 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr node. Or, if an OOM error occurs, set pParse->db->mallocFailed, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** free the subtrees and return NULL. 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3PExpr( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op, /* Expression opcode */ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft, /* Left operand */ 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pRight, /* Right operand */ 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Token *pToken /* Argument token */ 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p = sqlite3ExprAlloc(pParse->db, op, pToken, 1); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCheckHeight(pParse, p->nHeight); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Join two expressions using an AND operator. If either expression is 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL, then just return the other expression. 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprAnd(sqlite3 *db, Expr *pLeft, Expr *pRight){ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pLeft==0 ){ 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pRight; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pRight==0 ){ 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pLeft; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pNew = sqlite3ExprAlloc(db, TK_AND, 0, 0); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprAttachSubtrees(db, pNew, pLeft, pRight); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Construct a new expression node for a function with multiple 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** arguments. 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token *pToken){ 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pNew; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pToken ); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3ExprAlloc(db, TK_FUNCTION, pToken, 1); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ){ 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->x.pList = pList; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pNew, EP_xIsSelect) ); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprSetHeight(pParse, pNew); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Assign a variable number to an expression that encodes a wildcard 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the original SQL statement. 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Wildcards consisting of a single "?" are assigned the next sequential 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable number. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Wildcards of the form "?nnn" are assigned the number "nnn". We make 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sure "nnn" is not too be to avoid a denial of service attack when 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the SQL statement comes from an external source. 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as the previous instance of the same wildcard. Or if this is the first 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** instance of the wildcard, the next sequenial variable number is 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** assigned. 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *z; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr==0 ) return; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) ); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = pExpr->u.zToken; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( z!=0 ); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( z[0]!=0 ); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( z[1]==0 ){ 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Wildcard of the form "?". Assign the next variable number */ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( z[0]=='?' ); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = (ynVar)(++pParse->nVar); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( z[0]=='?' ){ 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Wildcard of the form "?nnn". Convert "nnn" to an integer and 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** use it as the variable number */ 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 i; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bOk = 0==sqlite3Atoi64(&z[1], &i, sqlite3Strlen30(&z[1]), SQLITE_UTF8); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = (ynVar)i; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==0 ); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==1 ); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 ); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>pParse->nVar ){ 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nVar = (int)i; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** number as the prior appearance of the same name, or if the name 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** has never appeared before, reuse the same variable number 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pParse->nVarExpr; i++){ 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE = pParse->apVarExpr[i]; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pE!=0 ); 584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if( strcmp(pE->u.zToken, z)==0 ){ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = pE->iColumn; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=pParse->nVarExpr ){ 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = (ynVar)(++pParse->nVar); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nVarExpr>=pParse->nVarExprAlloc-1 ){ 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nVarExprAlloc += pParse->nVarExprAlloc + 10; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->apVarExpr = 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbReallocOrFree( 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db, 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->apVarExpr, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nVarExprAlloc*sizeof(pParse->apVarExpr[0]) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !db->mallocFailed ){ 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->apVarExpr!=0 ); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->apVarExpr[pParse->nVarExpr++] = pExpr; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pParse->nErr && pParse->nVar>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "too many SQL variables"); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Recursively delete an expression tree. 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprDelete(sqlite3 *db, Expr *p){ 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p==0 ) return; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Sanity check: Assert that the IntValue is non-negative if it exists */ 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 ); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasAnyProperty(p, EP_TokenOnly) ){ 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pLeft); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pRight); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasProperty(p, EP_Reduced) && (p->flags2 & EP2_MallocedToken)!=0 ){ 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, p->u.zToken); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(p, EP_xIsSelect) ){ 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDelete(db, p->x.pSelect); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, p->x.pList); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasProperty(p, EP_Static) ){ 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, p); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes allocated for the expression structure 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** passed as the first argument. This is always one of EXPR_FULLSIZE, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EXPR_REDUCEDSIZE or EXPR_TOKENONLYSIZE. 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exprStructSize(Expr *p){ 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(p, EP_TokenOnly) ) return EXPR_TOKENONLYSIZE; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(p, EP_Reduced) ) return EXPR_REDUCEDSIZE; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return EXPR_FULLSIZE; 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The dupedExpr*Size() routines each return the number of bytes required 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to store a copy of an expression or expression tree. They differ in 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** how much of the tree is measured. 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** dupedExprStructSize() Size of only the Expr structure 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** dupedExprNodeSize() Size of Expr + space for token 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** dupedExprSize() Expr + token + subtree components 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************** 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The dupedExprStructSize() function returns two values OR-ed together: 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (1) the space required for a copy of the Expr structure only and 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (2) the EP_xxx flags that indicate what the structure size should be. 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The return values is always one of: 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EXPR_FULLSIZE 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EXPR_REDUCEDSIZE | EP_Reduced 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EXPR_TOKENONLYSIZE | EP_TokenOnly 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The size of the structure can be found by masking the return value 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of this routine with 0xfff. The flags can be found by masking the 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return value with EP_Reduced|EP_TokenOnly. 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (unreduced) Expr objects as they or originally constructed by the parser. 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** During expression analysis, extra information is computed and moved into 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** later parts of teh Expr object and that extra information might get chopped 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** off if the expression is reduced. Note also that it does not work to 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** make a EXPRDUP_REDUCE copy of a reduced expression. It is only legal 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to reduce a pristine expression tree from the parser. The implementation 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of dupedExprStructSize() contain multiple assert() statements that attempt 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to enforce this constraint. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dupedExprStructSize(Expr *p, int flags){ 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nSize; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==(flags&EXPRDUP_REDUCE) ){ 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nSize = EXPR_FULLSIZE; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(p, EP_TokenOnly|EP_Reduced) ); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(p, EP_FromJoin) ); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (p->flags2 & EP2_MallocedToken)==0 ); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (p->flags2 & EP2_Irreducible)==0 ); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pLeft || p->pRight || p->pColl || p->x.pList ){ 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nSize = EXPR_REDUCEDSIZE | EP_Reduced; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nSize = EXPR_TOKENONLYSIZE | EP_TokenOnly; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return nSize; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function returns the space in bytes required to store the copy 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the Expr structure and a copy of the Expr.u.zToken string (if that 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string is defined.) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dupedExprNodeSize(Expr *p, int flags){ 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte = dupedExprStructSize(p, flags) & 0xfff; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += sqlite3Strlen30(p->u.zToken)+1; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ROUND8(nByte); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of bytes required to create a duplicate of the 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression passed as the first argument. The second argument is a 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** mask containing EXPRDUP_XXX flags. 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The value returned includes space to create a copy of the Expr struct 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** itself and the buffer referred to by Expr.u.zToken, if any. 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the EXPRDUP_REDUCE flag is set, then the return value includes 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** space to duplicate all Expr nodes in the tree formed by Expr.pLeft 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and Expr.pRight variables (but not for any structures pointed to or 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** descended from the Expr.x.pList or Expr.x.pSelect variables). 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int dupedExprSize(Expr *p, int flags){ 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte = 0; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte = dupedExprNodeSize(p, flags); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( flags&EXPRDUP_REDUCE ){ 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte += dupedExprSize(p->pLeft, flags) + dupedExprSize(p->pRight, flags); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return nByte; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is similar to sqlite3ExprDup(), except that if pzBuffer 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not NULL then *pzBuffer is assumed to point to a buffer large enough 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to store the copy of expression p, the copies of p->u.zToken 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (if applicable), and the copies of the p->pLeft and p->pRight expressions, 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if any. Before returning, *pzBuffer is set to the first byte passed the 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** portion of the buffer copied into by this function. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){ 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pNew = 0; /* Value to return */ 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int isReduced = (flags&EXPRDUP_REDUCE); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 *zAlloc; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u32 staticFlag = 0; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pzBuffer==0 || isReduced ); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Figure out where to write the new Expr structure. */ 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzBuffer ){ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zAlloc = *pzBuffer; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) staticFlag = EP_Static; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zAlloc = sqlite3DbMallocRaw(db, dupedExprSize(p, flags)); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = (Expr *)zAlloc; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew ){ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set nNewSize to the size allocated for the structure pointed to 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** by the copy of the p->u.zToken string (if any). 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned nStructSize = dupedExprStructSize(p, flags); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int nNewSize = nStructSize & 0xfff; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nToken; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nToken = sqlite3Strlen30(p->u.zToken) + 1; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nToken = 0; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isReduced ){ 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( ExprHasProperty(p, EP_Reduced)==0 ); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(zAlloc, p, nNewSize); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nSize = exprStructSize(p); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(zAlloc, p, nSize); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( EXPR_FULLSIZE>nSize ){ 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->flags |= staticFlag; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Copy the p->u.zToken string, if any. */ 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nToken ){ 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(zToken, p->u.zToken, nToken); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==((p->flags|pNew->flags) & EP_TokenOnly) ){ 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(p, EP_xIsSelect) ){ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, isReduced); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, isReduced); 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Fill in pNew->pLeft and pNew->pRight. */ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasAnyProperty(pNew, EP_Reduced|EP_TokenOnly) ){ 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zAlloc += dupedExprNodeSize(p, flags); 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pNew, EP_Reduced) ){ 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pLeft = exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pRight = exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzBuffer ){ 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzBuffer = zAlloc; 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->flags2 = 0; 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasAnyProperty(p, EP_TokenOnly) ){ 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following group of routines make deep copies of expressions, 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression lists, ID lists, and select statements. The copies can 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be deleted (by being passed to their respective ...Delete() routines) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** without effecting the originals. 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The expression list, ID, and source lists return by sqlite3ExprListDup(), 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3IdListDup(), and sqlite3SrcListDup() can not be further expanded 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by subsequent calls to sqlite*ListAppend() routines. 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Any tables that the SrcList might point to are not duplicated. 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The flags parameter contains a combination of the EXPRDUP_XXX flags. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the EXPRDUP_REDUCE flag is set, then the structure returned is a 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** truncated version of the usual Expr structure that will be stored as 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** part of the in-memory representation of the database schema. 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){ 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return exprDup(db, p, flags, 0); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pNew; 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem, *pOldItem; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p==0 ) return 0; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ) return 0; 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->iECursor = 0; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->nExpr = pNew->nAlloc = p->nExpr; 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->a = pItem = sqlite3DbMallocRaw(db, p->nExpr*sizeof(p->a[0]) ); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem==0 ){ 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pNew); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOldItem = p->a; 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){ 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pOldExpr = pOldItem->pExpr; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->sortOrder = pOldItem->sortOrder; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->done = 0; 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iCol = pOldItem->iCol; 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iAlias = pOldItem->iAlias; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If cursors, triggers, views and subqueries are all omitted from 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the build, then none of the following routines, except for 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3SelectDup(), can be called. sqlite3SelectDup() is sometimes 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** called with a NULL argument. 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) \ 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || !defined(SQLITE_OMIT_SUBQUERY) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pNew; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nByte; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p==0 ) return 0; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3DbMallocRaw(db, nByte ); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ) return 0; 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->nSrc = pNew->nAlloc = p->nSrc; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<p->nSrc; i++){ 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pNewItem = &pNew->a[i]; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pOldItem = &p->a[i]; 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->jointype = pOldItem->jointype; 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->iCursor = pOldItem->iCursor; 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->isPopulated = pOldItem->isPopulated; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->notIndexed = pOldItem->notIndexed; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->pIndex = pOldItem->pIndex; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pNewItem->pTab = pOldItem->pTab; 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab ){ 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->nRef++; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->colUsed = pOldItem->colUsed; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IdList *pNew; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p==0 ) return 0; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ) return 0; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->nId = pNew->nAlloc = p->nId; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->a = sqlite3DbMallocRaw(db, p->nId*sizeof(p->a[0]) ); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew->a==0 ){ 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pNew); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<p->nId; i++){ 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct IdList_item *pNewItem = &pNew->a[i]; 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct IdList_item *pOldItem = &p->a[i]; 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNewItem->idx = pOldItem->idx; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pNew; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p==0 ) return 0; 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3DbMallocRaw(db, sizeof(*p) ); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ) return 0; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags); 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->op = p->op; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pPrior = sqlite3SelectDup(db, p->pPrior, flags); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->iLimit = 0; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->iOffset = 0; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pRightmost = 0; 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->addrOpenEphm[0] = -1; 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->addrOpenEphm[1] = -1; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->addrOpenEphm[2] = -1; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p==0 ); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new element to the end of an expression list. If pList is 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** initially NULL, then create a new expression list. 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a memory allocation error occurs, the entire list is freed and 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL is returned. If non-NULL is returned, then it is guaranteed 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that the new entry was successfully appended. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExprList *sqlite3ExprListAppend( 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList, /* List to which to append. Might be NULL */ 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr /* Expression to be appended. Might be NULL */ 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList==0 ){ 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pList = sqlite3DbMallocZero(db, sizeof(ExprList) ); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList==0 ){ 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto no_mem; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList->nAlloc==0 ); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList->nAlloc<=pList->nExpr ){ 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *a; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = pList->nAlloc*2 + 4; 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = sqlite3DbRealloc(db, pList->a, n*sizeof(pList->a[0])); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( a==0 ){ 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto no_mem; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pList->a = a; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pList->nAlloc = sqlite3DbMallocSize(db, a)/sizeof(a[0]); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList->a!=0 ); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 1 ){ 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem = &pList->a[pList->nExpr++]; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(pItem, 0, sizeof(*pItem)); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->pExpr = pExpr; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pList; 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)no_mem: 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Avoid leaking memory if malloc has failed. */ 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pExpr); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, pList); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the ExprList.a[].zName element of the most recently added item 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the expression list. 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pList might be NULL following an OOM error. But pName should never be 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is set. 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListSetName( 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList, /* List to which to add the span. */ 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token *pName, /* Name to be added */ 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dequote /* True to cause the name to be dequoted */ 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList!=0 || pParse->db->mallocFailed!=0 ); 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList ){ 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList->nExpr>0 ); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem = &pList->a[pList->nExpr-1]; 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pItem->zName==0 ); 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( dequote && pItem->zName ) sqlite3Dequote(pItem->zName); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the ExprList.a[].zSpan element of the most recently added item 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the expression list. 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pList might be NULL following an OOM error. But pSpan should never be 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL. If a memory allocation fails, the pParse->db->mallocFailed flag 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is set. 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListSetSpan( 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList, /* List to which to add the span. */ 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSpan *pSpan /* The span to be added */ 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList!=0 || db->mallocFailed!=0 ); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList ){ 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList->nExpr>0 ); 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr ); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pItem->zSpan); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart, 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (int)(pSpan->zEnd - pSpan->zStart)); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression list pEList contains more than iLimit elements, 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** leave an error message in pParse. 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListCheckLength( 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList, 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zObject 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mx = pParse->db->aLimit[SQLITE_LIMIT_COLUMN]; 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pEList && pEList->nExpr==mx ); 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pEList && pEList->nExpr==mx+1 ); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList && pEList->nExpr>mx ){ 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "too many columns in %s", zObject); 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete an entire expression list. 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList==0 ) return; 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList->a!=0 || (pList->nExpr==0 && pList->nAlloc==0) ); 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList->nExpr<=pList->nAlloc ); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){ 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pItem->pExpr); 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pItem->zName); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pItem->zSpan); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pList->a); 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pList); 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These routines are Walker callbacks. Walker.u.pi is a pointer 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to an integer. These routines are checking an expression to see 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if it is a constant. Set *Walker.u.pi to 0 if the expression is 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not constant. 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These callback routines are used to implement the following: 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3ExprIsConstant() 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3ExprIsConstantNotJoin() 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3ExprIsConstantOrFunction() 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If pWalker->u.i is 3 then any term of the expression that comes from 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the ON or USING clauses of a join disqualifies the expression 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** from being considered constant. */ 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pWalker->u.i==3 && ExprHasAnyProperty(pExpr, EP_FromJoin) ){ 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWalker->u.i = 0; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pExpr->op ){ 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Consider functions to be constant if all their arguments are constant 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and pWalker->u.i==2 */ 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FUNCTION: 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pWalker->u.i==2 ) return 0; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Fall through */ 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ID: 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_COLUMN: 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_FUNCTION: 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_COLUMN: 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_ID ); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_COLUMN ); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_AGG_FUNCTION ); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_AGG_COLUMN ); 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWalker->u.i = 0; 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */ 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */ 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Continue; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){ 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNUSED_PARAMETER(NotUsed); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWalker->u.i = 0; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exprIsConst(Expr *p, int initFlag){ 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Walker w; 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.u.i = initFlag; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xExprCallback = exprNodeIsConstant; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xSelectCallback = selectNodeIsConstant; 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkExpr(&w, p); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return w.u.i; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk an expression tree. Return 1 if the expression is constant 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and 0 if it involves variables or function calls. 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For the purposes of this function, a double-quoted string (ex: "abc") 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is considered a variable but a single-quoted string (ex: 'abc') is 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a constant. 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsConstant(Expr *p){ 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return exprIsConst(p, 1); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk an expression tree. Return 1 if the expression is constant 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that does no originate from the ON or USING clauses of a join. 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return 0 if it involves variables or function calls or terms from 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an ON or USING clause. 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsConstantNotJoin(Expr *p){ 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return exprIsConst(p, 3); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walk an expression tree. Return 1 if the expression is constant 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or a function call with constant arguments. Return and 0 if there 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are any variables. 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For the purposes of this function, a double-quoted string (ex: "abc") 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is considered a variable but a single-quoted string (ex: 'abc') is 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a constant. 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsConstantOrFunction(Expr *p){ 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return exprIsConst(p, 2); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression p codes a constant integer that is small enough 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to fit in a 32-bit integer, return 1 and put the value of the integer 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in *pValue. If the expression is not an integer or if it is too big 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to fit in a signed 32-bit integer, return 0 and leave *pValue unchanged. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprIsInteger(Expr *p, int *pValue){ 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = 0; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If an expression is an integer literal that fits in a signed 32-bit 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** integer, then the EP_IntValue flag will have already been set */ 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->op!=TK_INTEGER || (p->flags & EP_IntValue)!=0 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || sqlite3GetInt32(p->u.zToken, &rc)==0 ); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->flags & EP_IntValue ){ 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pValue = p->u.iValue; 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( p->op ){ 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_UPLUS: { 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3ExprIsInteger(p->pLeft, pValue); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_UMINUS: { 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int v; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprIsInteger(p->pLeft, &v) ){ 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pValue = -v; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = 1; 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: break; 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return FALSE if there is no chance that the expression can be NULL. 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression might be NULL or if the expression is too complex 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to tell return TRUE. 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used as an optimization, to skip OP_IsNull opcodes 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** when we know that a value cannot be NULL. Hence, a false positive 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (returning TRUE when in fact the expression can never be NULL) might 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be a small performance hit but is otherwise harmless. On the other 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** hand, a false negative (returning FALSE when the result could be NULL) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will likely result in an incorrect answer. So when in doubt, return 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** TRUE. 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCanBeNull(const Expr *p){ 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 op; 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = p->op; 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_REGISTER ) op = p->op2; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( op ){ 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_INTEGER: 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_STRING: 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FLOAT: 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BLOB: 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an OP_IsNull instruction that tests register iReg and jumps 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to location iDest if the value in iReg is NULL. The value in iReg 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** was computed by pExpr. If we can look at pExpr at compile-time and 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** determine that it can never generate a NULL, then the OP_IsNull operation 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be omitted. 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeIsNullJump( 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v, /* The VDBE under construction */ 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Expr *pExpr, /* Only generate OP_IsNull if this expr can be NULL */ 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iReg, /* Test the value in this register for NULL */ 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDest /* Jump here if the value is null */ 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprCanBeNull(pExpr) ){ 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iDest); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if the given expression is a constant which would be 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unchanged by OP_Affinity with the affinity given in the second 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument. 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used to determine if the OP_Affinity operation 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be omitted. When in doubt return FALSE. A false negative 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is harmless. A false positive, however, can result in the wrong 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** answer. 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 op; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aff==SQLITE_AFF_NONE ) return 1; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = p->op; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_REGISTER ) op = p->op2; 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( op ){ 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_INTEGER: { 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC; 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FLOAT: { 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_STRING: { 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return aff==SQLITE_AFF_TEXT; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BLOB: { 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_COLUMN: { 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->iColumn<0 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if the given string is a row-id column name. 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IsRowid(const char *z){ 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(z, "_ROWID_")==0 ) return 1; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(z, "ROWID")==0 ) return 1; 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(z, "OID")==0 ) return 1; 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if we are able to the IN operator optimization on a 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** query of the form 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x IN (SELECT ...) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Where the SELECT... clause is as specified by the parameter to this 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine. 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The Select object passed in has already been preprocessed and no 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** errors have been found. 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int isCandidateForInOpt(Select *p){ 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrc; 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p==0 ) return 0; /* right-hand side of IN is SELECT */ 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pPrior ) return 0; /* Not a compound SELECT */ 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->selFlags & (SF_Distinct|SF_Aggregate) ){ 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* No DISTINCT keyword and no aggregate functions */ 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */ 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pLimit ) return 0; /* Has no LIMIT clause */ 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pOffset==0 ); /* No LIMIT means no OFFSET */ 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pWhere ) return 0; /* Has no WHERE clause */ 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc = p->pSrc; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrc!=0 ); 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */ 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */ 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pSrc->a[0].pTab; 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(pTab==0) ) return 0; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab->pSelect==0 ); /* FROM clause is not a view */ 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */ 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = p->pEList; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->nExpr!=1 ) return 0; /* One column in the result set */ 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->a[0].pExpr->op!=TK_COLUMN ) return 0; /* Result is a column */ 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */ 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is used by the implementation of the IN (...) operator. 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It's job is to find or create a b-tree structure that may be used 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** either to test for membership of the (...) set or to iterate through 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** its members, skipping duplicates. 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The index of the cursor opened on the b-tree (database table, database index 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or ephermal table) is stored in pX->iTable before this function returns. 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The returned value of this function indicates the b-tree type, as follows: 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IN_INDEX_ROWID - The cursor was opened on a database table. 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IN_INDEX_INDEX - The cursor was opened on a database index. 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** IN_INDEX_EPH - The cursor was opened on a specially created and 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** populated epheremal table. 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An existing b-tree may only be used if the SELECT is of the simple 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** form: 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT <column> FROM <table> 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the prNotFound parameter is 0, then the b-tree will be used to iterate 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** through the set members, skipping any duplicates. In this case an 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** epheremal table must be used unless the selected <column> is guaranteed 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to be unique - either because it is an INTEGER PRIMARY KEY or it 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has a UNIQUE constraint or UNIQUE index. 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the prNotFound parameter is not 0, then the b-tree will be used 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for fast set membership tests. In this case an epheremal table must 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be used unless <column> is an INTEGER PRIMARY KEY or an index can 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be found with <column> as its left-most column. 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When the b-tree is being used for membership tests, the calling function 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** needs to know whether or not the structure contains an SQL NULL 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value in order to correctly evaluate expressions like "X IN (Y, Z)". 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If there is any chance that the (...) might contain a NULL value at 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** runtime, then a register is allocated and the register number written 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to *prNotFound. If there is no chance that the (...) contains a 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL value, then *prNotFound is left unchanged. 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a register is allocated and its location stored in *prNotFound, then 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** its initial value is NULL. If the (...) does not remain constant 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for the duration of the query (i.e. the SELECT within the (...) 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a correlated subquery) then the value of the allocated register is 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** reset to NULL each time the subquery is rerun. This allows the 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** caller to use vdbe code equivalent to the following: 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if( register==NULL ){ 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has_null = <test if data structure contains null> 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register = 1 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** } 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in order to avoid running the <test if data structure contains null> 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** test more often than is necessary. 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){ 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p; /* SELECT to the right of IN operator */ 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eType = 0; /* Type of RHS table. IN_INDEX_* */ 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTab = pParse->nTab++; /* Cursor of the RHS table */ 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mustBeUnique = (prNotFound==0); /* True if RHS must be unique */ 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pX->op==TK_IN ); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check to see if an existing table or index can be used to 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** satisfy the query. This is preferable to generating a new 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ephemeral table. 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){ 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; /* Database connection */ 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr = p->pEList->a[0].pExpr; /* Expression <column> */ 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol = pExpr->iColumn; /* Index of column <column> */ 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = p->pSrc->a[0].pTab; /* Table <table>. */ 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb; /* Database idx for pTab */ 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code an OP_VerifyCookie and OP_TableLock for <table>. */ 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDb = sqlite3SchemaToIndex(db, pTab->pSchema); 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeVerifySchema(pParse, iDb); 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This function is only called from two places. In both cases the vdbe 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** has already been allocated. So assume sqlite3GetVdbe() is always 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** successful here. 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(v); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 ){ 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iMem = ++pParse->nMem; 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iAddr; 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem); 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, iMem); 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eType = IN_INDEX_ROWID; 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, iAddr); 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; /* Iterator variable */ 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The collation sequence used by the comparison. If an index is to 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** be used in place of a temp-table, it must be ordered according 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to this collation sequence. */ 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pExpr); 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check that the affinity that will be used to perform the 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** comparison is the same as the affinity of the column. If 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it is not, it is not possible to use any index. 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char aff = comparisonAffinity(pX); 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int affinity_ok = (pTab->aCol[iCol].affinity==aff||aff==SQLITE_AFF_NONE); 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pIdx=pTab->pIndex; pIdx && eType==0 && affinity_ok; pIdx=pIdx->pNext){ 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pIdx->aiColumn[0]==iCol) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], 0)==pReq 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (!mustBeUnique || (pIdx->nColumn==1 && pIdx->onError!=OE_None)) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iMem = ++pParse->nMem; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iAddr; 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *pKey; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKey = (char *)sqlite3IndexKeyinfo(pParse, pIdx); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, iMem); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_OpenRead, iTab, pIdx->tnum, iDb, 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKey,P4_KEYINFO_HANDOFF); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "%s", pIdx->zName)); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eType = IN_INDEX_INDEX; 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, iAddr); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( prNotFound && !pTab->aCol[iCol].notNull ){ 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *prNotFound = ++pParse->nMem; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eType==0 ){ 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Could not found an existing table or index to use as the RHS b-tree. 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** We will have to generate an ephemeral table to do the job. 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double savedNQueryLoop = pParse->nQueryLoop; 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rMayHaveNull = 0; 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eType = IN_INDEX_EPH; 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( prNotFound ){ 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *prNotFound = rMayHaveNull = ++pParse->nMem; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pParse->nQueryLoop>(double)1 ); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nQueryLoop = (double)1; 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pX->pLeft->iColumn<0 && !ExprHasAnyProperty(pX, EP_xIsSelect) ){ 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eType = IN_INDEX_ROWID; 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nQueryLoop = savedNQueryLoop; 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pX->iTable = iTab; 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return eType; 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for scalar subqueries used as a subquery expression, EXISTS, 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or IN operators. Examples: 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (SELECT a FROM b) -- subquery 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EXISTS (SELECT a FROM b) -- EXISTS subquery 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x IN (4,5,11) -- IN operator with list on right-hand side 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x IN (SELECT a FROM b) -- IN operator with subquery on the right 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The pExpr parameter describes the expression that contains the IN 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operator or subquery. 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If parameter isRowid is non-zero, then expression pExpr is guaranteed 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to be of the form "<rowid> IN (?, ?, ?)", where <rowid> is a reference 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to some integer key column of a table B-Tree. In this case, use an 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** intkey B-Tree to store the set of IN(...) values instead of the usual 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (slower) variable length keys B-Tree. 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If rMayHaveNull is non-zero, that means that the operation is an IN 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (not a SELECT or EXISTS) and that the RHS might contains NULLs. 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Furthermore, the IN is in a WHERE clause and that we really want 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to iterate over the RHS of the IN operator in order to quickly locate 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** all corresponding LHS elements. All this routine does is initialize 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the register given by rMayHaveNull to NULL. Calling routines will take 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** care of changing this register value to non-NULL if the RHS is NULL-free. 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If rMayHaveNull is zero, that means that the subquery is being used 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for membership testing only. There is no need to initialize any 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** registers to indicate the presense or absence of NULLs on the RHS. 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For a SELECT or EXISTS operator, return the register that holds the 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result. For IN operators or if an error occurs, the return value is 0. 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3CodeSubselect( 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr, /* The IN, SELECT, or EXISTS operator */ 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rMayHaveNull, /* Register that records whether NULLs exist in RHS */ 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isRowid /* If true, LHS of IN operator is a rowid */ 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int testAddr = 0; /* One-time test address */ 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rReg = 0; /* Register storing resulting */ 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = sqlite3GetVdbe(pParse); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(v==0) ) return 0; 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This code must be run in its entirety every time it is encountered 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** if any of the following is true: 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * The right-hand side is a correlated subquery 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * The right-hand side is an expression list containing variables 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** * We are inside a trigger 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If all of the above are false, then we can run this code just once 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** save the results, and reuse the same result on subsequent invocations. 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->pTriggerTab ){ 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mem = ++pParse->nMem; 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_If, mem); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testAddr = sqlite3VdbeAddOp2(v, OP_Integer, 1, mem); 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( testAddr>0 || pParse->db->mallocFailed ); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->explain==2 ){ 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zMsg = sqlite3MPrintf( 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->db, "EXECUTE %s%s SUBQUERY %d", testAddr?"":"CORRELATED ", 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op==TK_IN?"LIST":"SCALAR", pParse->iNextSelectId 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pExpr->op ){ 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IN: { 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char affinity; /* Affinity of the LHS of the IN */ 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo keyInfo; /* Keyinfo for the generated table */ 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; /* Address of OP_OpenEphemeral instruction */ 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rMayHaveNull ){ 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, rMayHaveNull); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) affinity = sqlite3ExprAffinity(pLeft); 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)' 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** expression it is handled the same way. An ephemeral table is 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** filled with single-field index keys representing the results 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** from the SELECT or the <exprlist>. 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If the 'x' expression is a column value, or the SELECT... 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** statement returns a column value, then the affinity of that 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** column is used to build the index keys. If both 'x' and the 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT... statement are columns, then numeric affinity is used 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** if either column has NUMERIC or INTEGER affinity. If neither 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 'x' nor the SELECT... statement are columns, then numeric affinity 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is used. 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = pParse->nTab++; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, !isRowid); 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rMayHaveNull==0 ) sqlite3VdbeChangeP5(v, BTREE_UNORDERED); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&keyInfo, 0, sizeof(keyInfo)); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyInfo.nField = 1; 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pExpr, EP_xIsSelect) ){ 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Case 1: expr IN (SELECT ...) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Generate code to write the results of the select into the temporary 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** table allocated and opened above. 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest dest; 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !isRowid ); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest.affinity = (u8)affinity; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable ); 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->x.pSelect->iLimit = 0; 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3Select(pParse, pExpr->x.pSelect, &dest) ){ 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = pExpr->x.pSelect->pEList; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pEList!=0 && pEList->nExpr>0) ){ 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyInfo.aColl[0] = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList->a[0].pExpr); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( ALWAYS(pExpr->x.pList!=0) ){ 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Case 2: expr IN (exprlist) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** For each expression, build an index key from the evaluation and 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** store it in the temporary table. If <expr> is a column, then use 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that columns affinity when building index keys. If <expr> is not 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** a column, use numeric affinity. 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList = pExpr->x.pList; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1, r2, r3; 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !affinity ){ 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) affinity = SQLITE_AFF_NONE; 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyInfo.aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Loop through each expression in <exprlist>. */ 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GetTempReg(pParse); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3GetTempReg(pParse); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, r2); 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE2 = pItem->pExpr; 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iValToIns; 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the expression is not constant then we will need to 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** disable the test that was generated above that makes sure 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** this code only executes once. Because for a non-constant 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** expression we need to rerun this code each time. 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( testAddr && !sqlite3ExprIsConstant(pE2) ){ 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeToNoop(v, testAddr-1, 2); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testAddr = 0; 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Evaluate the expression and insert it into the temp table */ 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isRowid ){ 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeCurrentAddr(v)+2); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, r3, 1); 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r2); 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !isRowid ){ 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr, (void *)&keyInfo, P4_KEYINFO); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EXISTS: 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_SELECT: 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this has to be a scalar SELECT. Generate code to put the 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** value of this select in a memory cell and record the number 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the memory cell in iColumn. If this is an EXISTS, write 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** an integer 0 (not exists) or 1 (exists) into a memory cell 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and record that memory cell in iColumn. 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSel; /* SELECT statement to encode */ 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest dest; /* How to deal with SELECt result */ 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_EXISTS ); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_SELECT ); 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( ExprHasProperty(pExpr, EP_xIsSelect) ); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSel = pExpr->x.pSelect; 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&dest, 0, ++pParse->nMem); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->op==TK_SELECT ){ 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest.eDest = SRT_Mem; 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, dest.iParm); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "Init subquery result")); 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest.eDest = SRT_Exists; 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iParm); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "Init EXISTS result")); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(pParse->db, pSel->pLimit); 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &sqlite3IntTokens[1]); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSel->iLimit = 0; 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3Select(pParse, pSel, &dest) ){ 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rReg = dest.iParm; 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetIrreducible(pExpr); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( testAddr ){ 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, testAddr-1); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rReg; 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */ 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for an IN expression. 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x IN (SELECT ...) 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x IN (value, value, ...) 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The left-hand side (LHS) is a scalar expression. The right-hand side (RHS) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is an array of zero or more values. The expression is true if the LHS is 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contained within the RHS. The value of the expression is unknown (NULL) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the LHS is NULL or if the LHS is not contained within the RHS and the 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** RHS contains one or more NULL values. 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine generates code will jump to destIfFalse if the LHS is not 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contained within the RHS. If due to NULLs we cannot determine if the LHS 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is contained in the RHS then jump to destIfNull. If the LHS is contained 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** within the RHS then fall through. 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3ExprCodeIN( 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing and code generating context */ 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr, /* The IN expression */ 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destIfFalse, /* Jump here if LHS is not contained in the RHS */ 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destIfNull /* Jump here if the results are unknown due to NULLs */ 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rRhsHasNull = 0; /* Register that is true if RHS contains NULL values */ 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char affinity; /* Comparison affinity to use */ 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eType; /* Type of the RHS */ 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1; /* Temporary use register */ 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; /* Statement under construction */ 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Compute the RHS. After this step, the table with cursor 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pExpr->iTable will contains the values that make up the RHS. 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = pParse->pVdbe; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); /* OOM detected prior to this routine */ 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "begin IN expr")); 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) eType = sqlite3FindInIndex(pParse, pExpr, &rRhsHasNull); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Figure out the affinity to use to create a key from the results 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the expression. affinityStr stores a static string suitable for 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** P4 of OP_MakeRecord. 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) affinity = comparisonAffinity(pExpr); 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code the LHS, the <expr> from "<expr> IN (...)". 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GetTempReg(pParse); 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pExpr->pLeft, r1); 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the LHS is NULL, then the result is either false or NULL depending 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** on whether the RHS is empty or not, respectively. 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( destIfNull==destIfFalse ){ 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Shortcut for the common case where the false and NULL outcomes are 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the same. */ 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr1); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eType==IN_INDEX_ROWID ){ 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In this case, the RHS is the ROWID of table b-tree 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In this case, the RHS is an index b-tree. 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Affinity, r1, 1, 0, &affinity, 1); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the set membership test fails, then the result of the 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** "x IN (...)" expression must be either 0 or NULL. If the set 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** contains no NULL values, then the result is 0. If the set 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** contains one or more NULL values, then the result of the 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** expression is also NULL. 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rRhsHasNull==0 || destIfFalse==destIfNull ){ 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This branch runs if it is known at compile time that the RHS 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** cannot contain NULL values. This happens as the result 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of a "NOT NULL" constraint in the database schema. 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Also run this branch if NULL is equivalent to FALSE 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for this particular IN operator. 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1); 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In this branch, the RHS of the IN might contain a NULL and 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the presence of a NULL on the RHS makes a difference in the 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** outcome. 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1, j2, j3; 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* First check to see if the LHS is contained in the RHS. If so, 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then the presence of NULLs in the RHS does not matter, so jump 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** over all of the code that follows. 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Here we begin generating code that runs if the LHS is not 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** contained within the RHS. Generate additional code that 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** tests the RHS for NULLs. If the RHS contains a NULL then 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** jump to destIfNull. If there are no NULLs in the RHS then 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** jump to destIfFalse. 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j2 = sqlite3VdbeAddOp1(v, OP_NotNull, rRhsHasNull); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j3 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, rRhsHasNull, 1); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, -1, rRhsHasNull); 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j3); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, rRhsHasNull, 1); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j2); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Jump to the appropriate target depending on whether or not 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the RHS contains a NULL 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_If, rRhsHasNull, destIfNull); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The OP_Found at the top of this branch jumps here when true, 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** causing the overall IN expression evaluation to fall through. 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "end IN expr")); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */ 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Duplicate an 8-byte value 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static char *dup8bytes(Vdbe *v, const char *in){ 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8); 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( out ){ 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(out, in, 8); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return out; 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an instruction that will put the floating point 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value described by z[0..n-1] into register iMem. 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The z[] string will probably not be zero-terminated. But the 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** z[n] character is guaranteed to be something that does not look 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** like the continuation of the number. 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(z!=0) ){ 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double value; 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zV; 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( negateFlag ) value = -value; 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zV = dup8bytes(v, (char*)&value); 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an instruction that will put the integer describe by 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** text z[0..n-1] into register iMem. 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.u.zToken is always UTF8 and zero-terminated. 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->flags & EP_IntValue ){ 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = pExpr->u.iValue; 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( i>=0 ); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( negFlag ) i = -i; 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, i, iMem); 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int c; 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i64 value; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *z = pExpr->u.zToken; 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( z!=0 ); 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = sqlite3Atoi64(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( c==0 || (c==2 && negFlag) ){ 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zV; 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zV = dup8bytes(v, (char*)&value); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_FLOATING_POINT 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeReal(v, z, negFlag, iMem); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Clear a cache entry. 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void cacheEntryClear(Parse *pParse, struct yColCache *p){ 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->tempReg ){ 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nTempReg<ArraySize(pParse->aTempReg) ){ 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->aTempReg[pParse->nTempReg++] = p->iReg; 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->tempReg = 0; 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Record in the column cache that a particular column from a 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** particular table is stored in a particular register. 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int iReg){ 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int minLru; 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int idxLru; 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iReg>0 ); /* Register numbers are always positive */ 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */ 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The SQLITE_ColumnCache flag disables the column cache. This is used 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for testing only - to verify that SQLite always gets the same answer 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** with and without the column cache. 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->db->flags & SQLITE_ColumnCache ) return; 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* First replace any existing entry. 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Actually, the way the column cache is currently used, we are guaranteed 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that the object will never already be in cache. Verify this guarantee. 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 /* This code wold remove the entry from the cache if it existed */ 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iReg && p->iTable==iTab && p->iColumn==iCol ){ 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cacheEntryClear(pParse, p); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLevel = pParse->iCacheLevel; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iReg = iReg; 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->lru = pParse->iCacheCnt++; 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->iReg==0 || p->iTable!=iTab || p->iColumn!=iCol ); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Find an empty slot and replace it */ 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iReg==0 ){ 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLevel = pParse->iCacheLevel; 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iTable = iTab; 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iColumn = iCol; 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iReg = iReg; 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->tempReg = 0; 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->lru = pParse->iCacheCnt++; 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Replace the last recently used */ 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minLru = 0x7fffffff; 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) idxLru = -1; 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->lru<minLru ){ 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) idxLru = i; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) minLru = p->lru; 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(idxLru>=0) ){ 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = &pParse->aColCache[idxLru]; 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLevel = pParse->iCacheLevel; 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iTable = iTab; 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iColumn = iCol; 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iReg = iReg; 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->tempReg = 0; 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->lru = pParse->iCacheCnt++; 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Indicate that registers between iReg..iReg+nReg-1 are being overwritten. 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Purge the range of registers from the column cache. 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){ 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLast = iReg + nReg - 1; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r = p->iReg; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( r>=iReg && r<=iLast ){ 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cacheEntryClear(pParse, p); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iReg = 0; 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remember the current column cache context. Any new entries added 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** added to the column cache after this call are removed when the 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** corresponding pop occurs. 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCachePush(Parse *pParse){ 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->iCacheLevel++; 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove from the column cache any entries that were added since the 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the previous N Push operations. In other words, restore the cache 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the state it was in N Pushes ago. 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCachePop(Parse *pParse, int N){ 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( N>0 ); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->iCacheLevel>=N ); 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->iCacheLevel -= N; 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iReg && p->iLevel>pParse->iCacheLevel ){ 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cacheEntryClear(pParse, p); 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iReg = 0; 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When a cached column is reused, make sure that its register is 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** no longer available as a temp register. ticket #3879: that same 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register might be in the cache in multiple places, so be sure to 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** get them all. 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){ 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iReg==iReg ){ 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->tempReg = 0; 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to extract the value of the iCol-th column of a table. 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeGetColumnOfTable( 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v, /* The VDBE under construction */ 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab, /* The table containing the value */ 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTabCur, /* The cursor for this table */ 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol, /* Index of the column to extract */ 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regOut /* Extract the valud into this register */ 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 || iCol==pTab->iPKey ){ 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, op, iTabCur, iCol, regOut); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol>=0 ){ 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ColumnDefault(v, pTab, iCol, regOut); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will extract the iColumn-th column from 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table pTab and store the column value in a register. An effort 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is made to store the column value in register iReg, but this is 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not guaranteed. The location of the column value is returned. 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There must be an open cursor to pTab in iTable when this routine 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is called. If iColumn<0 then code is generated that extracts the rowid. 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeGetColumn( 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing and code generating context */ 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab, /* Description of the table we are reading from */ 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iColumn, /* Index of the table column */ 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTable, /* The cursor pointing to the table */ 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iReg /* Store results here */ 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn ){ 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->lru = pParse->iCacheCnt++; 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePinRegister(pParse, p->iReg); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p->iReg; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheStore(pParse, iTable, iColumn, iReg); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return iReg; 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Clear all column cache entries. 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheClear(Parse *pParse){ 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iReg ){ 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cacheEntryClear(pParse, p); 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iReg = 0; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Record the fact that an affinity change has occurred on iCount 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** registers starting with iStart. 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCacheAffinityChange(Parse *pParse, int iStart, int iCount){ 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheRemove(pParse, iStart, iCount); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to move content from registers iFrom...iFrom+nReg-1 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** over to iTo..iTo+nReg-1. Keep the column cache up-to-date. 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(iFrom==iTo) ) return; 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(pParse->pVdbe, OP_Move, iFrom, iTo, nReg); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = p->iReg; 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( x>=iFrom && x<iFrom+nReg ){ 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iReg += iTo-iFrom; 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to copy content from registers iFrom...iFrom+nReg-1 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** over to iTo..iTo+nReg-1. 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeCopy(Parse *pParse, int iFrom, int iTo, int nReg){ 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(iFrom==iTo) ) return; 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nReg; i++){ 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, iFrom+i, iTo+i); 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if any register in the range iFrom..iTo (inclusive) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is used as part of the column cache. 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used within assert() and testcase() macros only 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and does not appear in a normal build. 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){ 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r = p->iReg; 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( r>=iFrom && r<=iTo ) return 1; /*NO_TEST*/ 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_DEBUG || SQLITE_COVERAGE_TEST */ 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code into the current Vdbe to evaluate the given 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression. Attempt to store the results in register "target". 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the register where results are stored. 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** With this routine, there is no guarantee that results will 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be stored in target. The result might be stored in some other 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register if it is convenient to do so. The calling function 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must check the return code and move the results to the desired 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register. 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; /* The VM under construction */ 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op; /* The opcode being coded */ 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int inReg = target; /* Results stored in register inReg */ 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFree1 = 0; /* If non-zero free this temporary register */ 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFree2 = 0; /* If non-zero free this temporary register */ 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1, r2, r3, r4; /* Various register numbers */ 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; /* The database connection */ 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( target>0 && target<=pParse->nMem ); 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v==0 ){ 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->db->mallocFailed ); 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr==0 ){ 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = TK_NULL; 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = pExpr->op; 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( op ){ 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_COLUMN: { 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AggInfo *pAggInfo = pExpr->pAggInfo; 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pAggInfo->directMode ){ 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pCol->iMem>0 ); 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = pCol->iMem; 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pAggInfo->useSortingIdx ){ 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdx, 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iSorterColumn, target); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Otherwise, fall thru into the TK_COLUMN case */ 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_COLUMN: { 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->iTable<0 ){ 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This only happens when coding check constraints */ 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->ckBase>0 ); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = pExpr->iColumn + pParse->ckBase; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn, pExpr->iTable, target); 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_INTEGER: { 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeInteger(pParse, pExpr, 0, target); 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FLOAT: { 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeReal(v, pExpr->u.zToken, 0, target); 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_STRING: { 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_String8, 0, target, 0, pExpr->u.zToken, 0); 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NULL: { 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, target); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_BLOB_LITERAL 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BLOB: { 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n; 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *z; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zBlob; 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->u.zToken[0]=='x' || pExpr->u.zToken[0]=='X' ); 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->u.zToken[1]=='\'' ); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) z = &pExpr->u.zToken[2]; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = sqlite3Strlen30(z) - 1; 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( z[n]=='\'' ); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_VARIABLE: { 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->u.zToken!=0 ); 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->u.zToken[0]!=0 ); 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->u.zToken[1]!=0 ){ 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, pExpr->u.zToken, P4_TRANSIENT); 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_REGISTER: { 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = pExpr->iTable; 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AS: { 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CAST 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_CAST: { 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Expressions of the form: CAST(pLeft AS token) */ 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int aff, to_op; 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aff = sqlite3AffinityType(pExpr->u.zToken); 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_op = aff - SQLITE_AFF_TEXT + OP_ToText; 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( to_op==OP_ToText || aff!=SQLITE_AFF_TEXT ); 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( to_op==OP_ToBlob || aff!=SQLITE_AFF_NONE ); 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( to_op==OP_ToNumeric || aff!=SQLITE_AFF_NUMERIC ); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( to_op==OP_ToInt || aff!=SQLITE_AFF_INTEGER ); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( to_op==OP_ToReal || aff!=SQLITE_AFF_REAL ); 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( to_op==OP_ToText ); 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( to_op==OP_ToBlob ); 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( to_op==OP_ToNumeric ); 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( to_op==OP_ToInt ); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( to_op==OP_ToReal ); 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( inReg!=target ){ 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = target; 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, to_op, inReg); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( usedAsColumnCache(pParse, inReg, inReg) ); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, inReg, 1); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_CAST */ 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_LT: 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_LE: 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_GT: 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_GE: 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NE: 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EQ: { 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_LT==OP_Lt ); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_LE==OP_Le ); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_GT==OP_Gt ); 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_GE==OP_Ge ); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_EQ==OP_Eq ); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_NE==OP_Ne ); 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_LT ); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_LE ); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_GT ); 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_GE ); 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_EQ ); 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_NE ); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2, inReg, SQLITE_STOREP2); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IS: 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ISNOT: { 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_IS ); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_ISNOT ); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = (op==TK_IS) ? TK_EQ : TK_NE; 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2, inReg, SQLITE_STOREP2 | SQLITE_NULLEQ); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AND: 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_OR: 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_PLUS: 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_STAR: 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_MINUS: 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_REM: 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BITAND: 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BITOR: 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_SLASH: 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_LSHIFT: 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_RSHIFT: 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_CONCAT: { 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_AND==OP_And ); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_OR==OP_Or ); 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_PLUS==OP_Add ); 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_MINUS==OP_Subtract ); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_REM==OP_Remainder ); 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_BITAND==OP_BitAnd ); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_BITOR==OP_BitOr ); 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_SLASH==OP_Divide ); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_LSHIFT==OP_ShiftLeft ); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_RSHIFT==OP_ShiftRight ); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_CONCAT==OP_Concat ); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_AND ); 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_OR ); 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_PLUS ); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_MINUS ); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_REM ); 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_BITAND ); 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_BITOR ); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_SLASH ); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_LSHIFT ); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_RSHIFT ); 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_CONCAT ); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, op, r2, r1, target); 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_UMINUS: { 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft = pExpr->pLeft; 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pLeft ); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pLeft->op==TK_INTEGER ){ 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeInteger(pParse, pLeft, 1, target); 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pLeft->op==TK_FLOAT ){ 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeReal(v, pLeft->u.zToken, 1, target); 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regFree1 = r1 = sqlite3GetTempReg(pParse); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, r1); 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free2); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = target; 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BITNOT: 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NOT: { 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_BITNOT==OP_BitNot ); 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_NOT==OP_Not ); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_BITNOT ); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_NOT ); 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = target; 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, op, r1, inReg); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ISNULL: 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NOTNULL: { 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_ISNULL==OP_IsNull ); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_NOTNULL==OP_NotNull ); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_ISNULL ); 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_NOTNULL ); 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, target); 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, op, r1); 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, target, -1); 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_FUNCTION: { 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AggInfo *pInfo = pExpr->pAggInfo; 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pInfo==0 ){ 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = pInfo->aFunc[pExpr->iAgg].iMem; 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_CONST_FUNC: 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FUNCTION: { 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pFarg; /* List of function arguments */ 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nFarg; /* Number of function arguments */ 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FuncDef *pDef; /* The function definition object */ 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nId; /* Length of the function name in bytes */ 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zId; /* The function name */ 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int constMask = 0; /* Mask of function arguments that are constant */ 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 enc = ENC(db); /* The text encoding used by this database */ 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl = 0; /* A collating sequence */ 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_CONST_FUNC ); 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_FUNCTION ); 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ){ 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFarg = 0; 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFarg = pExpr->x.pList; 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nFarg = pFarg ? pFarg->nExpr : 0; 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zId = pExpr->u.zToken; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nId = sqlite3Strlen30(zId); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDef = sqlite3FindFunction(db, zId, nId, nFarg, enc, 0); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDef==0 ){ 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "unknown function: %.*s()", nId, zId); 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Attempt a direct implementation of the built-in COALESCE() and 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** IFNULL() functions. This avoids unnecessary evalation of 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** arguments past the first non-NULL argument. 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDef->flags & SQLITE_FUNC_COALESCE ){ 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int endCoalesce = sqlite3VdbeMakeLabel(v); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nFarg>=2 ); 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=1; i<nFarg; i++){ 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_NotNull, target, endCoalesce); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheRemove(pParse, target, 1); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pFarg->a[i].pExpr, target); 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, endCoalesce); 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pFarg ){ 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GetTempRange(pParse, nFarg); 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */ 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeExprList(pParse, pFarg, r1, 1); 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); /* Ticket 2ea2425d34be */ 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = 0; 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Possibly overload the function if the first argument is 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** a virtual table column. 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** For infix functions (LIKE, GLOB, REGEXP, and MATCH) use the 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** second argument, not the first, as the argument to test to 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** see if it is a column in a virtual table. This is done because 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the left operand of infix functions (the operand we want to 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** control overloading) ends up as the second argument to the 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** function. The expression "A glob B" is equivalent to 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** "glob(B,A). We want to use the A in "A glob B" to test 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for function overloading. But we use the B term in "glob(B,A)". 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nFarg>=2 && (pExpr->flags & EP_InfixFunc) ){ 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[1].pExpr); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( nFarg>0 ){ 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDef = sqlite3VtabOverloadFunction(db, pDef, nFarg, pFarg->a[0].pExpr); 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nFarg; i++){ 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){ 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) constMask |= (1<<i); 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pDef->flags & SQLITE_FUNC_NEEDCOLL)!=0 && !pColl ){ 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3ExprCollSeq(pParse, pFarg->a[i].pExpr); 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDef->flags & SQLITE_FUNC_NEEDCOLL ){ 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pColl ) pColl = db->pDfltColl; 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Function, constMask, r1, target, 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pDef, P4_FUNCDEF); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, (u8)nFarg); 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nFarg ){ 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, r1, nFarg); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EXISTS: 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_SELECT: { 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_EXISTS ); 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_SELECT ); 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IN: { 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destIfFalse = sqlite3VdbeMakeLabel(v); 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destIfNull = sqlite3VdbeMakeLabel(v); 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, target); 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, target); 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, destIfFalse); 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, target, 0); 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, destIfNull); 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SUBQUERY */ 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** x BETWEEN y AND z 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This is equivalent to 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** x>=y AND x<=z 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** X is stored in pExpr->pLeft. 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Y is stored in pExpr->pList->a[0].pExpr. 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Z is stored in pExpr->pList->a[1].pExpr. 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BETWEEN: { 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft = pExpr->pLeft; 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pLItem = pExpr->x.pList->a; 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pRight = pLItem->pExpr; 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2); 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r3 = sqlite3GetTempReg(pParse); 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r4 = sqlite3GetTempReg(pParse); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pLeft, pRight, OP_Ge, 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2, r3, SQLITE_STOREP2); 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLItem++; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRight = pLItem->pExpr; 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree2); 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pLeft, pRight, OP_Le, r1, r2, r4, SQLITE_STOREP2); 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_And, r3, r4, target); 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r3); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r4); 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_UPLUS: { 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_TRIGGER: { 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the opcode is TK_TRIGGER, then the expression is a reference 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to a column in the new.* or old.* pseudo-tables available to 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** trigger programs. In this case Expr.iTable is set to 1 for the 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is set to the column of the pseudo-table to read, or to -1 to 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** read the rowid field. 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The expression is implemented using an OP_Param opcode. The p1 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** parameter is set to 0 for an old.rowid reference, or to (i+1) 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to reference another column of the old.* pseudo-table, where 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** i is the index of the column. For a new.rowid reference, p1 is 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** set to (n+1), where n is the number of columns in each pseudo-table. 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** For a reference to any other column in the new.* pseudo-table, p1 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is set to (n+2+i), where n and i are as defined previously. For 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** example, if the table on which triggers are being fired is 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** declared as: 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** CREATE TABLE t1(a, b); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Then p1 is interpreted as follows: 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** p1==0 -> old.rowid p1==3 -> new.rowid 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** p1==1 -> old.a p1==4 -> new.a 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** p1==2 -> old.b p1==5 -> new.b 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = pExpr->pTab; 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn; 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->iTable==0 || pExpr->iTable==1 ); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->iColumn>=-1 && pExpr->iColumn<pTab->nCol ); 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab->iPKey<0 || pExpr->iColumn!=pTab->iPKey ); 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p1>=0 && p1<(pTab->nCol*2+2) ); 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Param, p1, target); 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "%s.%s -> $%d", 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pExpr->iTable ? "new" : "old"), 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName), 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) )); 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the column has REAL affinity, it may currently be stored as an 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** integer. Use OP_RealAffinity to make sure it is really real. */ 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->iColumn>=0 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_RealAffinity, target); 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Form A: 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** CASE x WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Form B: 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** CASE WHEN e1 THEN r1 WHEN e2 THEN r2 ... WHEN eN THEN rN ELSE y END 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Form A is can be transformed into the equivalent form B as follows: 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** CASE WHEN x=e1 THEN r1 WHEN x=e2 THEN r2 ... 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** WHEN x=eN THEN rN ELSE y END 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** X (if it exists) is in pExpr->pLeft. 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Y is in pExpr->pRight. The Y is also optional. If there is no 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ELSE clause and no other term matches, then the result of the 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** exprssion is NULL. 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Ei is in pExpr->pList->a[i*2] and Ri is pExpr->pList->a[i*2+1]. 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The result of the expression is the Ri for the first matching Ei, 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** or if there is no matching Ei, the ELSE term Y, or if there is 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** no ELSE term, NULL. 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: assert( op==TK_CASE ); { 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int endLabel; /* GOTO label for end of CASE stmt */ 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nextCase; /* GOTO label for next WHEN clause */ 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nExpr; /* 2x number of WHEN terms */ 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; /* List of WHEN terms */ 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *aListelem; /* Array of WHEN terms */ 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr opCompare; /* The X==Ei expression */ 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr cacheX; /* Cached expression X */ 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pX; /* The X expression */ 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */ 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VVA_ONLY( int iCacheLevel = pParse->iCacheLevel; ) 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList ); 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert((pExpr->x.pList->nExpr % 2) == 0); 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(pExpr->x.pList->nExpr > 0); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = pExpr->x.pList; 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aListelem = pEList->a; 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nExpr = pEList->nExpr; 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) endLabel = sqlite3VdbeMakeLabel(v); 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pX = pExpr->pLeft)!=0 ){ 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cacheX = *pX; 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pX->op==TK_COLUMN ); 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pX->op==TK_REGISTER ); 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cacheX.iTable = sqlite3ExprCodeTemp(pParse, pX, ®Free1); 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cacheX.op = TK_REGISTER; 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opCompare.op = TK_EQ; 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opCompare.pLeft = &cacheX; 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTest = &opCompare; 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001: 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The value in regFree1 might get SCopy-ed into the file result. 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** So make sure that the regFree1 register is not reused for other 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** purposes and possibly overwritten. */ 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regFree1 = 0; 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nExpr; i=i+2){ 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pX ){ 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTest!=0 ); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opCompare.pRight = aListelem[i].pExpr; 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTest = aListelem[i].pExpr; 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nextCase = sqlite3VdbeMakeLabel(v); 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pTest->op==TK_COLUMN ); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( aListelem[i+1].pExpr->op==TK_REGISTER ); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, endLabel); 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, nextCase); 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->pRight ){ 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pExpr->pRight, target); 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, target); 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db->mallocFailed || pParse->nErr>0 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || pParse->iCacheLevel==iCacheLevel ); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, endLabel); 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_RAISE: { 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->affinity==OE_Rollback 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || pExpr->affinity==OE_Abort 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || pExpr->affinity==OE_Fail 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || pExpr->affinity==OE_Ignore 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pParse->pTriggerTab ){ 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RAISE() may only be used within a trigger-program"); 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->affinity==OE_Abort ){ 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3MayAbort(pParse); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->affinity==OE_Ignore ){ 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4( 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3HaltConstraint(pParse, pExpr->affinity, pExpr->u.zToken, 0); 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree1); 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree2); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return inReg; 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code to evaluate an expression and store the results 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into a register. Return the register number where the results 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are stored. 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the register is a temporary register that can be deallocated, 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then write its number into *pReg. If the result register is not 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a temporary, then set *pReg to zero. 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1 = sqlite3GetTempReg(pParse); 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( r2==r1 ){ 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pReg = r1; 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pReg = 0; 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return r2; 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will evaluate expression pExpr and store the 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** results in register target. The results are guaranteed to appear 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in register target. 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int inReg; 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( target>0 && target<=pParse->nMem ); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr && pExpr->op==TK_REGISTER ){ 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target); 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->pVdbe || pParse->db->mallocFailed ); 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( inReg!=target && pParse->pVdbe ){ 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target; 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that evalutes the given expression and puts the result 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in register target. 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Also make a copy of the expression results into another "cache" register 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and modify the expression so that the next time it is evaluated, 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the result is a copy of the cache register. 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is used for expressions that are used multiple 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** times. They are evaluated once and the results of the expression 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are reused. 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){ 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int inReg; 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg = sqlite3ExprCode(pParse, pExpr, target); 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( target>0 ); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This routine is called for terms to INSERT or UPDATE. And the only 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** other place where expressions can be converted into TK_REGISTER is 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in WHERE clause processing. So as currently implemented, there is 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** no way for a TK_REGISTER to exist here. But it seems prudent to 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** keep the ALWAYS() in case the conditions above change with future 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** modifications or enhancements. */ 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pExpr->op!=TK_REGISTER) ){ 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iMem; 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iMem = ++pParse->nMem; 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Copy, inReg, iMem); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = iMem; 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op2 = pExpr->op; 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_REGISTER; 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return inReg; 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return TRUE if pExpr is an constant expression that is appropriate 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for factoring out of a loop. Appropriate expressions are: 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * Any expression that evaluates to two or more opcodes. 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * Any OP_Integer, OP_Real, OP_String, OP_Blob, OP_Null, 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or OP_Variable that does not need to be placed in a 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** specific register. 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is no point in factoring out single-instruction constant 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expressions that need to be placed in a particular register. 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** We could factor them out, but then we would end up adding an 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** OP_SCopy instruction to move the value into the correct register 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** later. We might as well just use the original instruction and 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** avoid the OP_SCopy. 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int isAppropriateForFactoring(Expr *p){ 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !sqlite3ExprIsConstantNotJoin(p) ){ 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Only constant expressions are appropriate for factoring */ 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (p->flags & EP_FixedDest)==0 ){ 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; /* Any constant without a fixed destination is appropriate */ 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( p->op==TK_UPLUS ) p = p->pLeft; 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( p->op ){ 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_BLOB_LITERAL 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BLOB: 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_VARIABLE: 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_INTEGER: 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FLOAT: 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NULL: 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_STRING: { 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_BLOB ); 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_VARIABLE ); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_INTEGER ); 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_FLOAT ); 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_NULL ); 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_STRING ); 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Single-instruction constants with a fixed destination are 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** better done in-line. If we factor them, they will just end 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** up generating an OP_SCopy to move the value to the destination 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** register. */ 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_UMINUS: { 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pLeft->op==TK_FLOAT || p->pLeft->op==TK_INTEGER ){ 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If pExpr is a constant expression that is appropriate for 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** factoring out of a loop, then evaluate the expression 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into a register and convert the expression into a TK_REGISTER 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression. 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int evalConstExpr(Walker *pWalker, Expr *pExpr){ 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse = pWalker->pParse; 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pExpr->op ){ 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IN: 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_REGISTER: { 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FUNCTION: 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_FUNCTION: 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_CONST_FUNC: { 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The arguments to a function have a fixed destination. 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Mark them this way to avoid generated unneeded OP_SCopy 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** instructions. 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList = pExpr->x.pList; 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList ){ 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = pList->nExpr; 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem = pList->a; 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(; i>0; i--, pItem++){ 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pItem->pExpr) ) pItem->pExpr->flags |= EP_FixedDest; 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isAppropriateForFactoring(pExpr) ){ 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1 = ++pParse->nMem; 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r2; 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(r1!=r2) ) sqlite3ReleaseTempReg(pParse, r1); 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op2 = pExpr->op; 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_REGISTER; 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = r2; 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Continue; 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Preevaluate constant subexpressions within pExpr and store the 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** results in registers. Modify pExpr so that the constant subexpresions 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are TK_REGISTER opcodes that refer to the precomputed values. 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is a no-op if the jump to the cookie-check code has 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** already occur. Since the cookie-check jump is generated prior to 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any other serious processing, this check ensures that there is no 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** way to accidently bypass the constant initializations. 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is also a no-op if the SQLITE_FactorOutConst optimization 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is disabled via the sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS) 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** interface. This allows test logic to verify that the same answer is 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** obtained for queries regardless of whether or not constants are 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** precomputed into registers or if they are inserted in-line. 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprCodeConstants(Parse *pParse, Expr *pExpr){ 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Walker w; 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->cookieGoto ) return; 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pParse->db->flags & SQLITE_FactorOutConst)!=0 ) return; 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xExprCallback = evalConstExpr; 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xSelectCallback = 0; 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.pParse = pParse; 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkExpr(&w, pExpr); 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that pushes the value of every element of the given 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression list into a sequence of registers beginning at target. 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of elements evaluated. 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCodeExprList( 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList, /* The expression list to be coded */ 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int target, /* Where to write results */ 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int doHardCopy /* Make a hard copy of every element */ 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, n; 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList!=0 ); 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( target>0 ); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */ 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = pList->nExpr; 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pItem=pList->a, i=0; i<n; i++, pItem++){ 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr = pItem->pExpr; 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( inReg!=target+i ){ 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(pParse->pVdbe, doHardCopy ? OP_Copy : OP_SCopy, 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inReg, target+i); 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return n; 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a BETWEEN operator. 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x BETWEEN y AND z 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The above is equivalent to 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** x>=y AND x<=z 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code it as such, taking care to do the common subexpression 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** elementation of x. 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void exprCodeBetween( 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing and code generating context */ 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr, /* The BETWEEN expression */ 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dest, /* Jump here if the jump is taken */ 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int jumpIfTrue, /* Take the jump if the BETWEEN is true */ 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int jumpIfNull /* Take the jump if the BETWEEN is NULL */ 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr exprAnd; /* The AND operator in x>=y AND x<=z */ 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr compLeft; /* The x>=y term */ 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr compRight; /* The x<=z term */ 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr exprX; /* The x subexpression */ 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFree1 = 0; /* Temporary use register */ 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprX = *pExpr->pLeft; 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprAnd.op = TK_AND; 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprAnd.pLeft = &compLeft; 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprAnd.pRight = &compRight; 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) compLeft.op = TK_GE; 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) compLeft.pLeft = &exprX; 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) compLeft.pRight = pExpr->x.pList->a[0].pExpr; 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) compRight.op = TK_LE; 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) compRight.pLeft = &exprX; 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) compRight.pRight = pExpr->x.pList->a[1].pExpr; 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprX.iTable = sqlite3ExprCodeTemp(pParse, &exprX, ®Free1); 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprX.op = TK_REGISTER; 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( jumpIfTrue ){ 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfTrue(pParse, &exprAnd, dest, jumpIfNull); 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, &exprAnd, dest, jumpIfNull); 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree1); 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Ensure adequate test coverage */ 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1==0 ); 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1!=0 ); 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1==0 ); 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1!=0 ); 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1==0 ); 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1!=0 ); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1==0 ); 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1!=0 ); 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a boolean expression such that a jump is made 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the label "dest" if the expression is true but execution 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** continues straight thru if the expression is false. 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression evaluates to NULL (neither true nor false), then 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** take the jump if the jumpIfNull flag is SQLITE_JUMPIFNULL. 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This code depends on the fact that certain token values (ex: TK_EQ) 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are the same as opcode values (ex: OP_Eq) that implement the corresponding 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operation. Special comments in vdbe.c and the mkopcodeh.awk script in 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the make process cause these values to align. Assert()s in the code 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** below verify that the numbers are aligned correctly. 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op = 0; 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFree1 = 0; 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFree2 = 0; 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1, r2; 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(v==0) ) return; /* Existance of VDBE checked by caller */ 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(pExpr==0) ) return; /* No way this can happen */ 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = pExpr->op; 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( op ){ 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AND: { 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int d2 = sqlite3VdbeMakeLabel(v); 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL); 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, d2); 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_OR: { 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NOT: { 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_LT: 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_LE: 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_GT: 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_GE: 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NE: 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EQ: { 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_LT==OP_Lt ); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_LE==OP_Le ); 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_GT==OP_Gt ); 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_GE==OP_Ge ); 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_EQ==OP_Eq ); 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_NE==OP_Ne ); 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_LT ); 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_LE ); 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_GT ); 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_GE ); 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_EQ ); 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_NE ); 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2, dest, jumpIfNull); 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IS: 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ISNOT: { 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_IS ); 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_ISNOT ); 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = (op==TK_IS) ? TK_EQ : TK_NE; 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2, dest, SQLITE_NULLEQ); 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ISNULL: 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NOTNULL: { 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_ISNULL==OP_IsNull ); 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( TK_NOTNULL==OP_NotNull ); 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_ISNULL ); 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_NOTNULL ); 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, op, r1, dest); 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BETWEEN: { 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprCodeBetween(pParse, pExpr, dest, 1, jumpIfNull); 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IN: { 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destIfFalse = sqlite3VdbeMakeLabel(v); 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destIfNull = jumpIfNull ? dest : destIfFalse; 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, destIfFalse); 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_If, r1, dest, jumpIfNull!=0); 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree1); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree2); 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for a boolean expression such that a jump is made 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the label "dest" if the expression is false but execution 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** continues straight thru if the expression is true. 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the expression evaluates to NULL (neither true nor false) then 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** jump if jumpIfNull is SQLITE_JUMPIFNULL or fall through if jumpIfNull 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is 0. 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op = 0; 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFree1 = 0; 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regFree2 = 0; 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1, r2; 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( jumpIfNull==SQLITE_JUMPIFNULL || jumpIfNull==0 ); 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(v==0) ) return; /* Existance of VDBE checked by caller */ 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr==0 ) return; 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The value of pExpr->op and op are related as follows: 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pExpr->op op 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** --------- ---------- 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_ISNULL OP_NotNull 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_NOTNULL OP_IsNull 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_NE OP_Eq 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_EQ OP_Ne 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_GT OP_Le 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_LE OP_Gt 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_GE OP_Lt 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** TK_LT OP_Ge 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** For other values of pExpr->op, op is undefined and unused. 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The value of TK_ and OP_ constants are arranged such that we 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** can compute the mapping above using the following expression. 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Assert()s verify that the computation is correct. 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = ((pExpr->op+(TK_ISNULL&1))^1)-(TK_ISNULL&1); 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Verify correct alignment of TK_ and OP_ constants 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_ISNULL || op==OP_NotNull ); 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_NOTNULL || op==OP_IsNull ); 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_NE || op==OP_Eq ); 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_EQ || op==OP_Ne ); 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_LT || op==OP_Ge ); 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_LE || op==OP_Gt ); 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_GT || op==OP_Le ); 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->op!=TK_GE || op==OP_Lt ); 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pExpr->op ){ 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AND: { 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_OR: { 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int d2 = sqlite3VdbeMakeLabel(v); 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePush(pParse); 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL); 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, d2); 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCachePop(pParse, 1); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NOT: { 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_LT: 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_LE: 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_GT: 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_GE: 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NE: 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EQ: { 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_LT ); 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_LE ); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_GT ); 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_GE ); 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_EQ ); 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_NE ); 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2, dest, jumpIfNull); 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IS: 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ISNOT: { 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_IS ); 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_ISNOT ); 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1, r2, dest, SQLITE_NULLEQ); 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree2==0 ); 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ISNULL: 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_NOTNULL: { 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_ISNULL ); 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( op==TK_NOTNULL ); 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, op, r1, dest); 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_BETWEEN: { 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exprCodeBetween(pParse, pExpr, dest, 0, jumpIfNull); 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IN: { 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( jumpIfNull ){ 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeIN(pParse, pExpr, dest, dest); 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int destIfNull = sqlite3VdbeMakeLabel(v); 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, destIfNull); 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3ExprCodeTemp(pParse, pExpr, ®Free1); 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_IfNot, r1, dest, jumpIfNull!=0); 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( regFree1==0 ); 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( jumpIfNull==0 ); 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree1); 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regFree2); 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Do a deep comparison of two expression trees. Return 0 if the two 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expressions are completely identical. Return 1 if they differ only 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by a COLLATE operator at the top level. Return 2 if there are differences 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** other than the top-level COLLATE operator. 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Sometimes this routine will return 2 even if the two expressions 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** really are equivalent. If we cannot prove that the expressions are 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** identical, we return 2 just to be safe. So if this routine 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returns 2, then you do not really know for certain if the two 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expressions are the same. But if you get a 0 or 1 return, then you 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be sure the expressions are the same. In the places where 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this routine is used, it does not hurt to get an extra 2 - that 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** just might result in some slightly slower code. But returning 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an incorrect 0 or 1 could lead to a malfunction. 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprCompare(Expr *pA, Expr *pB){ 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pA==0||pB==0 ){ 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pB==pA ? 0 : 2; 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(pA, EP_TokenOnly|EP_Reduced) ); 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(pB, EP_TokenOnly|EP_Reduced) ); 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pA, EP_xIsSelect) || ExprHasProperty(pB, EP_xIsSelect) ){ 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pA->op!=pB->op ) return 2; 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprCompare(pA->pLeft, pB->pLeft) ) return 2; 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprCompare(pA->pRight, pB->pRight) ) return 2; 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList) ) return 2; 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pA->iTable!=pB->iTable || pA->iColumn!=pB->iColumn ) return 2; 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pA, EP_IntValue) ){ 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasProperty(pB, EP_IntValue) || pA->u.iValue!=pB->u.iValue ){ 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pA->op!=TK_COLUMN && pA->u.zToken ){ 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pB, EP_IntValue) || NEVER(pB->u.zToken==0) ) return 2; 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ){ 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pA->flags & EP_ExpCollate)!=(pB->flags & EP_ExpCollate) ) return 1; 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pA->flags & EP_ExpCollate)!=0 && pA->pColl!=pB->pColl ) return 2; 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compare two ExprList objects. Return 0 if they are identical and 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** non-zero if they differ in any way. 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine might return non-zero for equivalent ExprLists. The 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** only consequence will be disabled optimizations. But this routine 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must never return 0 if the two ExprList objects are different, or 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a malfunction will result. 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Two NULL pointers are considered to be the same. But a NULL pointer 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** always differs from a non-NULL pointer. 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ExprListCompare(ExprList *pA, ExprList *pB){ 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pA==0 && pB==0 ) return 0; 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pA==0 || pB==0 ) return 1; 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pA->nExpr!=pB->nExpr ) return 1; 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pA->nExpr; i++){ 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExprA = pA->a[i].pExpr; 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExprB = pB->a[i].pExpr; 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1; 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprCompare(pExprA, pExprB) ) return 1; 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new element to the pAggInfo->aCol[] array. Return the index of 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the new element. Return a negative number if malloc fails. 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int addAggInfoColumn(sqlite3 *db, AggInfo *pInfo){ 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->aCol = sqlite3ArrayAllocate( 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db, 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->aCol, 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(pInfo->aCol[0]), 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pInfo->nColumn, 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pInfo->nColumnAlloc, 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &i 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a new element to the pAggInfo->aFunc[] array. Return the index of 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the new element. Return a negative number if malloc fails. 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->aFunc = sqlite3ArrayAllocate( 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db, 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->aFunc, 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(pInfo->aFunc[0]), 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3, 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pInfo->nFunc, 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &pInfo->nFuncAlloc, 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &i 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is the xExprCallback for a tree walker. It is used to 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implement sqlite3ExprAnalyzeAggregates(). See sqlite3ExprAnalyzeAggregates 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for additional information. 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pNC = pWalker->u.pNC; 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse = pNC->pParse; 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrcList = pNC->pSrcList; 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AggInfo *pAggInfo = pNC->pAggInfo; 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pExpr->op ){ 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_COLUMN: 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_COLUMN: { 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_AGG_COLUMN ); 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_COLUMN ); 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check to see if the column is in one of the tables in the FROM 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** clause of the aggregate query */ 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pSrcList!=0) ){ 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem = pSrcList->a; 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pSrcList->nSrc; i++, pItem++){ 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_col *pCol; 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) ); 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->iTable==pItem->iCursor ){ 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we reach this point, it means that pExpr refers to a table 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that is in the FROM clause of the aggregate query. 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Make an entry for the column in pAggInfo->aCol[] if there 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is not an entry there already. 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int k; 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol = pAggInfo->aCol; 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(k=0; k<pAggInfo->nColumn; k++, pCol++){ 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pCol->iTable==pExpr->iTable && 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iColumn==pExpr->iColumn ){ 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (k>=pAggInfo->nColumn) 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (k = addAggInfoColumn(pParse->db, pAggInfo))>=0 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol = &pAggInfo->aCol[k]; 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->pTab = pExpr->pTab; 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iTable = pExpr->iTable; 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iColumn = pExpr->iColumn; 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iMem = ++pParse->nMem; 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iSorterColumn = -1; 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->pExpr = pExpr; 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pAggInfo->pGroupBy ){ 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j, n; 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pGB = pAggInfo->pGroupBy; 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pTerm = pGB->a; 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = pGB->nExpr; 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<n; j++, pTerm++){ 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE = pTerm->pExpr; 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE->op==TK_COLUMN && pE->iTable==pExpr->iTable && 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pE->iColumn==pExpr->iColumn ){ 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iSorterColumn = j; 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pCol->iSorterColumn<0 ){ 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->iSorterColumn = pAggInfo->nSortingColumn++; 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* There is now an entry for pExpr in pAggInfo->aCol[] (either 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** because it was there before or because we just created it). 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Convert the pExpr to be a TK_AGG_COLUMN referring to that 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pAggInfo->aCol[] entry. 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetIrreducible(pExpr); 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pAggInfo = pAggInfo; 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_AGG_COLUMN; 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iAgg = (i16)k; 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } /* endif pExpr->iTable==pItem->iCursor */ 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } /* end loop over pSrcList */ 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_FUNCTION: { 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The pNC->nDepth==0 test causes aggregate functions in subqueries 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to be ignored */ 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->nDepth==0 ){ 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check to see if pExpr is a duplicate of another aggregate 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** function that is already in the pAggInfo structure 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_func *pItem = pAggInfo->aFunc; 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pAggInfo->nFunc; i++, pItem++){ 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprCompare(pItem->pExpr, pExpr)==0 ){ 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=pAggInfo->nFunc ){ 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* pExpr is original. Make a new entry in pAggInfo->aFunc[] 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 enc = ENC(pParse->db); 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = addAggInfoFunc(pParse->db, pAggInfo); 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>=0 ){ 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem = &pAggInfo->aFunc[i]; 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->pExpr = pExpr; 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iMem = ++pParse->nMem; 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->pFunc = sqlite3FindFunction(pParse->db, 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->u.zToken, sqlite3Strlen30(pExpr->u.zToken), 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->flags & EP_Distinct ){ 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iDistinct = pParse->nTab++; 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iDistinct = -1; 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) ); 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetIrreducible(pExpr); 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iAgg = (i16)i; 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pAggInfo = pAggInfo; 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Continue; 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){ 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pNC = pWalker->u.pNC; 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->nDepth==0 ){ 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->nDepth++; 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkSelect(pWalker, pSelect); 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->nDepth--; 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Continue; 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Analyze the given expression looking for aggregate functions and 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for variables that need to be added to the pParse->aAgg[] array. 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make additional entries to the pParse->aAgg[] array as necessary. 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine should only be called after the expression has been 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** analyzed by sqlite3ResolveExprNames(). 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Walker w; 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xExprCallback = analyzeAggregate; 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xSelectCallback = analyzeAggregatesInSelect; 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.u.pNC = pNC; 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pNC->pSrcList!=0 ); 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkExpr(&w, pExpr); 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call sqlite3ExprAnalyzeAggregates() for every expression in an 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression list. Return the number of errors. 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an error is found, the analysis is cut short. 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ExprAnalyzeAggList(NameContext *pNC, ExprList *pList){ 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList ){ 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){ 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprAnalyzeAggregates(pNC, pItem->pExpr); 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a single new register for use to hold some intermediate result. 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3GetTempReg(Parse *pParse){ 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nTempReg==0 ){ 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ++pParse->nMem; 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pParse->aTempReg[--pParse->nTempReg]; 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Deallocate a register, making available for reuse for some other 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** purpose. 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a register is currently being used by the column cache, then 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the dallocation is deferred until the column cache line that uses 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the register becomes stale. 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iReg && pParse->nTempReg<ArraySize(pParse->aTempReg) ){ 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct yColCache *p; 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iReg==iReg ){ 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->tempReg = 1; 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->aTempReg[pParse->nTempReg++] = iReg; 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate or deallocate a block of nReg consecutive registers 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3GetTempRange(Parse *pParse, int nReg){ 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, n; 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = pParse->iRangeReg; 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = pParse->nRangeReg; 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nReg<=n ){ 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !usedAsColumnCache(pParse, i, i+n-1) ); 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->iRangeReg += nReg; 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nRangeReg -= nReg; 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = pParse->nMem+1; 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem += nReg; 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheRemove(pParse, iReg, nReg); 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nReg>pParse->nRangeReg ){ 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nRangeReg = nReg; 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->iRangeReg = iReg; 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3756