Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: third_party/sqlite/sqlite-src-3080704/src/parse.y

Issue 883353008: [sql] Import reference version of SQLite 3.8.7.4. (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Hold back encoding change which is messing up patch. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 ** 2001 September 15 2 ** 2001 September 15
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 **
(...skipping 15 matching lines...) Expand all
26 26
27 // The generated parser function takes a 4th argument as follows: 27 // The generated parser function takes a 4th argument as follows:
28 %extra_argument {Parse *pParse} 28 %extra_argument {Parse *pParse}
29 29
30 // This code runs whenever there is a syntax error 30 // This code runs whenever there is a syntax error
31 // 31 //
32 %syntax_error { 32 %syntax_error {
33 UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ 33 UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */
34 assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ 34 assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */
35 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 35 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
36 pParse->parseError = 1;
37 } 36 }
38 %stack_overflow { 37 %stack_overflow {
39 UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ 38 UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */
40 sqlite3ErrorMsg(pParse, "parser stack overflow"); 39 sqlite3ErrorMsg(pParse, "parser stack overflow");
41 pParse->parseError = 1;
42 } 40 }
43 41
44 // The name of the generated procedure that implements the parser 42 // The name of the generated procedure that implements the parser
45 // is as follows: 43 // is as follows:
46 %name sqlite3Parser 44 %name sqlite3Parser
47 45
48 // The following text is included near the beginning of the C source 46 // The following text is included near the beginning of the C source
49 // code file that implements the parser. 47 // code file that implements the parser.
50 // 48 //
51 %include { 49 %include {
(...skipping 18 matching lines...) Expand all
70 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 68 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */
71 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 69 Expr *pOffset; /* The OFFSET expression. NULL if there is none */
72 }; 70 };
73 71
74 /* 72 /*
75 ** An instance of this structure is used to store the LIKE, 73 ** An instance of this structure is used to store the LIKE,
76 ** GLOB, NOT LIKE, and NOT GLOB operators. 74 ** GLOB, NOT LIKE, and NOT GLOB operators.
77 */ 75 */
78 struct LikeOp { 76 struct LikeOp {
79 Token eOperator; /* "like" or "glob" or "regexp" */ 77 Token eOperator; /* "like" or "glob" or "regexp" */
80 int not; /* True if the NOT keyword is present */ 78 int bNot; /* True if the NOT keyword is present */
81 }; 79 };
82 80
83 /* 81 /*
84 ** An instance of the following structure describes the event of a 82 ** An instance of the following structure describes the event of a
85 ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 83 ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT,
86 ** TK_DELETE, or TK_INSTEAD. If the event is of the form 84 ** TK_DELETE, or TK_INSTEAD. If the event is of the form
87 ** 85 **
88 ** UPDATE ON (a,b,c) 86 ** UPDATE ON (a,b,c)
89 ** 87 **
90 ** Then the "b" IdList records the list "a,b,c". 88 ** Then the "b" IdList records the list "a,b,c".
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 A = X; 148 A = X;
151 } 149 }
152 %type ifnotexists {int} 150 %type ifnotexists {int}
153 ifnotexists(A) ::= . {A = 0;} 151 ifnotexists(A) ::= . {A = 0;}
154 ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 152 ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
155 %type temp {int} 153 %type temp {int}
156 %ifndef SQLITE_OMIT_TEMPDB 154 %ifndef SQLITE_OMIT_TEMPDB
157 temp(A) ::= TEMP. {A = 1;} 155 temp(A) ::= TEMP. {A = 1;}
158 %endif SQLITE_OMIT_TEMPDB 156 %endif SQLITE_OMIT_TEMPDB
159 temp(A) ::= . {A = 0;} 157 temp(A) ::= . {A = 0;}
160 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { 158 create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
161 sqlite3EndTable(pParse,&X,&Y,0); 159 sqlite3EndTable(pParse,&X,&E,F,0);
162 } 160 }
163 create_table_args ::= AS select(S). { 161 create_table_args ::= AS select(S). {
164 sqlite3EndTable(pParse,0,0,S); 162 sqlite3EndTable(pParse,0,0,0,S);
165 sqlite3SelectDelete(pParse->db, S); 163 sqlite3SelectDelete(pParse->db, S);
166 } 164 }
165 %type table_options {u8}
166 table_options(A) ::= . {A = 0;}
167 table_options(A) ::= WITHOUT nm(X). {
168 if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
169 A = TF_WithoutRowid;
170 }else{
171 A = 0;
172 sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
173 }
174 }
167 columnlist ::= columnlist COMMA column. 175 columnlist ::= columnlist COMMA column.
168 columnlist ::= column. 176 columnlist ::= column.
169 177
170 // A "column" is a complete description of a single column in a 178 // A "column" is a complete description of a single column in a
171 // CREATE TABLE statement. This includes the column name, its 179 // CREATE TABLE statement. This includes the column name, its
172 // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 180 // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES,
173 // NOT NULL and so forth. 181 // NOT NULL and so forth.
174 // 182 //
175 column(A) ::= columnid(X) type carglist. { 183 column(A) ::= columnid(X) type carglist. {
176 A.z = X.z; 184 A.z = X.z;
177 A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 185 A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n;
178 } 186 }
179 columnid(A) ::= nm(X). { 187 columnid(A) ::= nm(X). {
180 sqlite3AddColumn(pParse,&X); 188 sqlite3AddColumn(pParse,&X);
181 A = X; 189 A = X;
190 pParse->constraintName.n = 0;
182 } 191 }
183 192
184 193
185 // An IDENTIFIER can be a generic identifier, or one of several 194 // An IDENTIFIER can be a generic identifier, or one of several
186 // keywords. Any non-standard keyword can also be an identifier. 195 // keywords. Any non-standard keyword can also be an identifier.
187 // 196 //
188 %type id {Token} 197 %token_class id ID|INDEXED.
189 id(A) ::= ID(X). {A = X;}
190 id(A) ::= INDEXED(X). {A = X;}
191 198
192 // The following directive causes tokens ABORT, AFTER, ASC, etc. to 199 // The following directive causes tokens ABORT, AFTER, ASC, etc. to
193 // fallback to ID if they will not parse as their original value. 200 // fallback to ID if they will not parse as their original value.
194 // This obviates the need for the "id" nonterminal. 201 // This obviates the need for the "id" nonterminal.
195 // 202 //
196 %fallback ID 203 %fallback ID
197 ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 204 ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
198 CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 205 CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
199 IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 206 IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
200 QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK 207 QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW
201 SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL 208 ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
202 %ifdef SQLITE_OMIT_COMPOUND_SELECT 209 %ifdef SQLITE_OMIT_COMPOUND_SELECT
203 EXCEPT INTERSECT UNION 210 EXCEPT INTERSECT UNION
204 %endif SQLITE_OMIT_COMPOUND_SELECT 211 %endif SQLITE_OMIT_COMPOUND_SELECT
205 REINDEX RENAME CTIME_KW IF 212 REINDEX RENAME CTIME_KW IF
206 . 213 .
207 %wildcard ANY. 214 %wildcard ANY.
208 215
209 // Define operator precedence early so that this is the first occurance 216 // Define operator precedence early so that this is the first occurrence
210 // of the operator tokens in the grammer. Keeping the operators together 217 // of the operator tokens in the grammer. Keeping the operators together
211 // causes them to be assigned integer values that are close together, 218 // causes them to be assigned integer values that are close together,
212 // which keeps parser tables smaller. 219 // which keeps parser tables smaller.
213 // 220 //
214 // The token values assigned to these symbols is determined by the order 221 // The token values assigned to these symbols is determined by the order
215 // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 222 // in which lemon first sees them. It must be the case that ISNULL/NOTNULL,
216 // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 223 // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See
217 // the sqlite3ExprIfFalse() routine for additional information on this 224 // the sqlite3ExprIfFalse() routine for additional information on this
218 // constraint. 225 // constraint.
219 // 226 //
220 %left OR. 227 %left OR.
221 %left AND. 228 %left AND.
222 %right NOT. 229 %right NOT.
223 %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 230 %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
224 %left GT LE LT GE. 231 %left GT LE LT GE.
225 %right ESCAPE. 232 %right ESCAPE.
226 %left BITAND BITOR LSHIFT RSHIFT. 233 %left BITAND BITOR LSHIFT RSHIFT.
227 %left PLUS MINUS. 234 %left PLUS MINUS.
228 %left STAR SLASH REM. 235 %left STAR SLASH REM.
229 %left CONCAT. 236 %left CONCAT.
230 %left COLLATE. 237 %left COLLATE.
231 %right BITNOT. 238 %right BITNOT.
232 239
233 // And "ids" is an identifer-or-string. 240 // And "ids" is an identifer-or-string.
234 // 241 //
235 %type ids {Token} 242 %token_class ids ID|STRING.
236 ids(A) ::= ID|STRING(X). {A = X;}
237 243
238 // The name of a column or table can be any of the following: 244 // The name of a column or table can be any of the following:
239 // 245 //
240 %type nm {Token} 246 %type nm {Token}
241 nm(A) ::= id(X). {A = X;} 247 nm(A) ::= id(X). {A = X;}
242 nm(A) ::= STRING(X). {A = X;} 248 nm(A) ::= STRING(X). {A = X;}
243 nm(A) ::= JOIN_KW(X). {A = X;} 249 nm(A) ::= JOIN_KW(X). {A = X;}
244 250
245 // A typetoken is really one or more tokens that form a type name such 251 // A typetoken is really one or more tokens that form a type name such
246 // as can be found after the column name in a CREATE TABLE statement. 252 // as can be found after the column name in a CREATE TABLE statement.
(...skipping 13 matching lines...) Expand all
260 } 266 }
261 %type typename {Token} 267 %type typename {Token}
262 typename(A) ::= ids(X). {A = X;} 268 typename(A) ::= ids(X). {A = X;}
263 typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 269 typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);}
264 signed ::= plus_num. 270 signed ::= plus_num.
265 signed ::= minus_num. 271 signed ::= minus_num.
266 272
267 // "carglist" is a list of additional constraints that come after the 273 // "carglist" is a list of additional constraints that come after the
268 // column name and column type in a CREATE TABLE statement. 274 // column name and column type in a CREATE TABLE statement.
269 // 275 //
270 carglist ::= carglist carg. 276 carglist ::= carglist ccons.
271 carglist ::= . 277 carglist ::= .
272 carg ::= CONSTRAINT nm ccons. 278 ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;}
273 carg ::= ccons.
274 ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 279 ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);}
275 ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 280 ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);}
276 ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 281 ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);}
277 ccons ::= DEFAULT MINUS(A) term(X). { 282 ccons ::= DEFAULT MINUS(A) term(X). {
278 ExprSpan v; 283 ExprSpan v;
279 v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); 284 v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0);
280 v.zStart = A.z; 285 v.zStart = A.z;
281 v.zEnd = X.zEnd; 286 v.zEnd = X.zEnd;
282 sqlite3AddDefaultValue(pParse,&v); 287 sqlite3AddDefaultValue(pParse,&v);
283 } 288 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 331 refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */}
327 refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 332 refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */}
328 %type defer_subclause {int} 333 %type defer_subclause {int}
329 defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 334 defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;}
330 defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 335 defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;}
331 %type init_deferred_pred_opt {int} 336 %type init_deferred_pred_opt {int}
332 init_deferred_pred_opt(A) ::= . {A = 0;} 337 init_deferred_pred_opt(A) ::= . {A = 0;}
333 init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 338 init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;}
334 init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 339 init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;}
335 340
336 // For the time being, the only constraint we care about is the primary 341 conslist_opt(A) ::= . {A.n = 0; A.z = 0;}
337 // key and UNIQUE. Both create indices. 342 conslist_opt(A) ::= COMMA(X) conslist. {A = X;}
338 // 343 conslist ::= conslist tconscomma tcons.
339 conslist_opt(A) ::= . {A.n = 0; A.z = 0;}
340 conslist_opt(A) ::= COMMA(X) conslist. {A = X;}
341 conslist ::= conslist COMMA tcons.
342 conslist ::= conslist tcons.
343 conslist ::= tcons. 344 conslist ::= tcons.
344 tcons ::= CONSTRAINT nm. 345 tconscomma ::= COMMA. {pParse->constraintName.n = 0;}
346 tconscomma ::= .
347 tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;}
345 tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 348 tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R).
346 {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 349 {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
347 tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 350 tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
348 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 351 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);}
349 tcons ::= CHECK LP expr(E) RP onconf. 352 tcons ::= CHECK LP expr(E) RP onconf.
350 {sqlite3AddCheckConstraint(pParse,E.pExpr);} 353 {sqlite3AddCheckConstraint(pParse,E.pExpr);}
351 tcons ::= FOREIGN KEY LP idxlist(FA) RP 354 tcons ::= FOREIGN KEY LP idxlist(FA) RP
352 REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 355 REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
353 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 356 sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
354 sqlite3DeferForeignKey(pParse, D); 357 sqlite3DeferForeignKey(pParse, D);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 390 sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E);
388 } 391 }
389 cmd ::= DROP VIEW ifexists(E) fullname(X). { 392 cmd ::= DROP VIEW ifexists(E) fullname(X). {
390 sqlite3DropTable(pParse, X, 1, E); 393 sqlite3DropTable(pParse, X, 1, E);
391 } 394 }
392 %endif SQLITE_OMIT_VIEW 395 %endif SQLITE_OMIT_VIEW
393 396
394 //////////////////////// The SELECT statement ///////////////////////////////// 397 //////////////////////// The SELECT statement /////////////////////////////////
395 // 398 //
396 cmd ::= select(X). { 399 cmd ::= select(X). {
397 SelectDest dest = {SRT_Output, 0, 0, 0, 0}; 400 SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
398 sqlite3Select(pParse, X, &dest); 401 sqlite3Select(pParse, X, &dest);
399 sqlite3SelectDelete(pParse->db, X); 402 sqlite3SelectDelete(pParse->db, X);
400 } 403 }
401 404
402 %type select {Select*} 405 %type select {Select*}
403 %destructor select {sqlite3SelectDelete(pParse->db, $$);} 406 %destructor select {sqlite3SelectDelete(pParse->db, $$);}
407 %type selectnowith {Select*}
408 %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
404 %type oneselect {Select*} 409 %type oneselect {Select*}
405 %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 410 %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
406 411
407 select(A) ::= oneselect(X). {A = X;} 412 select(A) ::= with(W) selectnowith(X). {
413 Select *p = X, *pNext, *pLoop;
414 if( p ){
415 int cnt = 0, mxSelect;
416 p->pWith = W;
417 if( p->pPrior ){
418 pNext = 0;
419 for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
420 pLoop->pNext = pNext;
421 pLoop->selFlags |= SF_Compound;
422 }
423 mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT];
424 if( mxSelect && cnt>mxSelect ){
425 sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
426 }
427 }
428 }else{
429 sqlite3WithDelete(pParse->db, W);
430 }
431 A = p;
432 }
433
434 selectnowith(A) ::= oneselect(X). {A = X;}
408 %ifndef SQLITE_OMIT_COMPOUND_SELECT 435 %ifndef SQLITE_OMIT_COMPOUND_SELECT
409 select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 436 selectnowith(A) ::= selectnowith(X) multiselect_op(Y) oneselect(Z). {
410 if( Z ){ 437 Select *pRhs = Z;
411 Z->op = (u8)Y; 438 if( pRhs && pRhs->pPrior ){
412 Z->pPrior = X; 439 SrcList *pFrom;
440 Token x;
441 x.n = 0;
442 pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
443 pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0);
444 }
445 if( pRhs ){
446 pRhs->op = (u8)Y;
447 pRhs->pPrior = X;
448 if( Y!=TK_ALL ) pParse->hasCompound = 1;
413 }else{ 449 }else{
414 sqlite3SelectDelete(pParse->db, X); 450 sqlite3SelectDelete(pParse->db, X);
415 } 451 }
416 A = Z; 452 A = pRhs;
417 } 453 }
418 %type multiselect_op {int} 454 %type multiselect_op {int}
419 multiselect_op(A) ::= UNION(OP). {A = @OP;} 455 multiselect_op(A) ::= UNION(OP). {A = @OP;}
420 multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 456 multiselect_op(A) ::= UNION ALL. {A = TK_ALL;}
421 multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 457 multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;}
422 %endif SQLITE_OMIT_COMPOUND_SELECT 458 %endif SQLITE_OMIT_COMPOUND_SELECT
423 oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 459 oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
424 groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 460 groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
425 A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 461 A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
462 #if SELECTTRACE_ENABLED
463 /* Populate the Select.zSelName[] string that is used to help with
464 ** query planner debugging, to differentiate between multiple Select
465 ** objects in a complex query.
466 **
467 ** If the SELECT keyword is immediately followed by a C-style comment
468 ** then extract the first few alphanumeric characters from within that
469 ** comment to be the zSelName value. Otherwise, the label is #N where
470 ** is an integer that is incremented with each SELECT statement seen.
471 */
472 if( A!=0 ){
473 const char *z = S.z+6;
474 int i;
475 sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d",
476 ++pParse->nSelect);
477 while( z[0]==' ' ) z++;
478 if( z[0]=='/' && z[1]=='*' ){
479 z += 2;
480 while( z[0]==' ' ) z++;
481 for(i=0; sqlite3Isalnum(z[i]); i++){}
482 sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
483 }
484 }
485 #endif /* SELECTRACE_ENABLED */
486 }
487 oneselect(A) ::= values(X). {A = X;}
488
489 %type values {Select*}
490 %destructor values {sqlite3SelectDelete(pParse->db, $$);}
491 values(A) ::= VALUES LP nexprlist(X) RP. {
492 A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0,0);
493 }
494 values(A) ::= values(X) COMMA LP exprlist(Y) RP. {
495 Select *pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values,0,0);
496 if( pRight ){
497 pRight->op = TK_ALL;
498 pRight->pPrior = X;
499 A = pRight;
500 }else{
501 A = X;
502 }
426 } 503 }
427 504
428 // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 505 // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
429 // present and false (0) if it is not. 506 // present and false (0) if it is not.
430 // 507 //
431 %type distinct {int} 508 %type distinct {u16}
432 distinct(A) ::= DISTINCT. {A = 1;} 509 distinct(A) ::= DISTINCT. {A = SF_Distinct;}
433 distinct(A) ::= ALL. {A = 0;} 510 distinct(A) ::= ALL. {A = 0;}
434 distinct(A) ::= . {A = 0;} 511 distinct(A) ::= . {A = 0;}
435 512
436 // selcollist is a list of expressions that are to become the return 513 // selcollist is a list of expressions that are to become the return
437 // values of the SELECT statement. The "*" in statements like 514 // values of the SELECT statement. The "*" in statements like
438 // "SELECT * FROM ..." is encoded as a special expression with an 515 // "SELECT * FROM ..." is encoded as a special expression with an
439 // opcode of TK_ALL. 516 // opcode of TK_ALL.
440 // 517 //
441 %type selcollist {ExprList*} 518 %type selcollist {ExprList*}
442 %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 519 %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 } 562 }
486 563
487 // "seltablist" is a "Select Table List" - the content of the FROM clause 564 // "seltablist" is a "Select Table List" - the content of the FROM clause
488 // in a SELECT statement. "stl_prefix" is a prefix of this list. 565 // in a SELECT statement. "stl_prefix" is a prefix of this list.
489 // 566 //
490 stl_prefix(A) ::= seltablist(X) joinop(Y). { 567 stl_prefix(A) ::= seltablist(X) joinop(Y). {
491 A = X; 568 A = X;
492 if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; 569 if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y;
493 } 570 }
494 stl_prefix(A) ::= . {A = 0;} 571 stl_prefix(A) ::= . {A = 0;}
495 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) usi ng_opt(U). { 572 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I)
573 on_opt(N) using_opt(U). {
496 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 574 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
497 sqlite3SrcListIndexedBy(pParse, A, &I); 575 sqlite3SrcListIndexedBy(pParse, A, &I);
498 } 576 }
499 %ifndef SQLITE_OMIT_SUBQUERY 577 %ifndef SQLITE_OMIT_SUBQUERY
500 seltablist(A) ::= stl_prefix(X) LP select(S) RP 578 seltablist(A) ::= stl_prefix(X) LP select(S) RP
501 as(Z) on_opt(N) using_opt(U). { 579 as(Z) on_opt(N) using_opt(U). {
502 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 580 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U);
503 } 581 }
504 seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 582 seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP
505 as(Z) on_opt(N) using_opt(U). { 583 as(Z) on_opt(N) using_opt(U). {
506 if( X==0 && Z.n==0 && N==0 && U==0 ){ 584 if( X==0 && Z.n==0 && N==0 && U==0 ){
507 A = F; 585 A = F;
586 }else if( F->nSrc==1 ){
587 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,0,N,U);
588 if( A ){
589 struct SrcList_item *pNew = &A->a[A->nSrc-1];
590 struct SrcList_item *pOld = F->a;
591 pNew->zName = pOld->zName;
592 pNew->zDatabase = pOld->zDatabase;
593 pNew->pSelect = pOld->pSelect;
594 pOld->zName = pOld->zDatabase = 0;
595 pOld->pSelect = 0;
596 }
597 sqlite3SrcListDelete(pParse->db, F);
508 }else{ 598 }else{
509 Select *pSubquery; 599 Select *pSubquery;
510 sqlite3SrcListShiftJoinType(F); 600 sqlite3SrcListShiftJoinType(F);
511 pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 601 pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0,0);
512 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 602 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U);
513 } 603 }
514 } 604 }
515
516 // A seltablist_paren nonterminal represents anything in a FROM that
517 // is contained inside parentheses. This can be either a subquery or
518 // a grouping of table and subqueries.
519 //
520 // %type seltablist_paren {Select*}
521 // %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);}
522 // seltablist_paren(A) ::= select(S). {A = S;}
523 // seltablist_paren(A) ::= seltablist(F). {
524 // sqlite3SrcListShiftJoinType(F);
525 // A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
526 // }
527 %endif SQLITE_OMIT_SUBQUERY 605 %endif SQLITE_OMIT_SUBQUERY
528 606
529 %type dbnm {Token} 607 %type dbnm {Token}
530 dbnm(A) ::= . {A.z=0; A.n=0;} 608 dbnm(A) ::= . {A.z=0; A.n=0;}
531 dbnm(A) ::= DOT nm(X). {A = X;} 609 dbnm(A) ::= DOT nm(X). {A = X;}
532 610
533 %type fullname {SrcList*} 611 %type fullname {SrcList*}
534 %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 612 %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
535 fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 613 fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);}
536 614
(...skipping 20 matching lines...) Expand all
557 // normally illegal. The sqlite3SrcListIndexedBy() function 635 // normally illegal. The sqlite3SrcListIndexedBy() function
558 // recognizes and interprets this as a special case. 636 // recognizes and interprets this as a special case.
559 // 637 //
560 %type indexed_opt {Token} 638 %type indexed_opt {Token}
561 indexed_opt(A) ::= . {A.z=0; A.n=0;} 639 indexed_opt(A) ::= . {A.z=0; A.n=0;}
562 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 640 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
563 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 641 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;}
564 642
565 %type using_opt {IdList*} 643 %type using_opt {IdList*}
566 %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 644 %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
567 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 645 using_opt(U) ::= USING LP idlist(L) RP. {U = L;}
568 using_opt(U) ::= . {U = 0;} 646 using_opt(U) ::= . {U = 0;}
569 647
570 648
571 %type orderby_opt {ExprList*} 649 %type orderby_opt {ExprList*}
572 %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 650 %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
573 %type sortlist {ExprList*} 651 %type sortlist {ExprList*}
574 %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 652 %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
575 %type sortitem {Expr*}
576 %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);}
577 653
578 orderby_opt(A) ::= . {A = 0;} 654 orderby_opt(A) ::= . {A = 0;}
579 orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 655 orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;}
580 sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { 656 sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). {
581 A = sqlite3ExprListAppend(pParse,X,Y); 657 A = sqlite3ExprListAppend(pParse,X,Y.pExpr);
582 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 658 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
583 } 659 }
584 sortlist(A) ::= sortitem(Y) sortorder(Z). { 660 sortlist(A) ::= expr(Y) sortorder(Z). {
585 A = sqlite3ExprListAppend(pParse,0,Y); 661 A = sqlite3ExprListAppend(pParse,0,Y.pExpr);
586 if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; 662 if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z;
587 } 663 }
588 sortitem(A) ::= expr(X). {A = X.pExpr;}
589 664
590 %type sortorder {int} 665 %type sortorder {int}
591 666
592 sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 667 sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;}
593 sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 668 sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;}
594 sortorder(A) ::= . {A = SQLITE_SO_ASC;} 669 sortorder(A) ::= . {A = SQLITE_SO_ASC;}
595 670
596 %type groupby_opt {ExprList*} 671 %type groupby_opt {ExprList*}
597 %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 672 %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
598 groupby_opt(A) ::= . {A = 0;} 673 groupby_opt(A) ::= . {A = 0;}
(...skipping 20 matching lines...) Expand all
619 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 694 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;}
620 limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 695 limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;}
621 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 696 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
622 {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 697 {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;}
623 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 698 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
624 {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 699 {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
625 700
626 /////////////////////////// The DELETE statement ///////////////////////////// 701 /////////////////////////// The DELETE statement /////////////////////////////
627 // 702 //
628 %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 703 %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
629 cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 704 cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
630 orderby_opt(O) limit_opt(L). { 705 orderby_opt(O) limit_opt(L). {
706 sqlite3WithPush(pParse, C, 1);
631 sqlite3SrcListIndexedBy(pParse, X, &I); 707 sqlite3SrcListIndexedBy(pParse, X, &I);
632 W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 708 W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
633 sqlite3DeleteFrom(pParse,X,W); 709 sqlite3DeleteFrom(pParse,X,W);
634 } 710 }
635 %endif 711 %endif
636 %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 712 %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
637 cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 713 cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
714 sqlite3WithPush(pParse, C, 1);
638 sqlite3SrcListIndexedBy(pParse, X, &I); 715 sqlite3SrcListIndexedBy(pParse, X, &I);
639 sqlite3DeleteFrom(pParse,X,W); 716 sqlite3DeleteFrom(pParse,X,W);
640 } 717 }
641 %endif 718 %endif
642 719
643 %type where_opt {Expr*} 720 %type where_opt {Expr*}
644 %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 721 %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
645 722
646 where_opt(A) ::= . {A = 0;} 723 where_opt(A) ::= . {A = 0;}
647 where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 724 where_opt(A) ::= WHERE expr(X). {A = X.pExpr;}
648 725
649 ////////////////////////// The UPDATE command //////////////////////////////// 726 ////////////////////////// The UPDATE command ////////////////////////////////
650 // 727 //
651 %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 728 %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
652 cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L). { 729 cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
730 where_opt(W) orderby_opt(O) limit_opt(L). {
731 sqlite3WithPush(pParse, C, 1);
653 sqlite3SrcListIndexedBy(pParse, X, &I); 732 sqlite3SrcListIndexedBy(pParse, X, &I);
654 sqlite3ExprListCheckLength(pParse,Y,"set list"); 733 sqlite3ExprListCheckLength(pParse,Y,"set list");
655 W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 734 W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
656 sqlite3Update(pParse,X,Y,W,R); 735 sqlite3Update(pParse,X,Y,W,R);
657 } 736 }
658 %endif 737 %endif
659 %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 738 %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
660 cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W). { 739 cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
740 where_opt(W). {
741 sqlite3WithPush(pParse, C, 1);
661 sqlite3SrcListIndexedBy(pParse, X, &I); 742 sqlite3SrcListIndexedBy(pParse, X, &I);
662 sqlite3ExprListCheckLength(pParse,Y,"set list"); 743 sqlite3ExprListCheckLength(pParse,Y,"set list");
663 sqlite3Update(pParse,X,Y,W,R); 744 sqlite3Update(pParse,X,Y,W,R);
664 } 745 }
665 %endif 746 %endif
666 747
667 %type setlist {ExprList*} 748 %type setlist {ExprList*}
668 %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 749 %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
669 750
670 setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). { 751 setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {
671 A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); 752 A = sqlite3ExprListAppend(pParse, Z, Y.pExpr);
672 sqlite3ExprListSetName(pParse, A, &X, 1); 753 sqlite3ExprListSetName(pParse, A, &X, 1);
673 } 754 }
674 setlist(A) ::= nm(X) EQ expr(Y). { 755 setlist(A) ::= nm(X) EQ expr(Y). {
675 A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 756 A = sqlite3ExprListAppend(pParse, 0, Y.pExpr);
676 sqlite3ExprListSetName(pParse, A, &X, 1); 757 sqlite3ExprListSetName(pParse, A, &X, 1);
677 } 758 }
678 759
679 ////////////////////////// The INSERT command ///////////////////////////////// 760 ////////////////////////// The INSERT command /////////////////////////////////
680 // 761 //
681 cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 762 cmd ::= with(W) insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). {
682 VALUES LP itemlist(Y) RP. 763 sqlite3WithPush(pParse, W, 1);
683 {sqlite3Insert(pParse, X, Y, 0, F, R);} 764 sqlite3Insert(pParse, X, S, F, R);
684 cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 765 }
685 {sqlite3Insert(pParse, X, 0, S, F, R);} 766 cmd ::= with(W) insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES.
686 cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 767 {
687 {sqlite3Insert(pParse, X, 0, 0, F, R);} 768 sqlite3WithPush(pParse, W, 1);
769 sqlite3Insert(pParse, X, 0, F, R);
770 }
688 771
689 %type insert_cmd {u8} 772 %type insert_cmd {u8}
690 insert_cmd(A) ::= INSERT orconf(R). {A = R;} 773 insert_cmd(A) ::= INSERT orconf(R). {A = R;}
691 insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 774 insert_cmd(A) ::= REPLACE. {A = OE_Replace;}
692 775
693
694 %type itemlist {ExprList*}
695 %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);}
696
697 itemlist(A) ::= itemlist(X) COMMA expr(Y).
698 {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
699 itemlist(A) ::= expr(X).
700 {A = sqlite3ExprListAppend(pParse,0,X.pExpr);}
701
702 %type inscollist_opt {IdList*} 776 %type inscollist_opt {IdList*}
703 %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 777 %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);}
704 %type inscollist {IdList*} 778 %type idlist {IdList*}
705 %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);} 779 %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
706 780
707 inscollist_opt(A) ::= . {A = 0;} 781 inscollist_opt(A) ::= . {A = 0;}
708 inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 782 inscollist_opt(A) ::= LP idlist(X) RP. {A = X;}
709 inscollist(A) ::= inscollist(X) COMMA nm(Y). 783 idlist(A) ::= idlist(X) COMMA nm(Y).
710 {A = sqlite3IdListAppend(pParse->db,X,&Y);} 784 {A = sqlite3IdListAppend(pParse->db,X,&Y);}
711 inscollist(A) ::= nm(Y). 785 idlist(A) ::= nm(Y).
712 {A = sqlite3IdListAppend(pParse->db,0,&Y);} 786 {A = sqlite3IdListAppend(pParse->db,0,&Y);}
713 787
714 /////////////////////////// Expression Processing ///////////////////////////// 788 /////////////////////////// Expression Processing /////////////////////////////
715 // 789 //
716 790
717 %type expr {ExprSpan} 791 %type expr {ExprSpan}
718 %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 792 %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);}
719 %type term {ExprSpan} 793 %type term {ExprSpan}
720 %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 794 %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);}
721 795
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 828 expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
755 Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 829 Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
756 Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 830 Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
757 Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 831 Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z);
758 Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 832 Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
759 A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 833 A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
760 spanSet(&A,&X,&Z); 834 spanSet(&A,&X,&Z);
761 } 835 }
762 term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);} 836 term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);}
763 term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);} 837 term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);}
764 expr(A) ::= REGISTER(X). { 838 expr(A) ::= VARIABLE(X). {
765 /* When doing a nested parse, one can include terms in an expression 839 if( X.n>=2 && X.z[0]=='#' && sqlite3Isdigit(X.z[1]) ){
766 ** that look like this: #1 #2 ... These terms refer to registers 840 /* When doing a nested parse, one can include terms in an expression
767 ** in the virtual machine. #N is the N-th register. */ 841 ** that look like this: #1 #2 ... These terms refer to registers
768 if( pParse->nested==0 ){ 842 ** in the virtual machine. #N is the N-th register. */
769 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); 843 if( pParse->nested==0 ){
770 A.pExpr = 0; 844 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X);
845 A.pExpr = 0;
846 }else{
847 A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
848 if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
849 }
771 }else{ 850 }else{
772 A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); 851 spanExpr(&A, pParse, TK_VARIABLE, &X);
773 if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable); 852 sqlite3ExprAssignVarNumber(pParse, A.pExpr);
774 } 853 }
775 spanSet(&A, &X, &X); 854 spanSet(&A, &X, &X);
776 } 855 }
777 expr(A) ::= VARIABLE(X). {
778 spanExpr(&A, pParse, TK_VARIABLE, &X);
779 sqlite3ExprAssignVarNumber(pParse, A.pExpr);
780 spanSet(&A, &X, &X);
781 }
782 expr(A) ::= expr(E) COLLATE ids(C). { 856 expr(A) ::= expr(E) COLLATE ids(C). {
783 A.pExpr = sqlite3ExprSetCollByToken(pParse, E.pExpr, &C); 857 A.pExpr = sqlite3ExprAddCollateToken(pParse, E.pExpr, &C);
784 A.zStart = E.zStart; 858 A.zStart = E.zStart;
785 A.zEnd = &C.z[C.n]; 859 A.zEnd = &C.z[C.n];
786 } 860 }
787 %ifndef SQLITE_OMIT_CAST 861 %ifndef SQLITE_OMIT_CAST
788 expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 862 expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
789 A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); 863 A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T);
790 spanSet(&A,&X,&Y); 864 spanSet(&A,&X,&Y);
791 } 865 }
792 %endif SQLITE_OMIT_CAST 866 %endif SQLITE_OMIT_CAST
793 expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 867 expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). {
794 if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 868 if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
795 sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 869 sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
796 } 870 }
797 A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 871 A.pExpr = sqlite3ExprFunction(pParse, Y, &X);
798 spanSet(&A,&X,&E); 872 spanSet(&A,&X,&E);
799 if( D && A.pExpr ){ 873 if( D && A.pExpr ){
800 A.pExpr->flags |= EP_Distinct; 874 A.pExpr->flags |= EP_Distinct;
801 } 875 }
802 } 876 }
803 expr(A) ::= ID(X) LP STAR RP(E). { 877 expr(A) ::= id(X) LP STAR RP(E). {
804 A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 878 A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
805 spanSet(&A,&X,&E); 879 spanSet(&A,&X,&E);
806 } 880 }
807 term(A) ::= CTIME_KW(OP). { 881 term(A) ::= CTIME_KW(OP). {
808 /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 882 A.pExpr = sqlite3ExprFunction(pParse, 0, &OP);
809 ** treated as functions that return constants */
810 A.pExpr = sqlite3ExprFunction(pParse, 0,&OP);
811 if( A.pExpr ){
812 A.pExpr->op = TK_CONST_FUNC;
813 }
814 spanSet(&A, &OP, &OP); 883 spanSet(&A, &OP, &OP);
815 } 884 }
816 885
817 %include { 886 %include {
818 /* This routine constructs a binary expression node out of two ExprSpan 887 /* This routine constructs a binary expression node out of two ExprSpan
819 ** objects and uses the result to populate a new ExprSpan object. 888 ** objects and uses the result to populate a new ExprSpan object.
820 */ 889 */
821 static void spanBinaryExpr( 890 static void spanBinaryExpr(
822 ExprSpan *pOut, /* Write the result here */ 891 ExprSpan *pOut, /* Write the result here */
823 Parse *pParse, /* The parsing context. Errors accumulate here */ 892 Parse *pParse, /* The parsing context. Errors accumulate here */
(...skipping 13 matching lines...) Expand all
837 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 906 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
838 expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 907 expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
839 expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 908 expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
840 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 909 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
841 expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). 910 expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).
842 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 911 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
843 expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 912 expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y).
844 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 913 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
845 expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 914 expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
846 %type likeop {struct LikeOp} 915 %type likeop {struct LikeOp}
847 likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} 916 likeop(A) ::= LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 0;}
848 likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} 917 likeop(A) ::= NOT LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 1;}
849 likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;}
850 likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;}
851 expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] { 918 expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] {
852 ExprList *pList; 919 ExprList *pList;
853 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 920 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
854 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 921 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
855 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 922 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
856 if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 923 if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
857 A.zStart = X.zStart; 924 A.zStart = X.zStart;
858 A.zEnd = Y.zEnd; 925 A.zEnd = Y.zEnd;
859 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 926 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
860 } 927 }
861 expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 928 expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] {
862 ExprList *pList; 929 ExprList *pList;
863 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 930 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
864 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 931 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
865 pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 932 pList = sqlite3ExprListAppend(pParse,pList, E.pExpr);
866 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 933 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
867 if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 934 if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
868 A.zStart = X.zStart; 935 A.zStart = X.zStart;
869 A.zEnd = E.zEnd; 936 A.zEnd = E.zEnd;
870 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 937 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
871 } 938 }
872 939
873 %include { 940 %include {
874 /* Construct an expression node for a unary postfix operator 941 /* Construct an expression node for a unary postfix operator
875 */ 942 */
876 static void spanUnaryPostfix( 943 static void spanUnaryPostfix(
877 ExprSpan *pOut, /* Write the new expression node here */ 944 ExprSpan *pOut, /* Write the new expression node here */
878 Parse *pParse, /* Parsing context to record errors */ 945 Parse *pParse, /* Parsing context to record errors */
879 int op, /* The operator */ 946 int op, /* The operator */
880 ExprSpan *pOperand, /* The operand */ 947 ExprSpan *pOperand, /* The operand */
881 Token *pPostOp /* The operand token for setting the span */ 948 Token *pPostOp /* The operand token for setting the span */
882 ){ 949 ){
883 pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 950 pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
884 pOut->zStart = pOperand->zStart; 951 pOut->zStart = pOperand->zStart;
885 pOut->zEnd = &pPostOp->z[pPostOp->n]; 952 pOut->zEnd = &pPostOp->z[pPostOp->n];
886 } 953 }
887 } 954 }
888 955
889 expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} 956 expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);}
890 expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 957 expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);}
891 958
892 %include { 959 %include {
893 /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 960 /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
894 ** unary TK_ISNULL or TK_NOTNULL expression. */ 961 ** unary TK_ISNULL or TK_NOTNULL expression. */
895 static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 962 static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
896 sqlite3 *db = pParse->db; 963 sqlite3 *db = pParse->db;
897 if( db->mallocFailed==0 && pY->op==TK_NULL ){ 964 if( pY && pA && pY->op==TK_NULL ){
898 pA->op = (u8)op; 965 pA->op = (u8)op;
899 sqlite3ExprDelete(db, pA->pRight); 966 sqlite3ExprDelete(db, pA->pRight);
900 pA->pRight = 0; 967 pA->pRight = 0;
901 } 968 }
902 } 969 }
903 } 970 }
904 971
905 // expr1 IS expr2 972 // expr1 IS expr2
906 // expr1 IS NOT expr2 973 // expr1 IS NOT expr2
907 // 974 //
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 /* Expressions of the form 1034 /* Expressions of the form
968 ** 1035 **
969 ** expr1 IN () 1036 ** expr1 IN ()
970 ** expr1 NOT IN () 1037 ** expr1 NOT IN ()
971 ** 1038 **
972 ** simplify to constants 0 (false) and 1 (true), respectively, 1039 ** simplify to constants 0 (false) and 1 (true), respectively,
973 ** regardless of the value of expr1. 1040 ** regardless of the value of expr1.
974 */ 1041 */
975 A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]); 1042 A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]);
976 sqlite3ExprDelete(pParse->db, X.pExpr); 1043 sqlite3ExprDelete(pParse->db, X.pExpr);
1044 }else if( Y->nExpr==1 ){
1045 /* Expressions of the form:
1046 **
1047 ** expr1 IN (?1)
1048 ** expr1 NOT IN (?2)
1049 **
1050 ** with exactly one value on the RHS can be simplified to something
1051 ** like this:
1052 **
1053 ** expr1 == ?1
1054 ** expr1 <> ?2
1055 **
1056 ** But, the RHS of the == or <> is marked with the EP_Generic flag
1057 ** so that it may not contribute to the computation of comparison
1058 ** affinity or the collating sequence to use for comparison. Otherwise,
1059 ** the semantics would be subtly different from IN or NOT IN.
1060 */
1061 Expr *pRHS = Y->a[0].pExpr;
1062 Y->a[0].pExpr = 0;
1063 sqlite3ExprListDelete(pParse->db, Y);
1064 /* pRHS cannot be NULL because a malloc error would have been detected
1065 ** before now and control would have never reached this point */
1066 if( ALWAYS(pRHS) ){
1067 pRHS->flags &= ~EP_Collate;
1068 pRHS->flags |= EP_Generic;
1069 }
1070 A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, X.pExpr, pRHS, 0);
977 }else{ 1071 }else{
978 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1072 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
979 if( A.pExpr ){ 1073 if( A.pExpr ){
980 A.pExpr->x.pList = Y; 1074 A.pExpr->x.pList = Y;
981 sqlite3ExprSetHeight(pParse, A.pExpr); 1075 sqlite3ExprSetHeight(pParse, A.pExpr);
982 }else{ 1076 }else{
983 sqlite3ExprListDelete(pParse->db, Y); 1077 sqlite3ExprListDelete(pParse->db, Y);
984 } 1078 }
985 if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1079 if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
986 } 1080 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1035 }else{ 1129 }else{
1036 sqlite3SelectDelete(pParse->db, Y); 1130 sqlite3SelectDelete(pParse->db, Y);
1037 } 1131 }
1038 A.zStart = B.z; 1132 A.zStart = B.z;
1039 A.zEnd = &E.z[E.n]; 1133 A.zEnd = &E.z[E.n];
1040 } 1134 }
1041 %endif SQLITE_OMIT_SUBQUERY 1135 %endif SQLITE_OMIT_SUBQUERY
1042 1136
1043 /* CASE expressions */ 1137 /* CASE expressions */
1044 expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 1138 expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
1045 A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); 1139 A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0, 0);
1046 if( A.pExpr ){ 1140 if( A.pExpr ){
1047 A.pExpr->x.pList = Y; 1141 A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
1048 sqlite3ExprSetHeight(pParse, A.pExpr); 1142 sqlite3ExprSetHeight(pParse, A.pExpr);
1049 }else{ 1143 }else{
1050 sqlite3ExprListDelete(pParse->db, Y); 1144 sqlite3ExprListDelete(pParse->db, Y);
1145 sqlite3ExprDelete(pParse->db, Z);
1051 } 1146 }
1052 A.zStart = C.z; 1147 A.zStart = C.z;
1053 A.zEnd = &E.z[E.n]; 1148 A.zEnd = &E.z[E.n];
1054 } 1149 }
1055 %type case_exprlist {ExprList*} 1150 %type case_exprlist {ExprList*}
1056 %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 1151 %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
1057 case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 1152 case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
1058 A = sqlite3ExprListAppend(pParse,X, Y.pExpr); 1153 A = sqlite3ExprListAppend(pParse,X, Y.pExpr);
1059 A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 1154 A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
1060 } 1155 }
(...skipping 19 matching lines...) Expand all
1080 exprlist(A) ::= . {A = 0;} 1175 exprlist(A) ::= . {A = 0;}
1081 nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 1176 nexprlist(A) ::= nexprlist(X) COMMA expr(Y).
1082 {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 1177 {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
1083 nexprlist(A) ::= expr(Y). 1178 nexprlist(A) ::= expr(Y).
1084 {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} 1179 {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);}
1085 1180
1086 1181
1087 ///////////////////////////// The CREATE INDEX command /////////////////////// 1182 ///////////////////////////// The CREATE INDEX command ///////////////////////
1088 // 1183 //
1089 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 1184 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1090 ON nm(Y) LP idxlist(Z) RP(E). { 1185 ON nm(Y) LP idxlist(Z) RP where_opt(W). {
1091 sqlite3CreateIndex(pParse, &X, &D, 1186 sqlite3CreateIndex(pParse, &X, &D,
1092 sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 1187 sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
1093 &S, &E, SQLITE_SO_ASC, NE); 1188 &S, W, SQLITE_SO_ASC, NE);
1094 } 1189 }
1095 1190
1096 %type uniqueflag {int} 1191 %type uniqueflag {int}
1097 uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 1192 uniqueflag(A) ::= UNIQUE. {A = OE_Abort;}
1098 uniqueflag(A) ::= . {A = OE_None;} 1193 uniqueflag(A) ::= . {A = OE_None;}
1099 1194
1100 %type idxlist {ExprList*} 1195 %type idxlist {ExprList*}
1101 %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 1196 %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);}
1102 %type idxlist_opt {ExprList*} 1197 %type idxlist_opt {ExprList*}
1103 %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1198 %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1104 1199
1105 idxlist_opt(A) ::= . {A = 0;} 1200 idxlist_opt(A) ::= . {A = 0;}
1106 idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 1201 idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;}
1107 idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 1202 idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). {
1108 Expr *p = 0; 1203 Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C);
1109 if( C.n>0 ){
1110 p = sqlite3Expr(pParse->db, TK_COLUMN, 0);
1111 sqlite3ExprSetCollByToken(pParse, p, &C);
1112 }
1113 A = sqlite3ExprListAppend(pParse,X, p); 1204 A = sqlite3ExprListAppend(pParse,X, p);
1114 sqlite3ExprListSetName(pParse,A,&Y,1); 1205 sqlite3ExprListSetName(pParse,A,&Y,1);
1115 sqlite3ExprListCheckLength(pParse, A, "index"); 1206 sqlite3ExprListCheckLength(pParse, A, "index");
1116 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 1207 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
1117 } 1208 }
1118 idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 1209 idxlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1119 Expr *p = 0; 1210 Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C);
1120 if( C.n>0 ){
1121 p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
1122 sqlite3ExprSetCollByToken(pParse, p, &C);
1123 }
1124 A = sqlite3ExprListAppend(pParse,0, p); 1211 A = sqlite3ExprListAppend(pParse,0, p);
1125 sqlite3ExprListSetName(pParse, A, &Y, 1); 1212 sqlite3ExprListSetName(pParse, A, &Y, 1);
1126 sqlite3ExprListCheckLength(pParse, A, "index"); 1213 sqlite3ExprListCheckLength(pParse, A, "index");
1127 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 1214 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
1128 } 1215 }
1129 1216
1130 %type collate {Token} 1217 %type collate {Token}
1131 collate(C) ::= . {C.z = 0; C.n = 0;} 1218 collate(C) ::= . {C.z = 0; C.n = 0;}
1132 collate(C) ::= COLLATE ids(X). {C = X;} 1219 collate(C) ::= COLLATE ids(X). {C = X;}
1133 1220
(...skipping 21 matching lines...) Expand all
1155 {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1242 {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1156 cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1243 cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1157 {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1244 {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1158 1245
1159 nmnum(A) ::= plus_num(X). {A = X;} 1246 nmnum(A) ::= plus_num(X). {A = X;}
1160 nmnum(A) ::= nm(X). {A = X;} 1247 nmnum(A) ::= nm(X). {A = X;}
1161 nmnum(A) ::= ON(X). {A = X;} 1248 nmnum(A) ::= ON(X). {A = X;}
1162 nmnum(A) ::= DELETE(X). {A = X;} 1249 nmnum(A) ::= DELETE(X). {A = X;}
1163 nmnum(A) ::= DEFAULT(X). {A = X;} 1250 nmnum(A) ::= DEFAULT(X). {A = X;}
1164 %endif SQLITE_OMIT_PRAGMA 1251 %endif SQLITE_OMIT_PRAGMA
1165 plus_num(A) ::= plus_opt number(X). {A = X;} 1252 %token_class number INTEGER|FLOAT.
1253 plus_num(A) ::= PLUS number(X). {A = X;}
1254 plus_num(A) ::= number(X). {A = X;}
1166 minus_num(A) ::= MINUS number(X). {A = X;} 1255 minus_num(A) ::= MINUS number(X). {A = X;}
1167 number(A) ::= INTEGER|FLOAT(X). {A = X;}
1168 plus_opt ::= PLUS.
1169 plus_opt ::= .
1170
1171 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1256 //////////////////////////// The CREATE TRIGGER command /////////////////////
1172 1257
1173 %ifndef SQLITE_OMIT_TRIGGER 1258 %ifndef SQLITE_OMIT_TRIGGER
1174 1259
1175 cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 1260 cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
1176 Token all; 1261 Token all;
1177 all.z = A.z; 1262 all.z = A.z;
1178 all.n = (int)(Z.z - A.z) + Z.n; 1263 all.n = (int)(Z.z - A.z) + Z.n;
1179 sqlite3FinishTrigger(pParse, S, &all); 1264 sqlite3FinishTrigger(pParse, S, &all);
1180 } 1265 }
1181 1266
1182 trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1267 trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1183 trigger_time(C) trigger_event(D) 1268 trigger_time(C) trigger_event(D)
1184 ON fullname(E) foreach_clause when_clause(G). { 1269 ON fullname(E) foreach_clause when_clause(G). {
1185 sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 1270 sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1186 A = (Z.n==0?B:Z); 1271 A = (Z.n==0?B:Z);
1187 } 1272 }
1188 1273
1189 %type trigger_time {int} 1274 %type trigger_time {int}
1190 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1275 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; }
1191 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1276 trigger_time(A) ::= AFTER. { A = TK_AFTER; }
1192 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1277 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;}
1193 trigger_time(A) ::= . { A = TK_BEFORE; } 1278 trigger_time(A) ::= . { A = TK_BEFORE; }
1194 1279
1195 %type trigger_event {struct TrigEvent} 1280 %type trigger_event {struct TrigEvent}
1196 %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1281 %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1197 trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 1282 trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;}
1198 trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 1283 trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;}
1199 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 1284 trigger_event(A) ::= UPDATE OF idlist(X). {A.a = TK_UPDATE; A.b = X;}
1200 1285
1201 foreach_clause ::= . 1286 foreach_clause ::= .
1202 foreach_clause ::= FOR EACH ROW. 1287 foreach_clause ::= FOR EACH ROW.
1203 1288
1204 %type when_clause {Expr*} 1289 %type when_clause {Expr*}
1205 %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1290 %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1206 when_clause(A) ::= . { A = 0; } 1291 when_clause(A) ::= . { A = 0; }
1207 when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1292 when_clause(A) ::= WHEN expr(X). { A = X.pExpr; }
1208 1293
1209 %type trigger_cmd_list {TriggerStep*} 1294 %type trigger_cmd_list {TriggerStep*}
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 1337
1253 1338
1254 %type trigger_cmd {TriggerStep*} 1339 %type trigger_cmd {TriggerStep*}
1255 %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1340 %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1256 // UPDATE 1341 // UPDATE
1257 trigger_cmd(A) ::= 1342 trigger_cmd(A) ::=
1258 UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). 1343 UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z).
1259 { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1344 { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); }
1260 1345
1261 // INSERT 1346 // INSERT
1262 trigger_cmd(A) ::=
1263 insert_cmd(R) INTO trnm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
1264 {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);}
1265
1266 trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S). 1347 trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S).
1267 {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} 1348 {A = sqlite3TriggerInsertStep(pParse->db, &X, F, S, R);}
1268 1349
1269 // DELETE 1350 // DELETE
1270 trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). 1351 trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y).
1271 {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1352 {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
1272 1353
1273 // SELECT 1354 // SELECT
1274 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1355 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); }
1275 1356
1276 // The special RAISE expression that may occur in trigger programs 1357 // The special RAISE expression that may occur in trigger programs
1277 expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1358 expr(A) ::= RAISE(X) LP IGNORE RP(Y). {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1348 sqlite3AlterBeginAddColumn(pParse, X); 1429 sqlite3AlterBeginAddColumn(pParse, X);
1349 } 1430 }
1350 kwcolumn_opt ::= . 1431 kwcolumn_opt ::= .
1351 kwcolumn_opt ::= COLUMNKW. 1432 kwcolumn_opt ::= COLUMNKW.
1352 %endif SQLITE_OMIT_ALTERTABLE 1433 %endif SQLITE_OMIT_ALTERTABLE
1353 1434
1354 //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1435 //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1355 %ifndef SQLITE_OMIT_VIRTUALTABLE 1436 %ifndef SQLITE_OMIT_VIRTUALTABLE
1356 cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1437 cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);}
1357 cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1438 cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);}
1358 create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { 1439 create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1359 sqlite3VtabBeginParse(pParse, &X, &Y, &Z); 1440 nm(X) dbnm(Y) USING nm(Z). {
1441 sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1360 } 1442 }
1361 vtabarglist ::= vtabarg. 1443 vtabarglist ::= vtabarg.
1362 vtabarglist ::= vtabarglist COMMA vtabarg. 1444 vtabarglist ::= vtabarglist COMMA vtabarg.
1363 vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1445 vtabarg ::= . {sqlite3VtabArgInit(pParse);}
1364 vtabarg ::= vtabarg vtabargtoken. 1446 vtabarg ::= vtabarg vtabargtoken.
1365 vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1447 vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);}
1366 vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1448 vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);}
1367 lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1449 lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);}
1368 anylist ::= . 1450 anylist ::= .
1369 anylist ::= anylist LP anylist RP. 1451 anylist ::= anylist LP anylist RP.
1370 anylist ::= anylist ANY. 1452 anylist ::= anylist ANY.
1371 %endif SQLITE_OMIT_VIRTUALTABLE 1453 %endif SQLITE_OMIT_VIRTUALTABLE
1454
1455
1456 //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
1457 %type with {With*}
1458 %type wqlist {With*}
1459 %destructor with {sqlite3WithDelete(pParse->db, $$);}
1460 %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
1461
1462 with(A) ::= . {A = 0;}
1463 %ifndef SQLITE_OMIT_CTE
1464 with(A) ::= WITH wqlist(W). { A = W; }
1465 with(A) ::= WITH RECURSIVE wqlist(W). { A = W; }
1466
1467 wqlist(A) ::= nm(X) idxlist_opt(Y) AS LP select(Z) RP. {
1468 A = sqlite3WithAdd(pParse, 0, &X, Y, Z);
1469 }
1470 wqlist(A) ::= wqlist(W) COMMA nm(X) idxlist_opt(Y) AS LP select(Z) RP. {
1471 A = sqlite3WithAdd(pParse, W, &X, Y, Z);
1472 }
1473 %endif SQLITE_OMIT_CTE
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3080704/src/pager.c ('k') | third_party/sqlite/sqlite-src-3080704/src/pcache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698