xref: /sqlite-3.40.0/src/parse.y (revision 13d32d19)
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 **
17*13d32d19Sdrh ** @(#) $Id: parse.y,v 1.280 2009/06/12 03:47:37 drh Exp $
18348784efSdrh */
19487e262fSdrh 
20487e262fSdrh // All token codes are small integers with #defines that begin with "TK_"
21348784efSdrh %token_prefix TK_
22487e262fSdrh 
23487e262fSdrh // The type of the data attached to each token is Token.  This is also the
24487e262fSdrh // default type for non-terminals.
25487e262fSdrh //
26348784efSdrh %token_type {Token}
27f57b14a6Sdrh %default_type {Token}
28487e262fSdrh 
29487e262fSdrh // The generated parser function takes a 4th argument as follows:
30348784efSdrh %extra_argument {Parse *pParse}
31487e262fSdrh 
32487e262fSdrh // This code runs whenever there is a syntax error
33487e262fSdrh //
34348784efSdrh %syntax_error {
35128255fcSdrh   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
3655176259Sdrh   assert( TOKEN.z[0] );  /* The tokenizer always gives us a token */
374adee20fSdanielk1977   sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
3886dac2b6Sdrh   pParse->parseError = 1;
39b86ccfb2Sdrh }
408fc3345fSdrh %stack_overflow {
41128255fcSdrh   UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */
428fc3345fSdrh   sqlite3ErrorMsg(pParse, "parser stack overflow");
4386dac2b6Sdrh   pParse->parseError = 1;
448fc3345fSdrh }
45487e262fSdrh 
46487e262fSdrh // The name of the generated procedure that implements the parser
47487e262fSdrh // is as follows:
484adee20fSdanielk1977 %name sqlite3Parser
49487e262fSdrh 
50487e262fSdrh // The following text is included near the beginning of the C source
51487e262fSdrh // code file that implements the parser.
52487e262fSdrh //
53348784efSdrh %include {
54348784efSdrh #include "sqliteInt.h"
559bbca4c1Sdrh 
569bbca4c1Sdrh /*
57d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down
58d3ec02d3Sdrh ** automaton.
59d3ec02d3Sdrh */
60d3ec02d3Sdrh #define YYNOERRORRECOVERY 1
61d3ec02d3Sdrh 
62d3ec02d3Sdrh /*
63ad3cab52Sdrh ** An instance of this structure holds information about the
64ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
659bbca4c1Sdrh */
66ad3cab52Sdrh struct LimitVal {
67a2dc3b1aSdanielk1977   Expr *pLimit;    /* The LIMIT expression.  NULL if there is no limit */
68a2dc3b1aSdanielk1977   Expr *pOffset;   /* The OFFSET expression.  NULL if there is none */
69ad3cab52Sdrh };
70c3f9bad2Sdanielk1977 
71c3f9bad2Sdanielk1977 /*
722e3a1f16Sdrh ** An instance of this structure is used to store the LIKE,
732e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators.
742e3a1f16Sdrh */
752e3a1f16Sdrh struct LikeOp {
76b52076cdSdrh   Token eOperator;  /* "like" or "glob" or "regexp" */
772e3a1f16Sdrh   int not;         /* True if the NOT keyword is present */
782e3a1f16Sdrh };
792e3a1f16Sdrh 
802e3a1f16Sdrh /*
81ad3cab52Sdrh ** An instance of the following structure describes the event of a
82ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
83ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
84ad3cab52Sdrh **
85ad3cab52Sdrh **      UPDATE ON (a,b,c)
86ad3cab52Sdrh **
87ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
88c3f9bad2Sdanielk1977 */
89ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
90caec2f12Sdrh 
9125d6543dSdrh /*
9225d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type.
9325d6543dSdrh */
9425d6543dSdrh struct AttachKey { int type;  Token key; };
9525d6543dSdrh 
96caec2f12Sdrh } // end %include
97348784efSdrh 
98826fb5a3Sdrh // Input is a single SQL command
99c4a3c779Sdrh input ::= cmdlist.
100094b2bbfSdrh cmdlist ::= cmdlist ecmd.
101826fb5a3Sdrh cmdlist ::= ecmd.
102b7f9164eSdrh ecmd ::= SEMI.
103b7f9164eSdrh ecmd ::= explain cmdx SEMI.
1044adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
105b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
106b7f9164eSdrh explain ::= EXPLAIN.              { sqlite3BeginParse(pParse, 1); }
107ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN.   { sqlite3BeginParse(pParse, 2); }
108154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
109200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
110348784efSdrh 
111382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
112c4a3c779Sdrh //
113fa86c412Sdrh 
114684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
115c4a3c779Sdrh trans_opt ::= .
116c4a3c779Sdrh trans_opt ::= TRANSACTION.
1175ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
118684917c2Sdrh %type transtype {int}
119684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
120684917c2Sdrh transtype(A) ::= DEFERRED(X).  {A = @X;}
121684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;}
122684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;}
1234adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
1244adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
1254adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
126c4a3c779Sdrh 
127fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
128fd7f0452Sdanielk1977 savepoint_opt ::= .
129fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
130fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
131fd7f0452Sdanielk1977 }
132fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
133fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
134fd7f0452Sdanielk1977 }
135fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
136fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
137fd7f0452Sdanielk1977 }
138fd7f0452Sdanielk1977 
139382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
140348784efSdrh //
141348784efSdrh cmd ::= create_table create_table_args.
142d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
143f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
144969fa7c1Sdrh }
145d9da78a2Sdrh createkw(A) ::= CREATE(X).  {
146d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
147d9da78a2Sdrh   A = X;
148d9da78a2Sdrh }
149faa59554Sdrh %type ifnotexists {int}
150faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
151faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
152f57b3399Sdrh %type temp {int}
15353c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
154d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
155154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
156d24cc427Sdrh temp(A) ::= .      {A = 0;}
15719a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). {
15819a8e7e8Sdanielk1977   sqlite3EndTable(pParse,&X,&Y,0);
159969fa7c1Sdrh }
160969fa7c1Sdrh create_table_args ::= AS select(S). {
16119a8e7e8Sdanielk1977   sqlite3EndTable(pParse,0,0,S);
162633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
163969fa7c1Sdrh }
164348784efSdrh columnlist ::= columnlist COMMA column.
165348784efSdrh columnlist ::= column.
166348784efSdrh 
167487e262fSdrh // A "column" is a complete description of a single column in a
168487e262fSdrh // CREATE TABLE statement.  This includes the column name, its
169487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES,
170487e262fSdrh // NOT NULL and so forth.
171348784efSdrh //
17219a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. {
17319a8e7e8Sdanielk1977   A.z = X.z;
174b27b7f5dSdrh   A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n;
17519a8e7e8Sdanielk1977 }
17619a8e7e8Sdanielk1977 columnid(A) ::= nm(X). {
17719a8e7e8Sdanielk1977   sqlite3AddColumn(pParse,&X);
17819a8e7e8Sdanielk1977   A = X;
17919a8e7e8Sdanielk1977 }
18019a8e7e8Sdanielk1977 
181c4a3c779Sdrh 
182c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
183c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
184c4a3c779Sdrh //
185982cef7eSdrh %type id {Token}
186f18543caSdrh id(A) ::= ID(X).         {A = X;}
187296a483cSdrh id(A) ::= INDEXED(X).    {A = X;}
1880bd1f4eaSdrh 
18934e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
19034e33bb8Sdrh // fallback to ID if they will not parse as their original value.
19134e33bb8Sdrh // This obviates the need for the "id" nonterminal.
19234e33bb8Sdrh //
1930bd1f4eaSdrh %fallback ID
194db15bcd5Sdrh   ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW CONFLICT
195684917c2Sdrh   DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
196ca5557f9Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN
197db15bcd5Sdrh   QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK
19878c2e6d8Sdanielk1977   SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL
199b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
200b7f9164eSdrh   EXCEPT INTERSECT UNION
201154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
202a073384fSdrh   REINDEX RENAME CTIME_KW IF
203b7f9164eSdrh   .
204e09daa90Sdrh %wildcard ANY.
205c4a3c779Sdrh 
2062d3917daSdrh // Define operator precedence early so that this is the first occurance
2072d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2082d3917daSdrh // causes them to be assigned integer values that are close together,
2092d3917daSdrh // which keeps parser tables smaller.
2102d3917daSdrh //
211f2bc013cSdrh // The token values assigned to these symbols is determined by the order
212f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
213f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
214f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
215f2bc013cSdrh // constraint.
216f2bc013cSdrh //
2172d3917daSdrh %left OR.
2182d3917daSdrh %left AND.
2192d3917daSdrh %right NOT.
22003bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2219a43267bSdrh %left GT LE LT GE.
2227c6303c0Sdanielk1977 %right ESCAPE.
2232d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2242d3917daSdrh %left PLUS MINUS.
2252d3917daSdrh %left STAR SLASH REM.
226a34001c9Sdrh %left CONCAT.
227a34001c9Sdrh %left COLLATE.
2282d3917daSdrh %right UMINUS UPLUS BITNOT.
2292d3917daSdrh 
230c4a3c779Sdrh // And "ids" is an identifer-or-string.
231c4a3c779Sdrh //
232c4a3c779Sdrh %type ids {Token}
233fd405314Sdrh ids(A) ::= ID|STRING(X).   {A = X;}
234c4a3c779Sdrh 
2355ad1a6c8Sdrh // The name of a column or table can be any of the following:
2365ad1a6c8Sdrh //
2375ad1a6c8Sdrh %type nm {Token}
238296a483cSdrh nm(A) ::= id(X).         {A = X;}
2395ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
2405ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
2415ad1a6c8Sdrh 
242487e262fSdrh // A typetoken is really one or more tokens that form a type name such
243487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
244487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
245487e262fSdrh //
246487e262fSdrh %type typetoken {Token}
247382c0247Sdrh type ::= .
248487e262fSdrh type ::= typetoken(X).                   {sqlite3AddColumnType(pParse,&X);}
249487e262fSdrh typetoken(A) ::= typename(X).   {A = X;}
250487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). {
251487e262fSdrh   A.z = X.z;
252b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
253487e262fSdrh }
254487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). {
255487e262fSdrh   A.z = X.z;
256b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
257487e262fSdrh }
258382c0247Sdrh %type typename {Token}
259382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
260b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);}
26160218d2aSdrh signed ::= plus_num.
26260218d2aSdrh signed ::= minus_num.
263487e262fSdrh 
264487e262fSdrh // "carglist" is a list of additional constraints that come after the
265487e262fSdrh // column name and column type in a CREATE TABLE statement.
266487e262fSdrh //
267348784efSdrh carglist ::= carglist carg.
268348784efSdrh carglist ::= .
2695ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
270348784efSdrh carg ::= ccons.
271b7916a78Sdrh ccons ::= DEFAULT term(X).            {sqlite3AddDefaultValue(pParse,&X);}
272b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP.      {sqlite3AddDefaultValue(pParse,&X);}
273b7916a78Sdrh ccons ::= DEFAULT PLUS term(X).       {sqlite3AddDefaultValue(pParse,&X);}
274f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X).      {
275b7916a78Sdrh   ExprSpan v;
276b7916a78Sdrh   v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0);
277b7916a78Sdrh   v.zStart = A.z;
278b7916a78Sdrh   v.zEnd = X.zEnd;
279b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2807977a17fSdanielk1977 }
2812b7acc35Sdrh ccons ::= DEFAULT id(X).              {
282b7916a78Sdrh   ExprSpan v;
283b7916a78Sdrh   spanExpr(&v, pParse, TK_STRING, &X);
284b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2857977a17fSdanielk1977 }
286348784efSdrh 
287382c0247Sdrh // In addition to the type name, we also care about the primary key and
288382c0247Sdrh // UNIQUE constraints.
289348784efSdrh //
2900d316a40Sdrh ccons ::= NULL onconf.
2914adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
292fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
293fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
2944d91a701Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);}
295b7916a78Sdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X.pExpr);}
296c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
2974adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
2984adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
29939002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
30004738cb9Sdrh 
301205f48e6Sdrh // The optional AUTOINCREMENT keyword
302205f48e6Sdrh %type autoinc {int}
303205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3042958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
305205f48e6Sdrh 
306c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
307c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
308c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
309c2eef3b3Sdrh // check fails.
31004738cb9Sdrh //
311c2eef3b3Sdrh %type refargs {int}
312c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
31350af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; }
314c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
315c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
316c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
317c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
318c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
319c2eef3b3Sdrh %type refact {int}
320c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
321c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
322c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
323c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
324c2eef3b3Sdrh %type defer_subclause {int}
325c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
326c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
327c2eef3b3Sdrh %type init_deferred_pred_opt {int}
328c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
329c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
330c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
331348784efSdrh 
332348784efSdrh // For the time being, the only constraint we care about is the primary
333382c0247Sdrh // key and UNIQUE.  Both create indices.
334348784efSdrh //
33519a8e7e8Sdanielk1977 conslist_opt(A) ::= .                   {A.n = 0; A.z = 0;}
33619a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist.  {A = X;}
337348784efSdrh conslist ::= conslist COMMA tcons.
338a2e1bb5aSdrh conslist ::= conslist tcons.
339348784efSdrh conslist ::= tcons.
3405ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
341f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R).
342fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
3439cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
3444d91a701Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);}
345b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
346b7916a78Sdrh                                  {sqlite3AddCheckConstraint(pParse,E.pExpr);}
347c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
348c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3494adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3504adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
351c2eef3b3Sdrh }
352c2eef3b3Sdrh %type defer_subclause_opt {int}
353c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
354c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
3559cfcf5d4Sdrh 
3569cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3579cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3589cfcf5d4Sdrh //
3599cfcf5d4Sdrh %type onconf {int}
3601c92853dSdrh %type orconf {int}
3611c92853dSdrh %type resolvetype {int}
3621c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
3631c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
3641c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
3651c92853dSdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
36674ad7fe9Sdrh resolvetype(A) ::= raisetype(X).             {A = X;}
3671c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
3681c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
369348784efSdrh 
370382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
371348784efSdrh //
372a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
373a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
374a8858103Sdanielk1977 }
375a073384fSdrh %type ifexists {int}
376a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
377a073384fSdrh ifexists(A) ::= .            {A = 0;}
378348784efSdrh 
379a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
380a76b5dfcSdrh //
381b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
382d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). {
383fdd48a76Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E);
384a76b5dfcSdrh }
385a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
386a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
387a76b5dfcSdrh }
388154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
389a76b5dfcSdrh 
390382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
391348784efSdrh //
3929bb61fe7Sdrh cmd ::= select(X).  {
3937d10d5a6Sdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0};
3947d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
395633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
3969bb61fe7Sdrh }
397efb7251dSdrh 
3989bb61fe7Sdrh %type select {Select*}
399633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
40082c3d636Sdrh %type oneselect {Select*}
401633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4029bb61fe7Sdrh 
40382c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
404b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
4050a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
406daffd0e5Sdrh   if( Z ){
407b27b7f5dSdrh     Z->op = (u8)Y;
40882c3d636Sdrh     Z->pPrior = X;
40943b78826Sdrh   }else{
410633e6d57Sdrh     sqlite3SelectDelete(pParse->db, X);
411daffd0e5Sdrh   }
41282c3d636Sdrh   A = Z;
41382c3d636Sdrh }
4140a36c57eSdrh %type multiselect_op {int}
41574ad7fe9Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP;}
4160a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
417fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP;}
418154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
41982c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
4209bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
42117435752Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
4229bb61fe7Sdrh }
4239bb61fe7Sdrh 
4249bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
4259bb61fe7Sdrh // present and false (0) if it is not.
4269bb61fe7Sdrh //
427efb7251dSdrh %type distinct {int}
428efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
429fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
430efb7251dSdrh distinct(A) ::= .           {A = 0;}
431348784efSdrh 
4329bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
4337c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
4347c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
4357c917d19Sdrh // opcode of TK_ALL.
4369bb61fe7Sdrh //
437348784efSdrh %type selcollist {ExprList*}
438633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
439348784efSdrh %type sclp {ExprList*}
440633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
441348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
442348784efSdrh sclp(A) ::= .                                {A = 0;}
44301f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
444b7916a78Sdrh    A = sqlite3ExprListAppend(pParse, P, X.pExpr);
445b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
446b7916a78Sdrh    sqlite3ExprListSetSpan(pParse,A,&X);
44701f3f253Sdrh }
4487c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
449b7916a78Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0);
450b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, P, p);
4517c917d19Sdrh }
452e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). {
453e54a62adSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y);
45417435752Sdrh   Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
45517435752Sdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
456b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,P, pDot);
45754473229Sdrh }
45801f3f253Sdrh 
45901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
46001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
46101f3f253Sdrh //
46201f3f253Sdrh %type as {Token}
4635ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
4645ad1a6c8Sdrh as(X) ::= ids(Y).      {X = Y;}
46501f3f253Sdrh as(X) ::= .            {X.n = 0;}
4669bb61fe7Sdrh 
467348784efSdrh 
468ad3cab52Sdrh %type seltablist {SrcList*}
469633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
470ad3cab52Sdrh %type stl_prefix {SrcList*}
471633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
472ad3cab52Sdrh %type from {SrcList*}
473633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
474348784efSdrh 
47501f3f253Sdrh // A complete FROM clause.
47601f3f253Sdrh //
47717435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
47861dfc31dSdrh from(A) ::= FROM seltablist(X). {
47961dfc31dSdrh   A = X;
48061dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
48161dfc31dSdrh }
48201f3f253Sdrh 
48301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
48401f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
48501f3f253Sdrh //
48601f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
48701f3f253Sdrh    A = X;
488d3ec02d3Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y;
48901f3f253Sdrh }
490348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
49185574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). {
492b1c685b0Sdanielk1977   A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
493b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
49401f3f253Sdrh }
49551522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
496fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP select(S) RP
497b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
498b1c685b0Sdanielk1977     A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U);
49922f70c32Sdrh   }
500fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP
501fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
502*13d32d19Sdrh     if( X==0 ){
503*13d32d19Sdrh       sqlite3ExprDelete(pParse->db, N);
504*13d32d19Sdrh       sqlite3IdListDelete(pParse->db, U);
505fbdc7f69Sdrh       A = F;
506fbdc7f69Sdrh     }else{
507fbdc7f69Sdrh       Select *pSubquery;
508fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
509fbdc7f69Sdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
510fbdc7f69Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U);
511fbdc7f69Sdrh     }
512fbdc7f69Sdrh   }
513348784efSdrh 
514b733d037Sdrh   // A seltablist_paren nonterminal represents anything in a FROM that
515b733d037Sdrh   // is contained inside parentheses.  This can be either a subquery or
516b733d037Sdrh   // a grouping of table and subqueries.
517b733d037Sdrh   //
518fbdc7f69Sdrh //  %type seltablist_paren {Select*}
519fbdc7f69Sdrh //  %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);}
520fbdc7f69Sdrh //  seltablist_paren(A) ::= select(S).      {A = S;}
521fbdc7f69Sdrh //  seltablist_paren(A) ::= seltablist(F).  {
522fbdc7f69Sdrh //     sqlite3SrcListShiftJoinType(F);
523fbdc7f69Sdrh //     A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
524fbdc7f69Sdrh //  }
525154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
526b733d037Sdrh 
527113088ecSdrh %type dbnm {Token}
528113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
529113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
530113088ecSdrh 
53174ad7fe9Sdrh %type fullname {SrcList*}
532633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
53317435752Sdrh fullname(A) ::= nm(X) dbnm(Y).  {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);}
53474ad7fe9Sdrh 
53501f3f253Sdrh %type joinop {int}
53601f3f253Sdrh %type joinop2 {int}
537fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
5384adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
5394adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
5405ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
5414adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
54201f3f253Sdrh 
54301f3f253Sdrh %type on_opt {Expr*}
544633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
545b7916a78Sdrh on_opt(N) ::= ON expr(E).   {N = E.pExpr;}
54601f3f253Sdrh on_opt(N) ::= .             {N = 0;}
54701f3f253Sdrh 
54885574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
54985574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
55085574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
55185574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
55285574e31Sdanielk1977 // in the token.
55385574e31Sdanielk1977 //
55485574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
555b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
55685574e31Sdanielk1977 // recognizes and interprets this as a special case.
55785574e31Sdanielk1977 //
55885574e31Sdanielk1977 %type indexed_opt {Token}
55985574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
56085574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
56185574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
56285574e31Sdanielk1977 
56301f3f253Sdrh %type using_opt {IdList*}
564633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
5650202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP.  {U = L;}
56601f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
56701f3f253Sdrh 
56801f3f253Sdrh 
569348784efSdrh %type orderby_opt {ExprList*}
570633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
571348784efSdrh %type sortlist {ExprList*}
572633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
573348784efSdrh %type sortitem {Expr*}
574633e6d57Sdrh %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);}
575348784efSdrh 
576348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
577348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
5788b4c40d8Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). {
579b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X,Y);
580b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
581348784efSdrh }
5828b4c40d8Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). {
583b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0,Y);
584d3ec02d3Sdrh   if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z;
585348784efSdrh }
586b7916a78Sdrh sortitem(A) ::= expr(X).   {A = X.pExpr;}
587348784efSdrh 
588348784efSdrh %type sortorder {int}
589348784efSdrh 
5908e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
5918e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
5928e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
593348784efSdrh 
5942282792aSdrh %type groupby_opt {ExprList*}
595633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
5962282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
5979245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
5982282792aSdrh 
5992282792aSdrh %type having_opt {Expr*}
600633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
6012282792aSdrh having_opt(A) ::= .                {A = 0;}
602b7916a78Sdrh having_opt(A) ::= HAVING expr(X).  {A = X.pExpr;}
6032282792aSdrh 
604ad3cab52Sdrh %type limit_opt {struct LimitVal}
60515926590Sdrh 
60615926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
60715926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
60815926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
60915926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
61015926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
61115926590Sdrh // except as a transient.  So there is never anything to destroy.
61215926590Sdrh //
61315926590Sdrh //%destructor limit_opt {
614633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pLimit);
615633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pOffset);
61615926590Sdrh //}
617a2dc3b1aSdanielk1977 limit_opt(A) ::= .                    {A.pLimit = 0; A.pOffset = 0;}
618b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X).       {A.pLimit = X.pExpr; A.pOffset = 0;}
619a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
620b7916a78Sdrh                                       {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;}
621a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
622b7916a78Sdrh                                       {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
6239bbca4c1Sdrh 
624382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
625382c0247Sdrh //
626273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
627931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
628931577f1Sdrh         orderby_opt(O) limit_opt(L). {
629b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
63049ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
6314281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6324281bd42Sshane }
6334281bd42Sshane %endif
634273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6354281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
6364281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6374281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6384281bd42Sshane }
6394281bd42Sshane %endif
640348784efSdrh 
641348784efSdrh %type where_opt {Expr*}
642633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
643348784efSdrh 
644348784efSdrh where_opt(A) ::= .                    {A = 0;}
645b7916a78Sdrh where_opt(A) ::= WHERE expr(X).       {A = X.pExpr;}
646348784efSdrh 
647382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
648382c0247Sdrh //
649273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6504281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L).  {
651b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
652b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
65349ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
6544281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6554281bd42Sshane }
6564281bd42Sshane %endif
657273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6584281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W).  {
6594281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6604281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
6614281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6624281bd42Sshane }
6634281bd42Sshane %endif
664348784efSdrh 
665f8db1bc0Sdrh %type setlist {ExprList*}
666633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
667f8db1bc0Sdrh 
668b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {
669b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, Z, Y.pExpr);
670b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
671b7916a78Sdrh }
672b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
673b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, 0, Y.pExpr);
674b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
675b7916a78Sdrh }
676348784efSdrh 
677382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
678382c0247Sdrh //
67974ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F)
680113088ecSdrh         VALUES LP itemlist(Y) RP.
68174ad7fe9Sdrh             {sqlite3Insert(pParse, X, Y, 0, F, R);}
68274ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
68374ad7fe9Sdrh             {sqlite3Insert(pParse, X, 0, S, F, R);}
684147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES.
685147d0cccSdrh             {sqlite3Insert(pParse, X, 0, 0, F, R);}
686348784efSdrh 
687fa86c412Sdrh %type insert_cmd {int}
688fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
689fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
690fa86c412Sdrh 
691348784efSdrh 
692348784efSdrh %type itemlist {ExprList*}
693633e6d57Sdrh %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);}
694348784efSdrh 
69517435752Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).
696b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
69717435752Sdrh itemlist(A) ::= expr(X).
698b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,0,X.pExpr);}
699348784efSdrh 
700967e8b73Sdrh %type inscollist_opt {IdList*}
701633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);}
702967e8b73Sdrh %type inscollist {IdList*}
703633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);}
704348784efSdrh 
705967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
706967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
70717435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y).
70817435752Sdrh     {A = sqlite3IdListAppend(pParse->db,X,&Y);}
70917435752Sdrh inscollist(A) ::= nm(Y).
71017435752Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y);}
711348784efSdrh 
712382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
713382c0247Sdrh //
714348784efSdrh 
715b7916a78Sdrh %type expr {ExprSpan}
716b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);}
717b7916a78Sdrh %type term {ExprSpan}
718b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);}
719b7916a78Sdrh 
720b7916a78Sdrh %include {
721b7916a78Sdrh   /* This is a utility routine used to set the ExprSpan.zStart and
722b7916a78Sdrh   ** ExprSpan.zEnd values of pOut so that the span covers the complete
723b7916a78Sdrh   ** range of text beginning with pStart and going to the end of pEnd.
724b7916a78Sdrh   */
725b7916a78Sdrh   static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
726b7916a78Sdrh     pOut->zStart = pStart->z;
727b7916a78Sdrh     pOut->zEnd = &pEnd->z[pEnd->n];
728b7916a78Sdrh   }
729b7916a78Sdrh 
730b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
731b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
732b7916a78Sdrh   ** that created the expression.
733b7916a78Sdrh   */
734b7916a78Sdrh   static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){
735b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue);
736b7916a78Sdrh     pOut->zStart = pValue->z;
737b7916a78Sdrh     pOut->zEnd = &pValue->z[pValue->n];
738b7916a78Sdrh   }
739b7916a78Sdrh }
740348784efSdrh 
7417977a17fSdanielk1977 expr(A) ::= term(X).             {A = X;}
742b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);}
743b7916a78Sdrh term(A) ::= NULL(X).             {spanExpr(&A, pParse, @X, &X);}
744b7916a78Sdrh expr(A) ::= id(X).               {spanExpr(&A, pParse, TK_ID, &X);}
745b7916a78Sdrh expr(A) ::= JOIN_KW(X).          {spanExpr(&A, pParse, TK_ID, &X);}
7465ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
74717435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
74817435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
749b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
750b7916a78Sdrh   spanSet(&A,&X,&Y);
751e1b6a5b8Sdrh }
752d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
75317435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
75417435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
75517435752Sdrh   Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z);
75617435752Sdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
757b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
758b7916a78Sdrh   spanSet(&A,&X,&Z);
759d24cc427Sdrh }
760b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X).  {spanExpr(&A, pParse, @X, &X);}
761b7916a78Sdrh term(A) ::= STRING(X).              {spanExpr(&A, pParse, @X, &X);}
762b7916a78Sdrh expr(A) ::= REGISTER(X).     {
763b7916a78Sdrh   /* When doing a nested parse, one can include terms in an expression
764b7916a78Sdrh   ** that look like this:   #1 #2 ...  These terms refer to registers
765b7916a78Sdrh   ** in the virtual machine.  #N is the N-th register. */
766b7916a78Sdrh   if( pParse->nested==0 ){
767b7916a78Sdrh     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X);
768b7916a78Sdrh     A.pExpr = 0;
769b7916a78Sdrh   }else{
770b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
771b7916a78Sdrh     if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
772b7916a78Sdrh   }
773b7916a78Sdrh   spanSet(&A, &X, &X);
774b7916a78Sdrh }
7757c972decSdrh expr(A) ::= VARIABLE(X).     {
776b7916a78Sdrh   spanExpr(&A, pParse, TK_VARIABLE, &X);
777b7916a78Sdrh   sqlite3ExprAssignVarNumber(pParse, A.pExpr);
778b7916a78Sdrh   spanSet(&A, &X, &X);
779895d7472Sdrh }
78039002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). {
781b7916a78Sdrh   A.pExpr = sqlite3ExprSetColl(pParse, E.pExpr, &C);
782b7916a78Sdrh   A.zStart = E.zStart;
783b7916a78Sdrh   A.zEnd = &C.z[C.n];
7848b4c40d8Sdrh }
785487e262fSdrh %ifndef SQLITE_OMIT_CAST
786487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
787b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T);
788b7916a78Sdrh   spanSet(&A,&X,&Y);
789487e262fSdrh }
790154d4b24Sdrh %endif  SQLITE_OMIT_CAST
791fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). {
792c9cf901dSdanielk1977   if( Y && Y->nExpr>SQLITE_MAX_FUNCTION_ARG ){
793e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
7944e05c83bSdrh   }
795b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, Y, &X);
796b7916a78Sdrh   spanSet(&A,&X,&E);
797b7916a78Sdrh   if( D && A.pExpr ){
798b7916a78Sdrh     A.pExpr->flags |= EP_Distinct;
799fd357974Sdrh   }
800e1b6a5b8Sdrh }
801e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
802b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
803b7916a78Sdrh   spanSet(&A,&X,&E);
804e1b6a5b8Sdrh }
805b71090fdSdrh term(A) ::= CTIME_KW(OP). {
806b71090fdSdrh   /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are
807b71090fdSdrh   ** treated as functions that return constants */
808b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0,&OP);
809b7916a78Sdrh   if( A.pExpr ){
810b7916a78Sdrh     A.pExpr->op = TK_CONST_FUNC;
811b7916a78Sdrh   }
812b7916a78Sdrh   spanSet(&A, &OP, &OP);
813b7916a78Sdrh }
814b7916a78Sdrh 
815b7916a78Sdrh %include {
816b7916a78Sdrh   /* This routine constructs a binary expression node out of two ExprSpan
817b7916a78Sdrh   ** objects and uses the result to populate a new ExprSpan object.
818b7916a78Sdrh   */
819b7916a78Sdrh   static void spanBinaryExpr(
820b7916a78Sdrh     ExprSpan *pOut,     /* Write the result here */
821b7916a78Sdrh     Parse *pParse,      /* The parsing context.  Errors accumulate here */
822b7916a78Sdrh     int op,             /* The binary operation */
823b7916a78Sdrh     ExprSpan *pLeft,    /* The left operand */
824b7916a78Sdrh     ExprSpan *pRight    /* The right operand */
825b7916a78Sdrh   ){
826b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0);
827b7916a78Sdrh     pOut->zStart = pLeft->zStart;
828b7916a78Sdrh     pOut->zEnd = pRight->zEnd;
829417ec638Sdrh   }
830b71090fdSdrh }
831b7916a78Sdrh 
832b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y).    {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
833b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y).     {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
83417435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y).
835b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
836b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y).  {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
837fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
838b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
839b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).
840b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
84117435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y).
842b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
843b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
84474ad7fe9Sdrh %type likeop {struct LikeOp}
845b52076cdSdrh likeop(A) ::= LIKE_KW(X).     {A.eOperator = X; A.not = 0;}
846b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;}
84703bea70cSdrh likeop(A) ::= MATCH(X).       {A.eOperator = X; A.not = 0;}
84803bea70cSdrh likeop(A) ::= NOT MATCH(X).   {A.eOperator = X; A.not = 1;}
849b7916a78Sdrh %type escape {ExprSpan}
850b7916a78Sdrh %destructor escape {sqlite3ExprDelete(pParse->db, $$.pExpr);}
8517c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;}
852b7916a78Sdrh escape(X) ::= .               [ESCAPE] {memset(&X,0,sizeof(X));}
853b71090fdSdrh expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E).  [LIKE_KW]  {
8548aa34ae0Sdrh   ExprList *pList;
855b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
856b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
857b7916a78Sdrh   if( E.pExpr ){
858b7916a78Sdrh     pList = sqlite3ExprListAppend(pParse,pList, E.pExpr);
8597c6303c0Sdanielk1977   }
860b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
861b7916a78Sdrh   if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
862b7916a78Sdrh   A.zStart = X.zStart;
863b7916a78Sdrh   A.zEnd = Y.zEnd;
864b7916a78Sdrh   if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
8650ac65892Sdrh }
8667c6303c0Sdanielk1977 
867b7916a78Sdrh %include {
868b7916a78Sdrh   /* Construct an expression node for a unary postfix operator
869b7916a78Sdrh   */
870b7916a78Sdrh   static void spanUnaryPostfix(
871b7916a78Sdrh     ExprSpan *pOut,        /* Write the new expression node here */
872b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
873b7916a78Sdrh     int op,                /* The operator */
874b7916a78Sdrh     ExprSpan *pOperand,    /* The operand */
875b7916a78Sdrh     Token *pPostOp         /* The operand token for setting the span */
876b7916a78Sdrh   ){
877b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
878b7916a78Sdrh     pOut->zStart = pOperand->zStart;
879b7916a78Sdrh     pOut->zEnd = &pPostOp->z[pPostOp->n];
880e1b6a5b8Sdrh   }
88133048c0bSdrh }
882b7916a78Sdrh 
883b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E).   {spanUnaryPostfix(&A,pParse,@E,&X,&E);}
884b7916a78Sdrh expr(A) ::= expr(X) IS NULL(E).   {spanUnaryPostfix(&A,pParse,TK_ISNULL,&X,&E);}
885b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);}
886b7916a78Sdrh expr(A) ::= expr(X) IS NOT NULL(E).
887b7916a78Sdrh                                  {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);}
888b7916a78Sdrh 
889b7916a78Sdrh %include {
890b7916a78Sdrh   /* Construct an expression node for a unary prefix operator
891b7916a78Sdrh   */
892b7916a78Sdrh   static void spanUnaryPrefix(
893b7916a78Sdrh     ExprSpan *pOut,        /* Write the new expression node here */
894b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
895b7916a78Sdrh     int op,                /* The operator */
896b7916a78Sdrh     ExprSpan *pOperand,    /* The operand */
897b7916a78Sdrh     Token *pPreOp         /* The operand token for setting the span */
898b7916a78Sdrh   ){
899b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
900b7916a78Sdrh     pOut->zStart = pPreOp->z;
901b7916a78Sdrh     pOut->zEnd = pOperand->zEnd;
90233048c0bSdrh   }
90381a20f21Sdrh }
904b7916a78Sdrh 
905b7916a78Sdrh 
906b7916a78Sdrh 
907b7916a78Sdrh expr(A) ::= NOT(B) expr(X).    {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
908b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
909b7916a78Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS]
910b7916a78Sdrh                                {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);}
911b7916a78Sdrh expr(A) ::= PLUS(B) expr(X). [UPLUS]
912b7916a78Sdrh                                {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);}
913b7916a78Sdrh 
9142e3a1f16Sdrh %type between_op {int}
9152e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
9162e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
9172e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
918b7916a78Sdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr);
919b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr);
920b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0);
921b7916a78Sdrh   if( A.pExpr ){
922b7916a78Sdrh     A.pExpr->x.pList = pList;
92353f733c7Sdrh   }else{
924633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
92553f733c7Sdrh   }
926b7916a78Sdrh   if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
927b7916a78Sdrh   A.zStart = W.zStart;
928b7916a78Sdrh   A.zEnd = Y.zEnd;
929fef5208cSdrh }
9303e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
9312e3a1f16Sdrh   %type in_op {int}
9322e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
9332e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
9342e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
935b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
936b7916a78Sdrh     if( A.pExpr ){
937b7916a78Sdrh       A.pExpr->x.pList = Y;
938b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
939d5d56523Sdanielk1977     }else{
940633e6d57Sdrh       sqlite3ExprListDelete(pParse->db, Y);
941d5d56523Sdanielk1977     }
942b7916a78Sdrh     if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
943b7916a78Sdrh     A.zStart = X.zStart;
944b7916a78Sdrh     A.zEnd = &E.z[E.n];
945fef5208cSdrh   }
94651522cd3Sdrh   expr(A) ::= LP(B) select(X) RP(E). {
947b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
948b7916a78Sdrh     if( A.pExpr ){
949b7916a78Sdrh       A.pExpr->x.pSelect = X;
950b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
951b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
95253f733c7Sdrh     }else{
953633e6d57Sdrh       sqlite3SelectDelete(pParse->db, X);
95453f733c7Sdrh     }
955b7916a78Sdrh     A.zStart = B.z;
956b7916a78Sdrh     A.zEnd = &E.z[E.n];
95751522cd3Sdrh   }
9582e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E).  [IN] {
959b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
960b7916a78Sdrh     if( A.pExpr ){
961b7916a78Sdrh       A.pExpr->x.pSelect = Y;
962b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
963b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
96453f733c7Sdrh     }else{
965633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
96653f733c7Sdrh     }
967b7916a78Sdrh     if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
968b7916a78Sdrh     A.zStart = X.zStart;
969b7916a78Sdrh     A.zEnd = &E.z[E.n];
970fef5208cSdrh   }
97174ad7fe9Sdrh   expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
97217435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
973b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
974b7916a78Sdrh     if( A.pExpr ){
975b7916a78Sdrh       A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
976b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
977b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
97853f733c7Sdrh     }else{
979633e6d57Sdrh       sqlite3SrcListDelete(pParse->db, pSrc);
98053f733c7Sdrh     }
981b7916a78Sdrh     if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
982b7916a78Sdrh     A.zStart = X.zStart;
983b7916a78Sdrh     A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
98423b2db23Sdrh   }
98551522cd3Sdrh   expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
986b7916a78Sdrh     Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
98751522cd3Sdrh     if( p ){
9886ab3a2ecSdanielk1977       p->x.pSelect = Y;
989b7916a78Sdrh       ExprSetProperty(p, EP_xIsSelect);
990b7916a78Sdrh       sqlite3ExprSetHeight(pParse, p);
99153f733c7Sdrh     }else{
992633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
99351522cd3Sdrh     }
994b7916a78Sdrh     A.zStart = B.z;
995b7916a78Sdrh     A.zEnd = &E.z[E.n];
99651522cd3Sdrh   }
997154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
998fef5208cSdrh 
99917a7f8ddSdrh /* CASE expressions */
100017a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
1001b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0);
1002b7916a78Sdrh   if( A.pExpr ){
1003b7916a78Sdrh     A.pExpr->x.pList = Y;
1004b7916a78Sdrh     sqlite3ExprSetHeight(pParse, A.pExpr);
100553f733c7Sdrh   }else{
1006633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
100753f733c7Sdrh   }
1008b7916a78Sdrh   A.zStart = C.z;
1009b7916a78Sdrh   A.zEnd = &E.z[E.n];
101017a7f8ddSdrh }
101117a7f8ddSdrh %type case_exprlist {ExprList*}
1012633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
101317a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
1014b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X, Y.pExpr);
1015b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
101617a7f8ddSdrh }
101717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
1018b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0, Y.pExpr);
1019b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
102017a7f8ddSdrh }
102117a7f8ddSdrh %type case_else {Expr*}
1022633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
1023b7916a78Sdrh case_else(A) ::=  ELSE expr(X).         {A = X.pExpr;}
102417a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
102517a7f8ddSdrh %type case_operand {Expr*}
1026633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
1027b7916a78Sdrh case_operand(A) ::= expr(X).            {A = X.pExpr;}
102817a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1029348784efSdrh 
1030348784efSdrh %type exprlist {ExprList*}
1031633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
10329245c243Sdrh %type nexprlist {ExprList*}
1033633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1034348784efSdrh 
10359245c243Sdrh exprlist(A) ::= nexprlist(X).                {A = X;}
10369245c243Sdrh exprlist(A) ::= .                            {A = 0;}
103717435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y).
1038b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
103917435752Sdrh nexprlist(A) ::= expr(Y).
1040b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);}
10419245c243Sdrh 
1042cce7d176Sdrh 
1043382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1044382c0247Sdrh //
1045d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
104677e96d14Sdrh         ON nm(Y) LP idxlist(Z) RP(E). {
104717435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
104817435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
10494d91a701Sdrh                       &S, &E, SQLITE_SO_ASC, NE);
10509cfcf5d4Sdrh }
1051717e6402Sdrh 
1052717e6402Sdrh %type uniqueflag {int}
10539cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
10549cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1055348784efSdrh 
10560202b29eSdanielk1977 %type idxlist {ExprList*}
1057633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);}
10580202b29eSdanielk1977 %type idxlist_opt {ExprList*}
1059633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1060348784efSdrh 
1061c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
1062c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
1063200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z).  {
10640202b29eSdanielk1977   Expr *p = 0;
10650202b29eSdanielk1977   if( C.n>0 ){
1066b7916a78Sdrh     p = sqlite3Expr(pParse->db, TK_COLUMN, 0);
106739002505Sdanielk1977     sqlite3ExprSetColl(pParse, p, &C);
10680202b29eSdanielk1977   }
1069b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X, p);
1070b7916a78Sdrh   sqlite3ExprListSetName(pParse,A,&Y,1);
1071b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
1072b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
10730202b29eSdanielk1977 }
1074200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). {
10750202b29eSdanielk1977   Expr *p = 0;
10760202b29eSdanielk1977   if( C.n>0 ){
107717435752Sdrh     p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
107839002505Sdanielk1977     sqlite3ExprSetColl(pParse, p, &C);
10790202b29eSdanielk1977   }
1080b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0, p);
1081b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &Y, 1);
1082b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
1083b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
10840202b29eSdanielk1977 }
10850202b29eSdanielk1977 
1086a34001c9Sdrh %type collate {Token}
1087a34001c9Sdrh collate(C) ::= .                 {C.z = 0; C.n = 0;}
108839002505Sdanielk1977 collate(C) ::= COLLATE ids(X).   {C = X;}
1089a34001c9Sdrh 
1090348784efSdrh 
10918aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1092382c0247Sdrh //
10934d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1094982cef7eSdrh 
1095382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1096382c0247Sdrh //
1097154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1098fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
109974161705Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse);}
110074161705Sdrh cmd ::= VACUUM nm.             {sqlite3Vacuum(pParse);}
1101fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1102154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1103f57b14a6Sdrh 
1104382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1105382c0247Sdrh //
110604e86f4dSshane %ifndef SQLITE_OMIT_PARSER
110713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
110891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1109ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1110ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1111ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1112ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1113ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1114ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1115ada2ee0dSdrh 
1116a3eb4b44Sdrh nmnum(A) ::= plus_num(X).             {A = X;}
1117a3eb4b44Sdrh nmnum(A) ::= nm(X).                   {A = X;}
1118ada2ee0dSdrh nmnum(A) ::= ON(X).                   {A = X;}
1119ada2ee0dSdrh nmnum(A) ::= DELETE(X).               {A = X;}
11206da861beSdrh nmnum(A) ::= DEFAULT(X).              {A = X;}
1121154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
112204e86f4dSshane %endif SQLITE_OMIT_PARSER
1123f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
1124f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1125fd405314Sdrh number(A) ::= INTEGER|FLOAT(X).       {A = X;}
1126f57b14a6Sdrh plus_opt ::= PLUS.
1127f57b14a6Sdrh plus_opt ::= .
1128c3f9bad2Sdanielk1977 
1129c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1130f0f258b1Sdrh 
1131b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1132b7f9164eSdrh 
1133d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
11344b59ab5eSdrh   Token all;
11354b59ab5eSdrh   all.z = A.z;
1136b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
11374adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1138f0f258b1Sdrh }
1139f0f258b1Sdrh 
1140fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1141fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
114260218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
114360218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
11443df6b257Sdanielk1977   A = (Z.n==0?B:Z);
1145c3f9bad2Sdanielk1977 }
1146c3f9bad2Sdanielk1977 
1147c3f9bad2Sdanielk1977 %type trigger_time {int}
1148c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
1149c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
1150c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1151c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1152c3f9bad2Sdanielk1977 
1153ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1154633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1155fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP).       {A.a = @OP; A.b = 0;}
115674ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP).              {A.a = @OP; A.b = 0;}
1157c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}
1158c3f9bad2Sdanielk1977 
115960218d2aSdrh foreach_clause ::= .
116060218d2aSdrh foreach_clause ::= FOR EACH ROW.
1161c3f9bad2Sdanielk1977 
1162c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1163633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1164c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
1165b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; }
1166c3f9bad2Sdanielk1977 
1167c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1168633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
1169187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
117081238966Sdrh   assert( Y!=0 );
117181238966Sdrh   Y->pLast->pNext = X;
1172187e4c6aSdrh   Y->pLast = X;
1173187e4c6aSdrh   A = Y;
1174a69d9168Sdrh }
117581238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. {
117681238966Sdrh   assert( X!=0 );
117781238966Sdrh   X->pLast = X;
117881238966Sdrh   A = X;
117981238966Sdrh }
1180c3f9bad2Sdanielk1977 
1181c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1182633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1183c3f9bad2Sdanielk1977 // UPDATE
11845ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
118517435752Sdrh                { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); }
1186c3f9bad2Sdanielk1977 
1187c3f9bad2Sdanielk1977 // INSERT
11883054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F)
1189c3f9bad2Sdanielk1977                    VALUES LP itemlist(Y) RP.
119017435752Sdrh                {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);}
1191c3f9bad2Sdanielk1977 
11923054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
119317435752Sdrh                {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);}
1194c3f9bad2Sdanielk1977 
1195c3f9bad2Sdanielk1977 // DELETE
11965ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
119717435752Sdrh                {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
1198c3f9bad2Sdanielk1977 
1199c3f9bad2Sdanielk1977 // SELECT
120017435752Sdrh trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(pParse->db, X); }
1201c3f9bad2Sdanielk1977 
12026f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
12034b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
1204b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
1205b7916a78Sdrh   if( A.pExpr ){
1206b7916a78Sdrh     A.pExpr->affinity = OE_Ignore;
12074b59ab5eSdrh   }
1208b7916a78Sdrh   A.zStart = X.z;
1209b7916a78Sdrh   A.zEnd = &Y.z[Y.n];
12108aa34ae0Sdrh }
121174ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y).  {
1212b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z);
1213b7916a78Sdrh   if( A.pExpr ) {
1214b7916a78Sdrh     A.pExpr->affinity = (char)T;
12154b59ab5eSdrh   }
1216b7916a78Sdrh   A.zStart = X.z;
1217b7916a78Sdrh   A.zEnd = &Y.z[Y.n];
12188aa34ae0Sdrh }
1219154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1220b7f9164eSdrh 
122174ad7fe9Sdrh %type raisetype {int}
122274ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
122374ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
122474ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
122574ad7fe9Sdrh 
12266f34903eSdanielk1977 
1227c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1228b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1229fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1230fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1231c3f9bad2Sdanielk1977 }
1232154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1233113088ecSdrh 
1234113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1235fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1236f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
1237b7916a78Sdrh   sqlite3Attach(pParse, F.pExpr, D.pExpr, K);
12381c2d8414Sdrh }
1239fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
1240b7916a78Sdrh   sqlite3Detach(pParse, D.pExpr);
1241fdbcdee5Sdrh }
1242fdbcdee5Sdrh 
1243f744bb56Sdanielk1977 %type key_opt {Expr*}
1244633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1245f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
1246b7916a78Sdrh key_opt(A) ::= KEY expr(X).          { A = X.pExpr; }
1247113088ecSdrh 
1248113088ecSdrh database_kw_opt ::= DATABASE.
1249113088ecSdrh database_kw_opt ::= .
1250fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
12514343fea2Sdrh 
12524343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
12534343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
12544343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
12554343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1256154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
12579fd2a9a0Sdanielk1977 
12589f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
12599f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
12609f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
12619f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
12629f18e8a0Sdrh %endif
12639f18e8a0Sdrh 
12649fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
12659fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
12669fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
12679fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
12689fd2a9a0Sdanielk1977 }
126919a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). {
127019a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
127119a8e7e8Sdanielk1977 }
127219a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
1273d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
127419a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
127519a8e7e8Sdanielk1977 }
127619a8e7e8Sdanielk1977 kwcolumn_opt ::= .
127719a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1278154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1279e09daa90Sdrh 
1280e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1281e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1282b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1283b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1284d9da78a2Sdrh create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). {
1285b9bb7c18Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z);
1286b9bb7c18Sdrh }
1287e09daa90Sdrh vtabarglist ::= vtabarg.
1288e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1289b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1290b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1291b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1292b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1293b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1294b9bb7c18Sdrh anylist ::= .
1295aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1296aaac8b4eSdrh anylist ::= anylist ANY.
1297154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
1298