xref: /sqlite-3.40.0/src/select.c (revision 9bbca4c1)
1cce7d176Sdrh /*
2b19a2bc6Sdrh ** 2001 September 15
3cce7d176Sdrh **
4b19a2bc6Sdrh ** The author disclaims copyright to this source code.  In place of
5b19a2bc6Sdrh ** a legal notice, here is a blessing:
6cce7d176Sdrh **
7b19a2bc6Sdrh **    May you do good and not evil.
8b19a2bc6Sdrh **    May you find forgiveness for yourself and forgive others.
9b19a2bc6Sdrh **    May you share freely, never taking more than you give.
10cce7d176Sdrh **
11cce7d176Sdrh *************************************************************************
12cce7d176Sdrh ** This file contains C code routines that are called by the parser
13b19a2bc6Sdrh ** to handle SELECT statements in SQLite.
14cce7d176Sdrh **
15*9bbca4c1Sdrh ** $Id: select.c,v 1.46 2001/11/06 04:00:19 drh Exp $
16cce7d176Sdrh */
17cce7d176Sdrh #include "sqliteInt.h"
18cce7d176Sdrh 
19cce7d176Sdrh /*
209bb61fe7Sdrh ** Allocate a new Select structure and return a pointer to that
219bb61fe7Sdrh ** structure.
22cce7d176Sdrh */
239bb61fe7Sdrh Select *sqliteSelectNew(
24daffd0e5Sdrh   ExprList *pEList,     /* which columns to include in the result */
25daffd0e5Sdrh   IdList *pSrc,         /* the FROM clause -- which tables to scan */
26daffd0e5Sdrh   Expr *pWhere,         /* the WHERE clause */
27daffd0e5Sdrh   ExprList *pGroupBy,   /* the GROUP BY clause */
28daffd0e5Sdrh   Expr *pHaving,        /* the HAVING clause */
29daffd0e5Sdrh   ExprList *pOrderBy,   /* the ORDER BY clause */
30*9bbca4c1Sdrh   int isDistinct,       /* true if the DISTINCT keyword is present */
31*9bbca4c1Sdrh   int nLimit,           /* LIMIT value.  -1 means not used */
32*9bbca4c1Sdrh   int nOffset           /* OFFSET value.  -1 means not used */
339bb61fe7Sdrh ){
349bb61fe7Sdrh   Select *pNew;
359bb61fe7Sdrh   pNew = sqliteMalloc( sizeof(*pNew) );
36daffd0e5Sdrh   if( pNew==0 ){
37daffd0e5Sdrh     sqliteExprListDelete(pEList);
38daffd0e5Sdrh     sqliteIdListDelete(pSrc);
39daffd0e5Sdrh     sqliteExprDelete(pWhere);
40daffd0e5Sdrh     sqliteExprListDelete(pGroupBy);
41daffd0e5Sdrh     sqliteExprDelete(pHaving);
42daffd0e5Sdrh     sqliteExprListDelete(pOrderBy);
43daffd0e5Sdrh   }else{
449bb61fe7Sdrh     pNew->pEList = pEList;
459bb61fe7Sdrh     pNew->pSrc = pSrc;
469bb61fe7Sdrh     pNew->pWhere = pWhere;
479bb61fe7Sdrh     pNew->pGroupBy = pGroupBy;
489bb61fe7Sdrh     pNew->pHaving = pHaving;
499bb61fe7Sdrh     pNew->pOrderBy = pOrderBy;
509bb61fe7Sdrh     pNew->isDistinct = isDistinct;
5182c3d636Sdrh     pNew->op = TK_SELECT;
52*9bbca4c1Sdrh     pNew->nLimit = nLimit;
53*9bbca4c1Sdrh     pNew->nOffset = nOffset;
54daffd0e5Sdrh   }
559bb61fe7Sdrh   return pNew;
569bb61fe7Sdrh }
579bb61fe7Sdrh 
589bb61fe7Sdrh /*
599bb61fe7Sdrh ** Delete the given Select structure and all of its substructures.
609bb61fe7Sdrh */
619bb61fe7Sdrh void sqliteSelectDelete(Select *p){
6282c3d636Sdrh   if( p==0 ) return;
639bb61fe7Sdrh   sqliteExprListDelete(p->pEList);
649bb61fe7Sdrh   sqliteIdListDelete(p->pSrc);
659bb61fe7Sdrh   sqliteExprDelete(p->pWhere);
669bb61fe7Sdrh   sqliteExprListDelete(p->pGroupBy);
679bb61fe7Sdrh   sqliteExprDelete(p->pHaving);
689bb61fe7Sdrh   sqliteExprListDelete(p->pOrderBy);
6982c3d636Sdrh   sqliteSelectDelete(p->pPrior);
709bb61fe7Sdrh   sqliteFree(p);
719bb61fe7Sdrh }
729bb61fe7Sdrh 
739bb61fe7Sdrh /*
742282792aSdrh ** Delete the aggregate information from the parse structure.
752282792aSdrh */
762282792aSdrh void sqliteParseInfoReset(Parse *pParse){
772282792aSdrh   sqliteFree(pParse->aAgg);
782282792aSdrh   pParse->aAgg = 0;
792282792aSdrh   pParse->nAgg = 0;
802282792aSdrh   pParse->iAggCount = -1;
812282792aSdrh   pParse->useAgg = 0;
822282792aSdrh }
832282792aSdrh 
842282792aSdrh /*
852282792aSdrh ** This routine generates the code for the inside of the inner loop
862282792aSdrh ** of a SELECT.
8782c3d636Sdrh **
8882c3d636Sdrh ** The pEList is used to determine the values for each column in the
89967e8b73Sdrh ** result row.  Except  if pEList==NULL, then we just read nColumn
9082c3d636Sdrh ** elements from the srcTab table.
912282792aSdrh */
922282792aSdrh static int selectInnerLoop(
932282792aSdrh   Parse *pParse,          /* The parser context */
942282792aSdrh   ExprList *pEList,       /* List of values being extracted */
9582c3d636Sdrh   int srcTab,             /* Pull data from this table */
96967e8b73Sdrh   int nColumn,            /* Number of columns in the source table */
972282792aSdrh   ExprList *pOrderBy,     /* If not NULL, sort results using this key */
982282792aSdrh   int distinct,           /* If >=0, make sure results are distinct */
992282792aSdrh   int eDest,              /* How to dispose of the results */
1002282792aSdrh   int iParm,              /* An argument to the disposal method */
1012282792aSdrh   int iContinue,          /* Jump here to continue with next row */
1022282792aSdrh   int iBreak              /* Jump here to break out of the inner loop */
1032282792aSdrh ){
1042282792aSdrh   Vdbe *v = pParse->pVdbe;
1052282792aSdrh   int i;
106daffd0e5Sdrh   if( v==0 ) return 0;
1072282792aSdrh 
108967e8b73Sdrh   /* Pull the requested columns.
1092282792aSdrh   */
11082c3d636Sdrh   if( pEList ){
1112282792aSdrh     for(i=0; i<pEList->nExpr; i++){
1122282792aSdrh       sqliteExprCode(pParse, pEList->a[i].pExpr);
1132282792aSdrh     }
114967e8b73Sdrh     nColumn = pEList->nExpr;
11582c3d636Sdrh   }else{
116967e8b73Sdrh     for(i=0; i<nColumn; i++){
11799fcd718Sdrh       sqliteVdbeAddOp(v, OP_Column, srcTab, i);
11882c3d636Sdrh     }
11982c3d636Sdrh   }
1202282792aSdrh 
121daffd0e5Sdrh   /* If the DISTINCT keyword was present on the SELECT statement
122daffd0e5Sdrh   ** and this row has been seen before, then do not make this row
123daffd0e5Sdrh   ** part of the result.
1242282792aSdrh   */
1252282792aSdrh   if( distinct>=0 ){
1262282792aSdrh     int lbl = sqliteVdbeMakeLabel(v);
12799fcd718Sdrh     sqliteVdbeAddOp(v, OP_MakeKey, pEList->nExpr, 1);
12899fcd718Sdrh     sqliteVdbeAddOp(v, OP_Distinct, distinct, lbl);
12999fcd718Sdrh     sqliteVdbeAddOp(v, OP_Pop, pEList->nExpr+1, 0);
13099fcd718Sdrh     sqliteVdbeAddOp(v, OP_Goto, 0, iContinue);
13199fcd718Sdrh     sqliteVdbeResolveLabel(v, lbl);
13299fcd718Sdrh     sqliteVdbeAddOp(v, OP_String, 0, 0);
13399fcd718Sdrh     sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
13499fcd718Sdrh     sqliteVdbeAddOp(v, OP_Put, distinct, 0);
1352282792aSdrh   }
13682c3d636Sdrh 
1372282792aSdrh   /* If there is an ORDER BY clause, then store the results
1382282792aSdrh   ** in a sorter.
1392282792aSdrh   */
1402282792aSdrh   if( pOrderBy ){
1412282792aSdrh     char *zSortOrder;
14299fcd718Sdrh     sqliteVdbeAddOp(v, OP_SortMakeRec, nColumn, 0);
1432282792aSdrh     zSortOrder = sqliteMalloc( pOrderBy->nExpr + 1 );
1442282792aSdrh     if( zSortOrder==0 ) return 1;
1452282792aSdrh     for(i=0; i<pOrderBy->nExpr; i++){
146d8bc7086Sdrh       zSortOrder[i] = pOrderBy->a[i].sortOrder ? '-' : '+';
1472282792aSdrh       sqliteExprCode(pParse, pOrderBy->a[i].pExpr);
1482282792aSdrh     }
1492282792aSdrh     zSortOrder[pOrderBy->nExpr] = 0;
15099fcd718Sdrh     sqliteVdbeAddOp(v, OP_SortMakeKey, pOrderBy->nExpr, 0);
15199fcd718Sdrh     sqliteVdbeChangeP3(v, -1, zSortOrder, strlen(zSortOrder));
1526e142f54Sdrh     sqliteFree(zSortOrder);
15399fcd718Sdrh     sqliteVdbeAddOp(v, OP_SortPut, 0, 0);
1542282792aSdrh   }else
1552282792aSdrh 
15682c3d636Sdrh   /* In this mode, write each query result to the key of the temporary
15782c3d636Sdrh   ** table iParm.
1582282792aSdrh   */
15982c3d636Sdrh   if( eDest==SRT_Union ){
16099fcd718Sdrh     sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
16199fcd718Sdrh     sqliteVdbeAddOp(v, OP_String, iParm, 0);
16299fcd718Sdrh     sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
16399fcd718Sdrh     sqliteVdbeAddOp(v, OP_Put, iParm, 0);
16482c3d636Sdrh   }else
16582c3d636Sdrh 
1665974a30fSdrh   /* Store the result as data using a unique key.
1675974a30fSdrh   */
1685974a30fSdrh   if( eDest==SRT_Table ){
16999fcd718Sdrh     sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
17099fcd718Sdrh     sqliteVdbeAddOp(v, OP_NewRecno, iParm, 0);
17199fcd718Sdrh     sqliteVdbeAddOp(v, OP_Pull, 1, 0);
17299fcd718Sdrh     sqliteVdbeAddOp(v, OP_Put, iParm, 0);
1735974a30fSdrh   }else
1745974a30fSdrh 
17582c3d636Sdrh   /* Construct a record from the query result, but instead of
17682c3d636Sdrh   ** saving that record, use it as a key to delete elements from
17782c3d636Sdrh   ** the temporary table iParm.
17882c3d636Sdrh   */
17982c3d636Sdrh   if( eDest==SRT_Except ){
18099fcd718Sdrh     int addr = sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
18199fcd718Sdrh     sqliteVdbeAddOp(v, OP_NotFound, iParm, addr+3);
18299fcd718Sdrh     sqliteVdbeAddOp(v, OP_Delete, iParm, 0);
1832282792aSdrh   }else
1842282792aSdrh 
1852282792aSdrh   /* If we are creating a set for an "expr IN (SELECT ...)" construct,
1862282792aSdrh   ** then there should be a single item on the stack.  Write this
1872282792aSdrh   ** item into the set table with bogus data.
1882282792aSdrh   */
1892282792aSdrh   if( eDest==SRT_Set ){
190967e8b73Sdrh     assert( nColumn==1 );
19199fcd718Sdrh     sqliteVdbeAddOp(v, OP_String, 0, 0);
19299fcd718Sdrh     sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
19399fcd718Sdrh     sqliteVdbeAddOp(v, OP_Put, iParm, 0);
1942282792aSdrh   }else
1952282792aSdrh 
19682c3d636Sdrh 
1972282792aSdrh   /* If this is a scalar select that is part of an expression, then
1982282792aSdrh   ** store the results in the appropriate memory cell and break out
1992282792aSdrh   ** of the scan loop.
2002282792aSdrh   */
2012282792aSdrh   if( eDest==SRT_Mem ){
202967e8b73Sdrh     assert( nColumn==1 );
20399fcd718Sdrh     sqliteVdbeAddOp(v, OP_MemStore, iParm, 0);
20499fcd718Sdrh     sqliteVdbeAddOp(v, OP_Goto, 0, iBreak);
2052282792aSdrh   }else
2062282792aSdrh 
2072282792aSdrh   /* If none of the above, send the data to the callback function.
2082282792aSdrh   */
2092282792aSdrh   {
210*9bbca4c1Sdrh     sqliteVdbeAddOp(v, OP_Callback, nColumn, iBreak);
21182c3d636Sdrh   }
21282c3d636Sdrh   return 0;
21382c3d636Sdrh }
21482c3d636Sdrh 
21582c3d636Sdrh /*
216d8bc7086Sdrh ** If the inner loop was generated using a non-null pOrderBy argument,
217d8bc7086Sdrh ** then the results were placed in a sorter.  After the loop is terminated
218d8bc7086Sdrh ** we need to run the sorter and output the results.  The following
219d8bc7086Sdrh ** routine generates the code needed to do that.
220d8bc7086Sdrh */
221967e8b73Sdrh static void generateSortTail(Vdbe *v, int nColumn){
222d8bc7086Sdrh   int end = sqliteVdbeMakeLabel(v);
223d8bc7086Sdrh   int addr;
22499fcd718Sdrh   sqliteVdbeAddOp(v, OP_Sort, 0, 0);
22599fcd718Sdrh   addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end);
226*9bbca4c1Sdrh   sqliteVdbeAddOp(v, OP_SortCallback, nColumn, end);
22799fcd718Sdrh   sqliteVdbeAddOp(v, OP_Goto, 0, addr);
22899fcd718Sdrh   sqliteVdbeResolveLabel(v, end);
229a8b38d28Sdrh   sqliteVdbeAddOp(v, OP_SortReset, 0, 0);
230d8bc7086Sdrh }
231d8bc7086Sdrh 
232d8bc7086Sdrh /*
23382c3d636Sdrh ** Generate code that will tell the VDBE how many columns there
23482c3d636Sdrh ** are in the result and the name for each column.  This information
23582c3d636Sdrh ** is used to provide "argc" and "azCol[]" values in the callback.
23682c3d636Sdrh */
237d8bc7086Sdrh static
238d8bc7086Sdrh void generateColumnNames(Parse *pParse, IdList *pTabList, ExprList *pEList){
239d8bc7086Sdrh   Vdbe *v = pParse->pVdbe;
24082c3d636Sdrh   int i;
241daffd0e5Sdrh   if( pParse->colNamesSet || v==0 || sqlite_malloc_failed ) return;
242d8bc7086Sdrh   pParse->colNamesSet = 1;
24399fcd718Sdrh   sqliteVdbeAddOp(v, OP_ColumnCount, pEList->nExpr, 0);
24482c3d636Sdrh   for(i=0; i<pEList->nExpr; i++){
24582c3d636Sdrh     Expr *p;
2461bee3d7bSdrh     int showFullNames;
24782c3d636Sdrh     if( pEList->a[i].zName ){
24882c3d636Sdrh       char *zName = pEList->a[i].zName;
24999fcd718Sdrh       sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
25099fcd718Sdrh       sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
25182c3d636Sdrh       continue;
25282c3d636Sdrh     }
25382c3d636Sdrh     p = pEList->a[i].pExpr;
254daffd0e5Sdrh     if( p==0 ) continue;
2551bee3d7bSdrh     showFullNames = (pParse->db->flags & SQLITE_FullColNames)!=0;
2561bee3d7bSdrh     if( p->span.z && p->span.z[0] && !showFullNames ){
25799fcd718Sdrh       int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, 0);
25899fcd718Sdrh       sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n);
259e1b6a5b8Sdrh       sqliteVdbeCompressSpace(v, addr);
2601bee3d7bSdrh     }else if( p->op==TK_COLUMN && pTabList ){
2611bee3d7bSdrh       if( pTabList->nId>1 || showFullNames ){
26282c3d636Sdrh         char *zName = 0;
26398808babSdrh         Table *pTab = pTabList->a[p->iTable - pParse->nTab].pTab;
26482c3d636Sdrh         char *zTab;
26582c3d636Sdrh 
26698808babSdrh         zTab = pTabList->a[p->iTable - pParse->nTab].zAlias;
26701a34661Sdrh         if( showFullNames || zTab==0 ) zTab = pTab->zName;
268967e8b73Sdrh         sqliteSetString(&zName, zTab, ".", pTab->aCol[p->iColumn].zName, 0);
26999fcd718Sdrh         sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
27099fcd718Sdrh         sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
27182c3d636Sdrh         sqliteFree(zName);
27282c3d636Sdrh       }else{
27382c3d636Sdrh         Table *pTab = pTabList->a[0].pTab;
274967e8b73Sdrh         char *zName = pTab->aCol[p->iColumn].zName;
27599fcd718Sdrh         sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
27699fcd718Sdrh         sqliteVdbeChangeP3(v, -1, zName, P3_STATIC);
27782c3d636Sdrh       }
2781bee3d7bSdrh     }else if( p->span.z && p->span.z[0] ){
2791bee3d7bSdrh       int addr = sqliteVdbeAddOp(v,OP_ColumnName, i, 0);
2801bee3d7bSdrh       sqliteVdbeChangeP3(v, -1, p->span.z, p->span.n);
2811bee3d7bSdrh       sqliteVdbeCompressSpace(v, addr);
2821bee3d7bSdrh     }else{
2831bee3d7bSdrh       char zName[30];
2841bee3d7bSdrh       assert( p->op!=TK_COLUMN || pTabList==0 );
2851bee3d7bSdrh       sprintf(zName, "column%d", i+1);
2861bee3d7bSdrh       sqliteVdbeAddOp(v, OP_ColumnName, i, 0);
2871bee3d7bSdrh       sqliteVdbeChangeP3(v, -1, zName, strlen(zName));
28882c3d636Sdrh     }
28982c3d636Sdrh   }
29082c3d636Sdrh }
29182c3d636Sdrh 
29282c3d636Sdrh /*
293d8bc7086Sdrh ** Name of the connection operator, used for error messages.
294d8bc7086Sdrh */
295d8bc7086Sdrh static const char *selectOpName(int id){
296d8bc7086Sdrh   char *z;
297d8bc7086Sdrh   switch( id ){
298d8bc7086Sdrh     case TK_ALL:       z = "UNION ALL";   break;
299d8bc7086Sdrh     case TK_INTERSECT: z = "INTERSECT";   break;
300d8bc7086Sdrh     case TK_EXCEPT:    z = "EXCEPT";      break;
301d8bc7086Sdrh     default:           z = "UNION";       break;
302d8bc7086Sdrh   }
303d8bc7086Sdrh   return z;
304d8bc7086Sdrh }
305d8bc7086Sdrh 
306d8bc7086Sdrh /*
307d8bc7086Sdrh ** For the given SELECT statement, do two things.
308d8bc7086Sdrh **
309967e8b73Sdrh **    (1)  Fill in the pTabList->a[].pTab fields in the IdList that
310967e8b73Sdrh **         defines the set of tables that should be scanned.
311d8bc7086Sdrh **
312d8bc7086Sdrh **    (2)  If the columns to be extracted variable (pEList) is NULL
313d8bc7086Sdrh **         (meaning that a "*" was used in the SQL statement) then
314d8bc7086Sdrh **         create a fake pEList containing the names of all columns
315d8bc7086Sdrh **         of all tables.
316d8bc7086Sdrh **
317d8bc7086Sdrh ** Return 0 on success.  If there are problems, leave an error message
318d8bc7086Sdrh ** in pParse and return non-zero.
319d8bc7086Sdrh */
320d8bc7086Sdrh static int fillInColumnList(Parse *pParse, Select *p){
321d8bc7086Sdrh   int i, j;
322daffd0e5Sdrh   IdList *pTabList;
323daffd0e5Sdrh   ExprList *pEList;
324daffd0e5Sdrh 
325daffd0e5Sdrh   if( p==0 || p->pSrc==0 ) return 1;
326daffd0e5Sdrh   pTabList = p->pSrc;
327daffd0e5Sdrh   pEList = p->pEList;
328d8bc7086Sdrh 
329d8bc7086Sdrh   /* Look up every table in the table list.
330d8bc7086Sdrh   */
331d8bc7086Sdrh   for(i=0; i<pTabList->nId; i++){
332d8bc7086Sdrh     if( pTabList->a[i].pTab ){
333d8bc7086Sdrh       /* This routine has run before!  No need to continue */
334d8bc7086Sdrh       return 0;
335d8bc7086Sdrh     }
336daffd0e5Sdrh     if( pTabList->a[i].zName==0 ){
337daffd0e5Sdrh       /* No table name is given.  Instead, there is a (SELECT ...) statement
338daffd0e5Sdrh       ** the results of which should be used in place of the table.  The
339daffd0e5Sdrh       ** was this is implemented is that the (SELECT ...) writes its results
340daffd0e5Sdrh       ** into a temporary table which is then scanned like any other table.
341daffd0e5Sdrh       */
342daffd0e5Sdrh       sqliteSetString(&pParse->zErrMsg,
343daffd0e5Sdrh           "(SELECT...) in a FROM clause is not yet implemented.", 0);
344daffd0e5Sdrh       pParse->nErr++;
345daffd0e5Sdrh       return 1;
346daffd0e5Sdrh     }
347d8bc7086Sdrh     pTabList->a[i].pTab = sqliteFindTable(pParse->db, pTabList->a[i].zName);
348d8bc7086Sdrh     if( pTabList->a[i].pTab==0 ){
349d8bc7086Sdrh       sqliteSetString(&pParse->zErrMsg, "no such table: ",
350d8bc7086Sdrh          pTabList->a[i].zName, 0);
351d8bc7086Sdrh       pParse->nErr++;
352d8bc7086Sdrh       return 1;
353d8bc7086Sdrh     }
354d8bc7086Sdrh   }
355d8bc7086Sdrh 
356d8bc7086Sdrh   /* If the list of columns to retrieve is "*" then replace it with
357d8bc7086Sdrh   ** a list of all columns from all tables.
358d8bc7086Sdrh   */
359d8bc7086Sdrh   if( pEList==0 ){
360d8bc7086Sdrh     for(i=0; i<pTabList->nId; i++){
361d8bc7086Sdrh       Table *pTab = pTabList->a[i].pTab;
362d8bc7086Sdrh       for(j=0; j<pTab->nCol; j++){
363d8bc7086Sdrh         Expr *pExpr = sqliteExpr(TK_DOT, 0, 0, 0);
364daffd0e5Sdrh         if( pExpr==0 ) break;
365d8bc7086Sdrh         pExpr->pLeft = sqliteExpr(TK_ID, 0, 0, 0);
3666d4abfbeSdrh         if( pExpr->pLeft==0 ){ sqliteExprDelete(pExpr); break; }
367d8bc7086Sdrh         pExpr->pLeft->token.z = pTab->zName;
368d8bc7086Sdrh         pExpr->pLeft->token.n = strlen(pTab->zName);
369d8bc7086Sdrh         pExpr->pRight = sqliteExpr(TK_ID, 0, 0, 0);
3706d4abfbeSdrh         if( pExpr->pRight==0 ){ sqliteExprDelete(pExpr); break; }
371d8bc7086Sdrh         pExpr->pRight->token.z = pTab->aCol[j].zName;
372d8bc7086Sdrh         pExpr->pRight->token.n = strlen(pTab->aCol[j].zName);
373e1b6a5b8Sdrh         pExpr->span.z = "";
374e1b6a5b8Sdrh         pExpr->span.n = 0;
375d8bc7086Sdrh         pEList = sqliteExprListAppend(pEList, pExpr, 0);
376d8bc7086Sdrh       }
377d8bc7086Sdrh     }
378d8bc7086Sdrh     p->pEList = pEList;
379d8bc7086Sdrh   }
380d8bc7086Sdrh   return 0;
381d8bc7086Sdrh }
382d8bc7086Sdrh 
383d8bc7086Sdrh /*
384d8bc7086Sdrh ** This routine associates entries in an ORDER BY expression list with
385d8bc7086Sdrh ** columns in a result.  For each ORDER BY expression, the opcode of
386967e8b73Sdrh ** the top-level node is changed to TK_COLUMN and the iColumn value of
387d8bc7086Sdrh ** the top-level node is filled in with column number and the iTable
388d8bc7086Sdrh ** value of the top-level node is filled with iTable parameter.
389d8bc7086Sdrh **
390d8bc7086Sdrh ** If there are prior SELECT clauses, they are processed first.  A match
391d8bc7086Sdrh ** in an earlier SELECT takes precedence over a later SELECT.
392d8bc7086Sdrh **
393d8bc7086Sdrh ** Any entry that does not match is flagged as an error.  The number
394d8bc7086Sdrh ** of errors is returned.
395d8bc7086Sdrh */
396d8bc7086Sdrh static int matchOrderbyToColumn(
397d8bc7086Sdrh   Parse *pParse,          /* A place to leave error messages */
398d8bc7086Sdrh   Select *pSelect,        /* Match to result columns of this SELECT */
399d8bc7086Sdrh   ExprList *pOrderBy,     /* The ORDER BY values to match against columns */
400d8bc7086Sdrh   int iTable,             /* Insert this this value in iTable */
401d8bc7086Sdrh   int mustComplete        /* If TRUE all ORDER BYs must match */
402d8bc7086Sdrh ){
403d8bc7086Sdrh   int nErr = 0;
404d8bc7086Sdrh   int i, j;
405d8bc7086Sdrh   ExprList *pEList;
406d8bc7086Sdrh 
407daffd0e5Sdrh   if( pSelect==0 || pOrderBy==0 ) return 1;
408d8bc7086Sdrh   if( mustComplete ){
409d8bc7086Sdrh     for(i=0; i<pOrderBy->nExpr; i++){ pOrderBy->a[i].done = 0; }
410d8bc7086Sdrh   }
411d8bc7086Sdrh   if( fillInColumnList(pParse, pSelect) ){
412d8bc7086Sdrh     return 1;
413d8bc7086Sdrh   }
414d8bc7086Sdrh   if( pSelect->pPrior ){
41592cd52f5Sdrh     if( matchOrderbyToColumn(pParse, pSelect->pPrior, pOrderBy, iTable, 0) ){
41692cd52f5Sdrh       return 1;
41792cd52f5Sdrh     }
418d8bc7086Sdrh   }
419d8bc7086Sdrh   pEList = pSelect->pEList;
420d8bc7086Sdrh   for(i=0; i<pOrderBy->nExpr; i++){
421d8bc7086Sdrh     Expr *pE = pOrderBy->a[i].pExpr;
42292cd52f5Sdrh     int match = 0;
423d8bc7086Sdrh     if( pOrderBy->a[i].done ) continue;
424d8bc7086Sdrh     for(j=0; j<pEList->nExpr; j++){
4254cfa7934Sdrh       if( pEList->a[j].zName && (pE->op==TK_ID || pE->op==TK_STRING) ){
4264cfa7934Sdrh         char *zName = pEList->a[j].zName;
4276e142f54Sdrh         char *zLabel = sqliteStrNDup(pE->token.z, pE->token.n);
428d8bc7086Sdrh         sqliteDequote(zLabel);
429d8bc7086Sdrh         if( sqliteStrICmp(zName, zLabel)==0 ){
430d8bc7086Sdrh           match = 1;
431d8bc7086Sdrh         }
4326e142f54Sdrh         sqliteFree(zLabel);
433d8bc7086Sdrh       }
4344cfa7934Sdrh       if( match==0 && sqliteExprCompare(pE, pEList->a[j].pExpr) ){
435d8bc7086Sdrh         match = 1;
436d8bc7086Sdrh       }
437d8bc7086Sdrh       if( match ){
438967e8b73Sdrh         pE->op = TK_COLUMN;
439967e8b73Sdrh         pE->iColumn = j;
440d8bc7086Sdrh         pE->iTable = iTable;
441d8bc7086Sdrh         pOrderBy->a[i].done = 1;
442d8bc7086Sdrh         break;
443d8bc7086Sdrh       }
444d8bc7086Sdrh     }
44592cd52f5Sdrh     if( !match && mustComplete ){
446d8bc7086Sdrh       char zBuf[30];
447d8bc7086Sdrh       sprintf(zBuf,"%d",i+1);
448d8bc7086Sdrh       sqliteSetString(&pParse->zErrMsg, "ORDER BY term number ", zBuf,
449d8bc7086Sdrh         " does not match any result column", 0);
450d8bc7086Sdrh       pParse->nErr++;
451d8bc7086Sdrh       nErr++;
452d8bc7086Sdrh       break;
453d8bc7086Sdrh     }
454d8bc7086Sdrh   }
455d8bc7086Sdrh   return nErr;
456d8bc7086Sdrh }
457d8bc7086Sdrh 
458d8bc7086Sdrh /*
459d8bc7086Sdrh ** Get a VDBE for the given parser context.  Create a new one if necessary.
460d8bc7086Sdrh ** If an error occurs, return NULL and leave a message in pParse.
461d8bc7086Sdrh */
462d8bc7086Sdrh Vdbe *sqliteGetVdbe(Parse *pParse){
463d8bc7086Sdrh   Vdbe *v = pParse->pVdbe;
464d8bc7086Sdrh   if( v==0 ){
4654c504391Sdrh     v = pParse->pVdbe = sqliteVdbeCreate(pParse->db);
466d8bc7086Sdrh   }
467d8bc7086Sdrh   return v;
468d8bc7086Sdrh }
469d8bc7086Sdrh 
470d8bc7086Sdrh 
471d8bc7086Sdrh /*
47282c3d636Sdrh ** This routine is called to process a query that is really the union
47382c3d636Sdrh ** or intersection of two or more separate queries.
47482c3d636Sdrh */
47582c3d636Sdrh static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){
47610e5e3cfSdrh   int rc;             /* Success code from a subroutine */
47710e5e3cfSdrh   Select *pPrior;     /* Another SELECT immediately to our left */
47810e5e3cfSdrh   Vdbe *v;            /* Generate code to this VDBE */
47910e5e3cfSdrh   int base;           /* Baseline value for pParse->nTab */
48082c3d636Sdrh 
481d8bc7086Sdrh   /* Make sure there is no ORDER BY clause on prior SELECTs.  Only the
482d8bc7086Sdrh   ** last SELECT in the series may have an ORDER BY.
48382c3d636Sdrh   */
484daffd0e5Sdrh   if( p==0 || p->pPrior==0 ) return 1;
485d8bc7086Sdrh   pPrior = p->pPrior;
486d8bc7086Sdrh   if( pPrior->pOrderBy ){
487d8bc7086Sdrh     sqliteSetString(&pParse->zErrMsg,"ORDER BY clause should come after ",
488d8bc7086Sdrh       selectOpName(p->op), " not before", 0);
48982c3d636Sdrh     pParse->nErr++;
49082c3d636Sdrh     return 1;
49182c3d636Sdrh   }
49282c3d636Sdrh 
493d8bc7086Sdrh   /* Make sure we have a valid query engine.  If not, create a new one.
494d8bc7086Sdrh   */
495d8bc7086Sdrh   v = sqliteGetVdbe(pParse);
496d8bc7086Sdrh   if( v==0 ) return 1;
497d8bc7086Sdrh 
498d8bc7086Sdrh   /* Process the UNION or INTERSECTION
499d8bc7086Sdrh   */
50010e5e3cfSdrh   base = pParse->nTab;
50182c3d636Sdrh   switch( p->op ){
502d8bc7086Sdrh     case TK_ALL:
50382c3d636Sdrh     case TK_EXCEPT:
50482c3d636Sdrh     case TK_UNION: {
505d8bc7086Sdrh       int unionTab;    /* Cursor number of the temporary table holding result */
506d8bc7086Sdrh       int op;          /* One of the SRT_ operations to apply to self */
507d8bc7086Sdrh       int priorOp;     /* The SRT_ operation to apply to prior selects */
50882c3d636Sdrh 
509d8bc7086Sdrh       priorOp = p->op==TK_ALL ? SRT_Table : SRT_Union;
510d8bc7086Sdrh       if( eDest==priorOp ){
511d8bc7086Sdrh         /* We can reuse a temporary table generated by a SELECT to our
512d8bc7086Sdrh         ** right.  This also means we are not the right-most select and so
513d8bc7086Sdrh         ** we cannot have an ORDER BY clause
514d8bc7086Sdrh         */
51582c3d636Sdrh         unionTab = iParm;
516d8bc7086Sdrh         assert( p->pOrderBy==0 );
51782c3d636Sdrh       }else{
518d8bc7086Sdrh         /* We will need to create our own temporary table to hold the
519d8bc7086Sdrh         ** intermediate results.
520d8bc7086Sdrh         */
52182c3d636Sdrh         unionTab = pParse->nTab++;
522d8bc7086Sdrh         if( p->pOrderBy
523d8bc7086Sdrh         && matchOrderbyToColumn(pParse, p, p->pOrderBy, unionTab, 1) ){
524d8bc7086Sdrh           return 1;
525d8bc7086Sdrh         }
526d8bc7086Sdrh         if( p->op!=TK_ALL ){
52799fcd718Sdrh           sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0);
52899fcd718Sdrh           sqliteVdbeAddOp(v, OP_KeyAsData, unionTab, 1);
529345fda3eSdrh         }else{
53099fcd718Sdrh           sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0);
53182c3d636Sdrh         }
532d8bc7086Sdrh       }
533d8bc7086Sdrh 
534d8bc7086Sdrh       /* Code the SELECT statements to our left
535d8bc7086Sdrh       */
536d8bc7086Sdrh       rc = sqliteSelect(pParse, pPrior, priorOp, unionTab);
53782c3d636Sdrh       if( rc ) return rc;
538d8bc7086Sdrh 
539d8bc7086Sdrh       /* Code the current SELECT statement
540d8bc7086Sdrh       */
541d8bc7086Sdrh       switch( p->op ){
542d8bc7086Sdrh          case TK_EXCEPT:  op = SRT_Except;   break;
543d8bc7086Sdrh          case TK_UNION:   op = SRT_Union;    break;
544d8bc7086Sdrh          case TK_ALL:     op = SRT_Table;    break;
545d8bc7086Sdrh       }
54682c3d636Sdrh       p->pPrior = 0;
54782c3d636Sdrh       rc = sqliteSelect(pParse, p, op, unionTab);
54882c3d636Sdrh       p->pPrior = pPrior;
54982c3d636Sdrh       if( rc ) return rc;
550d8bc7086Sdrh 
551d8bc7086Sdrh       /* Convert the data in the temporary table into whatever form
552d8bc7086Sdrh       ** it is that we currently need.
553d8bc7086Sdrh       */
554d8bc7086Sdrh       if( eDest!=priorOp ){
55582c3d636Sdrh         int iCont, iBreak;
55682c3d636Sdrh         assert( p->pEList );
557d8bc7086Sdrh         generateColumnNames(pParse, 0, p->pEList);
55899fcd718Sdrh         sqliteVdbeAddOp(v, OP_Rewind, unionTab, 0);
55982c3d636Sdrh         iBreak = sqliteVdbeMakeLabel(v);
56099fcd718Sdrh         iCont = sqliteVdbeAddOp(v, OP_Next, unionTab, iBreak);
56182c3d636Sdrh         rc = selectInnerLoop(pParse, 0, unionTab, p->pEList->nExpr,
562d8bc7086Sdrh                              p->pOrderBy, -1, eDest, iParm,
56382c3d636Sdrh                              iCont, iBreak);
56482c3d636Sdrh         if( rc ) return 1;
56599fcd718Sdrh         sqliteVdbeAddOp(v, OP_Goto, 0, iCont);
56699fcd718Sdrh         sqliteVdbeResolveLabel(v, iBreak);
56799fcd718Sdrh         sqliteVdbeAddOp(v, OP_Close, unionTab, 0);
568d8bc7086Sdrh         if( p->pOrderBy ){
569d8bc7086Sdrh           generateSortTail(v, p->pEList->nExpr);
570d8bc7086Sdrh         }
57182c3d636Sdrh       }
57282c3d636Sdrh       break;
57382c3d636Sdrh     }
57482c3d636Sdrh     case TK_INTERSECT: {
57582c3d636Sdrh       int tab1, tab2;
57682c3d636Sdrh       int iCont, iBreak;
57782c3d636Sdrh 
578d8bc7086Sdrh       /* INTERSECT is different from the others since it requires
5796206d50aSdrh       ** two temporary tables.  Hence it has its own case.  Begin
580d8bc7086Sdrh       ** by allocating the tables we will need.
581d8bc7086Sdrh       */
58282c3d636Sdrh       tab1 = pParse->nTab++;
58382c3d636Sdrh       tab2 = pParse->nTab++;
584d8bc7086Sdrh       if( p->pOrderBy && matchOrderbyToColumn(pParse,p,p->pOrderBy,tab1,1) ){
585d8bc7086Sdrh         return 1;
586d8bc7086Sdrh       }
58799fcd718Sdrh       sqliteVdbeAddOp(v, OP_OpenTemp, tab1, 0);
58899fcd718Sdrh       sqliteVdbeAddOp(v, OP_KeyAsData, tab1, 1);
589d8bc7086Sdrh 
590d8bc7086Sdrh       /* Code the SELECTs to our left into temporary table "tab1".
591d8bc7086Sdrh       */
59282c3d636Sdrh       rc = sqliteSelect(pParse, pPrior, SRT_Union, tab1);
59382c3d636Sdrh       if( rc ) return rc;
594d8bc7086Sdrh 
595d8bc7086Sdrh       /* Code the current SELECT into temporary table "tab2"
596d8bc7086Sdrh       */
59799fcd718Sdrh       sqliteVdbeAddOp(v, OP_OpenTemp, tab2, 0);
59899fcd718Sdrh       sqliteVdbeAddOp(v, OP_KeyAsData, tab2, 1);
59982c3d636Sdrh       p->pPrior = 0;
60082c3d636Sdrh       rc = sqliteSelect(pParse, p, SRT_Union, tab2);
60182c3d636Sdrh       p->pPrior = pPrior;
60282c3d636Sdrh       if( rc ) return rc;
603d8bc7086Sdrh 
604d8bc7086Sdrh       /* Generate code to take the intersection of the two temporary
605d8bc7086Sdrh       ** tables.
606d8bc7086Sdrh       */
60782c3d636Sdrh       assert( p->pEList );
608d8bc7086Sdrh       generateColumnNames(pParse, 0, p->pEList);
60999fcd718Sdrh       sqliteVdbeAddOp(v, OP_Rewind, tab1, 0);
61082c3d636Sdrh       iBreak = sqliteVdbeMakeLabel(v);
61199fcd718Sdrh       iCont = sqliteVdbeAddOp(v, OP_Next, tab1, iBreak);
61299fcd718Sdrh       sqliteVdbeAddOp(v, OP_FullKey, tab1, 0);
61399fcd718Sdrh       sqliteVdbeAddOp(v, OP_NotFound, tab2, iCont);
61482c3d636Sdrh       rc = selectInnerLoop(pParse, 0, tab1, p->pEList->nExpr,
615d8bc7086Sdrh                              p->pOrderBy, -1, eDest, iParm,
61682c3d636Sdrh                              iCont, iBreak);
61782c3d636Sdrh       if( rc ) return 1;
61899fcd718Sdrh       sqliteVdbeAddOp(v, OP_Goto, 0, iCont);
61999fcd718Sdrh       sqliteVdbeResolveLabel(v, iBreak);
62099fcd718Sdrh       sqliteVdbeAddOp(v, OP_Close, tab2, 0);
62199fcd718Sdrh       sqliteVdbeAddOp(v, OP_Close, tab1, 0);
622d8bc7086Sdrh       if( p->pOrderBy ){
623d8bc7086Sdrh         generateSortTail(v, p->pEList->nExpr);
624d8bc7086Sdrh       }
62582c3d636Sdrh       break;
62682c3d636Sdrh     }
62782c3d636Sdrh   }
62882c3d636Sdrh   assert( p->pEList && pPrior->pEList );
62982c3d636Sdrh   if( p->pEList->nExpr!=pPrior->pEList->nExpr ){
630d8bc7086Sdrh     sqliteSetString(&pParse->zErrMsg, "SELECTs to the left and right of ",
631d8bc7086Sdrh       selectOpName(p->op), " do not have the same number of result columns", 0);
63282c3d636Sdrh     pParse->nErr++;
63382c3d636Sdrh     return 1;
6342282792aSdrh   }
63510e5e3cfSdrh   pParse->nTab = base;
6362282792aSdrh   return 0;
6372282792aSdrh }
6382282792aSdrh 
6392282792aSdrh /*
6409bb61fe7Sdrh ** Generate code for the given SELECT statement.
6419bb61fe7Sdrh **
642fef5208cSdrh ** The results are distributed in various ways depending on the
643fef5208cSdrh ** value of eDest and iParm.
644fef5208cSdrh **
645fef5208cSdrh **     eDest Value       Result
646fef5208cSdrh **     ------------    -------------------------------------------
647fef5208cSdrh **     SRT_Callback    Invoke the callback for each row of the result.
648fef5208cSdrh **
649fef5208cSdrh **     SRT_Mem         Store first result in memory cell iParm
650fef5208cSdrh **
651fef5208cSdrh **     SRT_Set         Store results as keys of a table with cursor iParm
652fef5208cSdrh **
65382c3d636Sdrh **     SRT_Union       Store results as a key in a temporary table iParm
65482c3d636Sdrh **
655c4a3c779Sdrh **     SRT_Except      Remove results form the temporary table iParm.
656c4a3c779Sdrh **
657c4a3c779Sdrh **     SRT_Table       Store results in temporary table iParm
6589bb61fe7Sdrh **
6599bb61fe7Sdrh ** This routine returns the number of errors.  If any errors are
6609bb61fe7Sdrh ** encountered, then an appropriate error message is left in
6619bb61fe7Sdrh ** pParse->zErrMsg.
6629bb61fe7Sdrh **
6639bb61fe7Sdrh ** This routine does NOT free the Select structure passed in.  The
6649bb61fe7Sdrh ** calling function needs to do that.
6659bb61fe7Sdrh */
6669bb61fe7Sdrh int sqliteSelect(
667cce7d176Sdrh   Parse *pParse,         /* The parser context */
6689bb61fe7Sdrh   Select *p,             /* The SELECT statement being coded. */
66982c3d636Sdrh   int eDest,             /* One of: SRT_Callback Mem Set Union Except */
670fef5208cSdrh   int iParm              /* Save result in this memory location, if >=0 */
671cce7d176Sdrh ){
672d8bc7086Sdrh   int i;
673cce7d176Sdrh   WhereInfo *pWInfo;
674cce7d176Sdrh   Vdbe *v;
675cce7d176Sdrh   int isAgg = 0;         /* True for select lists like "count(*)" */
676967e8b73Sdrh   ExprList *pEList;      /* List of columns to extract.  NULL means "*" */
6779bb61fe7Sdrh   IdList *pTabList;      /* List of tables to select from */
6789bb61fe7Sdrh   Expr *pWhere;          /* The WHERE clause.  May be NULL */
6799bb61fe7Sdrh   ExprList *pOrderBy;    /* The ORDER BY clause.  May be NULL */
6802282792aSdrh   ExprList *pGroupBy;    /* The GROUP BY clause.  May be NULL */
6812282792aSdrh   Expr *pHaving;         /* The HAVING clause.  May be NULL */
68219a775c2Sdrh   int isDistinct;        /* True if the DISTINCT keyword is present */
68319a775c2Sdrh   int distinct;          /* Table to use for the distinct set */
68410e5e3cfSdrh   int base;              /* First cursor available for use */
6859bb61fe7Sdrh 
686daffd0e5Sdrh   if( sqlite_malloc_failed || pParse->nErr || p==0 ) return 1;
687daffd0e5Sdrh 
68882c3d636Sdrh   /* If there is are a sequence of queries, do the earlier ones first.
68982c3d636Sdrh   */
69082c3d636Sdrh   if( p->pPrior ){
69182c3d636Sdrh     return multiSelect(pParse, p, eDest, iParm);
69282c3d636Sdrh   }
69382c3d636Sdrh 
69482c3d636Sdrh   /* Make local copies of the parameters for this query.
69582c3d636Sdrh   */
6969bb61fe7Sdrh   pTabList = p->pSrc;
6979bb61fe7Sdrh   pWhere = p->pWhere;
6989bb61fe7Sdrh   pOrderBy = p->pOrderBy;
6992282792aSdrh   pGroupBy = p->pGroupBy;
7002282792aSdrh   pHaving = p->pHaving;
70119a775c2Sdrh   isDistinct = p->isDistinct;
7029bb61fe7Sdrh 
70310e5e3cfSdrh   /* Save the current value of pParse->nTab.  Restore this value before
70410e5e3cfSdrh   ** we exit.
70510e5e3cfSdrh   */
70610e5e3cfSdrh   base = pParse->nTab;
70710e5e3cfSdrh 
7089bb61fe7Sdrh   /*
7099bb61fe7Sdrh   ** Do not even attempt to generate any code if we have already seen
7109bb61fe7Sdrh   ** errors before this routine starts.
7119bb61fe7Sdrh   */
71210e5e3cfSdrh   if( pParse->nErr>0 ) return 1;
7132282792aSdrh   sqliteParseInfoReset(pParse);
714cce7d176Sdrh 
715d8bc7086Sdrh   /* Look up every table in the table list and create an appropriate
716d8bc7086Sdrh   ** columnlist in pEList if there isn't one already.  (The parser leaves
717967e8b73Sdrh   ** a NULL in the p->pEList if the SQL said "SELECT * FROM ...")
718cce7d176Sdrh   */
719d8bc7086Sdrh   if( fillInColumnList(pParse, p) ){
7209bb61fe7Sdrh     return 1;
721cce7d176Sdrh   }
722d8bc7086Sdrh   pEList = p->pEList;
723daffd0e5Sdrh   if( pEList==0 ) return 1;
724cce7d176Sdrh 
72519a775c2Sdrh   /* Allocate a temporary table to use for the DISTINCT set, if
7262282792aSdrh   ** necessary.  This must be done early to allocate the cursor before
7272282792aSdrh   ** any calls to sqliteExprResolveIds().
72819a775c2Sdrh   */
72919a775c2Sdrh   if( isDistinct ){
73019a775c2Sdrh     distinct = pParse->nTab++;
7312282792aSdrh   }else{
7322282792aSdrh     distinct = -1;
73319a775c2Sdrh   }
73419a775c2Sdrh 
7352282792aSdrh   /* If writing to memory or generating a set
7362282792aSdrh   ** only a single column may be output.
73719a775c2Sdrh   */
738fef5208cSdrh   if( (eDest==SRT_Mem || eDest==SRT_Set) && pEList->nExpr>1 ){
73919a775c2Sdrh     sqliteSetString(&pParse->zErrMsg, "only a single result allowed for "
74019a775c2Sdrh        "a SELECT that is part of an expression", 0);
74119a775c2Sdrh     pParse->nErr++;
74219a775c2Sdrh     return 1;
74319a775c2Sdrh   }
74419a775c2Sdrh 
7452282792aSdrh   /* ORDER BY is ignored if we are not sending the result to a callback.
7462282792aSdrh   */
7472282792aSdrh   if( eDest!=SRT_Callback ){
7482282792aSdrh     pOrderBy = 0;
7492282792aSdrh   }
7502282792aSdrh 
7512282792aSdrh   /* Allocate cursors for "expr IN (SELECT ...)" constructs.
752cce7d176Sdrh   */
753cce7d176Sdrh   for(i=0; i<pEList->nExpr; i++){
7544794b980Sdrh     sqliteExprResolveInSelect(pParse, pEList->a[i].pExpr);
7554794b980Sdrh   }
7564794b980Sdrh   if( pWhere ) sqliteExprResolveInSelect(pParse, pWhere);
7574794b980Sdrh   if( pOrderBy ){
7584794b980Sdrh     for(i=0; i<pOrderBy->nExpr; i++){
7594794b980Sdrh       sqliteExprResolveInSelect(pParse, pOrderBy->a[i].pExpr);
7604794b980Sdrh     }
7614794b980Sdrh   }
7622282792aSdrh   if( pGroupBy ){
7632282792aSdrh     for(i=0; i<pGroupBy->nExpr; i++){
7642282792aSdrh       sqliteExprResolveInSelect(pParse, pGroupBy->a[i].pExpr);
7652282792aSdrh     }
7662282792aSdrh   }
7672282792aSdrh   if( pHaving ) sqliteExprResolveInSelect(pParse, pHaving);
7682282792aSdrh 
76910e5e3cfSdrh   /* At this point, we should have allocated all the cursors that we
77010e5e3cfSdrh   ** need to handle subquerys and temporary tables.  From here on we
77110e5e3cfSdrh   ** are committed to keeping the same value for pParse->nTab.
77210e5e3cfSdrh   **
773967e8b73Sdrh   ** Resolve the column names and do a semantics check on all the expressions.
7742282792aSdrh   */
7754794b980Sdrh   for(i=0; i<pEList->nExpr; i++){
776cce7d176Sdrh     if( sqliteExprResolveIds(pParse, pTabList, pEList->a[i].pExpr) ){
7779bb61fe7Sdrh       return 1;
778cce7d176Sdrh     }
7792282792aSdrh     if( sqliteExprCheck(pParse, pEList->a[i].pExpr, 1, &isAgg) ){
7809bb61fe7Sdrh       return 1;
781cce7d176Sdrh     }
782cce7d176Sdrh   }
783cce7d176Sdrh   if( pWhere ){
784cce7d176Sdrh     if( sqliteExprResolveIds(pParse, pTabList, pWhere) ){
7859bb61fe7Sdrh       return 1;
786cce7d176Sdrh     }
787cce7d176Sdrh     if( sqliteExprCheck(pParse, pWhere, 0, 0) ){
7889bb61fe7Sdrh       return 1;
789cce7d176Sdrh     }
790cce7d176Sdrh   }
791cce7d176Sdrh   if( pOrderBy ){
792cce7d176Sdrh     for(i=0; i<pOrderBy->nExpr; i++){
7932282792aSdrh       Expr *pE = pOrderBy->a[i].pExpr;
7942282792aSdrh       if( sqliteExprResolveIds(pParse, pTabList, pE) ){
7959bb61fe7Sdrh         return 1;
796cce7d176Sdrh       }
7972282792aSdrh       if( sqliteExprCheck(pParse, pE, isAgg, 0) ){
7989bb61fe7Sdrh         return 1;
799cce7d176Sdrh       }
800cce7d176Sdrh     }
801cce7d176Sdrh   }
8022282792aSdrh   if( pGroupBy ){
8032282792aSdrh     for(i=0; i<pGroupBy->nExpr; i++){
8042282792aSdrh       Expr *pE = pGroupBy->a[i].pExpr;
8052282792aSdrh       if( sqliteExprResolveIds(pParse, pTabList, pE) ){
8062282792aSdrh         return 1;
8072282792aSdrh       }
8082282792aSdrh       if( sqliteExprCheck(pParse, pE, isAgg, 0) ){
8092282792aSdrh         return 1;
8102282792aSdrh       }
8112282792aSdrh     }
8122282792aSdrh   }
8132282792aSdrh   if( pHaving ){
8142282792aSdrh     if( pGroupBy==0 ){
815da93281eSdrh       sqliteSetString(&pParse->zErrMsg, "a GROUP BY clause is required "
816da93281eSdrh          "before HAVING", 0);
8172282792aSdrh       pParse->nErr++;
8182282792aSdrh       return 1;
8192282792aSdrh     }
8202282792aSdrh     if( sqliteExprResolveIds(pParse, pTabList, pHaving) ){
8212282792aSdrh       return 1;
8222282792aSdrh     }
823da93281eSdrh     if( sqliteExprCheck(pParse, pHaving, isAgg, 0) ){
8242282792aSdrh       return 1;
8252282792aSdrh     }
826cce7d176Sdrh   }
827cce7d176Sdrh 
8282282792aSdrh   /* Do an analysis of aggregate expressions.
829efb7251dSdrh   */
8302282792aSdrh   if( isAgg ){
831aaf88729Sdrh     assert( pParse->nAgg==0 && pParse->iAggCount<0 );
8322282792aSdrh     for(i=0; i<pEList->nExpr; i++){
8332282792aSdrh       if( sqliteExprAnalyzeAggregates(pParse, pEList->a[i].pExpr) ){
8342282792aSdrh         return 1;
8352282792aSdrh       }
8362282792aSdrh     }
8372282792aSdrh     if( pGroupBy ){
8382282792aSdrh       for(i=0; i<pGroupBy->nExpr; i++){
8392282792aSdrh         if( sqliteExprAnalyzeAggregates(pParse, pGroupBy->a[i].pExpr) ){
8402282792aSdrh           return 1;
8412282792aSdrh         }
8422282792aSdrh       }
8432282792aSdrh     }
8442282792aSdrh     if( pHaving && sqliteExprAnalyzeAggregates(pParse, pHaving) ){
8452282792aSdrh       return 1;
8462282792aSdrh     }
847191b690eSdrh     if( pOrderBy ){
848191b690eSdrh       for(i=0; i<pOrderBy->nExpr; i++){
849191b690eSdrh         if( sqliteExprAnalyzeAggregates(pParse, pOrderBy->a[i].pExpr) ){
850191b690eSdrh           return 1;
851191b690eSdrh         }
852191b690eSdrh       }
853191b690eSdrh     }
854efb7251dSdrh   }
855efb7251dSdrh 
856cce7d176Sdrh   /* Begin generating code.
857cce7d176Sdrh   */
858daffd0e5Sdrh   v = sqliteGetVdbe(pParse);
859daffd0e5Sdrh   if( v==0 ) return 1;
860cce7d176Sdrh 
861*9bbca4c1Sdrh   /* Set the limiter
862*9bbca4c1Sdrh   */
863*9bbca4c1Sdrh   if( p->nLimit<=0 ){
864*9bbca4c1Sdrh     p->nOffset = 0;
865*9bbca4c1Sdrh   }else{
866*9bbca4c1Sdrh     if( p->nOffset<0 ) p->nOffset = 0;
867*9bbca4c1Sdrh     sqliteVdbeAddOp(v, OP_Limit, p->nLimit, p->nOffset);
868*9bbca4c1Sdrh   }
869*9bbca4c1Sdrh 
870*9bbca4c1Sdrh 
8712282792aSdrh   /* Identify column names if we will be using in the callback.  This
87219a775c2Sdrh   ** step is skipped if the output is going to a table or a memory cell.
873cce7d176Sdrh   */
874fef5208cSdrh   if( eDest==SRT_Callback ){
875d8bc7086Sdrh     generateColumnNames(pParse, pTabList, pEList);
876cce7d176Sdrh   }
877cce7d176Sdrh 
8782282792aSdrh   /* Reset the aggregator
879cce7d176Sdrh   */
880cce7d176Sdrh   if( isAgg ){
88199fcd718Sdrh     sqliteVdbeAddOp(v, OP_AggReset, 0, pParse->nAgg);
8821bee3d7bSdrh     if( pGroupBy==0 ){
8831bee3d7bSdrh       sqliteVdbeAddOp(v, OP_String, 0, 0);
8841bee3d7bSdrh       sqliteVdbeChangeP3(v, -1, "", P3_STATIC);
8851bee3d7bSdrh       sqliteVdbeAddOp(v, OP_AggFocus, 0, 0);
8861bee3d7bSdrh       for(i=0; i<pParse->nAgg; i++){
8871bee3d7bSdrh         Expr *pE;
8881bee3d7bSdrh         if( !pParse->aAgg[i].isAgg ) continue;
8891bee3d7bSdrh         pE = pParse->aAgg[i].pExpr;
8901bee3d7bSdrh         assert( pE==0 || pE->op==TK_AGG_FUNCTION );
8911bee3d7bSdrh         assert( pE==0 || (pE->pList!=0 && pE->pList->nExpr==1) );
8921bee3d7bSdrh         if( pE==0 || pE->iColumn==FN_Sum ){
8931bee3d7bSdrh           sqliteVdbeAddOp(v, OP_Integer, 0, 0);
8941bee3d7bSdrh           sqliteVdbeAddOp(v, OP_AggSet, 0, i);
8951bee3d7bSdrh           continue;
8961bee3d7bSdrh         }
8971bee3d7bSdrh       }
8981bee3d7bSdrh     }
899cce7d176Sdrh   }
900cce7d176Sdrh 
90119a775c2Sdrh   /* Initialize the memory cell to NULL
90219a775c2Sdrh   */
903fef5208cSdrh   if( eDest==SRT_Mem ){
90499fcd718Sdrh     sqliteVdbeAddOp(v, OP_String, 0, 0);
90599fcd718Sdrh     sqliteVdbeAddOp(v, OP_MemStore, iParm, 0);
90619a775c2Sdrh   }
90719a775c2Sdrh 
908cce7d176Sdrh   /* Begin the database scan
909cce7d176Sdrh   */
91019a775c2Sdrh   if( isDistinct ){
91199fcd718Sdrh     sqliteVdbeAddOp(v, OP_OpenTemp, distinct, 0);
912efb7251dSdrh   }
913cce7d176Sdrh   pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 0);
9149bb61fe7Sdrh   if( pWInfo==0 ) return 1;
915cce7d176Sdrh 
9162282792aSdrh   /* Use the standard inner loop if we are not dealing with
9172282792aSdrh   ** aggregates
918cce7d176Sdrh   */
919da9d6c45Sdrh   if( !isAgg ){
92082c3d636Sdrh     if( selectInnerLoop(pParse, pEList, 0, 0, pOrderBy, distinct, eDest, iParm,
9212282792aSdrh                     pWInfo->iContinue, pWInfo->iBreak) ){
9222282792aSdrh        return 1;
923cce7d176Sdrh     }
924da9d6c45Sdrh   }
925cce7d176Sdrh 
9262282792aSdrh   /* If we are dealing with aggregates, then to the special aggregate
9272282792aSdrh   ** processing.
928efb7251dSdrh   */
9292282792aSdrh   else{
9302282792aSdrh     if( pGroupBy ){
9311bee3d7bSdrh       int lbl1;
9322282792aSdrh       for(i=0; i<pGroupBy->nExpr; i++){
9332282792aSdrh         sqliteExprCode(pParse, pGroupBy->a[i].pExpr);
934efb7251dSdrh       }
93599fcd718Sdrh       sqliteVdbeAddOp(v, OP_MakeKey, pGroupBy->nExpr, 0);
9361bee3d7bSdrh       lbl1 = sqliteVdbeMakeLabel(v);
93799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggFocus, 0, lbl1);
9382282792aSdrh       for(i=0; i<pParse->nAgg; i++){
9392282792aSdrh         if( pParse->aAgg[i].isAgg ) continue;
9402282792aSdrh         sqliteExprCode(pParse, pParse->aAgg[i].pExpr);
94199fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggSet, 0, i);
9422282792aSdrh       }
9432282792aSdrh       sqliteVdbeResolveLabel(v, lbl1);
9442282792aSdrh     }
9452282792aSdrh     for(i=0; i<pParse->nAgg; i++){
9462282792aSdrh       Expr *pE;
9472282792aSdrh       int op;
9482282792aSdrh       if( !pParse->aAgg[i].isAgg ) continue;
9492282792aSdrh       pE = pParse->aAgg[i].pExpr;
9502282792aSdrh       if( pE==0 ){
95199fcd718Sdrh         sqliteVdbeAddOp(v, OP_AggIncr, 1, i);
9522282792aSdrh         continue;
9532282792aSdrh       }
9542282792aSdrh       assert( pE->op==TK_AGG_FUNCTION );
9552282792aSdrh       assert( pE->pList!=0 && pE->pList->nExpr==1 );
9562282792aSdrh       sqliteExprCode(pParse, pE->pList->a[0].pExpr);
95799fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggGet, 0, i);
958967e8b73Sdrh       switch( pE->iColumn ){
9592282792aSdrh         case FN_Min:  op = OP_Min;   break;
9602282792aSdrh         case FN_Max:  op = OP_Max;   break;
9612282792aSdrh         case FN_Avg:  op = OP_Add;   break;
9622282792aSdrh         case FN_Sum:  op = OP_Add;   break;
9632282792aSdrh       }
96499fcd718Sdrh       sqliteVdbeAddOp(v, op, 0, 0);
96599fcd718Sdrh       sqliteVdbeAddOp(v, OP_AggSet, 0, i);
9662282792aSdrh     }
9672282792aSdrh   }
9682282792aSdrh 
969cce7d176Sdrh 
970cce7d176Sdrh   /* End the database scan loop.
971cce7d176Sdrh   */
972cce7d176Sdrh   sqliteWhereEnd(pWInfo);
973cce7d176Sdrh 
9742282792aSdrh   /* If we are processing aggregates, we need to set up a second loop
9752282792aSdrh   ** over all of the aggregate values and process them.
9762282792aSdrh   */
9772282792aSdrh   if( isAgg ){
9782282792aSdrh     int endagg = sqliteVdbeMakeLabel(v);
9792282792aSdrh     int startagg;
98099fcd718Sdrh     startagg = sqliteVdbeAddOp(v, OP_AggNext, 0, endagg);
9812282792aSdrh     pParse->useAgg = 1;
9822282792aSdrh     if( pHaving ){
9832282792aSdrh       sqliteExprIfFalse(pParse, pHaving, startagg);
9842282792aSdrh     }
98582c3d636Sdrh     if( selectInnerLoop(pParse, pEList, 0, 0, pOrderBy, distinct, eDest, iParm,
9862282792aSdrh                     startagg, endagg) ){
9872282792aSdrh       return 1;
9882282792aSdrh     }
98999fcd718Sdrh     sqliteVdbeAddOp(v, OP_Goto, 0, startagg);
99099fcd718Sdrh     sqliteVdbeResolveLabel(v, endagg);
99199fcd718Sdrh     sqliteVdbeAddOp(v, OP_Noop, 0, 0);
9922282792aSdrh     pParse->useAgg = 0;
9932282792aSdrh   }
9942282792aSdrh 
995cce7d176Sdrh   /* If there is an ORDER BY clause, then we need to sort the results
996cce7d176Sdrh   ** and send them to the callback one by one.
997cce7d176Sdrh   */
998cce7d176Sdrh   if( pOrderBy ){
999d8bc7086Sdrh     generateSortTail(v, pEList->nExpr);
1000cce7d176Sdrh   }
100110e5e3cfSdrh   pParse->nTab = base;
10026a535340Sdrh 
10036a535340Sdrh 
10046a535340Sdrh   /* Issue a null callback if that is what the user wants.
10056a535340Sdrh   */
10066a535340Sdrh   if( (pParse->db->flags & SQLITE_NullCallback)!=0 && eDest==SRT_Callback ){
10076a535340Sdrh     sqliteVdbeAddOp(v, OP_NullCallback, pEList->nExpr, 0);
10086a535340Sdrh   }
10096a535340Sdrh 
10109bb61fe7Sdrh   return 0;
1011cce7d176Sdrh }
1012