xref: /sqlite-3.40.0/src/parse.y (revision 7e02e5e6)
1348784efSdrh /*
2b19a2bc6Sdrh ** 2001 September 15
3348784efSdrh **
4b19a2bc6Sdrh ** The author disclaims copyright to this source code.  In place of
5b19a2bc6Sdrh ** a legal notice, here is a blessing:
6348784efSdrh **
7b19a2bc6Sdrh **    May you do good and not evil.
8b19a2bc6Sdrh **    May you find forgiveness for yourself and forgive others.
9b19a2bc6Sdrh **    May you share freely, never taking more than you give.
10348784efSdrh **
11348784efSdrh *************************************************************************
12348784efSdrh ** This file contains SQLite's grammar for SQL.  Process this file
13348784efSdrh ** using the lemon parser generator to generate C code that runs
14348784efSdrh ** the parser.  Lemon will also generate a header file containing
15348784efSdrh ** numeric codes for all of the tokens.
16348784efSdrh */
17487e262fSdrh 
18487e262fSdrh // All token codes are small integers with #defines that begin with "TK_"
19348784efSdrh %token_prefix TK_
20487e262fSdrh 
21487e262fSdrh // The type of the data attached to each token is Token.  This is also the
22487e262fSdrh // default type for non-terminals.
23487e262fSdrh //
24348784efSdrh %token_type {Token}
25f57b14a6Sdrh %default_type {Token}
26487e262fSdrh 
27487e262fSdrh // The generated parser function takes a 4th argument as follows:
28348784efSdrh %extra_argument {Parse *pParse}
29487e262fSdrh 
30487e262fSdrh // This code runs whenever there is a syntax error
31487e262fSdrh //
32348784efSdrh %syntax_error {
33128255fcSdrh   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
3455176259Sdrh   assert( TOKEN.z[0] );  /* The tokenizer always gives us a token */
354adee20fSdanielk1977   sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
36b86ccfb2Sdrh }
378fc3345fSdrh %stack_overflow {
38128255fcSdrh   UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */
398fc3345fSdrh   sqlite3ErrorMsg(pParse, "parser stack overflow");
408fc3345fSdrh }
41487e262fSdrh 
42487e262fSdrh // The name of the generated procedure that implements the parser
43487e262fSdrh // is as follows:
444adee20fSdanielk1977 %name sqlite3Parser
45487e262fSdrh 
46487e262fSdrh // The following text is included near the beginning of the C source
47487e262fSdrh // code file that implements the parser.
48487e262fSdrh //
49348784efSdrh %include {
50348784efSdrh #include "sqliteInt.h"
519bbca4c1Sdrh 
529bbca4c1Sdrh /*
53d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down
54d3ec02d3Sdrh ** automaton.
55d3ec02d3Sdrh */
56d3ec02d3Sdrh #define YYNOERRORRECOVERY 1
57d3ec02d3Sdrh 
58d3ec02d3Sdrh /*
598a415d37Sdrh ** Make yytestcase() the same as testcase()
608a415d37Sdrh */
618a415d37Sdrh #define yytestcase(X) testcase(X)
628a415d37Sdrh 
638a415d37Sdrh /*
64ad3cab52Sdrh ** An instance of this structure holds information about the
65ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
669bbca4c1Sdrh */
67ad3cab52Sdrh struct LimitVal {
68a2dc3b1aSdanielk1977   Expr *pLimit;    /* The LIMIT expression.  NULL if there is no limit */
69a2dc3b1aSdanielk1977   Expr *pOffset;   /* The OFFSET expression.  NULL if there is none */
70ad3cab52Sdrh };
71c3f9bad2Sdanielk1977 
72c3f9bad2Sdanielk1977 /*
732e3a1f16Sdrh ** An instance of this structure is used to store the LIKE,
742e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators.
752e3a1f16Sdrh */
762e3a1f16Sdrh struct LikeOp {
77b52076cdSdrh   Token eOperator;  /* "like" or "glob" or "regexp" */
782e3a1f16Sdrh   int not;         /* True if the NOT keyword is present */
792e3a1f16Sdrh };
802e3a1f16Sdrh 
812e3a1f16Sdrh /*
82ad3cab52Sdrh ** An instance of the following structure describes the event of a
83ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
84ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
85ad3cab52Sdrh **
86ad3cab52Sdrh **      UPDATE ON (a,b,c)
87ad3cab52Sdrh **
88ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
89c3f9bad2Sdanielk1977 */
90ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
91caec2f12Sdrh 
9225d6543dSdrh /*
9325d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type.
9425d6543dSdrh */
9525d6543dSdrh struct AttachKey { int type;  Token key; };
9625d6543dSdrh 
97caec2f12Sdrh } // end %include
98348784efSdrh 
99826fb5a3Sdrh // Input is a single SQL command
100c4a3c779Sdrh input ::= cmdlist.
101094b2bbfSdrh cmdlist ::= cmdlist ecmd.
102826fb5a3Sdrh cmdlist ::= ecmd.
103b7f9164eSdrh ecmd ::= SEMI.
104b7f9164eSdrh ecmd ::= explain cmdx SEMI.
1054adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
106b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
107b7f9164eSdrh explain ::= EXPLAIN.              { sqlite3BeginParse(pParse, 1); }
108ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN.   { sqlite3BeginParse(pParse, 2); }
109154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
110200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
111348784efSdrh 
112382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
113c4a3c779Sdrh //
114fa86c412Sdrh 
115684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
116c4a3c779Sdrh trans_opt ::= .
117c4a3c779Sdrh trans_opt ::= TRANSACTION.
1185ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
119684917c2Sdrh %type transtype {int}
120684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
121684917c2Sdrh transtype(A) ::= DEFERRED(X).  {A = @X;}
122684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;}
123684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;}
1244adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
1254adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
1264adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
127c4a3c779Sdrh 
128fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
129fd7f0452Sdanielk1977 savepoint_opt ::= .
130fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
131fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
132fd7f0452Sdanielk1977 }
133fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
134fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
135fd7f0452Sdanielk1977 }
136fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
137fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
138fd7f0452Sdanielk1977 }
139fd7f0452Sdanielk1977 
140382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
141348784efSdrh //
142348784efSdrh cmd ::= create_table create_table_args.
143d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
144f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
145969fa7c1Sdrh }
146d9da78a2Sdrh createkw(A) ::= CREATE(X).  {
147d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
148d9da78a2Sdrh   A = X;
149d9da78a2Sdrh }
150faa59554Sdrh %type ifnotexists {int}
151faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
152faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
153f57b3399Sdrh %type temp {int}
15453c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
155d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
156154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
157d24cc427Sdrh temp(A) ::= .      {A = 0;}
15819a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). {
15919a8e7e8Sdanielk1977   sqlite3EndTable(pParse,&X,&Y,0);
160969fa7c1Sdrh }
161969fa7c1Sdrh create_table_args ::= AS select(S). {
16219a8e7e8Sdanielk1977   sqlite3EndTable(pParse,0,0,S);
163633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
164969fa7c1Sdrh }
165348784efSdrh columnlist ::= columnlist COMMA column.
166348784efSdrh columnlist ::= column.
167348784efSdrh 
168487e262fSdrh // A "column" is a complete description of a single column in a
169487e262fSdrh // CREATE TABLE statement.  This includes the column name, its
170487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES,
171487e262fSdrh // NOT NULL and so forth.
172348784efSdrh //
17319a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. {
17419a8e7e8Sdanielk1977   A.z = X.z;
175b27b7f5dSdrh   A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n;
17619a8e7e8Sdanielk1977 }
17719a8e7e8Sdanielk1977 columnid(A) ::= nm(X). {
17819a8e7e8Sdanielk1977   sqlite3AddColumn(pParse,&X);
17919a8e7e8Sdanielk1977   A = X;
18019a8e7e8Sdanielk1977 }
18119a8e7e8Sdanielk1977 
182c4a3c779Sdrh 
183c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
184c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
185c4a3c779Sdrh //
186982cef7eSdrh %type id {Token}
187f18543caSdrh id(A) ::= ID(X).         {A = X;}
188296a483cSdrh id(A) ::= INDEXED(X).    {A = X;}
1890bd1f4eaSdrh 
19034e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
19134e33bb8Sdrh // fallback to ID if they will not parse as their original value.
19234e33bb8Sdrh // This obviates the need for the "id" nonterminal.
19334e33bb8Sdrh //
1940bd1f4eaSdrh %fallback ID
1951da40a38Sdan   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
1961da40a38Sdan   CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
1971da40a38Sdan   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
198db15bcd5Sdrh   QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK
19978c2e6d8Sdanielk1977   SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL
200b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
201b7f9164eSdrh   EXCEPT INTERSECT UNION
202154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
203a073384fSdrh   REINDEX RENAME CTIME_KW IF
204b7f9164eSdrh   .
205e09daa90Sdrh %wildcard ANY.
206c4a3c779Sdrh 
2072d3917daSdrh // Define operator precedence early so that this is the first occurance
2082d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2092d3917daSdrh // causes them to be assigned integer values that are close together,
2102d3917daSdrh // which keeps parser tables smaller.
2112d3917daSdrh //
212f2bc013cSdrh // The token values assigned to these symbols is determined by the order
213f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
214f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
215f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
216f2bc013cSdrh // constraint.
217f2bc013cSdrh //
2182d3917daSdrh %left OR.
2192d3917daSdrh %left AND.
2202d3917daSdrh %right NOT.
22103bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2229a43267bSdrh %left GT LE LT GE.
2237c6303c0Sdanielk1977 %right ESCAPE.
2242d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2252d3917daSdrh %left PLUS MINUS.
2262d3917daSdrh %left STAR SLASH REM.
227a34001c9Sdrh %left CONCAT.
228a34001c9Sdrh %left COLLATE.
2297ba5bc5bSdrh %right BITNOT.
2302d3917daSdrh 
231c4a3c779Sdrh // And "ids" is an identifer-or-string.
232c4a3c779Sdrh //
233c4a3c779Sdrh %type ids {Token}
234fd405314Sdrh ids(A) ::= ID|STRING(X).   {A = X;}
235c4a3c779Sdrh 
2365ad1a6c8Sdrh // The name of a column or table can be any of the following:
2375ad1a6c8Sdrh //
2385ad1a6c8Sdrh %type nm {Token}
239296a483cSdrh nm(A) ::= id(X).         {A = X;}
2405ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
2415ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
2425ad1a6c8Sdrh 
243487e262fSdrh // A typetoken is really one or more tokens that form a type name such
244487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
245487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
246487e262fSdrh //
247487e262fSdrh %type typetoken {Token}
248382c0247Sdrh type ::= .
249487e262fSdrh type ::= typetoken(X).                   {sqlite3AddColumnType(pParse,&X);}
250487e262fSdrh typetoken(A) ::= typename(X).   {A = X;}
251487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). {
252487e262fSdrh   A.z = X.z;
253b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
254487e262fSdrh }
255487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). {
256487e262fSdrh   A.z = X.z;
257b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
258487e262fSdrh }
259382c0247Sdrh %type typename {Token}
260382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
261b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);}
26260218d2aSdrh signed ::= plus_num.
26360218d2aSdrh signed ::= minus_num.
264487e262fSdrh 
265487e262fSdrh // "carglist" is a list of additional constraints that come after the
266487e262fSdrh // column name and column type in a CREATE TABLE statement.
267487e262fSdrh //
268348784efSdrh carglist ::= carglist carg.
269348784efSdrh carglist ::= .
2705ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
271348784efSdrh carg ::= ccons.
272b7916a78Sdrh ccons ::= DEFAULT term(X).            {sqlite3AddDefaultValue(pParse,&X);}
273b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP.      {sqlite3AddDefaultValue(pParse,&X);}
274b7916a78Sdrh ccons ::= DEFAULT PLUS term(X).       {sqlite3AddDefaultValue(pParse,&X);}
275f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X).      {
276b7916a78Sdrh   ExprSpan v;
277b7916a78Sdrh   v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0);
278b7916a78Sdrh   v.zStart = A.z;
279b7916a78Sdrh   v.zEnd = X.zEnd;
280b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2817977a17fSdanielk1977 }
2822b7acc35Sdrh ccons ::= DEFAULT id(X).              {
283b7916a78Sdrh   ExprSpan v;
284b7916a78Sdrh   spanExpr(&v, pParse, TK_STRING, &X);
285b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2867977a17fSdanielk1977 }
287348784efSdrh 
288382c0247Sdrh // In addition to the type name, we also care about the primary key and
289382c0247Sdrh // UNIQUE constraints.
290348784efSdrh //
2910d316a40Sdrh ccons ::= NULL onconf.
2924adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
293fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
294fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
2954d91a701Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);}
296b7916a78Sdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X.pExpr);}
297c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
2984adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
2994adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
30039002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
30104738cb9Sdrh 
302205f48e6Sdrh // The optional AUTOINCREMENT keyword
303205f48e6Sdrh %type autoinc {int}
304205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3052958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
306205f48e6Sdrh 
307c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
308c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
309c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
310c2eef3b3Sdrh // check fails.
31104738cb9Sdrh //
312c2eef3b3Sdrh %type refargs {int}
313fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
31450af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; }
315c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
316c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
317c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
318c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
319c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
320c2eef3b3Sdrh %type refact {int}
321fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
322fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
323fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
324fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
325fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
326c2eef3b3Sdrh %type defer_subclause {int}
3271da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
328c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
329c2eef3b3Sdrh %type init_deferred_pred_opt {int}
330c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
331c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
332c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
333348784efSdrh 
334348784efSdrh // For the time being, the only constraint we care about is the primary
335382c0247Sdrh // key and UNIQUE.  Both create indices.
336348784efSdrh //
33719a8e7e8Sdanielk1977 conslist_opt(A) ::= .                   {A.n = 0; A.z = 0;}
33819a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist.  {A = X;}
339348784efSdrh conslist ::= conslist COMMA tcons.
340a2e1bb5aSdrh conslist ::= conslist tcons.
341348784efSdrh conslist ::= tcons.
3425ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
343f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R).
344fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
3459cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
3464d91a701Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);}
347b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
348b7916a78Sdrh                                  {sqlite3AddCheckConstraint(pParse,E.pExpr);}
349c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
350c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3514adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3524adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
353c2eef3b3Sdrh }
354c2eef3b3Sdrh %type defer_subclause_opt {int}
355c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
356c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
3579cfcf5d4Sdrh 
3589cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3599cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3609cfcf5d4Sdrh //
3619cfcf5d4Sdrh %type onconf {int}
3625eff7cf0Sshane %type orconf {u8}
3631c92853dSdrh %type resolvetype {int}
3641c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
3651c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
3661c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
3675eff7cf0Sshane orconf(A) ::= OR resolvetype(X).             {A = (u8)X;}
36874ad7fe9Sdrh resolvetype(A) ::= raisetype(X).             {A = X;}
3691c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
3701c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
371348784efSdrh 
372382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
373348784efSdrh //
374a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
375a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
376a8858103Sdanielk1977 }
377a073384fSdrh %type ifexists {int}
378a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
379a073384fSdrh ifexists(A) ::= .            {A = 0;}
380348784efSdrh 
381a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
382a76b5dfcSdrh //
383b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
384d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). {
385fdd48a76Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E);
386a76b5dfcSdrh }
387a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
388a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
389a76b5dfcSdrh }
390154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
391a76b5dfcSdrh 
392382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
393348784efSdrh //
3949bb61fe7Sdrh cmd ::= select(X).  {
3957d10d5a6Sdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0};
3967d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
397*7e02e5e6Sdrh   sqlite3ExplainBegin(pParse->pVdbe);
398*7e02e5e6Sdrh   sqlite3ExplainSelect(pParse->pVdbe, X);
399*7e02e5e6Sdrh   sqlite3ExplainFinish(pParse->pVdbe);
400633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4019bb61fe7Sdrh }
402efb7251dSdrh 
4039bb61fe7Sdrh %type select {Select*}
404633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
40582c3d636Sdrh %type oneselect {Select*}
406633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4079bb61fe7Sdrh 
40882c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
409b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
4100a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
411daffd0e5Sdrh   if( Z ){
412b27b7f5dSdrh     Z->op = (u8)Y;
41382c3d636Sdrh     Z->pPrior = X;
41443b78826Sdrh   }else{
415633e6d57Sdrh     sqlite3SelectDelete(pParse->db, X);
416daffd0e5Sdrh   }
41782c3d636Sdrh   A = Z;
41882c3d636Sdrh }
4190a36c57eSdrh %type multiselect_op {int}
42074ad7fe9Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP;}
4210a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
422fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP;}
423154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
42482c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
4259bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
42617435752Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
4279bb61fe7Sdrh }
4289bb61fe7Sdrh 
4299bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
4309bb61fe7Sdrh // present and false (0) if it is not.
4319bb61fe7Sdrh //
432efb7251dSdrh %type distinct {int}
433efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
434fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
435efb7251dSdrh distinct(A) ::= .           {A = 0;}
436348784efSdrh 
4379bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
4387c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
4397c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
4407c917d19Sdrh // opcode of TK_ALL.
4419bb61fe7Sdrh //
442348784efSdrh %type selcollist {ExprList*}
443633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
444348784efSdrh %type sclp {ExprList*}
445633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
446348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
447348784efSdrh sclp(A) ::= .                                {A = 0;}
44801f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
449b7916a78Sdrh    A = sqlite3ExprListAppend(pParse, P, X.pExpr);
450b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
451b7916a78Sdrh    sqlite3ExprListSetSpan(pParse,A,&X);
45201f3f253Sdrh }
4537c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
454b7916a78Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0);
455b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, P, p);
4567c917d19Sdrh }
457e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). {
458e54a62adSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y);
45917435752Sdrh   Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
46017435752Sdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
461b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,P, pDot);
46254473229Sdrh }
46301f3f253Sdrh 
46401f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
46501f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
46601f3f253Sdrh //
46701f3f253Sdrh %type as {Token}
4685ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
4695ad1a6c8Sdrh as(X) ::= ids(Y).      {X = Y;}
47001f3f253Sdrh as(X) ::= .            {X.n = 0;}
4719bb61fe7Sdrh 
472348784efSdrh 
473ad3cab52Sdrh %type seltablist {SrcList*}
474633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
475ad3cab52Sdrh %type stl_prefix {SrcList*}
476633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
477ad3cab52Sdrh %type from {SrcList*}
478633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
479348784efSdrh 
48001f3f253Sdrh // A complete FROM clause.
48101f3f253Sdrh //
48217435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
48361dfc31dSdrh from(A) ::= FROM seltablist(X). {
48461dfc31dSdrh   A = X;
48561dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
48661dfc31dSdrh }
48701f3f253Sdrh 
48801f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
48901f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
49001f3f253Sdrh //
49101f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
49201f3f253Sdrh    A = X;
493d3ec02d3Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y;
49401f3f253Sdrh }
495348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
49685574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). {
497b1c685b0Sdanielk1977   A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
498b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
49901f3f253Sdrh }
50051522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
501fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP select(S) RP
502b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
503b1c685b0Sdanielk1977     A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U);
50422f70c32Sdrh   }
505fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP
506fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
5079b87d7b9Sdanielk1977     if( X==0 && Z.n==0 && N==0 && U==0 ){
508fbdc7f69Sdrh       A = F;
509fbdc7f69Sdrh     }else{
510fbdc7f69Sdrh       Select *pSubquery;
511fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
512fbdc7f69Sdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
513fbdc7f69Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U);
514fbdc7f69Sdrh     }
515fbdc7f69Sdrh   }
516348784efSdrh 
517b733d037Sdrh   // A seltablist_paren nonterminal represents anything in a FROM that
518b733d037Sdrh   // is contained inside parentheses.  This can be either a subquery or
519b733d037Sdrh   // a grouping of table and subqueries.
520b733d037Sdrh   //
521fbdc7f69Sdrh //  %type seltablist_paren {Select*}
522fbdc7f69Sdrh //  %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);}
523fbdc7f69Sdrh //  seltablist_paren(A) ::= select(S).      {A = S;}
524fbdc7f69Sdrh //  seltablist_paren(A) ::= seltablist(F).  {
525fbdc7f69Sdrh //     sqlite3SrcListShiftJoinType(F);
526fbdc7f69Sdrh //     A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
527fbdc7f69Sdrh //  }
528154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
529b733d037Sdrh 
530113088ecSdrh %type dbnm {Token}
531113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
532113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
533113088ecSdrh 
53474ad7fe9Sdrh %type fullname {SrcList*}
535633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
53617435752Sdrh fullname(A) ::= nm(X) dbnm(Y).  {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);}
53774ad7fe9Sdrh 
53801f3f253Sdrh %type joinop {int}
53901f3f253Sdrh %type joinop2 {int}
540fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
5414adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
5424adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
5435ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
5444adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
54501f3f253Sdrh 
54601f3f253Sdrh %type on_opt {Expr*}
547633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
548b7916a78Sdrh on_opt(N) ::= ON expr(E).   {N = E.pExpr;}
54901f3f253Sdrh on_opt(N) ::= .             {N = 0;}
55001f3f253Sdrh 
55185574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
55285574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
55385574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
55485574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
55585574e31Sdanielk1977 // in the token.
55685574e31Sdanielk1977 //
55785574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
558b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
55985574e31Sdanielk1977 // recognizes and interprets this as a special case.
56085574e31Sdanielk1977 //
56185574e31Sdanielk1977 %type indexed_opt {Token}
56285574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
56385574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
56485574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
56585574e31Sdanielk1977 
56601f3f253Sdrh %type using_opt {IdList*}
567633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
5680202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP.  {U = L;}
56901f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
57001f3f253Sdrh 
57101f3f253Sdrh 
572348784efSdrh %type orderby_opt {ExprList*}
573633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
574348784efSdrh %type sortlist {ExprList*}
575633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
576348784efSdrh %type sortitem {Expr*}
577633e6d57Sdrh %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);}
578348784efSdrh 
579348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
580348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
5818b4c40d8Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). {
582b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X,Y);
583b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
584348784efSdrh }
5858b4c40d8Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). {
586b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0,Y);
587d3ec02d3Sdrh   if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z;
588348784efSdrh }
589b7916a78Sdrh sortitem(A) ::= expr(X).   {A = X.pExpr;}
590348784efSdrh 
591348784efSdrh %type sortorder {int}
592348784efSdrh 
5938e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
5948e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
5958e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
596348784efSdrh 
5972282792aSdrh %type groupby_opt {ExprList*}
598633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
5992282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
6009245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
6012282792aSdrh 
6022282792aSdrh %type having_opt {Expr*}
603633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
6042282792aSdrh having_opt(A) ::= .                {A = 0;}
605b7916a78Sdrh having_opt(A) ::= HAVING expr(X).  {A = X.pExpr;}
6062282792aSdrh 
607ad3cab52Sdrh %type limit_opt {struct LimitVal}
60815926590Sdrh 
60915926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
61015926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
61115926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
61215926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
61315926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
61415926590Sdrh // except as a transient.  So there is never anything to destroy.
61515926590Sdrh //
61615926590Sdrh //%destructor limit_opt {
617633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pLimit);
618633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pOffset);
61915926590Sdrh //}
620a2dc3b1aSdanielk1977 limit_opt(A) ::= .                    {A.pLimit = 0; A.pOffset = 0;}
621b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X).       {A.pLimit = X.pExpr; A.pOffset = 0;}
622a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
623b7916a78Sdrh                                       {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;}
624a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
625b7916a78Sdrh                                       {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
6269bbca4c1Sdrh 
627382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
628382c0247Sdrh //
629273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
630931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
631931577f1Sdrh         orderby_opt(O) limit_opt(L). {
632b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
63349ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
6344281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6354281bd42Sshane }
6364281bd42Sshane %endif
637273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6384281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
6394281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6404281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6414281bd42Sshane }
6424281bd42Sshane %endif
643348784efSdrh 
644348784efSdrh %type where_opt {Expr*}
645633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
646348784efSdrh 
647348784efSdrh where_opt(A) ::= .                    {A = 0;}
648b7916a78Sdrh where_opt(A) ::= WHERE expr(X).       {A = X.pExpr;}
649348784efSdrh 
650382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
651382c0247Sdrh //
652273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6534281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L).  {
654b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
655b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
65649ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
6574281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6584281bd42Sshane }
6594281bd42Sshane %endif
660273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6614281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W).  {
6624281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6634281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
6644281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6654281bd42Sshane }
6664281bd42Sshane %endif
667348784efSdrh 
668f8db1bc0Sdrh %type setlist {ExprList*}
669633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
670f8db1bc0Sdrh 
671b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {
672b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, Z, Y.pExpr);
673b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
674b7916a78Sdrh }
675b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
676b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, 0, Y.pExpr);
677b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
678b7916a78Sdrh }
679348784efSdrh 
680382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
681382c0247Sdrh //
68274ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F)
683113088ecSdrh         VALUES LP itemlist(Y) RP.
68474ad7fe9Sdrh             {sqlite3Insert(pParse, X, Y, 0, F, R);}
68574ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
68674ad7fe9Sdrh             {sqlite3Insert(pParse, X, 0, S, F, R);}
687147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES.
688147d0cccSdrh             {sqlite3Insert(pParse, X, 0, 0, F, R);}
689348784efSdrh 
6905eff7cf0Sshane %type insert_cmd {u8}
691fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
692fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
693fa86c412Sdrh 
694348784efSdrh 
695348784efSdrh %type itemlist {ExprList*}
696633e6d57Sdrh %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);}
697348784efSdrh 
69817435752Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).
699b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
70017435752Sdrh itemlist(A) ::= expr(X).
701b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,0,X.pExpr);}
702348784efSdrh 
703967e8b73Sdrh %type inscollist_opt {IdList*}
704633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);}
705967e8b73Sdrh %type inscollist {IdList*}
706633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);}
707348784efSdrh 
708967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
709967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
71017435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y).
71117435752Sdrh     {A = sqlite3IdListAppend(pParse->db,X,&Y);}
71217435752Sdrh inscollist(A) ::= nm(Y).
71317435752Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y);}
714348784efSdrh 
715382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
716382c0247Sdrh //
717348784efSdrh 
718b7916a78Sdrh %type expr {ExprSpan}
719b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);}
720b7916a78Sdrh %type term {ExprSpan}
721b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);}
722b7916a78Sdrh 
723b7916a78Sdrh %include {
724b7916a78Sdrh   /* This is a utility routine used to set the ExprSpan.zStart and
725b7916a78Sdrh   ** ExprSpan.zEnd values of pOut so that the span covers the complete
726b7916a78Sdrh   ** range of text beginning with pStart and going to the end of pEnd.
727b7916a78Sdrh   */
728b7916a78Sdrh   static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
729b7916a78Sdrh     pOut->zStart = pStart->z;
730b7916a78Sdrh     pOut->zEnd = &pEnd->z[pEnd->n];
731b7916a78Sdrh   }
732b7916a78Sdrh 
733b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
734b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
735b7916a78Sdrh   ** that created the expression.
736b7916a78Sdrh   */
737b7916a78Sdrh   static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){
738b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue);
739b7916a78Sdrh     pOut->zStart = pValue->z;
740b7916a78Sdrh     pOut->zEnd = &pValue->z[pValue->n];
741b7916a78Sdrh   }
742b7916a78Sdrh }
743348784efSdrh 
7447977a17fSdanielk1977 expr(A) ::= term(X).             {A = X;}
745b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);}
746b7916a78Sdrh term(A) ::= NULL(X).             {spanExpr(&A, pParse, @X, &X);}
747b7916a78Sdrh expr(A) ::= id(X).               {spanExpr(&A, pParse, TK_ID, &X);}
748b7916a78Sdrh expr(A) ::= JOIN_KW(X).          {spanExpr(&A, pParse, TK_ID, &X);}
7495ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
75017435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
75117435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
752b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
753b7916a78Sdrh   spanSet(&A,&X,&Y);
754e1b6a5b8Sdrh }
755d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
75617435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
75717435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
75817435752Sdrh   Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z);
75917435752Sdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
760b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
761b7916a78Sdrh   spanSet(&A,&X,&Z);
762d24cc427Sdrh }
763b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X).  {spanExpr(&A, pParse, @X, &X);}
764b7916a78Sdrh term(A) ::= STRING(X).              {spanExpr(&A, pParse, @X, &X);}
765b7916a78Sdrh expr(A) ::= REGISTER(X).     {
766b7916a78Sdrh   /* When doing a nested parse, one can include terms in an expression
767b7916a78Sdrh   ** that look like this:   #1 #2 ...  These terms refer to registers
768b7916a78Sdrh   ** in the virtual machine.  #N is the N-th register. */
769b7916a78Sdrh   if( pParse->nested==0 ){
770b7916a78Sdrh     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X);
771b7916a78Sdrh     A.pExpr = 0;
772b7916a78Sdrh   }else{
773b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
774b7916a78Sdrh     if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
775b7916a78Sdrh   }
776b7916a78Sdrh   spanSet(&A, &X, &X);
777b7916a78Sdrh }
7787c972decSdrh expr(A) ::= VARIABLE(X).     {
779b7916a78Sdrh   spanExpr(&A, pParse, TK_VARIABLE, &X);
780b7916a78Sdrh   sqlite3ExprAssignVarNumber(pParse, A.pExpr);
781b7916a78Sdrh   spanSet(&A, &X, &X);
782895d7472Sdrh }
78339002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). {
7848342e49fSdrh   A.pExpr = sqlite3ExprSetCollByToken(pParse, E.pExpr, &C);
785b7916a78Sdrh   A.zStart = E.zStart;
786b7916a78Sdrh   A.zEnd = &C.z[C.n];
7878b4c40d8Sdrh }
788487e262fSdrh %ifndef SQLITE_OMIT_CAST
789487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
790b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T);
791b7916a78Sdrh   spanSet(&A,&X,&Y);
792487e262fSdrh }
793154d4b24Sdrh %endif  SQLITE_OMIT_CAST
794fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). {
795994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
796e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
7974e05c83bSdrh   }
798b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, Y, &X);
799b7916a78Sdrh   spanSet(&A,&X,&E);
800b7916a78Sdrh   if( D && A.pExpr ){
801b7916a78Sdrh     A.pExpr->flags |= EP_Distinct;
802fd357974Sdrh   }
803e1b6a5b8Sdrh }
804e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
805b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
806b7916a78Sdrh   spanSet(&A,&X,&E);
807e1b6a5b8Sdrh }
808b71090fdSdrh term(A) ::= CTIME_KW(OP). {
809b71090fdSdrh   /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are
810b71090fdSdrh   ** treated as functions that return constants */
811b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0,&OP);
812b7916a78Sdrh   if( A.pExpr ){
813b7916a78Sdrh     A.pExpr->op = TK_CONST_FUNC;
814b7916a78Sdrh   }
815b7916a78Sdrh   spanSet(&A, &OP, &OP);
816b7916a78Sdrh }
817b7916a78Sdrh 
818b7916a78Sdrh %include {
819b7916a78Sdrh   /* This routine constructs a binary expression node out of two ExprSpan
820b7916a78Sdrh   ** objects and uses the result to populate a new ExprSpan object.
821b7916a78Sdrh   */
822b7916a78Sdrh   static void spanBinaryExpr(
823b7916a78Sdrh     ExprSpan *pOut,     /* Write the result here */
824b7916a78Sdrh     Parse *pParse,      /* The parsing context.  Errors accumulate here */
825b7916a78Sdrh     int op,             /* The binary operation */
826b7916a78Sdrh     ExprSpan *pLeft,    /* The left operand */
827b7916a78Sdrh     ExprSpan *pRight    /* The right operand */
828b7916a78Sdrh   ){
829b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0);
830b7916a78Sdrh     pOut->zStart = pLeft->zStart;
831b7916a78Sdrh     pOut->zEnd = pRight->zEnd;
832417ec638Sdrh   }
833b71090fdSdrh }
834b7916a78Sdrh 
835b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y).    {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
836b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y).     {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
83717435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y).
838b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
839b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y).  {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
840fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
841b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
842b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).
843b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
84417435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y).
845b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
846b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
84774ad7fe9Sdrh %type likeop {struct LikeOp}
848b52076cdSdrh likeop(A) ::= LIKE_KW(X).     {A.eOperator = X; A.not = 0;}
849b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;}
85003bea70cSdrh likeop(A) ::= MATCH(X).       {A.eOperator = X; A.not = 0;}
85103bea70cSdrh likeop(A) ::= NOT MATCH(X).   {A.eOperator = X; A.not = 1;}
8521dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE_KW]  {
8538aa34ae0Sdrh   ExprList *pList;
854b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
855b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
856b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
857b7916a78Sdrh   if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
858b7916a78Sdrh   A.zStart = X.zStart;
859b7916a78Sdrh   A.zEnd = Y.zEnd;
860b7916a78Sdrh   if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
8610ac65892Sdrh }
8621dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
8631dca1458Sdrh   ExprList *pList;
8641dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
8651dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
8661dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,pList, E.pExpr);
8671dca1458Sdrh   A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
8681dca1458Sdrh   if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
8691dca1458Sdrh   A.zStart = X.zStart;
8701dca1458Sdrh   A.zEnd = E.zEnd;
8711dca1458Sdrh   if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
8721dca1458Sdrh }
8737c6303c0Sdanielk1977 
874b7916a78Sdrh %include {
875b7916a78Sdrh   /* Construct an expression node for a unary postfix operator
876b7916a78Sdrh   */
877b7916a78Sdrh   static void spanUnaryPostfix(
878b7916a78Sdrh     ExprSpan *pOut,        /* Write the new expression node here */
879b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
880b7916a78Sdrh     int op,                /* The operator */
881b7916a78Sdrh     ExprSpan *pOperand,    /* The operand */
882b7916a78Sdrh     Token *pPostOp         /* The operand token for setting the span */
883b7916a78Sdrh   ){
884b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
885b7916a78Sdrh     pOut->zStart = pOperand->zStart;
886b7916a78Sdrh     pOut->zEnd = &pPostOp->z[pPostOp->n];
887e1b6a5b8Sdrh   }
88833048c0bSdrh }
889b7916a78Sdrh 
890b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E).   {spanUnaryPostfix(&A,pParse,@E,&X,&E);}
891b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);}
8926a2fe093Sdrh 
8936a51741dSdrh %include {
8946a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
8956a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
8966a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
8976a51741dSdrh     sqlite3 *db = pParse->db;
8986a51741dSdrh     if( db->mallocFailed==0 && pY->op==TK_NULL ){
8995e17e8b7Sshaneh       pA->op = (u8)op;
9006a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
9016a51741dSdrh       pA->pRight = 0;
9026a51741dSdrh     }
9036a51741dSdrh   }
9046a51741dSdrh }
9056a51741dSdrh 
9066a2fe093Sdrh //    expr1 IS expr2
9076a2fe093Sdrh //    expr1 IS NOT expr2
9086a2fe093Sdrh //
9096a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
9106a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
9116a2fe093Sdrh //
9126a2fe093Sdrh expr(A) ::= expr(X) IS expr(Y).     {
9136a2fe093Sdrh   spanBinaryExpr(&A,pParse,TK_IS,&X,&Y);
9146a51741dSdrh   binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL);
9156a2fe093Sdrh }
9166a2fe093Sdrh expr(A) ::= expr(X) IS NOT expr(Y). {
9176a2fe093Sdrh   spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y);
9186a51741dSdrh   binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL);
9196a2fe093Sdrh }
920b7916a78Sdrh 
921b7916a78Sdrh %include {
922b7916a78Sdrh   /* Construct an expression node for a unary prefix operator
923b7916a78Sdrh   */
924b7916a78Sdrh   static void spanUnaryPrefix(
925b7916a78Sdrh     ExprSpan *pOut,        /* Write the new expression node here */
926b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
927b7916a78Sdrh     int op,                /* The operator */
928b7916a78Sdrh     ExprSpan *pOperand,    /* The operand */
929b7916a78Sdrh     Token *pPreOp         /* The operand token for setting the span */
930b7916a78Sdrh   ){
931b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
932b7916a78Sdrh     pOut->zStart = pPreOp->z;
933b7916a78Sdrh     pOut->zEnd = pOperand->zEnd;
93433048c0bSdrh   }
93581a20f21Sdrh }
936b7916a78Sdrh 
937b7916a78Sdrh 
938b7916a78Sdrh 
939b7916a78Sdrh expr(A) ::= NOT(B) expr(X).    {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
940b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
9417ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT]
942b7916a78Sdrh                                {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);}
9437ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT]
944b7916a78Sdrh                                {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);}
945b7916a78Sdrh 
9462e3a1f16Sdrh %type between_op {int}
9472e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
9482e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
9492e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
950b7916a78Sdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr);
951b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr);
952b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0);
953b7916a78Sdrh   if( A.pExpr ){
954b7916a78Sdrh     A.pExpr->x.pList = pList;
95553f733c7Sdrh   }else{
956633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
95753f733c7Sdrh   }
958b7916a78Sdrh   if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
959b7916a78Sdrh   A.zStart = W.zStart;
960b7916a78Sdrh   A.zEnd = Y.zEnd;
961fef5208cSdrh }
9623e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
9632e3a1f16Sdrh   %type in_op {int}
9642e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
9652e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
9662e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
967094430ebSdrh     if( Y==0 ){
968473c1bf2Sdan       /* Expressions of the form
969473c1bf2Sdan       **
970473c1bf2Sdan       **      expr1 IN ()
971473c1bf2Sdan       **      expr1 NOT IN ()
972473c1bf2Sdan       **
973473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
974473c1bf2Sdan       ** regardless of the value of expr1.
975473c1bf2Sdan       */
976094430ebSdrh       A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]);
977094430ebSdrh       sqlite3ExprDelete(pParse->db, X.pExpr);
978094430ebSdrh     }else{
979b7916a78Sdrh       A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
980b7916a78Sdrh       if( A.pExpr ){
981b7916a78Sdrh         A.pExpr->x.pList = Y;
982b7916a78Sdrh         sqlite3ExprSetHeight(pParse, A.pExpr);
983d5d56523Sdanielk1977       }else{
984633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
985d5d56523Sdanielk1977       }
986b7916a78Sdrh       if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
987094430ebSdrh     }
988b7916a78Sdrh     A.zStart = X.zStart;
989b7916a78Sdrh     A.zEnd = &E.z[E.n];
990fef5208cSdrh   }
99151522cd3Sdrh   expr(A) ::= LP(B) select(X) RP(E). {
992b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
993b7916a78Sdrh     if( A.pExpr ){
994b7916a78Sdrh       A.pExpr->x.pSelect = X;
995b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
996b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
99753f733c7Sdrh     }else{
998633e6d57Sdrh       sqlite3SelectDelete(pParse->db, X);
99953f733c7Sdrh     }
1000b7916a78Sdrh     A.zStart = B.z;
1001b7916a78Sdrh     A.zEnd = &E.z[E.n];
100251522cd3Sdrh   }
10032e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E).  [IN] {
1004b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1005b7916a78Sdrh     if( A.pExpr ){
1006b7916a78Sdrh       A.pExpr->x.pSelect = Y;
1007b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
1008b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
100953f733c7Sdrh     }else{
1010633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
101153f733c7Sdrh     }
1012b7916a78Sdrh     if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
1013b7916a78Sdrh     A.zStart = X.zStart;
1014b7916a78Sdrh     A.zEnd = &E.z[E.n];
1015fef5208cSdrh   }
101674ad7fe9Sdrh   expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
101717435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
1018b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1019b7916a78Sdrh     if( A.pExpr ){
1020b7916a78Sdrh       A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
1021b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
1022b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
102353f733c7Sdrh     }else{
1024633e6d57Sdrh       sqlite3SrcListDelete(pParse->db, pSrc);
102553f733c7Sdrh     }
1026b7916a78Sdrh     if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
1027b7916a78Sdrh     A.zStart = X.zStart;
1028b7916a78Sdrh     A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
102923b2db23Sdrh   }
103051522cd3Sdrh   expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
1031b7916a78Sdrh     Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
103251522cd3Sdrh     if( p ){
10336ab3a2ecSdanielk1977       p->x.pSelect = Y;
1034b7916a78Sdrh       ExprSetProperty(p, EP_xIsSelect);
1035b7916a78Sdrh       sqlite3ExprSetHeight(pParse, p);
103653f733c7Sdrh     }else{
1037633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
103851522cd3Sdrh     }
1039b7916a78Sdrh     A.zStart = B.z;
1040b7916a78Sdrh     A.zEnd = &E.z[E.n];
104151522cd3Sdrh   }
1042154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1043fef5208cSdrh 
104417a7f8ddSdrh /* CASE expressions */
104517a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
1046b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0);
1047b7916a78Sdrh   if( A.pExpr ){
1048b7916a78Sdrh     A.pExpr->x.pList = Y;
1049b7916a78Sdrh     sqlite3ExprSetHeight(pParse, A.pExpr);
105053f733c7Sdrh   }else{
1051633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
105253f733c7Sdrh   }
1053b7916a78Sdrh   A.zStart = C.z;
1054b7916a78Sdrh   A.zEnd = &E.z[E.n];
105517a7f8ddSdrh }
105617a7f8ddSdrh %type case_exprlist {ExprList*}
1057633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
105817a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
1059b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X, Y.pExpr);
1060b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
106117a7f8ddSdrh }
106217a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
1063b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0, Y.pExpr);
1064b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
106517a7f8ddSdrh }
106617a7f8ddSdrh %type case_else {Expr*}
1067633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
1068b7916a78Sdrh case_else(A) ::=  ELSE expr(X).         {A = X.pExpr;}
106917a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
107017a7f8ddSdrh %type case_operand {Expr*}
1071633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
1072b7916a78Sdrh case_operand(A) ::= expr(X).            {A = X.pExpr;}
107317a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1074348784efSdrh 
1075348784efSdrh %type exprlist {ExprList*}
1076633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
10779245c243Sdrh %type nexprlist {ExprList*}
1078633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1079348784efSdrh 
10809245c243Sdrh exprlist(A) ::= nexprlist(X).                {A = X;}
10819245c243Sdrh exprlist(A) ::= .                            {A = 0;}
108217435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y).
1083b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
108417435752Sdrh nexprlist(A) ::= expr(Y).
1085b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);}
10869245c243Sdrh 
1087cce7d176Sdrh 
1088382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1089382c0247Sdrh //
1090d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
109177e96d14Sdrh         ON nm(Y) LP idxlist(Z) RP(E). {
109217435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
109317435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
10944d91a701Sdrh                       &S, &E, SQLITE_SO_ASC, NE);
10959cfcf5d4Sdrh }
1096717e6402Sdrh 
1097717e6402Sdrh %type uniqueflag {int}
10989cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
10999cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1100348784efSdrh 
11010202b29eSdanielk1977 %type idxlist {ExprList*}
1102633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);}
11030202b29eSdanielk1977 %type idxlist_opt {ExprList*}
1104633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1105348784efSdrh 
1106c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
1107c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
1108200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z).  {
11090202b29eSdanielk1977   Expr *p = 0;
11100202b29eSdanielk1977   if( C.n>0 ){
1111b7916a78Sdrh     p = sqlite3Expr(pParse->db, TK_COLUMN, 0);
11128342e49fSdrh     sqlite3ExprSetCollByToken(pParse, p, &C);
11130202b29eSdanielk1977   }
1114b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X, p);
1115b7916a78Sdrh   sqlite3ExprListSetName(pParse,A,&Y,1);
1116b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
1117b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
11180202b29eSdanielk1977 }
1119200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). {
11200202b29eSdanielk1977   Expr *p = 0;
11210202b29eSdanielk1977   if( C.n>0 ){
112217435752Sdrh     p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
11238342e49fSdrh     sqlite3ExprSetCollByToken(pParse, p, &C);
11240202b29eSdanielk1977   }
1125b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0, p);
1126b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &Y, 1);
1127b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
1128b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
11290202b29eSdanielk1977 }
11300202b29eSdanielk1977 
1131a34001c9Sdrh %type collate {Token}
1132a34001c9Sdrh collate(C) ::= .                 {C.z = 0; C.n = 0;}
113339002505Sdanielk1977 collate(C) ::= COLLATE ids(X).   {C = X;}
1134a34001c9Sdrh 
1135348784efSdrh 
11368aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1137382c0247Sdrh //
11384d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1139982cef7eSdrh 
1140382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1141382c0247Sdrh //
1142154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1143fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
114474161705Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse);}
114574161705Sdrh cmd ::= VACUUM nm.             {sqlite3Vacuum(pParse);}
1146fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1147154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1148f57b14a6Sdrh 
1149382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1150382c0247Sdrh //
115113d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
115291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1153ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1154ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1155ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1156ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1157ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1158ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1159ada2ee0dSdrh 
1160a3eb4b44Sdrh nmnum(A) ::= plus_num(X).             {A = X;}
1161a3eb4b44Sdrh nmnum(A) ::= nm(X).                   {A = X;}
1162ada2ee0dSdrh nmnum(A) ::= ON(X).                   {A = X;}
1163ada2ee0dSdrh nmnum(A) ::= DELETE(X).               {A = X;}
11646da861beSdrh nmnum(A) ::= DEFAULT(X).              {A = X;}
1165154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1166f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
1167f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1168fd405314Sdrh number(A) ::= INTEGER|FLOAT(X).       {A = X;}
1169f57b14a6Sdrh plus_opt ::= PLUS.
1170f57b14a6Sdrh plus_opt ::= .
1171c3f9bad2Sdanielk1977 
1172c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1173f0f258b1Sdrh 
1174b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1175b7f9164eSdrh 
1176d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
11774b59ab5eSdrh   Token all;
11784b59ab5eSdrh   all.z = A.z;
1179b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
11804adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1181f0f258b1Sdrh }
1182f0f258b1Sdrh 
1183fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1184fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
118560218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
118660218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
11873df6b257Sdanielk1977   A = (Z.n==0?B:Z);
1188c3f9bad2Sdanielk1977 }
1189c3f9bad2Sdanielk1977 
1190c3f9bad2Sdanielk1977 %type trigger_time {int}
1191c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
1192c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
1193c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1194c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1195c3f9bad2Sdanielk1977 
1196ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1197633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1198fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP).       {A.a = @OP; A.b = 0;}
119974ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP).              {A.a = @OP; A.b = 0;}
1200c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}
1201c3f9bad2Sdanielk1977 
120260218d2aSdrh foreach_clause ::= .
120360218d2aSdrh foreach_clause ::= FOR EACH ROW.
1204c3f9bad2Sdanielk1977 
1205c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1206633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1207c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
1208b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; }
1209c3f9bad2Sdanielk1977 
1210c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1211633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
1212187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
121381238966Sdrh   assert( Y!=0 );
121481238966Sdrh   Y->pLast->pNext = X;
1215187e4c6aSdrh   Y->pLast = X;
1216187e4c6aSdrh   A = Y;
1217a69d9168Sdrh }
121881238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. {
121981238966Sdrh   assert( X!=0 );
122081238966Sdrh   X->pLast = X;
122181238966Sdrh   A = X;
122281238966Sdrh }
1223c3f9bad2Sdanielk1977 
1224b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1225b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1226b1819a0bSdrh // the same database as the table that the trigger fires on.
1227b1819a0bSdrh //
1228b1819a0bSdrh %type trnm {Token}
1229b1819a0bSdrh trnm(A) ::= nm(X).   {A = X;}
1230b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1231b1819a0bSdrh   A = X;
1232b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1233b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1234b1819a0bSdrh         "statements within triggers");
1235b1819a0bSdrh }
1236b1819a0bSdrh 
1237b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1238b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1239b1819a0bSdrh // since it is an exception to the default grammar rules.
1240b1819a0bSdrh //
1241b1819a0bSdrh tridxby ::= .
1242b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1243b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1244b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1245b1819a0bSdrh         "within triggers");
1246b1819a0bSdrh }
1247b1819a0bSdrh tridxby ::= NOT INDEXED. {
1248b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1249b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1250b1819a0bSdrh         "within triggers");
1251b1819a0bSdrh }
1252b1819a0bSdrh 
1253b1819a0bSdrh 
1254b1819a0bSdrh 
1255c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1256633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1257c3f9bad2Sdanielk1977 // UPDATE
1258b1819a0bSdrh trigger_cmd(A) ::=
1259b1819a0bSdrh    UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z).
126017435752Sdrh    { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); }
1261c3f9bad2Sdanielk1977 
1262c3f9bad2Sdanielk1977 // INSERT
1263b1819a0bSdrh trigger_cmd(A) ::=
1264b1819a0bSdrh    insert_cmd(R) INTO trnm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
126517435752Sdrh    {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);}
1266c3f9bad2Sdanielk1977 
1267b1819a0bSdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S).
126817435752Sdrh                {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);}
1269c3f9bad2Sdanielk1977 
1270c3f9bad2Sdanielk1977 // DELETE
1271b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y).
127217435752Sdrh                {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
1273c3f9bad2Sdanielk1977 
1274c3f9bad2Sdanielk1977 // SELECT
127517435752Sdrh trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(pParse->db, X); }
1276c3f9bad2Sdanielk1977 
12776f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
12784b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
1279b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
1280b7916a78Sdrh   if( A.pExpr ){
1281b7916a78Sdrh     A.pExpr->affinity = OE_Ignore;
12824b59ab5eSdrh   }
1283b7916a78Sdrh   A.zStart = X.z;
1284b7916a78Sdrh   A.zEnd = &Y.z[Y.n];
12858aa34ae0Sdrh }
128674ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y).  {
1287b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z);
1288b7916a78Sdrh   if( A.pExpr ) {
1289b7916a78Sdrh     A.pExpr->affinity = (char)T;
12904b59ab5eSdrh   }
1291b7916a78Sdrh   A.zStart = X.z;
1292b7916a78Sdrh   A.zEnd = &Y.z[Y.n];
12938aa34ae0Sdrh }
1294154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1295b7f9164eSdrh 
129674ad7fe9Sdrh %type raisetype {int}
129774ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
129874ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
129974ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
130074ad7fe9Sdrh 
13016f34903eSdanielk1977 
1302c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1303b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1304fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1305fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1306c3f9bad2Sdanielk1977 }
1307154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1308113088ecSdrh 
1309113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1310fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1311f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
1312b7916a78Sdrh   sqlite3Attach(pParse, F.pExpr, D.pExpr, K);
13131c2d8414Sdrh }
1314fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
1315b7916a78Sdrh   sqlite3Detach(pParse, D.pExpr);
1316fdbcdee5Sdrh }
1317fdbcdee5Sdrh 
1318f744bb56Sdanielk1977 %type key_opt {Expr*}
1319633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1320f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
1321b7916a78Sdrh key_opt(A) ::= KEY expr(X).          { A = X.pExpr; }
1322113088ecSdrh 
1323113088ecSdrh database_kw_opt ::= DATABASE.
1324113088ecSdrh database_kw_opt ::= .
1325fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
13264343fea2Sdrh 
13274343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
13284343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
13294343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
13304343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1331154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
13329fd2a9a0Sdanielk1977 
13339f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
13349f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
13359f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
13369f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
13379f18e8a0Sdrh %endif
13389f18e8a0Sdrh 
13399fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
13409fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
13419fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
13429fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
13439fd2a9a0Sdanielk1977 }
134419a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). {
134519a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
134619a8e7e8Sdanielk1977 }
134719a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
1348d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
134919a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
135019a8e7e8Sdanielk1977 }
135119a8e7e8Sdanielk1977 kwcolumn_opt ::= .
135219a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1353154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1354e09daa90Sdrh 
1355e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1356e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1357b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1358b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1359d9da78a2Sdrh create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). {
1360b9bb7c18Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z);
1361b9bb7c18Sdrh }
1362e09daa90Sdrh vtabarglist ::= vtabarg.
1363e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1364b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1365b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1366b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1367b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1368b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1369b9bb7c18Sdrh anylist ::= .
1370aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1371aaac8b4eSdrh anylist ::= anylist ANY.
1372154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
1373