OLD | NEW |
1 /* | 1 /* |
2 ** 2008 August 18 | 2 ** 2008 August 18 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
11 ************************************************************************* | 11 ************************************************************************* |
12 ** | 12 ** |
13 ** This file contains routines used for walking the parser tree and | 13 ** This file contains routines used for walking the parser tree and |
14 ** resolve all identifiers by associating them with a particular | 14 ** resolve all identifiers by associating them with a particular |
15 ** table and column. | 15 ** table and column. |
16 */ | 16 */ |
17 #include "sqliteInt.h" | 17 #include "sqliteInt.h" |
18 #include <stdlib.h> | 18 #include <stdlib.h> |
19 #include <string.h> | 19 #include <string.h> |
20 | 20 |
21 /* | 21 /* |
| 22 ** Walk the expression tree pExpr and increase the aggregate function |
| 23 ** depth (the Expr.op2 field) by N on every TK_AGG_FUNCTION node. |
| 24 ** This needs to occur when copying a TK_AGG_FUNCTION node from an |
| 25 ** outer query into an inner subquery. |
| 26 ** |
| 27 ** incrAggFunctionDepth(pExpr,n) is the main routine. incrAggDepth(..) |
| 28 ** is a helper function - a callback for the tree walker. |
| 29 */ |
| 30 static int incrAggDepth(Walker *pWalker, Expr *pExpr){ |
| 31 if( pExpr->op==TK_AGG_FUNCTION ) pExpr->op2 += pWalker->u.i; |
| 32 return WRC_Continue; |
| 33 } |
| 34 static void incrAggFunctionDepth(Expr *pExpr, int N){ |
| 35 if( N>0 ){ |
| 36 Walker w; |
| 37 memset(&w, 0, sizeof(w)); |
| 38 w.xExprCallback = incrAggDepth; |
| 39 w.u.i = N; |
| 40 sqlite3WalkExpr(&w, pExpr); |
| 41 } |
| 42 } |
| 43 |
| 44 /* |
22 ** Turn the pExpr expression into an alias for the iCol-th column of the | 45 ** Turn the pExpr expression into an alias for the iCol-th column of the |
23 ** result set in pEList. | 46 ** result set in pEList. |
24 ** | 47 ** |
25 ** If the result set column is a simple column reference, then this routine | 48 ** If the result set column is a simple column reference, then this routine |
26 ** makes an exact copy. But for any other kind of expression, this | 49 ** makes an exact copy. But for any other kind of expression, this |
27 ** routine make a copy of the result set column as the argument to the | 50 ** routine make a copy of the result set column as the argument to the |
28 ** TK_AS operator. The TK_AS operator causes the expression to be | 51 ** TK_AS operator. The TK_AS operator causes the expression to be |
29 ** evaluated just once and then reused for each alias. | 52 ** evaluated just once and then reused for each alias. |
30 ** | 53 ** |
31 ** The reason for suppressing the TK_AS term when the expression is a simple | 54 ** The reason for suppressing the TK_AS term when the expression is a simple |
32 ** column reference is so that the column reference will be recognized as | 55 ** column reference is so that the column reference will be recognized as |
33 ** usable by indices within the WHERE clause processing logic. | 56 ** usable by indices within the WHERE clause processing logic. |
34 ** | 57 ** |
35 ** Hack: The TK_AS operator is inhibited if zType[0]=='G'. This means | 58 ** The TK_AS operator is inhibited if zType[0]=='G'. This means |
36 ** that in a GROUP BY clause, the expression is evaluated twice. Hence: | 59 ** that in a GROUP BY clause, the expression is evaluated twice. Hence: |
37 ** | 60 ** |
38 ** SELECT random()%5 AS x, count(*) FROM tab GROUP BY x | 61 ** SELECT random()%5 AS x, count(*) FROM tab GROUP BY x |
39 ** | 62 ** |
40 ** Is equivalent to: | 63 ** Is equivalent to: |
41 ** | 64 ** |
42 ** SELECT random()%5 AS x, count(*) FROM tab GROUP BY random()%5 | 65 ** SELECT random()%5 AS x, count(*) FROM tab GROUP BY random()%5 |
43 ** | 66 ** |
44 ** The result of random()%5 in the GROUP BY clause is probably different | 67 ** The result of random()%5 in the GROUP BY clause is probably different |
45 ** from the result in the result-set. We might fix this someday. Or | 68 ** from the result in the result-set. On the other hand Standard SQL does |
46 ** then again, we might not... | 69 ** not allow the GROUP BY clause to contain references to result-set columns. |
| 70 ** So this should never come up in well-formed queries. |
| 71 ** |
| 72 ** If the reference is followed by a COLLATE operator, then make sure |
| 73 ** the COLLATE operator is preserved. For example: |
| 74 ** |
| 75 ** SELECT a+b, c+d FROM t1 ORDER BY 1 COLLATE nocase; |
| 76 ** |
| 77 ** Should be transformed into: |
| 78 ** |
| 79 ** SELECT a+b, c+d FROM t1 ORDER BY (a+b) COLLATE nocase; |
| 80 ** |
| 81 ** The nSubquery parameter specifies how many levels of subquery the |
| 82 ** alias is removed from the original expression. The usually value is |
| 83 ** zero but it might be more if the alias is contained within a subquery |
| 84 ** of the original expression. The Expr.op2 field of TK_AGG_FUNCTION |
| 85 ** structures must be increased by the nSubquery amount. |
47 */ | 86 */ |
48 static void resolveAlias( | 87 static void resolveAlias( |
49 Parse *pParse, /* Parsing context */ | 88 Parse *pParse, /* Parsing context */ |
50 ExprList *pEList, /* A result set */ | 89 ExprList *pEList, /* A result set */ |
51 int iCol, /* A column in the result set. 0..pEList->nExpr-1 */ | 90 int iCol, /* A column in the result set. 0..pEList->nExpr-1 */ |
52 Expr *pExpr, /* Transform this into an alias to the result set */ | 91 Expr *pExpr, /* Transform this into an alias to the result set */ |
53 const char *zType /* "GROUP" or "ORDER" or "" */ | 92 const char *zType, /* "GROUP" or "ORDER" or "" */ |
| 93 int nSubquery /* Number of subqueries that the label is moving */ |
54 ){ | 94 ){ |
55 Expr *pOrig; /* The iCol-th column of the result set */ | 95 Expr *pOrig; /* The iCol-th column of the result set */ |
56 Expr *pDup; /* Copy of pOrig */ | 96 Expr *pDup; /* Copy of pOrig */ |
57 sqlite3 *db; /* The database connection */ | 97 sqlite3 *db; /* The database connection */ |
58 | 98 |
59 assert( iCol>=0 && iCol<pEList->nExpr ); | 99 assert( iCol>=0 && iCol<pEList->nExpr ); |
60 pOrig = pEList->a[iCol].pExpr; | 100 pOrig = pEList->a[iCol].pExpr; |
61 assert( pOrig!=0 ); | 101 assert( pOrig!=0 ); |
62 assert( pOrig->flags & EP_Resolved ); | 102 assert( pOrig->flags & EP_Resolved ); |
63 db = pParse->db; | 103 db = pParse->db; |
| 104 pDup = sqlite3ExprDup(db, pOrig, 0); |
| 105 if( pDup==0 ) return; |
64 if( pOrig->op!=TK_COLUMN && zType[0]!='G' ){ | 106 if( pOrig->op!=TK_COLUMN && zType[0]!='G' ){ |
65 pDup = sqlite3ExprDup(db, pOrig, 0); | 107 incrAggFunctionDepth(pDup, nSubquery); |
66 pDup = sqlite3PExpr(pParse, TK_AS, pDup, 0, 0); | 108 pDup = sqlite3PExpr(pParse, TK_AS, pDup, 0, 0); |
67 if( pDup==0 ) return; | 109 if( pDup==0 ) return; |
68 if( pEList->a[iCol].iAlias==0 ){ | 110 ExprSetProperty(pDup, EP_Skip); |
69 pEList->a[iCol].iAlias = (u16)(++pParse->nAlias); | 111 if( pEList->a[iCol].u.x.iAlias==0 ){ |
| 112 pEList->a[iCol].u.x.iAlias = (u16)(++pParse->nAlias); |
70 } | 113 } |
71 pDup->iTable = pEList->a[iCol].iAlias; | 114 pDup->iTable = pEList->a[iCol].u.x.iAlias; |
72 }else if( ExprHasProperty(pOrig, EP_IntValue) || pOrig->u.zToken==0 ){ | |
73 pDup = sqlite3ExprDup(db, pOrig, 0); | |
74 if( pDup==0 ) return; | |
75 }else{ | |
76 char *zToken = pOrig->u.zToken; | |
77 assert( zToken!=0 ); | |
78 pOrig->u.zToken = 0; | |
79 pDup = sqlite3ExprDup(db, pOrig, 0); | |
80 pOrig->u.zToken = zToken; | |
81 if( pDup==0 ) return; | |
82 assert( (pDup->flags & (EP_Reduced|EP_TokenOnly))==0 ); | |
83 pDup->flags2 |= EP2_MallocedToken; | |
84 pDup->u.zToken = sqlite3DbStrDup(db, zToken); | |
85 } | 115 } |
86 if( pExpr->flags & EP_ExpCollate ){ | 116 if( pExpr->op==TK_COLLATE ){ |
87 pDup->pColl = pExpr->pColl; | 117 pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); |
88 pDup->flags |= EP_ExpCollate; | |
89 } | 118 } |
90 | 119 |
91 /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This | 120 /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This |
92 ** prevents ExprDelete() from deleting the Expr structure itself, | 121 ** prevents ExprDelete() from deleting the Expr structure itself, |
93 ** allowing it to be repopulated by the memcpy() on the following line. | 122 ** allowing it to be repopulated by the memcpy() on the following line. |
| 123 ** The pExpr->u.zToken might point into memory that will be freed by the |
| 124 ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to |
| 125 ** make a copy of the token before doing the sqlite3DbFree(). |
94 */ | 126 */ |
95 ExprSetProperty(pExpr, EP_Static); | 127 ExprSetProperty(pExpr, EP_Static); |
96 sqlite3ExprDelete(db, pExpr); | 128 sqlite3ExprDelete(db, pExpr); |
97 memcpy(pExpr, pDup, sizeof(*pExpr)); | 129 memcpy(pExpr, pDup, sizeof(*pExpr)); |
| 130 if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ |
| 131 assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); |
| 132 pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); |
| 133 pExpr->flags |= EP_MemToken; |
| 134 } |
98 sqlite3DbFree(db, pDup); | 135 sqlite3DbFree(db, pDup); |
99 } | 136 } |
100 | 137 |
| 138 |
| 139 /* |
| 140 ** Return TRUE if the name zCol occurs anywhere in the USING clause. |
| 141 ** |
| 142 ** Return FALSE if the USING clause is NULL or if it does not contain |
| 143 ** zCol. |
| 144 */ |
| 145 static int nameInUsingClause(IdList *pUsing, const char *zCol){ |
| 146 if( pUsing ){ |
| 147 int k; |
| 148 for(k=0; k<pUsing->nId; k++){ |
| 149 if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ) return 1; |
| 150 } |
| 151 } |
| 152 return 0; |
| 153 } |
| 154 |
| 155 /* |
| 156 ** Subqueries stores the original database, table and column names for their |
| 157 ** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN". |
| 158 ** Check to see if the zSpan given to this routine matches the zDb, zTab, |
| 159 ** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will |
| 160 ** match anything. |
| 161 */ |
| 162 int sqlite3MatchSpanName( |
| 163 const char *zSpan, |
| 164 const char *zCol, |
| 165 const char *zTab, |
| 166 const char *zDb |
| 167 ){ |
| 168 int n; |
| 169 for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} |
| 170 if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ |
| 171 return 0; |
| 172 } |
| 173 zSpan += n+1; |
| 174 for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} |
| 175 if( zTab && (sqlite3StrNICmp(zSpan, zTab, n)!=0 || zTab[n]!=0) ){ |
| 176 return 0; |
| 177 } |
| 178 zSpan += n+1; |
| 179 if( zCol && sqlite3StrICmp(zSpan, zCol)!=0 ){ |
| 180 return 0; |
| 181 } |
| 182 return 1; |
| 183 } |
| 184 |
101 /* | 185 /* |
102 ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up | 186 ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up |
103 ** that name in the set of source tables in pSrcList and make the pExpr | 187 ** that name in the set of source tables in pSrcList and make the pExpr |
104 ** expression node refer back to that source column. The following changes | 188 ** expression node refer back to that source column. The following changes |
105 ** are made to pExpr: | 189 ** are made to pExpr: |
106 ** | 190 ** |
107 ** pExpr->iDb Set the index in db->aDb[] of the database X | 191 ** pExpr->iDb Set the index in db->aDb[] of the database X |
108 ** (even if X is implied). | 192 ** (even if X is implied). |
109 ** pExpr->iTable Set to the cursor number for the table obtained | 193 ** pExpr->iTable Set to the cursor number for the table obtained |
110 ** from pSrcList. | 194 ** from pSrcList. |
(...skipping 15 matching lines...) Expand all Loading... |
126 ** in pParse and return WRC_Abort. Return WRC_Prune on success. | 210 ** in pParse and return WRC_Abort. Return WRC_Prune on success. |
127 */ | 211 */ |
128 static int lookupName( | 212 static int lookupName( |
129 Parse *pParse, /* The parsing context */ | 213 Parse *pParse, /* The parsing context */ |
130 const char *zDb, /* Name of the database containing table, or NULL */ | 214 const char *zDb, /* Name of the database containing table, or NULL */ |
131 const char *zTab, /* Name of table containing column, or NULL */ | 215 const char *zTab, /* Name of table containing column, or NULL */ |
132 const char *zCol, /* Name of the column. */ | 216 const char *zCol, /* Name of the column. */ |
133 NameContext *pNC, /* The name context used to resolve the name */ | 217 NameContext *pNC, /* The name context used to resolve the name */ |
134 Expr *pExpr /* Make this EXPR node point to the selected column */ | 218 Expr *pExpr /* Make this EXPR node point to the selected column */ |
135 ){ | 219 ){ |
136 int i, j; /* Loop counters */ | 220 int i, j; /* Loop counters */ |
137 int cnt = 0; /* Number of matching column names */ | 221 int cnt = 0; /* Number of matching column names */ |
138 int cntTab = 0; /* Number of matching table names */ | 222 int cntTab = 0; /* Number of matching table names */ |
| 223 int nSubquery = 0; /* How many levels of subquery */ |
139 sqlite3 *db = pParse->db; /* The database connection */ | 224 sqlite3 *db = pParse->db; /* The database connection */ |
140 struct SrcList_item *pItem; /* Use for looping over pSrcList items */ | 225 struct SrcList_item *pItem; /* Use for looping over pSrcList items */ |
141 struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ | 226 struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ |
142 NameContext *pTopNC = pNC; /* First namecontext in the list */ | 227 NameContext *pTopNC = pNC; /* First namecontext in the list */ |
143 Schema *pSchema = 0; /* Schema of the expression */ | 228 Schema *pSchema = 0; /* Schema of the expression */ |
144 int isTrigger = 0; | 229 int isTrigger = 0; /* True if resolved to a trigger column */ |
| 230 Table *pTab = 0; /* Table hold the row */ |
| 231 Column *pCol; /* A column of pTab */ |
145 | 232 |
146 assert( pNC ); /* the name context cannot be NULL. */ | 233 assert( pNC ); /* the name context cannot be NULL. */ |
147 assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ | 234 assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ |
148 assert( ~ExprHasAnyProperty(pExpr, EP_TokenOnly|EP_Reduced) ); | 235 assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); |
149 | 236 |
150 /* Initialize the node to no-match */ | 237 /* Initialize the node to no-match */ |
151 pExpr->iTable = -1; | 238 pExpr->iTable = -1; |
152 pExpr->pTab = 0; | 239 pExpr->pTab = 0; |
153 ExprSetIrreducible(pExpr); | 240 ExprSetVVAProperty(pExpr, EP_NoReduce); |
| 241 |
| 242 /* Translate the schema name in zDb into a pointer to the corresponding |
| 243 ** schema. If not found, pSchema will remain NULL and nothing will match |
| 244 ** resulting in an appropriate error message toward the end of this routine |
| 245 */ |
| 246 if( zDb ){ |
| 247 testcase( pNC->ncFlags & NC_PartIdx ); |
| 248 testcase( pNC->ncFlags & NC_IsCheck ); |
| 249 if( (pNC->ncFlags & (NC_PartIdx|NC_IsCheck))!=0 ){ |
| 250 /* Silently ignore database qualifiers inside CHECK constraints and partia
l |
| 251 ** indices. Do not raise errors because that might break legacy and |
| 252 ** because it does not hurt anything to just ignore the database name. */ |
| 253 zDb = 0; |
| 254 }else{ |
| 255 for(i=0; i<db->nDb; i++){ |
| 256 assert( db->aDb[i].zName ); |
| 257 if( sqlite3StrICmp(db->aDb[i].zName,zDb)==0 ){ |
| 258 pSchema = db->aDb[i].pSchema; |
| 259 break; |
| 260 } |
| 261 } |
| 262 } |
| 263 } |
154 | 264 |
155 /* Start at the inner-most context and move outward until a match is found */ | 265 /* Start at the inner-most context and move outward until a match is found */ |
156 while( pNC && cnt==0 ){ | 266 while( pNC && cnt==0 ){ |
157 ExprList *pEList; | 267 ExprList *pEList; |
158 SrcList *pSrcList = pNC->pSrcList; | 268 SrcList *pSrcList = pNC->pSrcList; |
159 | 269 |
160 if( pSrcList ){ | 270 if( pSrcList ){ |
161 for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){ | 271 for(i=0, pItem=pSrcList->a; i<pSrcList->nSrc; i++, pItem++){ |
162 Table *pTab; | |
163 int iDb; | |
164 Column *pCol; | |
165 | |
166 pTab = pItem->pTab; | 272 pTab = pItem->pTab; |
167 assert( pTab!=0 && pTab->zName!=0 ); | 273 assert( pTab!=0 && pTab->zName!=0 ); |
168 iDb = sqlite3SchemaToIndex(db, pTab->pSchema); | |
169 assert( pTab->nCol>0 ); | 274 assert( pTab->nCol>0 ); |
| 275 if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ |
| 276 int hit = 0; |
| 277 pEList = pItem->pSelect->pEList; |
| 278 for(j=0; j<pEList->nExpr; j++){ |
| 279 if( sqlite3MatchSpanName(pEList->a[j].zSpan, zCol, zTab, zDb) ){ |
| 280 cnt++; |
| 281 cntTab = 2; |
| 282 pMatch = pItem; |
| 283 pExpr->iColumn = j; |
| 284 hit = 1; |
| 285 } |
| 286 } |
| 287 if( hit || zTab==0 ) continue; |
| 288 } |
| 289 if( zDb && pTab->pSchema!=pSchema ){ |
| 290 continue; |
| 291 } |
170 if( zTab ){ | 292 if( zTab ){ |
171 if( pItem->zAlias ){ | 293 const char *zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; |
172 char *zTabName = pItem->zAlias; | 294 assert( zTabName!=0 ); |
173 if( sqlite3StrICmp(zTabName, zTab)!=0 ) continue; | 295 if( sqlite3StrICmp(zTabName, zTab)!=0 ){ |
174 }else{ | 296 continue; |
175 char *zTabName = pTab->zName; | |
176 if( NEVER(zTabName==0) || sqlite3StrICmp(zTabName, zTab)!=0 ){ | |
177 continue; | |
178 } | |
179 if( zDb!=0 && sqlite3StrICmp(db->aDb[iDb].zName, zDb)!=0 ){ | |
180 continue; | |
181 } | |
182 } | 297 } |
183 } | 298 } |
184 if( 0==(cntTab++) ){ | 299 if( 0==(cntTab++) ){ |
185 pExpr->iTable = pItem->iCursor; | |
186 pExpr->pTab = pTab; | |
187 pSchema = pTab->pSchema; | |
188 pMatch = pItem; | 300 pMatch = pItem; |
189 } | 301 } |
190 for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){ | 302 for(j=0, pCol=pTab->aCol; j<pTab->nCol; j++, pCol++){ |
191 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ | 303 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ |
192 IdList *pUsing; | 304 /* If there has been exactly one prior match and this match |
| 305 ** is for the right-hand table of a NATURAL JOIN or is in a |
| 306 ** USING clause, then skip this match. |
| 307 */ |
| 308 if( cnt==1 ){ |
| 309 if( pItem->jointype & JT_NATURAL ) continue; |
| 310 if( nameInUsingClause(pItem->pUsing, zCol) ) continue; |
| 311 } |
193 cnt++; | 312 cnt++; |
194 pExpr->iTable = pItem->iCursor; | |
195 pExpr->pTab = pTab; | |
196 pMatch = pItem; | 313 pMatch = pItem; |
197 pSchema = pTab->pSchema; | |
198 /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ | 314 /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ |
199 pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; | 315 pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; |
200 if( i<pSrcList->nSrc-1 ){ | |
201 if( pItem[1].jointype & JT_NATURAL ){ | |
202 /* If this match occurred in the left table of a natural join, | |
203 ** then skip the right table to avoid a duplicate match */ | |
204 pItem++; | |
205 i++; | |
206 }else if( (pUsing = pItem[1].pUsing)!=0 ){ | |
207 /* If this match occurs on a column that is in the USING clause | |
208 ** of a join, skip the search of the right table of the join | |
209 ** to avoid a duplicate match there. */ | |
210 int k; | |
211 for(k=0; k<pUsing->nId; k++){ | |
212 if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ){ | |
213 pItem++; | |
214 i++; | |
215 break; | |
216 } | |
217 } | |
218 } | |
219 } | |
220 break; | 316 break; |
221 } | 317 } |
222 } | 318 } |
223 } | 319 } |
224 } | 320 if( pMatch ){ |
| 321 pExpr->iTable = pMatch->iCursor; |
| 322 pExpr->pTab = pMatch->pTab; |
| 323 assert( (pMatch->jointype & JT_RIGHT)==0 ); /* RIGHT JOIN not (yet) supp
orted */ |
| 324 if( (pMatch->jointype & JT_LEFT)!=0 ){ |
| 325 ExprSetProperty(pExpr, EP_CanBeNull); |
| 326 } |
| 327 pSchema = pExpr->pTab->pSchema; |
| 328 } |
| 329 } /* if( pSrcList ) */ |
225 | 330 |
226 #ifndef SQLITE_OMIT_TRIGGER | 331 #ifndef SQLITE_OMIT_TRIGGER |
227 /* If we have not already resolved the name, then maybe | 332 /* If we have not already resolved the name, then maybe |
228 ** it is a new.* or old.* trigger argument reference | 333 ** it is a new.* or old.* trigger argument reference |
229 */ | 334 */ |
230 if( zDb==0 && zTab!=0 && cnt==0 && pParse->pTriggerTab!=0 ){ | 335 if( zDb==0 && zTab!=0 && cntTab==0 && pParse->pTriggerTab!=0 ){ |
231 int op = pParse->eTriggerOp; | 336 int op = pParse->eTriggerOp; |
232 Table *pTab = 0; | |
233 assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); | 337 assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); |
234 if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){ | 338 if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){ |
235 pExpr->iTable = 1; | 339 pExpr->iTable = 1; |
236 pTab = pParse->pTriggerTab; | 340 pTab = pParse->pTriggerTab; |
237 }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ | 341 }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ |
238 pExpr->iTable = 0; | 342 pExpr->iTable = 0; |
239 pTab = pParse->pTriggerTab; | 343 pTab = pParse->pTriggerTab; |
| 344 }else{ |
| 345 pTab = 0; |
240 } | 346 } |
241 | 347 |
242 if( pTab ){ | 348 if( pTab ){ |
243 int iCol; | 349 int iCol; |
244 pSchema = pTab->pSchema; | 350 pSchema = pTab->pSchema; |
245 cntTab++; | 351 cntTab++; |
246 for(iCol=0; iCol<pTab->nCol; iCol++){ | 352 for(iCol=0, pCol=pTab->aCol; iCol<pTab->nCol; iCol++, pCol++){ |
247 Column *pCol = &pTab->aCol[iCol]; | |
248 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ | 353 if( sqlite3StrICmp(pCol->zName, zCol)==0 ){ |
249 if( iCol==pTab->iPKey ){ | 354 if( iCol==pTab->iPKey ){ |
250 iCol = -1; | 355 iCol = -1; |
251 } | 356 } |
252 break; | 357 break; |
253 } | 358 } |
254 } | 359 } |
255 if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) ){ | 360 if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && HasRowid(pTab) ){ |
256 iCol = -1; /* IMP: R-44911-55124 */ | 361 /* IMP: R-51414-32910 */ |
| 362 /* IMP: R-44911-55124 */ |
| 363 iCol = -1; |
257 } | 364 } |
258 if( iCol<pTab->nCol ){ | 365 if( iCol<pTab->nCol ){ |
259 cnt++; | 366 cnt++; |
260 if( iCol<0 ){ | 367 if( iCol<0 ){ |
261 pExpr->affinity = SQLITE_AFF_INTEGER; | 368 pExpr->affinity = SQLITE_AFF_INTEGER; |
262 }else if( pExpr->iTable==0 ){ | 369 }else if( pExpr->iTable==0 ){ |
263 testcase( iCol==31 ); | 370 testcase( iCol==31 ); |
264 testcase( iCol==32 ); | 371 testcase( iCol==32 ); |
265 pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); | 372 pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); |
266 }else{ | 373 }else{ |
267 testcase( iCol==31 ); | 374 testcase( iCol==31 ); |
268 testcase( iCol==32 ); | 375 testcase( iCol==32 ); |
269 pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); | 376 pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); |
270 } | 377 } |
271 pExpr->iColumn = (i16)iCol; | 378 pExpr->iColumn = (i16)iCol; |
272 pExpr->pTab = pTab; | 379 pExpr->pTab = pTab; |
273 isTrigger = 1; | 380 isTrigger = 1; |
274 } | 381 } |
275 } | 382 } |
276 } | 383 } |
277 #endif /* !defined(SQLITE_OMIT_TRIGGER) */ | 384 #endif /* !defined(SQLITE_OMIT_TRIGGER) */ |
278 | 385 |
279 /* | 386 /* |
280 ** Perhaps the name is a reference to the ROWID | 387 ** Perhaps the name is a reference to the ROWID |
281 */ | 388 */ |
282 if( cnt==0 && cntTab==1 && sqlite3IsRowid(zCol) ){ | 389 if( cnt==0 && cntTab==1 && pMatch && sqlite3IsRowid(zCol) |
| 390 && HasRowid(pMatch->pTab) ){ |
283 cnt = 1; | 391 cnt = 1; |
284 pExpr->iColumn = -1; /* IMP: R-44911-55124 */ | 392 pExpr->iColumn = -1; /* IMP: R-44911-55124 */ |
285 pExpr->affinity = SQLITE_AFF_INTEGER; | 393 pExpr->affinity = SQLITE_AFF_INTEGER; |
286 } | 394 } |
287 | 395 |
288 /* | 396 /* |
289 ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z | 397 ** If the input is of the form Z (not Y.Z or X.Y.Z) then the name Z |
290 ** might refer to an result-set alias. This happens, for example, when | 398 ** might refer to an result-set alias. This happens, for example, when |
291 ** we are resolving names in the WHERE clause of the following command: | 399 ** we are resolving names in the WHERE clause of the following command: |
292 ** | 400 ** |
293 ** SELECT a+b AS x FROM table WHERE x<10; | 401 ** SELECT a+b AS x FROM table WHERE x<10; |
294 ** | 402 ** |
295 ** In cases like this, replace pExpr with a copy of the expression that | 403 ** In cases like this, replace pExpr with a copy of the expression that |
296 ** forms the result set entry ("a+b" in the example) and return immediately. | 404 ** forms the result set entry ("a+b" in the example) and return immediately. |
297 ** Note that the expression in the result set should have already been | 405 ** Note that the expression in the result set should have already been |
298 ** resolved by the time the WHERE clause is resolved. | 406 ** resolved by the time the WHERE clause is resolved. |
| 407 ** |
| 408 ** The ability to use an output result-set column in the WHERE, GROUP BY, |
| 409 ** or HAVING clauses, or as part of a larger expression in the ORDRE BY |
| 410 ** clause is not standard SQL. This is a (goofy) SQLite extension, that |
| 411 ** is supported for backwards compatibility only. TO DO: Issue a warning |
| 412 ** on sqlite3_log() whenever the capability is used. |
299 */ | 413 */ |
300 if( cnt==0 && (pEList = pNC->pEList)!=0 && zTab==0 ){ | 414 if( (pEList = pNC->pEList)!=0 |
| 415 && zTab==0 |
| 416 && cnt==0 |
| 417 ){ |
301 for(j=0; j<pEList->nExpr; j++){ | 418 for(j=0; j<pEList->nExpr; j++){ |
302 char *zAs = pEList->a[j].zName; | 419 char *zAs = pEList->a[j].zName; |
303 if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ | 420 if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ |
304 Expr *pOrig; | 421 Expr *pOrig; |
305 assert( pExpr->pLeft==0 && pExpr->pRight==0 ); | 422 assert( pExpr->pLeft==0 && pExpr->pRight==0 ); |
306 assert( pExpr->x.pList==0 ); | 423 assert( pExpr->x.pList==0 ); |
307 assert( pExpr->x.pSelect==0 ); | 424 assert( pExpr->x.pSelect==0 ); |
308 pOrig = pEList->a[j].pExpr; | 425 pOrig = pEList->a[j].pExpr; |
309 if( !pNC->allowAgg && ExprHasProperty(pOrig, EP_Agg) ){ | 426 if( (pNC->ncFlags&NC_AllowAgg)==0 && ExprHasProperty(pOrig, EP_Agg) ){ |
310 sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); | 427 sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); |
311 return WRC_Abort; | 428 return WRC_Abort; |
312 } | 429 } |
313 resolveAlias(pParse, pEList, j, pExpr, ""); | 430 resolveAlias(pParse, pEList, j, pExpr, "", nSubquery); |
314 cnt = 1; | 431 cnt = 1; |
315 pMatch = 0; | 432 pMatch = 0; |
316 assert( zTab==0 && zDb==0 ); | 433 assert( zTab==0 && zDb==0 ); |
317 goto lookupname_end; | 434 goto lookupname_end; |
318 } | 435 } |
319 } | 436 } |
320 } | 437 } |
321 | 438 |
322 /* Advance to the next name context. The loop will exit when either | 439 /* Advance to the next name context. The loop will exit when either |
323 ** we have a match (cnt>0) or when we run out of name contexts. | 440 ** we have a match (cnt>0) or when we run out of name contexts. |
324 */ | 441 */ |
325 if( cnt==0 ){ | 442 if( cnt==0 ){ |
326 pNC = pNC->pNext; | 443 pNC = pNC->pNext; |
| 444 nSubquery++; |
327 } | 445 } |
328 } | 446 } |
329 | 447 |
330 /* | 448 /* |
331 ** If X and Y are NULL (in other words if only the column name Z is | 449 ** If X and Y are NULL (in other words if only the column name Z is |
332 ** supplied) and the value of Z is enclosed in double-quotes, then | 450 ** supplied) and the value of Z is enclosed in double-quotes, then |
333 ** Z is a string literal if it doesn't match any column names. In that | 451 ** Z is a string literal if it doesn't match any column names. In that |
334 ** case, we need to return right away and not make any changes to | 452 ** case, we need to return right away and not make any changes to |
335 ** pExpr. | 453 ** pExpr. |
336 ** | 454 ** |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 /* Clean up and return | 498 /* Clean up and return |
381 */ | 499 */ |
382 sqlite3ExprDelete(db, pExpr->pLeft); | 500 sqlite3ExprDelete(db, pExpr->pLeft); |
383 pExpr->pLeft = 0; | 501 pExpr->pLeft = 0; |
384 sqlite3ExprDelete(db, pExpr->pRight); | 502 sqlite3ExprDelete(db, pExpr->pRight); |
385 pExpr->pRight = 0; | 503 pExpr->pRight = 0; |
386 pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN); | 504 pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN); |
387 lookupname_end: | 505 lookupname_end: |
388 if( cnt==1 ){ | 506 if( cnt==1 ){ |
389 assert( pNC!=0 ); | 507 assert( pNC!=0 ); |
390 sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); | 508 if( pExpr->op!=TK_AS ){ |
| 509 sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); |
| 510 } |
391 /* Increment the nRef value on all name contexts from TopNC up to | 511 /* Increment the nRef value on all name contexts from TopNC up to |
392 ** the point where the name matched. */ | 512 ** the point where the name matched. */ |
393 for(;;){ | 513 for(;;){ |
394 assert( pTopNC!=0 ); | 514 assert( pTopNC!=0 ); |
395 pTopNC->nRef++; | 515 pTopNC->nRef++; |
396 if( pTopNC==pNC ) break; | 516 if( pTopNC==pNC ) break; |
397 pTopNC = pTopNC->pNext; | 517 pTopNC = pTopNC->pNext; |
398 } | 518 } |
399 return WRC_Prune; | 519 return WRC_Prune; |
400 } else { | 520 } else { |
(...skipping 18 matching lines...) Expand all Loading... |
419 testcase( iCol==BMS ); | 539 testcase( iCol==BMS ); |
420 testcase( iCol==BMS-1 ); | 540 testcase( iCol==BMS-1 ); |
421 pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); | 541 pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); |
422 } | 542 } |
423 ExprSetProperty(p, EP_Resolved); | 543 ExprSetProperty(p, EP_Resolved); |
424 } | 544 } |
425 return p; | 545 return p; |
426 } | 546 } |
427 | 547 |
428 /* | 548 /* |
| 549 ** Report an error that an expression is not valid for a partial index WHERE |
| 550 ** clause. |
| 551 */ |
| 552 static void notValidPartIdxWhere( |
| 553 Parse *pParse, /* Leave error message here */ |
| 554 NameContext *pNC, /* The name context */ |
| 555 const char *zMsg /* Type of error */ |
| 556 ){ |
| 557 if( (pNC->ncFlags & NC_PartIdx)!=0 ){ |
| 558 sqlite3ErrorMsg(pParse, "%s prohibited in partial index WHERE clauses", |
| 559 zMsg); |
| 560 } |
| 561 } |
| 562 |
| 563 #ifndef SQLITE_OMIT_CHECK |
| 564 /* |
| 565 ** Report an error that an expression is not valid for a CHECK constraint. |
| 566 */ |
| 567 static void notValidCheckConstraint( |
| 568 Parse *pParse, /* Leave error message here */ |
| 569 NameContext *pNC, /* The name context */ |
| 570 const char *zMsg /* Type of error */ |
| 571 ){ |
| 572 if( (pNC->ncFlags & NC_IsCheck)!=0 ){ |
| 573 sqlite3ErrorMsg(pParse,"%s prohibited in CHECK constraints", zMsg); |
| 574 } |
| 575 } |
| 576 #else |
| 577 # define notValidCheckConstraint(P,N,M) |
| 578 #endif |
| 579 |
| 580 /* |
| 581 ** Expression p should encode a floating point value between 1.0 and 0.0. |
| 582 ** Return 1024 times this value. Or return -1 if p is not a floating point |
| 583 ** value between 1.0 and 0.0. |
| 584 */ |
| 585 static int exprProbability(Expr *p){ |
| 586 double r = -1.0; |
| 587 if( p->op!=TK_FLOAT ) return -1; |
| 588 sqlite3AtoF(p->u.zToken, &r, sqlite3Strlen30(p->u.zToken), SQLITE_UTF8); |
| 589 assert( r>=0.0 ); |
| 590 if( r>1.0 ) return -1; |
| 591 return (int)(r*1000.0); |
| 592 } |
| 593 |
| 594 /* |
429 ** This routine is callback for sqlite3WalkExpr(). | 595 ** This routine is callback for sqlite3WalkExpr(). |
430 ** | 596 ** |
431 ** Resolve symbolic names into TK_COLUMN operators for the current | 597 ** Resolve symbolic names into TK_COLUMN operators for the current |
432 ** node in the expression tree. Return 0 to continue the search down | 598 ** node in the expression tree. Return 0 to continue the search down |
433 ** the tree or 2 to abort the tree walk. | 599 ** the tree or 2 to abort the tree walk. |
434 ** | 600 ** |
435 ** This routine also does error checking and name resolution for | 601 ** This routine also does error checking and name resolution for |
436 ** function names. The operator for aggregate functions is changed | 602 ** function names. The operator for aggregate functions is changed |
437 ** to TK_AGG_FUNCTION. | 603 ** to TK_AGG_FUNCTION. |
438 */ | 604 */ |
439 static int resolveExprStep(Walker *pWalker, Expr *pExpr){ | 605 static int resolveExprStep(Walker *pWalker, Expr *pExpr){ |
440 NameContext *pNC; | 606 NameContext *pNC; |
441 Parse *pParse; | 607 Parse *pParse; |
442 | 608 |
443 pNC = pWalker->u.pNC; | 609 pNC = pWalker->u.pNC; |
444 assert( pNC!=0 ); | 610 assert( pNC!=0 ); |
445 pParse = pNC->pParse; | 611 pParse = pNC->pParse; |
446 assert( pParse==pWalker->pParse ); | 612 assert( pParse==pWalker->pParse ); |
447 | 613 |
448 if( ExprHasAnyProperty(pExpr, EP_Resolved) ) return WRC_Prune; | 614 if( ExprHasProperty(pExpr, EP_Resolved) ) return WRC_Prune; |
449 ExprSetProperty(pExpr, EP_Resolved); | 615 ExprSetProperty(pExpr, EP_Resolved); |
450 #ifndef NDEBUG | 616 #ifndef NDEBUG |
451 if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ | 617 if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ |
452 SrcList *pSrcList = pNC->pSrcList; | 618 SrcList *pSrcList = pNC->pSrcList; |
453 int i; | 619 int i; |
454 for(i=0; i<pNC->pSrcList->nSrc; i++){ | 620 for(i=0; i<pNC->pSrcList->nSrc; i++){ |
455 assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab); | 621 assert( pSrcList->a[i].iCursor>=0 && pSrcList->a[i].iCursor<pParse->nTab); |
456 } | 622 } |
457 } | 623 } |
458 #endif | 624 #endif |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 assert( pRight->op==TK_DOT ); | 668 assert( pRight->op==TK_DOT ); |
503 zDb = pExpr->pLeft->u.zToken; | 669 zDb = pExpr->pLeft->u.zToken; |
504 zTable = pRight->pLeft->u.zToken; | 670 zTable = pRight->pLeft->u.zToken; |
505 zColumn = pRight->pRight->u.zToken; | 671 zColumn = pRight->pRight->u.zToken; |
506 } | 672 } |
507 return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); | 673 return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); |
508 } | 674 } |
509 | 675 |
510 /* Resolve function names | 676 /* Resolve function names |
511 */ | 677 */ |
512 case TK_CONST_FUNC: | |
513 case TK_FUNCTION: { | 678 case TK_FUNCTION: { |
514 ExprList *pList = pExpr->x.pList; /* The argument list */ | 679 ExprList *pList = pExpr->x.pList; /* The argument list */ |
515 int n = pList ? pList->nExpr : 0; /* Number of arguments */ | 680 int n = pList ? pList->nExpr : 0; /* Number of arguments */ |
516 int no_such_func = 0; /* True if no such function exists */ | 681 int no_such_func = 0; /* True if no such function exists */ |
517 int wrong_num_args = 0; /* True if wrong number of arguments */ | 682 int wrong_num_args = 0; /* True if wrong number of arguments */ |
518 int is_agg = 0; /* True if is an aggregate function */ | 683 int is_agg = 0; /* True if is an aggregate function */ |
519 int auth; /* Authorization to use the function */ | 684 int auth; /* Authorization to use the function */ |
520 int nId; /* Number of characters in function name */ | 685 int nId; /* Number of characters in function name */ |
521 const char *zId; /* The function name. */ | 686 const char *zId; /* The function name. */ |
522 FuncDef *pDef; /* Information about the function */ | 687 FuncDef *pDef; /* Information about the function */ |
523 u8 enc = ENC(pParse->db); /* The database encoding */ | 688 u8 enc = ENC(pParse->db); /* The database encoding */ |
524 | 689 |
525 testcase( pExpr->op==TK_CONST_FUNC ); | |
526 assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); | 690 assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); |
| 691 notValidPartIdxWhere(pParse, pNC, "functions"); |
527 zId = pExpr->u.zToken; | 692 zId = pExpr->u.zToken; |
528 nId = sqlite3Strlen30(zId); | 693 nId = sqlite3Strlen30(zId); |
529 pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0); | 694 pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0); |
530 if( pDef==0 ){ | 695 if( pDef==0 ){ |
531 pDef = sqlite3FindFunction(pParse->db, zId, nId, -1, enc, 0); | 696 pDef = sqlite3FindFunction(pParse->db, zId, nId, -2, enc, 0); |
532 if( pDef==0 ){ | 697 if( pDef==0 ){ |
533 no_such_func = 1; | 698 no_such_func = 1; |
534 }else{ | 699 }else{ |
535 wrong_num_args = 1; | 700 wrong_num_args = 1; |
536 } | 701 } |
537 }else{ | 702 }else{ |
538 is_agg = pDef->xFunc==0; | 703 is_agg = pDef->xFunc==0; |
539 } | 704 if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ |
| 705 ExprSetProperty(pExpr, EP_Unlikely|EP_Skip); |
| 706 if( n==2 ){ |
| 707 pExpr->iTable = exprProbability(pList->a[1].pExpr); |
| 708 if( pExpr->iTable<0 ){ |
| 709 sqlite3ErrorMsg(pParse, "second argument to likelihood() must be a
" |
| 710 "constant between 0.0 and 1.0"); |
| 711 pNC->nErr++; |
| 712 } |
| 713 }else{ |
| 714 /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is equivalent
to |
| 715 ** likelihood(X, 0.0625). |
| 716 ** EVIDENCE-OF: R-01283-11636 The unlikely(X) function is short-hand
for |
| 717 ** likelihood(X,0.0625). |
| 718 ** EVIDENCE-OF: R-36850-34127 The likely(X) function is short-hand f
or |
| 719 ** likelihood(X,0.9375). |
| 720 ** EVIDENCE-OF: R-53436-40973 The likely(X) function is equivalent t
o |
| 721 ** likelihood(X,0.9375). */ |
| 722 /* TUNING: unlikely() probability is 0.0625. likely() is 0.9375 */ |
| 723 pExpr->iTable = pDef->zName[0]=='u' ? 62 : 938; |
| 724 } |
| 725 } |
540 #ifndef SQLITE_OMIT_AUTHORIZATION | 726 #ifndef SQLITE_OMIT_AUTHORIZATION |
541 if( pDef ){ | |
542 auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0); | 727 auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0); |
543 if( auth!=SQLITE_OK ){ | 728 if( auth!=SQLITE_OK ){ |
544 if( auth==SQLITE_DENY ){ | 729 if( auth==SQLITE_DENY ){ |
545 sqlite3ErrorMsg(pParse, "not authorized to use function: %s", | 730 sqlite3ErrorMsg(pParse, "not authorized to use function: %s", |
546 pDef->zName); | 731 pDef->zName); |
547 pNC->nErr++; | 732 pNC->nErr++; |
548 } | 733 } |
549 pExpr->op = TK_NULL; | 734 pExpr->op = TK_NULL; |
550 return WRC_Prune; | 735 return WRC_Prune; |
551 } | 736 } |
| 737 #endif |
| 738 if( pDef->funcFlags & SQLITE_FUNC_CONSTANT ) ExprSetProperty(pExpr,EP_Co
nstant); |
552 } | 739 } |
553 #endif | 740 if( is_agg && (pNC->ncFlags & NC_AllowAgg)==0 ){ |
554 if( is_agg && !pNC->allowAgg ){ | |
555 sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); | 741 sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); |
556 pNC->nErr++; | 742 pNC->nErr++; |
557 is_agg = 0; | 743 is_agg = 0; |
558 }else if( no_such_func ){ | 744 }else if( no_such_func && pParse->db->init.busy==0 ){ |
559 sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); | 745 sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); |
560 pNC->nErr++; | 746 pNC->nErr++; |
561 }else if( wrong_num_args ){ | 747 }else if( wrong_num_args ){ |
562 sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", | 748 sqlite3ErrorMsg(pParse,"wrong number of arguments to function %.*s()", |
563 nId, zId); | 749 nId, zId); |
564 pNC->nErr++; | 750 pNC->nErr++; |
565 } | 751 } |
| 752 if( is_agg ) pNC->ncFlags &= ~NC_AllowAgg; |
| 753 sqlite3WalkExprList(pWalker, pList); |
566 if( is_agg ){ | 754 if( is_agg ){ |
| 755 NameContext *pNC2 = pNC; |
567 pExpr->op = TK_AGG_FUNCTION; | 756 pExpr->op = TK_AGG_FUNCTION; |
568 pNC->hasAgg = 1; | 757 pExpr->op2 = 0; |
| 758 while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){ |
| 759 pExpr->op2++; |
| 760 pNC2 = pNC2->pNext; |
| 761 } |
| 762 assert( pDef!=0 ); |
| 763 if( pNC2 ){ |
| 764 assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); |
| 765 testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); |
| 766 pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); |
| 767 |
| 768 } |
| 769 pNC->ncFlags |= NC_AllowAgg; |
569 } | 770 } |
570 if( is_agg ) pNC->allowAgg = 0; | |
571 sqlite3WalkExprList(pWalker, pList); | |
572 if( is_agg ) pNC->allowAgg = 1; | |
573 /* FIX ME: Compute pExpr->affinity based on the expected return | 771 /* FIX ME: Compute pExpr->affinity based on the expected return |
574 ** type of the function | 772 ** type of the function |
575 */ | 773 */ |
576 return WRC_Prune; | 774 return WRC_Prune; |
577 } | 775 } |
578 #ifndef SQLITE_OMIT_SUBQUERY | 776 #ifndef SQLITE_OMIT_SUBQUERY |
579 case TK_SELECT: | 777 case TK_SELECT: |
580 case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); | 778 case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); |
581 #endif | 779 #endif |
582 case TK_IN: { | 780 case TK_IN: { |
583 testcase( pExpr->op==TK_IN ); | 781 testcase( pExpr->op==TK_IN ); |
584 if( ExprHasProperty(pExpr, EP_xIsSelect) ){ | 782 if( ExprHasProperty(pExpr, EP_xIsSelect) ){ |
585 int nRef = pNC->nRef; | 783 int nRef = pNC->nRef; |
586 #ifndef SQLITE_OMIT_CHECK | 784 notValidCheckConstraint(pParse, pNC, "subqueries"); |
587 if( pNC->isCheck ){ | 785 notValidPartIdxWhere(pParse, pNC, "subqueries"); |
588 sqlite3ErrorMsg(pParse,"subqueries prohibited in CHECK constraints"); | |
589 } | |
590 #endif | |
591 sqlite3WalkSelect(pWalker, pExpr->x.pSelect); | 786 sqlite3WalkSelect(pWalker, pExpr->x.pSelect); |
592 assert( pNC->nRef>=nRef ); | 787 assert( pNC->nRef>=nRef ); |
593 if( nRef!=pNC->nRef ){ | 788 if( nRef!=pNC->nRef ){ |
594 ExprSetProperty(pExpr, EP_VarSelect); | 789 ExprSetProperty(pExpr, EP_VarSelect); |
595 } | 790 } |
596 } | 791 } |
597 break; | 792 break; |
598 } | 793 } |
599 #ifndef SQLITE_OMIT_CHECK | |
600 case TK_VARIABLE: { | 794 case TK_VARIABLE: { |
601 if( pNC->isCheck ){ | 795 notValidCheckConstraint(pParse, pNC, "parameters"); |
602 sqlite3ErrorMsg(pParse,"parameters prohibited in CHECK constraints"); | 796 notValidPartIdxWhere(pParse, pNC, "parameters"); |
603 } | |
604 break; | 797 break; |
605 } | 798 } |
606 #endif | |
607 } | 799 } |
608 return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; | 800 return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; |
609 } | 801 } |
610 | 802 |
611 /* | 803 /* |
612 ** pEList is a list of expressions which are really the result set of the | 804 ** pEList is a list of expressions which are really the result set of the |
613 ** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause. | 805 ** a SELECT statement. pE is a term in an ORDER BY or GROUP BY clause. |
614 ** This routine checks to see if pE is a simple identifier which corresponds | 806 ** This routine checks to see if pE is a simple identifier which corresponds |
615 ** to the AS-name of one of the terms of the expression list. If it is, | 807 ** to the AS-name of one of the terms of the expression list. If it is, |
616 ** this routine return an integer between 1 and N where N is the number of | 808 ** this routine return an integer between 1 and N where N is the number of |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 | 865 |
674 assert( sqlite3ExprIsInteger(pE, &i)==0 ); | 866 assert( sqlite3ExprIsInteger(pE, &i)==0 ); |
675 pEList = pSelect->pEList; | 867 pEList = pSelect->pEList; |
676 | 868 |
677 /* Resolve all names in the ORDER BY term expression | 869 /* Resolve all names in the ORDER BY term expression |
678 */ | 870 */ |
679 memset(&nc, 0, sizeof(nc)); | 871 memset(&nc, 0, sizeof(nc)); |
680 nc.pParse = pParse; | 872 nc.pParse = pParse; |
681 nc.pSrcList = pSelect->pSrc; | 873 nc.pSrcList = pSelect->pSrc; |
682 nc.pEList = pEList; | 874 nc.pEList = pEList; |
683 nc.allowAgg = 1; | 875 nc.ncFlags = NC_AllowAgg; |
684 nc.nErr = 0; | 876 nc.nErr = 0; |
685 db = pParse->db; | 877 db = pParse->db; |
686 savedSuppErr = db->suppressErr; | 878 savedSuppErr = db->suppressErr; |
687 db->suppressErr = 1; | 879 db->suppressErr = 1; |
688 rc = sqlite3ResolveExprNames(&nc, pE); | 880 rc = sqlite3ResolveExprNames(&nc, pE); |
689 db->suppressErr = savedSuppErr; | 881 db->suppressErr = savedSuppErr; |
690 if( rc ) return 0; | 882 if( rc ) return 0; |
691 | 883 |
692 /* Try to match the ORDER BY expression against an expression | 884 /* Try to match the ORDER BY expression against an expression |
693 ** in the result set. Return an 1-based index of the matching | 885 ** in the result set. Return an 1-based index of the matching |
694 ** result-set entry. | 886 ** result-set entry. |
695 */ | 887 */ |
696 for(i=0; i<pEList->nExpr; i++){ | 888 for(i=0; i<pEList->nExpr; i++){ |
697 if( sqlite3ExprCompare(pEList->a[i].pExpr, pE)<2 ){ | 889 if( sqlite3ExprCompare(pEList->a[i].pExpr, pE, -1)<2 ){ |
698 return i+1; | 890 return i+1; |
699 } | 891 } |
700 } | 892 } |
701 | 893 |
702 /* If no match, return 0. */ | 894 /* If no match, return 0. */ |
703 return 0; | 895 return 0; |
704 } | 896 } |
705 | 897 |
706 /* | 898 /* |
707 ** Generate an ORDER BY or GROUP BY term out-of-range error. | 899 ** Generate an ORDER BY or GROUP BY term out-of-range error. |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 } | 953 } |
762 while( pSelect && moreToDo ){ | 954 while( pSelect && moreToDo ){ |
763 struct ExprList_item *pItem; | 955 struct ExprList_item *pItem; |
764 moreToDo = 0; | 956 moreToDo = 0; |
765 pEList = pSelect->pEList; | 957 pEList = pSelect->pEList; |
766 assert( pEList!=0 ); | 958 assert( pEList!=0 ); |
767 for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ | 959 for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ |
768 int iCol = -1; | 960 int iCol = -1; |
769 Expr *pE, *pDup; | 961 Expr *pE, *pDup; |
770 if( pItem->done ) continue; | 962 if( pItem->done ) continue; |
771 pE = pItem->pExpr; | 963 pE = sqlite3ExprSkipCollate(pItem->pExpr); |
772 if( sqlite3ExprIsInteger(pE, &iCol) ){ | 964 if( sqlite3ExprIsInteger(pE, &iCol) ){ |
773 if( iCol<=0 || iCol>pEList->nExpr ){ | 965 if( iCol<=0 || iCol>pEList->nExpr ){ |
774 resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); | 966 resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); |
775 return 1; | 967 return 1; |
776 } | 968 } |
777 }else{ | 969 }else{ |
778 iCol = resolveAsName(pParse, pEList, pE); | 970 iCol = resolveAsName(pParse, pEList, pE); |
779 if( iCol==0 ){ | 971 if( iCol==0 ){ |
780 pDup = sqlite3ExprDup(db, pE, 0); | 972 pDup = sqlite3ExprDup(db, pE, 0); |
781 if( !db->mallocFailed ){ | 973 if( !db->mallocFailed ){ |
782 assert(pDup); | 974 assert(pDup); |
783 iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); | 975 iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); |
784 } | 976 } |
785 sqlite3ExprDelete(db, pDup); | 977 sqlite3ExprDelete(db, pDup); |
786 } | 978 } |
787 } | 979 } |
788 if( iCol>0 ){ | 980 if( iCol>0 ){ |
789 CollSeq *pColl = pE->pColl; | 981 /* Convert the ORDER BY term into an integer column number iCol, |
790 int flags = pE->flags & EP_ExpCollate; | 982 ** taking care to preserve the COLLATE clause if it exists */ |
| 983 Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); |
| 984 if( pNew==0 ) return 1; |
| 985 pNew->flags |= EP_IntValue; |
| 986 pNew->u.iValue = iCol; |
| 987 if( pItem->pExpr==pE ){ |
| 988 pItem->pExpr = pNew; |
| 989 }else{ |
| 990 assert( pItem->pExpr->op==TK_COLLATE ); |
| 991 assert( pItem->pExpr->pLeft==pE ); |
| 992 pItem->pExpr->pLeft = pNew; |
| 993 } |
791 sqlite3ExprDelete(db, pE); | 994 sqlite3ExprDelete(db, pE); |
792 pItem->pExpr = pE = sqlite3Expr(db, TK_INTEGER, 0); | 995 pItem->u.x.iOrderByCol = (u16)iCol; |
793 if( pE==0 ) return 1; | |
794 pE->pColl = pColl; | |
795 pE->flags |= EP_IntValue | flags; | |
796 pE->u.iValue = iCol; | |
797 pItem->iCol = (u16)iCol; | |
798 pItem->done = 1; | 996 pItem->done = 1; |
799 }else{ | 997 }else{ |
800 moreToDo = 1; | 998 moreToDo = 1; |
801 } | 999 } |
802 } | 1000 } |
803 pSelect = pSelect->pNext; | 1001 pSelect = pSelect->pNext; |
804 } | 1002 } |
805 for(i=0; i<pOrderBy->nExpr; i++){ | 1003 for(i=0; i<pOrderBy->nExpr; i++){ |
806 if( pOrderBy->a[i].done==0 ){ | 1004 if( pOrderBy->a[i].done==0 ){ |
807 sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " | 1005 sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " |
808 "column in the result set", i+1); | 1006 "column in the result set", i+1); |
809 return 1; | 1007 return 1; |
810 } | 1008 } |
811 } | 1009 } |
812 return 0; | 1010 return 0; |
813 } | 1011 } |
814 | 1012 |
815 /* | 1013 /* |
816 ** Check every term in the ORDER BY or GROUP BY clause pOrderBy of | 1014 ** Check every term in the ORDER BY or GROUP BY clause pOrderBy of |
817 ** the SELECT statement pSelect. If any term is reference to a | 1015 ** the SELECT statement pSelect. If any term is reference to a |
818 ** result set expression (as determined by the ExprList.a.iCol field) | 1016 ** result set expression (as determined by the ExprList.a.u.x.iOrderByCol |
819 ** then convert that term into a copy of the corresponding result set | 1017 ** field) then convert that term into a copy of the corresponding result set |
820 ** column. | 1018 ** column. |
821 ** | 1019 ** |
822 ** If any errors are detected, add an error message to pParse and | 1020 ** If any errors are detected, add an error message to pParse and |
823 ** return non-zero. Return zero if no errors are seen. | 1021 ** return non-zero. Return zero if no errors are seen. |
824 */ | 1022 */ |
825 int sqlite3ResolveOrderGroupBy( | 1023 int sqlite3ResolveOrderGroupBy( |
826 Parse *pParse, /* Parsing context. Leave error messages here */ | 1024 Parse *pParse, /* Parsing context. Leave error messages here */ |
827 Select *pSelect, /* The SELECT statement containing the clause */ | 1025 Select *pSelect, /* The SELECT statement containing the clause */ |
828 ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ | 1026 ExprList *pOrderBy, /* The ORDER BY or GROUP BY clause to be processed */ |
829 const char *zType /* "ORDER" or "GROUP" */ | 1027 const char *zType /* "ORDER" or "GROUP" */ |
830 ){ | 1028 ){ |
831 int i; | 1029 int i; |
832 sqlite3 *db = pParse->db; | 1030 sqlite3 *db = pParse->db; |
833 ExprList *pEList; | 1031 ExprList *pEList; |
834 struct ExprList_item *pItem; | 1032 struct ExprList_item *pItem; |
835 | 1033 |
836 if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; | 1034 if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; |
837 #if SQLITE_MAX_COLUMN | 1035 #if SQLITE_MAX_COLUMN |
838 if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ | 1036 if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ |
839 sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); | 1037 sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); |
840 return 1; | 1038 return 1; |
841 } | 1039 } |
842 #endif | 1040 #endif |
843 pEList = pSelect->pEList; | 1041 pEList = pSelect->pEList; |
844 assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ | 1042 assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ |
845 for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ | 1043 for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ |
846 if( pItem->iCol ){ | 1044 if( pItem->u.x.iOrderByCol ){ |
847 if( pItem->iCol>pEList->nExpr ){ | 1045 if( pItem->u.x.iOrderByCol>pEList->nExpr ){ |
848 resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); | 1046 resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); |
849 return 1; | 1047 return 1; |
850 } | 1048 } |
851 resolveAlias(pParse, pEList, pItem->iCol-1, pItem->pExpr, zType); | 1049 resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr, zType
,0); |
852 } | 1050 } |
853 } | 1051 } |
854 return 0; | 1052 return 0; |
855 } | 1053 } |
856 | 1054 |
857 /* | 1055 /* |
858 ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. | 1056 ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. |
859 ** The Name context of the SELECT statement is pNC. zType is either | 1057 ** The Name context of the SELECT statement is pNC. zType is either |
860 ** "ORDER" or "GROUP" depending on which type of clause pOrderBy is. | 1058 ** "ORDER" or "GROUP" depending on which type of clause pOrderBy is. |
861 ** | 1059 ** |
862 ** This routine resolves each term of the clause into an expression. | 1060 ** This routine resolves each term of the clause into an expression. |
863 ** If the order-by term is an integer I between 1 and N (where N is the | 1061 ** If the order-by term is an integer I between 1 and N (where N is the |
864 ** number of columns in the result set of the SELECT) then the expression | 1062 ** number of columns in the result set of the SELECT) then the expression |
865 ** in the resolution is a copy of the I-th result-set expression. If | 1063 ** in the resolution is a copy of the I-th result-set expression. If |
866 ** the order-by term is an identify that corresponds to the AS-name of | 1064 ** the order-by term is an identifier that corresponds to the AS-name of |
867 ** a result-set expression, then the term resolves to a copy of the | 1065 ** a result-set expression, then the term resolves to a copy of the |
868 ** result-set expression. Otherwise, the expression is resolved in | 1066 ** result-set expression. Otherwise, the expression is resolved in |
869 ** the usual way - using sqlite3ResolveExprNames(). | 1067 ** the usual way - using sqlite3ResolveExprNames(). |
870 ** | 1068 ** |
871 ** This routine returns the number of errors. If errors occur, then | 1069 ** This routine returns the number of errors. If errors occur, then |
872 ** an appropriate error message might be left in pParse. (OOM errors | 1070 ** an appropriate error message might be left in pParse. (OOM errors |
873 ** excepted.) | 1071 ** excepted.) |
874 */ | 1072 */ |
875 static int resolveOrderGroupBy( | 1073 static int resolveOrderGroupBy( |
876 NameContext *pNC, /* The name context of the SELECT statement */ | 1074 NameContext *pNC, /* The name context of the SELECT statement */ |
877 Select *pSelect, /* The SELECT statement holding pOrderBy */ | 1075 Select *pSelect, /* The SELECT statement holding pOrderBy */ |
878 ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */ | 1076 ExprList *pOrderBy, /* An ORDER BY or GROUP BY clause to resolve */ |
879 const char *zType /* Either "ORDER" or "GROUP", as appropriate */ | 1077 const char *zType /* Either "ORDER" or "GROUP", as appropriate */ |
880 ){ | 1078 ){ |
881 int i; /* Loop counter */ | 1079 int i, j; /* Loop counters */ |
882 int iCol; /* Column number */ | 1080 int iCol; /* Column number */ |
883 struct ExprList_item *pItem; /* A term of the ORDER BY clause */ | 1081 struct ExprList_item *pItem; /* A term of the ORDER BY clause */ |
884 Parse *pParse; /* Parsing context */ | 1082 Parse *pParse; /* Parsing context */ |
885 int nResult; /* Number of terms in the result set */ | 1083 int nResult; /* Number of terms in the result set */ |
886 | 1084 |
887 if( pOrderBy==0 ) return 0; | 1085 if( pOrderBy==0 ) return 0; |
888 nResult = pSelect->pEList->nExpr; | 1086 nResult = pSelect->pEList->nExpr; |
889 pParse = pNC->pParse; | 1087 pParse = pNC->pParse; |
890 for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ | 1088 for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ |
891 Expr *pE = pItem->pExpr; | 1089 Expr *pE = pItem->pExpr; |
892 iCol = resolveAsName(pParse, pSelect->pEList, pE); | 1090 Expr *pE2 = sqlite3ExprSkipCollate(pE); |
893 if( iCol>0 ){ | 1091 if( zType[0]!='G' ){ |
894 /* If an AS-name match is found, mark this ORDER BY column as being | 1092 iCol = resolveAsName(pParse, pSelect->pEList, pE2); |
895 ** a copy of the iCol-th result-set column. The subsequent call to | 1093 if( iCol>0 ){ |
896 ** sqlite3ResolveOrderGroupBy() will convert the expression to a | 1094 /* If an AS-name match is found, mark this ORDER BY column as being |
897 ** copy of the iCol-th result-set expression. */ | 1095 ** a copy of the iCol-th result-set column. The subsequent call to |
898 pItem->iCol = (u16)iCol; | 1096 ** sqlite3ResolveOrderGroupBy() will convert the expression to a |
899 continue; | 1097 ** copy of the iCol-th result-set expression. */ |
| 1098 pItem->u.x.iOrderByCol = (u16)iCol; |
| 1099 continue; |
| 1100 } |
900 } | 1101 } |
901 if( sqlite3ExprIsInteger(pE, &iCol) ){ | 1102 if( sqlite3ExprIsInteger(pE2, &iCol) ){ |
902 /* The ORDER BY term is an integer constant. Again, set the column | 1103 /* The ORDER BY term is an integer constant. Again, set the column |
903 ** number so that sqlite3ResolveOrderGroupBy() will convert the | 1104 ** number so that sqlite3ResolveOrderGroupBy() will convert the |
904 ** order-by term to a copy of the result-set expression */ | 1105 ** order-by term to a copy of the result-set expression */ |
905 if( iCol<1 ){ | 1106 if( iCol<1 || iCol>0xffff ){ |
906 resolveOutOfRangeError(pParse, zType, i+1, nResult); | 1107 resolveOutOfRangeError(pParse, zType, i+1, nResult); |
907 return 1; | 1108 return 1; |
908 } | 1109 } |
909 pItem->iCol = (u16)iCol; | 1110 pItem->u.x.iOrderByCol = (u16)iCol; |
910 continue; | 1111 continue; |
911 } | 1112 } |
912 | 1113 |
913 /* Otherwise, treat the ORDER BY term as an ordinary expression */ | 1114 /* Otherwise, treat the ORDER BY term as an ordinary expression */ |
914 pItem->iCol = 0; | 1115 pItem->u.x.iOrderByCol = 0; |
915 if( sqlite3ResolveExprNames(pNC, pE) ){ | 1116 if( sqlite3ResolveExprNames(pNC, pE) ){ |
916 return 1; | 1117 return 1; |
917 } | 1118 } |
| 1119 for(j=0; j<pSelect->pEList->nExpr; j++){ |
| 1120 if( sqlite3ExprCompare(pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ |
| 1121 pItem->u.x.iOrderByCol = j+1; |
| 1122 } |
| 1123 } |
918 } | 1124 } |
919 return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType); | 1125 return sqlite3ResolveOrderGroupBy(pParse, pSelect, pOrderBy, zType); |
920 } | 1126 } |
921 | 1127 |
922 /* | 1128 /* |
923 ** Resolve names in the SELECT statement p and all of its descendents. | 1129 ** Resolve names in the SELECT statement p and all of its descendants. |
924 */ | 1130 */ |
925 static int resolveSelectStep(Walker *pWalker, Select *p){ | 1131 static int resolveSelectStep(Walker *pWalker, Select *p){ |
926 NameContext *pOuterNC; /* Context that contains this SELECT */ | 1132 NameContext *pOuterNC; /* Context that contains this SELECT */ |
927 NameContext sNC; /* Name context of this SELECT */ | 1133 NameContext sNC; /* Name context of this SELECT */ |
928 int isCompound; /* True if p is a compound select */ | 1134 int isCompound; /* True if p is a compound select */ |
929 int nCompound; /* Number of compound terms processed so far */ | 1135 int nCompound; /* Number of compound terms processed so far */ |
930 Parse *pParse; /* Parsing context */ | 1136 Parse *pParse; /* Parsing context */ |
931 ExprList *pEList; /* Result set expression list */ | 1137 ExprList *pEList; /* Result set expression list */ |
932 int i; /* Loop counter */ | 1138 int i; /* Loop counter */ |
933 ExprList *pGroupBy; /* The GROUP BY clause */ | 1139 ExprList *pGroupBy; /* The GROUP BY clause */ |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 /* Resolve the expressions in the LIMIT and OFFSET clauses. These | 1173 /* Resolve the expressions in the LIMIT and OFFSET clauses. These |
968 ** are not allowed to refer to any names, so pass an empty NameContext. | 1174 ** are not allowed to refer to any names, so pass an empty NameContext. |
969 */ | 1175 */ |
970 memset(&sNC, 0, sizeof(sNC)); | 1176 memset(&sNC, 0, sizeof(sNC)); |
971 sNC.pParse = pParse; | 1177 sNC.pParse = pParse; |
972 if( sqlite3ResolveExprNames(&sNC, p->pLimit) || | 1178 if( sqlite3ResolveExprNames(&sNC, p->pLimit) || |
973 sqlite3ResolveExprNames(&sNC, p->pOffset) ){ | 1179 sqlite3ResolveExprNames(&sNC, p->pOffset) ){ |
974 return WRC_Abort; | 1180 return WRC_Abort; |
975 } | 1181 } |
976 | 1182 |
| 1183 /* Recursively resolve names in all subqueries |
| 1184 */ |
| 1185 for(i=0; i<p->pSrc->nSrc; i++){ |
| 1186 struct SrcList_item *pItem = &p->pSrc->a[i]; |
| 1187 if( pItem->pSelect ){ |
| 1188 NameContext *pNC; /* Used to iterate name contexts */ |
| 1189 int nRef = 0; /* Refcount for pOuterNC and outer contexts */ |
| 1190 const char *zSavedContext = pParse->zAuthContext; |
| 1191 |
| 1192 /* Count the total number of references to pOuterNC and all of its |
| 1193 ** parent contexts. After resolving references to expressions in |
| 1194 ** pItem->pSelect, check if this value has changed. If so, then |
| 1195 ** SELECT statement pItem->pSelect must be correlated. Set the |
| 1196 ** pItem->isCorrelated flag if this is the case. */ |
| 1197 for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef += pNC->nRef; |
| 1198 |
| 1199 if( pItem->zName ) pParse->zAuthContext = pItem->zName; |
| 1200 sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); |
| 1201 pParse->zAuthContext = zSavedContext; |
| 1202 if( pParse->nErr || db->mallocFailed ) return WRC_Abort; |
| 1203 |
| 1204 for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef -= pNC->nRef; |
| 1205 assert( pItem->isCorrelated==0 && nRef<=0 ); |
| 1206 pItem->isCorrelated = (nRef!=0); |
| 1207 } |
| 1208 } |
| 1209 |
977 /* Set up the local name-context to pass to sqlite3ResolveExprNames() to | 1210 /* Set up the local name-context to pass to sqlite3ResolveExprNames() to |
978 ** resolve the result-set expression list. | 1211 ** resolve the result-set expression list. |
979 */ | 1212 */ |
980 sNC.allowAgg = 1; | 1213 sNC.ncFlags = NC_AllowAgg; |
981 sNC.pSrcList = p->pSrc; | 1214 sNC.pSrcList = p->pSrc; |
982 sNC.pNext = pOuterNC; | 1215 sNC.pNext = pOuterNC; |
983 | 1216 |
984 /* Resolve names in the result set. */ | 1217 /* Resolve names in the result set. */ |
985 pEList = p->pEList; | 1218 pEList = p->pEList; |
986 assert( pEList!=0 ); | 1219 assert( pEList!=0 ); |
987 for(i=0; i<pEList->nExpr; i++){ | 1220 for(i=0; i<pEList->nExpr; i++){ |
988 Expr *pX = pEList->a[i].pExpr; | 1221 Expr *pX = pEList->a[i].pExpr; |
989 if( sqlite3ResolveExprNames(&sNC, pX) ){ | 1222 if( sqlite3ResolveExprNames(&sNC, pX) ){ |
990 return WRC_Abort; | 1223 return WRC_Abort; |
991 } | 1224 } |
992 } | 1225 } |
993 | 1226 |
994 /* Recursively resolve names in all subqueries | |
995 */ | |
996 for(i=0; i<p->pSrc->nSrc; i++){ | |
997 struct SrcList_item *pItem = &p->pSrc->a[i]; | |
998 if( pItem->pSelect ){ | |
999 const char *zSavedContext = pParse->zAuthContext; | |
1000 if( pItem->zName ) pParse->zAuthContext = pItem->zName; | |
1001 sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC); | |
1002 pParse->zAuthContext = zSavedContext; | |
1003 if( pParse->nErr || db->mallocFailed ) return WRC_Abort; | |
1004 } | |
1005 } | |
1006 | |
1007 /* If there are no aggregate functions in the result-set, and no GROUP BY | 1227 /* If there are no aggregate functions in the result-set, and no GROUP BY |
1008 ** expression, do not allow aggregates in any of the other expressions. | 1228 ** expression, do not allow aggregates in any of the other expressions. |
1009 */ | 1229 */ |
1010 assert( (p->selFlags & SF_Aggregate)==0 ); | 1230 assert( (p->selFlags & SF_Aggregate)==0 ); |
1011 pGroupBy = p->pGroupBy; | 1231 pGroupBy = p->pGroupBy; |
1012 if( pGroupBy || sNC.hasAgg ){ | 1232 if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){ |
1013 p->selFlags |= SF_Aggregate; | 1233 assert( NC_MinMaxAgg==SF_MinMaxAgg ); |
| 1234 p->selFlags |= SF_Aggregate | (sNC.ncFlags&NC_MinMaxAgg); |
1014 }else{ | 1235 }else{ |
1015 sNC.allowAgg = 0; | 1236 sNC.ncFlags &= ~NC_AllowAgg; |
1016 } | 1237 } |
1017 | 1238 |
1018 /* If a HAVING clause is present, then there must be a GROUP BY clause. | 1239 /* If a HAVING clause is present, then there must be a GROUP BY clause. |
1019 */ | 1240 */ |
1020 if( p->pHaving && !pGroupBy ){ | 1241 if( p->pHaving && !pGroupBy ){ |
1021 sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); | 1242 sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); |
1022 return WRC_Abort; | 1243 return WRC_Abort; |
1023 } | 1244 } |
1024 | 1245 |
1025 /* Add the expression list to the name-context before parsing the | 1246 /* Add the output column list to the name-context before parsing the |
1026 ** other expressions in the SELECT statement. This is so that | 1247 ** other expressions in the SELECT statement. This is so that |
1027 ** expressions in the WHERE clause (etc.) can refer to expressions by | 1248 ** expressions in the WHERE clause (etc.) can refer to expressions by |
1028 ** aliases in the result set. | 1249 ** aliases in the result set. |
1029 ** | 1250 ** |
1030 ** Minor point: If this is the case, then the expression will be | 1251 ** Minor point: If this is the case, then the expression will be |
1031 ** re-evaluated for each reference to it. | 1252 ** re-evaluated for each reference to it. |
1032 */ | 1253 */ |
1033 sNC.pEList = p->pEList; | 1254 sNC.pEList = p->pEList; |
1034 if( sqlite3ResolveExprNames(&sNC, p->pWhere) || | 1255 if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; |
1035 sqlite3ResolveExprNames(&sNC, p->pHaving) | 1256 if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort; |
1036 ){ | |
1037 return WRC_Abort; | |
1038 } | |
1039 | 1257 |
1040 /* The ORDER BY and GROUP BY clauses may not refer to terms in | 1258 /* The ORDER BY and GROUP BY clauses may not refer to terms in |
1041 ** outer queries | 1259 ** outer queries |
1042 */ | 1260 */ |
1043 sNC.pNext = 0; | 1261 sNC.pNext = 0; |
1044 sNC.allowAgg = 1; | 1262 sNC.ncFlags |= NC_AllowAgg; |
1045 | 1263 |
1046 /* Process the ORDER BY clause for singleton SELECT statements. | 1264 /* Process the ORDER BY clause for singleton SELECT statements. |
1047 ** The ORDER BY clause for compounds SELECT statements is handled | 1265 ** The ORDER BY clause for compounds SELECT statements is handled |
1048 ** below, after all of the result-sets for all of the elements of | 1266 ** below, after all of the result-sets for all of the elements of |
1049 ** the compound have been resolved. | 1267 ** the compound have been resolved. |
1050 */ | 1268 */ |
1051 if( !isCompound && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") ){ | 1269 if( !isCompound && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") ){ |
1052 return WRC_Abort; | 1270 return WRC_Abort; |
1053 } | 1271 } |
1054 if( db->mallocFailed ){ | 1272 if( db->mallocFailed ){ |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1122 ** tree. For example, in: | 1340 ** tree. For example, in: |
1123 ** | 1341 ** |
1124 ** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x; | 1342 ** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY x; |
1125 ** | 1343 ** |
1126 ** The "x" term of the order by is replaced by "a+b" to render: | 1344 ** The "x" term of the order by is replaced by "a+b" to render: |
1127 ** | 1345 ** |
1128 ** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; | 1346 ** SELECT a+b AS x, c+d AS y FROM t1 ORDER BY a+b; |
1129 ** | 1347 ** |
1130 ** Function calls are checked to make sure that the function is | 1348 ** Function calls are checked to make sure that the function is |
1131 ** defined and that the correct number of arguments are specified. | 1349 ** defined and that the correct number of arguments are specified. |
1132 ** If the function is an aggregate function, then the pNC->hasAgg is | 1350 ** If the function is an aggregate function, then the NC_HasAgg flag is |
1133 ** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. | 1351 ** set and the opcode is changed from TK_FUNCTION to TK_AGG_FUNCTION. |
1134 ** If an expression contains aggregate functions then the EP_Agg | 1352 ** If an expression contains aggregate functions then the EP_Agg |
1135 ** property on the expression is set. | 1353 ** property on the expression is set. |
1136 ** | 1354 ** |
1137 ** An error message is left in pParse if anything is amiss. The number | 1355 ** An error message is left in pParse if anything is amiss. The number |
1138 ** if errors is returned. | 1356 ** if errors is returned. |
1139 */ | 1357 */ |
1140 int sqlite3ResolveExprNames( | 1358 int sqlite3ResolveExprNames( |
1141 NameContext *pNC, /* Namespace to resolve expressions in. */ | 1359 NameContext *pNC, /* Namespace to resolve expressions in. */ |
1142 Expr *pExpr /* The expression to be analyzed. */ | 1360 Expr *pExpr /* The expression to be analyzed. */ |
1143 ){ | 1361 ){ |
1144 int savedHasAgg; | 1362 u16 savedHasAgg; |
1145 Walker w; | 1363 Walker w; |
1146 | 1364 |
1147 if( pExpr==0 ) return 0; | 1365 if( pExpr==0 ) return 0; |
1148 #if SQLITE_MAX_EXPR_DEPTH>0 | 1366 #if SQLITE_MAX_EXPR_DEPTH>0 |
1149 { | 1367 { |
1150 Parse *pParse = pNC->pParse; | 1368 Parse *pParse = pNC->pParse; |
1151 if( sqlite3ExprCheckHeight(pParse, pExpr->nHeight+pNC->pParse->nHeight) ){ | 1369 if( sqlite3ExprCheckHeight(pParse, pExpr->nHeight+pNC->pParse->nHeight) ){ |
1152 return 1; | 1370 return 1; |
1153 } | 1371 } |
1154 pParse->nHeight += pExpr->nHeight; | 1372 pParse->nHeight += pExpr->nHeight; |
1155 } | 1373 } |
1156 #endif | 1374 #endif |
1157 savedHasAgg = pNC->hasAgg; | 1375 savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg); |
1158 pNC->hasAgg = 0; | 1376 pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg); |
| 1377 memset(&w, 0, sizeof(w)); |
1159 w.xExprCallback = resolveExprStep; | 1378 w.xExprCallback = resolveExprStep; |
1160 w.xSelectCallback = resolveSelectStep; | 1379 w.xSelectCallback = resolveSelectStep; |
1161 w.pParse = pNC->pParse; | 1380 w.pParse = pNC->pParse; |
1162 w.u.pNC = pNC; | 1381 w.u.pNC = pNC; |
1163 sqlite3WalkExpr(&w, pExpr); | 1382 sqlite3WalkExpr(&w, pExpr); |
1164 #if SQLITE_MAX_EXPR_DEPTH>0 | 1383 #if SQLITE_MAX_EXPR_DEPTH>0 |
1165 pNC->pParse->nHeight -= pExpr->nHeight; | 1384 pNC->pParse->nHeight -= pExpr->nHeight; |
1166 #endif | 1385 #endif |
1167 if( pNC->nErr>0 || w.pParse->nErr>0 ){ | 1386 if( pNC->nErr>0 || w.pParse->nErr>0 ){ |
1168 ExprSetProperty(pExpr, EP_Error); | 1387 ExprSetProperty(pExpr, EP_Error); |
1169 } | 1388 } |
1170 if( pNC->hasAgg ){ | 1389 if( pNC->ncFlags & NC_HasAgg ){ |
1171 ExprSetProperty(pExpr, EP_Agg); | 1390 ExprSetProperty(pExpr, EP_Agg); |
1172 }else if( savedHasAgg ){ | |
1173 pNC->hasAgg = 1; | |
1174 } | 1391 } |
| 1392 pNC->ncFlags |= savedHasAgg; |
1175 return ExprHasProperty(pExpr, EP_Error); | 1393 return ExprHasProperty(pExpr, EP_Error); |
1176 } | 1394 } |
1177 | 1395 |
1178 | 1396 |
1179 /* | 1397 /* |
1180 ** Resolve all names in all expressions of a SELECT and in all | 1398 ** Resolve all names in all expressions of a SELECT and in all |
1181 ** decendents of the SELECT, including compounds off of p->pPrior, | 1399 ** decendents of the SELECT, including compounds off of p->pPrior, |
1182 ** subqueries in expressions, and subqueries used as FROM clause | 1400 ** subqueries in expressions, and subqueries used as FROM clause |
1183 ** terms. | 1401 ** terms. |
1184 ** | 1402 ** |
1185 ** See sqlite3ResolveExprNames() for a description of the kinds of | 1403 ** See sqlite3ResolveExprNames() for a description of the kinds of |
1186 ** transformations that occur. | 1404 ** transformations that occur. |
1187 ** | 1405 ** |
1188 ** All SELECT statements should have been expanded using | 1406 ** All SELECT statements should have been expanded using |
1189 ** sqlite3SelectExpand() prior to invoking this routine. | 1407 ** sqlite3SelectExpand() prior to invoking this routine. |
1190 */ | 1408 */ |
1191 void sqlite3ResolveSelectNames( | 1409 void sqlite3ResolveSelectNames( |
1192 Parse *pParse, /* The parser context */ | 1410 Parse *pParse, /* The parser context */ |
1193 Select *p, /* The SELECT statement being coded. */ | 1411 Select *p, /* The SELECT statement being coded. */ |
1194 NameContext *pOuterNC /* Name context for parent SELECT statement */ | 1412 NameContext *pOuterNC /* Name context for parent SELECT statement */ |
1195 ){ | 1413 ){ |
1196 Walker w; | 1414 Walker w; |
1197 | 1415 |
1198 assert( p!=0 ); | 1416 assert( p!=0 ); |
| 1417 memset(&w, 0, sizeof(w)); |
1199 w.xExprCallback = resolveExprStep; | 1418 w.xExprCallback = resolveExprStep; |
1200 w.xSelectCallback = resolveSelectStep; | 1419 w.xSelectCallback = resolveSelectStep; |
1201 w.pParse = pParse; | 1420 w.pParse = pParse; |
1202 w.u.pNC = pOuterNC; | 1421 w.u.pNC = pOuterNC; |
1203 sqlite3WalkSelect(&w, p); | 1422 sqlite3WalkSelect(&w, p); |
1204 } | 1423 } |
| 1424 |
| 1425 /* |
| 1426 ** Resolve names in expressions that can only reference a single table: |
| 1427 ** |
| 1428 ** * CHECK constraints |
| 1429 ** * WHERE clauses on partial indices |
| 1430 ** |
| 1431 ** The Expr.iTable value for Expr.op==TK_COLUMN nodes of the expression |
| 1432 ** is set to -1 and the Expr.iColumn value is set to the column number. |
| 1433 ** |
| 1434 ** Any errors cause an error message to be set in pParse. |
| 1435 */ |
| 1436 void sqlite3ResolveSelfReference( |
| 1437 Parse *pParse, /* Parsing context */ |
| 1438 Table *pTab, /* The table being referenced */ |
| 1439 int type, /* NC_IsCheck or NC_PartIdx */ |
| 1440 Expr *pExpr, /* Expression to resolve. May be NULL. */ |
| 1441 ExprList *pList /* Expression list to resolve. May be NUL. */ |
| 1442 ){ |
| 1443 SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ |
| 1444 NameContext sNC; /* Name context for pParse->pNewTable */ |
| 1445 int i; /* Loop counter */ |
| 1446 |
| 1447 assert( type==NC_IsCheck || type==NC_PartIdx ); |
| 1448 memset(&sNC, 0, sizeof(sNC)); |
| 1449 memset(&sSrc, 0, sizeof(sSrc)); |
| 1450 sSrc.nSrc = 1; |
| 1451 sSrc.a[0].zName = pTab->zName; |
| 1452 sSrc.a[0].pTab = pTab; |
| 1453 sSrc.a[0].iCursor = -1; |
| 1454 sNC.pParse = pParse; |
| 1455 sNC.pSrcList = &sSrc; |
| 1456 sNC.ncFlags = type; |
| 1457 if( sqlite3ResolveExprNames(&sNC, pExpr) ) return; |
| 1458 if( pList ){ |
| 1459 for(i=0; i<pList->nExpr; i++){ |
| 1460 if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){ |
| 1461 return; |
| 1462 } |
| 1463 } |
| 1464 } |
| 1465 } |
OLD | NEW |