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

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

Issue 2846743003: [sql] Remove SQLite 3.10.2 reference directory. (Closed)
Patch Set: Created 3 years, 7 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
(Empty)
1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
6 **
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** This file contains SQLite's grammar for SQL. Process this file
13 ** using the lemon parser generator to generate C code that runs
14 ** the parser. Lemon will also generate a header file containing
15 ** numeric codes for all of the tokens.
16 */
17
18 // All token codes are small integers with #defines that begin with "TK_"
19 %token_prefix TK_
20
21 // The type of the data attached to each token is Token. This is also the
22 // default type for non-terminals.
23 //
24 %token_type {Token}
25 %default_type {Token}
26
27 // The generated parser function takes a 4th argument as follows:
28 %extra_argument {Parse *pParse}
29
30 // This code runs whenever there is a syntax error
31 //
32 %syntax_error {
33 UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */
34 assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */
35 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
36 }
37 %stack_overflow {
38 UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */
39 sqlite3ErrorMsg(pParse, "parser stack overflow");
40 }
41
42 // The name of the generated procedure that implements the parser
43 // is as follows:
44 %name sqlite3Parser
45
46 // The following text is included near the beginning of the C source
47 // code file that implements the parser.
48 //
49 %include {
50 #include "sqliteInt.h"
51
52 /*
53 ** Disable all error recovery processing in the parser push-down
54 ** automaton.
55 */
56 #define YYNOERRORRECOVERY 1
57
58 /*
59 ** Make yytestcase() the same as testcase()
60 */
61 #define yytestcase(X) testcase(X)
62
63 /*
64 ** Indicate that sqlite3ParserFree() will never be called with a null
65 ** pointer.
66 */
67 #define YYPARSEFREENEVERNULL 1
68
69 /*
70 ** Alternative datatype for the argument to the malloc() routine passed
71 ** into sqlite3ParserAlloc(). The default is size_t.
72 */
73 #define YYMALLOCARGTYPE u64
74
75 /*
76 ** An instance of this structure holds information about the
77 ** LIMIT clause of a SELECT statement.
78 */
79 struct LimitVal {
80 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */
81 Expr *pOffset; /* The OFFSET expression. NULL if there is none */
82 };
83
84 /*
85 ** An instance of this structure is used to store the LIKE,
86 ** GLOB, NOT LIKE, and NOT GLOB operators.
87 */
88 struct LikeOp {
89 Token eOperator; /* "like" or "glob" or "regexp" */
90 int bNot; /* True if the NOT keyword is present */
91 };
92
93 /*
94 ** An instance of the following structure describes the event of a
95 ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT,
96 ** TK_DELETE, or TK_INSTEAD. If the event is of the form
97 **
98 ** UPDATE ON (a,b,c)
99 **
100 ** Then the "b" IdList records the list "a,b,c".
101 */
102 struct TrigEvent { int a; IdList * b; };
103
104 /*
105 ** An instance of this structure holds the ATTACH key and the key type.
106 */
107 struct AttachKey { int type; Token key; };
108
109 } // end %include
110
111 // Input is a single SQL command
112 input ::= cmdlist.
113 cmdlist ::= cmdlist ecmd.
114 cmdlist ::= ecmd.
115 ecmd ::= SEMI.
116 ecmd ::= explain cmdx SEMI.
117 explain ::= . { sqlite3BeginParse(pParse, 0); }
118 %ifndef SQLITE_OMIT_EXPLAIN
119 explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); }
120 explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); }
121 %endif SQLITE_OMIT_EXPLAIN
122 cmdx ::= cmd. { sqlite3FinishCoding(pParse); }
123
124 ///////////////////// Begin and end transactions. ////////////////////////////
125 //
126
127 cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);}
128 trans_opt ::= .
129 trans_opt ::= TRANSACTION.
130 trans_opt ::= TRANSACTION nm.
131 %type transtype {int}
132 transtype(A) ::= . {A = TK_DEFERRED;}
133 transtype(A) ::= DEFERRED(X). {A = @X;}
134 transtype(A) ::= IMMEDIATE(X). {A = @X;}
135 transtype(A) ::= EXCLUSIVE(X). {A = @X;}
136 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);}
137 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);}
138 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);}
139
140 savepoint_opt ::= SAVEPOINT.
141 savepoint_opt ::= .
142 cmd ::= SAVEPOINT nm(X). {
143 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
144 }
145 cmd ::= RELEASE savepoint_opt nm(X). {
146 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
147 }
148 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
149 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
150 }
151
152 ///////////////////// The CREATE TABLE statement ////////////////////////////
153 //
154 cmd ::= create_table create_table_args.
155 create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
156 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
157 }
158 createkw(A) ::= CREATE(X). {
159 pParse->db->lookaside.bEnabled = 0;
160 A = X;
161 }
162 %type ifnotexists {int}
163 ifnotexists(A) ::= . {A = 0;}
164 ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
165 %type temp {int}
166 %ifndef SQLITE_OMIT_TEMPDB
167 temp(A) ::= TEMP. {A = 1;}
168 %endif SQLITE_OMIT_TEMPDB
169 temp(A) ::= . {A = 0;}
170 create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
171 sqlite3EndTable(pParse,&X,&E,F,0);
172 }
173 create_table_args ::= AS select(S). {
174 sqlite3EndTable(pParse,0,0,0,S);
175 sqlite3SelectDelete(pParse->db, S);
176 }
177 %type table_options {int}
178 table_options(A) ::= . {A = 0;}
179 table_options(A) ::= WITHOUT nm(X). {
180 if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
181 A = TF_WithoutRowid | TF_NoVisibleRowid;
182 }else{
183 A = 0;
184 sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
185 }
186 }
187 columnlist ::= columnlist COMMA column.
188 columnlist ::= column.
189
190 // A "column" is a complete description of a single column in a
191 // CREATE TABLE statement. This includes the column name, its
192 // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES,
193 // NOT NULL and so forth.
194 //
195 column(A) ::= columnid(X) type carglist. {
196 A.z = X.z;
197 A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n;
198 }
199 columnid(A) ::= nm(X). {
200 sqlite3AddColumn(pParse,&X);
201 A = X;
202 pParse->constraintName.n = 0;
203 }
204
205
206 // An IDENTIFIER can be a generic identifier, or one of several
207 // keywords. Any non-standard keyword can also be an identifier.
208 //
209 %token_class id ID|INDEXED.
210
211 // The following directive causes tokens ABORT, AFTER, ASC, etc. to
212 // fallback to ID if they will not parse as their original value.
213 // This obviates the need for the "id" nonterminal.
214 //
215 %fallback ID
216 ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
217 CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
218 IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
219 QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW
220 ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
221 %ifdef SQLITE_OMIT_COMPOUND_SELECT
222 EXCEPT INTERSECT UNION
223 %endif SQLITE_OMIT_COMPOUND_SELECT
224 REINDEX RENAME CTIME_KW IF
225 .
226 %wildcard ANY.
227
228 // Define operator precedence early so that this is the first occurrence
229 // of the operator tokens in the grammer. Keeping the operators together
230 // causes them to be assigned integer values that are close together,
231 // which keeps parser tables smaller.
232 //
233 // The token values assigned to these symbols is determined by the order
234 // in which lemon first sees them. It must be the case that ISNULL/NOTNULL,
235 // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See
236 // the sqlite3ExprIfFalse() routine for additional information on this
237 // constraint.
238 //
239 %left OR.
240 %left AND.
241 %right NOT.
242 %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
243 %left GT LE LT GE.
244 %right ESCAPE.
245 %left BITAND BITOR LSHIFT RSHIFT.
246 %left PLUS MINUS.
247 %left STAR SLASH REM.
248 %left CONCAT.
249 %left COLLATE.
250 %right BITNOT.
251
252 // And "ids" is an identifer-or-string.
253 //
254 %token_class ids ID|STRING.
255
256 // The name of a column or table can be any of the following:
257 //
258 %type nm {Token}
259 nm(A) ::= id(X). {A = X;}
260 nm(A) ::= STRING(X). {A = X;}
261 nm(A) ::= JOIN_KW(X). {A = X;}
262
263 // A typetoken is really one or more tokens that form a type name such
264 // as can be found after the column name in a CREATE TABLE statement.
265 // Multiple tokens are concatenated to form the value of the typetoken.
266 //
267 %type typetoken {Token}
268 type ::= .
269 type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);}
270 typetoken(A) ::= typename(X). {A = X;}
271 typetoken(A) ::= typename(X) LP signed RP(Y). {
272 A.z = X.z;
273 A.n = (int)(&Y.z[Y.n] - X.z);
274 }
275 typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). {
276 A.z = X.z;
277 A.n = (int)(&Y.z[Y.n] - X.z);
278 }
279 %type typename {Token}
280 typename(A) ::= ids(X). {A = X;}
281 typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);}
282 signed ::= plus_num.
283 signed ::= minus_num.
284
285 // "carglist" is a list of additional constraints that come after the
286 // column name and column type in a CREATE TABLE statement.
287 //
288 carglist ::= carglist ccons.
289 carglist ::= .
290 ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;}
291 ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);}
292 ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);}
293 ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);}
294 ccons ::= DEFAULT MINUS(A) term(X). {
295 ExprSpan v;
296 v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0);
297 v.zStart = A.z;
298 v.zEnd = X.zEnd;
299 sqlite3AddDefaultValue(pParse,&v);
300 }
301 ccons ::= DEFAULT id(X). {
302 ExprSpan v;
303 spanExpr(&v, pParse, TK_STRING, &X);
304 sqlite3AddDefaultValue(pParse,&v);
305 }
306
307 // In addition to the type name, we also care about the primary key and
308 // UNIQUE constraints.
309 //
310 ccons ::= NULL onconf.
311 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);}
312 ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
313 {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
314 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);}
315 ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);}
316 ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
317 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
318 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);}
319 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);}
320
321 // The optional AUTOINCREMENT keyword
322 %type autoinc {int}
323 autoinc(X) ::= . {X = 0;}
324 autoinc(X) ::= AUTOINCR. {X = 1;}
325
326 // The next group of rules parses the arguments to a REFERENCES clause
327 // that determine if the referential integrity checking is deferred or
328 // or immediate and which determine what action to take if a ref-integ
329 // check fails.
330 //
331 %type refargs {int}
332 refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */}
333 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; }
334 %type refarg {struct {int value; int mask;}}
335 refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; }
336 refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; }
337 refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; }
338 refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; }
339 %type refact {int}
340 refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */}
341 refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */}
342 refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */}
343 refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */}
344 refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */}
345 %type defer_subclause {int}
346 defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;}
347 defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;}
348 %type init_deferred_pred_opt {int}
349 init_deferred_pred_opt(A) ::= . {A = 0;}
350 init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;}
351 init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;}
352
353 conslist_opt(A) ::= . {A.n = 0; A.z = 0;}
354 conslist_opt(A) ::= COMMA(X) conslist. {A = X;}
355 conslist ::= conslist tconscomma tcons.
356 conslist ::= tcons.
357 tconscomma ::= COMMA. {pParse->constraintName.n = 0;}
358 tconscomma ::= .
359 tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;}
360 tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
361 {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
362 tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
363 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);}
364 tcons ::= CHECK LP expr(E) RP onconf.
365 {sqlite3AddCheckConstraint(pParse,E.pExpr);}
366 tcons ::= FOREIGN KEY LP eidlist(FA) RP
367 REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
368 sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
369 sqlite3DeferForeignKey(pParse, D);
370 }
371 %type defer_subclause_opt {int}
372 defer_subclause_opt(A) ::= . {A = 0;}
373 defer_subclause_opt(A) ::= defer_subclause(X). {A = X;}
374
375 // The following is a non-standard extension that allows us to declare the
376 // default behavior when there is a constraint conflict.
377 //
378 %type onconf {int}
379 %type orconf {int}
380 %type resolvetype {int}
381 onconf(A) ::= . {A = OE_Default;}
382 onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;}
383 orconf(A) ::= . {A = OE_Default;}
384 orconf(A) ::= OR resolvetype(X). {A = X;}
385 resolvetype(A) ::= raisetype(X). {A = X;}
386 resolvetype(A) ::= IGNORE. {A = OE_Ignore;}
387 resolvetype(A) ::= REPLACE. {A = OE_Replace;}
388
389 ////////////////////////// The DROP TABLE /////////////////////////////////////
390 //
391 cmd ::= DROP TABLE ifexists(E) fullname(X). {
392 sqlite3DropTable(pParse, X, 0, E);
393 }
394 %type ifexists {int}
395 ifexists(A) ::= IF EXISTS. {A = 1;}
396 ifexists(A) ::= . {A = 0;}
397
398 ///////////////////// The CREATE VIEW statement /////////////////////////////
399 //
400 %ifndef SQLITE_OMIT_VIEW
401 cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
402 AS select(S). {
403 sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
404 }
405 cmd ::= DROP VIEW ifexists(E) fullname(X). {
406 sqlite3DropTable(pParse, X, 1, E);
407 }
408 %endif SQLITE_OMIT_VIEW
409
410 //////////////////////// The SELECT statement /////////////////////////////////
411 //
412 cmd ::= select(X). {
413 SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
414 sqlite3Select(pParse, X, &dest);
415 sqlite3SelectDelete(pParse->db, X);
416 }
417
418 %type select {Select*}
419 %destructor select {sqlite3SelectDelete(pParse->db, $$);}
420 %type selectnowith {Select*}
421 %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
422 %type oneselect {Select*}
423 %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
424
425 %include {
426 /*
427 ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
428 ** all elements in the list. And make sure list length does not exceed
429 ** SQLITE_LIMIT_COMPOUND_SELECT.
430 */
431 static void parserDoubleLinkSelect(Parse *pParse, Select *p){
432 if( p->pPrior ){
433 Select *pNext = 0, *pLoop;
434 int mxSelect, cnt = 0;
435 for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
436 pLoop->pNext = pNext;
437 pLoop->selFlags |= SF_Compound;
438 }
439 if( (p->selFlags & SF_MultiValue)==0 &&
440 (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
441 cnt>mxSelect
442 ){
443 sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
444 }
445 }
446 }
447 }
448
449 select(A) ::= with(W) selectnowith(X). {
450 Select *p = X;
451 if( p ){
452 p->pWith = W;
453 parserDoubleLinkSelect(pParse, p);
454 }else{
455 sqlite3WithDelete(pParse->db, W);
456 }
457 A = p;
458 }
459
460 selectnowith(A) ::= oneselect(X). {A = X;}
461 %ifndef SQLITE_OMIT_COMPOUND_SELECT
462 selectnowith(A) ::= selectnowith(X) multiselect_op(Y) oneselect(Z). {
463 Select *pRhs = Z;
464 Select *pLhs = X;
465 if( pRhs && pRhs->pPrior ){
466 SrcList *pFrom;
467 Token x;
468 x.n = 0;
469 parserDoubleLinkSelect(pParse, pRhs);
470 pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
471 pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0);
472 }
473 if( pRhs ){
474 pRhs->op = (u8)Y;
475 pRhs->pPrior = pLhs;
476 if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
477 pRhs->selFlags &= ~SF_MultiValue;
478 if( Y!=TK_ALL ) pParse->hasCompound = 1;
479 }else{
480 sqlite3SelectDelete(pParse->db, pLhs);
481 }
482 A = pRhs;
483 }
484 %type multiselect_op {int}
485 multiselect_op(A) ::= UNION(OP). {A = @OP;}
486 multiselect_op(A) ::= UNION ALL. {A = TK_ALL;}
487 multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;}
488 %endif SQLITE_OMIT_COMPOUND_SELECT
489 oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
490 groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
491 A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
492 #if SELECTTRACE_ENABLED
493 /* Populate the Select.zSelName[] string that is used to help with
494 ** query planner debugging, to differentiate between multiple Select
495 ** objects in a complex query.
496 **
497 ** If the SELECT keyword is immediately followed by a C-style comment
498 ** then extract the first few alphanumeric characters from within that
499 ** comment to be the zSelName value. Otherwise, the label is #N where
500 ** is an integer that is incremented with each SELECT statement seen.
501 */
502 if( A!=0 ){
503 const char *z = S.z+6;
504 int i;
505 sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d",
506 ++pParse->nSelect);
507 while( z[0]==' ' ) z++;
508 if( z[0]=='/' && z[1]=='*' ){
509 z += 2;
510 while( z[0]==' ' ) z++;
511 for(i=0; sqlite3Isalnum(z[i]); i++){}
512 sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
513 }
514 }
515 #endif /* SELECTRACE_ENABLED */
516 }
517 oneselect(A) ::= values(X). {A = X;}
518
519 %type values {Select*}
520 %destructor values {sqlite3SelectDelete(pParse->db, $$);}
521 values(A) ::= VALUES LP nexprlist(X) RP. {
522 A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0,0);
523 }
524 values(A) ::= values(X) COMMA LP exprlist(Y) RP. {
525 Select *pRight, *pLeft = X;
526 pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0,0);
527 if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
528 if( pRight ){
529 pRight->op = TK_ALL;
530 pLeft = X;
531 pRight->pPrior = pLeft;
532 A = pRight;
533 }else{
534 A = pLeft;
535 }
536 }
537
538 // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
539 // present and false (0) if it is not.
540 //
541 %type distinct {int}
542 distinct(A) ::= DISTINCT. {A = SF_Distinct;}
543 distinct(A) ::= ALL. {A = SF_All;}
544 distinct(A) ::= . {A = 0;}
545
546 // selcollist is a list of expressions that are to become the return
547 // values of the SELECT statement. The "*" in statements like
548 // "SELECT * FROM ..." is encoded as a special expression with an
549 // opcode of TK_ASTERISK.
550 //
551 %type selcollist {ExprList*}
552 %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
553 %type sclp {ExprList*}
554 %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
555 sclp(A) ::= selcollist(X) COMMA. {A = X;}
556 sclp(A) ::= . {A = 0;}
557 selcollist(A) ::= sclp(P) expr(X) as(Y). {
558 A = sqlite3ExprListAppend(pParse, P, X.pExpr);
559 if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
560 sqlite3ExprListSetSpan(pParse,A,&X);
561 }
562 selcollist(A) ::= sclp(P) STAR. {
563 Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
564 A = sqlite3ExprListAppend(pParse, P, p);
565 }
566 selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). {
567 Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0, &Y);
568 Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
569 Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
570 A = sqlite3ExprListAppend(pParse,P, pDot);
571 }
572
573 // An option "AS <id>" phrase that can follow one of the expressions that
574 // define the result set, or one of the tables in the FROM clause.
575 //
576 %type as {Token}
577 as(X) ::= AS nm(Y). {X = Y;}
578 as(X) ::= ids(Y). {X = Y;}
579 as(X) ::= . {X.n = 0;}
580
581
582 %type seltablist {SrcList*}
583 %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
584 %type stl_prefix {SrcList*}
585 %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
586 %type from {SrcList*}
587 %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
588
589 // A complete FROM clause.
590 //
591 from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
592 from(A) ::= FROM seltablist(X). {
593 A = X;
594 sqlite3SrcListShiftJoinType(A);
595 }
596
597 // "seltablist" is a "Select Table List" - the content of the FROM clause
598 // in a SELECT statement. "stl_prefix" is a prefix of this list.
599 //
600 stl_prefix(A) ::= seltablist(X) joinop(Y). {
601 A = X;
602 if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
603 }
604 stl_prefix(A) ::= . {A = 0;}
605 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I)
606 on_opt(N) using_opt(U). {
607 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
608 sqlite3SrcListIndexedBy(pParse, A, &I);
609 }
610 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
611 on_opt(N) using_opt(U). {
612 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
613 sqlite3SrcListFuncArgs(pParse, A, E);
614 }
615 %ifndef SQLITE_OMIT_SUBQUERY
616 seltablist(A) ::= stl_prefix(X) LP select(S) RP
617 as(Z) on_opt(N) using_opt(U). {
618 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U);
619 }
620 seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP
621 as(Z) on_opt(N) using_opt(U). {
622 if( X==0 && Z.n==0 && N==0 && U==0 ){
623 A = F;
624 }else if( F->nSrc==1 ){
625 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,0,N,U);
626 if( A ){
627 struct SrcList_item *pNew = &A->a[A->nSrc-1];
628 struct SrcList_item *pOld = F->a;
629 pNew->zName = pOld->zName;
630 pNew->zDatabase = pOld->zDatabase;
631 pNew->pSelect = pOld->pSelect;
632 pOld->zName = pOld->zDatabase = 0;
633 pOld->pSelect = 0;
634 }
635 sqlite3SrcListDelete(pParse->db, F);
636 }else{
637 Select *pSubquery;
638 sqlite3SrcListShiftJoinType(F);
639 pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0,0);
640 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U);
641 }
642 }
643 %endif SQLITE_OMIT_SUBQUERY
644
645 %type dbnm {Token}
646 dbnm(A) ::= . {A.z=0; A.n=0;}
647 dbnm(A) ::= DOT nm(X). {A = X;}
648
649 %type fullname {SrcList*}
650 %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
651 fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);}
652
653 %type joinop {int}
654 joinop(X) ::= COMMA|JOIN. { X = JT_INNER; }
655 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); }
656 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); }
657 joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
658 { X = sqlite3JoinType(pParse,&A,&B,&C); }
659
660 %type on_opt {Expr*}
661 %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
662 on_opt(N) ::= ON expr(E). {N = E.pExpr;}
663 on_opt(N) ::= . {N = 0;}
664
665 // Note that this block abuses the Token type just a little. If there is
666 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
667 // there is an INDEXED BY clause, then the token is populated as per normal,
668 // with z pointing to the token data and n containing the number of bytes
669 // in the token.
670 //
671 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
672 // normally illegal. The sqlite3SrcListIndexedBy() function
673 // recognizes and interprets this as a special case.
674 //
675 %type indexed_opt {Token}
676 indexed_opt(A) ::= . {A.z=0; A.n=0;}
677 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
678 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;}
679
680 %type using_opt {IdList*}
681 %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
682 using_opt(U) ::= USING LP idlist(L) RP. {U = L;}
683 using_opt(U) ::= . {U = 0;}
684
685
686 %type orderby_opt {ExprList*}
687 %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
688
689 // the sortlist non-terminal stores a list of expression where each
690 // expression is optionally followed by ASC or DESC to indicate the
691 // sort order.
692 //
693 %type sortlist {ExprList*}
694 %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
695
696 orderby_opt(A) ::= . {A = 0;}
697 orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;}
698 sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). {
699 A = sqlite3ExprListAppend(pParse,X,Y.pExpr);
700 sqlite3ExprListSetSortOrder(A,Z);
701 }
702 sortlist(A) ::= expr(Y) sortorder(Z). {
703 A = sqlite3ExprListAppend(pParse,0,Y.pExpr);
704 sqlite3ExprListSetSortOrder(A,Z);
705 }
706
707 %type sortorder {int}
708
709 sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;}
710 sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;}
711 sortorder(A) ::= . {A = SQLITE_SO_UNDEFINED;}
712
713 %type groupby_opt {ExprList*}
714 %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
715 groupby_opt(A) ::= . {A = 0;}
716 groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
717
718 %type having_opt {Expr*}
719 %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
720 having_opt(A) ::= . {A = 0;}
721 having_opt(A) ::= HAVING expr(X). {A = X.pExpr;}
722
723 %type limit_opt {struct LimitVal}
724
725 // The destructor for limit_opt will never fire in the current grammar.
726 // The limit_opt non-terminal only occurs at the end of a single production
727 // rule for SELECT statements. As soon as the rule that create the
728 // limit_opt non-terminal reduces, the SELECT statement rule will also
729 // reduce. So there is never a limit_opt non-terminal on the stack
730 // except as a transient. So there is never anything to destroy.
731 //
732 //%destructor limit_opt {
733 // sqlite3ExprDelete(pParse->db, $$.pLimit);
734 // sqlite3ExprDelete(pParse->db, $$.pOffset);
735 //}
736 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;}
737 limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;}
738 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
739 {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;}
740 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
741 {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
742
743 /////////////////////////// The DELETE statement /////////////////////////////
744 //
745 %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
746 cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
747 orderby_opt(O) limit_opt(L). {
748 sqlite3WithPush(pParse, C, 1);
749 sqlite3SrcListIndexedBy(pParse, X, &I);
750 W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
751 sqlite3DeleteFrom(pParse,X,W);
752 }
753 %endif
754 %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
755 cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
756 sqlite3WithPush(pParse, C, 1);
757 sqlite3SrcListIndexedBy(pParse, X, &I);
758 sqlite3DeleteFrom(pParse,X,W);
759 }
760 %endif
761
762 %type where_opt {Expr*}
763 %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
764
765 where_opt(A) ::= . {A = 0;}
766 where_opt(A) ::= WHERE expr(X). {A = X.pExpr;}
767
768 ////////////////////////// The UPDATE command ////////////////////////////////
769 //
770 %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
771 cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
772 where_opt(W) orderby_opt(O) limit_opt(L). {
773 sqlite3WithPush(pParse, C, 1);
774 sqlite3SrcListIndexedBy(pParse, X, &I);
775 sqlite3ExprListCheckLength(pParse,Y,"set list");
776 W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
777 sqlite3Update(pParse,X,Y,W,R);
778 }
779 %endif
780 %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
781 cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
782 where_opt(W). {
783 sqlite3WithPush(pParse, C, 1);
784 sqlite3SrcListIndexedBy(pParse, X, &I);
785 sqlite3ExprListCheckLength(pParse,Y,"set list");
786 sqlite3Update(pParse,X,Y,W,R);
787 }
788 %endif
789
790 %type setlist {ExprList*}
791 %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
792
793 setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {
794 A = sqlite3ExprListAppend(pParse, Z, Y.pExpr);
795 sqlite3ExprListSetName(pParse, A, &X, 1);
796 }
797 setlist(A) ::= nm(X) EQ expr(Y). {
798 A = sqlite3ExprListAppend(pParse, 0, Y.pExpr);
799 sqlite3ExprListSetName(pParse, A, &X, 1);
800 }
801
802 ////////////////////////// The INSERT command /////////////////////////////////
803 //
804 cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). {
805 sqlite3WithPush(pParse, W, 1);
806 sqlite3Insert(pParse, X, S, F, R);
807 }
808 cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
809 {
810 sqlite3WithPush(pParse, W, 1);
811 sqlite3Insert(pParse, X, 0, F, R);
812 }
813
814 %type insert_cmd {int}
815 insert_cmd(A) ::= INSERT orconf(R). {A = R;}
816 insert_cmd(A) ::= REPLACE. {A = OE_Replace;}
817
818 %type idlist_opt {IdList*}
819 %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
820 %type idlist {IdList*}
821 %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
822
823 idlist_opt(A) ::= . {A = 0;}
824 idlist_opt(A) ::= LP idlist(X) RP. {A = X;}
825 idlist(A) ::= idlist(X) COMMA nm(Y).
826 {A = sqlite3IdListAppend(pParse->db,X,&Y);}
827 idlist(A) ::= nm(Y).
828 {A = sqlite3IdListAppend(pParse->db,0,&Y);}
829
830 /////////////////////////// Expression Processing /////////////////////////////
831 //
832
833 %type expr {ExprSpan}
834 %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);}
835 %type term {ExprSpan}
836 %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);}
837
838 %include {
839 /* This is a utility routine used to set the ExprSpan.zStart and
840 ** ExprSpan.zEnd values of pOut so that the span covers the complete
841 ** range of text beginning with pStart and going to the end of pEnd.
842 */
843 static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
844 pOut->zStart = pStart->z;
845 pOut->zEnd = &pEnd->z[pEnd->n];
846 }
847
848 /* Construct a new Expr object from a single identifier. Use the
849 ** new Expr to populate pOut. Set the span of pOut to be the identifier
850 ** that created the expression.
851 */
852 static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){
853 pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue);
854 pOut->zStart = pValue->z;
855 pOut->zEnd = &pValue->z[pValue->n];
856 }
857 }
858
859 expr(A) ::= term(X). {A = X;}
860 expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);}
861 term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);}
862 expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);}
863 expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);}
864 expr(A) ::= nm(X) DOT nm(Y). {
865 Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
866 Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
867 A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
868 spanSet(&A,&X,&Y);
869 }
870 expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
871 Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
872 Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
873 Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z);
874 Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
875 A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
876 spanSet(&A,&X,&Z);
877 }
878 term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);}
879 term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);}
880 expr(A) ::= VARIABLE(X). {
881 if( X.n>=2 && X.z[0]=='#' && sqlite3Isdigit(X.z[1]) ){
882 /* When doing a nested parse, one can include terms in an expression
883 ** that look like this: #1 #2 ... These terms refer to registers
884 ** in the virtual machine. #N is the N-th register. */
885 if( pParse->nested==0 ){
886 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X);
887 A.pExpr = 0;
888 }else{
889 A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
890 if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
891 }
892 }else{
893 spanExpr(&A, pParse, TK_VARIABLE, &X);
894 sqlite3ExprAssignVarNumber(pParse, A.pExpr);
895 }
896 spanSet(&A, &X, &X);
897 }
898 expr(A) ::= expr(E) COLLATE ids(C). {
899 A.pExpr = sqlite3ExprAddCollateToken(pParse, E.pExpr, &C, 1);
900 A.zStart = E.zStart;
901 A.zEnd = &C.z[C.n];
902 }
903 %ifndef SQLITE_OMIT_CAST
904 expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
905 A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T);
906 spanSet(&A,&X,&Y);
907 }
908 %endif SQLITE_OMIT_CAST
909 expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). {
910 if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
911 sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
912 }
913 A.pExpr = sqlite3ExprFunction(pParse, Y, &X);
914 spanSet(&A,&X,&E);
915 if( D==SF_Distinct && A.pExpr ){
916 A.pExpr->flags |= EP_Distinct;
917 }
918 }
919 expr(A) ::= id(X) LP STAR RP(E). {
920 A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
921 spanSet(&A,&X,&E);
922 }
923 term(A) ::= CTIME_KW(OP). {
924 A.pExpr = sqlite3ExprFunction(pParse, 0, &OP);
925 spanSet(&A, &OP, &OP);
926 }
927
928 %include {
929 /* This routine constructs a binary expression node out of two ExprSpan
930 ** objects and uses the result to populate a new ExprSpan object.
931 */
932 static void spanBinaryExpr(
933 ExprSpan *pOut, /* Write the result here */
934 Parse *pParse, /* The parsing context. Errors accumulate here */
935 int op, /* The binary operation */
936 ExprSpan *pLeft, /* The left operand */
937 ExprSpan *pRight /* The right operand */
938 ){
939 pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0);
940 pOut->zStart = pLeft->zStart;
941 pOut->zEnd = pRight->zEnd;
942 }
943
944 /* If doNot is true, then add a TK_NOT Expr-node wrapper around the
945 ** outside of *ppExpr.
946 */
947 static void exprNot(Parse *pParse, int doNot, Expr **ppExpr){
948 if( doNot ) *ppExpr = sqlite3PExpr(pParse, TK_NOT, *ppExpr, 0, 0);
949 }
950 }
951
952 expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
953 expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
954 expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y).
955 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
956 expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
957 expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
958 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
959 expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).
960 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
961 expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y).
962 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
963 expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
964 %type likeop {struct LikeOp}
965 likeop(A) ::= LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 0;}
966 likeop(A) ::= NOT LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 1;}
967 expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] {
968 ExprList *pList;
969 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
970 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
971 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
972 exprNot(pParse, OP.bNot, &A.pExpr);
973 A.zStart = X.zStart;
974 A.zEnd = Y.zEnd;
975 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
976 }
977 expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] {
978 ExprList *pList;
979 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
980 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
981 pList = sqlite3ExprListAppend(pParse,pList, E.pExpr);
982 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
983 exprNot(pParse, OP.bNot, &A.pExpr);
984 A.zStart = X.zStart;
985 A.zEnd = E.zEnd;
986 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
987 }
988
989 %include {
990 /* Construct an expression node for a unary postfix operator
991 */
992 static void spanUnaryPostfix(
993 ExprSpan *pOut, /* Write the new expression node here */
994 Parse *pParse, /* Parsing context to record errors */
995 int op, /* The operator */
996 ExprSpan *pOperand, /* The operand */
997 Token *pPostOp /* The operand token for setting the span */
998 ){
999 pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
1000 pOut->zStart = pOperand->zStart;
1001 pOut->zEnd = &pPostOp->z[pPostOp->n];
1002 }
1003 }
1004
1005 expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);}
1006 expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);}
1007
1008 %include {
1009 /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
1010 ** unary TK_ISNULL or TK_NOTNULL expression. */
1011 static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
1012 sqlite3 *db = pParse->db;
1013 if( pY && pA && pY->op==TK_NULL ){
1014 pA->op = (u8)op;
1015 sqlite3ExprDelete(db, pA->pRight);
1016 pA->pRight = 0;
1017 }
1018 }
1019 }
1020
1021 // expr1 IS expr2
1022 // expr1 IS NOT expr2
1023 //
1024 // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2
1025 // is any other expression, code as TK_IS or TK_ISNOT.
1026 //
1027 expr(A) ::= expr(X) IS expr(Y). {
1028 spanBinaryExpr(&A,pParse,TK_IS,&X,&Y);
1029 binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL);
1030 }
1031 expr(A) ::= expr(X) IS NOT expr(Y). {
1032 spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y);
1033 binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL);
1034 }
1035
1036 %include {
1037 /* Construct an expression node for a unary prefix operator
1038 */
1039 static void spanUnaryPrefix(
1040 ExprSpan *pOut, /* Write the new expression node here */
1041 Parse *pParse, /* Parsing context to record errors */
1042 int op, /* The operator */
1043 ExprSpan *pOperand, /* The operand */
1044 Token *pPreOp /* The operand token for setting the span */
1045 ){
1046 pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
1047 pOut->zStart = pPreOp->z;
1048 pOut->zEnd = pOperand->zEnd;
1049 }
1050 }
1051
1052
1053
1054 expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
1055 expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
1056 expr(A) ::= MINUS(B) expr(X). [BITNOT]
1057 {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);}
1058 expr(A) ::= PLUS(B) expr(X). [BITNOT]
1059 {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);}
1060
1061 %type between_op {int}
1062 between_op(A) ::= BETWEEN. {A = 0;}
1063 between_op(A) ::= NOT BETWEEN. {A = 1;}
1064 expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
1065 ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr);
1066 pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr);
1067 A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0);
1068 if( A.pExpr ){
1069 A.pExpr->x.pList = pList;
1070 }else{
1071 sqlite3ExprListDelete(pParse->db, pList);
1072 }
1073 exprNot(pParse, N, &A.pExpr);
1074 A.zStart = W.zStart;
1075 A.zEnd = Y.zEnd;
1076 }
1077 %ifndef SQLITE_OMIT_SUBQUERY
1078 %type in_op {int}
1079 in_op(A) ::= IN. {A = 0;}
1080 in_op(A) ::= NOT IN. {A = 1;}
1081 expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
1082 if( Y==0 ){
1083 /* Expressions of the form
1084 **
1085 ** expr1 IN ()
1086 ** expr1 NOT IN ()
1087 **
1088 ** simplify to constants 0 (false) and 1 (true), respectively,
1089 ** regardless of the value of expr1.
1090 */
1091 A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]);
1092 sqlite3ExprDelete(pParse->db, X.pExpr);
1093 }else if( Y->nExpr==1 ){
1094 /* Expressions of the form:
1095 **
1096 ** expr1 IN (?1)
1097 ** expr1 NOT IN (?2)
1098 **
1099 ** with exactly one value on the RHS can be simplified to something
1100 ** like this:
1101 **
1102 ** expr1 == ?1
1103 ** expr1 <> ?2
1104 **
1105 ** But, the RHS of the == or <> is marked with the EP_Generic flag
1106 ** so that it may not contribute to the computation of comparison
1107 ** affinity or the collating sequence to use for comparison. Otherwise,
1108 ** the semantics would be subtly different from IN or NOT IN.
1109 */
1110 Expr *pRHS = Y->a[0].pExpr;
1111 Y->a[0].pExpr = 0;
1112 sqlite3ExprListDelete(pParse->db, Y);
1113 /* pRHS cannot be NULL because a malloc error would have been detected
1114 ** before now and control would have never reached this point */
1115 if( ALWAYS(pRHS) ){
1116 pRHS->flags &= ~EP_Collate;
1117 pRHS->flags |= EP_Generic;
1118 }
1119 A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, X.pExpr, pRHS, 0);
1120 }else{
1121 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1122 if( A.pExpr ){
1123 A.pExpr->x.pList = Y;
1124 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr);
1125 }else{
1126 sqlite3ExprListDelete(pParse->db, Y);
1127 }
1128 exprNot(pParse, N, &A.pExpr);
1129 }
1130 A.zStart = X.zStart;
1131 A.zEnd = &E.z[E.n];
1132 }
1133 expr(A) ::= LP(B) select(X) RP(E). {
1134 A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
1135 if( A.pExpr ){
1136 A.pExpr->x.pSelect = X;
1137 ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery);
1138 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr);
1139 }else{
1140 sqlite3SelectDelete(pParse->db, X);
1141 }
1142 A.zStart = B.z;
1143 A.zEnd = &E.z[E.n];
1144 }
1145 expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] {
1146 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1147 if( A.pExpr ){
1148 A.pExpr->x.pSelect = Y;
1149 ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery);
1150 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr);
1151 }else{
1152 sqlite3SelectDelete(pParse->db, Y);
1153 }
1154 exprNot(pParse, N, &A.pExpr);
1155 A.zStart = X.zStart;
1156 A.zEnd = &E.z[E.n];
1157 }
1158 expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
1159 SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
1160 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1161 if( A.pExpr ){
1162 A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
1163 ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery);
1164 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr);
1165 }else{
1166 sqlite3SrcListDelete(pParse->db, pSrc);
1167 }
1168 exprNot(pParse, N, &A.pExpr);
1169 A.zStart = X.zStart;
1170 A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
1171 }
1172 expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
1173 Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
1174 if( p ){
1175 p->x.pSelect = Y;
1176 ExprSetProperty(p, EP_xIsSelect|EP_Subquery);
1177 sqlite3ExprSetHeightAndFlags(pParse, p);
1178 }else{
1179 sqlite3SelectDelete(pParse->db, Y);
1180 }
1181 A.zStart = B.z;
1182 A.zEnd = &E.z[E.n];
1183 }
1184 %endif SQLITE_OMIT_SUBQUERY
1185
1186 /* CASE expressions */
1187 expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
1188 A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0, 0);
1189 if( A.pExpr ){
1190 A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
1191 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr);
1192 }else{
1193 sqlite3ExprListDelete(pParse->db, Y);
1194 sqlite3ExprDelete(pParse->db, Z);
1195 }
1196 A.zStart = C.z;
1197 A.zEnd = &E.z[E.n];
1198 }
1199 %type case_exprlist {ExprList*}
1200 %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
1201 case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
1202 A = sqlite3ExprListAppend(pParse,X, Y.pExpr);
1203 A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
1204 }
1205 case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
1206 A = sqlite3ExprListAppend(pParse,0, Y.pExpr);
1207 A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
1208 }
1209 %type case_else {Expr*}
1210 %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
1211 case_else(A) ::= ELSE expr(X). {A = X.pExpr;}
1212 case_else(A) ::= . {A = 0;}
1213 %type case_operand {Expr*}
1214 %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
1215 case_operand(A) ::= expr(X). {A = X.pExpr;}
1216 case_operand(A) ::= . {A = 0;}
1217
1218 %type exprlist {ExprList*}
1219 %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
1220 %type nexprlist {ExprList*}
1221 %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1222
1223 exprlist(A) ::= nexprlist(X). {A = X;}
1224 exprlist(A) ::= . {A = 0;}
1225 nexprlist(A) ::= nexprlist(X) COMMA expr(Y).
1226 {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
1227 nexprlist(A) ::= expr(Y).
1228 {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);}
1229
1230
1231 ///////////////////////////// The CREATE INDEX command ///////////////////////
1232 //
1233 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1234 ON nm(Y) LP sortlist(Z) RP where_opt(W). {
1235 sqlite3CreateIndex(pParse, &X, &D,
1236 sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
1237 &S, W, SQLITE_SO_ASC, NE);
1238 }
1239
1240 %type uniqueflag {int}
1241 uniqueflag(A) ::= UNIQUE. {A = OE_Abort;}
1242 uniqueflag(A) ::= . {A = OE_None;}
1243
1244
1245 // The eidlist non-terminal (Expression Id List) generates an ExprList
1246 // from a list of identifiers. The identifier names are in ExprList.a[].zName.
1247 // This list is stored in an ExprList rather than an IdList so that it
1248 // can be easily sent to sqlite3ColumnsExprList().
1249 //
1250 // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1251 // used for the arguments to an index. That is just an historical accident.
1252 //
1253 // IMPORTANT COMPATIBILITY NOTE: Some prior versions of SQLite accepted
1254 // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1255 // places - places that might have been stored in the sqlite_master schema.
1256 // Those extra features were ignored. But because they might be in some
1257 // (busted) old databases, we need to continue parsing them when loading
1258 // historical schemas.
1259 //
1260 %type eidlist {ExprList*}
1261 %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1262 %type eidlist_opt {ExprList*}
1263 %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1264
1265 %include {
1266 /* Add a single new term to an ExprList that is used to store a
1267 ** list of identifiers. Report an error if the ID list contains
1268 ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1269 ** error while parsing a legacy schema.
1270 */
1271 static ExprList *parserAddExprIdListTerm(
1272 Parse *pParse,
1273 ExprList *pPrior,
1274 Token *pIdToken,
1275 int hasCollate,
1276 int sortOrder
1277 ){
1278 ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1279 if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1280 && pParse->db->init.busy==0
1281 ){
1282 sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1283 pIdToken->n, pIdToken->z);
1284 }
1285 sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1286 return p;
1287 }
1288 } // end %include
1289
1290 eidlist_opt(A) ::= . {A = 0;}
1291 eidlist_opt(A) ::= LP eidlist(X) RP. {A = X;}
1292 eidlist(A) ::= eidlist(X) COMMA nm(Y) collate(C) sortorder(Z). {
1293 A = parserAddExprIdListTerm(pParse, X, &Y, C, Z);
1294 }
1295 eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1296 A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z);
1297 }
1298
1299 %type collate {int}
1300 collate(C) ::= . {C = 0;}
1301 collate(C) ::= COLLATE ids. {C = 1;}
1302
1303
1304 ///////////////////////////// The DROP INDEX command /////////////////////////
1305 //
1306 cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);}
1307
1308 ///////////////////////////// The VACUUM command /////////////////////////////
1309 //
1310 %ifndef SQLITE_OMIT_VACUUM
1311 %ifndef SQLITE_OMIT_ATTACH
1312 cmd ::= VACUUM. {sqlite3Vacuum(pParse);}
1313 cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);}
1314 %endif SQLITE_OMIT_ATTACH
1315 %endif SQLITE_OMIT_VACUUM
1316
1317 ///////////////////////////// The PRAGMA command /////////////////////////////
1318 //
1319 %ifndef SQLITE_OMIT_PRAGMA
1320 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);}
1321 cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1322 cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1323 cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1324 {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1325 cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1326 {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1327
1328 nmnum(A) ::= plus_num(X). {A = X;}
1329 nmnum(A) ::= nm(X). {A = X;}
1330 nmnum(A) ::= ON(X). {A = X;}
1331 nmnum(A) ::= DELETE(X). {A = X;}
1332 nmnum(A) ::= DEFAULT(X). {A = X;}
1333 %endif SQLITE_OMIT_PRAGMA
1334 %token_class number INTEGER|FLOAT.
1335 plus_num(A) ::= PLUS number(X). {A = X;}
1336 plus_num(A) ::= number(X). {A = X;}
1337 minus_num(A) ::= MINUS number(X). {A = X;}
1338 //////////////////////////// The CREATE TRIGGER command /////////////////////
1339
1340 %ifndef SQLITE_OMIT_TRIGGER
1341
1342 cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
1343 Token all;
1344 all.z = A.z;
1345 all.n = (int)(Z.z - A.z) + Z.n;
1346 sqlite3FinishTrigger(pParse, S, &all);
1347 }
1348
1349 trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1350 trigger_time(C) trigger_event(D)
1351 ON fullname(E) foreach_clause when_clause(G). {
1352 sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1353 A = (Z.n==0?B:Z);
1354 }
1355
1356 %type trigger_time {int}
1357 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; }
1358 trigger_time(A) ::= AFTER. { A = TK_AFTER; }
1359 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;}
1360 trigger_time(A) ::= . { A = TK_BEFORE; }
1361
1362 %type trigger_event {struct TrigEvent}
1363 %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1364 trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;}
1365 trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;}
1366 trigger_event(A) ::= UPDATE OF idlist(X). {A.a = TK_UPDATE; A.b = X;}
1367
1368 foreach_clause ::= .
1369 foreach_clause ::= FOR EACH ROW.
1370
1371 %type when_clause {Expr*}
1372 %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1373 when_clause(A) ::= . { A = 0; }
1374 when_clause(A) ::= WHEN expr(X). { A = X.pExpr; }
1375
1376 %type trigger_cmd_list {TriggerStep*}
1377 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
1378 trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
1379 assert( Y!=0 );
1380 Y->pLast->pNext = X;
1381 Y->pLast = X;
1382 A = Y;
1383 }
1384 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. {
1385 assert( X!=0 );
1386 X->pLast = X;
1387 A = X;
1388 }
1389
1390 // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1391 // within a trigger. The table to INSERT, UPDATE, or DELETE is always in
1392 // the same database as the table that the trigger fires on.
1393 //
1394 %type trnm {Token}
1395 trnm(A) ::= nm(X). {A = X;}
1396 trnm(A) ::= nm DOT nm(X). {
1397 A = X;
1398 sqlite3ErrorMsg(pParse,
1399 "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1400 "statements within triggers");
1401 }
1402
1403 // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1404 // statements within triggers. We make a specific error message for this
1405 // since it is an exception to the default grammar rules.
1406 //
1407 tridxby ::= .
1408 tridxby ::= INDEXED BY nm. {
1409 sqlite3ErrorMsg(pParse,
1410 "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1411 "within triggers");
1412 }
1413 tridxby ::= NOT INDEXED. {
1414 sqlite3ErrorMsg(pParse,
1415 "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1416 "within triggers");
1417 }
1418
1419
1420
1421 %type trigger_cmd {TriggerStep*}
1422 %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1423 // UPDATE
1424 trigger_cmd(A) ::=
1425 UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z).
1426 { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); }
1427
1428 // INSERT
1429 trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) idlist_opt(F) select(S).
1430 {A = sqlite3TriggerInsertStep(pParse->db, &X, F, S, R);}
1431
1432 // DELETE
1433 trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y).
1434 {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
1435
1436 // SELECT
1437 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); }
1438
1439 // The special RAISE expression that may occur in trigger programs
1440 expr(A) ::= RAISE(X) LP IGNORE RP(Y). {
1441 A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
1442 if( A.pExpr ){
1443 A.pExpr->affinity = OE_Ignore;
1444 }
1445 A.zStart = X.z;
1446 A.zEnd = &Y.z[Y.n];
1447 }
1448 expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). {
1449 A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z);
1450 if( A.pExpr ) {
1451 A.pExpr->affinity = (char)T;
1452 }
1453 A.zStart = X.z;
1454 A.zEnd = &Y.z[Y.n];
1455 }
1456 %endif !SQLITE_OMIT_TRIGGER
1457
1458 %type raisetype {int}
1459 raisetype(A) ::= ROLLBACK. {A = OE_Rollback;}
1460 raisetype(A) ::= ABORT. {A = OE_Abort;}
1461 raisetype(A) ::= FAIL. {A = OE_Fail;}
1462
1463
1464 //////////////////////// DROP TRIGGER statement //////////////////////////////
1465 %ifndef SQLITE_OMIT_TRIGGER
1466 cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1467 sqlite3DropTrigger(pParse,X,NOERR);
1468 }
1469 %endif !SQLITE_OMIT_TRIGGER
1470
1471 //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1472 %ifndef SQLITE_OMIT_ATTACH
1473 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
1474 sqlite3Attach(pParse, F.pExpr, D.pExpr, K);
1475 }
1476 cmd ::= DETACH database_kw_opt expr(D). {
1477 sqlite3Detach(pParse, D.pExpr);
1478 }
1479
1480 %type key_opt {Expr*}
1481 %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1482 key_opt(A) ::= . { A = 0; }
1483 key_opt(A) ::= KEY expr(X). { A = X.pExpr; }
1484
1485 database_kw_opt ::= DATABASE.
1486 database_kw_opt ::= .
1487 %endif SQLITE_OMIT_ATTACH
1488
1489 ////////////////////////// REINDEX collation //////////////////////////////////
1490 %ifndef SQLITE_OMIT_REINDEX
1491 cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);}
1492 cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);}
1493 %endif SQLITE_OMIT_REINDEX
1494
1495 /////////////////////////////////// ANALYZE ///////////////////////////////////
1496 %ifndef SQLITE_OMIT_ANALYZE
1497 cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);}
1498 cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);}
1499 %endif
1500
1501 //////////////////////// ALTER TABLE table ... ////////////////////////////////
1502 %ifndef SQLITE_OMIT_ALTERTABLE
1503 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
1504 sqlite3AlterRenameTable(pParse,X,&Z);
1505 }
1506 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). {
1507 sqlite3AlterFinishAddColumn(pParse, &Y);
1508 }
1509 add_column_fullname ::= fullname(X). {
1510 pParse->db->lookaside.bEnabled = 0;
1511 sqlite3AlterBeginAddColumn(pParse, X);
1512 }
1513 kwcolumn_opt ::= .
1514 kwcolumn_opt ::= COLUMNKW.
1515 %endif SQLITE_OMIT_ALTERTABLE
1516
1517 //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1518 %ifndef SQLITE_OMIT_VIRTUALTABLE
1519 cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);}
1520 cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);}
1521 create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1522 nm(X) dbnm(Y) USING nm(Z). {
1523 sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1524 }
1525 vtabarglist ::= vtabarg.
1526 vtabarglist ::= vtabarglist COMMA vtabarg.
1527 vtabarg ::= . {sqlite3VtabArgInit(pParse);}
1528 vtabarg ::= vtabarg vtabargtoken.
1529 vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);}
1530 vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);}
1531 lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);}
1532 anylist ::= .
1533 anylist ::= anylist LP anylist RP.
1534 anylist ::= anylist ANY.
1535 %endif SQLITE_OMIT_VIRTUALTABLE
1536
1537
1538 //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
1539 %type with {With*}
1540 %type wqlist {With*}
1541 %destructor with {sqlite3WithDelete(pParse->db, $$);}
1542 %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
1543
1544 with(A) ::= . {A = 0;}
1545 %ifndef SQLITE_OMIT_CTE
1546 with(A) ::= WITH wqlist(W). { A = W; }
1547 with(A) ::= WITH RECURSIVE wqlist(W). { A = W; }
1548
1549 wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1550 A = sqlite3WithAdd(pParse, 0, &X, Y, Z);
1551 }
1552 wqlist(A) ::= wqlist(W) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1553 A = sqlite3WithAdd(pParse, W, &X, Y, Z);
1554 }
1555 %endif SQLITE_OMIT_CTE
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3100200/src/pager.c ('k') | third_party/sqlite/sqlite-src-3100200/src/pcache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698