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