xref: /sqlite-3.40.0/src/parse.y (revision ab35eaed)
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" */
78f9df4498Sdrh   int bNot;         /* 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 
977b113babSdrh /*
987b113babSdrh ** One or more VALUES claues
997b113babSdrh */
1007b113babSdrh struct ValueList {
1017b113babSdrh   ExprList *pList;
1027b113babSdrh   Select *pSelect;
1037b113babSdrh };
1047b113babSdrh 
105caec2f12Sdrh } // end %include
106348784efSdrh 
107826fb5a3Sdrh // Input is a single SQL command
108c4a3c779Sdrh input ::= cmdlist.
109094b2bbfSdrh cmdlist ::= cmdlist ecmd.
110826fb5a3Sdrh cmdlist ::= ecmd.
111b7f9164eSdrh ecmd ::= SEMI.
112b7f9164eSdrh ecmd ::= explain cmdx SEMI.
1134adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
114b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
115b7f9164eSdrh explain ::= EXPLAIN.              { sqlite3BeginParse(pParse, 1); }
116ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN.   { sqlite3BeginParse(pParse, 2); }
117154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
118200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
119348784efSdrh 
120382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
121c4a3c779Sdrh //
122fa86c412Sdrh 
123684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
124c4a3c779Sdrh trans_opt ::= .
125c4a3c779Sdrh trans_opt ::= TRANSACTION.
1265ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
127684917c2Sdrh %type transtype {int}
128684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
129684917c2Sdrh transtype(A) ::= DEFERRED(X).  {A = @X;}
130684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;}
131684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;}
1324adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
1334adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
1344adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
135c4a3c779Sdrh 
136fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
137fd7f0452Sdanielk1977 savepoint_opt ::= .
138fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
139fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
140fd7f0452Sdanielk1977 }
141fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
142fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
143fd7f0452Sdanielk1977 }
144fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
145fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
146fd7f0452Sdanielk1977 }
147fd7f0452Sdanielk1977 
148382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
149348784efSdrh //
150348784efSdrh cmd ::= create_table create_table_args.
151d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
152f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
153969fa7c1Sdrh }
154d9da78a2Sdrh createkw(A) ::= CREATE(X).  {
155d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
156d9da78a2Sdrh   A = X;
157d9da78a2Sdrh }
158faa59554Sdrh %type ifnotexists {int}
159faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
160faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
161f57b3399Sdrh %type temp {int}
16253c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
163d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
164154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
165d24cc427Sdrh temp(A) ::= .      {A = 0;}
16619a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). {
16719a8e7e8Sdanielk1977   sqlite3EndTable(pParse,&X,&Y,0);
168969fa7c1Sdrh }
169969fa7c1Sdrh create_table_args ::= AS select(S). {
17019a8e7e8Sdanielk1977   sqlite3EndTable(pParse,0,0,S);
171633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
172969fa7c1Sdrh }
173348784efSdrh columnlist ::= columnlist COMMA column.
174348784efSdrh columnlist ::= column.
175348784efSdrh 
176487e262fSdrh // A "column" is a complete description of a single column in a
177487e262fSdrh // CREATE TABLE statement.  This includes the column name, its
178487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES,
179487e262fSdrh // NOT NULL and so forth.
180348784efSdrh //
18119a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. {
18219a8e7e8Sdanielk1977   A.z = X.z;
183b27b7f5dSdrh   A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n;
18419a8e7e8Sdanielk1977 }
18519a8e7e8Sdanielk1977 columnid(A) ::= nm(X). {
18619a8e7e8Sdanielk1977   sqlite3AddColumn(pParse,&X);
18719a8e7e8Sdanielk1977   A = X;
1884dc330ddSdrh   pParse->constraintName.n = 0;
18919a8e7e8Sdanielk1977 }
19019a8e7e8Sdanielk1977 
191c4a3c779Sdrh 
192c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
193c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
194c4a3c779Sdrh //
195982cef7eSdrh %type id {Token}
196f18543caSdrh id(A) ::= ID(X).         {A = X;}
197296a483cSdrh id(A) ::= INDEXED(X).    {A = X;}
1980bd1f4eaSdrh 
19934e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
20034e33bb8Sdrh // fallback to ID if they will not parse as their original value.
20134e33bb8Sdrh // This obviates the need for the "id" nonterminal.
20234e33bb8Sdrh //
2030bd1f4eaSdrh %fallback ID
2041da40a38Sdan   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2051da40a38Sdan   CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
2061da40a38Sdan   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
207db15bcd5Sdrh   QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK
20878c2e6d8Sdanielk1977   SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL
209b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
210b7f9164eSdrh   EXCEPT INTERSECT UNION
211154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
212a073384fSdrh   REINDEX RENAME CTIME_KW IF
213b7f9164eSdrh   .
214e09daa90Sdrh %wildcard ANY.
215c4a3c779Sdrh 
2162d3917daSdrh // Define operator precedence early so that this is the first occurance
2172d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2182d3917daSdrh // causes them to be assigned integer values that are close together,
2192d3917daSdrh // which keeps parser tables smaller.
2202d3917daSdrh //
221f2bc013cSdrh // The token values assigned to these symbols is determined by the order
222f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
223f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
224f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
225f2bc013cSdrh // constraint.
226f2bc013cSdrh //
2272d3917daSdrh %left OR.
2282d3917daSdrh %left AND.
2292d3917daSdrh %right NOT.
23003bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2319a43267bSdrh %left GT LE LT GE.
2327c6303c0Sdanielk1977 %right ESCAPE.
2332d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2342d3917daSdrh %left PLUS MINUS.
2352d3917daSdrh %left STAR SLASH REM.
236a34001c9Sdrh %left CONCAT.
237a34001c9Sdrh %left COLLATE.
2387ba5bc5bSdrh %right BITNOT.
2392d3917daSdrh 
240c4a3c779Sdrh // And "ids" is an identifer-or-string.
241c4a3c779Sdrh //
242c4a3c779Sdrh %type ids {Token}
243fd405314Sdrh ids(A) ::= ID|STRING(X).   {A = X;}
244c4a3c779Sdrh 
2455ad1a6c8Sdrh // The name of a column or table can be any of the following:
2465ad1a6c8Sdrh //
2475ad1a6c8Sdrh %type nm {Token}
248296a483cSdrh nm(A) ::= id(X).         {A = X;}
2495ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
2505ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
2515ad1a6c8Sdrh 
252487e262fSdrh // A typetoken is really one or more tokens that form a type name such
253487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
254487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
255487e262fSdrh //
256487e262fSdrh %type typetoken {Token}
257382c0247Sdrh type ::= .
258487e262fSdrh type ::= typetoken(X).                   {sqlite3AddColumnType(pParse,&X);}
259487e262fSdrh typetoken(A) ::= typename(X).   {A = X;}
260487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). {
261487e262fSdrh   A.z = X.z;
262b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
263487e262fSdrh }
264487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). {
265487e262fSdrh   A.z = X.z;
266b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
267487e262fSdrh }
268382c0247Sdrh %type typename {Token}
269382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
270b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);}
27160218d2aSdrh signed ::= plus_num.
27260218d2aSdrh signed ::= minus_num.
273487e262fSdrh 
274487e262fSdrh // "carglist" is a list of additional constraints that come after the
275487e262fSdrh // column name and column type in a CREATE TABLE statement.
276487e262fSdrh //
2774dc330ddSdrh carglist ::= carglist ccons.
278348784efSdrh carglist ::= .
2794dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
280b7916a78Sdrh ccons ::= DEFAULT term(X).            {sqlite3AddDefaultValue(pParse,&X);}
281b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP.      {sqlite3AddDefaultValue(pParse,&X);}
282b7916a78Sdrh ccons ::= DEFAULT PLUS term(X).       {sqlite3AddDefaultValue(pParse,&X);}
283f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X).      {
284b7916a78Sdrh   ExprSpan v;
285b7916a78Sdrh   v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0);
286b7916a78Sdrh   v.zStart = A.z;
287b7916a78Sdrh   v.zEnd = X.zEnd;
288b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2897977a17fSdanielk1977 }
2902b7acc35Sdrh ccons ::= DEFAULT id(X).              {
291b7916a78Sdrh   ExprSpan v;
292b7916a78Sdrh   spanExpr(&v, pParse, TK_STRING, &X);
293b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2947977a17fSdanielk1977 }
295348784efSdrh 
296382c0247Sdrh // In addition to the type name, we also care about the primary key and
297382c0247Sdrh // UNIQUE constraints.
298348784efSdrh //
2990d316a40Sdrh ccons ::= NULL onconf.
3004adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
301fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
302fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
3034d91a701Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);}
304b7916a78Sdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X.pExpr);}
305c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
3064adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3074adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
30839002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
30904738cb9Sdrh 
310205f48e6Sdrh // The optional AUTOINCREMENT keyword
311205f48e6Sdrh %type autoinc {int}
312205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3132958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
314205f48e6Sdrh 
315c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
316c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
317c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
318c2eef3b3Sdrh // check fails.
31904738cb9Sdrh //
320c2eef3b3Sdrh %type refargs {int}
321fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
32250af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; }
323c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
324c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
325c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
326c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
327c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
328c2eef3b3Sdrh %type refact {int}
329fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
330fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
331fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
332fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
333fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
334c2eef3b3Sdrh %type defer_subclause {int}
3351da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
336c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
337c2eef3b3Sdrh %type init_deferred_pred_opt {int}
338c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
339c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
340c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
341348784efSdrh 
34219a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
343*ab35eaedSdrh conslist_opt(A) ::= COMMA(X) conslist.        {A = X;}
344*ab35eaedSdrh conslist ::= conslist tconscomma tcons.
345*ab35eaedSdrh conslist ::= tcons.
346*ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
347*ab35eaedSdrh tconscomma ::= .
348*ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
349f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R).
350fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
3519cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
3524d91a701Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);}
353b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
354b7916a78Sdrh                                  {sqlite3AddCheckConstraint(pParse,E.pExpr);}
355c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
356c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3574adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3584adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
359c2eef3b3Sdrh }
360c2eef3b3Sdrh %type defer_subclause_opt {int}
361c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
362c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
3639cfcf5d4Sdrh 
3649cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3659cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3669cfcf5d4Sdrh //
3679cfcf5d4Sdrh %type onconf {int}
3685eff7cf0Sshane %type orconf {u8}
3691c92853dSdrh %type resolvetype {int}
3701c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
3711c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
3721c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
3735eff7cf0Sshane orconf(A) ::= OR resolvetype(X).             {A = (u8)X;}
37474ad7fe9Sdrh resolvetype(A) ::= raisetype(X).             {A = X;}
3751c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
3761c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
377348784efSdrh 
378382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
379348784efSdrh //
380a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
381a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
382a8858103Sdanielk1977 }
383a073384fSdrh %type ifexists {int}
384a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
385a073384fSdrh ifexists(A) ::= .            {A = 0;}
386348784efSdrh 
387a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
388a76b5dfcSdrh //
389b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
390d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). {
391fdd48a76Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E);
392a76b5dfcSdrh }
393a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
394a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
395a76b5dfcSdrh }
396154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
397a76b5dfcSdrh 
398382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
399348784efSdrh //
4009bb61fe7Sdrh cmd ::= select(X).  {
4017d10d5a6Sdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0};
4027d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
4037e02e5e6Sdrh   sqlite3ExplainBegin(pParse->pVdbe);
4047e02e5e6Sdrh   sqlite3ExplainSelect(pParse->pVdbe, X);
4057e02e5e6Sdrh   sqlite3ExplainFinish(pParse->pVdbe);
406633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4079bb61fe7Sdrh }
408efb7251dSdrh 
4099bb61fe7Sdrh %type select {Select*}
410633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
41182c3d636Sdrh %type oneselect {Select*}
412633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4139bb61fe7Sdrh 
41482c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
415b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
4160a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
417daffd0e5Sdrh   if( Z ){
418b27b7f5dSdrh     Z->op = (u8)Y;
41982c3d636Sdrh     Z->pPrior = X;
42043b78826Sdrh   }else{
421633e6d57Sdrh     sqlite3SelectDelete(pParse->db, X);
422daffd0e5Sdrh   }
42382c3d636Sdrh   A = Z;
42482c3d636Sdrh }
4250a36c57eSdrh %type multiselect_op {int}
42674ad7fe9Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP;}
4270a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
428fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP;}
429154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
43082c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
4319bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
43217435752Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
4339bb61fe7Sdrh }
4349bb61fe7Sdrh 
4359bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
4369bb61fe7Sdrh // present and false (0) if it is not.
4379bb61fe7Sdrh //
438efb7251dSdrh %type distinct {int}
439efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
440fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
441efb7251dSdrh distinct(A) ::= .           {A = 0;}
442348784efSdrh 
4439bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
4447c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
4457c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
4467c917d19Sdrh // opcode of TK_ALL.
4479bb61fe7Sdrh //
448348784efSdrh %type selcollist {ExprList*}
449633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
450348784efSdrh %type sclp {ExprList*}
451633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
452348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
453348784efSdrh sclp(A) ::= .                                {A = 0;}
45401f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
455b7916a78Sdrh    A = sqlite3ExprListAppend(pParse, P, X.pExpr);
456b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
457b7916a78Sdrh    sqlite3ExprListSetSpan(pParse,A,&X);
45801f3f253Sdrh }
4597c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
460b7916a78Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0);
461b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, P, p);
4627c917d19Sdrh }
463e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). {
464e54a62adSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y);
46517435752Sdrh   Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
46617435752Sdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
467b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,P, pDot);
46854473229Sdrh }
46901f3f253Sdrh 
47001f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
47101f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
47201f3f253Sdrh //
47301f3f253Sdrh %type as {Token}
4745ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
4755ad1a6c8Sdrh as(X) ::= ids(Y).      {X = Y;}
47601f3f253Sdrh as(X) ::= .            {X.n = 0;}
4779bb61fe7Sdrh 
478348784efSdrh 
479ad3cab52Sdrh %type seltablist {SrcList*}
480633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
481ad3cab52Sdrh %type stl_prefix {SrcList*}
482633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
483ad3cab52Sdrh %type from {SrcList*}
484633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
485348784efSdrh 
48601f3f253Sdrh // A complete FROM clause.
48701f3f253Sdrh //
48817435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
48961dfc31dSdrh from(A) ::= FROM seltablist(X). {
49061dfc31dSdrh   A = X;
49161dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
49261dfc31dSdrh }
49301f3f253Sdrh 
49401f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
49501f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
49601f3f253Sdrh //
49701f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
49801f3f253Sdrh    A = X;
499d3ec02d3Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y;
50001f3f253Sdrh }
501348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
50285574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). {
503b1c685b0Sdanielk1977   A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
504b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
50501f3f253Sdrh }
50651522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
507fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP select(S) RP
508b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
509b1c685b0Sdanielk1977     A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U);
51022f70c32Sdrh   }
511fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP
512fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
5139b87d7b9Sdanielk1977     if( X==0 && Z.n==0 && N==0 && U==0 ){
514fbdc7f69Sdrh       A = F;
515fbdc7f69Sdrh     }else{
516fbdc7f69Sdrh       Select *pSubquery;
517fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
518fbdc7f69Sdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
519fbdc7f69Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U);
520fbdc7f69Sdrh     }
521fbdc7f69Sdrh   }
522348784efSdrh 
523b733d037Sdrh   // A seltablist_paren nonterminal represents anything in a FROM that
524b733d037Sdrh   // is contained inside parentheses.  This can be either a subquery or
525b733d037Sdrh   // a grouping of table and subqueries.
526b733d037Sdrh   //
527fbdc7f69Sdrh //  %type seltablist_paren {Select*}
528fbdc7f69Sdrh //  %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);}
529fbdc7f69Sdrh //  seltablist_paren(A) ::= select(S).      {A = S;}
530fbdc7f69Sdrh //  seltablist_paren(A) ::= seltablist(F).  {
531fbdc7f69Sdrh //     sqlite3SrcListShiftJoinType(F);
532fbdc7f69Sdrh //     A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
533fbdc7f69Sdrh //  }
534154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
535b733d037Sdrh 
536113088ecSdrh %type dbnm {Token}
537113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
538113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
539113088ecSdrh 
54074ad7fe9Sdrh %type fullname {SrcList*}
541633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
54217435752Sdrh fullname(A) ::= nm(X) dbnm(Y).  {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);}
54374ad7fe9Sdrh 
54401f3f253Sdrh %type joinop {int}
54501f3f253Sdrh %type joinop2 {int}
546fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
5474adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
5484adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
5495ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
5504adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
55101f3f253Sdrh 
55201f3f253Sdrh %type on_opt {Expr*}
553633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
554b7916a78Sdrh on_opt(N) ::= ON expr(E).   {N = E.pExpr;}
55501f3f253Sdrh on_opt(N) ::= .             {N = 0;}
55601f3f253Sdrh 
55785574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
55885574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
55985574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
56085574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
56185574e31Sdanielk1977 // in the token.
56285574e31Sdanielk1977 //
56385574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
564b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
56585574e31Sdanielk1977 // recognizes and interprets this as a special case.
56685574e31Sdanielk1977 //
56785574e31Sdanielk1977 %type indexed_opt {Token}
56885574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
56985574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
57085574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
57185574e31Sdanielk1977 
57201f3f253Sdrh %type using_opt {IdList*}
573633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
5740202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP.  {U = L;}
57501f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
57601f3f253Sdrh 
57701f3f253Sdrh 
578348784efSdrh %type orderby_opt {ExprList*}
579633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
580348784efSdrh %type sortlist {ExprList*}
581633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
582348784efSdrh 
583348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
584348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
5858395b7b6Sdrh sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). {
5868395b7b6Sdrh   A = sqlite3ExprListAppend(pParse,X,Y.pExpr);
587b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
588348784efSdrh }
5898395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
5908395b7b6Sdrh   A = sqlite3ExprListAppend(pParse,0,Y.pExpr);
591d3ec02d3Sdrh   if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z;
592348784efSdrh }
593348784efSdrh 
594348784efSdrh %type sortorder {int}
595348784efSdrh 
5968e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
5978e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
5988e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
599348784efSdrh 
6002282792aSdrh %type groupby_opt {ExprList*}
601633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
6022282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
6039245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
6042282792aSdrh 
6052282792aSdrh %type having_opt {Expr*}
606633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
6072282792aSdrh having_opt(A) ::= .                {A = 0;}
608b7916a78Sdrh having_opt(A) ::= HAVING expr(X).  {A = X.pExpr;}
6092282792aSdrh 
610ad3cab52Sdrh %type limit_opt {struct LimitVal}
61115926590Sdrh 
61215926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
61315926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
61415926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
61515926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
61615926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
61715926590Sdrh // except as a transient.  So there is never anything to destroy.
61815926590Sdrh //
61915926590Sdrh //%destructor limit_opt {
620633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pLimit);
621633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pOffset);
62215926590Sdrh //}
623a2dc3b1aSdanielk1977 limit_opt(A) ::= .                    {A.pLimit = 0; A.pOffset = 0;}
624b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X).       {A.pLimit = X.pExpr; A.pOffset = 0;}
625a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
626b7916a78Sdrh                                       {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;}
627a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
628b7916a78Sdrh                                       {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
6299bbca4c1Sdrh 
630382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
631382c0247Sdrh //
632273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
633931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
634931577f1Sdrh         orderby_opt(O) limit_opt(L). {
635b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
63649ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
6374281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6384281bd42Sshane }
6394281bd42Sshane %endif
640273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6414281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
6424281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6434281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6444281bd42Sshane }
6454281bd42Sshane %endif
646348784efSdrh 
647348784efSdrh %type where_opt {Expr*}
648633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
649348784efSdrh 
650348784efSdrh where_opt(A) ::= .                    {A = 0;}
651b7916a78Sdrh where_opt(A) ::= WHERE expr(X).       {A = X.pExpr;}
652348784efSdrh 
653382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
654382c0247Sdrh //
655273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6564281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L).  {
657b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
658b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
65949ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
6604281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6614281bd42Sshane }
6624281bd42Sshane %endif
663273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6644281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W).  {
6654281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6664281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
6674281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6684281bd42Sshane }
6694281bd42Sshane %endif
670348784efSdrh 
671f8db1bc0Sdrh %type setlist {ExprList*}
672633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
673f8db1bc0Sdrh 
674b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {
675b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, Z, Y.pExpr);
676b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
677b7916a78Sdrh }
678b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
679b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, 0, Y.pExpr);
680b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
681b7916a78Sdrh }
682348784efSdrh 
683382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
684382c0247Sdrh //
6857b113babSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) valuelist(Y).
6867b113babSdrh             {sqlite3Insert(pParse, X, Y.pList, Y.pSelect, F, R);}
68774ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
68874ad7fe9Sdrh             {sqlite3Insert(pParse, X, 0, S, F, R);}
689147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES.
690147d0cccSdrh             {sqlite3Insert(pParse, X, 0, 0, F, R);}
691348784efSdrh 
6925eff7cf0Sshane %type insert_cmd {u8}
693fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
694fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
695fa86c412Sdrh 
6967b113babSdrh // A ValueList is either a single VALUES clause or a comma-separated list
6977b113babSdrh // of VALUES clauses.  If it is a single VALUES clause then the
6987b113babSdrh // ValueList.pList field points to the expression list of that clause.
6997b113babSdrh // If it is a list of VALUES clauses, then those clauses are transformed
7007b113babSdrh // into a set of SELECT statements without FROM clauses and connected by
7017b113babSdrh // UNION ALL and the ValueList.pSelect points to the right-most SELECT in
7027b113babSdrh // that compound.
7037b113babSdrh %type valuelist {struct ValueList}
7047b113babSdrh %destructor valuelist {
7057b113babSdrh   sqlite3ExprListDelete(pParse->db, $$.pList);
7067b113babSdrh   sqlite3SelectDelete(pParse->db, $$.pSelect);
7077b113babSdrh }
7087b113babSdrh valuelist(A) ::= VALUES LP nexprlist(X) RP. {
7097b113babSdrh   A.pList = X;
7107b113babSdrh   A.pSelect = 0;
7117b113babSdrh }
71276aad0d1Sdrh 
71376aad0d1Sdrh // Since a list of VALUEs is inplemented as a compound SELECT, we have
71476aad0d1Sdrh // to disable the value list option if compound SELECTs are disabled.
71576aad0d1Sdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
7167b113babSdrh valuelist(A) ::= valuelist(X) COMMA LP exprlist(Y) RP. {
7177b113babSdrh   Select *pRight = sqlite3SelectNew(pParse, Y, 0, 0, 0, 0, 0, 0, 0, 0);
7187b113babSdrh   if( X.pList ){
7197b113babSdrh     X.pSelect = sqlite3SelectNew(pParse, X.pList, 0, 0, 0, 0, 0, 0, 0, 0);
7207b113babSdrh     X.pList = 0;
7217b113babSdrh   }
7227b113babSdrh   A.pList = 0;
7237b113babSdrh   if( X.pSelect==0 || pRight==0 ){
7247b113babSdrh     sqlite3SelectDelete(pParse->db, pRight);
7257b113babSdrh     sqlite3SelectDelete(pParse->db, X.pSelect);
7267b113babSdrh     A.pSelect = 0;
7277b113babSdrh   }else{
7287b113babSdrh     pRight->op = TK_ALL;
7297b113babSdrh     pRight->pPrior = X.pSelect;
7307b113babSdrh     pRight->selFlags |= SF_Values;
7317b113babSdrh     pRight->pPrior->selFlags |= SF_Values;
7327b113babSdrh     A.pSelect = pRight;
7337b113babSdrh   }
7347b113babSdrh }
73576aad0d1Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
736348784efSdrh 
737967e8b73Sdrh %type inscollist_opt {IdList*}
738633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);}
739967e8b73Sdrh %type inscollist {IdList*}
740633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);}
741348784efSdrh 
742967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
743967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
74417435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y).
74517435752Sdrh     {A = sqlite3IdListAppend(pParse->db,X,&Y);}
74617435752Sdrh inscollist(A) ::= nm(Y).
74717435752Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y);}
748348784efSdrh 
749382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
750382c0247Sdrh //
751348784efSdrh 
752b7916a78Sdrh %type expr {ExprSpan}
753b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);}
754b7916a78Sdrh %type term {ExprSpan}
755b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);}
756b7916a78Sdrh 
757b7916a78Sdrh %include {
758b7916a78Sdrh   /* This is a utility routine used to set the ExprSpan.zStart and
759b7916a78Sdrh   ** ExprSpan.zEnd values of pOut so that the span covers the complete
760b7916a78Sdrh   ** range of text beginning with pStart and going to the end of pEnd.
761b7916a78Sdrh   */
762b7916a78Sdrh   static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
763b7916a78Sdrh     pOut->zStart = pStart->z;
764b7916a78Sdrh     pOut->zEnd = &pEnd->z[pEnd->n];
765b7916a78Sdrh   }
766b7916a78Sdrh 
767b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
768b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
769b7916a78Sdrh   ** that created the expression.
770b7916a78Sdrh   */
771b7916a78Sdrh   static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){
772b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue);
773b7916a78Sdrh     pOut->zStart = pValue->z;
774b7916a78Sdrh     pOut->zEnd = &pValue->z[pValue->n];
775b7916a78Sdrh   }
776b7916a78Sdrh }
777348784efSdrh 
7787977a17fSdanielk1977 expr(A) ::= term(X).             {A = X;}
779b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);}
780b7916a78Sdrh term(A) ::= NULL(X).             {spanExpr(&A, pParse, @X, &X);}
781b7916a78Sdrh expr(A) ::= id(X).               {spanExpr(&A, pParse, TK_ID, &X);}
782b7916a78Sdrh expr(A) ::= JOIN_KW(X).          {spanExpr(&A, pParse, TK_ID, &X);}
7835ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
78417435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
78517435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
786b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
787b7916a78Sdrh   spanSet(&A,&X,&Y);
788e1b6a5b8Sdrh }
789d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
79017435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
79117435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
79217435752Sdrh   Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z);
79317435752Sdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
794b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
795b7916a78Sdrh   spanSet(&A,&X,&Z);
796d24cc427Sdrh }
797b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X).  {spanExpr(&A, pParse, @X, &X);}
798b7916a78Sdrh term(A) ::= STRING(X).              {spanExpr(&A, pParse, @X, &X);}
799b7916a78Sdrh expr(A) ::= REGISTER(X).     {
800b7916a78Sdrh   /* When doing a nested parse, one can include terms in an expression
801b7916a78Sdrh   ** that look like this:   #1 #2 ...  These terms refer to registers
802b7916a78Sdrh   ** in the virtual machine.  #N is the N-th register. */
803b7916a78Sdrh   if( pParse->nested==0 ){
804b7916a78Sdrh     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X);
805b7916a78Sdrh     A.pExpr = 0;
806b7916a78Sdrh   }else{
807b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
808b7916a78Sdrh     if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
809b7916a78Sdrh   }
810b7916a78Sdrh   spanSet(&A, &X, &X);
811b7916a78Sdrh }
8127c972decSdrh expr(A) ::= VARIABLE(X).     {
813b7916a78Sdrh   spanExpr(&A, pParse, TK_VARIABLE, &X);
814b7916a78Sdrh   sqlite3ExprAssignVarNumber(pParse, A.pExpr);
815b7916a78Sdrh   spanSet(&A, &X, &X);
816895d7472Sdrh }
81739002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). {
8188342e49fSdrh   A.pExpr = sqlite3ExprSetCollByToken(pParse, E.pExpr, &C);
819b7916a78Sdrh   A.zStart = E.zStart;
820b7916a78Sdrh   A.zEnd = &C.z[C.n];
8218b4c40d8Sdrh }
822487e262fSdrh %ifndef SQLITE_OMIT_CAST
823487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
824b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T);
825b7916a78Sdrh   spanSet(&A,&X,&Y);
826487e262fSdrh }
827154d4b24Sdrh %endif  SQLITE_OMIT_CAST
828fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). {
829994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
830e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
8314e05c83bSdrh   }
832b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, Y, &X);
833b7916a78Sdrh   spanSet(&A,&X,&E);
834b7916a78Sdrh   if( D && A.pExpr ){
835b7916a78Sdrh     A.pExpr->flags |= EP_Distinct;
836fd357974Sdrh   }
837e1b6a5b8Sdrh }
838e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
839b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
840b7916a78Sdrh   spanSet(&A,&X,&E);
841e1b6a5b8Sdrh }
842b71090fdSdrh term(A) ::= CTIME_KW(OP). {
843b71090fdSdrh   /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are
844b71090fdSdrh   ** treated as functions that return constants */
845b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0,&OP);
846b7916a78Sdrh   if( A.pExpr ){
847b7916a78Sdrh     A.pExpr->op = TK_CONST_FUNC;
848b7916a78Sdrh   }
849b7916a78Sdrh   spanSet(&A, &OP, &OP);
850b7916a78Sdrh }
851b7916a78Sdrh 
852b7916a78Sdrh %include {
853b7916a78Sdrh   /* This routine constructs a binary expression node out of two ExprSpan
854b7916a78Sdrh   ** objects and uses the result to populate a new ExprSpan object.
855b7916a78Sdrh   */
856b7916a78Sdrh   static void spanBinaryExpr(
857b7916a78Sdrh     ExprSpan *pOut,     /* Write the result here */
858b7916a78Sdrh     Parse *pParse,      /* The parsing context.  Errors accumulate here */
859b7916a78Sdrh     int op,             /* The binary operation */
860b7916a78Sdrh     ExprSpan *pLeft,    /* The left operand */
861b7916a78Sdrh     ExprSpan *pRight    /* The right operand */
862b7916a78Sdrh   ){
863b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0);
864b7916a78Sdrh     pOut->zStart = pLeft->zStart;
865b7916a78Sdrh     pOut->zEnd = pRight->zEnd;
866417ec638Sdrh   }
867b71090fdSdrh }
868b7916a78Sdrh 
869b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y).    {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
870b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y).     {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
87117435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y).
872b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
873b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y).  {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
874fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
875b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
876b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).
877b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
87817435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y).
879b7916a78Sdrh                                         {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
880b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
88174ad7fe9Sdrh %type likeop {struct LikeOp}
882f9df4498Sdrh likeop(A) ::= LIKE_KW(X).     {A.eOperator = X; A.bNot = 0;}
883f9df4498Sdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.bNot = 1;}
884f9df4498Sdrh likeop(A) ::= MATCH(X).       {A.eOperator = X; A.bNot = 0;}
885f9df4498Sdrh likeop(A) ::= NOT MATCH(X).   {A.eOperator = X; A.bNot = 1;}
8861dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE_KW]  {
8878aa34ae0Sdrh   ExprList *pList;
888b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
889b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
890b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
891f9df4498Sdrh   if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
892b7916a78Sdrh   A.zStart = X.zStart;
893b7916a78Sdrh   A.zEnd = Y.zEnd;
894b7916a78Sdrh   if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
8950ac65892Sdrh }
8961dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
8971dca1458Sdrh   ExprList *pList;
8981dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
8991dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
9001dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,pList, E.pExpr);
9011dca1458Sdrh   A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
902f9df4498Sdrh   if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
9031dca1458Sdrh   A.zStart = X.zStart;
9041dca1458Sdrh   A.zEnd = E.zEnd;
9051dca1458Sdrh   if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
9061dca1458Sdrh }
9077c6303c0Sdanielk1977 
908b7916a78Sdrh %include {
909b7916a78Sdrh   /* Construct an expression node for a unary postfix operator
910b7916a78Sdrh   */
911b7916a78Sdrh   static void spanUnaryPostfix(
912b7916a78Sdrh     ExprSpan *pOut,        /* Write the new expression node here */
913b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
914b7916a78Sdrh     int op,                /* The operator */
915b7916a78Sdrh     ExprSpan *pOperand,    /* The operand */
916b7916a78Sdrh     Token *pPostOp         /* The operand token for setting the span */
917b7916a78Sdrh   ){
918b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
919b7916a78Sdrh     pOut->zStart = pOperand->zStart;
920b7916a78Sdrh     pOut->zEnd = &pPostOp->z[pPostOp->n];
921e1b6a5b8Sdrh   }
92233048c0bSdrh }
923b7916a78Sdrh 
924b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E).   {spanUnaryPostfix(&A,pParse,@E,&X,&E);}
925b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);}
9266a2fe093Sdrh 
9276a51741dSdrh %include {
9286a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
9296a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
9306a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
9316a51741dSdrh     sqlite3 *db = pParse->db;
9326a51741dSdrh     if( db->mallocFailed==0 && pY->op==TK_NULL ){
9335e17e8b7Sshaneh       pA->op = (u8)op;
9346a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
9356a51741dSdrh       pA->pRight = 0;
9366a51741dSdrh     }
9376a51741dSdrh   }
9386a51741dSdrh }
9396a51741dSdrh 
9406a2fe093Sdrh //    expr1 IS expr2
9416a2fe093Sdrh //    expr1 IS NOT expr2
9426a2fe093Sdrh //
9436a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
9446a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
9456a2fe093Sdrh //
9466a2fe093Sdrh expr(A) ::= expr(X) IS expr(Y).     {
9476a2fe093Sdrh   spanBinaryExpr(&A,pParse,TK_IS,&X,&Y);
9486a51741dSdrh   binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL);
9496a2fe093Sdrh }
9506a2fe093Sdrh expr(A) ::= expr(X) IS NOT expr(Y). {
9516a2fe093Sdrh   spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y);
9526a51741dSdrh   binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL);
9536a2fe093Sdrh }
954b7916a78Sdrh 
955b7916a78Sdrh %include {
956b7916a78Sdrh   /* Construct an expression node for a unary prefix operator
957b7916a78Sdrh   */
958b7916a78Sdrh   static void spanUnaryPrefix(
959b7916a78Sdrh     ExprSpan *pOut,        /* Write the new expression node here */
960b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
961b7916a78Sdrh     int op,                /* The operator */
962b7916a78Sdrh     ExprSpan *pOperand,    /* The operand */
963b7916a78Sdrh     Token *pPreOp         /* The operand token for setting the span */
964b7916a78Sdrh   ){
965b7916a78Sdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
966b7916a78Sdrh     pOut->zStart = pPreOp->z;
967b7916a78Sdrh     pOut->zEnd = pOperand->zEnd;
96833048c0bSdrh   }
96981a20f21Sdrh }
970b7916a78Sdrh 
971b7916a78Sdrh 
972b7916a78Sdrh 
973b7916a78Sdrh expr(A) ::= NOT(B) expr(X).    {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
974b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
9757ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT]
976b7916a78Sdrh                                {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);}
9777ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT]
978b7916a78Sdrh                                {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);}
979b7916a78Sdrh 
9802e3a1f16Sdrh %type between_op {int}
9812e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
9822e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
9832e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
984b7916a78Sdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr);
985b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr);
986b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0);
987b7916a78Sdrh   if( A.pExpr ){
988b7916a78Sdrh     A.pExpr->x.pList = pList;
98953f733c7Sdrh   }else{
990633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
99153f733c7Sdrh   }
992b7916a78Sdrh   if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
993b7916a78Sdrh   A.zStart = W.zStart;
994b7916a78Sdrh   A.zEnd = Y.zEnd;
995fef5208cSdrh }
9963e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
9972e3a1f16Sdrh   %type in_op {int}
9982e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
9992e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
10002e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
1001094430ebSdrh     if( Y==0 ){
1002473c1bf2Sdan       /* Expressions of the form
1003473c1bf2Sdan       **
1004473c1bf2Sdan       **      expr1 IN ()
1005473c1bf2Sdan       **      expr1 NOT IN ()
1006473c1bf2Sdan       **
1007473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1008473c1bf2Sdan       ** regardless of the value of expr1.
1009473c1bf2Sdan       */
1010094430ebSdrh       A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]);
1011094430ebSdrh       sqlite3ExprDelete(pParse->db, X.pExpr);
1012094430ebSdrh     }else{
1013b7916a78Sdrh       A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1014b7916a78Sdrh       if( A.pExpr ){
1015b7916a78Sdrh         A.pExpr->x.pList = Y;
1016b7916a78Sdrh         sqlite3ExprSetHeight(pParse, A.pExpr);
1017d5d56523Sdanielk1977       }else{
1018633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1019d5d56523Sdanielk1977       }
1020b7916a78Sdrh       if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
1021094430ebSdrh     }
1022b7916a78Sdrh     A.zStart = X.zStart;
1023b7916a78Sdrh     A.zEnd = &E.z[E.n];
1024fef5208cSdrh   }
102551522cd3Sdrh   expr(A) ::= LP(B) select(X) RP(E). {
1026b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
1027b7916a78Sdrh     if( A.pExpr ){
1028b7916a78Sdrh       A.pExpr->x.pSelect = X;
1029b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
1030b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
103153f733c7Sdrh     }else{
1032633e6d57Sdrh       sqlite3SelectDelete(pParse->db, X);
103353f733c7Sdrh     }
1034b7916a78Sdrh     A.zStart = B.z;
1035b7916a78Sdrh     A.zEnd = &E.z[E.n];
103651522cd3Sdrh   }
10372e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E).  [IN] {
1038b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1039b7916a78Sdrh     if( A.pExpr ){
1040b7916a78Sdrh       A.pExpr->x.pSelect = Y;
1041b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
1042b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
104353f733c7Sdrh     }else{
1044633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
104553f733c7Sdrh     }
1046b7916a78Sdrh     if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
1047b7916a78Sdrh     A.zStart = X.zStart;
1048b7916a78Sdrh     A.zEnd = &E.z[E.n];
1049fef5208cSdrh   }
105074ad7fe9Sdrh   expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
105117435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
1052b7916a78Sdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
1053b7916a78Sdrh     if( A.pExpr ){
1054b7916a78Sdrh       A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
1055b7916a78Sdrh       ExprSetProperty(A.pExpr, EP_xIsSelect);
1056b7916a78Sdrh       sqlite3ExprSetHeight(pParse, A.pExpr);
105753f733c7Sdrh     }else{
1058633e6d57Sdrh       sqlite3SrcListDelete(pParse->db, pSrc);
105953f733c7Sdrh     }
1060b7916a78Sdrh     if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
1061b7916a78Sdrh     A.zStart = X.zStart;
1062b7916a78Sdrh     A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
106323b2db23Sdrh   }
106451522cd3Sdrh   expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
1065b7916a78Sdrh     Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
106651522cd3Sdrh     if( p ){
10676ab3a2ecSdanielk1977       p->x.pSelect = Y;
1068b7916a78Sdrh       ExprSetProperty(p, EP_xIsSelect);
1069b7916a78Sdrh       sqlite3ExprSetHeight(pParse, p);
107053f733c7Sdrh     }else{
1071633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
107251522cd3Sdrh     }
1073b7916a78Sdrh     A.zStart = B.z;
1074b7916a78Sdrh     A.zEnd = &E.z[E.n];
107551522cd3Sdrh   }
1076154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1077fef5208cSdrh 
107817a7f8ddSdrh /* CASE expressions */
107917a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
1080b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0);
1081b7916a78Sdrh   if( A.pExpr ){
1082b7916a78Sdrh     A.pExpr->x.pList = Y;
1083b7916a78Sdrh     sqlite3ExprSetHeight(pParse, A.pExpr);
108453f733c7Sdrh   }else{
1085633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
108653f733c7Sdrh   }
1087b7916a78Sdrh   A.zStart = C.z;
1088b7916a78Sdrh   A.zEnd = &E.z[E.n];
108917a7f8ddSdrh }
109017a7f8ddSdrh %type case_exprlist {ExprList*}
1091633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
109217a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
1093b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X, Y.pExpr);
1094b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
109517a7f8ddSdrh }
109617a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
1097b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0, Y.pExpr);
1098b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
109917a7f8ddSdrh }
110017a7f8ddSdrh %type case_else {Expr*}
1101633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
1102b7916a78Sdrh case_else(A) ::=  ELSE expr(X).         {A = X.pExpr;}
110317a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
110417a7f8ddSdrh %type case_operand {Expr*}
1105633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
1106b7916a78Sdrh case_operand(A) ::= expr(X).            {A = X.pExpr;}
110717a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1108348784efSdrh 
1109348784efSdrh %type exprlist {ExprList*}
1110633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
11119245c243Sdrh %type nexprlist {ExprList*}
1112633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1113348784efSdrh 
11149245c243Sdrh exprlist(A) ::= nexprlist(X).                {A = X;}
11159245c243Sdrh exprlist(A) ::= .                            {A = 0;}
111617435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y).
1117b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
111817435752Sdrh nexprlist(A) ::= expr(Y).
1119b7916a78Sdrh     {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);}
11209245c243Sdrh 
1121cce7d176Sdrh 
1122382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1123382c0247Sdrh //
1124d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
112577e96d14Sdrh         ON nm(Y) LP idxlist(Z) RP(E). {
112617435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
112717435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
11284d91a701Sdrh                       &S, &E, SQLITE_SO_ASC, NE);
11299cfcf5d4Sdrh }
1130717e6402Sdrh 
1131717e6402Sdrh %type uniqueflag {int}
11329cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
11339cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1134348784efSdrh 
11350202b29eSdanielk1977 %type idxlist {ExprList*}
1136633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);}
11370202b29eSdanielk1977 %type idxlist_opt {ExprList*}
1138633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1139348784efSdrh 
1140c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
1141c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
1142200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z).  {
11430202b29eSdanielk1977   Expr *p = 0;
11440202b29eSdanielk1977   if( C.n>0 ){
1145b7916a78Sdrh     p = sqlite3Expr(pParse->db, TK_COLUMN, 0);
11468342e49fSdrh     sqlite3ExprSetCollByToken(pParse, p, &C);
11470202b29eSdanielk1977   }
1148b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,X, p);
1149b7916a78Sdrh   sqlite3ExprListSetName(pParse,A,&Y,1);
1150b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
1151b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
11520202b29eSdanielk1977 }
1153200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). {
11540202b29eSdanielk1977   Expr *p = 0;
11550202b29eSdanielk1977   if( C.n>0 ){
115617435752Sdrh     p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
11578342e49fSdrh     sqlite3ExprSetCollByToken(pParse, p, &C);
11580202b29eSdanielk1977   }
1159b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0, p);
1160b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &Y, 1);
1161b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
1162b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
11630202b29eSdanielk1977 }
11640202b29eSdanielk1977 
1165a34001c9Sdrh %type collate {Token}
1166a34001c9Sdrh collate(C) ::= .                 {C.z = 0; C.n = 0;}
116739002505Sdanielk1977 collate(C) ::= COLLATE ids(X).   {C = X;}
1168a34001c9Sdrh 
1169348784efSdrh 
11708aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1171382c0247Sdrh //
11724d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1173982cef7eSdrh 
1174382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1175382c0247Sdrh //
1176154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1177fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
117874161705Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse);}
117974161705Sdrh cmd ::= VACUUM nm.             {sqlite3Vacuum(pParse);}
1180fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1181154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1182f57b14a6Sdrh 
1183382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1184382c0247Sdrh //
118513d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
118691cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1187ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1188ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1189ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1190ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1191ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1192ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1193ada2ee0dSdrh 
1194a3eb4b44Sdrh nmnum(A) ::= plus_num(X).             {A = X;}
1195a3eb4b44Sdrh nmnum(A) ::= nm(X).                   {A = X;}
1196ada2ee0dSdrh nmnum(A) ::= ON(X).                   {A = X;}
1197ada2ee0dSdrh nmnum(A) ::= DELETE(X).               {A = X;}
11986da861beSdrh nmnum(A) ::= DEFAULT(X).              {A = X;}
1199154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
12008395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
12018395b7b6Sdrh plus_num(A) ::= number(X).            {A = X;}
1202f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1203fd405314Sdrh number(A) ::= INTEGER|FLOAT(X).       {A = X;}
1204c3f9bad2Sdanielk1977 
1205c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1206f0f258b1Sdrh 
1207b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1208b7f9164eSdrh 
1209d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
12104b59ab5eSdrh   Token all;
12114b59ab5eSdrh   all.z = A.z;
1212b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
12134adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1214f0f258b1Sdrh }
1215f0f258b1Sdrh 
1216fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1217fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
121860218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
121960218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
12203df6b257Sdanielk1977   A = (Z.n==0?B:Z);
1221c3f9bad2Sdanielk1977 }
1222c3f9bad2Sdanielk1977 
1223c3f9bad2Sdanielk1977 %type trigger_time {int}
1224c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
1225c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
1226c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1227c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1228c3f9bad2Sdanielk1977 
1229ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1230633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1231fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP).       {A.a = @OP; A.b = 0;}
123274ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP).              {A.a = @OP; A.b = 0;}
1233c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}
1234c3f9bad2Sdanielk1977 
123560218d2aSdrh foreach_clause ::= .
123660218d2aSdrh foreach_clause ::= FOR EACH ROW.
1237c3f9bad2Sdanielk1977 
1238c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1239633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1240c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
1241b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; }
1242c3f9bad2Sdanielk1977 
1243c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1244633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
1245187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
124681238966Sdrh   assert( Y!=0 );
124781238966Sdrh   Y->pLast->pNext = X;
1248187e4c6aSdrh   Y->pLast = X;
1249187e4c6aSdrh   A = Y;
1250a69d9168Sdrh }
125181238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. {
125281238966Sdrh   assert( X!=0 );
125381238966Sdrh   X->pLast = X;
125481238966Sdrh   A = X;
125581238966Sdrh }
1256c3f9bad2Sdanielk1977 
1257b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1258b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1259b1819a0bSdrh // the same database as the table that the trigger fires on.
1260b1819a0bSdrh //
1261b1819a0bSdrh %type trnm {Token}
1262b1819a0bSdrh trnm(A) ::= nm(X).   {A = X;}
1263b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1264b1819a0bSdrh   A = X;
1265b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1266b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1267b1819a0bSdrh         "statements within triggers");
1268b1819a0bSdrh }
1269b1819a0bSdrh 
1270b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1271b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1272b1819a0bSdrh // since it is an exception to the default grammar rules.
1273b1819a0bSdrh //
1274b1819a0bSdrh tridxby ::= .
1275b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1276b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1277b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1278b1819a0bSdrh         "within triggers");
1279b1819a0bSdrh }
1280b1819a0bSdrh tridxby ::= NOT INDEXED. {
1281b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1282b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1283b1819a0bSdrh         "within triggers");
1284b1819a0bSdrh }
1285b1819a0bSdrh 
1286b1819a0bSdrh 
1287b1819a0bSdrh 
1288c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1289633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1290c3f9bad2Sdanielk1977 // UPDATE
1291b1819a0bSdrh trigger_cmd(A) ::=
1292b1819a0bSdrh    UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z).
129317435752Sdrh    { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); }
1294c3f9bad2Sdanielk1977 
1295c3f9bad2Sdanielk1977 // INSERT
1296b1819a0bSdrh trigger_cmd(A) ::=
12977b113babSdrh    insert_cmd(R) INTO trnm(X) inscollist_opt(F) valuelist(Y).
12987b113babSdrh    {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y.pList, Y.pSelect, R);}
1299c3f9bad2Sdanielk1977 
1300b1819a0bSdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S).
130117435752Sdrh                {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);}
1302c3f9bad2Sdanielk1977 
1303c3f9bad2Sdanielk1977 // DELETE
1304b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y).
130517435752Sdrh                {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
1306c3f9bad2Sdanielk1977 
1307c3f9bad2Sdanielk1977 // SELECT
130817435752Sdrh trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(pParse->db, X); }
1309c3f9bad2Sdanielk1977 
13106f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
13114b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
1312b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
1313b7916a78Sdrh   if( A.pExpr ){
1314b7916a78Sdrh     A.pExpr->affinity = OE_Ignore;
13154b59ab5eSdrh   }
1316b7916a78Sdrh   A.zStart = X.z;
1317b7916a78Sdrh   A.zEnd = &Y.z[Y.n];
13188aa34ae0Sdrh }
131974ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y).  {
1320b7916a78Sdrh   A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z);
1321b7916a78Sdrh   if( A.pExpr ) {
1322b7916a78Sdrh     A.pExpr->affinity = (char)T;
13234b59ab5eSdrh   }
1324b7916a78Sdrh   A.zStart = X.z;
1325b7916a78Sdrh   A.zEnd = &Y.z[Y.n];
13268aa34ae0Sdrh }
1327154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1328b7f9164eSdrh 
132974ad7fe9Sdrh %type raisetype {int}
133074ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
133174ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
133274ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
133374ad7fe9Sdrh 
13346f34903eSdanielk1977 
1335c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1336b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1337fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1338fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1339c3f9bad2Sdanielk1977 }
1340154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1341113088ecSdrh 
1342113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1343fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1344f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
1345b7916a78Sdrh   sqlite3Attach(pParse, F.pExpr, D.pExpr, K);
13461c2d8414Sdrh }
1347fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
1348b7916a78Sdrh   sqlite3Detach(pParse, D.pExpr);
1349fdbcdee5Sdrh }
1350fdbcdee5Sdrh 
1351f744bb56Sdanielk1977 %type key_opt {Expr*}
1352633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1353f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
1354b7916a78Sdrh key_opt(A) ::= KEY expr(X).          { A = X.pExpr; }
1355113088ecSdrh 
1356113088ecSdrh database_kw_opt ::= DATABASE.
1357113088ecSdrh database_kw_opt ::= .
1358fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
13594343fea2Sdrh 
13604343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
13614343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
13624343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
13634343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1364154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
13659fd2a9a0Sdanielk1977 
13669f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
13679f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
13689f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
13699f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
13709f18e8a0Sdrh %endif
13719f18e8a0Sdrh 
13729fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
13739fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
13749fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
13759fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
13769fd2a9a0Sdanielk1977 }
137719a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). {
137819a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
137919a8e7e8Sdanielk1977 }
138019a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
1381d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
138219a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
138319a8e7e8Sdanielk1977 }
138419a8e7e8Sdanielk1977 kwcolumn_opt ::= .
138519a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1386154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1387e09daa90Sdrh 
1388e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1389e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1390b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1391b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1392b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1393b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1394b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1395b9bb7c18Sdrh }
1396e09daa90Sdrh vtabarglist ::= vtabarg.
1397e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1398b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1399b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1400b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1401b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1402b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1403b9bb7c18Sdrh anylist ::= .
1404aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1405aaac8b4eSdrh anylist ::= anylist ANY.
1406154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
1407