15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2008 August 18 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)** 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains routines used for walking the parser tree and 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** resolve all identifiers by associating them with a particular 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table and column. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Turn the pExpr expression into an alias for the iCol-th column of the 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result set in pEList. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the result set column is a simple column reference, then this routine 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** makes an exact copy. But for any other kind of expression, this 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine make a copy of the result set column as the argument to the 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** TK_AS operator. The TK_AS operator causes the expression to be 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** evaluated just once and then reused for each alias. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The reason for suppressing the TK_AS term when the expression is a simple 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column reference is so that the column reference will be recognized as 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** usable by indices within the WHERE clause processing logic. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Hack: The TK_AS operator is inhibited if zType[0]=='G'. This means 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that in a GROUP BY clause, the expression is evaluated twice. Hence: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT random()%5 AS x, count(*) FROM tab GROUP BY x 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Is equivalent to: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT random()%5 AS x, count(*) FROM tab GROUP BY random()%5 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The result of random()%5 in the GROUP BY clause is probably different 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from the result in the result-set. We might fix this someday. Or 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then again, we might not... 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void resolveAlias( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList, /* A result set */ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol, /* A column in the result set. 0..pEList->nExpr-1 */ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr, /* Transform this into an alias to the result set */ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zType /* "GROUP" or "ORDER" or "" */ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pOrig; /* The iCol-th column of the result set */ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pDup; /* Copy of pOrig */ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* The database connection */ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iCol>=0 && iCol<pEList->nExpr ); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrig = pEList->a[iCol].pExpr; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pOrig!=0 ); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pOrig->flags & EP_Resolved ); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrig->op!=TK_COLUMN && zType[0]!='G' ){ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup = sqlite3ExprDup(db, pOrig, 0); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup = sqlite3PExpr(pParse, TK_AS, pDup, 0, 0); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDup==0 ) return; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->a[iCol].iAlias==0 ){ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList->a[iCol].iAlias = (u16)(++pParse->nAlias); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup->iTable = pEList->a[iCol].iAlias; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( ExprHasProperty(pOrig, EP_IntValue) || pOrig->u.zToken==0 ){ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup = sqlite3ExprDup(db, pOrig, 0); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDup==0 ) return; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zToken = pOrig->u.zToken; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( zToken!=0 ); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrig->u.zToken = 0; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup = sqlite3ExprDup(db, pOrig, 0); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrig->u.zToken = zToken; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDup==0 ) return; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (pDup->flags & (EP_Reduced|EP_TokenOnly))==0 ); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup->flags2 |= EP2_MallocedToken; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup->u.zToken = sqlite3DbStrDup(db, zToken); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->flags & EP_ExpCollate ){ 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup->pColl = pExpr->pColl; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup->flags |= EP_ExpCollate; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** prevents ExprDelete() from deleting the Expr structure itself, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** allowing it to be repopulated by the memcpy() on the following line. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(pExpr, EP_Static); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pExpr); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(pExpr, pDup, sizeof(*pExpr)); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pDup); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that name in the set of source tables in pSrcList and make the pExpr 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression node refer back to that source column. The following changes 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are made to pExpr: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr->iDb Set the index in db->aDb[] of the database X 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (even if X is implied). 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr->iTable Set to the cursor number for the table obtained 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from pSrcList. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr->pTab Points to the Table structure of X.Y (even if 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** X and/or Y are implied.) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr->iColumn Set to the column number within the table. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr->op Set to TK_COLUMN. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr->pLeft Any expression this points to is deleted 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pExpr->pRight Any expression this points to is deleted. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The zDb variable is the name of the database (the "X"). This value may be 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL meaning that name is of the form Y.Z or Z. Any available database 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be used. The zTable variable is the name of the table (the "Y"). This 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value can be NULL if zDb is also NULL. If zTable is NULL it 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** means that the form of the name is Z and that columns from any table 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** can be used. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the name cannot be resolved unambiguously, leave an error message 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in pParse and return WRC_Abort. Return WRC_Prune on success. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int lookupName( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parsing context */ 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zDb, /* Name of the database containing table, or NULL */ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zTab, /* Name of table containing column, or NULL */ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zCol, /* Name of the column. */ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pNC, /* The name context used to resolve the name */ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr /* Make this EXPR node point to the selected column */ 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; /* Loop counters */ 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cnt = 0; /* Number of matching column names */ 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cntTab = 0; /* Number of matching table names */ 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; /* The database connection */ 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem; /* Use for looping over pSrcList items */ 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pTopNC = pNC; /* First namecontext in the list */ 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Schema *pSchema = 0; /* Schema of the expression */ 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isTrigger = 0; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pNC ); /* the name context cannot be NULL. */ 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( ~ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) ); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Initialize the node to no-match */ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = -1; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pTab = 0; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetIrreducible(pExpr); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Start at the inner-most context and move outward until a match is found */ 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pNC && cnt==0 ){ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrcList = pNC->pSrcList; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrcList ){ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){ 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Column *pCol; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pItem->pTab; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab!=0 && pTab->zName!=0 ); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iDb = sqlite3SchemaToIndex(db, pTab->pSchema); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab->nCol>0 ); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTab ){ 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->zAlias ){ 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zTabName = pItem->zAlias; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zTabName = pTab->zName; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(zTabName==0) || sqlite3StrICmp(zTabName, zTab)!=0 ){ 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==(cntTab++) ){ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = pItem->iCursor; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pTab = pTab; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSchema = pTab->pSchema; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMatch = pItem; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IdList *pUsing; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cnt++; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = pItem->iCursor; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pTab = pTab; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMatch = pItem; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSchema = pTab->pSchema; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i<pSrcList->nSrc-1 ){ 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem[1].jointype & JT_NATURAL ){ 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this match occurred in the left table of a natural join, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then skip the right table to avoid a duplicate match */ 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem++; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( (pUsing = pItem[1].pUsing)!=0 ){ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this match occurs on a column that is in the USING clause 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of a join, skip the search of the right table of the join 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to avoid a duplicate match there. */ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int k; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(k=0; k<pUsing->nId; k++){ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ){ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem++; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we have not already resolved the name, then maybe 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it is a new.* or old.* trigger argument reference 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zDb==0 && zTab!=0 && cnt==0 && pParse->pTriggerTab!=0 ){ 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op = pParse->eTriggerOp; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = 0; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){ 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = 1; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pParse->pTriggerTab; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = 0; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pParse->pTriggerTab; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab ){ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSchema = pTab->pSchema; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cntTab++; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(iCol=0; iCol<pTab->nCol; iCol++){ 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Column *pCol = &pTab->aCol[iCol]; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol==pTab->iPKey ){ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCol = -1; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) ){ 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCol = -1; /* IMP: R-44911-55124 */ 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<pTab->nCol ){ 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cnt++; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 ){ 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->affinity = SQLITE_AFF_INTEGER; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pExpr->iTable==0 ){ 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iCol==31 ); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iCol==32 ); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iCol==31 ); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iCol==32 ); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = (i16)iCol; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pTab = pTab; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isTrigger = 1; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_TRIGGER) */ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Perhaps the name is a reference to the ROWID 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){ 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cnt = 1; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = -1; /* IMP: R-44911-55124 */ 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->affinity = SQLITE_AFF_INTEGER; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** might refer to an result-set alias. This happens, for example, when 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we are resolving names in the WHERE clause of the following command: 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT a+b AS x FROM table WHERE x<10; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** In cases like this, replace pExpr with a copy of the expression that 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** forms the result set entry ("a+b" in the example) and return immediately. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Note that the expression in the result set should have already been 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** resolved by the time the WHERE clause is resolved. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( cnt==0 && (pEList = pNC->pEList)!=0 && zTab==0 ){ 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pEList->nExpr; j++){ 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zAs = pEList->a[j].zName; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pOrig; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->x.pList==0 ); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->x.pSelect==0 ); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrig = pEList->a[j].pExpr; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pNC->allowAgg && ExprHasProperty(pOrig, EP_Agg) ){ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resolveAlias(pParse, pEList, j, pExpr, ""); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cnt = 1; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMatch = 0; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( zTab==0 && zDb==0 ); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto lookupname_end; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Advance to the next name context. The loop will exit when either 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we have a match (cnt>0) or when we run out of name contexts. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( cnt==0 ){ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC = pNC->pNext; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If X and Y are NULL (in other words if only the column name Z is 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** supplied) and the value of Z is enclosed in double-quotes, then 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Z is a string literal if it doesn't match any column names. In that 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** case, we need to return right away and not make any changes to 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pExpr. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Because no reference was made to outer contexts, the pNC->nRef 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** fields are not changed in any context. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){ 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_STRING; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pTab = 0; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** cnt==0 means there was not match. cnt>1 means there were two or 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** more matches. Either way, we have an error. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( cnt!=1 ){ 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zErr; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zErr = cnt==0 ? "no such column" : "ambiguous column name"; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zDb ){ 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( zTab ){ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "%s: %s.%s", zErr, zTab, zCol); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "%s: %s", zErr, zCol); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->checkSchema = 1; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTopNC->nErr++; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If a column from a table in pSrcList is referenced, then record 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** bit 0 to be set. Column 1 sets bit 1. And so forth. If the 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** column number is greater than the number of bits in the bitmask 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then set the high-order bit of the bitmask. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->iColumn>=0 && pMatch!=0 ){ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = pExpr->iColumn; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( n==BMS-1 ); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n>=BMS ){ 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) n = BMS-1; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pMatch->iCursor==pExpr->iTable ); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMatch->colUsed |= ((Bitmask)1)<<n; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Clean up and return 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pExpr->pLeft); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pLeft = 0; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pExpr->pRight); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pRight = 0; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lookupname_end: 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( cnt==1 ){ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pNC!=0 ); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Increment the nRef value on all name contexts from TopNC up to 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the point where the name matched. */ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(;;){ 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTopNC!=0 ); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTopNC->nRef++; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTopNC==pNC ) break; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTopNC = pTopNC->pNext; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate and return a pointer to an expression to load the column iCol 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from datasource iSrc in SrcList pSrc. 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSrc, int iCol){ 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p = sqlite3ExprAlloc(db, TK_COLUMN, 0, 0); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem = &pSrc->a[iSrc]; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pTab = pItem->pTab; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iTable = pItem->iCursor; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pTab->iPKey==iCol ){ 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iColumn = -1; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iColumn = (ynVar)iCol; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iCol==BMS ); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( iCol==BMS-1 ); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(p, EP_Resolved); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return p; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is callback for sqlite3WalkExpr(). 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Resolve symbolic names into TK_COLUMN operators for the current 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** node in the expression tree. Return 0 to continue the search down 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the tree or 2 to abort the tree walk. 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine also does error checking and name resolution for 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function names. The operator for aggregate functions is changed 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to TK_AGG_FUNCTION. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int resolveExprStep(Walker *pWalker, Expr *pExpr){ 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pNC; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC = pWalker->u.pNC; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pNC!=0 ); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse = pNC->pParse; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParse==pWalker->pParse ); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasAnyProperty(pExpr, EP_Resolved) ) return WRC_Prune; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(pExpr, EP_Resolved); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrcList = pNC->pSrcList; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pNC->pSrcList->nSrc; i++){ 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pExpr->op ){ 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The special operator TK_ROW means use the rowid for the first 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** column in the FROM clause. This is used by the LIMIT and ORDER BY 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** clause processing on UPDATE and DELETE statements. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ROW: { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrcList = pNC->pSrcList; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrcList && pSrcList->nSrc==1 ); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem = pSrcList->a; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_COLUMN; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pTab = pItem->pTab; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iTable = pItem->iCursor; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->iColumn = -1; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->affinity = SQLITE_AFF_INTEGER; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) */ 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A lone identifier is the name of a column. 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ID: { 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return lookupName(pParse, 0, 0, pExpr->u.zToken, pNC, pExpr); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A table name and column name: ID.ID 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Or a database, table and column: ID.ID.ID 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_DOT: { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zColumn; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zTable; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zDb; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pRight; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* if( pSrcList==0 ) break; */ 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRight = pExpr->pRight; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight->op==TK_ID ){ 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = 0; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zTable = pExpr->pLeft->u.zToken; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColumn = pRight->u.zToken; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pRight->op==TK_DOT ); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zDb = pExpr->pLeft->u.zToken; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zTable = pRight->pLeft->u.zToken; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColumn = pRight->pRight->u.zToken; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Resolve function names 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_CONST_FUNC: 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_FUNCTION: { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList = pExpr->x.pList; /* The argument list */ 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int n = pList ? pList->nExpr : 0; /* Number of arguments */ 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int no_such_func = 0; /* True if no such function exists */ 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int wrong_num_args = 0; /* True if wrong number of arguments */ 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int is_agg = 0; /* True if is an aggregate function */ 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int auth; /* Authorization to use the function */ 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nId; /* Number of characters in function name */ 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zId; /* The function name. */ 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FuncDef *pDef; /* Information about the function */ 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 enc = ENC(pParse->db); /* The database encoding */ 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_CONST_FUNC ); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zId = pExpr->u.zToken; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nId = sqlite3Strlen30(zId); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDef==0 ){ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, enc, 0); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDef==0 ){ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) no_such_func = 1; 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrong_num_args = 1; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_agg = pDef->xFunc==0; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTHORIZATION 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDef ){ 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( auth!=SQLITE_OK ){ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( auth==SQLITE_DENY ){ 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "not authorized to use function: %s", 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDef->zName); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->nErr++; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_NULL; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( is_agg && !pNC->allowAgg ){ 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->nErr++; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_agg = 0; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( no_such_func ){ 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->nErr++; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( wrong_num_args ){ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nId, zId); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->nErr++; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( is_agg ){ 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_AGG_FUNCTION; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->hasAgg = 1; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( is_agg ) pNC->allowAgg = 0; 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkExprList(pWalker, pList); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( is_agg ) pNC->allowAgg = 1; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* FIX ME: Compute pExpr->affinity based on the expected return 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** type of the function 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_SELECT: 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_IN: { 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_IN ); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pExpr, EP_xIsSelect) ){ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nRef = pNC->nRef; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->isCheck ){ 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints"); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkSelect(pWalker, pExpr->x.pSelect); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pNC->nRef>=nRef ); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nRef!=pNC->nRef ){ 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(pExpr, EP_VarSelect); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CHECK 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_VARIABLE: { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->isCheck ){ 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints"); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pEList is a list of expressions which are really the result set of the 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause. 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine checks to see if pE is a simple identifier which corresponds 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the AS-name of one of the terms of the expression list. If it is, 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this routine return an integer between 1 and N where N is the number of 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** elements in pEList, corresponding to the matching entry. If there is 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** no match, or if pE is not a simple identifier, then this routine 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return 0. 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pEList has been resolved. pE has not. 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int resolveAsName( 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context for error messages */ 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList, /* List of expressions to scan */ 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE /* Expression we are trying to match */ 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNUSED_PARAMETER(pParse); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE->op==TK_ID ){ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zCol = pE->u.zToken; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pEList->nExpr; i++){ 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zAs = pEList->a[i].zName; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i+1; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pE is a pointer to an expression which is a single term in the 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ORDER BY of a compound SELECT. The expression has not been 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** name resolved. 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** At the point this routine is called, we already know that the 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ORDER BY term is not an integer index into the result set. That 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** case is handled by the calling routine. 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Attempt to match pE against result set columns in the left-most 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT statement. Return the index i of the matching column, 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as an indication to the caller that it should sort by the i-th column. 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The left-most column is 1. In other words, the value returned is the 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** same integer value that would be used in the SQL statement to indicate 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the column. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If there is no match, return 0. Return -1 if an error occurs. 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int resolveOrderByTermToExprList( 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context for error messages */ 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect, /* The SELECT statement with the ORDER BY clause */ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE /* The specific ORDER BY term */ 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; /* The columns of the result set */ 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext nc; /* Name context for resolving pE */ 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* Database connection */ 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc; /* Return code from subprocedures */ 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 savedSuppErr; /* Saved value of db->suppressErr */ 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( sqlite3ExprIsInteger(pE, &i)==0 ); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = pSelect->pEList; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Resolve all names in the ORDER BY term expression 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&nc, 0, sizeof(nc)); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nc.pParse = pParse; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nc.pSrcList = pSelect->pSrc; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nc.pEList = pEList; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nc.allowAgg = 1; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nc.nErr = 0; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) savedSuppErr = db->suppressErr; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->suppressErr = 1; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3ResolveExprNames(&nc, pE); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->suppressErr = savedSuppErr; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ) return 0; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Try to match the ORDER BY expression against an expression 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in the result set. Return an 1-based index of the matching 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** result-set entry. 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pEList->nExpr; i++){ 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprCompare(pEList->a[i].pExpr, pE)<2 ){ 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i+1; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If no match, return 0. */ 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an ORDER BY or GROUP BY term out-of-range error. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void resolveOutOfRangeError( 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The error context into which to write the error */ 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zType, /* "ORDER" or "GROUP" */ 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, /* The index (1-based) of the term out of range */ 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mx /* Largest permissible value of i */ 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%r %s BY term out of range - should be " 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "between 1 and %d", i, zType, mx); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Analyze the ORDER BY clause in a compound SELECT statement. Modify 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** each term of the ORDER BY clause is a constant integer between 1 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and N where N is the number of columns in the compound SELECT. 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ORDER BY terms that are already an integer between 1 and N are 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unmodified. ORDER BY terms that are integers outside the range of 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1 through N generate an error. ORDER BY terms that are expressions 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are matched against result set expressions of compound SELECT 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** beginning with the left-most SELECT and working toward the right. 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** At the first match, the ORDER BY expression is transformed into 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the integer column number. 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the number of errors seen. 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int resolveCompoundOrderBy( 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context. Leave error messages here */ 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect /* The SELECT statement containing the ORDER BY */ 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int moreToDo = 1; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy = pSelect->pOrderBy; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy==0 ) return 0; 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_COLUMN 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pOrderBy->nExpr; i++){ 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy->a[i].done = 0; 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSelect->pNext = 0; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pSelect->pPrior ){ 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSelect->pPrior->pNext = pSelect; 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSelect = pSelect->pPrior; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pSelect && moreToDo ){ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) moreToDo = 0; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = pSelect->pEList; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 ); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol = -1; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE, *pDup; 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->done ) continue; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pE = pItem->pExpr; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprIsInteger(pE, &iCol) ){ 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<=0 || iCol>pEList->nExpr ){ 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCol = resolveAsName(pParse, pEList, pE); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol==0 ){ 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDup = sqlite3ExprDup(db, pE, 0); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !db->mallocFailed ){ 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(pDup); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pDup); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol>0 ){ 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl = pE->pColl; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = pE->flags & EP_ExpCollate; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pE); 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->pExpr = pE = sqlite3Expr(db, TK_INTEGER, 0); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE==0 ) return 1; 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pE->pColl = pColl; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pE->flags |= EP_IntValue | flags; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pE->u.iValue = iCol; 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iCol = (u16)iCol; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->done = 1; 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) moreToDo = 1; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSelect = pSelect->pNext; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pOrderBy->nExpr; i++){ 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy->a[i].done==0 ){ 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "column in the result set", i+1); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check every term in the ORDER BY or GROUP BY clause pOrderBy of 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the SELECT statement pSelect. If any term is reference to a 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result set expression (as determined by the ExprList.a.iCol field) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then convert that term into a copy of the corresponding result set 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If any errors are detected, add an error message to pParse and 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return non-zero. Return zero if no errors are seen. 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ResolveOrderGroupBy( 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context. Leave error messages here */ 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect, /* The SELECT statement containing the clause */ 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zType /* "ORDER" or "GROUP" */ 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_COLUMN 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = pSelect->pEList; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->iCol ){ 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->iCol>pEList->nExpr ){ 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resolveAlias(pParse, pEList, pItem->iCol-1, pItem->pExpr, zType); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The Name context of the SELECT statement is pNC. zType is either 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "ORDER" or "GROUP" depending on which type of clause pOrderBy is. 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine resolves each term of the clause into an expression. 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the order-by term is an integer I between 1 and N (where N is the 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number of columns in the result set of the SELECT) then the expression 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the resolution is a copy of the I-th result-set expression. If 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the order-by term is an identify that corresponds to the AS-name of 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a result-set expression, then the term resolves to a copy of the 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result-set expression. Otherwise, the expression is resolved in 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the usual way - using sqlite3ResolveExprNames(). 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine returns the number of errors. If errors occur, then 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an appropriate error message might be left in pParse. (OOM errors 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** excepted.) 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int resolveOrderGroupBy( 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pNC, /* The name context of the SELECT statement */ 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect, /* The SELECT statement holding pOrderBy */ 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */ 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zType /* Either "ORDER" or "GROUP", as appropriate */ 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol; /* Column number */ 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; /* A term of the ORDER BY clause */ 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse; /* Parsing context */ 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nResult; /* Number of terms in the result set */ 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy==0 ) return 0; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nResult = pSelect->pEList->nExpr; 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse = pNC->pParse; 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE = pItem->pExpr; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCol = resolveAsName(pParse, pSelect->pEList, pE); 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol>0 ){ 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If an AS-name match is found, mark this ORDER BY column as being 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** a copy of the iCol-th result-set column. The subsequent call to 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sqlite3ResolveOrderGroupBy() will convert the expression to a 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** copy of the iCol-th result-set expression. */ 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iCol = (u16)iCol; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprIsInteger(pE, &iCol) ){ 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The ORDER BY term is an integer constant. Again, set the column 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** number so that sqlite3ResolveOrderGroupBy() will convert the 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** order-by term to a copy of the result-set expression */ 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<1 ){ 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resolveOutOfRangeError(pParse, zType, i+1, nResult); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iCol = (u16)iCol; 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Otherwise, treat the ORDER BY term as an ordinary expression */ 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iCol = 0; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ResolveExprNames(pNC, pE) ){ 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Resolve names in the SELECT statement p and all of its descendents. 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int resolveSelectStep(Walker *pWalker, Select *p){ 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pOuterNC; /* Context that contains this SELECT */ 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext sNC; /* Name context of this SELECT */ 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isCompound; /* True if p is a compound select */ 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCompound; /* Number of compound terms processed so far */ 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse; /* Parsing context */ 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; /* Result set expression list */ 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pGroupBy; /* The GROUP BY clause */ 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pLeftmost; /* Left-most of SELECT of a compound */ 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* Database connection */ 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p!=0 ); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->selFlags & SF_Resolved ){ 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOuterNC = pWalker->u.pNC; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse = pWalker->pParse; 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Normally sqlite3SelectExpand() will be called first and will have 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** already expanded this SELECT. However, if this is a subquery within 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** an expression, sqlite3ResolveExprNames() will be called without a 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** prior call to sqlite3SelectExpand(). When that happens, let 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sqlite3SelectPrep() do all of the processing for this SELECT. 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sqlite3SelectPrep() will invoke both sqlite3SelectExpand() and 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** this routine in the correct order. 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (p->selFlags & SF_Expanded)==0 ){ 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectPrep(pParse, p, pOuterNC); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (pParse->nErr || db->mallocFailed) ? WRC_Abort : WRC_Prune; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isCompound = p->pPrior!=0; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nCompound = 0; 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLeftmost = p; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( p ){ 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (p->selFlags & SF_Expanded)!=0 ); 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (p->selFlags & SF_Resolved)==0 ); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->selFlags |= SF_Resolved; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Resolve the expressions in the LIMIT and OFFSET clauses. These 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** are not allowed to refer to any names, so pass an empty NameContext. 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&sNC, 0, sizeof(sNC)); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pParse = pParse; 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ResolveExprNames(&sNC, p->pLimit) || 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ResolveExprNames(&sNC, p->pOffset) ){ 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set up the local name-context to pass to sqlite3ResolveExprNames() to 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** resolve the result-set expression list. 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.allowAgg = 1; 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pSrcList = p->pSrc; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pNext = pOuterNC; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Resolve names in the result set. */ 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = p->pEList; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 ); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pEList->nExpr; i++){ 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pX = pEList->a[i].pExpr; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ResolveExprNames(&sNC, pX) ){ 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Recursively resolve names in all subqueries 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<p->pSrc->nSrc; i++){ 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem = &p->pSrc->a[i]; 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->pSelect ){ 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSavedContext = pParse->zAuthContext; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->zName ) pParse->zAuthContext = pItem->zName; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->zAuthContext = zSavedContext; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nErr || db->mallocFailed ) return WRC_Abort; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there are no aggregate functions in the result-set, and no GROUP BY 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** expression, do not allow aggregates in any of the other expressions. 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (p->selFlags & SF_Aggregate)==0 ); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pGroupBy = p->pGroupBy; 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pGroupBy || sNC.hasAgg ){ 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->selFlags |= SF_Aggregate; 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.allowAgg = 0; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If a HAVING clause is present, then there must be a GROUP BY clause. 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pHaving && !pGroupBy ){ 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Add the expression list to the name-context before parsing the 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** other expressions in the SELECT statement. This is so that 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** expressions in the WHERE clause (etc.) can refer to expressions by 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** aliases in the result set. 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Minor point: If this is the case, then the expression will be 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** re-evaluated for each reference to it. 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pEList = p->pEList; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ResolveExprNames(&sNC, p->pWhere) || 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ResolveExprNames(&sNC, p->pHaving) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The ORDER BY and GROUP BY clauses may not refer to terms in 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** outer queries 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pNext = 0; 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.allowAgg = 1; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Process the ORDER BY clause for singleton SELECT statements. 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The ORDER BY clause for compounds SELECT statements is handled 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** below, after all of the result-sets for all of the elements of 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the compound have been resolved. 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !isCompound && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") ){ 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Resolve the GROUP BY clause. At the same time, make sure 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the GROUP BY clause does not contain aggregate functions. 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pGroupBy ){ 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( resolveOrderGroupBy(&sNC, p, pGroupBy, "GROUP") || db->mallocFailed ){ 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pItem=pGroupBy->a; i<pGroupBy->nExpr; i++, pItem++){ 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pItem->pExpr, EP_Agg) ){ 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "aggregate functions are not allowed in " 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "the GROUP BY clause"); 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Advance to the next term of the compound 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = p->pPrior; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nCompound++; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Resolve the ORDER BY on a compound SELECT after all terms of 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the compound have been resolved. 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isCompound && resolveCompoundOrderBy(pParse, pLeftmost) ){ 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine walks an expression tree and resolves references to 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table columns and result-set columns. At the same time, do error 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** checking on function usage and set a flag if any aggregate functions 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are seen. 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To resolve table columns references we look for nodes (or subtrees) of the 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** form X.Y.Z or Y.Z or just Z where 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** X: The name of a database. Ex: "main" or "temp" or 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the symbolic name assigned to an ATTACH-ed database. 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Y: The name of a table in a FROM clause. Or in a trigger 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** one of the special names "old" or "new". 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Z: The name of a column in table Y. 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The node at the root of the subtree is modified as follows: 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.op Changed to TK_COLUMN 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.pTab Points to the Table object for X.Y 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.iColumn The column index in X.Y. -1 for the rowid. 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expr.iTable The VDBE cursor number for X.Y 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To resolve result-set references, look for expression nodes of the 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** form Z (with no X and Y prefix) where the Z matches the right-hand 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** size of an AS clause in the result-set of a SELECT. The Z expression 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is replaced by a copy of the left-hand side of the result-set expression. 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Table-name and function resolution occurs on the substituted expression 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** tree. For example, in: 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x; 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The "x" term of the order by is replaced by "a+b" to render: 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Function calls are checked to make sure that the function is 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** defined and that the correct number of arguments are specified. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the function is an aggregate function, then the pNC->hasAgg is 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an expression contains aggregate functions then the EP_Agg 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** property on the expression is set. 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An error message is left in pParse if anything is amiss. The number 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if errors is returned. 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3ResolveExprNames( 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pNC, /* Namespace to resolve expressions in. */ 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr /* The expression to be analyzed. */ 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int savedHasAgg; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Walker w; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr==0 ) return 0; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_EXPR_DEPTH>0 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse = pNC->pParse; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprCheckHeight(pParse, pExpr->nHeight+pNC->pParse->nHeight) ){ 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nHeight += pExpr->nHeight; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) savedHasAgg = pNC->hasAgg; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->hasAgg = 0; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xExprCallback = resolveExprStep; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xSelectCallback = resolveSelectStep; 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.pParse = pNC->pParse; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.u.pNC = pNC; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkExpr(&w, pExpr); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_EXPR_DEPTH>0 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->pParse->nHeight -= pExpr->nHeight; 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->nErr>0 || w.pParse->nErr>0 ){ 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(pExpr, EP_Error); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->hasAgg ){ 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(pExpr, EP_Agg); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( savedHasAgg ){ 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC->hasAgg = 1; 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ExprHasProperty(pExpr, EP_Error); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Resolve all names in all expressions of a SELECT and in all 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** decendents of the SELECT, including compounds off of p->pPrior, 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** subqueries in expressions, and subqueries used as FROM clause 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** terms. 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See sqlite3ResolveExprNames() for a description of the kinds of 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** transformations that occur. 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** All SELECT statements should have been expanded using 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3SelectExpand() prior to invoking this routine. 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ResolveSelectNames( 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parser context */ 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The SELECT statement being coded. */ 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pOuterNC /* Name context for parent SELECT statement */ 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Walker w; 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p!=0 ); 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xExprCallback = resolveExprStep; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xSelectCallback = resolveSelectStep; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.pParse = pParse; 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.u.pNC = pOuterNC; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkSelect(&w, p); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205