15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code. In place of 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you do good and not evil. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you find forgiveness for yourself and forgive others. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** May you share freely, never taking more than you give. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)************************************************************************* 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains C code routines that are called by the parser 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to handle SELECT statements in SQLite. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete all the content of a Select structure but do not deallocate 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the select structure itself. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void clearSelect(sqlite3 *db, Select *p){ 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, p->pEList); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SrcListDelete(db, p->pSrc); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pWhere); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, p->pGroupBy); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pHaving); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, p->pOrderBy); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDelete(db, p->pPrior); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pLimit); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pOffset); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Initialize a SelectDest structure. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->eDest = (u8)eDest; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->iParm = iParm; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->affinity = 0; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->iMem = 0; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->nMem = 0; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a new Select structure and return a pointer to that 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Select *sqlite3SelectNew( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList, /* which columns to include in the result */ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrc, /* the FROM clause -- which tables to scan */ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pWhere, /* the WHERE clause */ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pGroupBy, /* the GROUP BY clause */ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pHaving, /* the HAVING clause */ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy, /* the ORDER BY clause */ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isDistinct, /* true if the DISTINCT keyword is present */ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLimit, /* LIMIT value. NULL means not used */ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pOffset /* OFFSET value. NULL means no offset */ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pNew; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select standin; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db->mallocFailed || !pOffset || pLimit ); /* OFFSET implies LIMIT */ 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ){ 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = &standin; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(pNew, 0, sizeof(*pNew)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList==0 ){ 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ALL,0)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pEList = pEList; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pSrc = pSrc; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pWhere = pWhere; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pGroupBy = pGroupBy; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pHaving = pHaving; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pOrderBy = pOrderBy; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->selFlags = isDistinct ? SF_Distinct : 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->op = TK_SELECT; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pLimit = pLimit; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pOffset = pOffset; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pOffset==0 || pLimit!=0 ); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->addrOpenEphm[0] = -1; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->addrOpenEphm[1] = -1; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->addrOpenEphm[2] = -1; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clearSelect(db, pNew); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew!=&standin ) sqlite3DbFree(db, pNew); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = 0; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pNew; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete the given Select structure and all of its substructures. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3SelectDelete(sqlite3 *db, Select *p){ 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p ){ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clearSelect(db, p); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, p); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given 1 to 3 identifiers preceeding the JOIN keyword, determine the 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type of join. Return an integer constant that expresses that type 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in terms of the following bit values: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** JT_INNER 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** JT_CROSS 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** JT_OUTER 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** JT_NATURAL 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** JT_LEFT 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** JT_RIGHT 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A full outer join is the combination of JT_LEFT and JT_RIGHT. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an illegal or unsupported join type is seen, then still return 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a join type, but put an error in the pParse structure. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int jointype = 0; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token *apAll[3]; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token *p; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 0123456789 123456789 123456789 123 */ 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char zKeyText[] = "naturaleftouterightfullinnercross"; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 i; /* Beginning of keyword text in zKeyText[] */ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 nChar; /* Length of the keyword in characters */ 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 code; /* Join type mask */ 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } aKeyword[] = { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* natural */ { 0, 7, JT_NATURAL }, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* left */ { 6, 4, JT_LEFT|JT_OUTER }, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* outer */ { 10, 5, JT_OUTER }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* right */ { 14, 5, JT_RIGHT|JT_OUTER }, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* inner */ { 23, 5, JT_INNER }, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* cross */ { 28, 5, JT_INNER|JT_CROSS }, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apAll[0] = pA; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apAll[1] = pB; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apAll[2] = pC; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<3 && apAll[i]; i++){ 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = apAll[i]; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<ArraySize(aKeyword); j++){ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->n==aKeyword[j].nChar 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && sqlite3StrNICmp((char*)p->z, &zKeyText[aKeyword[j].i], p->n)==0 ){ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jointype |= aKeyword[j].code; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( j==0 || j==1 || j==2 || j==3 || j==4 || j==5 || j==6 ); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j>=ArraySize(aKeyword) ){ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jointype |= JT_ERROR; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (jointype & JT_ERROR)!=0 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSp = " "; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pB!=0 ); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pC==0 ){ zSp++; } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "%T %T%s%T", pA, pB, zSp, pC); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jointype = JT_INNER; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( (jointype & JT_OUTER)!=0 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){ 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "RIGHT and FULL OUTER JOINs are not currently supported"); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jointype = JT_INNER; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return jointype; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the index of a column in a table. Return -1 if the column 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not contained in the table. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int columnIndex(Table *pTab, const char *zCol){ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pTab->nCol; i++){ 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(pTab->aCol[i].zName, zCol)==0 ) return i; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Search the first N tables in pSrc, from left to right, looking for a 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table that has a column named zCol. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When found, set *piTab and *piCol to the table index and column index 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the matching column and return TRUE. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If not found, return FALSE. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int tableAndColumnIndex( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrc, /* Array of tables to search */ 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int N, /* Number of tables in pSrc->a[] to search */ 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zCol, /* Name of the column we are looking for */ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *piTab, /* Write index of pSrc->a[] here */ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *piCol /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* For looping over tables in pSrc */ 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol; /* Index of column matching zCol */ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<N; i++){ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCol = columnIndex(pSrc->a[i].pTab, zCol); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol>=0 ){ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( piTab ){ 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *piTab = i; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *piCol = iCol; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is used to add terms implied by JOIN syntax to the 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WHERE clause expression of a SELECT statement. The new term, which 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is ANDed with the existing WHERE clause, is of the form: 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (tab1.col1 = tab2.col2) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column iColRight of tab2. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void addWhereTerm( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrc, /* List of tables in FROM clause */ 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLeft, /* Index of first table to join in pSrc */ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iColLeft, /* Index of column in first table */ 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRight, /* Index of second table in pSrc */ 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iColRight, /* Index of column in second table */ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isOuterJoin, /* True if this is an OUTER join */ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr **ppWhere /* IN/OUT: The WHERE clause to add to */ 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE1; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE2; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pEq; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iLeft<iRight ); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrc->nSrc>iRight ); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrc->a[iLeft].pTab ); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrc->a[iRight].pTab ); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2, 0); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEq && isOuterJoin ){ 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(pEq, EP_FromJoin); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(pEq, EP_TokenOnly|EP_Reduced) ); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetIrreducible(pEq); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEq->iRightJoinTable = (i16)pE2->iTable; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ppWhere = sqlite3ExprAnd(db, *ppWhere, pEq); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the EP_FromJoin property on all terms of the given expression. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** And set the Expr.iRightJoinTable to iTable for every term in the 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The EP_FromJoin property is used on terms of an expression to tell 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the LEFT OUTER JOIN processing logic that this term is part of the 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** join restriction specified in the ON or USING clause and not a part 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the more general WHERE clause. These terms are moved over to the 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WHERE clause during join processing but we need to remember that they 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** originated in the ON or USING clause. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The Expr.iRightJoinTable tells the WHERE clause processing that the 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression depends on table iRightJoinTable even if that table is not 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** explicitly mentioned in the expression. That information is needed 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for cases like this: 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.b AND t1.x=5 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The where clause needs to defer the handling of the t1.x=5 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** term until after the t2 loop of the join. In that way, a 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL t2 row will be inserted whenever t1.x!=5. If we do not 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** defer the handling of t1.x=5, it will be processed immediately 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** after the t1 loop and rows with t1.x!=5 will never appear in 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the output, which is incorrect. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void setJoinExpr(Expr *p, int iTable){ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( p ){ 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetProperty(p, EP_FromJoin); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasAnyProperty(p, EP_TokenOnly|EP_Reduced) ); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprSetIrreducible(p); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iRightJoinTable = (i16)iTable; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setJoinExpr(p->pLeft, iTable); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = p->pRight; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine processes the join information for a SELECT statement. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ON and USING clauses are converted into extra terms of the WHERE clause. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NATURAL joins also create extra WHERE clause terms. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The terms of a FROM clause are contained in the Select.pSrc structure. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The left most table is the first entry in Select.pSrc. The right-most 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table is the last entry. The join operator is held in the entry to 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the left. Thus entry 0 contains the join operator for the join between 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** entries 0 and 1. Any ON or USING clauses associated with the join are 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** also attached to the left entry. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine returns the number of errors encountered. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int sqliteProcessJoin(Parse *pParse, Select *p){ 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrc; /* All tables in the FROM clause */ 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; /* Loop counters */ 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pLeft; /* Left table being joined */ 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pRight; /* Right table being joined */ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc = p->pSrc; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLeft = &pSrc->a[0]; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRight = &pLeft[1]; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pSrc->nSrc-1; i++, pRight++, pLeft++){ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pLeftTab = pLeft->pTab; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pRightTab = pRight->pTab; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isOuter; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(pLeftTab==0 || pRightTab==0) ) continue; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isOuter = (pRight->jointype & JT_OUTER)!=0; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* When the NATURAL keyword is present, add WHERE clause terms for 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** every column that the two tables have in common. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight->jointype & JT_NATURAL ){ 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight->pOn || pRight->pUsing ){ 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "a NATURAL join may not have " 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "an ON or USING clause", 0); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pRightTab->nCol; j++){ 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; /* Name of column in the right table */ 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLeft; /* Matching left table */ 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLeftCol; /* Matching column in the left table */ 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = pRightTab->aCol[j].zName; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) ){ 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isOuter, &p->pWhere); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Disallow both ON and USING clauses in the same join 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight->pOn && pRight->pUsing ){ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "cannot have both ON and USING " 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "clauses in the same join"); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Add the ON clause to the end of the WHERE clause, connected by 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** an AND operator. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight->pOn ){ 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isOuter ) setJoinExpr(pRight->pOn, pRight->iCursor); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pWhere = sqlite3ExprAnd(pParse->db, p->pWhere, pRight->pOn); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRight->pOn = 0; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Create extra terms on the WHERE clause for each column named 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in the USING clause. Example: If the two tables to be joined are 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** A and B and the USING clause names X, Y, and Z, then add this 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Report an error if any column mentioned in the USING clause is 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** not contained in both tables to be joined. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRight->pUsing ){ 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IdList *pList = pRight->pUsing; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pList->nId; j++){ 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; /* Name of the term in the USING clause */ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLeft; /* Table on the left with matching column name */ 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLeftCol; /* Column number of matching column on the left */ 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRightCol; /* Column number of matching column on the right */ 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = pList->a[j].zName; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iRightCol = columnIndex(pRightTab, zName); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iRightCol<0 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "cannot join using column %s - column " 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "not present in both tables", zName); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isOuter, &p->pWhere); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Insert code into "v" that will push the record on the top of the 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stack into the sorter. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void pushOntoSorter( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parser context */ 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy, /* The ORDER BY clause */ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect, /* The whole SELECT statement */ 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regData /* Register holding data to be sorted */ 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nExpr = pOrderBy->nExpr; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regBase = sqlite3GetTempRange(pParse, nExpr+2); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRecord = sqlite3GetTempReg(pParse); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeExprList(pParse, pOrderBy, regBase, 0); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Sequence, pOrderBy->iECursor, regBase+nExpr); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+1, 1); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nExpr + 2, regRecord); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, pOrderBy->iECursor, regRecord); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regRecord); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, regBase, nExpr+2); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->iLimit ){ 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr1, addr2; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLimit; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSelect->iOffset ){ 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iLimit = pSelect->iOffset+1; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iLimit = pSelect->iLimit; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp1(v, OP_IfZero, iLimit); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, iLimit, -1); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr2 = sqlite3VdbeAddOp0(v, OP_Goto); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr1); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Last, pOrderBy->iECursor); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Delete, pOrderBy->iECursor); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr2); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add code to implement the OFFSET 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void codeOffset( 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v, /* Generate code into this VM */ 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The SELECT statement being coded */ 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iContinue /* Jump here to skip the current record */ 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iOffset && iContinue!=0 ){ 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_AddImm, p->iOffset, -1); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, OP_IfNeg, p->iOffset); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, iContinue); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "skip OFFSET records")); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add code that will check to make sure the N registers starting at iMem 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** form a distinct entry. iTab is a sorting index that holds previously 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** seen combinations of the N values. A new entry is made in iTab 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the current N values are new. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A jump to addrRepeat is made and the N+1 values are popped from the 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stack if the top N elements are not distinct. 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void codeDistinct( 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing and code generating context */ 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTab, /* A sorting index used to test for distinctness */ 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrRepeat, /* Jump to here if not distinct */ 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int N, /* Number of elements */ 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iMem /* First element */ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = pParse->pVdbe; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GetTempReg(pParse); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate an error message when a SELECT is used within a subexpression 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (example: "a IN (SELECT * FROM table)") but it has more than 1 result 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column. We do this in a subroutine because the error used to occur 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in multiple places. (The error only occurs in one place now, but we 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** retain the subroutine to minimize code disruption.) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int checkForMultiColumnSelectError( 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parse context. */ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest, /* Destination of SELECT results */ 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nExpr /* Number of result columns returned by SELECT */ 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eDest = pDest->eDest; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nExpr>1 && (eDest==SRT_Mem || eDest==SRT_Set) ){ 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "only a single result allowed for " 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "a SELECT that is part of an expression"); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine generates the code for the inside of the inner loop 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of a SELECT. 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If srcTab and nColumn are both zero, then the pEList expressions 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are evaluated in order to get the data for this row. If nColumn>0 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then data is pulled from srcTab and pEList is used only to get the 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** datatypes for each column. 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void selectInnerLoop( 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parser context */ 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The complete select statement being coded */ 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList, /* List of values being extracted */ 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int srcTab, /* Pull data from this table */ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nColumn, /* Number of columns in the source table */ 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy, /* If not NULL, sort results using this key */ 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int distinct, /* If >=0, make sure results are distinct */ 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest, /* How to dispose of the results */ 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iContinue, /* Jump here to continue with next row */ 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iBreak /* Jump here to break out of the inner loop */ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int hasDistinct; /* True if the DISTINCT keyword is present */ 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regResult; /* Start of memory holding result set */ 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eDest = pDest->eDest; /* How to dispose of results */ 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iParm = pDest->iParm; /* First argument to disposal method */ 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nResultCol; /* Number of result columns */ 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v ); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(v==0) ) return; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 ); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hasDistinct = distinct>=0; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy==0 && !hasDistinct ){ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeOffset(v, p, iContinue); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Pull the requested columns. 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nColumn>0 ){ 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nResultCol = nColumn; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nResultCol = pEList->nExpr; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->iMem==0 ){ 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->iMem = pParse->nMem+1; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->nMem = nResultCol; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem += nResultCol; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pDest->nMem==nResultCol ); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regResult = pDest->iMem; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nColumn>0 ){ 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nColumn; i++){ 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, srcTab, i, regResult+i); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( eDest!=SRT_Exists ){ 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the destination is an EXISTS(...) expression, the actual 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** values returned by the SELECT are not required. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeExprList(pParse, pEList, regResult, eDest==SRT_Output); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nColumn = nResultCol; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the DISTINCT keyword was present on the SELECT statement 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and this row has been seen before, then do not make this row 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** part of the result. 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( hasDistinct ){ 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 ); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList->nExpr==nColumn ); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeDistinct(pParse, distinct, iContinue, nColumn, regResult); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy==0 ){ 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeOffset(v, p, iContinue); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( eDest ){ 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In this mode, write each query result to the key of the temporary 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** table iParm. 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPOUND_SELECT 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Union: { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GetTempReg(pParse); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Construct a record from the query result, but instead of 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** saving that record, use it as a key to delete elements from 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the temporary table iParm. 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Except: { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_IdxDelete, iParm, regResult, nColumn); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Store the result as data using a unique key. 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Table: 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_EphemTab: { 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1 = sqlite3GetTempReg(pParse); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_Table ); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_EphemTab ); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy ){ 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pushOntoSorter(pParse, pOrderBy, p, r1); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r2 = sqlite3GetTempReg(pParse); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, r2); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, OPFLAG_APPEND); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r2); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we are creating a set for an "expr IN (SELECT ...)" construct, 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then there should be a single item on the stack. Write this 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** item into the set table with bogus data. 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Set: { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nColumn==1 ); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->affinity = sqlite3CompareAffinity(pEList->a[0].pExpr, pDest->affinity); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy ){ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* At first glance you would think we could optimize out the 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ORDER BY in this case since the order of entries in the set 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** does not matter. But there might be a LIMIT clause, in which 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** case the order does matter */ 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pushOntoSorter(pParse, pOrderBy, p, regResult); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1 = sqlite3GetTempReg(pParse); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, 1, r1, &p->affinity, 1); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, regResult, 1); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If any row exist in the result set, record that fact and abort. 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Exists: { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, iParm); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The LIMIT clause will terminate the loop for us */ 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this is a scalar select that is part of an expression, then 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** store the results in the appropriate memory cell and break out 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the scan loop. 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Mem: { 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nColumn==1 ); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy ){ 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pushOntoSorter(pParse, pOrderBy, p, regResult); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeMove(pParse, regResult, iParm, 1); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The LIMIT clause will jump out of the loop for us */ 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Send the data to the callback function or to a subroutine. In the 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** case of a subroutine, the subroutine itself is responsible for 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** popping the data from the stack. 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Coroutine: 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Output: { 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_Coroutine ); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_Output ); 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy ){ 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1 = sqlite3GetTempReg(pParse); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nColumn, r1); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pushOntoSorter(pParse, pOrderBy, p, r1); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( eDest==SRT_Coroutine ){ 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, pDest->iParm); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, nColumn); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, regResult, nColumn); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_TRIGGER) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Discard the results. This is used for SELECT statements inside 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the body of a TRIGGER. The purpose of such selects is to call 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** user-defined functions that have side effects. We do not care 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** about the actual results of the select. 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( eDest==SRT_Discard ); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Jump to the end of the loop if the LIMIT is reached. Except, if 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** there is a sorter, in which case the sorter has already limited 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the output for us. 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy==0 && p->iLimit ){ 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given an expression list, generate a KeyInfo structure that records 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the collating sequence for each expression in that expression list. 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the ExprList is an ORDER BY or GROUP BY clause then the resulting 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** KeyInfo structure is appropriate for initializing a virtual index to 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implement that clause. If the ExprList is the result set of a SELECT 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then the KeyInfo structure is appropriate for initializing a virtual 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** index to implement a DISTINCT test. 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Space to hold the KeyInfo structure is obtain from malloc. The calling 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function is responsible for seeing that this structure is eventually 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** freed. Add the KeyInfo structure to the P4 field of an opcode using 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4_KEYINFO_HANDOFF is the usual way of dealing with this. 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static KeyInfo *keyInfoFromExprList(Parse *pParse, ExprList *pList){ 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nExpr; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pInfo; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nExpr = pList->nExpr; 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo = sqlite3DbMallocZero(db, sizeof(*pInfo) + nExpr*(sizeof(CollSeq*)+1) ); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pInfo ){ 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->aSortOrder = (u8*)&pInfo->aColl[nExpr]; 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->nField = (u16)nExpr; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->enc = ENC(db); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->db = db; 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pItem=pList->a; i<nExpr; i++, pItem++){ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl; 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr); 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pColl ){ 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = db->pDfltColl; 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->aColl[i] = pColl; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pInfo->aSortOrder[i] = pItem->sortOrder; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pInfo; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPOUND_SELECT 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Name of the connection operator, used for error messages. 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *selectOpName(int id){ 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *z; 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( id ){ 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ALL: z = "UNION ALL"; break; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_INTERSECT: z = "INTERSECT"; break; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EXCEPT: z = "EXCEPT"; break; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: z = "UNION"; break; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return z; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPOUND_SELECT */ 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a no-op. Otherwise, it adds a single row of output to the EQP result, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where the caption is of the form: 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "USE TEMP B-TREE FOR xxx" 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where xxx is one of "DISTINCT", "ORDER BY" or "GROUP BY". Exactly which 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is determined by the zUsage argument. 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void explainTempTable(Parse *pParse, const char *zUsage){ 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->explain==2 ){ 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zMsg = sqlite3MPrintf(pParse->db, "USE TEMP B-TREE FOR %s", zUsage); 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Assign expression b to lvalue a. A second, no-op, version of this macro 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is provided when SQLITE_OMIT_EXPLAIN is defined. This allows the code 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in sqlite3Select() to assign values to structure member variables that 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** only exist if SQLITE_OMIT_EXPLAIN is not defined without polluting the 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code with #ifndef directives. 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define explainSetInteger(a, b) a = b 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* No-op versions of the explainXXX() functions and macros. */ 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define explainTempTable(y,z) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define explainSetInteger(y,z) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_EXPLAIN) && !defined(SQLITE_OMIT_COMPOUND_SELECT) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a no-op. Otherwise, it adds a single row of output to the EQP result, 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where the caption is of one of the two forms: 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "COMPOSITE SUBQUERIES iSub1 and iSub2 (op)" 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "COMPOSITE SUBQUERIES iSub1 and iSub2 USING TEMP B-TREE (op)" 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where iSub1 and iSub2 are the integers passed as the corresponding 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function parameters, and op is the text representation of the parameter 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the same name. The parameter "op" must be one of TK_UNION, TK_EXCEPT, 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** TK_INTERSECT or TK_ALL. The first form is used if argument bUseTmp is 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** false, or the second form if it is true. 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void explainComposite( 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parse context */ 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op, /* One of TK_UNION, TK_EXCEPT etc. */ 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSub1, /* Subquery id 1 */ 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSub2, /* Subquery id 2 */ 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bUseTmp /* True if a temp table was used */ 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( op==TK_UNION || op==TK_EXCEPT || op==TK_INTERSECT || op==TK_ALL ); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->explain==2 ){ 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zMsg = sqlite3MPrintf( 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->db, "COMPOUND SUBQUERIES %d AND %d %s(%s)", iSub1, iSub2, 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bUseTmp?"USING TEMP B-TREE ":"", selectOpName(op) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* No-op versions of the explainXXX() functions and macros. */ 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define explainComposite(v,w,x,y,z) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the inner loop was generated using a non-null pOrderBy argument, 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then the results were placed in a sorter. After the loop is terminated 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** we need to run the sorter and output the results. The following 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine generates the code needed to do that. 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void generateSortTail( 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The SELECT statement */ 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v, /* Generate code into this VDBE */ 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nColumn, /* Number of columns of data */ 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest /* Write the sorted results here */ 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrBreak = sqlite3VdbeMakeLabel(v); /* Jump here to exit loop */ 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */ 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTab; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pseudoTab = 0; 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy = p->pOrderBy; 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int eDest = pDest->eDest; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iParm = pDest->iParm; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRow; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRowid; 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iTab = pOrderBy->iECursor; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRow = sqlite3GetTempReg(pParse); 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eDest==SRT_Output || eDest==SRT_Coroutine ){ 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pseudoTab = pParse->nTab++; 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_OpenPseudo, pseudoTab, regRow, nColumn); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRowid = 0; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRowid = sqlite3GetTempReg(pParse); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = 1 + sqlite3VdbeAddOp2(v, OP_Sort, iTab, addrBreak); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeOffset(v, p, addrContinue); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, iTab, pOrderBy->nExpr + 1, regRow); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( eDest ){ 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Table: 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_EphemTab: { 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_Table ); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_EphemTab ); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, OPFLAG_APPEND); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Set: { 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nColumn==1 ); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, 1, regRowid, &p->affinity, 1); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, regRow, 1); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, regRowid); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Mem: { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nColumn==1 ); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeMove(pParse, regRow, iParm, 1); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The LIMIT clause will terminate the loop for us */ 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( eDest==SRT_Output || eDest==SRT_Coroutine ); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_Output ); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( eDest==SRT_Coroutine ); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nColumn; i++){ 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( regRow!=pDest->iMem+i ); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, pseudoTab, i, pDest->iMem+i); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i==0 ){ 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, OPFLAG_CLEARCACHE); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eDest==SRT_Output ){ 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, pDest->iMem, nColumn); 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, pDest->iMem, nColumn); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, pDest->iParm); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regRow); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regRowid); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The bottom of the loop 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, addrContinue); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, iTab, addr); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, addrBreak); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( eDest==SRT_Output || eDest==SRT_Coroutine ){ 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, pseudoTab, 0); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return a pointer to a string containing the 'declaration type' of the 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression pExpr. The string may be treated as static by the caller. 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The declaration type is the exact datatype definition extracted from the 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** original CREATE TABLE statement if the expression is a column. The 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** declaration type for a ROWID field is INTEGER. Exactly when an expression 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is considered a column can be complex in the presence of subqueries. The 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** result-set expression in all of the following SELECT statements is 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** considered a column by this function. 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT col FROM tbl; 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT (SELECT col FROM tbl; 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT (SELECT col FROM tbl); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT abc FROM (SELECT col AS abc FROM tbl); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The declaration type for any expression other than a column is NULL. 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char *columnType( 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pNC, 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr, 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **pzOriginDb, 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **pzOriginTab, 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **pzOriginCol 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char const *zType = 0; 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char const *zOriginDb = 0; 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char const *zOriginTab = 0; 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char const *zOriginCol = 0; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(pExpr==0) || pNC->pSrcList==0 ) return 0; 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pExpr->op ){ 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_AGG_COLUMN: 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_COLUMN: { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The expression is a column. Locate the table the column is being 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** extracted from in NameContext.pSrcList. This table may be real 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** database table or a subquery. 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = 0; /* Table structure column is extracted from */ 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pS = 0; /* Select the column is extracted from */ 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol = pExpr->iColumn; /* Index of column in pTab */ 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_AGG_COLUMN ); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pExpr->op==TK_COLUMN ); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pNC && !pTab ){ 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pTabList = pNC->pSrcList; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j<pTabList->nSrc ){ 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pTabList->a[j].pTab; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pS = pTabList->a[j].pSelect; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNC = pNC->pNext; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab==0 ){ 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* At one time, code such as "SELECT new.x" within a trigger would 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** cause this condition to run. Since then, we have restructured how 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** trigger code is generated and so this condition is no longer 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** possible. However, it can still be true for statements like 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the following: 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** CREATE TABLE t1(col INTEGER); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT (SELECT t1.col) FROM FROM t1; 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** when columnType() is called on the expression "t1.col" in the 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sub-select. In this case, set the column type to NULL, even 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** though it should really be "INTEGER". 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This is not a problem, as the column type of "t1.col" is never 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** used. When columnType() is called on the expression 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** "(SELECT t1.col)", the correct type is returned (see the TK_SELECT 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** branch below. */ 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab && pExpr->pTab==pTab ); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pS ){ 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The "table" is actually a sub-select or a view in the FROM clause 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the SELECT statement. Return the declaration type and origin 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** data for the result-set column of the sub-select. 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol>=0 && ALWAYS(iCol<pS->pEList->nExpr) ){ 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If iCol is less than zero, then the expression requests the 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** rowid of the sub-select or view. This expression is legal (see 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** test case misc2.2.2) - it always evaluates to NULL. 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext sNC; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p = pS->pEList->a[iCol].pExpr; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pSrcList = pS->pSrc; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pNext = pNC; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pParse = pNC->pParse; 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol); 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( ALWAYS(pTab->pSchema) ){ 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A real table */ 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !pS ); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 ) iCol = pTab->iPKey; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 ){ 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zType = "INTEGER"; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zOriginCol = "rowid"; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zType = pTab->aCol[iCol].zType; 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zOriginCol = pTab->aCol[iCol].zName; 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zOriginTab = pTab->zName; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNC->pParse ){ 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zOriginDb = pNC->pParse->db->aDb[iDb].zName; 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_SELECT: { 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The expression is a sub-select. Return the declaration type and 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** origin info for the single column in the result set of the SELECT 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** statement. 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext sNC; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pS = pExpr->x.pSelect; 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p = pS->pEList->a[0].pExpr; 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( ExprHasProperty(pExpr, EP_xIsSelect) ); 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pSrcList = pS->pSrc; 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pNext = pNC; 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pParse = pNC->pParse; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zType = columnType(&sNC, p, &zOriginDb, &zOriginTab, &zOriginCol); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pzOriginDb ){ 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pzOriginTab && pzOriginCol ); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzOriginDb = zOriginDb; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzOriginTab = zOriginTab; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pzOriginCol = zOriginCol; 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return zType; 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will tell the VDBE the declaration types of columns 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the result set. 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void generateColumnTypes( 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parser context */ 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pTabList, /* List of tables */ 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList /* Expressions defining the result set */ 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_DECLTYPE 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext sNC; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pSrcList = pTabList; 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pParse = pParse; 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pEList->nExpr; i++){ 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p = pEList->a[i].pExpr; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zType; 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_COLUMN_METADATA 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zOrigDb = 0; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zOrigTab = 0; 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zOrigCol = 0; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The vdbe must make its own copy of the column-type and other 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** column specific strings, in case the schema is reset before this 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** virtual machine is deleted. 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_DATABASE, zOrigDb, SQLITE_TRANSIENT); 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT); 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zType = columnType(&sNC, p, 0, 0, 0); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_DECLTYPE */ 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code that will tell the VDBE the names of columns 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the result set. This information is used to provide the 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** azCol[] values in the callback. 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void generateColumnNames( 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parser context */ 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pTabList, /* List of tables */ 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList /* Expressions defining the result set */ 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fullNames, shortNames; 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this is an EXPLAIN, skip this step */ 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->explain ){ 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->colNamesSet || NEVER(v==0) || db->mallocFailed ) return; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->colNamesSet = 1; 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullNames = (db->flags & SQLITE_FullColNames)!=0; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shortNames = (db->flags & SQLITE_ShortColNames)!=0; 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetNumCols(v, pEList->nExpr); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pEList->nExpr; i++){ 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p; 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = pEList->a[i].pExpr; 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(p==0) ) continue; 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->a[i].zName ){ 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName = pEList->a[i].zName; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( (p->op==TK_COLUMN || p->op==TK_AGG_COLUMN) && pTabList ){ 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zCol; 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol = p->iColumn; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; ALWAYS(j<pTabList->nSrc); j++){ 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTabList->a[j].iCursor==p->iTable ) break; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( j<pTabList->nSrc ); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pTabList->a[j].pTab; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 ) iCol = pTab->iPKey; 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 ){ 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zCol = "rowid"; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zCol = pTab->aCol[iCol].zName; 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !shortNames && !fullNames ){ 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_NAME, 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( fullNames ){ 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName = 0; 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeSetColName(v, i, COLNAME_NAME, 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generateColumnTypes(pParse, pTabList, pEList); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given a an expression list (which is really the list of expressions 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that form the result set of a SELECT statement) compute appropriate 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** column names for a table that would hold the expression list. 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** All column names will be unique. 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Only the column names are computed. Column.zType, Column.zColl, 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and other fields of Column are zeroed. 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return SQLITE_OK on success. If a memory allocation error occurs, 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM. 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int selectColumnsFromExprList( 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList, /* Expr list from which to derive column names */ 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *pnCol, /* Write the number of columns here */ 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Column **paCol /* Write the new column list here */ 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; /* Database connection */ 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; /* Loop counters */ 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cnt; /* Index added to make the name unique */ 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Column *aCol, *pCol; /* For looping over result columns */ 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCol; /* Number of columns in the result set */ 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p; /* Expression for a single result column */ 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName; /* Column name */ 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nName; /* Size of name in zName[] */ 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pnCol = nCol = pEList->nExpr; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aCol = *paCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aCol==0 ) return SQLITE_NOMEM; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pCol=aCol; i<nCol; i++, pCol++){ 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Get an appropriate name for the column 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = pEList->a[i].pExpr; 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pRight==0 || ExprHasProperty(p->pRight, EP_IntValue) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || p->pRight->u.zToken==0 || p->pRight->u.zToken[0]!=0 ); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (zName = pEList->a[i].zName)!=0 ){ 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the column contains an "AS <name>" phrase, use <name> as the name */ 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = sqlite3DbStrDup(db, zName); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pColExpr = p; /* The expression that is the result column name */ 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; /* Table associated with this expression */ 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pColExpr->op==TK_DOT ) pColExpr = pColExpr->pRight; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){ 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* For columns use the column name name */ 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCol = pColExpr->iColumn; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = pColExpr->pTab; 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( iCol<0 ) iCol = pTab->iPKey; 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = sqlite3MPrintf(db, "%s", 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCol>=0 ? pTab->aCol[iCol].zName : "rowid"); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pColExpr->op==TK_ID ){ 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pColExpr, EP_IntValue) ); 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = sqlite3MPrintf(db, "%s", pColExpr->u.zToken); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Use the original text of the column expression as its name */ 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = sqlite3MPrintf(db, "%s", pEList->a[i].zSpan); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, zName); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make sure the column name is unique. If the name is not unique, 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** append a integer to the name so that it becomes unique. 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nName = sqlite3Strlen30(zName); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=cnt=0; j<i; j++){ 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(aCol[j].zName, zName)==0 ){ 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zNewName; 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName[nName] = 0; 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zNewName = sqlite3MPrintf(db, "%s:%d", zName, ++cnt); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, zName); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zName = zNewName; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j = -1; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zName==0 ) break; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->zName = zName; 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<i; j++){ 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, aCol[j].zName); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, aCol); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *paCol = 0; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pnCol = 0; 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_NOMEM; 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add type and collation information to a column list based on 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a SELECT statement. 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The column list presumably came from selectColumnNamesFromExprList(). 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The column list has only names, not types or collations. This 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine goes through and adds the types and collations. 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine requires that all identifiers in the SELECT 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement be resolved. 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void selectAddColumnTypeAndCollation( 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing contexts */ 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCol, /* Number of columns */ 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Column *aCol, /* List of columns */ 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSelect /* SELECT used to determine types and collations */ 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext sNC; 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Column *pCol; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl; 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *p; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *a; 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSelect!=0 ); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( (pSelect->selFlags & SF_Resolved)!=0 ); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nCol==pSelect->pEList->nExpr || db->mallocFailed ); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ) return; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&sNC, 0, sizeof(sNC)); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pSrcList = pSelect->pSrc; 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a = pSelect->pEList->a; 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pCol=aCol; i<nCol; i++, pCol++){ 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = a[i].pExpr; 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->zType = sqlite3DbStrDup(db, columnType(&sNC, p, 0, 0, 0)); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->affinity = sqlite3ExprAffinity(p); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_NONE; 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3ExprCollSeq(pParse, p); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pColl ){ 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->zColl = sqlite3DbStrDup(db, pColl->zName); 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Given a SELECT statement, generate a Table structure that describes 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the result set of that SELECT. 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int savedFlags; 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) savedFlags = db->flags; 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->flags &= ~SQLITE_FullColNames; 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->flags |= SQLITE_ShortColNames; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectPrep(pParse, pSelect, 0); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nErr ) return 0; 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pSelect->pPrior ) pSelect = pSelect->pPrior; 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db->flags = savedFlags; 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = sqlite3DbMallocZero(db, sizeof(Table) ); 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab==0 ){ 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is disabled */ 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db->lookaside.bEnabled==0 ); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->nRef = 1; 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->zName = 0; 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->nRowEst = 1000000; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSelect); 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->iPKey = -1; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DeleteTable(db, pTab); 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pTab; 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Get a VDBE for the given parser context. Create a new one if necessary. 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an error occurs, return NULL and leave a message in pParse. 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Vdbe *sqlite3GetVdbe(Parse *pParse){ 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v==0 ){ 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = pParse->pVdbe = sqlite3VdbeCreate(pParse->db); 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRACE 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v ){ 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp0(v, OP_Trace); 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v; 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compute the iLimit and iOffset fields of the SELECT based on the 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pLimit and pOffset expressions. pLimit and pOffset hold the expressions 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that appear in the original SQL statement after the LIMIT and OFFSET 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** keywords. Or NULL if those keywords are omitted. iLimit and iOffset 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are the integer memory register numbers for counters used to compute 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the limit and offset. If there is no limit and/or offset, then 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** iLimit and iOffset are negative. 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine changes the values of iLimit and iOffset only if 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a limit or offset is defined by pLimit and pOffset. iLimit and 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** iOffset should have been preset to appropriate default values 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (usually but not always -1) prior to calling this routine. 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Only if pLimit!=0 or pOffset!=0 do the limit registers get 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** redefined. The UNION ALL operator uses this property to force 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the reuse of the same limit and offset registers across multiple 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT statements. 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = 0; 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iLimit = 0; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iOffset; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr1, n; 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iLimit ) return; 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** "LIMIT -1" always shows all rows. There is some 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** contraversy about what the correct behavior should be. 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The current implementation interprets "LIMIT 0" to mean 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** no rows. 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pOffset==0 || p->pLimit!=0 ); 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pLimit ){ 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLimit = iLimit = ++pParse->nMem; 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(v==0) ) return; /* VDBE should have already been allocated */ 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprIsInteger(p->pLimit, &n) ){ 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "LIMIT counter")); 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( n==0 ){ 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->nSelectRow > (double)n ) p->nSelectRow = (double)n; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, p->pLimit, iLimit); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "LIMIT counter")); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pOffset ){ 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iOffset = iOffset = ++pParse->nMem; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem++; /* Allocate an extra register for limit+offset */ 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, p->pOffset, iOffset); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "OFFSET counter")); 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset); 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, iOffset); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr1); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Add, iLimit, iOffset, iOffset+1); 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "LIMIT+OFFSET")); 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iLimit); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, -1, iOffset+1); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr1); 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPOUND_SELECT 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return the appropriate collating sequence for the iCol-th column of 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the result set for the compound-select statement "p". Return NULL if 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the column has no default collating sequence. 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The collating sequence for the compound select is taken from the 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** left-most term of the select that has a collating sequence. 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pRet; 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pPrior ){ 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRet = multiSelectCollSeq(pParse, p->pPrior, iCol); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRet = 0; 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( iCol>=0 ); 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pRet==0 && iCol<p->pEList->nExpr ){ 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pRet; 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPOUND_SELECT */ 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Forward reference */ 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int multiSelectOrderBy( 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The right-most of SELECTs to be coded */ 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest /* What to do with query results */ 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPOUND_SELECT 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is called to process a compound query form from 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** two or more separate queries using UNION, UNION ALL, EXCEPT, or 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INTERSECT 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "p" points to the right-most of the two queries. the query on the 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** left is p->pPrior. The left query could also be a compound query 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in which case this routine will be called recursively. 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The results of the total query are to be written into a destination 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of type eDest with parameter iParm. 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Example 1: Consider a three-way compound SQL statement. 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This statement is parsed up as follows: 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT c FROM t3 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** | 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** `-----> SELECT b FROM t2 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** | 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** `------> SELECT a FROM t1 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The arrows in the diagram above represent the Select.pPrior pointer. 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** So if this routine is called with p equal to the t3 query, then 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pPrior will be the t2 query. p->op will be TK_UNION in this case. 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Notice that because of the way SQLite parses compound SELECTs, the 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** individual selects always group from left to right. 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int multiSelect( 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The right-most of SELECTs to be coded */ 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest /* What to do with query results */ 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = SQLITE_OK; /* Success code from a subroutine */ 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pPrior; /* Another SELECT immediately to our left */ 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; /* Generate code to this VDBE */ 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest dest; /* Alternative data destination */ 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pDelete = 0; /* Chain of simple selects to delete */ 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* Database connection */ 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSub1; /* EQP id of left-hand query */ 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSub2; /* EQP id of right-hand query */ 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p && p->pPrior ); /* Calling function guarantees this much */ 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPrior = p->pPrior; 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pPrior->pRightmost!=pPrior ); 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pPrior->pRightmost==p->pRightmost ); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest = *pDest; 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pPrior->pOrderBy ){ 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before", 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectOpName(p->op)); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = 1; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto multi_select_end; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pPrior->pLimit ){ 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse,"LIMIT clause should come after %s not before", 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectOpName(p->op)); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = 1; 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto multi_select_end; 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); /* The VDBE already created by calling function */ 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Create the destination temporary table if necessary 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( dest.eDest==SRT_EphemTab ){ 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pEList ); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iParm, p->pEList->nExpr); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, BTREE_UNORDERED); 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest.eDest = SRT_Table; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make sure all SELECTs in the statement have the same number of elements 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in their result sets. 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pEList && pPrior->pEList ); 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pEList->nExpr!=pPrior->pEList->nExpr ){ 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " do not have the same number of result columns", selectOpName(p->op)); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = 1; 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto multi_select_end; 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Compound SELECTs that have an ORDER BY clause are handled separately. 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pOrderBy ){ 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return multiSelectOrderBy(pParse, p, pDest); 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code for the left and right SELECT statements. 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( p->op ){ 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_ALL: { 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr = 0; 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nLimit; 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !pPrior->pLimit ); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPrior->pLimit = p->pLimit; 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPrior->pOffset = p->pOffset; 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub1, pParse->iNextSelectId); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3Select(pParse, pPrior, &dest); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = 0; 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOffset = 0; 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto multi_select_end; 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = 0; 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLimit = pPrior->iLimit; 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iOffset = pPrior->iOffset; 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iLimit ){ 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "Jump ahead if LIMIT reached")); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub2, pParse->iNextSelectId); 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3Select(pParse, p, &dest); 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( rc!=SQLITE_OK ); 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDelete = p->pPrior; 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = pPrior; 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nSelectRow += pPrior->nSelectRow; 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pPrior->pLimit 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && sqlite3ExprIsInteger(pPrior->pLimit, &nLimit) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && p->nSelectRow > (double)nLimit 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nSelectRow = (double)nLimit; 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( addr ){ 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, addr); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_EXCEPT: 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case TK_UNION: { 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int unionTab; /* Cursor number of the temporary table holding result */ 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 op = 0; /* One of the SRT_ operations to apply to self */ 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int priorOp; /* The SRT_ operation to apply to prior selects */ 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */ 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest uniondest; 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_EXCEPT ); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( p->op==TK_UNION ); 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) priorOp = SRT_Union; 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( dest.eDest==priorOp && ALWAYS(!p->pLimit &&!p->pOffset) ){ 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We can reuse a temporary table generated by a SELECT to our 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** right. 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pRightmost!=p ); /* Can only happen for leftward elements 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of a 3-way or more compound */ 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pLimit==0 ); /* Not allowed on leftward elements */ 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pOffset==0 ); /* Not allowed on leftward elements */ 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unionTab = dest.iParm; 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We will need to create our own temporary table to hold the 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** intermediate results. 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unionTab = pParse->nTab++; 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pOrderBy==0 ); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->addrOpenEphm[0] == -1 ); 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->addrOpenEphm[0] = addr; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pRightmost->selFlags |= SF_UsesEphemeral; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pEList ); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code the SELECT statements to our left 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !pPrior->pOrderBy ); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&uniondest, priorOp, unionTab); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub1, pParse->iNextSelectId); 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3Select(pParse, pPrior, &uniondest); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto multi_select_end; 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code the current SELECT statement 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->op==TK_EXCEPT ){ 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = SRT_Except; 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->op==TK_UNION ); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = SRT_Union; 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = 0; 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLimit = p->pLimit; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = 0; 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOffset = p->pOffset; 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOffset = 0; 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uniondest.eDest = op; 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub2, pParse->iNextSelectId); 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3Select(pParse, p, &uniondest); 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( rc!=SQLITE_OK ); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Query flattening in sqlite3Select() might refill p->pOrderBy. 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, p->pOrderBy); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDelete = p->pPrior; 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = pPrior; 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOrderBy = 0; 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->op==TK_UNION ) p->nSelectRow += pPrior->nSelectRow; 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pLimit); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = pLimit; 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOffset = pOffset; 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLimit = 0; 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iOffset = 0; 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Convert the data in the temporary table into whatever form 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it is that we currently need. 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( unionTab==dest.iParm || dest.eDest!=priorOp ); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( dest.eDest!=priorOp ){ 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCont, iBreak, iStart; 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pEList ); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( dest.eDest==SRT_Output ){ 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pFirst = p; 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pFirst->pPrior ) pFirst = pFirst->pPrior; 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generateColumnNames(pParse, 0, pFirst->pEList); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iBreak = sqlite3VdbeMakeLabel(v); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCont = sqlite3VdbeMakeLabel(v); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) computeLimitRegisters(pParse, p, iBreak); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iStart = sqlite3VdbeCurrentAddr(v); 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectInnerLoop(pParse, p, p->pEList, unionTab, p->pEList->nExpr, 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, -1, &dest, iCont, iBreak); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, iCont); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, iBreak); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: assert( p->op==TK_INTERSECT ); { 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tab1, tab2; 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iCont, iBreak, iStart; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLimit, *pOffset; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest intersectdest; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* INTERSECT is different from the others since it requires 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** two temporary tables. Hence it has its own case. Begin 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** by allocating the tables we will need. 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab1 = pParse->nTab++; 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab2 = pParse->nTab++; 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pOrderBy==0 ); 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->addrOpenEphm[0] == -1 ); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->addrOpenEphm[0] = addr; 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pRightmost->selFlags |= SF_UsesEphemeral; 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pEList ); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code the SELECTs to our left into temporary table "tab1". 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub1, pParse->iNextSelectId); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3Select(pParse, pPrior, &intersectdest); 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc ){ 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto multi_select_end; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Code the current SELECT into temporary table "tab2" 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->addrOpenEphm[1] == -1 ); 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->addrOpenEphm[1] = addr; 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = 0; 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLimit = p->pLimit; 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = 0; 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOffset = p->pOffset; 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOffset = 0; 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intersectdest.iParm = tab2; 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub2, pParse->iNextSelectId); 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = sqlite3Select(pParse, p, &intersectdest); 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( rc!=SQLITE_OK ); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDelete = p->pPrior; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = pPrior; 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->nSelectRow>pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pLimit); 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = pLimit; 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOffset = pOffset; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code to take the intersection of the two temporary 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** tables. 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pEList ); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( dest.eDest==SRT_Output ){ 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pFirst = p; 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pFirst->pPrior ) pFirst = pFirst->pPrior; 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generateColumnNames(pParse, 0, pFirst->pEList); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iBreak = sqlite3VdbeMakeLabel(v); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iCont = sqlite3VdbeMakeLabel(v); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) computeLimitRegisters(pParse, p, iBreak); 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GetTempReg(pParse); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iStart = sqlite3VdbeAddOp2(v, OP_RowKey, tab1, r1); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectInnerLoop(pParse, p, p->pEList, tab1, p->pEList->nExpr, 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, -1, &dest, iCont, iBreak); 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, iCont); 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, iBreak); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainComposite(pParse, p->op, iSub1, iSub2, p->op!=TK_ALL); 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Compute collating sequences used by 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** temporary tables needed to implement the compound select. 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Attach the KeyInfo structure to all temporary tables. 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This section is run by the right-most SELECT statement only. 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT statements to the left always skip this part. The right-most 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT might also skip this part if it has no ORDER BY clause and 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** no temp tables are required. 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->selFlags & SF_UsesEphemeral ){ 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyInfo; /* Collating sequence for the result set */ 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pLoop; /* For looping through SELECT statements */ 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq **apColl; /* For looping through pKeyInfo->aColl[] */ 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCol; /* Number of columns in result set */ 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pRightmost==p ); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nCol = p->pEList->nExpr; 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyInfo = sqlite3DbMallocZero(db, 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(*pKeyInfo)+nCol*(sizeof(CollSeq*) + 1)); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pKeyInfo ){ 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = SQLITE_NOMEM; 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto multi_select_end; 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyInfo->enc = ENC(db); 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyInfo->nField = (u16)nCol; 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, apColl=pKeyInfo->aColl; i<nCol; i++, apColl++){ 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *apColl = multiSelectCollSeq(pParse, p, i); 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( 0==*apColl ){ 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *apColl = db->pDfltColl; 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pLoop=p; pLoop; pLoop=pLoop->pPrior){ 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<2; i++){ 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr = pLoop->addrOpenEphm[i]; 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( addr<0 ){ 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If [0] is unused then [1] is also unused. So we can 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** always safely abort as soon as the first unused slot is found */ 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pLoop->addrOpenEphm[1]<0 ); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP2(v, addr, nCol); 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, addr, (char*)pKeyInfo, P4_KEYINFO); 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLoop->addrOpenEphm[i] = -1; 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pKeyInfo); 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)multi_select_end: 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->iMem = dest.iMem; 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->nMem = dest.nMem; 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDelete(db, pDelete); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_COMPOUND_SELECT */ 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Code an output subroutine for a coroutine implementation of a 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT statment. 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The data to be output is contained in pIn->iMem. There are 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pIn->nMem columns to be output. pDest is where the output should 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be sent. 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** regReturn is the number of the register holding the subroutine 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return address. 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If regPrev>0 then it is the first register in a vector that 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** records the previous output. mem[regPrev] is a flag that is false 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if there has been no previous output. If regPrev>0 then code is 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** generated to suppress duplicates. pKeyInfo is used for comparing 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** keys. 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the LIMIT found in p->iLimit is reached, jump immediately to 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** iBreak. 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int generateOutputSubroutine( 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The SELECT statement */ 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pIn, /* Coroutine supplying data */ 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest, /* Where to send the data */ 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regReturn, /* The return address register */ 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regPrev, /* Previous result register. No uniqueness if 0 */ 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyInfo, /* For comparing with previous entry */ 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int p4type, /* The p4 type for pKeyInfo */ 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iBreak /* Jump here if we hit the LIMIT */ 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iContinue; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addr; 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = sqlite3VdbeCurrentAddr(v); 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iContinue = sqlite3VdbeMakeLabel(v); 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Suppress duplicates for UNION, EXCEPT, and INTERSECT 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( regPrev ){ 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1, j2; 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iMem, regPrev+1, pIn->nMem, 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKeyInfo, p4type); 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2); 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeCopy(pParse, pIn->iMem, regPrev+1, pIn->nMem); 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->db->mallocFailed ) return 0; 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Suppress the the first OFFSET entries if there is an OFFSET clause 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeOffset(v, p, iContinue); 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch( pDest->eDest ){ 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Store the result as data using a unique key. 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Table: 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_EphemTab: { 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1 = sqlite3GetTempReg(pParse); 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r2 = sqlite3GetTempReg(pParse); 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pDest->eDest==SRT_Table ); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( pDest->eDest==SRT_EphemTab ); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iMem, pIn->nMem, r1); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iParm, r2); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Insert, pDest->iParm, r1, r2); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, OPFLAG_APPEND); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r2); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we are creating a set for an "expr IN (SELECT ...)" construct, 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then there should be a single item on the stack. Write this 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** item into the set table with bogus data. 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Set: { 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1; 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pIn->nMem==1 ); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->affinity = 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CompareAffinity(p->pEList->a[0].pExpr, pDest->affinity); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r1 = sqlite3GetTempReg(pParse); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iMem, 1, r1, &p->affinity, 1); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, pIn->iMem, 1); 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, pDest->iParm, r1); 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, r1); 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 /* Never occurs on an ORDER BY query */ 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If any row exist in the result set, record that fact and abort. 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Exists: { 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, pDest->iParm); 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The LIMIT clause will terminate the loop for us */ 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If this is a scalar select that is part of an expression, then 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** store the results in the appropriate memory cell and break out 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the scan loop. 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Mem: { 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pIn->nMem==1 ); 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeMove(pParse, pIn->iMem, pDest->iParm, 1); 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The LIMIT clause will jump out of the loop for us */ 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* #ifndef SQLITE_OMIT_SUBQUERY */ 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The results are stored in a sequence of registers 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** starting at pDest->iMem. Then the co-routine yields. 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case SRT_Coroutine: { 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->iMem==0 ){ 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->iMem = sqlite3GetTempRange(pParse, pIn->nMem); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->nMem = pIn->nMem; 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeMove(pParse, pIn->iMem, pDest->iMem, pDest->nMem); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, pDest->iParm); 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If none of the above, then the result destination must be 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SRT_Output. This routine is never called with any other 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** destination other than the ones handled above or SRT_Output. 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** For SRT_Output, results are stored in a sequence of registers. 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Then the OP_ResultRow opcode is used to cause sqlite3_step() to 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** return the next row of result. 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: { 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pDest->eDest==SRT_Output ); 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_ResultRow, pIn->iMem, pIn->nMem); 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, pIn->iMem, pIn->nMem); 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Jump to the end of the loop if the LIMIT is reached. 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iLimit ){ 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate the subroutine return 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, iContinue); 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Return, regReturn); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return addr; 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Alternative compound select code generator for cases when there 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is an ORDER BY clause. 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** We assume a query of the following form: 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <selectA> <operator> <selectB> ORDER BY <orderbylist> 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <operator> is one of UNION ALL, UNION, EXCEPT, or INTERSECT. The idea 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is to code both <selectA> and <selectB> with the ORDER BY clause as 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** co-routines. Then run the co-routines in parallel and merge the results 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into the output. In addition to the two coroutines (called selectA and 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** selectB) there are 7 subroutines: 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** outA: Move the output of the selectA coroutine into the output 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the compound query. 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** outB: Move the output of the selectB coroutine into the output 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the compound query. (Only generated for UNION and 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UNION ALL. EXCEPT and INSERTSECT never output a row that 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** appears only in B.) 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AltB: Called when there is data from both coroutines and A<B. 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AeqB: Called when there is data from both coroutines and A==B. 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AgtB: Called when there is data from both coroutines and A>B. 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EofA: Called when data is exhausted from selectA. 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EofB: Called when data is exhausted from selectB. 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The implementation of the latter five subroutines depend on which 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <operator> is used: 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UNION ALL UNION EXCEPT INTERSECT 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ------------- ----------------- -------------- ----------------- 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AltB: outA, nextA outA, nextA outA, nextA nextA 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AeqB: outA, nextA nextA nextA outA, nextA 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AgtB: outB, nextB outB, nextB nextB nextB 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EofA: outB, nextB outB, nextB halt halt 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EofB: outA, nextA outA, nextA outA, nextA halt 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In the AltB, AeqB, and AgtB subroutines, an EOF on A following nextA 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** causes an immediate jump to EofA and an EOF on B following nextB causes 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an immediate jump to EofB. Within EofA and EofB, and EOF on entry or 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** following nextX causes a jump to the end of the select processing. 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Duplicate removal in the UNION, EXCEPT, and INTERSECT cases is handled 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** within the output subroutine. The regPrev register set holds the previously 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** output value. A comparison is made against this value and the output 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is skipped if the next results would be the same as the previous. 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The implementation plan is to implement the two coroutines and seven 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** subroutines first, then put the control logic at the bottom. Like this: 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** goto Init 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** coA: coroutine for left query (A) 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** coB: coroutine for right query (B) 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** outA: output one row of A 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** outB: output one row of B (UNION and UNION ALL only) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EofA: ... 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** EofB: ... 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AltB: ... 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AeqB: ... 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AgtB: ... 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Init: initialize coroutine registers 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yield coA 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if eof(A) goto EofA 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** yield coB 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if eof(B) goto EofB 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Cmpr: Compare A, B 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Jump AltB, AeqB, AgtB 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** End: ... 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** We call AltB, AeqB, AgtB, EofA, and EofB "subroutines" but they are not 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** actually called using Gosub and they do not Return. EofA and EofB loop 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** until all data is exhausted then jump to the "end" labe. AltB, AeqB, 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and AgtB jump to either L2 or to one of EofA or EofB. 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPOUND_SELECT 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int multiSelectOrderBy( 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The right-most of SELECTs to be coded */ 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest /* What to do with query results */ 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; /* Loop counters */ 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pPrior; /* Another SELECT immediately to our left */ 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; /* Generate code to this VDBE */ 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest destA; /* Destination for coroutine A */ 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest destB; /* Destination for coroutine B */ 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regAddrA; /* Address register for select-A coroutine */ 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regEofA; /* Flag to indicate when select-A is complete */ 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regAddrB; /* Address register for select-B coroutine */ 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regEofB; /* Flag to indicate when select-B is complete */ 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrSelectA; /* Address of the select-A coroutine */ 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrSelectB; /* Address of the select-B coroutine */ 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regOutA; /* Address register for the output-A subroutine */ 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regOutB; /* Address register for the output-B subroutine */ 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrOutA; /* Address of the output-A subroutine */ 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrOutB = 0; /* Address of the output-B subroutine */ 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrEofA; /* Address of the select-A-exhausted subroutine */ 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrEofB; /* Address of the select-B-exhausted subroutine */ 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrAltB; /* Address of the A<B subroutine */ 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrAeqB; /* Address of the A==B subroutine */ 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrAgtB; /* Address of the A>B subroutine */ 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regLimitA; /* Limit register for select-A */ 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regLimitB; /* Limit register for select-A */ 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regPrev; /* A range of registers to hold previous output */ 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int savedLimit; /* Saved value of p->iLimit */ 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int savedOffset; /* Saved value of p->iOffset */ 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int labelCmpr; /* Label for the start of the merge algorithm */ 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int labelEnd; /* Label for the end of the overall SELECT stmt */ 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1; /* Jump instructions that get retargetted */ 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */ 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */ 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyMerge; /* Comparison information for merging rows */ 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* Database connection */ 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy; /* The ORDER BY clause */ 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nOrderBy; /* Number of terms in the ORDER BY clause */ 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *aPermute; /* Mapping from ORDER BY terms to result set columns */ 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSub1; /* EQP id of left-hand query */ 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iSub2; /* EQP id of right-hand query */ 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pOrderBy!=0 ); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */ 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = pParse->pVdbe; 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labelEnd = sqlite3VdbeMakeLabel(v); 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labelCmpr = sqlite3VdbeMakeLabel(v); 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Patch up the ORDER BY clause 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) op = p->op; 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPrior = p->pPrior; 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pPrior->pOrderBy==0 ); 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy = p->pOrderBy; 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pOrderBy ); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nOrderBy = pOrderBy->nExpr; 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* For operators other than UNION ALL we have to make sure that 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the ORDER BY clause covers every term of the result set. Add 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** terms to the ORDER BY clause as necessary. 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op!=TK_ALL ){ 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){ 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0, pItem=pOrderBy->a; j<nOrderBy; j++, pItem++){ 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pItem->iCol>0 ); 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->iCol==i ) break; 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( j==nOrderBy ){ 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ) return SQLITE_NOMEM; 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->flags |= EP_IntValue; 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->u.iValue = i; 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy->a[nOrderBy++].iCol = (u16)i; 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Compute the comparison permutation and keyinfo that is used with 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the permutation used to determine if the next 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** row of results comes from selectA or selectB. Also add explicit 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** collations to the ORDER BY clause terms so that when the subqueries 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to the right and the left are evaluated, they use the correct 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** collation. 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aPermute = sqlite3DbMallocRaw(db, sizeof(int)*nOrderBy); 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( aPermute ){ 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pItem=pOrderBy->a; i<nOrderBy; i++, pItem++){ 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pItem->iCol>0 && pItem->iCol<=p->pEList->nExpr ); 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aPermute[i] = pItem->iCol - 1; 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyMerge = 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbMallocRaw(db, sizeof(*pKeyMerge)+nOrderBy*(sizeof(CollSeq*)+1)); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pKeyMerge ){ 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyMerge->aSortOrder = (u8*)&pKeyMerge->aColl[nOrderBy]; 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyMerge->nField = (u16)nOrderBy; 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyMerge->enc = ENC(db); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nOrderBy; i++){ 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl; 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pTerm = pOrderBy->a[i].pExpr; 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTerm->flags & EP_ExpCollate ){ 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = pTerm->pColl; 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = multiSelectCollSeq(pParse, p, aPermute[i]); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTerm->flags |= EP_ExpCollate; 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTerm->pColl = pColl; 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyMerge->aColl[i] = pColl; 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyMerge->aSortOrder[i] = pOrderBy->a[i].sortOrder; 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyMerge = 0; 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Reattach the ORDER BY clause to the query. 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOrderBy = pOrderBy; 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPrior->pOrderBy = sqlite3ExprListDup(pParse->db, pOrderBy, 0); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allocate a range of temporary registers and the KeyInfo needed 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for the logic that removes duplicate result rows when the 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** operator is UNION, EXCEPT, or INTERSECT (but not UNION ALL). 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_ALL ){ 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regPrev = 0; 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nExpr = p->pEList->nExpr; 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nOrderBy>=nExpr || db->mallocFailed ); 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regPrev = sqlite3GetTempRange(pParse, nExpr+1); 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, regPrev); 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyDup = sqlite3DbMallocZero(db, 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(*pKeyDup) + nExpr*(sizeof(CollSeq*)+1) ); 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pKeyDup ){ 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyDup->aSortOrder = (u8*)&pKeyDup->aColl[nExpr]; 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyDup->nField = (u16)nExpr; 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyDup->enc = ENC(db); 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nExpr; i++){ 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyDup->aColl[i] = multiSelectCollSeq(pParse, p, i); 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyDup->aSortOrder[i] = 0; 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Separate the left and the right query from one another 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = 0; 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ResolveOrderGroupBy(pParse, p, p->pOrderBy, "ORDER"); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pPrior->pPrior==0 ){ 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ResolveOrderGroupBy(pParse, pPrior, pPrior->pOrderBy, "ORDER"); 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Compute the limit registers */ 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) computeLimitRegisters(pParse, p, labelEnd); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->iLimit && op==TK_ALL ){ 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regLimitA = ++pParse->nMem; 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regLimitB = ++pParse->nMem; 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Copy, p->iOffset ? p->iOffset+1 : p->iLimit, 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regLimitA); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Copy, regLimitA, regLimitB); 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regLimitA = regLimitB = 0; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pLimit); 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = 0; 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, p->pOffset); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOffset = 0; 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regAddrA = ++pParse->nMem; 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regEofA = ++pParse->nMem; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regAddrB = ++pParse->nMem; 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regEofB = ++pParse->nMem; 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regOutA = ++pParse->nMem; 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regOutB = ++pParse->nMem; 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Jump past the various subroutines and coroutines to the main 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** merge loop 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeAddOp0(v, OP_Goto); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrSelectA = sqlite3VdbeCurrentAddr(v); 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a coroutine to evaluate the SELECT statement to the 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** left of the compound operator - the "A" select. 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "Begin coroutine for left SELECT")); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pPrior->iLimit = regLimitA; 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub1, pParse->iNextSelectId); 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3Select(pParse, pPrior, &destA); 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofA); 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "End coroutine for left SELECT")); 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a coroutine to evaluate the SELECT statement on 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the right - the "B" select 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrSelectB = sqlite3VdbeCurrentAddr(v); 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "Begin coroutine for right SELECT")); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) savedLimit = p->iLimit; 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) savedOffset = p->iOffset; 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLimit = regLimitB; 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iOffset = 0; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(iSub2, pParse->iNextSelectId); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3Select(pParse, p, &destB); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iLimit = savedLimit; 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->iOffset = savedOffset; 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, regEofB); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, regAddrB); 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "End coroutine for right SELECT")); 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a subroutine that outputs the current row of the A 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** select as the next output row of the compound select. 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "Output routine for A")); 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrOutA = generateOutputSubroutine(pParse, 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p, &destA, pDest, regOutA, 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regPrev, pKeyDup, P4_KEYINFO_HANDOFF, labelEnd); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a subroutine that outputs the current row of the B 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** select as the next output row of the compound select. 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_ALL || op==TK_UNION ){ 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "Output routine for B")); 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrOutB = generateOutputSubroutine(pParse, 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p, &destB, pDest, regOutB, 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regPrev, pKeyDup, P4_KEYINFO_STATIC, labelEnd); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a subroutine to run when the results from select A 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** are exhausted and only data in select B remains. 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "eof-A subroutine")); 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_EXCEPT || op==TK_INTERSECT ){ 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrEofA = sqlite3VdbeAddOp2(v, OP_Goto, 0, labelEnd); 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrEofA = sqlite3VdbeAddOp2(v, OP_If, regEofB, labelEnd); 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, regAddrB); 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofA); 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nSelectRow += pPrior->nSelectRow; 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a subroutine to run when the results from select B 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** are exhausted and only data in select A remains. 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_INTERSECT ){ 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrEofB = addrEofA; 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->nSelectRow > pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "eof-B subroutine")); 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrEofB = sqlite3VdbeAddOp2(v, OP_If, regEofA, labelEnd); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofB); 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code to handle the case of A<B 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "A-lt-B subroutine")); 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrAltB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA); 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code to handle the case of A==B 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_ALL ){ 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrAeqB = addrAltB; 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( op==TK_INTERSECT ){ 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrAeqB = addrAltB; 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrAltB++; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "A-eq-B subroutine")); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrAeqB = 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, regAddrA); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA); 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code to handle the case of A>B 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeNoopComment((v, "A-gt-B subroutine")); 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrAgtB = sqlite3VdbeCurrentAddr(v); 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( op==TK_ALL || op==TK_UNION ){ 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Yield, regAddrB); 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This code runs once to initialize everything. 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofA); 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, regEofB); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regAddrA, addrSelectA); 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regAddrB, addrSelectB); 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_If, regEofA, addrEofA); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_If, regEofB, addrEofB); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Implement the main merge loop 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, labelCmpr); 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Permutation, 0, 0, 0, (char*)aPermute, P4_INTARRAY); 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Compare, destA.iMem, destB.iMem, nOrderBy, 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKeyMerge, P4_KEYINFO_HANDOFF); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Jump, addrAltB, addrAeqB, addrAgtB); 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Release temporary registers 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( regPrev ){ 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, regPrev, nOrderBy+1); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Jump to the this point in order to terminate the query. 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, labelEnd); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set the number of output columns 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->eDest==SRT_Output ){ 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pFirst = pPrior; 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pFirst->pPrior ) pFirst = pFirst->pPrior; 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generateColumnNames(pParse, 0, pFirst->pEList); 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Reassembly the compound query so that it will be freed correctly 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** by the calling function */ 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pPrior ){ 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDelete(db, p->pPrior); 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = pPrior; 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /*** TBD: Insert subroutine calls to close cursors on incomplete 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) **** subqueries ****/ 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainComposite(pParse, p->op, iSub1, iSub2, 0); 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Forward Declarations */ 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void substExprList(sqlite3*, ExprList*, int, ExprList*); 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void substSelect(sqlite3*, Select *, int, ExprList *); 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Scan through the expression pExpr. Replace every reference to 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a column in table number iTable with a copy of the iColumn-th 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** entry in pEList. (But leave references to the ROWID column 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unchanged.) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is part of the flattening procedure. A subquery 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** whose result set is defined by pEList appears as entry in the 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** FROM clause of a SELECT such that the VDBE cursor assigned to that 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** FORM clause entry is iTable. This routine make the necessary 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** changes to pExpr so that it refers directly to the source table 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the subquery rather the result set of the subquery. 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Expr *substExpr( 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* Report malloc errors to this connection */ 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr, /* Expr in which substitution occurs */ 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTable, /* Table to be substituted */ 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList /* Substitute expressions */ 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr==0 ) return 0; 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){ 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->iColumn<0 ){ 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->op = TK_NULL; 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pNew; 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 && pExpr->iColumn<pEList->nExpr ); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pExpr->pLeft==0 && pExpr->pRight==0 ); 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3ExprDup(db, pEList->a[pExpr->iColumn].pExpr, 0); 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew && pExpr->pColl ){ 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pColl = pExpr->pColl; 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDelete(db, pExpr); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr = pNew; 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pLeft = substExpr(db, pExpr->pLeft, iTable, pEList); 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr->pRight = substExpr(db, pExpr->pRight, iTable, pEList); 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ExprHasProperty(pExpr, EP_xIsSelect) ){ 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substSelect(db, pExpr->x.pSelect, iTable, pEList); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substExprList(db, pExpr->x.pList, iTable, pEList); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pExpr; 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void substExprList( 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* Report malloc errors here */ 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList, /* List to scan and in which to make substitutes */ 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTable, /* Table to be substituted */ 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList /* Substitute values */ 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList==0 ) return; 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pList->nExpr; i++){ 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pList->a[i].pExpr = substExpr(db, pList->a[i].pExpr, iTable, pEList); 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void substSelect( 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db, /* Report malloc errors here */ 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* SELECT statement in which to make substitutions */ 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iTable, /* Table to be replaced */ 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList /* Substitute values */ 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrc; 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem; 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !p ) return; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substExprList(db, p->pEList, iTable, pEList); 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substExprList(db, p->pGroupBy, iTable, pEList); 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substExprList(db, p->pOrderBy, iTable, pEList); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pHaving = substExpr(db, p->pHaving, iTable, pEList); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pWhere = substExpr(db, p->pWhere, iTable, pEList); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substSelect(db, p->pPrior, iTable, pEList); 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc = p->pSrc; 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrc ); /* Even for (SELECT 1) we have: pSrc!=0 but pSrc->nSrc==0 */ 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pSrc) ){ 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substSelect(db, pItem->pSelect, iTable, pEList); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine attempts to flatten subqueries in order to speed 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** execution. It returns 1 if it makes changes and 0 if no flattening 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** occurs. 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To understand the concept of flattening, consider the following 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** query: 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The default way of implementing this query is to execute the 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** subquery first and store the results in a temporary table, then 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** run the outer query on that temporary table. This requires two 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** passes over the data. Furthermore, because the temporary table 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has no indices, the WHERE clause on the outer query cannot be 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** optimized. 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine attempts to rewrite queries such as the above into 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a single flat select, like this: 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The code generated for this simpification gives the same result 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** but only has to scan the data once. And because indices might 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** exist on the table t1, a complete scan of the data might be 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** avoided. 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Flattening is only attempted if all of the following are true: 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (1) The subquery and the outer query do not both use aggregates. 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (2) The subquery is not an aggregate or the outer query is not a join. 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (3) The subquery is not the right operand of a left outer join 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (Originally ticket #306. Strengthened by ticket #3300) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (4) The subquery is not DISTINCT. 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sub-queries that were excluded from this optimization. Restriction 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (4) has since been expanded to exclude all DISTINCT subqueries. 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (6) The subquery does not use aggregates or the outer query is not 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** DISTINCT. 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (7) The subquery has a FROM clause. 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (8) The subquery does not use LIMIT or the outer query is not a join. 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (9) The subquery does not use LIMIT or the outer query does not use 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** aggregates. 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (10) The subquery does not use aggregates or the outer query does not 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use LIMIT. 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (11) The subquery and the outer query do not both have ORDER BY clauses. 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (**) Not implemented. Subsumed into restriction (3). Was previously 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a separate restriction deriving from ticket #350. 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (13) The subquery and outer query do not both use LIMIT. 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (14) The subquery does not use OFFSET. 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (15) The outer query is not part of a compound select or the 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** subquery does not have a LIMIT clause. 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (See ticket #2339 and ticket [02a8e81d44]). 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (16) The outer query is not an aggregate or the subquery does 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not contain ORDER BY. (Ticket #2942) This used to not matter 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** until we introduced the group_concat() function. 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (17) The sub-query is not a compound select, or it is a UNION ALL 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** compound clause made up entirely of non-aggregate queries, and 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the parent query: 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * is not itself part of a compound select, 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * is not an aggregate or DISTINCT query, and 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * has no other tables or sub-selects in the FROM clause. 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The parent and sub-query may contain WHERE clauses. Subject to 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rules (11), (13) and (14), they may also contain ORDER BY, 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** LIMIT and OFFSET clauses. 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (18) If the sub-query is a compound select, then all terms of the 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ORDER by clause of the parent must be simple references to 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** columns of the sub-query. 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (19) The subquery does not use LIMIT or the outer query does not 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have a WHERE clause. 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (20) If the sub-query is a compound select, then it must not use 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an ORDER BY clause. Ticket #3773. We could relax this constraint 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** somewhat by saying that the terms of the ORDER BY clause must 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** appear as unmodified result columns in the outer query. But 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have other optimizations in mind to deal with that case. 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (21) The subquery does not use LIMIT or the outer query is not 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** DISTINCT. (See ticket [752e1646fc]). 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In this routine, the "p" parameter is a pointer to the outer query. 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates. 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If flattening is not attempted, this routine is a no-op and returns 0. 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If flattening is attempted this routine returns 1. 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** All of the expression analysis must occur on both the outer query and 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the subquery before this routine runs. 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int flattenSubquery( 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parsing context */ 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The parent or outer SELECT statement */ 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iFrom, /* Index in p->pSrc->a[] of the inner subquery */ 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isAgg, /* True if outer SELECT uses aggregate functions */ 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int subqueryIsAgg /* True if the subquery uses aggregate functions */ 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSavedAuthContext = pParse->zAuthContext; 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pParent; 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSub; /* The inner query or "subquery" */ 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSub1; /* Pointer to the rightmost select in sub-query */ 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSrc; /* The FROM clause of the outer query */ 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pSubSrc; /* The FROM clause of the subquery */ 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList; /* The result set of the outer query */ 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iParent; /* VDBE cursor number of the pSub result set temp table */ 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; /* Loop counter */ 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pWhere; /* The WHERE clause */ 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pSubitem; /* The subquery */ 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check to see if flattening is permitted. Return 0 if not. 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p!=0 ); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pPrior==0 ); /* Unable to flatten compound queries */ 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->flags & SQLITE_QueryFlattener ) return 0; 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc = p->pSrc; 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSrc && iFrom>=0 && iFrom<pSrc->nSrc ); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubitem = &pSrc->a[iFrom]; 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iParent = pSubitem->iCursor; 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSub = pSubitem->pSelect; 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSub!=0 ); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isAgg && subqueryIsAgg ) return 0; /* Restriction (1) */ 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( subqueryIsAgg && pSrc->nSrc>1 ) return 0; /* Restriction (2) */ 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubSrc = pSub->pSrc; 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSubSrc ); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants, 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** not arbitrary expresssions, we allowed some combining of LIMIT and OFFSET 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** because they could be computed at compile-time. But when LIMIT and OFFSET 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** became arbitrary expressions, we were forced to add restrictions (13) 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and (14). */ 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pOffset ) return 0; /* Restriction (14) */ 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pRightmost && pSub->pLimit ){ 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Restriction (15) */ 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (5) */ 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){ 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Restrictions (8)(9) */ 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (p->selFlags & SF_Distinct)!=0 && subqueryIsAgg ){ 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Restriction (6) */ 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pOrderBy && pSub->pOrderBy ){ 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Restriction (11) */ 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isAgg && pSub->pOrderBy ) return 0; /* Restriction (16) */ 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pLimit && p->pWhere ) return 0; /* Restriction (19) */ 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){ 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Restriction (21) */ 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* OBSOLETE COMMENT 1: 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Restriction 3: If the subquery is a join, make sure the subquery is 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** not used as the right operand of an outer join. Examples of why this 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is not allowed: 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** t1 LEFT OUTER JOIN (t2 JOIN t3) 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If we flatten the above, we would get 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (t1 LEFT OUTER JOIN t2) JOIN t3 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** which is not at all the same thing. 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** OBSOLETE COMMENT 2: 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Restriction 12: If the subquery is the right operand of a left outer 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** join, make sure the subquery has no WHERE clause. 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** An examples of why this is not allowed: 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** t1 LEFT OUTER JOIN (SELECT * FROM t2 WHERE t2.x>0) 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If we flatten the above, we would get 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (t1 LEFT OUTER JOIN t2) WHERE t2.x>0 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** But the t2.x>0 test will always fail on a NULL row of t2, which 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** effectively converts the OUTER JOIN into an INNER JOIN. 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** THIS OVERRIDES OBSOLETE COMMENTS 1 AND 2 ABOVE: 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Ticket #3300 shows that flattening the right term of a LEFT JOIN 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is fraught with danger. Best to avoid the whole thing. If the 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** subquery is the right term of a LEFT JOIN, then do not flatten. 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pSubitem->jointype & JT_OUTER)!=0 ){ 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Restriction 17: If the sub-query is a compound SELECT, then it must 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** use only the UNION ALL operator. And none of the simple select queries 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that make up the compound SELECT are allowed to be aggregate or distinct 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** queries. 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pPrior ){ 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pOrderBy ){ 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; /* Restriction 20 */ 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){ 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || (pSub1->pPrior && pSub1->op!=TK_ALL) 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || NEVER(pSub1->pSrc==0) || pSub1->pSrc->nSrc!=1 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Restriction 18. */ 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pOrderBy ){ 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ii; 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(ii=0; ii<p->pOrderBy->nExpr; ii++){ 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pOrderBy->a[ii].iCol==0 ) return 0; 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /***** If we reach this point, flattening is permitted. *****/ 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Authorize the subquery */ 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->zAuthContext = pSubitem->zName; 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->zAuthContext = zSavedAuthContext; 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the sub-query is a compound SELECT statement, then (by restrictions 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 17 and 18 above) it must be a UNION ALL and the parent query must 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** be of the form: 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT <expr-list> FROM (<sub-query>) <where-clause> 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** followed by any ORDER BY, LIMIT and/or OFFSET clauses. This block 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** creates N-1 copies of the parent query without any ORDER BY, LIMIT or 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** OFFSET clauses and joins them to the left-hand-side of the original 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** using UNION ALL operators. In this case N is the number of simple 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** select statements in the compound sub-query. 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Example: 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT a+1 FROM ( 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT x FROM tab 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** UNION ALL 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT y FROM tab 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** UNION ALL 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT abs(z*2) FROM tab2 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ) WHERE a!=5 ORDER BY 1 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Transformed into: 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT x+1 FROM tab WHERE x+1!=5 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** UNION ALL 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT y+1 FROM tab WHERE y+1!=5 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** UNION ALL 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT abs(z*2)+1 FROM tab2 WHERE abs(z*2)+1!=5 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** ORDER BY 1 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** We call this the "compound-subquery flattening". 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pSub=pSub->pPrior; pSub; pSub=pSub->pPrior){ 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pNew; 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy = p->pOrderBy; 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLimit = p->pLimit; 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pPrior = p->pPrior; 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOrderBy = 0; 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pSrc = 0; 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = 0; 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = 0; 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3SelectDup(db, p, 0); 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pLimit = pLimit; 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOrderBy = pOrderBy; 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pSrc = pSrc; 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->op = TK_ALL; 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pRightmost = 0; 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew==0 ){ 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = pPrior; 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pPrior = pPrior; 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->pRightmost = 0; 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pPrior = pNew; 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ) return 1; 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Begin flattening the iFrom-th entry of the FROM clause 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in the outer query. 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSub = pSub1 = pSubitem->pSelect; 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Delete the transient table structure associated with the 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** subquery 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pSubitem->zDatabase); 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pSubitem->zName); 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, pSubitem->zAlias); 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubitem->zDatabase = 0; 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubitem->zName = 0; 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubitem->zAlias = 0; 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubitem->pSelect = 0; 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Defer deleting the Table object associated with the 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** subquery until code generation is 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** complete, since there may still exist Expr.pTab entries that 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** refer to the subquery even after flattening. Ticket #3346. 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** pSubitem->pTab is always non-NULL by test restrictions and tests above. 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pSubitem->pTab!=0) ){ 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTabToDel = pSubitem->pTab; 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTabToDel->nRef==1 ){ 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pToplevel = sqlite3ParseToplevel(pParse); 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabToDel->pNextZombie = pToplevel->pZombieTab; 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pToplevel->pZombieTab = pTabToDel; 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabToDel->nRef--; 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubitem->pTab = 0; 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The following loop runs once for each term in a compound-subquery 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** flattening (as described above). If we are doing a different kind 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of flattening - a flattening other than a compound-subquery flattening - 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then this loop only runs once. 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This loop moves all of the FROM elements of the subquery into the 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the FROM clause of the outer query. Before doing this, remember 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the cursor number for the original outer query FROM element in 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** iParent. The iParent cursor will never be used. Subsequent code 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** will scan expressions looking for iParent references and replace 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** those references with expressions that resolve to the subquery FROM 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** elements we are now copying in. 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nSubSrc; 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 jointype = 0; 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSubSrc = pSub->pSrc; /* FROM clause of subquery */ 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc = pParent->pSrc; /* FROM clause of the outer query */ 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc ){ 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParent==p ); /* First time through the loop */ 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jointype = pSubitem->jointype; 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParent!=p ); /* 2nd and subsequent times through the loop */ 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSrc==0 ){ 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( db->mallocFailed ); 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The subquery uses a single slot of the FROM clause of the outer 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** query. If the subquery has more than one element in its FROM clause, 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then expand the outer query to make space for it to hold all elements 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of the subquery. 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Example: 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT * FROM tabA, (SELECT * FROM sub1, sub2), tabB; 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The outer query has 3 slots in its FROM clause. One slot of the 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** outer query (the middle slot) is used by the subquery. The next 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** block of code will expand the out query to 4 slots. The middle 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** slot is expanded to two slots in order to make space for the 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** two elements in the FROM clause of the subquery. 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( nSubSrc>1 ){ 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Transfer the FROM clause terms from the subquery into the 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** outer query. 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<nSubSrc; i++){ 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3IdListDelete(db, pSrc->a[i+iFrom].pUsing); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc->a[i+iFrom] = pSubSrc->a[i]; 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSrc->a[iFrom].jointype = jointype; 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Now begin substituting subquery result set expressions for 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** references to the iParent in the outer query. 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Example: 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b; 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** \ \_____________ subquery __________/ / 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** \_____________________ outer query ______________________________/ 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** We look at every expression in the outer query and every place we see 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pList = pParent->pEList; 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pList->nExpr; i++){ 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList->a[i].zName==0 ){ 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *zSpan = pList->a[i].zSpan; 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(zSpan) ){ 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pList->a[i].zName = sqlite3DbStrDup(db, zSpan); 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substExprList(db, pParent->pEList, iParent, pSub->pEList); 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isAgg ){ 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substExprList(db, pParent->pGroupBy, iParent, pSub->pEList); 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList); 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pOrderBy ){ 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParent->pOrderBy==0 ); 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pOrderBy = pSub->pOrderBy; 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSub->pOrderBy = 0; 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pParent->pOrderBy ){ 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) substExprList(db, pParent->pOrderBy, iParent, pSub->pEList); 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pWhere ){ 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWhere = 0; 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( subqueryIsAgg ){ 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParent->pHaving==0 ); 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pHaving = pParent->pWhere; 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pWhere = pWhere; 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList); 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pHaving = sqlite3ExprAnd(db, pParent->pHaving, 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprDup(db, pSub->pHaving, 0)); 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pParent->pGroupBy==0 ); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy, 0); 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pWhere = substExpr(db, pParent->pWhere, iParent, pSub->pEList); 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pWhere = sqlite3ExprAnd(db, pParent->pWhere, pWhere); 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The flattened query is distinct if either the inner or the 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** outer query is distinct. 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->selFlags |= pSub->selFlags & SF_Distinct; 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT ... FROM (SELECT ... LIMIT a OFFSET b) LIMIT x OFFSET y; 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** One is tempted to try to add a and b to combine the limits. But this 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** does not work if either limit is negative. 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub->pLimit ){ 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParent->pLimit = pSub->pLimit; 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pSub->pLimit = 0; 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Finially, delete what is left of the subquery and return 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** success. 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDelete(db, pSub1); 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Analyze the SELECT statement passed as an argument to see if it 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a min() or max() query. Return WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX if 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is, or 0 otherwise. At present, a query is considered to be 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a min()/max() query if: 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 1. There is a single object in the FROM clause. 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2. There is a single expression in the result set, and it is 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** either min(x) or max(x), where x is a column reference. 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static u8 minMaxQuery(Select *p){ 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr; 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList = p->pEList; 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->nExpr!=1 ) return WHERE_ORDERBY_NORMAL; 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr = pEList->a[0].pExpr; 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->op!=TK_AGG_FUNCTION ) return 0; 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(ExprHasProperty(pExpr, EP_xIsSelect)) ) return 0; 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = pExpr->x.pList; 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList==0 || pEList->nExpr!=1 ) return 0; 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pEList->a[0].pExpr->op!=TK_AGG_COLUMN ) return WHERE_ORDERBY_NORMAL; 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pExpr, EP_IntValue) ); 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3StrICmp(pExpr->u.zToken,"min")==0 ){ 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WHERE_ORDERBY_MIN; 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( sqlite3StrICmp(pExpr->u.zToken,"max")==0 ){ 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WHERE_ORDERBY_MAX; 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WHERE_ORDERBY_NORMAL; 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The select statement passed as the first argument is an aggregate query. 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The second argment is the associated aggregate-info object. This 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function tests if the SELECT is of the form: 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT count(*) FROM <tbl> 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where table is a database table, not a sub-select or view. If the query 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** does match this pattern, then a pointer to the Table object representing 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** <tbl> is returned. Otherwise, 0 is returned. 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr; 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !p->pGroupBy ); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pWhere || p->pEList->nExpr!=1 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab = p->pSrc->a[0].pTab; 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr = p->pEList->a[0].pExpr; 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pTab && !pTab->pSelect && pExpr ); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsVirtual(pTab) ) return 0; 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->op!=TK_AGG_FUNCTION ) return 0; 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pAggInfo->aFunc[0].pFunc->flags&SQLITE_FUNC_COUNT)==0 ) return 0; 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pExpr->flags&EP_Distinct ) return 0; 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return pTab; 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the source-list item passed as an argument was augmented with an 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** INDEXED BY clause, then try to locate the specified index. If there 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** was such a clause and the named index cannot be found, return 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_ERROR and leave an error in pParse. Otherwise, populate 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pFrom->pIndex and return SQLITE_OK. 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){ 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pFrom->pTab && pFrom->zIndex ){ 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = pFrom->pTab; 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zIndex = pFrom->zIndex; 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pIdx=pTab->pIndex; 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx && sqlite3StrICmp(pIdx->zName, zIndex); 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx=pIdx->pNext 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pIdx ){ 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "no such index: %s", zIndex, 0); 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->checkSchema = 1; 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_ERROR; 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFrom->pIndex = pIdx; 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SQLITE_OK; 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine is a Walker callback for "expanding" a SELECT statement. 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "Expanding" means to do the following: 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (1) Make sure VDBE cursor numbers have been assigned to every 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** element of the FROM clause. 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (2) Fill in the pTabList->a[].pTab fields in the SrcList that 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** defines FROM clause. When views appear in the FROM clause, 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** fill pTabList->a[].pSelect with a copy of the SELECT statement 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that implements the view. A copy is made of the view's SELECT 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement so that we can freely modify or delete that statement 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** without worrying about messing up the presistent representation 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the view. 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (3) Add terms to the WHERE clause to accomodate the NATURAL keyword 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on joins and the ON and USING clause of joins. 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (4) Scan the list of columns in the result set (pEList) looking 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for instances of the "*" operator or the TABLE.* operator. 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If found, expand each "*" to be every column in every table 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and TABLE.* to be every column in TABLE. 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int selectExpander(Walker *pWalker, Select *p){ 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse = pWalker->pParse; 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j, k; 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pTabList; 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pFrom; 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db = pParse->db; 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ){ 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(p->pSrc==0) || (p->selFlags & SF_Expanded)!=0 ){ 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->selFlags |= SF_Expanded; 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabList = p->pSrc; 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = p->pEList; 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Make sure cursor numbers have been assigned to all entries in 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the FROM clause of the SELECT statement. 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SrcListAssignCursors(pParse, pTabList); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Look up every table named in the FROM clause of the select. If 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** an entry of the FROM clause is a subquery instead of a table or view, 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then create a transient table structure to describe the subquery. 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){ 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pFrom->pTab!=0 ){ 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This statement has already been prepared. There is no need 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to go further. */ 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( i==0 ); 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Prune; 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pFrom->zName==0 ){ 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSel = pFrom->pSelect; 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A sub-query in the FROM clause of a SELECT */ 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSel!=0 ); 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pFrom->pTab==0 ); 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkSelect(pWalker, pSel); 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab==0 ) return WRC_Abort; 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->nRef = 1; 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->zName = sqlite3MPrintf(db, "sqlite_subquery_%p_", (void*)pTab); 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pSel->pPrior ){ pSel = pSel->pPrior; } 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectColumnsFromExprList(pParse, pSel->pEList, &pTab->nCol, &pTab->aCol); 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->iPKey = -1; 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->nRowEst = 1000000; 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->tabFlags |= TF_Ephemeral; 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* An ordinary table or view name in the FROM clause */ 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pFrom->pTab==0 ); 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFrom->pTab = pTab = 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3LocateTable(pParse,0,pFrom->zName,pFrom->zDatabase); 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab==0 ) return WRC_Abort; 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->nRef++; 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pTab->pSelect || IsVirtual(pTab) ){ 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We reach here if the named table is a really a view */ 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pFrom->pSelect==0 ); 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkSelect(pWalker, pFrom->pSelect); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Locate the index named by the INDEXED BY clause, if any. */ 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3IndexedByLookup(pParse, pFrom) ){ 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Process NATURAL keywords, and ON and USING clauses of joins. 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed || sqliteProcessJoin(pParse, p) ){ 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Abort; 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* For every "*" that occurs in the column list, insert the names of 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** all columns in all tables. And for every TABLE.* insert the names 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of all columns in TABLE. The parser inserted a special expression 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** with the TK_ALL operator for each "*" that it found in the column list. 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The following code just has to locate the TK_ALL expressions and expand 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** each one to the list of all columns in all tables. 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** The first loop just checks to see if there are any "*" operators 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that need expanding. 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(k=0; k<pEList->nExpr; k++){ 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE = pEList->a[k].pExpr; 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE->op==TK_ALL ) break; 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pE->op!=TK_DOT || pE->pRight!=0 ); 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) ); 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE->op==TK_DOT && pE->pRight->op==TK_ALL ) break; 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( k<pEList->nExpr ){ 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If we get here it means the result set contains one or more "*" 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** operators that need to be expanded. Loop through each expression 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in the result set and expand them one by one. 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *a = pEList->a; 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pNew = 0; 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags = pParse->db->flags; 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int longNames = (flags & SQLITE_FullColNames)!=0 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (flags & SQLITE_ShortColNames)==0; 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(k=0; k<pEList->nExpr; k++){ 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE = a[k].pExpr; 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pE->op!=TK_DOT || pE->pRight!=0 ); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE->op!=TK_ALL && (pE->op!=TK_DOT || pE->pRight->op!=TK_ALL) ){ 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This particular expression does not need to be expanded. 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pNew ){ 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->a[pNew->nExpr-1].zName = a[k].zName; 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan; 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a[k].zName = 0; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a[k].zSpan = 0; 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a[k].pExpr = 0; 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This expression is a "*" or a "TABLE.*" and needs to be 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** expanded. */ 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int tableSeen = 0; /* Set to 1 when TABLE matches */ 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zTName; /* text of name of TABLE */ 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE->op==TK_DOT ){ 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pE->pLeft!=0 ); 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pE->pLeft, EP_IntValue) ); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zTName = pE->pLeft->u.zToken; 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zTName = 0; 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){ 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = pFrom->pTab; 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zTabName = pFrom->zAlias; 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTabName==0 ){ 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zTabName = pTab->zName; 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ) break; 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tableSeen = 1; 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pTab->nCol; j++){ 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pExpr, *pRight; 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zName = pTab->aCol[j].zName; 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zColname; /* The computed column name */ 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zToFree; /* Malloced string that needs to be freed */ 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Token sColname; /* Computed column name as a token */ 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If a column is marked as 'hidden' (currently only possible 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for virtual tables), do not include it in the expanded 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** result-set list. 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IsHiddenColumn(&pTab->aCol[j]) ){ 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(IsVirtual(pTab)); 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i>0 && zTName==0 ){ 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pFrom->jointype & JT_NATURAL)!=0 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && tableAndColumnIndex(pTabList, i, zName, 0, 0) 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ){ 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In a NATURAL join, omit the join columns from the 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** table to the right of the join */ 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){ 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* In a join with a USING clause, omit columns in the 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** using clause from the table on the right. */ 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRight = sqlite3Expr(db, TK_ID, zName); 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColname = zName; 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zToFree = 0; 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( longNames || pTabList->nSrc>1 ){ 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pLeft; 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLeft = sqlite3Expr(db, TK_ID, zTabName); 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( longNames ){ 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName); 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zToFree = zColname; 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pExpr = pRight; 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sColname.z = zColname; 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sColname.n = sqlite3Strlen30(zColname); 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListSetName(pParse, pNew, &sColname, 0); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, zToFree); 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !tableSeen ){ 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( zTName ){ 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "no such table: %s", zTName); 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "no tables specified"); 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, pEList); 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pEList = pNew; 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_MAX_COLUMN 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "too many columns in result set"); 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Continue; 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** No-op routine for the parse-tree walker. 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When this routine is the Walker.xExprCallback then expression trees 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are walked without any actions being taken at each node. Presumably, 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** when this routine is used for Walker.xExprCallback then 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Walker.xSelectCallback is set to do something useful for every 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** subquery in the parser tree. 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int exprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNUSED_PARAMETER2(NotUsed, NotUsed2); 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Continue; 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine "expands" a SELECT statement and all of its subqueries. 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For additional information on what it means to "expand" a SELECT 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement, see the comment on the selectExpand worker callback above. 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Expanding a SELECT statement is the first step in processing a 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT statement. The SELECT statement must be expanded before 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** name resolution is performed. 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If anything goes wrong, an error message is written into pParse. 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The calling function can detect the problem by looking at pParse->nErr 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and/or pParse->db->mallocFailed. 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Walker w; 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xSelectCallback = selectExpander; 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xExprCallback = exprWalkNoop; 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.pParse = pParse; 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkSelect(&w, pSelect); 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is a Walker.xSelectCallback callback for the sqlite3SelectTypeInfo() 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** interface. 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For each FROM-clause subquery, add Column.zType and Column.zColl 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** information to the Table structure that represents the result set 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of that subquery. 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The Table structure that represents the result set was constructed 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by selectExpander() but the type and collation information was omitted 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** at that point because identifiers had not yet been resolved. This 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine is called after identifier resolution. 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse; 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pTabList; 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pFrom; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->selFlags & SF_Resolved ); 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (p->selFlags & SF_HasTypeInfo)==0 ){ 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->selFlags |= SF_HasTypeInfo; 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse = pWalker->pParse; 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabList = p->pSrc; 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){ 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab = pFrom->pTab; 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){ 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A sub-query in the FROM clause of a SELECT */ 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSel = pFrom->pSelect; 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pSel ); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while( pSel->pPrior ) pSel = pSel->pPrior; 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectAddColumnTypeAndCollation(pParse, pTab->nCol, pTab->aCol, pSel); 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WRC_Continue; 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine adds datatype and collating sequence information to 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the Table structures of all FROM-clause subqueries in a 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SELECT statement. 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Use this routine after name resolution. 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Walker w; 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xSelectCallback = selectAddSubqueryTypeInfo; 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.xExprCallback = exprWalkNoop; 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) w.pParse = pParse; 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WalkSelect(&w, pSelect); 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine sets of a SELECT statement for processing. The 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** following is accomplished: 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * VDBE Cursor numbers are assigned to all FROM-clause terms. 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * Ephemeral Table objects are created for all FROM-clause subqueries. 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * ON and USING clauses are shifted into WHERE statements 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * Wildcards "*" and "TABLE.*" in result sets are expanded. 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** * Identifiers in expression are matched to tables. 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine acts recursively on all subqueries within the SELECT. 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3SelectPrep( 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parser context */ 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The SELECT statement being coded. */ 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext *pOuterNC /* Name context for container */ 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( NEVER(p==0) ) return; 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->selFlags & SF_HasTypeInfo ) return; 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectExpand(pParse, p); 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nErr || db->mallocFailed ) return; 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ResolveSelectNames(pParse, p, pOuterNC); 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nErr || db->mallocFailed ) return; 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectAddTypeInfo(pParse, p); 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reset the aggregate accumulator. 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The aggregate accumulator is a set of memory cells that hold 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** intermediate results while calculating an aggregate. This 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine simply stores NULLs in all of those memory cells. 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_func *pFunc; 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){ 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pAggInfo->nColumn; i++){ 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, pAggInfo->aCol[i].iMem); 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pFunc=pAggInfo->aFunc, i=0; i<pAggInfo->nFunc; i++, pFunc++){ 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Null, 0, pFunc->iMem); 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pFunc->iDistinct>=0 ){ 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pE = pFunc->pExpr; 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pE, EP_xIsSelect) ); 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one " 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "argument"); 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pFunc->iDistinct = -1; 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyInfo = keyInfoFromExprList(pParse, pE->x.pList); 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_OpenEphemeral, pFunc->iDistinct, 0, 0, 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKeyInfo, P4_KEYINFO_HANDOFF); 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke the OP_AggFinalize opcode for every aggregate function 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the AggInfo structure. 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_func *pF; 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){ 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList = pF->pExpr->x.pList; 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, 0, 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void*)pF->pFunc, P4_FUNCDEF); 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Update the accumulator memory cells for an aggregate based on 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the current cursor position. 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v = pParse->pVdbe; 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_func *pF; 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_col *pC; 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pAggInfo->directMode = 1; 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){ 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nArg; 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrNext = 0; 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regAgg; 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pList = pF->pExpr->x.pList; 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pList ){ 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nArg = pList->nExpr; 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regAgg = sqlite3GetTempRange(pParse, nArg); 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeExprList(pParse, pList, regAgg, 1); 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nArg = 0; 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regAgg = 0; 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pF->iDistinct>=0 ){ 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrNext = sqlite3VdbeMakeLabel(v); 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( nArg==1 ); 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pF->pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollSeq *pColl = 0; 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j; 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */ 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0, pItem=pList->a; !pColl && j<nArg; j++, pItem++){ 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr); 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pColl ){ 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pColl = pParse->db->pDfltColl; 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_AggStep, 0, regAgg, pF->iMem, 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void*)pF->pFunc, P4_FUNCDEF); 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, (u8)nArg); 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg); 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, regAgg, nArg); 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( addrNext ){ 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, addrNext); 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Before populating the accumulator registers, clear the column cache. 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Otherwise, if any of the required column values are already present 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in registers, sqlite3ExprCode() may use OP_SCopy to copy the value 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to pC->iMem. But by the time the value is used, the original register 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** may have been used, invalidating the underlying buffer holding the 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** text or blob value. See ticket [883034dcb5]. 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Another solution would be to change the OP_SCopy used to copy cached 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** values to an OP_Copy. 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0, pC=pAggInfo->aCol; i<pAggInfo->nAccumulator; i++, pC++){ 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pAggInfo->directMode = 0; 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add a single OP_Explain instruction to the VDBE to explain a simple 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** count(*) query ("SELECT count(*) FROM pTab"). 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void explainSimpleCount( 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* Parse context */ 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab, /* Table being queried */ 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx /* Index used to optimize scan, or NULL */ 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->explain==2 ){ 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s %s%s(~%d rows)", 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->zName, 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx ? "USING COVERING INDEX " : "", 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pIdx ? pIdx->zName : "", 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTab->nRowEst 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4( 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define explainSimpleCount(a,b,c) 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Generate code for the SELECT statement given in the p argument. 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The results are distributed in various ways depending on the 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contents of the SelectDest structure pointed to by argument pDest 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** as follows: 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pDest->eDest Result 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ------------ ------------------------------------------- 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Output Generate a row of output (using the OP_ResultRow 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** opcode) for each row in the result set. 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Mem Only valid if the result is a single column. 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Store the first column of the first result row 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in register pDest->iParm then abandon the rest 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the query. This destination implies "LIMIT 1". 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Set The result must be a single column. Store each 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** row of result as the key in table pDest->iParm. 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Apply the affinity pDest->affinity before storing 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** results. Used to implement "IN (SELECT ...)". 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Union Store results as a key in a temporary table pDest->iParm. 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Except Remove results from the temporary table pDest->iParm. 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Table Store results in temporary table pDest->iParm. 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is like SRT_EphemTab except that the table 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is assumed to already be open. 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_EphemTab Create an temporary table pDest->iParm and store 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the result there. The cursor is left open after 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** returning. This is like SRT_Table except that 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this destination uses OP_OpenEphemeral to create 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table first. 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Coroutine Generate a co-routine that returns a new row of 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** results each time it is invoked. The entry point 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the co-routine is stored in register pDest->iParm. 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Exists Store a 1 in memory cell pDest->iParm if the result 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set is not empty. 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SRT_Discard Throw the results away. This is used by SELECT 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statements within triggers whose only purpose is 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the side-effects of functions. 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine returns the number of errors. If any errors are 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** encountered, then an appropriate error message is left in 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pParse->zErrMsg. 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine does NOT free the Select structure passed in. The 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** calling function needs to do that. 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3Select( 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Parse *pParse, /* The parser context */ 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *p, /* The SELECT statement being coded. */ 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest *pDest /* What to do with the query results */ 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){ 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, j; /* Loop counters */ 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */ 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Vdbe *v; /* The virtual machine under construction */ 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isAgg; /* True for select lists like "count(*)" */ 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pEList; /* List of columns to extract. */ 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SrcList *pTabList; /* List of tables to select from */ 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pWhere; /* The WHERE clause. May be NULL */ 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pOrderBy; /* The ORDER BY clause. May be NULL */ 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Expr *pHaving; /* The HAVING clause. May be NULL */ 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isDistinct; /* True if the DISTINCT keyword is present */ 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int distinct; /* Table to use for the distinct set */ 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rc = 1; /* Value to return from this function */ 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrSortIndex; /* Address of an OP_OpenEphemeral instruction */ 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AggInfo sAggInfo; /* Information used by aggregate queries */ 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iEnd; /* Address of the end of the query */ 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3 *db; /* The database connection */ 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_EXPLAIN 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRestoreSelectId = pParse->iSelectId; 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->iSelectId = pParse->iNextSelectId++; 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db = pParse->db; 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p==0 || db->mallocFailed || pParse->nErr ){ 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&sAggInfo, 0, sizeof(sAggInfo)); 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( IgnorableOrderby(pDest) ){ 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(pDest->eDest==SRT_Exists || pDest->eDest==SRT_Union || 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest->eDest==SRT_Except || pDest->eDest==SRT_Discard); 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If ORDER BY makes no difference in the output then neither does 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** DISTINCT so it can be removed too. */ 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, p->pOrderBy); 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pOrderBy = 0; 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->selFlags &= ~SF_Distinct; 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectPrep(pParse, p, 0); 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy = p->pOrderBy; 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabList = p->pSrc; 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = p->pEList; 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pParse->nErr || db->mallocFailed ){ 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto select_end; 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isAgg = (p->selFlags & SF_Aggregate)!=0; 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pEList!=0 ); 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Begin generating code. 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = sqlite3GetVdbe(pParse); 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( v==0 ) goto select_end; 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If writing to memory or generating a set 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** only a single column may be output. 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SUBQUERY 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( checkForMultiColumnSelectError(pParse, pDest, pEList->nExpr) ){ 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto select_end; 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code for all sub-queries in the FROM clause 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; !p->pPrior && i<pTabList->nSrc; i++){ 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem = &pTabList->a[i]; 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectDest dest; 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pSub = pItem->pSelect; 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int isAggSub; 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pSub==0 || pItem->isPopulated ) continue; 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Increment Parse.nHeight by the height of the largest expression 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** tree refered to by this, the parent select. The child select 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** may contain expression trees of at most 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (SQLITE_MAX_EXPR_DEPTH-Parse.nHeight) height. This is a bit 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** more conservative than necessary, but much easier than enforcing 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** an exact limit. 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nHeight += sqlite3SelectExprHeight(p); 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check to see if the subquery can be absorbed into the parent. */ 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isAggSub = (pSub->selFlags & SF_Aggregate)!=0; 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){ 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( isAggSub ){ 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isAgg = 1; 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->selFlags |= SF_Aggregate; 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = -1; 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( pItem->isPopulated==0 ); 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3Select(pParse, pSub, &dest); 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->isPopulated = 1; 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->pTab->nRowEst = (unsigned)pSub->nSelectRow; 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( /*pParse->nErr ||*/ db->mallocFailed ){ 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto select_end; 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nHeight -= sqlite3SelectExprHeight(p); 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pTabList = p->pSrc; 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !IgnorableOrderby(pDest) ){ 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy = p->pOrderBy; 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pEList = p->pEList; 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWhere = p->pWhere; 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pGroupBy = p->pGroupBy; 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pHaving = p->pHaving; 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isDistinct = (p->selFlags & SF_Distinct)!=0; 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_COMPOUND_SELECT 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there is are a sequence of queries, do the earlier ones first. 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pPrior ){ 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pRightmost==0 ){ 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Select *pLoop, *pRight = 0; 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cnt = 0; 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mxSelect; 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pLoop=p; pLoop; pLoop=pLoop->pPrior, cnt++){ 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLoop->pRightmost = p; 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLoop->pNext = pRight; 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pRight = pLoop; 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mxSelect = db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT]; 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( mxSelect && cnt>mxSelect ){ 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto select_end; 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = multiSelect(pParse, p, pDest); 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(pParse->iSelectId, iRestoreSelectId); 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If possible, rewrite the query to use GROUP BY instead of DISTINCT. 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** GROUP BY might use an index, DISTINCT never does. 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( p->pGroupBy==0 || (p->selFlags & SF_Aggregate)!=0 ); 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ){ 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0); 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pGroupBy = p->pGroupBy; 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->selFlags &= ~SF_Distinct; 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there is both a GROUP BY and an ORDER BY clause and they are 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** identical, then disable the ORDER BY clause since the GROUP BY 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** will cause elements to come out in the correct order. This is 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** an optimization - the correct answer should result regardless. 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to disable this optimization for testing purposes. 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sqlite3ExprListCompare(p->pGroupBy, pOrderBy)==0 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && (db->flags & SQLITE_GroupByOrder)==0 ){ 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy = 0; 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there is an ORDER BY clause, then this sorting 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** index might end up being unused if the data can be 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** extracted in pre-sorted order. If that is the case, then the 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** OP_OpenEphemeral instruction will be changed to an OP_Noop once 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we figure out that the sorting index is not needed. The addrSortIndex 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** variable is used to facilitate that change. 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy ){ 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyInfo; 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyInfo = keyInfoFromExprList(pParse, pOrderBy); 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy->iECursor = pParse->nTab++; 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->addrOpenEphm[2] = addrSortIndex = 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_OpenEphemeral, 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy->iECursor, pOrderBy->nExpr+2, 0, 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKeyInfo, P4_KEYINFO_HANDOFF); 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrSortIndex = -1; 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If the output is destined for a temporary table, open that table. 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pDest->eDest==SRT_EphemTab ){ 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iParm, pEList->nExpr); 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Set the limiter. 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iEnd = sqlite3VdbeMakeLabel(v); 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nSelectRow = (double)LARGEST_INT64; 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) computeLimitRegisters(pParse, p, iEnd); 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Open a virtual index to use for the distinct set. 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->selFlags & SF_Distinct ){ 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyInfo; 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( isAgg || pGroupBy ); 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distinct = pParse->nTab++; 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyInfo = keyInfoFromExprList(pParse, p->pEList); 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_OpenEphemeral, distinct, 0, 0, 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKeyInfo, P4_KEYINFO_HANDOFF); 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP5(v, BTREE_UNORDERED); 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distinct = -1; 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Aggregate and non-aggregate queries are handled differently */ 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !isAgg && pGroupBy==0 ){ 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This case is for non-aggregate queries 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Begin the database scan 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pOrderBy, 0); 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pWInfo==0 ) goto select_end; 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pWInfo->nRowOut < p->nSelectRow ) p->nSelectRow = pWInfo->nRowOut; 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If sorting index that was created by a prior OP_OpenEphemeral 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** instruction ended up not being needed, then change the OP_OpenEphemeral 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** into an OP_Noop. 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( addrSortIndex>=0 && pOrderBy==0 ){ 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeToNoop(v, addrSortIndex, 1); 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->addrOpenEphm[2] = -1; 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Use the standard inner loop 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(!isDistinct); 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, -1, pDest, 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWInfo->iContinue, pWInfo->iBreak); 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* End the database scan loop. 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WhereEnd(pWInfo); 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This is the processing for aggregate queries */ 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NameContext sNC; /* Name context for processing aggregate information */ 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iAMem; /* First Mem address for storing current GROUP BY */ 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iBMem; /* First Mem address for previous GROUP BY */ 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iUseFlag; /* Mem address holding flag indicating that at least 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** one row of the input to the aggregator has been 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** processed */ 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iAbortFlag; /* Mem address which causes query abort if positive */ 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int groupBySort; /* Rows come from source in GROUP BY order */ 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrEnd; /* End of processing for this SELECT */ 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Remove any and all aliases between the result set and the 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** GROUP BY clause. 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pGroupBy ){ 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int k; /* Loop counter */ 39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct ExprList_item *pItem; /* For looping over expression in a list */ 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(k=p->pEList->nExpr, pItem=p->pEList->a; k>0; k--, pItem++){ 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iAlias = 0; 39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){ 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pItem->iAlias = 0; 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->nSelectRow>(double)100 ) p->nSelectRow = (double)100; 39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->nSelectRow = (double)1; 39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Create a label to jump to when we want to abort the query */ 39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrEnd = sqlite3VdbeMakeLabel(v); 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT statement. 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&sNC, 0, sizeof(sNC)); 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pParse = pParse; 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pSrcList = pTabList; 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sNC.pAggInfo = &sAggInfo; 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0; 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sAggInfo.pGroupBy = pGroupBy; 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprAnalyzeAggList(&sNC, pEList); 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprAnalyzeAggList(&sNC, pOrderBy); 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pHaving ){ 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprAnalyzeAggregates(&sNC, pHaving); 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sAggInfo.nAccumulator = sAggInfo.nColumn; 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sAggInfo.nFunc; i++){ 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) ); 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList); 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( db->mallocFailed ) goto select_end; 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Processing for aggregates with GROUP BY is very different and 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** much more complex than aggregates without a GROUP BY. 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pGroupBy ){ 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyInfo; /* Keying information for the group by clause */ 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int j1; /* A-vs-B comparision jump */ 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrOutputRow; /* Start of subroutine that outputs a result row */ 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regOutputRow; /* Return address register for output subroutine */ 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrSetAbort; /* Set the abort flag and return */ 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrTopOfLoop; /* Top of the input loop */ 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrSortingIdx; /* The OP_OpenEphemeral for the sorting index */ 40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addrReset; /* Subroutine for resetting the accumulator */ 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regReset; /* Return address register for reset subroutine */ 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there is a GROUP BY clause we might need a sorting index to 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** implement it. Allocate that sorting index now. If it turns out 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** that we do not need it after all, the OpenEphemeral instruction 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** will be converted into a Noop. 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sAggInfo.sortingIdx = pParse->nTab++; 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyInfo = keyInfoFromExprList(pParse, pGroupBy); 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrSortingIdx = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sAggInfo.sortingIdx, sAggInfo.nSortingColumn, 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, (char*)pKeyInfo, P4_KEYINFO_HANDOFF); 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Initialize memory locations used by GROUP BY aggregate processing 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iUseFlag = ++pParse->nMem; 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iAbortFlag = ++pParse->nMem; 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regOutputRow = ++pParse->nMem; 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrOutputRow = sqlite3VdbeMakeLabel(v); 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regReset = ++pParse->nMem; 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrReset = sqlite3VdbeMakeLabel(v); 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iAMem = pParse->nMem + 1; 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem += pGroupBy->nExpr; 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iBMem = pParse->nMem + 1; 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pParse->nMem += pGroupBy->nExpr; 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, iAbortFlag); 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "clear abort flag")); 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "indicate accumulator empty")); 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Begin a loop that will extract all source rows in GROUP BY order. 40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This might involve two separate loops with an OP_Sort in between, or 40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** it might be a single loop that uses an index to extract information 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in the right order to begin with. 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pGroupBy, 0); 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pWInfo==0 ) goto select_end; 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pGroupBy==0 ){ 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The optimizer is able to deliver rows in group by order so 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** we do not have to sort. The OP_OpenEphemeral table will be 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** cancelled later because we still need to use the pKeyInfo 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pGroupBy = p->pGroupBy; 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groupBySort = 0; 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Rows are coming out in undetermined order. We have to push 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** each row into a sorting index, terminate the first loop, 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** then loop over the sorting index in order to get the output 40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** in sorted order 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regBase; 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int regRecord; 40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nCol; 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nGroupBy; 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainTempTable(pParse, 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isDistinct && !(p->selFlags&SF_Distinct)?"DISTINCT":"GROUP BY"); 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) groupBySort = 1; 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nGroupBy = pGroupBy->nExpr; 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nCol = nGroupBy + 1; 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j = nGroupBy+1; 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sAggInfo.nColumn; i++){ 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( sAggInfo.aCol[i].iSorterColumn>=j ){ 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nCol++; 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j++; 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regBase = sqlite3GetTempRange(pParse, nCol); 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0); 40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Sequence, sAggInfo.sortingIdx,regBase+nGroupBy); 40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j = nGroupBy+1; 40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<sAggInfo.nColumn; i++){ 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct AggInfo_col *pCol = &sAggInfo.aCol[i]; 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pCol->iSorterColumn>=j ){ 40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r1 = j + regBase; 40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r2; 40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) r2 = sqlite3ExprCodeGetColumn(pParse, 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pCol->pTab, pCol->iColumn, pCol->iTable, r1); 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( r1!=r2 ){ 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_SCopy, r2, r1); 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j++; 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) regRecord = sqlite3GetTempReg(pParse); 41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IdxInsert, sAggInfo.sortingIdx, regRecord); 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempReg(pParse, regRecord); 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ReleaseTempRange(pParse, regBase, nCol); 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WhereEnd(pWInfo); 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Sort, sAggInfo.sortingIdx, addrEnd); 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "GROUP BY sort")); 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sAggInfo.useSortingIdx = 1; 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Evaluate the current GROUP BY terms and store in b0, b1, b2... 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** (b0 is memory location iBMem+0, b1 is iBMem+1, and so forth) 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Then compare the current GROUP BY terms against the GROUP BY terms 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** from the previous row currently stored in a0, a1, a2... 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrTopOfLoop = sqlite3VdbeCurrentAddr(v); 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCacheClear(pParse); 41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(j=0; j<pGroupBy->nExpr; j++){ 41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( groupBySort ){ 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Column, sAggInfo.sortingIdx, j, iBMem+j); 41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sAggInfo.directMode = 1; 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*)pKeyInfo, P4_KEYINFO); 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j1 = sqlite3VdbeCurrentAddr(v); 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_Jump, j1+1, 0, j1+1); 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate code that runs whenever the GROUP BY changes. 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Changes in the GROUP BY are detected by the previous code 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** block. If there were no changes, this block is skipped. 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This code copies current group by terms in b0,b1,b2,... 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** over to a0,a1,a2. It then calls the output subroutine 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and resets the aggregate accumulator registers in preparation 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for the next GROUP BY batch. 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprCodeMove(pParse, iBMem, iAMem, pGroupBy->nExpr); 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "output one row")); 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IfPos, iAbortFlag, addrEnd); 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "check abort flag")); 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "reset accumulator")); 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Update the aggregate accumulators based on the content of 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the current row 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeJumpHere(v, j1); 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updateAccumulator(pParse, &sAggInfo); 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "indicate data in accumulator")); 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* End of the loop 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( groupBySort ){ 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Next, sAggInfo.sortingIdx, addrTopOfLoop); 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WhereEnd(pWInfo); 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeToNoop(v, addrSortingIdx, 1); 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Output the final row of result 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Gosub, regOutputRow, addrOutputRow); 41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "output final row")); 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Jump over the subroutines 41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEnd); 41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a subroutine that outputs a single row of the result 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** set. This subroutine first looks at the iUseFlag. If iUseFlag 41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is less than or equal to zero, the subroutine is a no-op. If 41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the processing calls for the query to abort, this subroutine 41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** increments the iAbortFlag memory location before returning in 41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** order to signal the caller to abort. 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrSetAbort = sqlite3VdbeCurrentAddr(v); 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Integer, 1, iAbortFlag); 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "set abort flag")); 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, addrOutputRow); 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrOutputRow = sqlite3VdbeCurrentAddr(v); 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); 41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "Groupby result generator entry point")); 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) finalizeAggFunctions(pParse, &sAggInfo); 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectInnerLoop(pParse, p, p->pEList, 0, 0, pOrderBy, 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) distinct, pDest, 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addrOutputRow+1, addrSetAbort); 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "end groupby result generator")); 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generate a subroutine that will reset the group-by accumulator 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, addrReset); 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resetAccumulator(pParse, &sAggInfo); 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Return, regReset); 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pDel = 0; 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_BTREECOUNT 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Table *pTab; 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){ 42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If isSimpleCount() returns a pointer to a Table structure, then 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** the SQL statement is of the form: 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT count(*) FROM <tbl> 42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** where the Table structure returned represents table <tbl>. 42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** This statement is so common that it is optimized specially. The 42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** OP_Count instruction is executed either on the intkey table that 42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** contains the data for table <tbl> or on one of its indexes. It 42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** is better to execute the op on an index, as indexes are almost 42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** always spread across less pages than their corresponding tables. 42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int iCsr = pParse->nTab++; /* Cursor to scan b-tree */ 42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pIdx; /* Iterator variable */ 42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyInfo *pKeyInfo = 0; /* Keyinfo for scanned index */ 42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Index *pBest = 0; /* Best index found so far */ 42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int iRoot = pTab->tnum; /* Root page of scanned b-tree */ 42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3CodeVerifySchema(pParse, iDb); 42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); 42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Search for the index that has the least amount of columns. If 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** there is such an index, and it has less columns than the table 42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** does, then we can assume that it consumes less space on disk and 42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** will therefore be cheaper to scan to determine the query result. 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** In this case set iRoot to the root page number of the index b-tree 42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and pKeyInfo to the KeyInfo structure required to navigate the 42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** index. 42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** In practice the KeyInfo structure will not be used. It is only 42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** passed to keep OP_OpenRead happy. 42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ 42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pBest || pIdx->nColumn<pBest->nColumn ){ 42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pBest = pIdx; 42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pBest && pBest->nColumn<pTab->nCol ){ 42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iRoot = pBest->tnum; 42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pKeyInfo = sqlite3IndexKeyinfo(pParse, pBest); 42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Open a read-only cursor, execute the OP_Count, close the cursor. */ 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp3(v, OP_OpenRead, iCsr, iRoot, iDb); 42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pKeyInfo ){ 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO_HANDOFF); 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem); 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp1(v, OP_Close, iCsr); 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSimpleCount(pParse, pTab, pBest); 42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_BTREECOUNT */ 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check if the query is of one of the following forms: 42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT min(x) FROM ... 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** SELECT max(x) FROM ... 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If it is, then ask the code in where.c to attempt to sort results 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause. 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** If where.c is able to produce results sorted in this order, then 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** add vdbe code to break out of the processing loop after the 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** first iteration (since the first iteration of the loop is 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** guaranteed to operate on the row with the minimum or maximum 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** value of x, the only row required). 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** A special flag must be passed to sqlite3WhereBegin() to slightly 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** modify behaviour as follows: 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** + If the query is a "SELECT min(x)", then the loop coded by 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** where.c should not iterate over any values with a NULL value 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** for x. 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** + The optimizer code in where.c (the thing that decides which 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** index or indices to use) should place a different priority on 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** satisfying the 'ORDER BY' clause than it does in other cases. 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** Refer to code and comments in where.c for details. 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExprList *pMinMax = 0; 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) u8 flag = minMaxQuery(p); 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( flag ){ 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( !ExprHasProperty(p->pEList->a[0].pExpr, EP_xIsSelect) ); 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMinMax = sqlite3ExprListDup(db, p->pEList->a[0].pExpr->x.pList,0); 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDel = pMinMax; 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pMinMax && !db->mallocFailed ){ 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMinMax->a[0].sortOrder = flag!=WHERE_ORDERBY_MIN ?1:0; 42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pMinMax->a[0].pExpr->op = TK_COLUMN; 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* This case runs if the aggregate has no GROUP BY clause. The 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** processing is much simpler since there is only a single row 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** of output. 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resetAccumulator(pParse, &sAggInfo); 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pMinMax, flag); 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pWInfo==0 ){ 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, pDel); 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto select_end; 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updateAccumulator(pParse, &sAggInfo); 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !pMinMax && flag ){ 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeAddOp2(v, OP_Goto, 0, pWInfo->iBreak); 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VdbeComment((v, "%s() by index", 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (flag==WHERE_ORDERBY_MIN?"min":"max"))); 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3WhereEnd(pWInfo); 43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) finalizeAggFunctions(pParse, &sAggInfo); 43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pOrderBy = 0; 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL); 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selectInnerLoop(pParse, p, p->pEList, 0, 0, 0, -1, 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pDest, addrEnd, addrEnd); 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3ExprListDelete(db, pDel); 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, addrEnd); 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } /* endif aggregate query */ 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( distinct>=0 ){ 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainTempTable(pParse, "DISTINCT"); 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If there is an ORDER BY clause, then we need to sort the results 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** and send them to the callback one by one. 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pOrderBy ){ 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainTempTable(pParse, "ORDER BY"); 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generateSortTail(pParse, p, v, pEList->nExpr, pDest); 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Jump here to skip this query 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3VdbeResolveLabel(v, iEnd); 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* The SELECT was successfully coded. Set the return code to 0 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** to indicate no errors. 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rc = 0; 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Control jumps to here if an error is encountered above, or upon 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ** successful coding of the SELECT. 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)select_end: 43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explainSetInteger(pParse->iSelectId, iRestoreSelectId); 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Identify column names if results of the SELECT are to be output. 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( rc==SQLITE_OK && pDest->eDest==SRT_Output ){ 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generateColumnNames(pParse, pTabList, pEList); 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, sAggInfo.aCol); 43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DbFree(db, sAggInfo.aFunc); 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rc; 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_DEBUG) 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)******************************************************************************* 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following code is used for testing and debugging only. The code 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that follows does not appear in normal builds. 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These routines are used to print out the content of all or part of a 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parse structures such as Select or Expr. Such printouts are useful 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for helping to understand what is happening inside the code generator 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** during the execution of complex SELECT statements. 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** These routine are not called anywhere from within the normal 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code base. Then are intended to be called from within the debugger 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or from temporary "printf" statements inserted for debugging. 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PrintExpr(Expr *p){ 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("(%s", p->u.zToken); 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else{ 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("(%d", p->op); 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pLeft ){ 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf(" "); 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExpr(p->pLeft); 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pRight ){ 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf(" "); 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExpr(p->pRight); 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf(")"); 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PrintExprList(ExprList *pList){ 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<pList->nExpr; i++){ 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExpr(pList->a[i].pExpr); 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i<pList->nExpr-1 ){ 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf(", "); 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3PrintSelect(Select *p, int indent){ 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%*sSELECT(%p) ", indent, "", p); 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExprList(p->pEList); 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("\n"); 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pSrc ){ 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *zPrefix; 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zPrefix = "FROM"; 44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for(i=0; i<p->pSrc->nSrc; i++){ 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SrcList_item *pItem = &p->pSrc->a[i]; 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%*s ", indent+6, zPrefix); 44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zPrefix = ""; 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->pSelect ){ 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("(\n"); 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintSelect(pItem->pSelect, indent+10); 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%*s)", indent+8, ""); 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }else if( pItem->zName ){ 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%s", pItem->zName); 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->pTab ){ 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("(table: %s)", pItem->pTab->zName); 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( pItem->zAlias ){ 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf(" AS %s", pItem->zAlias); 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( i<p->pSrc->nSrc-1 ){ 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf(","); 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("\n"); 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pWhere ){ 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%*s WHERE ", indent, ""); 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExpr(p->pWhere); 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("\n"); 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pGroupBy ){ 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%*s GROUP BY ", indent, ""); 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExprList(p->pGroupBy); 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("\n"); 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pHaving ){ 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%*s HAVING ", indent, ""); 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExpr(p->pHaving); 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("\n"); 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if( p->pOrderBy ){ 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("%*s ORDER BY ", indent, ""); 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3PrintExprList(p->pOrderBy); 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sqlite3DebugPrintf("\n"); 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* End of the structure debug printing code 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*****************************************************************************/ 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ 4466