Annotation of embedaddon/php/ext/sqlite/libsqlite/src/select.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2001 September 15
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** May you do good and not evil.
! 8: ** May you find forgiveness for yourself and forgive others.
! 9: ** May you share freely, never taking more than you give.
! 10: **
! 11: *************************************************************************
! 12: ** This file contains C code routines that are called by the parser
! 13: ** to handle SELECT statements in SQLite.
! 14: **
! 15: ** $Id: select.c 195361 2005-09-07 15:11:33Z iliaa $
! 16: */
! 17: #include "sqliteInt.h"
! 18:
! 19:
! 20: /*
! 21: ** Allocate a new Select structure and return a pointer to that
! 22: ** structure.
! 23: */
! 24: Select *sqliteSelectNew(
! 25: ExprList *pEList, /* which columns to include in the result */
! 26: SrcList *pSrc, /* the FROM clause -- which tables to scan */
! 27: Expr *pWhere, /* the WHERE clause */
! 28: ExprList *pGroupBy, /* the GROUP BY clause */
! 29: Expr *pHaving, /* the HAVING clause */
! 30: ExprList *pOrderBy, /* the ORDER BY clause */
! 31: int isDistinct, /* true if the DISTINCT keyword is present */
! 32: int nLimit, /* LIMIT value. -1 means not used */
! 33: int nOffset /* OFFSET value. 0 means no offset */
! 34: ){
! 35: Select *pNew;
! 36: pNew = sqliteMalloc( sizeof(*pNew) );
! 37: if( pNew==0 ){
! 38: sqliteExprListDelete(pEList);
! 39: sqliteSrcListDelete(pSrc);
! 40: sqliteExprDelete(pWhere);
! 41: sqliteExprListDelete(pGroupBy);
! 42: sqliteExprDelete(pHaving);
! 43: sqliteExprListDelete(pOrderBy);
! 44: }else{
! 45: if( pEList==0 ){
! 46: pEList = sqliteExprListAppend(0, sqliteExpr(TK_ALL,0,0,0), 0);
! 47: }
! 48: pNew->pEList = pEList;
! 49: pNew->pSrc = pSrc;
! 50: pNew->pWhere = pWhere;
! 51: pNew->pGroupBy = pGroupBy;
! 52: pNew->pHaving = pHaving;
! 53: pNew->pOrderBy = pOrderBy;
! 54: pNew->isDistinct = isDistinct;
! 55: pNew->op = TK_SELECT;
! 56: pNew->nLimit = nLimit;
! 57: pNew->nOffset = nOffset;
! 58: pNew->iLimit = -1;
! 59: pNew->iOffset = -1;
! 60: }
! 61: return pNew;
! 62: }
! 63:
! 64: /*
! 65: ** Given 1 to 3 identifiers preceeding the JOIN keyword, determine the
! 66: ** type of join. Return an integer constant that expresses that type
! 67: ** in terms of the following bit values:
! 68: **
! 69: ** JT_INNER
! 70: ** JT_OUTER
! 71: ** JT_NATURAL
! 72: ** JT_LEFT
! 73: ** JT_RIGHT
! 74: **
! 75: ** A full outer join is the combination of JT_LEFT and JT_RIGHT.
! 76: **
! 77: ** If an illegal or unsupported join type is seen, then still return
! 78: ** a join type, but put an error in the pParse structure.
! 79: */
! 80: int sqliteJoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){
! 81: int jointype = 0;
! 82: Token *apAll[3];
! 83: Token *p;
! 84: static struct {
! 85: const char *zKeyword;
! 86: int nChar;
! 87: int code;
! 88: } keywords[] = {
! 89: { "natural", 7, JT_NATURAL },
! 90: { "left", 4, JT_LEFT|JT_OUTER },
! 91: { "right", 5, JT_RIGHT|JT_OUTER },
! 92: { "full", 4, JT_LEFT|JT_RIGHT|JT_OUTER },
! 93: { "outer", 5, JT_OUTER },
! 94: { "inner", 5, JT_INNER },
! 95: { "cross", 5, JT_INNER },
! 96: };
! 97: int i, j;
! 98: apAll[0] = pA;
! 99: apAll[1] = pB;
! 100: apAll[2] = pC;
! 101: for(i=0; i<3 && apAll[i]; i++){
! 102: p = apAll[i];
! 103: for(j=0; j<sizeof(keywords)/sizeof(keywords[0]); j++){
! 104: if( p->n==keywords[j].nChar
! 105: && sqliteStrNICmp(p->z, keywords[j].zKeyword, p->n)==0 ){
! 106: jointype |= keywords[j].code;
! 107: break;
! 108: }
! 109: }
! 110: if( j>=sizeof(keywords)/sizeof(keywords[0]) ){
! 111: jointype |= JT_ERROR;
! 112: break;
! 113: }
! 114: }
! 115: if(
! 116: (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) ||
! 117: (jointype & JT_ERROR)!=0
! 118: ){
! 119: static Token dummy = { 0, 0 };
! 120: char *zSp1 = " ", *zSp2 = " ";
! 121: if( pB==0 ){ pB = &dummy; zSp1 = 0; }
! 122: if( pC==0 ){ pC = &dummy; zSp2 = 0; }
! 123: sqliteSetNString(&pParse->zErrMsg, "unknown or unsupported join type: ", 0,
! 124: pA->z, pA->n, zSp1, 1, pB->z, pB->n, zSp2, 1, pC->z, pC->n, 0);
! 125: pParse->nErr++;
! 126: jointype = JT_INNER;
! 127: }else if( jointype & JT_RIGHT ){
! 128: sqliteErrorMsg(pParse,
! 129: "RIGHT and FULL OUTER JOINs are not currently supported");
! 130: jointype = JT_INNER;
! 131: }
! 132: return jointype;
! 133: }
! 134:
! 135: /*
! 136: ** Return the index of a column in a table. Return -1 if the column
! 137: ** is not contained in the table.
! 138: */
! 139: static int columnIndex(Table *pTab, const char *zCol){
! 140: int i;
! 141: for(i=0; i<pTab->nCol; i++){
! 142: if( sqliteStrICmp(pTab->aCol[i].zName, zCol)==0 ) return i;
! 143: }
! 144: return -1;
! 145: }
! 146:
! 147: /*
! 148: ** Add a term to the WHERE expression in *ppExpr that requires the
! 149: ** zCol column to be equal in the two tables pTab1 and pTab2.
! 150: */
! 151: static void addWhereTerm(
! 152: const char *zCol, /* Name of the column */
! 153: const Table *pTab1, /* First table */
! 154: const Table *pTab2, /* Second table */
! 155: Expr **ppExpr /* Add the equality term to this expression */
! 156: ){
! 157: Token dummy;
! 158: Expr *pE1a, *pE1b, *pE1c;
! 159: Expr *pE2a, *pE2b, *pE2c;
! 160: Expr *pE;
! 161:
! 162: dummy.z = zCol;
! 163: dummy.n = strlen(zCol);
! 164: dummy.dyn = 0;
! 165: pE1a = sqliteExpr(TK_ID, 0, 0, &dummy);
! 166: pE2a = sqliteExpr(TK_ID, 0, 0, &dummy);
! 167: dummy.z = pTab1->zName;
! 168: dummy.n = strlen(dummy.z);
! 169: pE1b = sqliteExpr(TK_ID, 0, 0, &dummy);
! 170: dummy.z = pTab2->zName;
! 171: dummy.n = strlen(dummy.z);
! 172: pE2b = sqliteExpr(TK_ID, 0, 0, &dummy);
! 173: pE1c = sqliteExpr(TK_DOT, pE1b, pE1a, 0);
! 174: pE2c = sqliteExpr(TK_DOT, pE2b, pE2a, 0);
! 175: pE = sqliteExpr(TK_EQ, pE1c, pE2c, 0);
! 176: ExprSetProperty(pE, EP_FromJoin);
! 177: if( *ppExpr ){
! 178: *ppExpr = sqliteExpr(TK_AND, *ppExpr, pE, 0);
! 179: }else{
! 180: *ppExpr = pE;
! 181: }
! 182: }
! 183:
! 184: /*
! 185: ** Set the EP_FromJoin property on all terms of the given expression.
! 186: **
! 187: ** The EP_FromJoin property is used on terms of an expression to tell
! 188: ** the LEFT OUTER JOIN processing logic that this term is part of the
! 189: ** join restriction specified in the ON or USING clause and not a part
! 190: ** of the more general WHERE clause. These terms are moved over to the
! 191: ** WHERE clause during join processing but we need to remember that they
! 192: ** originated in the ON or USING clause.
! 193: */
! 194: static void setJoinExpr(Expr *p){
! 195: while( p ){
! 196: ExprSetProperty(p, EP_FromJoin);
! 197: setJoinExpr(p->pLeft);
! 198: p = p->pRight;
! 199: }
! 200: }
! 201:
! 202: /*
! 203: ** This routine processes the join information for a SELECT statement.
! 204: ** ON and USING clauses are converted into extra terms of the WHERE clause.
! 205: ** NATURAL joins also create extra WHERE clause terms.
! 206: **
! 207: ** This routine returns the number of errors encountered.
! 208: */
! 209: static int sqliteProcessJoin(Parse *pParse, Select *p){
! 210: SrcList *pSrc;
! 211: int i, j;
! 212: pSrc = p->pSrc;
! 213: for(i=0; i<pSrc->nSrc-1; i++){
! 214: struct SrcList_item *pTerm = &pSrc->a[i];
! 215: struct SrcList_item *pOther = &pSrc->a[i+1];
! 216:
! 217: if( pTerm->pTab==0 || pOther->pTab==0 ) continue;
! 218:
! 219: /* When the NATURAL keyword is present, add WHERE clause terms for
! 220: ** every column that the two tables have in common.
! 221: */
! 222: if( pTerm->jointype & JT_NATURAL ){
! 223: Table *pTab;
! 224: if( pTerm->pOn || pTerm->pUsing ){
! 225: sqliteErrorMsg(pParse, "a NATURAL join may not have "
! 226: "an ON or USING clause", 0);
! 227: return 1;
! 228: }
! 229: pTab = pTerm->pTab;
! 230: for(j=0; j<pTab->nCol; j++){
! 231: if( columnIndex(pOther->pTab, pTab->aCol[j].zName)>=0 ){
! 232: addWhereTerm(pTab->aCol[j].zName, pTab, pOther->pTab, &p->pWhere);
! 233: }
! 234: }
! 235: }
! 236:
! 237: /* Disallow both ON and USING clauses in the same join
! 238: */
! 239: if( pTerm->pOn && pTerm->pUsing ){
! 240: sqliteErrorMsg(pParse, "cannot have both ON and USING "
! 241: "clauses in the same join");
! 242: return 1;
! 243: }
! 244:
! 245: /* Add the ON clause to the end of the WHERE clause, connected by
! 246: ** and AND operator.
! 247: */
! 248: if( pTerm->pOn ){
! 249: setJoinExpr(pTerm->pOn);
! 250: if( p->pWhere==0 ){
! 251: p->pWhere = pTerm->pOn;
! 252: }else{
! 253: p->pWhere = sqliteExpr(TK_AND, p->pWhere, pTerm->pOn, 0);
! 254: }
! 255: pTerm->pOn = 0;
! 256: }
! 257:
! 258: /* Create extra terms on the WHERE clause for each column named
! 259: ** in the USING clause. Example: If the two tables to be joined are
! 260: ** A and B and the USING clause names X, Y, and Z, then add this
! 261: ** to the WHERE clause: A.X=B.X AND A.Y=B.Y AND A.Z=B.Z
! 262: ** Report an error if any column mentioned in the USING clause is
! 263: ** not contained in both tables to be joined.
! 264: */
! 265: if( pTerm->pUsing ){
! 266: IdList *pList;
! 267: int j;
! 268: assert( i<pSrc->nSrc-1 );
! 269: pList = pTerm->pUsing;
! 270: for(j=0; j<pList->nId; j++){
! 271: if( columnIndex(pTerm->pTab, pList->a[j].zName)<0 ||
! 272: columnIndex(pOther->pTab, pList->a[j].zName)<0 ){
! 273: sqliteErrorMsg(pParse, "cannot join using column %s - column "
! 274: "not present in both tables", pList->a[j].zName);
! 275: return 1;
! 276: }
! 277: addWhereTerm(pList->a[j].zName, pTerm->pTab, pOther->pTab, &p->pWhere);
! 278: }
! 279: }
! 280: }
! 281: return 0;
! 282: }
! 283:
! 284: /*
! 285: ** Delete the given Select structure and all of its substructures.
! 286: */
! 287: void sqliteSelectDelete(Select *p){
! 288: if( p==0 ) return;
! 289: sqliteExprListDelete(p->pEList);
! 290: sqliteSrcListDelete(p->pSrc);
! 291: sqliteExprDelete(p->pWhere);
! 292: sqliteExprListDelete(p->pGroupBy);
! 293: sqliteExprDelete(p->pHaving);
! 294: sqliteExprListDelete(p->pOrderBy);
! 295: sqliteSelectDelete(p->pPrior);
! 296: sqliteFree(p->zSelect);
! 297: sqliteFree(p);
! 298: }
! 299:
! 300: /*
! 301: ** Delete the aggregate information from the parse structure.
! 302: */
! 303: static void sqliteAggregateInfoReset(Parse *pParse){
! 304: sqliteFree(pParse->aAgg);
! 305: pParse->aAgg = 0;
! 306: pParse->nAgg = 0;
! 307: pParse->useAgg = 0;
! 308: }
! 309:
! 310: /*
! 311: ** Insert code into "v" that will push the record on the top of the
! 312: ** stack into the sorter.
! 313: */
! 314: static void pushOntoSorter(Parse *pParse, Vdbe *v, ExprList *pOrderBy){
! 315: char *zSortOrder;
! 316: int i;
! 317: zSortOrder = sqliteMalloc( pOrderBy->nExpr + 1 );
! 318: if( zSortOrder==0 ) return;
! 319: for(i=0; i<pOrderBy->nExpr; i++){
! 320: int order = pOrderBy->a[i].sortOrder;
! 321: int type;
! 322: int c;
! 323: if( (order & SQLITE_SO_TYPEMASK)==SQLITE_SO_TEXT ){
! 324: type = SQLITE_SO_TEXT;
! 325: }else if( (order & SQLITE_SO_TYPEMASK)==SQLITE_SO_NUM ){
! 326: type = SQLITE_SO_NUM;
! 327: }else if( pParse->db->file_format>=4 ){
! 328: type = sqliteExprType(pOrderBy->a[i].pExpr);
! 329: }else{
! 330: type = SQLITE_SO_NUM;
! 331: }
! 332: if( (order & SQLITE_SO_DIRMASK)==SQLITE_SO_ASC ){
! 333: c = type==SQLITE_SO_TEXT ? 'A' : '+';
! 334: }else{
! 335: c = type==SQLITE_SO_TEXT ? 'D' : '-';
! 336: }
! 337: zSortOrder[i] = c;
! 338: sqliteExprCode(pParse, pOrderBy->a[i].pExpr);
! 339: }
! 340: zSortOrder[pOrderBy->nExpr] = 0;
! 341: sqliteVdbeOp3(v, OP_SortMakeKey, pOrderBy->nExpr, 0, zSortOrder, P3_DYNAMIC);
! 342: sqliteVdbeAddOp(v, OP_SortPut, 0, 0);
! 343: }
! 344:
! 345: /*
! 346: ** This routine adds a P3 argument to the last VDBE opcode that was
! 347: ** inserted. The P3 argument added is a string suitable for the
! 348: ** OP_MakeKey or OP_MakeIdxKey opcodes. The string consists of
! 349: ** characters 't' or 'n' depending on whether or not the various
! 350: ** fields of the key to be generated should be treated as numeric
! 351: ** or as text. See the OP_MakeKey and OP_MakeIdxKey opcode
! 352: ** documentation for additional information about the P3 string.
! 353: ** See also the sqliteAddIdxKeyType() routine.
! 354: */
! 355: void sqliteAddKeyType(Vdbe *v, ExprList *pEList){
! 356: int nColumn = pEList->nExpr;
! 357: char *zType = sqliteMalloc( nColumn+1 );
! 358: int i;
! 359: if( zType==0 ) return;
! 360: for(i=0; i<nColumn; i++){
! 361: zType[i] = sqliteExprType(pEList->a[i].pExpr)==SQLITE_SO_NUM ? 'n' : 't';
! 362: }
! 363: zType[i] = 0;
! 364: sqliteVdbeChangeP3(v, -1, zType, P3_DYNAMIC);
! 365: }
! 366:
! 367: /*
! 368: ** Add code to implement the OFFSET and LIMIT
! 369: */
! 370: static void codeLimiter(
! 371: Vdbe *v, /* Generate code into this VM */
! 372: Select *p, /* The SELECT statement being coded */
! 373: int iContinue, /* Jump here to skip the current record */
! 374: int iBreak, /* Jump here to end the loop */
! 375: int nPop /* Number of times to pop stack when jumping */
! 376: ){
! 377: if( p->iOffset>=0 ){
! 378: int addr = sqliteVdbeCurrentAddr(v) + 2;
! 379: if( nPop>0 ) addr++;
! 380: sqliteVdbeAddOp(v, OP_MemIncr, p->iOffset, addr);
! 381: if( nPop>0 ){
! 382: sqliteVdbeAddOp(v, OP_Pop, nPop, 0);
! 383: }
! 384: sqliteVdbeAddOp(v, OP_Goto, 0, iContinue);
! 385: }
! 386: if( p->iLimit>=0 ){
! 387: sqliteVdbeAddOp(v, OP_MemIncr, p->iLimit, iBreak);
! 388: }
! 389: }
! 390:
! 391: /*
! 392: ** This routine generates the code for the inside of the inner loop
! 393: ** of a SELECT.
! 394: **
! 395: ** If srcTab and nColumn are both zero, then the pEList expressions
! 396: ** are evaluated in order to get the data for this row. If nColumn>0
! 397: ** then data is pulled from srcTab and pEList is used only to get the
! 398: ** datatypes for each column.
! 399: */
! 400: static int selectInnerLoop(
! 401: Parse *pParse, /* The parser context */
! 402: Select *p, /* The complete select statement being coded */
! 403: ExprList *pEList, /* List of values being extracted */
! 404: int srcTab, /* Pull data from this table */
! 405: int nColumn, /* Number of columns in the source table */
! 406: ExprList *pOrderBy, /* If not NULL, sort results using this key */
! 407: int distinct, /* If >=0, make sure results are distinct */
! 408: int eDest, /* How to dispose of the results */
! 409: int iParm, /* An argument to the disposal method */
! 410: int iContinue, /* Jump here to continue with next row */
! 411: int iBreak /* Jump here to break out of the inner loop */
! 412: ){
! 413: Vdbe *v = pParse->pVdbe;
! 414: int i;
! 415: int hasDistinct; /* True if the DISTINCT keyword is present */
! 416:
! 417: if( v==0 ) return 0;
! 418: assert( pEList!=0 );
! 419:
! 420: /* If there was a LIMIT clause on the SELECT statement, then do the check
! 421: ** to see if this row should be output.
! 422: */
! 423: hasDistinct = distinct>=0 && pEList && pEList->nExpr>0;
! 424: if( pOrderBy==0 && !hasDistinct ){
! 425: codeLimiter(v, p, iContinue, iBreak, 0);
! 426: }
! 427:
! 428: /* Pull the requested columns.
! 429: */
! 430: if( nColumn>0 ){
! 431: for(i=0; i<nColumn; i++){
! 432: sqliteVdbeAddOp(v, OP_Column, srcTab, i);
! 433: }
! 434: }else{
! 435: nColumn = pEList->nExpr;
! 436: for(i=0; i<pEList->nExpr; i++){
! 437: sqliteExprCode(pParse, pEList->a[i].pExpr);
! 438: }
! 439: }
! 440:
! 441: /* If the DISTINCT keyword was present on the SELECT statement
! 442: ** and this row has been seen before, then do not make this row
! 443: ** part of the result.
! 444: */
! 445: if( hasDistinct ){
! 446: #if NULL_ALWAYS_DISTINCT
! 447: sqliteVdbeAddOp(v, OP_IsNull, -pEList->nExpr, sqliteVdbeCurrentAddr(v)+7);
! 448: #endif
! 449: sqliteVdbeAddOp(v, OP_MakeKey, pEList->nExpr, 1);
! 450: if( pParse->db->file_format>=4 ) sqliteAddKeyType(v, pEList);
! 451: sqliteVdbeAddOp(v, OP_Distinct, distinct, sqliteVdbeCurrentAddr(v)+3);
! 452: sqliteVdbeAddOp(v, OP_Pop, pEList->nExpr+1, 0);
! 453: sqliteVdbeAddOp(v, OP_Goto, 0, iContinue);
! 454: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 455: sqliteVdbeAddOp(v, OP_PutStrKey, distinct, 0);
! 456: if( pOrderBy==0 ){
! 457: codeLimiter(v, p, iContinue, iBreak, nColumn);
! 458: }
! 459: }
! 460:
! 461: switch( eDest ){
! 462: /* In this mode, write each query result to the key of the temporary
! 463: ** table iParm.
! 464: */
! 465: case SRT_Union: {
! 466: sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, NULL_ALWAYS_DISTINCT);
! 467: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 468: sqliteVdbeAddOp(v, OP_PutStrKey, iParm, 0);
! 469: break;
! 470: }
! 471:
! 472: /* Store the result as data using a unique key.
! 473: */
! 474: case SRT_Table:
! 475: case SRT_TempTable: {
! 476: sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
! 477: if( pOrderBy ){
! 478: pushOntoSorter(pParse, v, pOrderBy);
! 479: }else{
! 480: sqliteVdbeAddOp(v, OP_NewRecno, iParm, 0);
! 481: sqliteVdbeAddOp(v, OP_Pull, 1, 0);
! 482: sqliteVdbeAddOp(v, OP_PutIntKey, iParm, 0);
! 483: }
! 484: break;
! 485: }
! 486:
! 487: /* Construct a record from the query result, but instead of
! 488: ** saving that record, use it as a key to delete elements from
! 489: ** the temporary table iParm.
! 490: */
! 491: case SRT_Except: {
! 492: int addr;
! 493: addr = sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, NULL_ALWAYS_DISTINCT);
! 494: sqliteVdbeAddOp(v, OP_NotFound, iParm, addr+3);
! 495: sqliteVdbeAddOp(v, OP_Delete, iParm, 0);
! 496: break;
! 497: }
! 498:
! 499: /* If we are creating a set for an "expr IN (SELECT ...)" construct,
! 500: ** then there should be a single item on the stack. Write this
! 501: ** item into the set table with bogus data.
! 502: */
! 503: case SRT_Set: {
! 504: int addr1 = sqliteVdbeCurrentAddr(v);
! 505: int addr2;
! 506: assert( nColumn==1 );
! 507: sqliteVdbeAddOp(v, OP_NotNull, -1, addr1+3);
! 508: sqliteVdbeAddOp(v, OP_Pop, 1, 0);
! 509: addr2 = sqliteVdbeAddOp(v, OP_Goto, 0, 0);
! 510: if( pOrderBy ){
! 511: pushOntoSorter(pParse, v, pOrderBy);
! 512: }else{
! 513: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 514: sqliteVdbeAddOp(v, OP_PutStrKey, iParm, 0);
! 515: }
! 516: sqliteVdbeChangeP2(v, addr2, sqliteVdbeCurrentAddr(v));
! 517: break;
! 518: }
! 519:
! 520: /* If this is a scalar select that is part of an expression, then
! 521: ** store the results in the appropriate memory cell and break out
! 522: ** of the scan loop.
! 523: */
! 524: case SRT_Mem: {
! 525: assert( nColumn==1 );
! 526: if( pOrderBy ){
! 527: pushOntoSorter(pParse, v, pOrderBy);
! 528: }else{
! 529: sqliteVdbeAddOp(v, OP_MemStore, iParm, 1);
! 530: sqliteVdbeAddOp(v, OP_Goto, 0, iBreak);
! 531: }
! 532: break;
! 533: }
! 534:
! 535: /* Send the data to the callback function.
! 536: */
! 537: case SRT_Callback:
! 538: case SRT_Sorter: {
! 539: if( pOrderBy ){
! 540: sqliteVdbeAddOp(v, OP_SortMakeRec, nColumn, 0);
! 541: pushOntoSorter(pParse, v, pOrderBy);
! 542: }else{
! 543: assert( eDest==SRT_Callback );
! 544: sqliteVdbeAddOp(v, OP_Callback, nColumn, 0);
! 545: }
! 546: break;
! 547: }
! 548:
! 549: /* Invoke a subroutine to handle the results. The subroutine itself
! 550: ** is responsible for popping the results off of the stack.
! 551: */
! 552: case SRT_Subroutine: {
! 553: if( pOrderBy ){
! 554: sqliteVdbeAddOp(v, OP_MakeRecord, nColumn, 0);
! 555: pushOntoSorter(pParse, v, pOrderBy);
! 556: }else{
! 557: sqliteVdbeAddOp(v, OP_Gosub, 0, iParm);
! 558: }
! 559: break;
! 560: }
! 561:
! 562: /* Discard the results. This is used for SELECT statements inside
! 563: ** the body of a TRIGGER. The purpose of such selects is to call
! 564: ** user-defined functions that have side effects. We do not care
! 565: ** about the actual results of the select.
! 566: */
! 567: default: {
! 568: assert( eDest==SRT_Discard );
! 569: sqliteVdbeAddOp(v, OP_Pop, nColumn, 0);
! 570: break;
! 571: }
! 572: }
! 573: return 0;
! 574: }
! 575:
! 576: /*
! 577: ** If the inner loop was generated using a non-null pOrderBy argument,
! 578: ** then the results were placed in a sorter. After the loop is terminated
! 579: ** we need to run the sorter and output the results. The following
! 580: ** routine generates the code needed to do that.
! 581: */
! 582: static void generateSortTail(
! 583: Select *p, /* The SELECT statement */
! 584: Vdbe *v, /* Generate code into this VDBE */
! 585: int nColumn, /* Number of columns of data */
! 586: int eDest, /* Write the sorted results here */
! 587: int iParm /* Optional parameter associated with eDest */
! 588: ){
! 589: int end1 = sqliteVdbeMakeLabel(v);
! 590: int end2 = sqliteVdbeMakeLabel(v);
! 591: int addr;
! 592: if( eDest==SRT_Sorter ) return;
! 593: sqliteVdbeAddOp(v, OP_Sort, 0, 0);
! 594: addr = sqliteVdbeAddOp(v, OP_SortNext, 0, end1);
! 595: codeLimiter(v, p, addr, end2, 1);
! 596: switch( eDest ){
! 597: case SRT_Callback: {
! 598: sqliteVdbeAddOp(v, OP_SortCallback, nColumn, 0);
! 599: break;
! 600: }
! 601: case SRT_Table:
! 602: case SRT_TempTable: {
! 603: sqliteVdbeAddOp(v, OP_NewRecno, iParm, 0);
! 604: sqliteVdbeAddOp(v, OP_Pull, 1, 0);
! 605: sqliteVdbeAddOp(v, OP_PutIntKey, iParm, 0);
! 606: break;
! 607: }
! 608: case SRT_Set: {
! 609: assert( nColumn==1 );
! 610: sqliteVdbeAddOp(v, OP_NotNull, -1, sqliteVdbeCurrentAddr(v)+3);
! 611: sqliteVdbeAddOp(v, OP_Pop, 1, 0);
! 612: sqliteVdbeAddOp(v, OP_Goto, 0, sqliteVdbeCurrentAddr(v)+3);
! 613: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 614: sqliteVdbeAddOp(v, OP_PutStrKey, iParm, 0);
! 615: break;
! 616: }
! 617: case SRT_Mem: {
! 618: assert( nColumn==1 );
! 619: sqliteVdbeAddOp(v, OP_MemStore, iParm, 1);
! 620: sqliteVdbeAddOp(v, OP_Goto, 0, end1);
! 621: break;
! 622: }
! 623: case SRT_Subroutine: {
! 624: int i;
! 625: for(i=0; i<nColumn; i++){
! 626: sqliteVdbeAddOp(v, OP_Column, -1-i, i);
! 627: }
! 628: sqliteVdbeAddOp(v, OP_Gosub, 0, iParm);
! 629: sqliteVdbeAddOp(v, OP_Pop, 1, 0);
! 630: break;
! 631: }
! 632: default: {
! 633: /* Do nothing */
! 634: break;
! 635: }
! 636: }
! 637: sqliteVdbeAddOp(v, OP_Goto, 0, addr);
! 638: sqliteVdbeResolveLabel(v, end2);
! 639: sqliteVdbeAddOp(v, OP_Pop, 1, 0);
! 640: sqliteVdbeResolveLabel(v, end1);
! 641: sqliteVdbeAddOp(v, OP_SortReset, 0, 0);
! 642: }
! 643:
! 644: /*
! 645: ** Generate code that will tell the VDBE the datatypes of
! 646: ** columns in the result set.
! 647: **
! 648: ** This routine only generates code if the "PRAGMA show_datatypes=on"
! 649: ** has been executed. The datatypes are reported out in the azCol
! 650: ** parameter to the callback function. The first N azCol[] entries
! 651: ** are the names of the columns, and the second N entries are the
! 652: ** datatypes for the columns.
! 653: **
! 654: ** The "datatype" for a result that is a column of a type is the
! 655: ** datatype definition extracted from the CREATE TABLE statement.
! 656: ** The datatype for an expression is either TEXT or NUMERIC. The
! 657: ** datatype for a ROWID field is INTEGER.
! 658: */
! 659: static void generateColumnTypes(
! 660: Parse *pParse, /* Parser context */
! 661: SrcList *pTabList, /* List of tables */
! 662: ExprList *pEList /* Expressions defining the result set */
! 663: ){
! 664: Vdbe *v = pParse->pVdbe;
! 665: int i, j;
! 666: for(i=0; i<pEList->nExpr; i++){
! 667: Expr *p = pEList->a[i].pExpr;
! 668: char *zType = 0;
! 669: if( p==0 ) continue;
! 670: if( p->op==TK_COLUMN && pTabList ){
! 671: Table *pTab;
! 672: int iCol = p->iColumn;
! 673: for(j=0; j<pTabList->nSrc && pTabList->a[j].iCursor!=p->iTable; j++){}
! 674: assert( j<pTabList->nSrc );
! 675: pTab = pTabList->a[j].pTab;
! 676: if( iCol<0 ) iCol = pTab->iPKey;
! 677: assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );
! 678: if( iCol<0 ){
! 679: zType = "INTEGER";
! 680: }else{
! 681: zType = pTab->aCol[iCol].zType;
! 682: }
! 683: }else{
! 684: if( sqliteExprType(p)==SQLITE_SO_TEXT ){
! 685: zType = "TEXT";
! 686: }else{
! 687: zType = "NUMERIC";
! 688: }
! 689: }
! 690: sqliteVdbeOp3(v, OP_ColumnName, i + pEList->nExpr, 0, zType, 0);
! 691: }
! 692: }
! 693:
! 694: /*
! 695: ** Generate code that will tell the VDBE the names of columns
! 696: ** in the result set. This information is used to provide the
! 697: ** azCol[] values in the callback.
! 698: */
! 699: static void generateColumnNames(
! 700: Parse *pParse, /* Parser context */
! 701: SrcList *pTabList, /* List of tables */
! 702: ExprList *pEList /* Expressions defining the result set */
! 703: ){
! 704: Vdbe *v = pParse->pVdbe;
! 705: int i, j;
! 706: sqlite *db = pParse->db;
! 707: int fullNames, shortNames;
! 708:
! 709: assert( v!=0 );
! 710: if( pParse->colNamesSet || v==0 || sqlite_malloc_failed ) return;
! 711: pParse->colNamesSet = 1;
! 712: fullNames = (db->flags & SQLITE_FullColNames)!=0;
! 713: shortNames = (db->flags & SQLITE_ShortColNames)!=0;
! 714: for(i=0; i<pEList->nExpr; i++){
! 715: Expr *p;
! 716: int p2 = i==pEList->nExpr-1;
! 717: p = pEList->a[i].pExpr;
! 718: if( p==0 ) continue;
! 719: if( pEList->a[i].zName ){
! 720: char *zName = pEList->a[i].zName;
! 721: sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, 0);
! 722: continue;
! 723: }
! 724: if( p->op==TK_COLUMN && pTabList ){
! 725: Table *pTab;
! 726: char *zCol;
! 727: int iCol = p->iColumn;
! 728: for(j=0; j<pTabList->nSrc && pTabList->a[j].iCursor!=p->iTable; j++){}
! 729: assert( j<pTabList->nSrc );
! 730: pTab = pTabList->a[j].pTab;
! 731: if( iCol<0 ) iCol = pTab->iPKey;
! 732: assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) );
! 733: if( iCol<0 ){
! 734: zCol = "_ROWID_";
! 735: }else{
! 736: zCol = pTab->aCol[iCol].zName;
! 737: }
! 738: if( !shortNames && !fullNames && p->span.z && p->span.z[0] ){
! 739: int addr = sqliteVdbeOp3(v,OP_ColumnName, i, p2, p->span.z, p->span.n);
! 740: sqliteVdbeCompressSpace(v, addr);
! 741: }else if( fullNames || (!shortNames && pTabList->nSrc>1) ){
! 742: char *zName = 0;
! 743: char *zTab;
! 744:
! 745: zTab = pTabList->a[j].zAlias;
! 746: if( fullNames || zTab==0 ) zTab = pTab->zName;
! 747: sqliteSetString(&zName, zTab, ".", zCol, 0);
! 748: sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, P3_DYNAMIC);
! 749: }else{
! 750: sqliteVdbeOp3(v, OP_ColumnName, i, p2, zCol, 0);
! 751: }
! 752: }else if( p->span.z && p->span.z[0] ){
! 753: int addr = sqliteVdbeOp3(v,OP_ColumnName, i, p2, p->span.z, p->span.n);
! 754: sqliteVdbeCompressSpace(v, addr);
! 755: }else{
! 756: char zName[30];
! 757: assert( p->op!=TK_COLUMN || pTabList==0 );
! 758: sprintf(zName, "column%d", i+1);
! 759: sqliteVdbeOp3(v, OP_ColumnName, i, p2, zName, 0);
! 760: }
! 761: }
! 762: }
! 763:
! 764: /*
! 765: ** Name of the connection operator, used for error messages.
! 766: */
! 767: static const char *selectOpName(int id){
! 768: char *z;
! 769: switch( id ){
! 770: case TK_ALL: z = "UNION ALL"; break;
! 771: case TK_INTERSECT: z = "INTERSECT"; break;
! 772: case TK_EXCEPT: z = "EXCEPT"; break;
! 773: default: z = "UNION"; break;
! 774: }
! 775: return z;
! 776: }
! 777:
! 778: /*
! 779: ** Forward declaration
! 780: */
! 781: static int fillInColumnList(Parse*, Select*);
! 782:
! 783: /*
! 784: ** Given a SELECT statement, generate a Table structure that describes
! 785: ** the result set of that SELECT.
! 786: */
! 787: Table *sqliteResultSetOfSelect(Parse *pParse, char *zTabName, Select *pSelect){
! 788: Table *pTab;
! 789: int i, j;
! 790: ExprList *pEList;
! 791: Column *aCol;
! 792:
! 793: if( fillInColumnList(pParse, pSelect) ){
! 794: return 0;
! 795: }
! 796: pTab = sqliteMalloc( sizeof(Table) );
! 797: if( pTab==0 ){
! 798: return 0;
! 799: }
! 800: pTab->zName = zTabName ? sqliteStrDup(zTabName) : 0;
! 801: pEList = pSelect->pEList;
! 802: pTab->nCol = pEList->nExpr;
! 803: assert( pTab->nCol>0 );
! 804: pTab->aCol = aCol = sqliteMalloc( sizeof(pTab->aCol[0])*pTab->nCol );
! 805: for(i=0; i<pTab->nCol; i++){
! 806: Expr *p, *pR;
! 807: if( pEList->a[i].zName ){
! 808: aCol[i].zName = sqliteStrDup(pEList->a[i].zName);
! 809: }else if( (p=pEList->a[i].pExpr)->op==TK_DOT
! 810: && (pR=p->pRight)!=0 && pR->token.z && pR->token.z[0] ){
! 811: int cnt;
! 812: sqliteSetNString(&aCol[i].zName, pR->token.z, pR->token.n, 0);
! 813: for(j=cnt=0; j<i; j++){
! 814: if( sqliteStrICmp(aCol[j].zName, aCol[i].zName)==0 ){
! 815: int n;
! 816: char zBuf[30];
! 817: sprintf(zBuf,"_%d",++cnt);
! 818: n = strlen(zBuf);
! 819: sqliteSetNString(&aCol[i].zName, pR->token.z, pR->token.n, zBuf, n,0);
! 820: j = -1;
! 821: }
! 822: }
! 823: }else if( p->span.z && p->span.z[0] ){
! 824: sqliteSetNString(&pTab->aCol[i].zName, p->span.z, p->span.n, 0);
! 825: }else{
! 826: char zBuf[30];
! 827: sprintf(zBuf, "column%d", i+1);
! 828: aCol[i].zName = sqliteStrDup(zBuf);
! 829: }
! 830: sqliteDequote(aCol[i].zName);
! 831: }
! 832: pTab->iPKey = -1;
! 833: return pTab;
! 834: }
! 835:
! 836: /*
! 837: ** For the given SELECT statement, do three things.
! 838: **
! 839: ** (1) Fill in the pTabList->a[].pTab fields in the SrcList that
! 840: ** defines the set of tables that should be scanned. For views,
! 841: ** fill pTabList->a[].pSelect with a copy of the SELECT statement
! 842: ** that implements the view. A copy is made of the view's SELECT
! 843: ** statement so that we can freely modify or delete that statement
! 844: ** without worrying about messing up the presistent representation
! 845: ** of the view.
! 846: **
! 847: ** (2) Add terms to the WHERE clause to accomodate the NATURAL keyword
! 848: ** on joins and the ON and USING clause of joins.
! 849: **
! 850: ** (3) Scan the list of columns in the result set (pEList) looking
! 851: ** for instances of the "*" operator or the TABLE.* operator.
! 852: ** If found, expand each "*" to be every column in every table
! 853: ** and TABLE.* to be every column in TABLE.
! 854: **
! 855: ** Return 0 on success. If there are problems, leave an error message
! 856: ** in pParse and return non-zero.
! 857: */
! 858: static int fillInColumnList(Parse *pParse, Select *p){
! 859: int i, j, k, rc;
! 860: SrcList *pTabList;
! 861: ExprList *pEList;
! 862: Table *pTab;
! 863:
! 864: if( p==0 || p->pSrc==0 ) return 1;
! 865: pTabList = p->pSrc;
! 866: pEList = p->pEList;
! 867:
! 868: /* Look up every table in the table list.
! 869: */
! 870: for(i=0; i<pTabList->nSrc; i++){
! 871: if( pTabList->a[i].pTab ){
! 872: /* This routine has run before! No need to continue */
! 873: return 0;
! 874: }
! 875: if( pTabList->a[i].zName==0 ){
! 876: /* A sub-query in the FROM clause of a SELECT */
! 877: assert( pTabList->a[i].pSelect!=0 );
! 878: if( pTabList->a[i].zAlias==0 ){
! 879: char zFakeName[60];
! 880: sprintf(zFakeName, "sqlite_subquery_%p_",
! 881: (void*)pTabList->a[i].pSelect);
! 882: sqliteSetString(&pTabList->a[i].zAlias, zFakeName, 0);
! 883: }
! 884: pTabList->a[i].pTab = pTab =
! 885: sqliteResultSetOfSelect(pParse, pTabList->a[i].zAlias,
! 886: pTabList->a[i].pSelect);
! 887: if( pTab==0 ){
! 888: return 1;
! 889: }
! 890: /* The isTransient flag indicates that the Table structure has been
! 891: ** dynamically allocated and may be freed at any time. In other words,
! 892: ** pTab is not pointing to a persistent table structure that defines
! 893: ** part of the schema. */
! 894: pTab->isTransient = 1;
! 895: }else{
! 896: /* An ordinary table or view name in the FROM clause */
! 897: pTabList->a[i].pTab = pTab =
! 898: sqliteLocateTable(pParse,pTabList->a[i].zName,pTabList->a[i].zDatabase);
! 899: if( pTab==0 ){
! 900: return 1;
! 901: }
! 902: if( pTab->pSelect ){
! 903: /* We reach here if the named table is a really a view */
! 904: if( sqliteViewGetColumnNames(pParse, pTab) ){
! 905: return 1;
! 906: }
! 907: /* If pTabList->a[i].pSelect!=0 it means we are dealing with a
! 908: ** view within a view. The SELECT structure has already been
! 909: ** copied by the outer view so we can skip the copy step here
! 910: ** in the inner view.
! 911: */
! 912: if( pTabList->a[i].pSelect==0 ){
! 913: pTabList->a[i].pSelect = sqliteSelectDup(pTab->pSelect);
! 914: }
! 915: }
! 916: }
! 917: }
! 918:
! 919: /* Process NATURAL keywords, and ON and USING clauses of joins.
! 920: */
! 921: if( sqliteProcessJoin(pParse, p) ) return 1;
! 922:
! 923: /* For every "*" that occurs in the column list, insert the names of
! 924: ** all columns in all tables. And for every TABLE.* insert the names
! 925: ** of all columns in TABLE. The parser inserted a special expression
! 926: ** with the TK_ALL operator for each "*" that it found in the column list.
! 927: ** The following code just has to locate the TK_ALL expressions and expand
! 928: ** each one to the list of all columns in all tables.
! 929: **
! 930: ** The first loop just checks to see if there are any "*" operators
! 931: ** that need expanding.
! 932: */
! 933: for(k=0; k<pEList->nExpr; k++){
! 934: Expr *pE = pEList->a[k].pExpr;
! 935: if( pE->op==TK_ALL ) break;
! 936: if( pE->op==TK_DOT && pE->pRight && pE->pRight->op==TK_ALL
! 937: && pE->pLeft && pE->pLeft->op==TK_ID ) break;
! 938: }
! 939: rc = 0;
! 940: if( k<pEList->nExpr ){
! 941: /*
! 942: ** If we get here it means the result set contains one or more "*"
! 943: ** operators that need to be expanded. Loop through each expression
! 944: ** in the result set and expand them one by one.
! 945: */
! 946: struct ExprList_item *a = pEList->a;
! 947: ExprList *pNew = 0;
! 948: for(k=0; k<pEList->nExpr; k++){
! 949: Expr *pE = a[k].pExpr;
! 950: if( pE->op!=TK_ALL &&
! 951: (pE->op!=TK_DOT || pE->pRight==0 || pE->pRight->op!=TK_ALL) ){
! 952: /* This particular expression does not need to be expanded.
! 953: */
! 954: pNew = sqliteExprListAppend(pNew, a[k].pExpr, 0);
! 955: pNew->a[pNew->nExpr-1].zName = a[k].zName;
! 956: a[k].pExpr = 0;
! 957: a[k].zName = 0;
! 958: }else{
! 959: /* This expression is a "*" or a "TABLE.*" and needs to be
! 960: ** expanded. */
! 961: int tableSeen = 0; /* Set to 1 when TABLE matches */
! 962: char *zTName; /* text of name of TABLE */
! 963: if( pE->op==TK_DOT && pE->pLeft ){
! 964: zTName = sqliteTableNameFromToken(&pE->pLeft->token);
! 965: }else{
! 966: zTName = 0;
! 967: }
! 968: for(i=0; i<pTabList->nSrc; i++){
! 969: Table *pTab = pTabList->a[i].pTab;
! 970: char *zTabName = pTabList->a[i].zAlias;
! 971: if( zTabName==0 || zTabName[0]==0 ){
! 972: zTabName = pTab->zName;
! 973: }
! 974: if( zTName && (zTabName==0 || zTabName[0]==0 ||
! 975: sqliteStrICmp(zTName, zTabName)!=0) ){
! 976: continue;
! 977: }
! 978: tableSeen = 1;
! 979: for(j=0; j<pTab->nCol; j++){
! 980: Expr *pExpr, *pLeft, *pRight;
! 981: char *zName = pTab->aCol[j].zName;
! 982:
! 983: if( i>0 && (pTabList->a[i-1].jointype & JT_NATURAL)!=0 &&
! 984: columnIndex(pTabList->a[i-1].pTab, zName)>=0 ){
! 985: /* In a NATURAL join, omit the join columns from the
! 986: ** table on the right */
! 987: continue;
! 988: }
! 989: if( i>0 && sqliteIdListIndex(pTabList->a[i-1].pUsing, zName)>=0 ){
! 990: /* In a join with a USING clause, omit columns in the
! 991: ** using clause from the table on the right. */
! 992: continue;
! 993: }
! 994: pRight = sqliteExpr(TK_ID, 0, 0, 0);
! 995: if( pRight==0 ) break;
! 996: pRight->token.z = zName;
! 997: pRight->token.n = strlen(zName);
! 998: pRight->token.dyn = 0;
! 999: if( zTabName && pTabList->nSrc>1 ){
! 1000: pLeft = sqliteExpr(TK_ID, 0, 0, 0);
! 1001: pExpr = sqliteExpr(TK_DOT, pLeft, pRight, 0);
! 1002: if( pExpr==0 ) break;
! 1003: pLeft->token.z = zTabName;
! 1004: pLeft->token.n = strlen(zTabName);
! 1005: pLeft->token.dyn = 0;
! 1006: sqliteSetString((char**)&pExpr->span.z, zTabName, ".", zName, 0);
! 1007: pExpr->span.n = strlen(pExpr->span.z);
! 1008: pExpr->span.dyn = 1;
! 1009: pExpr->token.z = 0;
! 1010: pExpr->token.n = 0;
! 1011: pExpr->token.dyn = 0;
! 1012: }else{
! 1013: pExpr = pRight;
! 1014: pExpr->span = pExpr->token;
! 1015: }
! 1016: pNew = sqliteExprListAppend(pNew, pExpr, 0);
! 1017: }
! 1018: }
! 1019: if( !tableSeen ){
! 1020: if( zTName ){
! 1021: sqliteErrorMsg(pParse, "no such table: %s", zTName);
! 1022: }else{
! 1023: sqliteErrorMsg(pParse, "no tables specified");
! 1024: }
! 1025: rc = 1;
! 1026: }
! 1027: sqliteFree(zTName);
! 1028: }
! 1029: }
! 1030: sqliteExprListDelete(pEList);
! 1031: p->pEList = pNew;
! 1032: }
! 1033: return rc;
! 1034: }
! 1035:
! 1036: /*
! 1037: ** This routine recursively unlinks the Select.pSrc.a[].pTab pointers
! 1038: ** in a select structure. It just sets the pointers to NULL. This
! 1039: ** routine is recursive in the sense that if the Select.pSrc.a[].pSelect
! 1040: ** pointer is not NULL, this routine is called recursively on that pointer.
! 1041: **
! 1042: ** This routine is called on the Select structure that defines a
! 1043: ** VIEW in order to undo any bindings to tables. This is necessary
! 1044: ** because those tables might be DROPed by a subsequent SQL command.
! 1045: ** If the bindings are not removed, then the Select.pSrc->a[].pTab field
! 1046: ** will be left pointing to a deallocated Table structure after the
! 1047: ** DROP and a coredump will occur the next time the VIEW is used.
! 1048: */
! 1049: void sqliteSelectUnbind(Select *p){
! 1050: int i;
! 1051: SrcList *pSrc = p->pSrc;
! 1052: Table *pTab;
! 1053: if( p==0 ) return;
! 1054: for(i=0; i<pSrc->nSrc; i++){
! 1055: if( (pTab = pSrc->a[i].pTab)!=0 ){
! 1056: if( pTab->isTransient ){
! 1057: sqliteDeleteTable(0, pTab);
! 1058: }
! 1059: pSrc->a[i].pTab = 0;
! 1060: if( pSrc->a[i].pSelect ){
! 1061: sqliteSelectUnbind(pSrc->a[i].pSelect);
! 1062: }
! 1063: }
! 1064: }
! 1065: }
! 1066:
! 1067: /*
! 1068: ** This routine associates entries in an ORDER BY expression list with
! 1069: ** columns in a result. For each ORDER BY expression, the opcode of
! 1070: ** the top-level node is changed to TK_COLUMN and the iColumn value of
! 1071: ** the top-level node is filled in with column number and the iTable
! 1072: ** value of the top-level node is filled with iTable parameter.
! 1073: **
! 1074: ** If there are prior SELECT clauses, they are processed first. A match
! 1075: ** in an earlier SELECT takes precedence over a later SELECT.
! 1076: **
! 1077: ** Any entry that does not match is flagged as an error. The number
! 1078: ** of errors is returned.
! 1079: **
! 1080: ** This routine does NOT correctly initialize the Expr.dataType field
! 1081: ** of the ORDER BY expressions. The multiSelectSortOrder() routine
! 1082: ** must be called to do that after the individual select statements
! 1083: ** have all been analyzed. This routine is unable to compute Expr.dataType
! 1084: ** because it must be called before the individual select statements
! 1085: ** have been analyzed.
! 1086: */
! 1087: static int matchOrderbyToColumn(
! 1088: Parse *pParse, /* A place to leave error messages */
! 1089: Select *pSelect, /* Match to result columns of this SELECT */
! 1090: ExprList *pOrderBy, /* The ORDER BY values to match against columns */
! 1091: int iTable, /* Insert this value in iTable */
! 1092: int mustComplete /* If TRUE all ORDER BYs must match */
! 1093: ){
! 1094: int nErr = 0;
! 1095: int i, j;
! 1096: ExprList *pEList;
! 1097:
! 1098: if( pSelect==0 || pOrderBy==0 ) return 1;
! 1099: if( mustComplete ){
! 1100: for(i=0; i<pOrderBy->nExpr; i++){ pOrderBy->a[i].done = 0; }
! 1101: }
! 1102: if( fillInColumnList(pParse, pSelect) ){
! 1103: return 1;
! 1104: }
! 1105: if( pSelect->pPrior ){
! 1106: if( matchOrderbyToColumn(pParse, pSelect->pPrior, pOrderBy, iTable, 0) ){
! 1107: return 1;
! 1108: }
! 1109: }
! 1110: pEList = pSelect->pEList;
! 1111: for(i=0; i<pOrderBy->nExpr; i++){
! 1112: Expr *pE = pOrderBy->a[i].pExpr;
! 1113: int iCol = -1;
! 1114: if( pOrderBy->a[i].done ) continue;
! 1115: if( sqliteExprIsInteger(pE, &iCol) ){
! 1116: if( iCol<=0 || iCol>pEList->nExpr ){
! 1117: sqliteErrorMsg(pParse,
! 1118: "ORDER BY position %d should be between 1 and %d",
! 1119: iCol, pEList->nExpr);
! 1120: nErr++;
! 1121: break;
! 1122: }
! 1123: if( !mustComplete ) continue;
! 1124: iCol--;
! 1125: }
! 1126: for(j=0; iCol<0 && j<pEList->nExpr; j++){
! 1127: if( pEList->a[j].zName && (pE->op==TK_ID || pE->op==TK_STRING) ){
! 1128: char *zName, *zLabel;
! 1129: zName = pEList->a[j].zName;
! 1130: assert( pE->token.z );
! 1131: zLabel = sqliteStrNDup(pE->token.z, pE->token.n);
! 1132: sqliteDequote(zLabel);
! 1133: if( sqliteStrICmp(zName, zLabel)==0 ){
! 1134: iCol = j;
! 1135: }
! 1136: sqliteFree(zLabel);
! 1137: }
! 1138: if( iCol<0 && sqliteExprCompare(pE, pEList->a[j].pExpr) ){
! 1139: iCol = j;
! 1140: }
! 1141: }
! 1142: if( iCol>=0 ){
! 1143: pE->op = TK_COLUMN;
! 1144: pE->iColumn = iCol;
! 1145: pE->iTable = iTable;
! 1146: pOrderBy->a[i].done = 1;
! 1147: }
! 1148: if( iCol<0 && mustComplete ){
! 1149: sqliteErrorMsg(pParse,
! 1150: "ORDER BY term number %d does not match any result column", i+1);
! 1151: nErr++;
! 1152: break;
! 1153: }
! 1154: }
! 1155: return nErr;
! 1156: }
! 1157:
! 1158: /*
! 1159: ** Get a VDBE for the given parser context. Create a new one if necessary.
! 1160: ** If an error occurs, return NULL and leave a message in pParse.
! 1161: */
! 1162: Vdbe *sqliteGetVdbe(Parse *pParse){
! 1163: Vdbe *v = pParse->pVdbe;
! 1164: if( v==0 ){
! 1165: v = pParse->pVdbe = sqliteVdbeCreate(pParse->db);
! 1166: }
! 1167: return v;
! 1168: }
! 1169:
! 1170: /*
! 1171: ** This routine sets the Expr.dataType field on all elements of
! 1172: ** the pOrderBy expression list. The pOrderBy list will have been
! 1173: ** set up by matchOrderbyToColumn(). Hence each expression has
! 1174: ** a TK_COLUMN as its root node. The Expr.iColumn refers to a
! 1175: ** column in the result set. The datatype is set to SQLITE_SO_TEXT
! 1176: ** if the corresponding column in p and every SELECT to the left of
! 1177: ** p has a datatype of SQLITE_SO_TEXT. If the cooressponding column
! 1178: ** in p or any of the left SELECTs is SQLITE_SO_NUM, then the datatype
! 1179: ** of the order-by expression is set to SQLITE_SO_NUM.
! 1180: **
! 1181: ** Examples:
! 1182: **
! 1183: ** CREATE TABLE one(a INTEGER, b TEXT);
! 1184: ** CREATE TABLE two(c VARCHAR(5), d FLOAT);
! 1185: **
! 1186: ** SELECT b, b FROM one UNION SELECT d, c FROM two ORDER BY 1, 2;
! 1187: **
! 1188: ** The primary sort key will use SQLITE_SO_NUM because the "d" in
! 1189: ** the second SELECT is numeric. The 1st column of the first SELECT
! 1190: ** is text but that does not matter because a numeric always overrides
! 1191: ** a text.
! 1192: **
! 1193: ** The secondary key will use the SQLITE_SO_TEXT sort order because
! 1194: ** both the (second) "b" in the first SELECT and the "c" in the second
! 1195: ** SELECT have a datatype of text.
! 1196: */
! 1197: static void multiSelectSortOrder(Select *p, ExprList *pOrderBy){
! 1198: int i;
! 1199: ExprList *pEList;
! 1200: if( pOrderBy==0 ) return;
! 1201: if( p==0 ){
! 1202: for(i=0; i<pOrderBy->nExpr; i++){
! 1203: pOrderBy->a[i].pExpr->dataType = SQLITE_SO_TEXT;
! 1204: }
! 1205: return;
! 1206: }
! 1207: multiSelectSortOrder(p->pPrior, pOrderBy);
! 1208: pEList = p->pEList;
! 1209: for(i=0; i<pOrderBy->nExpr; i++){
! 1210: Expr *pE = pOrderBy->a[i].pExpr;
! 1211: if( pE->dataType==SQLITE_SO_NUM ) continue;
! 1212: assert( pE->iColumn>=0 );
! 1213: if( pEList->nExpr>pE->iColumn ){
! 1214: pE->dataType = sqliteExprType(pEList->a[pE->iColumn].pExpr);
! 1215: }
! 1216: }
! 1217: }
! 1218:
! 1219: /*
! 1220: ** Compute the iLimit and iOffset fields of the SELECT based on the
! 1221: ** nLimit and nOffset fields. nLimit and nOffset hold the integers
! 1222: ** that appear in the original SQL statement after the LIMIT and OFFSET
! 1223: ** keywords. Or that hold -1 and 0 if those keywords are omitted.
! 1224: ** iLimit and iOffset are the integer memory register numbers for
! 1225: ** counters used to compute the limit and offset. If there is no
! 1226: ** limit and/or offset, then iLimit and iOffset are negative.
! 1227: **
! 1228: ** This routine changes the values if iLimit and iOffset only if
! 1229: ** a limit or offset is defined by nLimit and nOffset. iLimit and
! 1230: ** iOffset should have been preset to appropriate default values
! 1231: ** (usually but not always -1) prior to calling this routine.
! 1232: ** Only if nLimit>=0 or nOffset>0 do the limit registers get
! 1233: ** redefined. The UNION ALL operator uses this property to force
! 1234: ** the reuse of the same limit and offset registers across multiple
! 1235: ** SELECT statements.
! 1236: */
! 1237: static void computeLimitRegisters(Parse *pParse, Select *p){
! 1238: /*
! 1239: ** If the comparison is p->nLimit>0 then "LIMIT 0" shows
! 1240: ** all rows. It is the same as no limit. If the comparision is
! 1241: ** p->nLimit>=0 then "LIMIT 0" show no rows at all.
! 1242: ** "LIMIT -1" always shows all rows. There is some
! 1243: ** contraversy about what the correct behavior should be.
! 1244: ** The current implementation interprets "LIMIT 0" to mean
! 1245: ** no rows.
! 1246: */
! 1247: if( p->nLimit>=0 ){
! 1248: int iMem = pParse->nMem++;
! 1249: Vdbe *v = sqliteGetVdbe(pParse);
! 1250: if( v==0 ) return;
! 1251: sqliteVdbeAddOp(v, OP_Integer, -p->nLimit, 0);
! 1252: sqliteVdbeAddOp(v, OP_MemStore, iMem, 1);
! 1253: p->iLimit = iMem;
! 1254: }
! 1255: if( p->nOffset>0 ){
! 1256: int iMem = pParse->nMem++;
! 1257: Vdbe *v = sqliteGetVdbe(pParse);
! 1258: if( v==0 ) return;
! 1259: sqliteVdbeAddOp(v, OP_Integer, -p->nOffset, 0);
! 1260: sqliteVdbeAddOp(v, OP_MemStore, iMem, 1);
! 1261: p->iOffset = iMem;
! 1262: }
! 1263: }
! 1264:
! 1265: /*
! 1266: ** This routine is called to process a query that is really the union
! 1267: ** or intersection of two or more separate queries.
! 1268: **
! 1269: ** "p" points to the right-most of the two queries. the query on the
! 1270: ** left is p->pPrior. The left query could also be a compound query
! 1271: ** in which case this routine will be called recursively.
! 1272: **
! 1273: ** The results of the total query are to be written into a destination
! 1274: ** of type eDest with parameter iParm.
! 1275: **
! 1276: ** Example 1: Consider a three-way compound SQL statement.
! 1277: **
! 1278: ** SELECT a FROM t1 UNION SELECT b FROM t2 UNION SELECT c FROM t3
! 1279: **
! 1280: ** This statement is parsed up as follows:
! 1281: **
! 1282: ** SELECT c FROM t3
! 1283: ** |
! 1284: ** `-----> SELECT b FROM t2
! 1285: ** |
! 1286: ** `------> SELECT a FROM t1
! 1287: **
! 1288: ** The arrows in the diagram above represent the Select.pPrior pointer.
! 1289: ** So if this routine is called with p equal to the t3 query, then
! 1290: ** pPrior will be the t2 query. p->op will be TK_UNION in this case.
! 1291: **
! 1292: ** Notice that because of the way SQLite parses compound SELECTs, the
! 1293: ** individual selects always group from left to right.
! 1294: */
! 1295: static int multiSelect(Parse *pParse, Select *p, int eDest, int iParm){
! 1296: int rc; /* Success code from a subroutine */
! 1297: Select *pPrior; /* Another SELECT immediately to our left */
! 1298: Vdbe *v; /* Generate code to this VDBE */
! 1299:
! 1300: /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only
! 1301: ** the last SELECT in the series may have an ORDER BY or LIMIT.
! 1302: */
! 1303: if( p==0 || p->pPrior==0 ) return 1;
! 1304: pPrior = p->pPrior;
! 1305: if( pPrior->pOrderBy ){
! 1306: sqliteErrorMsg(pParse,"ORDER BY clause should come after %s not before",
! 1307: selectOpName(p->op));
! 1308: return 1;
! 1309: }
! 1310: if( pPrior->nLimit>=0 || pPrior->nOffset>0 ){
! 1311: sqliteErrorMsg(pParse,"LIMIT clause should come after %s not before",
! 1312: selectOpName(p->op));
! 1313: return 1;
! 1314: }
! 1315:
! 1316: /* Make sure we have a valid query engine. If not, create a new one.
! 1317: */
! 1318: v = sqliteGetVdbe(pParse);
! 1319: if( v==0 ) return 1;
! 1320:
! 1321: /* Create the destination temporary table if necessary
! 1322: */
! 1323: if( eDest==SRT_TempTable ){
! 1324: sqliteVdbeAddOp(v, OP_OpenTemp, iParm, 0);
! 1325: eDest = SRT_Table;
! 1326: }
! 1327:
! 1328: /* Generate code for the left and right SELECT statements.
! 1329: */
! 1330: switch( p->op ){
! 1331: case TK_ALL: {
! 1332: if( p->pOrderBy==0 ){
! 1333: pPrior->nLimit = p->nLimit;
! 1334: pPrior->nOffset = p->nOffset;
! 1335: rc = sqliteSelect(pParse, pPrior, eDest, iParm, 0, 0, 0);
! 1336: if( rc ) return rc;
! 1337: p->pPrior = 0;
! 1338: p->iLimit = pPrior->iLimit;
! 1339: p->iOffset = pPrior->iOffset;
! 1340: p->nLimit = -1;
! 1341: p->nOffset = 0;
! 1342: rc = sqliteSelect(pParse, p, eDest, iParm, 0, 0, 0);
! 1343: p->pPrior = pPrior;
! 1344: if( rc ) return rc;
! 1345: break;
! 1346: }
! 1347: /* For UNION ALL ... ORDER BY fall through to the next case */
! 1348: }
! 1349: case TK_EXCEPT:
! 1350: case TK_UNION: {
! 1351: int unionTab; /* Cursor number of the temporary table holding result */
! 1352: int op; /* One of the SRT_ operations to apply to self */
! 1353: int priorOp; /* The SRT_ operation to apply to prior selects */
! 1354: int nLimit, nOffset; /* Saved values of p->nLimit and p->nOffset */
! 1355: ExprList *pOrderBy; /* The ORDER BY clause for the right SELECT */
! 1356:
! 1357: priorOp = p->op==TK_ALL ? SRT_Table : SRT_Union;
! 1358: if( eDest==priorOp && p->pOrderBy==0 && p->nLimit<0 && p->nOffset==0 ){
! 1359: /* We can reuse a temporary table generated by a SELECT to our
! 1360: ** right.
! 1361: */
! 1362: unionTab = iParm;
! 1363: }else{
! 1364: /* We will need to create our own temporary table to hold the
! 1365: ** intermediate results.
! 1366: */
! 1367: unionTab = pParse->nTab++;
! 1368: if( p->pOrderBy
! 1369: && matchOrderbyToColumn(pParse, p, p->pOrderBy, unionTab, 1) ){
! 1370: return 1;
! 1371: }
! 1372: if( p->op!=TK_ALL ){
! 1373: sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 1);
! 1374: sqliteVdbeAddOp(v, OP_KeyAsData, unionTab, 1);
! 1375: }else{
! 1376: sqliteVdbeAddOp(v, OP_OpenTemp, unionTab, 0);
! 1377: }
! 1378: }
! 1379:
! 1380: /* Code the SELECT statements to our left
! 1381: */
! 1382: rc = sqliteSelect(pParse, pPrior, priorOp, unionTab, 0, 0, 0);
! 1383: if( rc ) return rc;
! 1384:
! 1385: /* Code the current SELECT statement
! 1386: */
! 1387: switch( p->op ){
! 1388: case TK_EXCEPT: op = SRT_Except; break;
! 1389: case TK_UNION: op = SRT_Union; break;
! 1390: case TK_ALL: op = SRT_Table; break;
! 1391: }
! 1392: p->pPrior = 0;
! 1393: pOrderBy = p->pOrderBy;
! 1394: p->pOrderBy = 0;
! 1395: nLimit = p->nLimit;
! 1396: p->nLimit = -1;
! 1397: nOffset = p->nOffset;
! 1398: p->nOffset = 0;
! 1399: rc = sqliteSelect(pParse, p, op, unionTab, 0, 0, 0);
! 1400: p->pPrior = pPrior;
! 1401: p->pOrderBy = pOrderBy;
! 1402: p->nLimit = nLimit;
! 1403: p->nOffset = nOffset;
! 1404: if( rc ) return rc;
! 1405:
! 1406: /* Convert the data in the temporary table into whatever form
! 1407: ** it is that we currently need.
! 1408: */
! 1409: if( eDest!=priorOp || unionTab!=iParm ){
! 1410: int iCont, iBreak, iStart;
! 1411: assert( p->pEList );
! 1412: if( eDest==SRT_Callback ){
! 1413: generateColumnNames(pParse, 0, p->pEList);
! 1414: generateColumnTypes(pParse, p->pSrc, p->pEList);
! 1415: }
! 1416: iBreak = sqliteVdbeMakeLabel(v);
! 1417: iCont = sqliteVdbeMakeLabel(v);
! 1418: sqliteVdbeAddOp(v, OP_Rewind, unionTab, iBreak);
! 1419: computeLimitRegisters(pParse, p);
! 1420: iStart = sqliteVdbeCurrentAddr(v);
! 1421: multiSelectSortOrder(p, p->pOrderBy);
! 1422: rc = selectInnerLoop(pParse, p, p->pEList, unionTab, p->pEList->nExpr,
! 1423: p->pOrderBy, -1, eDest, iParm,
! 1424: iCont, iBreak);
! 1425: if( rc ) return 1;
! 1426: sqliteVdbeResolveLabel(v, iCont);
! 1427: sqliteVdbeAddOp(v, OP_Next, unionTab, iStart);
! 1428: sqliteVdbeResolveLabel(v, iBreak);
! 1429: sqliteVdbeAddOp(v, OP_Close, unionTab, 0);
! 1430: if( p->pOrderBy ){
! 1431: generateSortTail(p, v, p->pEList->nExpr, eDest, iParm);
! 1432: }
! 1433: }
! 1434: break;
! 1435: }
! 1436: case TK_INTERSECT: {
! 1437: int tab1, tab2;
! 1438: int iCont, iBreak, iStart;
! 1439: int nLimit, nOffset;
! 1440:
! 1441: /* INTERSECT is different from the others since it requires
! 1442: ** two temporary tables. Hence it has its own case. Begin
! 1443: ** by allocating the tables we will need.
! 1444: */
! 1445: tab1 = pParse->nTab++;
! 1446: tab2 = pParse->nTab++;
! 1447: if( p->pOrderBy && matchOrderbyToColumn(pParse,p,p->pOrderBy,tab1,1) ){
! 1448: return 1;
! 1449: }
! 1450: sqliteVdbeAddOp(v, OP_OpenTemp, tab1, 1);
! 1451: sqliteVdbeAddOp(v, OP_KeyAsData, tab1, 1);
! 1452:
! 1453: /* Code the SELECTs to our left into temporary table "tab1".
! 1454: */
! 1455: rc = sqliteSelect(pParse, pPrior, SRT_Union, tab1, 0, 0, 0);
! 1456: if( rc ) return rc;
! 1457:
! 1458: /* Code the current SELECT into temporary table "tab2"
! 1459: */
! 1460: sqliteVdbeAddOp(v, OP_OpenTemp, tab2, 1);
! 1461: sqliteVdbeAddOp(v, OP_KeyAsData, tab2, 1);
! 1462: p->pPrior = 0;
! 1463: nLimit = p->nLimit;
! 1464: p->nLimit = -1;
! 1465: nOffset = p->nOffset;
! 1466: p->nOffset = 0;
! 1467: rc = sqliteSelect(pParse, p, SRT_Union, tab2, 0, 0, 0);
! 1468: p->pPrior = pPrior;
! 1469: p->nLimit = nLimit;
! 1470: p->nOffset = nOffset;
! 1471: if( rc ) return rc;
! 1472:
! 1473: /* Generate code to take the intersection of the two temporary
! 1474: ** tables.
! 1475: */
! 1476: assert( p->pEList );
! 1477: if( eDest==SRT_Callback ){
! 1478: generateColumnNames(pParse, 0, p->pEList);
! 1479: generateColumnTypes(pParse, p->pSrc, p->pEList);
! 1480: }
! 1481: iBreak = sqliteVdbeMakeLabel(v);
! 1482: iCont = sqliteVdbeMakeLabel(v);
! 1483: sqliteVdbeAddOp(v, OP_Rewind, tab1, iBreak);
! 1484: computeLimitRegisters(pParse, p);
! 1485: iStart = sqliteVdbeAddOp(v, OP_FullKey, tab1, 0);
! 1486: sqliteVdbeAddOp(v, OP_NotFound, tab2, iCont);
! 1487: multiSelectSortOrder(p, p->pOrderBy);
! 1488: rc = selectInnerLoop(pParse, p, p->pEList, tab1, p->pEList->nExpr,
! 1489: p->pOrderBy, -1, eDest, iParm,
! 1490: iCont, iBreak);
! 1491: if( rc ) return 1;
! 1492: sqliteVdbeResolveLabel(v, iCont);
! 1493: sqliteVdbeAddOp(v, OP_Next, tab1, iStart);
! 1494: sqliteVdbeResolveLabel(v, iBreak);
! 1495: sqliteVdbeAddOp(v, OP_Close, tab2, 0);
! 1496: sqliteVdbeAddOp(v, OP_Close, tab1, 0);
! 1497: if( p->pOrderBy ){
! 1498: generateSortTail(p, v, p->pEList->nExpr, eDest, iParm);
! 1499: }
! 1500: break;
! 1501: }
! 1502: }
! 1503: assert( p->pEList && pPrior->pEList );
! 1504: if( p->pEList->nExpr!=pPrior->pEList->nExpr ){
! 1505: sqliteErrorMsg(pParse, "SELECTs to the left and right of %s"
! 1506: " do not have the same number of result columns", selectOpName(p->op));
! 1507: return 1;
! 1508: }
! 1509: return 0;
! 1510: }
! 1511:
! 1512: /*
! 1513: ** Scan through the expression pExpr. Replace every reference to
! 1514: ** a column in table number iTable with a copy of the iColumn-th
! 1515: ** entry in pEList. (But leave references to the ROWID column
! 1516: ** unchanged.)
! 1517: **
! 1518: ** This routine is part of the flattening procedure. A subquery
! 1519: ** whose result set is defined by pEList appears as entry in the
! 1520: ** FROM clause of a SELECT such that the VDBE cursor assigned to that
! 1521: ** FORM clause entry is iTable. This routine make the necessary
! 1522: ** changes to pExpr so that it refers directly to the source table
! 1523: ** of the subquery rather the result set of the subquery.
! 1524: */
! 1525: static void substExprList(ExprList*,int,ExprList*); /* Forward Decl */
! 1526: static void substExpr(Expr *pExpr, int iTable, ExprList *pEList){
! 1527: if( pExpr==0 ) return;
! 1528: if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){
! 1529: if( pExpr->iColumn<0 ){
! 1530: pExpr->op = TK_NULL;
! 1531: }else{
! 1532: Expr *pNew;
! 1533: assert( pEList!=0 && pExpr->iColumn<pEList->nExpr );
! 1534: assert( pExpr->pLeft==0 && pExpr->pRight==0 && pExpr->pList==0 );
! 1535: pNew = pEList->a[pExpr->iColumn].pExpr;
! 1536: assert( pNew!=0 );
! 1537: pExpr->op = pNew->op;
! 1538: pExpr->dataType = pNew->dataType;
! 1539: assert( pExpr->pLeft==0 );
! 1540: pExpr->pLeft = sqliteExprDup(pNew->pLeft);
! 1541: assert( pExpr->pRight==0 );
! 1542: pExpr->pRight = sqliteExprDup(pNew->pRight);
! 1543: assert( pExpr->pList==0 );
! 1544: pExpr->pList = sqliteExprListDup(pNew->pList);
! 1545: pExpr->iTable = pNew->iTable;
! 1546: pExpr->iColumn = pNew->iColumn;
! 1547: pExpr->iAgg = pNew->iAgg;
! 1548: sqliteTokenCopy(&pExpr->token, &pNew->token);
! 1549: sqliteTokenCopy(&pExpr->span, &pNew->span);
! 1550: }
! 1551: }else{
! 1552: substExpr(pExpr->pLeft, iTable, pEList);
! 1553: substExpr(pExpr->pRight, iTable, pEList);
! 1554: substExprList(pExpr->pList, iTable, pEList);
! 1555: }
! 1556: }
! 1557: static void
! 1558: substExprList(ExprList *pList, int iTable, ExprList *pEList){
! 1559: int i;
! 1560: if( pList==0 ) return;
! 1561: for(i=0; i<pList->nExpr; i++){
! 1562: substExpr(pList->a[i].pExpr, iTable, pEList);
! 1563: }
! 1564: }
! 1565:
! 1566: /*
! 1567: ** This routine attempts to flatten subqueries in order to speed
! 1568: ** execution. It returns 1 if it makes changes and 0 if no flattening
! 1569: ** occurs.
! 1570: **
! 1571: ** To understand the concept of flattening, consider the following
! 1572: ** query:
! 1573: **
! 1574: ** SELECT a FROM (SELECT x+y AS a FROM t1 WHERE z<100) WHERE a>5
! 1575: **
! 1576: ** The default way of implementing this query is to execute the
! 1577: ** subquery first and store the results in a temporary table, then
! 1578: ** run the outer query on that temporary table. This requires two
! 1579: ** passes over the data. Furthermore, because the temporary table
! 1580: ** has no indices, the WHERE clause on the outer query cannot be
! 1581: ** optimized.
! 1582: **
! 1583: ** This routine attempts to rewrite queries such as the above into
! 1584: ** a single flat select, like this:
! 1585: **
! 1586: ** SELECT x+y AS a FROM t1 WHERE z<100 AND a>5
! 1587: **
! 1588: ** The code generated for this simpification gives the same result
! 1589: ** but only has to scan the data once. And because indices might
! 1590: ** exist on the table t1, a complete scan of the data might be
! 1591: ** avoided.
! 1592: **
! 1593: ** Flattening is only attempted if all of the following are true:
! 1594: **
! 1595: ** (1) The subquery and the outer query do not both use aggregates.
! 1596: **
! 1597: ** (2) The subquery is not an aggregate or the outer query is not a join.
! 1598: **
! 1599: ** (3) The subquery is not the right operand of a left outer join, or
! 1600: ** the subquery is not itself a join. (Ticket #306)
! 1601: **
! 1602: ** (4) The subquery is not DISTINCT or the outer query is not a join.
! 1603: **
! 1604: ** (5) The subquery is not DISTINCT or the outer query does not use
! 1605: ** aggregates.
! 1606: **
! 1607: ** (6) The subquery does not use aggregates or the outer query is not
! 1608: ** DISTINCT.
! 1609: **
! 1610: ** (7) The subquery has a FROM clause.
! 1611: **
! 1612: ** (8) The subquery does not use LIMIT or the outer query is not a join.
! 1613: **
! 1614: ** (9) The subquery does not use LIMIT or the outer query does not use
! 1615: ** aggregates.
! 1616: **
! 1617: ** (10) The subquery does not use aggregates or the outer query does not
! 1618: ** use LIMIT.
! 1619: **
! 1620: ** (11) The subquery and the outer query do not both have ORDER BY clauses.
! 1621: **
! 1622: ** (12) The subquery is not the right term of a LEFT OUTER JOIN or the
! 1623: ** subquery has no WHERE clause. (added by ticket #350)
! 1624: **
! 1625: ** In this routine, the "p" parameter is a pointer to the outer query.
! 1626: ** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query
! 1627: ** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates.
! 1628: **
! 1629: ** If flattening is not attempted, this routine is a no-op and returns 0.
! 1630: ** If flattening is attempted this routine returns 1.
! 1631: **
! 1632: ** All of the expression analysis must occur on both the outer query and
! 1633: ** the subquery before this routine runs.
! 1634: */
! 1635: static int flattenSubquery(
! 1636: Parse *pParse, /* The parsing context */
! 1637: Select *p, /* The parent or outer SELECT statement */
! 1638: int iFrom, /* Index in p->pSrc->a[] of the inner subquery */
! 1639: int isAgg, /* True if outer SELECT uses aggregate functions */
! 1640: int subqueryIsAgg /* True if the subquery uses aggregate functions */
! 1641: ){
! 1642: Select *pSub; /* The inner query or "subquery" */
! 1643: SrcList *pSrc; /* The FROM clause of the outer query */
! 1644: SrcList *pSubSrc; /* The FROM clause of the subquery */
! 1645: ExprList *pList; /* The result set of the outer query */
! 1646: int iParent; /* VDBE cursor number of the pSub result set temp table */
! 1647: int i;
! 1648: Expr *pWhere;
! 1649:
! 1650: /* Check to see if flattening is permitted. Return 0 if not.
! 1651: */
! 1652: if( p==0 ) return 0;
! 1653: pSrc = p->pSrc;
! 1654: assert( pSrc && iFrom>=0 && iFrom<pSrc->nSrc );
! 1655: pSub = pSrc->a[iFrom].pSelect;
! 1656: assert( pSub!=0 );
! 1657: if( isAgg && subqueryIsAgg ) return 0;
! 1658: if( subqueryIsAgg && pSrc->nSrc>1 ) return 0;
! 1659: pSubSrc = pSub->pSrc;
! 1660: assert( pSubSrc );
! 1661: if( pSubSrc->nSrc==0 ) return 0;
! 1662: if( (pSub->isDistinct || pSub->nLimit>=0) && (pSrc->nSrc>1 || isAgg) ){
! 1663: return 0;
! 1664: }
! 1665: if( (p->isDistinct || p->nLimit>=0) && subqueryIsAgg ) return 0;
! 1666: if( p->pOrderBy && pSub->pOrderBy ) return 0;
! 1667:
! 1668: /* Restriction 3: If the subquery is a join, make sure the subquery is
! 1669: ** not used as the right operand of an outer join. Examples of why this
! 1670: ** is not allowed:
! 1671: **
! 1672: ** t1 LEFT OUTER JOIN (t2 JOIN t3)
! 1673: **
! 1674: ** If we flatten the above, we would get
! 1675: **
! 1676: ** (t1 LEFT OUTER JOIN t2) JOIN t3
! 1677: **
! 1678: ** which is not at all the same thing.
! 1679: */
! 1680: if( pSubSrc->nSrc>1 && iFrom>0 && (pSrc->a[iFrom-1].jointype & JT_OUTER)!=0 ){
! 1681: return 0;
! 1682: }
! 1683:
! 1684: /* Restriction 12: If the subquery is the right operand of a left outer
! 1685: ** join, make sure the subquery has no WHERE clause.
! 1686: ** An examples of why this is not allowed:
! 1687: **
! 1688: ** t1 LEFT OUTER JOIN (SELECT * FROM t2 WHERE t2.x>0)
! 1689: **
! 1690: ** If we flatten the above, we would get
! 1691: **
! 1692: ** (t1 LEFT OUTER JOIN t2) WHERE t2.x>0
! 1693: **
! 1694: ** But the t2.x>0 test will always fail on a NULL row of t2, which
! 1695: ** effectively converts the OUTER JOIN into an INNER JOIN.
! 1696: */
! 1697: if( iFrom>0 && (pSrc->a[iFrom-1].jointype & JT_OUTER)!=0
! 1698: && pSub->pWhere!=0 ){
! 1699: return 0;
! 1700: }
! 1701:
! 1702: /* If we reach this point, it means flattening is permitted for the
! 1703: ** iFrom-th entry of the FROM clause in the outer query.
! 1704: */
! 1705:
! 1706: /* Move all of the FROM elements of the subquery into the
! 1707: ** the FROM clause of the outer query. Before doing this, remember
! 1708: ** the cursor number for the original outer query FROM element in
! 1709: ** iParent. The iParent cursor will never be used. Subsequent code
! 1710: ** will scan expressions looking for iParent references and replace
! 1711: ** those references with expressions that resolve to the subquery FROM
! 1712: ** elements we are now copying in.
! 1713: */
! 1714: iParent = pSrc->a[iFrom].iCursor;
! 1715: {
! 1716: int nSubSrc = pSubSrc->nSrc;
! 1717: int jointype = pSrc->a[iFrom].jointype;
! 1718:
! 1719: if( pSrc->a[iFrom].pTab && pSrc->a[iFrom].pTab->isTransient ){
! 1720: sqliteDeleteTable(0, pSrc->a[iFrom].pTab);
! 1721: }
! 1722: sqliteFree(pSrc->a[iFrom].zDatabase);
! 1723: sqliteFree(pSrc->a[iFrom].zName);
! 1724: sqliteFree(pSrc->a[iFrom].zAlias);
! 1725: if( nSubSrc>1 ){
! 1726: int extra = nSubSrc - 1;
! 1727: for(i=1; i<nSubSrc; i++){
! 1728: pSrc = sqliteSrcListAppend(pSrc, 0, 0);
! 1729: }
! 1730: p->pSrc = pSrc;
! 1731: for(i=pSrc->nSrc-1; i-extra>=iFrom; i--){
! 1732: pSrc->a[i] = pSrc->a[i-extra];
! 1733: }
! 1734: }
! 1735: for(i=0; i<nSubSrc; i++){
! 1736: pSrc->a[i+iFrom] = pSubSrc->a[i];
! 1737: memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));
! 1738: }
! 1739: pSrc->a[iFrom+nSubSrc-1].jointype = jointype;
! 1740: }
! 1741:
! 1742: /* Now begin substituting subquery result set expressions for
! 1743: ** references to the iParent in the outer query.
! 1744: **
! 1745: ** Example:
! 1746: **
! 1747: ** SELECT a+5, b*10 FROM (SELECT x*3 AS a, y+10 AS b FROM t1) WHERE a>b;
! 1748: ** \ \_____________ subquery __________/ /
! 1749: ** \_____________________ outer query ______________________________/
! 1750: **
! 1751: ** We look at every expression in the outer query and every place we see
! 1752: ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10".
! 1753: */
! 1754: substExprList(p->pEList, iParent, pSub->pEList);
! 1755: pList = p->pEList;
! 1756: for(i=0; i<pList->nExpr; i++){
! 1757: Expr *pExpr;
! 1758: if( pList->a[i].zName==0 && (pExpr = pList->a[i].pExpr)->span.z!=0 ){
! 1759: pList->a[i].zName = sqliteStrNDup(pExpr->span.z, pExpr->span.n);
! 1760: }
! 1761: }
! 1762: if( isAgg ){
! 1763: substExprList(p->pGroupBy, iParent, pSub->pEList);
! 1764: substExpr(p->pHaving, iParent, pSub->pEList);
! 1765: }
! 1766: if( pSub->pOrderBy ){
! 1767: assert( p->pOrderBy==0 );
! 1768: p->pOrderBy = pSub->pOrderBy;
! 1769: pSub->pOrderBy = 0;
! 1770: }else if( p->pOrderBy ){
! 1771: substExprList(p->pOrderBy, iParent, pSub->pEList);
! 1772: }
! 1773: if( pSub->pWhere ){
! 1774: pWhere = sqliteExprDup(pSub->pWhere);
! 1775: }else{
! 1776: pWhere = 0;
! 1777: }
! 1778: if( subqueryIsAgg ){
! 1779: assert( p->pHaving==0 );
! 1780: p->pHaving = p->pWhere;
! 1781: p->pWhere = pWhere;
! 1782: substExpr(p->pHaving, iParent, pSub->pEList);
! 1783: if( pSub->pHaving ){
! 1784: Expr *pHaving = sqliteExprDup(pSub->pHaving);
! 1785: if( p->pHaving ){
! 1786: p->pHaving = sqliteExpr(TK_AND, p->pHaving, pHaving, 0);
! 1787: }else{
! 1788: p->pHaving = pHaving;
! 1789: }
! 1790: }
! 1791: assert( p->pGroupBy==0 );
! 1792: p->pGroupBy = sqliteExprListDup(pSub->pGroupBy);
! 1793: }else if( p->pWhere==0 ){
! 1794: p->pWhere = pWhere;
! 1795: }else{
! 1796: substExpr(p->pWhere, iParent, pSub->pEList);
! 1797: if( pWhere ){
! 1798: p->pWhere = sqliteExpr(TK_AND, p->pWhere, pWhere, 0);
! 1799: }
! 1800: }
! 1801:
! 1802: /* The flattened query is distinct if either the inner or the
! 1803: ** outer query is distinct.
! 1804: */
! 1805: p->isDistinct = p->isDistinct || pSub->isDistinct;
! 1806:
! 1807: /* Transfer the limit expression from the subquery to the outer
! 1808: ** query.
! 1809: */
! 1810: if( pSub->nLimit>=0 ){
! 1811: if( p->nLimit<0 ){
! 1812: p->nLimit = pSub->nLimit;
! 1813: }else if( p->nLimit+p->nOffset > pSub->nLimit+pSub->nOffset ){
! 1814: p->nLimit = pSub->nLimit + pSub->nOffset - p->nOffset;
! 1815: }
! 1816: }
! 1817: p->nOffset += pSub->nOffset;
! 1818:
! 1819: /* Finially, delete what is left of the subquery and return
! 1820: ** success.
! 1821: */
! 1822: sqliteSelectDelete(pSub);
! 1823: return 1;
! 1824: }
! 1825:
! 1826: /*
! 1827: ** Analyze the SELECT statement passed in as an argument to see if it
! 1828: ** is a simple min() or max() query. If it is and this query can be
! 1829: ** satisfied using a single seek to the beginning or end of an index,
! 1830: ** then generate the code for this SELECT and return 1. If this is not a
! 1831: ** simple min() or max() query, then return 0;
! 1832: **
! 1833: ** A simply min() or max() query looks like this:
! 1834: **
! 1835: ** SELECT min(a) FROM table;
! 1836: ** SELECT max(a) FROM table;
! 1837: **
! 1838: ** The query may have only a single table in its FROM argument. There
! 1839: ** can be no GROUP BY or HAVING or WHERE clauses. The result set must
! 1840: ** be the min() or max() of a single column of the table. The column
! 1841: ** in the min() or max() function must be indexed.
! 1842: **
! 1843: ** The parameters to this routine are the same as for sqliteSelect().
! 1844: ** See the header comment on that routine for additional information.
! 1845: */
! 1846: static int simpleMinMaxQuery(Parse *pParse, Select *p, int eDest, int iParm){
! 1847: Expr *pExpr;
! 1848: int iCol;
! 1849: Table *pTab;
! 1850: Index *pIdx;
! 1851: int base;
! 1852: Vdbe *v;
! 1853: int seekOp;
! 1854: int cont;
! 1855: ExprList *pEList, *pList, eList;
! 1856: struct ExprList_item eListItem;
! 1857: SrcList *pSrc;
! 1858:
! 1859:
! 1860: /* Check to see if this query is a simple min() or max() query. Return
! 1861: ** zero if it is not.
! 1862: */
! 1863: if( p->pGroupBy || p->pHaving || p->pWhere ) return 0;
! 1864: pSrc = p->pSrc;
! 1865: if( pSrc->nSrc!=1 ) return 0;
! 1866: pEList = p->pEList;
! 1867: if( pEList->nExpr!=1 ) return 0;
! 1868: pExpr = pEList->a[0].pExpr;
! 1869: if( pExpr->op!=TK_AGG_FUNCTION ) return 0;
! 1870: pList = pExpr->pList;
! 1871: if( pList==0 || pList->nExpr!=1 ) return 0;
! 1872: if( pExpr->token.n!=3 ) return 0;
! 1873: if( sqliteStrNICmp(pExpr->token.z,"min",3)==0 ){
! 1874: seekOp = OP_Rewind;
! 1875: }else if( sqliteStrNICmp(pExpr->token.z,"max",3)==0 ){
! 1876: seekOp = OP_Last;
! 1877: }else{
! 1878: return 0;
! 1879: }
! 1880: pExpr = pList->a[0].pExpr;
! 1881: if( pExpr->op!=TK_COLUMN ) return 0;
! 1882: iCol = pExpr->iColumn;
! 1883: pTab = pSrc->a[0].pTab;
! 1884:
! 1885: /* If we get to here, it means the query is of the correct form.
! 1886: ** Check to make sure we have an index and make pIdx point to the
! 1887: ** appropriate index. If the min() or max() is on an INTEGER PRIMARY
! 1888: ** key column, no index is necessary so set pIdx to NULL. If no
! 1889: ** usable index is found, return 0.
! 1890: */
! 1891: if( iCol<0 ){
! 1892: pIdx = 0;
! 1893: }else{
! 1894: for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
! 1895: assert( pIdx->nColumn>=1 );
! 1896: if( pIdx->aiColumn[0]==iCol ) break;
! 1897: }
! 1898: if( pIdx==0 ) return 0;
! 1899: }
! 1900:
! 1901: /* Identify column types if we will be using the callback. This
! 1902: ** step is skipped if the output is going to a table or a memory cell.
! 1903: ** The column names have already been generated in the calling function.
! 1904: */
! 1905: v = sqliteGetVdbe(pParse);
! 1906: if( v==0 ) return 0;
! 1907: if( eDest==SRT_Callback ){
! 1908: generateColumnTypes(pParse, p->pSrc, p->pEList);
! 1909: }
! 1910:
! 1911: /* If the output is destined for a temporary table, open that table.
! 1912: */
! 1913: if( eDest==SRT_TempTable ){
! 1914: sqliteVdbeAddOp(v, OP_OpenTemp, iParm, 0);
! 1915: }
! 1916:
! 1917: /* Generating code to find the min or the max. Basically all we have
! 1918: ** to do is find the first or the last entry in the chosen index. If
! 1919: ** the min() or max() is on the INTEGER PRIMARY KEY, then find the first
! 1920: ** or last entry in the main table.
! 1921: */
! 1922: sqliteCodeVerifySchema(pParse, pTab->iDb);
! 1923: base = pSrc->a[0].iCursor;
! 1924: computeLimitRegisters(pParse, p);
! 1925: if( pSrc->a[0].pSelect==0 ){
! 1926: sqliteVdbeAddOp(v, OP_Integer, pTab->iDb, 0);
! 1927: sqliteVdbeOp3(v, OP_OpenRead, base, pTab->tnum, pTab->zName, 0);
! 1928: }
! 1929: cont = sqliteVdbeMakeLabel(v);
! 1930: if( pIdx==0 ){
! 1931: sqliteVdbeAddOp(v, seekOp, base, 0);
! 1932: }else{
! 1933: sqliteVdbeAddOp(v, OP_Integer, pIdx->iDb, 0);
! 1934: sqliteVdbeOp3(v, OP_OpenRead, base+1, pIdx->tnum, pIdx->zName, P3_STATIC);
! 1935: if( seekOp==OP_Rewind ){
! 1936: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 1937: sqliteVdbeAddOp(v, OP_MakeKey, 1, 0);
! 1938: sqliteVdbeAddOp(v, OP_IncrKey, 0, 0);
! 1939: seekOp = OP_MoveTo;
! 1940: }
! 1941: sqliteVdbeAddOp(v, seekOp, base+1, 0);
! 1942: sqliteVdbeAddOp(v, OP_IdxRecno, base+1, 0);
! 1943: sqliteVdbeAddOp(v, OP_Close, base+1, 0);
! 1944: sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
! 1945: }
! 1946: eList.nExpr = 1;
! 1947: memset(&eListItem, 0, sizeof(eListItem));
! 1948: eList.a = &eListItem;
! 1949: eList.a[0].pExpr = pExpr;
! 1950: selectInnerLoop(pParse, p, &eList, 0, 0, 0, -1, eDest, iParm, cont, cont);
! 1951: sqliteVdbeResolveLabel(v, cont);
! 1952: sqliteVdbeAddOp(v, OP_Close, base, 0);
! 1953:
! 1954: return 1;
! 1955: }
! 1956:
! 1957: /*
! 1958: ** Generate code for the given SELECT statement.
! 1959: **
! 1960: ** The results are distributed in various ways depending on the
! 1961: ** value of eDest and iParm.
! 1962: **
! 1963: ** eDest Value Result
! 1964: ** ------------ -------------------------------------------
! 1965: ** SRT_Callback Invoke the callback for each row of the result.
! 1966: **
! 1967: ** SRT_Mem Store first result in memory cell iParm
! 1968: **
! 1969: ** SRT_Set Store results as keys of a table with cursor iParm
! 1970: **
! 1971: ** SRT_Union Store results as a key in a temporary table iParm
! 1972: **
! 1973: ** SRT_Except Remove results from the temporary table iParm.
! 1974: **
! 1975: ** SRT_Table Store results in temporary table iParm
! 1976: **
! 1977: ** The table above is incomplete. Additional eDist value have be added
! 1978: ** since this comment was written. See the selectInnerLoop() function for
! 1979: ** a complete listing of the allowed values of eDest and their meanings.
! 1980: **
! 1981: ** This routine returns the number of errors. If any errors are
! 1982: ** encountered, then an appropriate error message is left in
! 1983: ** pParse->zErrMsg.
! 1984: **
! 1985: ** This routine does NOT free the Select structure passed in. The
! 1986: ** calling function needs to do that.
! 1987: **
! 1988: ** The pParent, parentTab, and *pParentAgg fields are filled in if this
! 1989: ** SELECT is a subquery. This routine may try to combine this SELECT
! 1990: ** with its parent to form a single flat query. In so doing, it might
! 1991: ** change the parent query from a non-aggregate to an aggregate query.
! 1992: ** For that reason, the pParentAgg flag is passed as a pointer, so it
! 1993: ** can be changed.
! 1994: **
! 1995: ** Example 1: The meaning of the pParent parameter.
! 1996: **
! 1997: ** SELECT * FROM t1 JOIN (SELECT x, count(*) FROM t2) JOIN t3;
! 1998: ** \ \_______ subquery _______/ /
! 1999: ** \ /
! 2000: ** \____________________ outer query ___________________/
! 2001: **
! 2002: ** This routine is called for the outer query first. For that call,
! 2003: ** pParent will be NULL. During the processing of the outer query, this
! 2004: ** routine is called recursively to handle the subquery. For the recursive
! 2005: ** call, pParent will point to the outer query. Because the subquery is
! 2006: ** the second element in a three-way join, the parentTab parameter will
! 2007: ** be 1 (the 2nd value of a 0-indexed array.)
! 2008: */
! 2009: int sqliteSelect(
! 2010: Parse *pParse, /* The parser context */
! 2011: Select *p, /* The SELECT statement being coded. */
! 2012: int eDest, /* How to dispose of the results */
! 2013: int iParm, /* A parameter used by the eDest disposal method */
! 2014: Select *pParent, /* Another SELECT for which this is a sub-query */
! 2015: int parentTab, /* Index in pParent->pSrc of this query */
! 2016: int *pParentAgg /* True if pParent uses aggregate functions */
! 2017: ){
! 2018: int i;
! 2019: WhereInfo *pWInfo;
! 2020: Vdbe *v;
! 2021: int isAgg = 0; /* True for select lists like "count(*)" */
! 2022: ExprList *pEList; /* List of columns to extract. */
! 2023: SrcList *pTabList; /* List of tables to select from */
! 2024: Expr *pWhere; /* The WHERE clause. May be NULL */
! 2025: ExprList *pOrderBy; /* The ORDER BY clause. May be NULL */
! 2026: ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */
! 2027: Expr *pHaving; /* The HAVING clause. May be NULL */
! 2028: int isDistinct; /* True if the DISTINCT keyword is present */
! 2029: int distinct; /* Table to use for the distinct set */
! 2030: int rc = 1; /* Value to return from this function */
! 2031:
! 2032: if( sqlite_malloc_failed || pParse->nErr || p==0 ) return 1;
! 2033: if( sqliteAuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1;
! 2034:
! 2035: /* If there is are a sequence of queries, do the earlier ones first.
! 2036: */
! 2037: if( p->pPrior ){
! 2038: return multiSelect(pParse, p, eDest, iParm);
! 2039: }
! 2040:
! 2041: /* Make local copies of the parameters for this query.
! 2042: */
! 2043: pTabList = p->pSrc;
! 2044: pWhere = p->pWhere;
! 2045: pOrderBy = p->pOrderBy;
! 2046: pGroupBy = p->pGroupBy;
! 2047: pHaving = p->pHaving;
! 2048: isDistinct = p->isDistinct;
! 2049:
! 2050: /* Allocate VDBE cursors for each table in the FROM clause
! 2051: */
! 2052: sqliteSrcListAssignCursors(pParse, pTabList);
! 2053:
! 2054: /*
! 2055: ** Do not even attempt to generate any code if we have already seen
! 2056: ** errors before this routine starts.
! 2057: */
! 2058: if( pParse->nErr>0 ) goto select_end;
! 2059:
! 2060: /* Expand any "*" terms in the result set. (For example the "*" in
! 2061: ** "SELECT * FROM t1") The fillInColumnlist() routine also does some
! 2062: ** other housekeeping - see the header comment for details.
! 2063: */
! 2064: if( fillInColumnList(pParse, p) ){
! 2065: goto select_end;
! 2066: }
! 2067: pWhere = p->pWhere;
! 2068: pEList = p->pEList;
! 2069: if( pEList==0 ) goto select_end;
! 2070:
! 2071: /* If writing to memory or generating a set
! 2072: ** only a single column may be output.
! 2073: */
! 2074: if( (eDest==SRT_Mem || eDest==SRT_Set) && pEList->nExpr>1 ){
! 2075: sqliteErrorMsg(pParse, "only a single result allowed for "
! 2076: "a SELECT that is part of an expression");
! 2077: goto select_end;
! 2078: }
! 2079:
! 2080: /* ORDER BY is ignored for some destinations.
! 2081: */
! 2082: switch( eDest ){
! 2083: case SRT_Union:
! 2084: case SRT_Except:
! 2085: case SRT_Discard:
! 2086: pOrderBy = 0;
! 2087: break;
! 2088: default:
! 2089: break;
! 2090: }
! 2091:
! 2092: /* At this point, we should have allocated all the cursors that we
! 2093: ** need to handle subquerys and temporary tables.
! 2094: **
! 2095: ** Resolve the column names and do a semantics check on all the expressions.
! 2096: */
! 2097: for(i=0; i<pEList->nExpr; i++){
! 2098: if( sqliteExprResolveIds(pParse, pTabList, 0, pEList->a[i].pExpr) ){
! 2099: goto select_end;
! 2100: }
! 2101: if( sqliteExprCheck(pParse, pEList->a[i].pExpr, 1, &isAgg) ){
! 2102: goto select_end;
! 2103: }
! 2104: }
! 2105: if( pWhere ){
! 2106: if( sqliteExprResolveIds(pParse, pTabList, pEList, pWhere) ){
! 2107: goto select_end;
! 2108: }
! 2109: if( sqliteExprCheck(pParse, pWhere, 0, 0) ){
! 2110: goto select_end;
! 2111: }
! 2112: }
! 2113: if( pHaving ){
! 2114: if( pGroupBy==0 ){
! 2115: sqliteErrorMsg(pParse, "a GROUP BY clause is required before HAVING");
! 2116: goto select_end;
! 2117: }
! 2118: if( sqliteExprResolveIds(pParse, pTabList, pEList, pHaving) ){
! 2119: goto select_end;
! 2120: }
! 2121: if( sqliteExprCheck(pParse, pHaving, 1, &isAgg) ){
! 2122: goto select_end;
! 2123: }
! 2124: }
! 2125: if( pOrderBy ){
! 2126: for(i=0; i<pOrderBy->nExpr; i++){
! 2127: int iCol;
! 2128: Expr *pE = pOrderBy->a[i].pExpr;
! 2129: if( sqliteExprIsInteger(pE, &iCol) && iCol>0 && iCol<=pEList->nExpr ){
! 2130: sqliteExprDelete(pE);
! 2131: pE = pOrderBy->a[i].pExpr = sqliteExprDup(pEList->a[iCol-1].pExpr);
! 2132: }
! 2133: if( sqliteExprResolveIds(pParse, pTabList, pEList, pE) ){
! 2134: goto select_end;
! 2135: }
! 2136: if( sqliteExprCheck(pParse, pE, isAgg, 0) ){
! 2137: goto select_end;
! 2138: }
! 2139: if( sqliteExprIsConstant(pE) ){
! 2140: if( sqliteExprIsInteger(pE, &iCol)==0 ){
! 2141: sqliteErrorMsg(pParse,
! 2142: "ORDER BY terms must not be non-integer constants");
! 2143: goto select_end;
! 2144: }else if( iCol<=0 || iCol>pEList->nExpr ){
! 2145: sqliteErrorMsg(pParse,
! 2146: "ORDER BY column number %d out of range - should be "
! 2147: "between 1 and %d", iCol, pEList->nExpr);
! 2148: goto select_end;
! 2149: }
! 2150: }
! 2151: }
! 2152: }
! 2153: if( pGroupBy ){
! 2154: for(i=0; i<pGroupBy->nExpr; i++){
! 2155: int iCol;
! 2156: Expr *pE = pGroupBy->a[i].pExpr;
! 2157: if( sqliteExprIsInteger(pE, &iCol) && iCol>0 && iCol<=pEList->nExpr ){
! 2158: sqliteExprDelete(pE);
! 2159: pE = pGroupBy->a[i].pExpr = sqliteExprDup(pEList->a[iCol-1].pExpr);
! 2160: }
! 2161: if( sqliteExprResolveIds(pParse, pTabList, pEList, pE) ){
! 2162: goto select_end;
! 2163: }
! 2164: if( sqliteExprCheck(pParse, pE, isAgg, 0) ){
! 2165: goto select_end;
! 2166: }
! 2167: if( sqliteExprIsConstant(pE) ){
! 2168: if( sqliteExprIsInteger(pE, &iCol)==0 ){
! 2169: sqliteErrorMsg(pParse,
! 2170: "GROUP BY terms must not be non-integer constants");
! 2171: goto select_end;
! 2172: }else if( iCol<=0 || iCol>pEList->nExpr ){
! 2173: sqliteErrorMsg(pParse,
! 2174: "GROUP BY column number %d out of range - should be "
! 2175: "between 1 and %d", iCol, pEList->nExpr);
! 2176: goto select_end;
! 2177: }
! 2178: }
! 2179: }
! 2180: }
! 2181:
! 2182: /* Begin generating code.
! 2183: */
! 2184: v = sqliteGetVdbe(pParse);
! 2185: if( v==0 ) goto select_end;
! 2186:
! 2187: /* Identify column names if we will be using them in a callback. This
! 2188: ** step is skipped if the output is going to some other destination.
! 2189: */
! 2190: if( eDest==SRT_Callback ){
! 2191: generateColumnNames(pParse, pTabList, pEList);
! 2192: }
! 2193:
! 2194: /* Generate code for all sub-queries in the FROM clause
! 2195: */
! 2196: for(i=0; i<pTabList->nSrc; i++){
! 2197: const char *zSavedAuthContext;
! 2198: int needRestoreContext;
! 2199:
! 2200: if( pTabList->a[i].pSelect==0 ) continue;
! 2201: if( pTabList->a[i].zName!=0 ){
! 2202: zSavedAuthContext = pParse->zAuthContext;
! 2203: pParse->zAuthContext = pTabList->a[i].zName;
! 2204: needRestoreContext = 1;
! 2205: }else{
! 2206: needRestoreContext = 0;
! 2207: }
! 2208: sqliteSelect(pParse, pTabList->a[i].pSelect, SRT_TempTable,
! 2209: pTabList->a[i].iCursor, p, i, &isAgg);
! 2210: if( needRestoreContext ){
! 2211: pParse->zAuthContext = zSavedAuthContext;
! 2212: }
! 2213: pTabList = p->pSrc;
! 2214: pWhere = p->pWhere;
! 2215: if( eDest!=SRT_Union && eDest!=SRT_Except && eDest!=SRT_Discard ){
! 2216: pOrderBy = p->pOrderBy;
! 2217: }
! 2218: pGroupBy = p->pGroupBy;
! 2219: pHaving = p->pHaving;
! 2220: isDistinct = p->isDistinct;
! 2221: }
! 2222:
! 2223: /* Check for the special case of a min() or max() function by itself
! 2224: ** in the result set.
! 2225: */
! 2226: if( simpleMinMaxQuery(pParse, p, eDest, iParm) ){
! 2227: rc = 0;
! 2228: goto select_end;
! 2229: }
! 2230:
! 2231: /* Check to see if this is a subquery that can be "flattened" into its parent.
! 2232: ** If flattening is a possiblity, do so and return immediately.
! 2233: */
! 2234: if( pParent && pParentAgg &&
! 2235: flattenSubquery(pParse, pParent, parentTab, *pParentAgg, isAgg) ){
! 2236: if( isAgg ) *pParentAgg = 1;
! 2237: return rc;
! 2238: }
! 2239:
! 2240: /* Set the limiter.
! 2241: */
! 2242: computeLimitRegisters(pParse, p);
! 2243:
! 2244: /* Identify column types if we will be using a callback. This
! 2245: ** step is skipped if the output is going to a destination other
! 2246: ** than a callback.
! 2247: **
! 2248: ** We have to do this separately from the creation of column names
! 2249: ** above because if the pTabList contains views then they will not
! 2250: ** have been resolved and we will not know the column types until
! 2251: ** now.
! 2252: */
! 2253: if( eDest==SRT_Callback ){
! 2254: generateColumnTypes(pParse, pTabList, pEList);
! 2255: }
! 2256:
! 2257: /* If the output is destined for a temporary table, open that table.
! 2258: */
! 2259: if( eDest==SRT_TempTable ){
! 2260: sqliteVdbeAddOp(v, OP_OpenTemp, iParm, 0);
! 2261: }
! 2262:
! 2263: /* Do an analysis of aggregate expressions.
! 2264: */
! 2265: sqliteAggregateInfoReset(pParse);
! 2266: if( isAgg || pGroupBy ){
! 2267: assert( pParse->nAgg==0 );
! 2268: isAgg = 1;
! 2269: for(i=0; i<pEList->nExpr; i++){
! 2270: if( sqliteExprAnalyzeAggregates(pParse, pEList->a[i].pExpr) ){
! 2271: goto select_end;
! 2272: }
! 2273: }
! 2274: if( pGroupBy ){
! 2275: for(i=0; i<pGroupBy->nExpr; i++){
! 2276: if( sqliteExprAnalyzeAggregates(pParse, pGroupBy->a[i].pExpr) ){
! 2277: goto select_end;
! 2278: }
! 2279: }
! 2280: }
! 2281: if( pHaving && sqliteExprAnalyzeAggregates(pParse, pHaving) ){
! 2282: goto select_end;
! 2283: }
! 2284: if( pOrderBy ){
! 2285: for(i=0; i<pOrderBy->nExpr; i++){
! 2286: if( sqliteExprAnalyzeAggregates(pParse, pOrderBy->a[i].pExpr) ){
! 2287: goto select_end;
! 2288: }
! 2289: }
! 2290: }
! 2291: }
! 2292:
! 2293: /* Reset the aggregator
! 2294: */
! 2295: if( isAgg ){
! 2296: sqliteVdbeAddOp(v, OP_AggReset, 0, pParse->nAgg);
! 2297: for(i=0; i<pParse->nAgg; i++){
! 2298: FuncDef *pFunc;
! 2299: if( (pFunc = pParse->aAgg[i].pFunc)!=0 && pFunc->xFinalize!=0 ){
! 2300: sqliteVdbeOp3(v, OP_AggInit, 0, i, (char*)pFunc, P3_POINTER);
! 2301: }
! 2302: }
! 2303: if( pGroupBy==0 ){
! 2304: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 2305: sqliteVdbeAddOp(v, OP_AggFocus, 0, 0);
! 2306: }
! 2307: }
! 2308:
! 2309: /* Initialize the memory cell to NULL
! 2310: */
! 2311: if( eDest==SRT_Mem ){
! 2312: sqliteVdbeAddOp(v, OP_String, 0, 0);
! 2313: sqliteVdbeAddOp(v, OP_MemStore, iParm, 1);
! 2314: }
! 2315:
! 2316: /* Open a temporary table to use for the distinct set.
! 2317: */
! 2318: if( isDistinct ){
! 2319: distinct = pParse->nTab++;
! 2320: sqliteVdbeAddOp(v, OP_OpenTemp, distinct, 1);
! 2321: }else{
! 2322: distinct = -1;
! 2323: }
! 2324:
! 2325: /* Begin the database scan
! 2326: */
! 2327: pWInfo = sqliteWhereBegin(pParse, pTabList, pWhere, 0,
! 2328: pGroupBy ? 0 : &pOrderBy);
! 2329: if( pWInfo==0 ) goto select_end;
! 2330:
! 2331: /* Use the standard inner loop if we are not dealing with
! 2332: ** aggregates
! 2333: */
! 2334: if( !isAgg ){
! 2335: if( selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, distinct, eDest,
! 2336: iParm, pWInfo->iContinue, pWInfo->iBreak) ){
! 2337: goto select_end;
! 2338: }
! 2339: }
! 2340:
! 2341: /* If we are dealing with aggregates, then do the special aggregate
! 2342: ** processing.
! 2343: */
! 2344: else{
! 2345: AggExpr *pAgg;
! 2346: if( pGroupBy ){
! 2347: int lbl1;
! 2348: for(i=0; i<pGroupBy->nExpr; i++){
! 2349: sqliteExprCode(pParse, pGroupBy->a[i].pExpr);
! 2350: }
! 2351: sqliteVdbeAddOp(v, OP_MakeKey, pGroupBy->nExpr, 0);
! 2352: if( pParse->db->file_format>=4 ) sqliteAddKeyType(v, pGroupBy);
! 2353: lbl1 = sqliteVdbeMakeLabel(v);
! 2354: sqliteVdbeAddOp(v, OP_AggFocus, 0, lbl1);
! 2355: for(i=0, pAgg=pParse->aAgg; i<pParse->nAgg; i++, pAgg++){
! 2356: if( pAgg->isAgg ) continue;
! 2357: sqliteExprCode(pParse, pAgg->pExpr);
! 2358: sqliteVdbeAddOp(v, OP_AggSet, 0, i);
! 2359: }
! 2360: sqliteVdbeResolveLabel(v, lbl1);
! 2361: }
! 2362: for(i=0, pAgg=pParse->aAgg; i<pParse->nAgg; i++, pAgg++){
! 2363: Expr *pE;
! 2364: int nExpr;
! 2365: FuncDef *pDef;
! 2366: if( !pAgg->isAgg ) continue;
! 2367: assert( pAgg->pFunc!=0 );
! 2368: assert( pAgg->pFunc->xStep!=0 );
! 2369: pDef = pAgg->pFunc;
! 2370: pE = pAgg->pExpr;
! 2371: assert( pE!=0 );
! 2372: assert( pE->op==TK_AGG_FUNCTION );
! 2373: nExpr = sqliteExprCodeExprList(pParse, pE->pList, pDef->includeTypes);
! 2374: sqliteVdbeAddOp(v, OP_Integer, i, 0);
! 2375: sqliteVdbeOp3(v, OP_AggFunc, 0, nExpr, (char*)pDef, P3_POINTER);
! 2376: }
! 2377: }
! 2378:
! 2379: /* End the database scan loop.
! 2380: */
! 2381: sqliteWhereEnd(pWInfo);
! 2382:
! 2383: /* If we are processing aggregates, we need to set up a second loop
! 2384: ** over all of the aggregate values and process them.
! 2385: */
! 2386: if( isAgg ){
! 2387: int endagg = sqliteVdbeMakeLabel(v);
! 2388: int startagg;
! 2389: startagg = sqliteVdbeAddOp(v, OP_AggNext, 0, endagg);
! 2390: pParse->useAgg = 1;
! 2391: if( pHaving ){
! 2392: sqliteExprIfFalse(pParse, pHaving, startagg, 1);
! 2393: }
! 2394: if( selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, distinct, eDest,
! 2395: iParm, startagg, endagg) ){
! 2396: goto select_end;
! 2397: }
! 2398: sqliteVdbeAddOp(v, OP_Goto, 0, startagg);
! 2399: sqliteVdbeResolveLabel(v, endagg);
! 2400: sqliteVdbeAddOp(v, OP_Noop, 0, 0);
! 2401: pParse->useAgg = 0;
! 2402: }
! 2403:
! 2404: /* If there is an ORDER BY clause, then we need to sort the results
! 2405: ** and send them to the callback one by one.
! 2406: */
! 2407: if( pOrderBy ){
! 2408: generateSortTail(p, v, pEList->nExpr, eDest, iParm);
! 2409: }
! 2410:
! 2411: /* If this was a subquery, we have now converted the subquery into a
! 2412: ** temporary table. So delete the subquery structure from the parent
! 2413: ** to prevent this subquery from being evaluated again and to force the
! 2414: ** the use of the temporary table.
! 2415: */
! 2416: if( pParent ){
! 2417: assert( pParent->pSrc->nSrc>parentTab );
! 2418: assert( pParent->pSrc->a[parentTab].pSelect==p );
! 2419: sqliteSelectDelete(p);
! 2420: pParent->pSrc->a[parentTab].pSelect = 0;
! 2421: }
! 2422:
! 2423: /* The SELECT was successfully coded. Set the return code to 0
! 2424: ** to indicate no errors.
! 2425: */
! 2426: rc = 0;
! 2427:
! 2428: /* Control jumps to here if an error is encountered above, or upon
! 2429: ** successful coding of the SELECT.
! 2430: */
! 2431: select_end:
! 2432: sqliteAggregateInfoReset(pParse);
! 2433: return rc;
! 2434: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>