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