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