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,v 1.161.2.4 2004/07/20 01:45:49 drh Exp $
|
---|
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 | }
|
---|