xref: /sqlite-3.40.0/src/parse.y (revision aaac8b4e)
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*aaac8b4eSdrh ** @(#) $Id: parse.y,v 1.276 2009/05/11 18:22:31 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 /*
57ad3cab52Sdrh ** An instance of this structure holds information about the
58ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
599bbca4c1Sdrh */
60ad3cab52Sdrh struct LimitVal {
61a2dc3b1aSdanielk1977   Expr *pLimit;    /* The LIMIT expression.  NULL if there is no limit */
62a2dc3b1aSdanielk1977   Expr *pOffset;   /* The OFFSET expression.  NULL if there is none */
63ad3cab52Sdrh };
64c3f9bad2Sdanielk1977 
65c3f9bad2Sdanielk1977 /*
662e3a1f16Sdrh ** An instance of this structure is used to store the LIKE,
672e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators.
682e3a1f16Sdrh */
692e3a1f16Sdrh struct LikeOp {
70b52076cdSdrh   Token eOperator;  /* "like" or "glob" or "regexp" */
712e3a1f16Sdrh   int not;         /* True if the NOT keyword is present */
722e3a1f16Sdrh };
732e3a1f16Sdrh 
742e3a1f16Sdrh /*
75ad3cab52Sdrh ** An instance of the following structure describes the event of a
76ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
77ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
78ad3cab52Sdrh **
79ad3cab52Sdrh **      UPDATE ON (a,b,c)
80ad3cab52Sdrh **
81ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
82c3f9bad2Sdanielk1977 */
83ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
84caec2f12Sdrh 
8525d6543dSdrh /*
8625d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type.
8725d6543dSdrh */
8825d6543dSdrh struct AttachKey { int type;  Token key; };
8925d6543dSdrh 
90caec2f12Sdrh } // end %include
91348784efSdrh 
92826fb5a3Sdrh // Input is a single SQL command
93c4a3c779Sdrh input ::= cmdlist.
94094b2bbfSdrh cmdlist ::= cmdlist ecmd.
95826fb5a3Sdrh cmdlist ::= ecmd.
96b7f9164eSdrh ecmd ::= SEMI.
97b7f9164eSdrh ecmd ::= explain cmdx SEMI.
984adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
99b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
100b7f9164eSdrh explain ::= EXPLAIN.              { sqlite3BeginParse(pParse, 1); }
101ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN.   { sqlite3BeginParse(pParse, 2); }
102154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
103200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
104348784efSdrh 
105382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
106c4a3c779Sdrh //
107fa86c412Sdrh 
108684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
109c4a3c779Sdrh trans_opt ::= .
110c4a3c779Sdrh trans_opt ::= TRANSACTION.
1115ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
112684917c2Sdrh %type transtype {int}
113684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
114684917c2Sdrh transtype(A) ::= DEFERRED(X).  {A = @X;}
115684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;}
116684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;}
1174adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
1184adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
1194adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
120c4a3c779Sdrh 
121fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
122fd7f0452Sdanielk1977 savepoint_opt ::= .
123fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
124fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
125fd7f0452Sdanielk1977 }
126fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
127fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
128fd7f0452Sdanielk1977 }
129fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
130fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
131fd7f0452Sdanielk1977 }
132fd7f0452Sdanielk1977 
133382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
134348784efSdrh //
135348784efSdrh cmd ::= create_table create_table_args.
136d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
137f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
138969fa7c1Sdrh }
139d9da78a2Sdrh createkw(A) ::= CREATE(X).  {
140d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
141d9da78a2Sdrh   A = X;
142d9da78a2Sdrh }
143faa59554Sdrh %type ifnotexists {int}
144faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
145faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
146f57b3399Sdrh %type temp {int}
14753c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
148d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
149154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
150d24cc427Sdrh temp(A) ::= .      {A = 0;}
15119a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). {
15219a8e7e8Sdanielk1977   sqlite3EndTable(pParse,&X,&Y,0);
153969fa7c1Sdrh }
154969fa7c1Sdrh create_table_args ::= AS select(S). {
15519a8e7e8Sdanielk1977   sqlite3EndTable(pParse,0,0,S);
156633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
157969fa7c1Sdrh }
158348784efSdrh columnlist ::= columnlist COMMA column.
159348784efSdrh columnlist ::= column.
160348784efSdrh 
161487e262fSdrh // A "column" is a complete description of a single column in a
162487e262fSdrh // CREATE TABLE statement.  This includes the column name, its
163487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES,
164487e262fSdrh // NOT NULL and so forth.
165348784efSdrh //
16619a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. {
16719a8e7e8Sdanielk1977   A.z = X.z;
168b27b7f5dSdrh   A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n;
16924fb627aSdrh   A.quoted = 0;
17024fb627aSdrh   A.dyn = 0;
17119a8e7e8Sdanielk1977 }
17219a8e7e8Sdanielk1977 columnid(A) ::= nm(X). {
17319a8e7e8Sdanielk1977   sqlite3AddColumn(pParse,&X);
17419a8e7e8Sdanielk1977   A = X;
17519a8e7e8Sdanielk1977 }
17619a8e7e8Sdanielk1977 
177c4a3c779Sdrh 
178c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
179c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
180c4a3c779Sdrh //
181982cef7eSdrh %type id {Token}
182f18543caSdrh id(A) ::= ID(X).         {A = X;}
183296a483cSdrh id(A) ::= INDEXED(X).    {A = X;}
1840bd1f4eaSdrh 
18534e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
18634e33bb8Sdrh // fallback to ID if they will not parse as their original value.
18734e33bb8Sdrh // This obviates the need for the "id" nonterminal.
18834e33bb8Sdrh //
1890bd1f4eaSdrh %fallback ID
190db15bcd5Sdrh   ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW CONFLICT
191684917c2Sdrh   DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
192ca5557f9Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN
193db15bcd5Sdrh   QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK
19478c2e6d8Sdanielk1977   SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL
195b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
196b7f9164eSdrh   EXCEPT INTERSECT UNION
197154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
198a073384fSdrh   REINDEX RENAME CTIME_KW IF
199b7f9164eSdrh   .
200e09daa90Sdrh %wildcard ANY.
201c4a3c779Sdrh 
2022d3917daSdrh // Define operator precedence early so that this is the first occurance
2032d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2042d3917daSdrh // causes them to be assigned integer values that are close together,
2052d3917daSdrh // which keeps parser tables smaller.
2062d3917daSdrh //
207f2bc013cSdrh // The token values assigned to these symbols is determined by the order
208f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
209f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
210f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
211f2bc013cSdrh // constraint.
212f2bc013cSdrh //
2132d3917daSdrh %left OR.
2142d3917daSdrh %left AND.
2152d3917daSdrh %right NOT.
21603bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2179a43267bSdrh %left GT LE LT GE.
2187c6303c0Sdanielk1977 %right ESCAPE.
2192d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2202d3917daSdrh %left PLUS MINUS.
2212d3917daSdrh %left STAR SLASH REM.
222a34001c9Sdrh %left CONCAT.
223a34001c9Sdrh %left COLLATE.
2242d3917daSdrh %right UMINUS UPLUS BITNOT.
2252d3917daSdrh 
226c4a3c779Sdrh // And "ids" is an identifer-or-string.
227c4a3c779Sdrh //
228c4a3c779Sdrh %type ids {Token}
229fd405314Sdrh ids(A) ::= ID|STRING(X).   {A = X;}
230c4a3c779Sdrh 
2315ad1a6c8Sdrh // The name of a column or table can be any of the following:
2325ad1a6c8Sdrh //
2335ad1a6c8Sdrh %type nm {Token}
234296a483cSdrh nm(A) ::= id(X).         {A = X;}
2355ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
2365ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
2375ad1a6c8Sdrh 
238487e262fSdrh // A typetoken is really one or more tokens that form a type name such
239487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
240487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
241487e262fSdrh //
242487e262fSdrh %type typetoken {Token}
243382c0247Sdrh type ::= .
244487e262fSdrh type ::= typetoken(X).                   {sqlite3AddColumnType(pParse,&X);}
245487e262fSdrh typetoken(A) ::= typename(X).   {A = X;}
246487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). {
247487e262fSdrh   A.z = X.z;
248b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
249487e262fSdrh }
250487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). {
251487e262fSdrh   A.z = X.z;
252b27b7f5dSdrh   A.n = (int)(&Y.z[Y.n] - X.z);
253487e262fSdrh }
254382c0247Sdrh %type typename {Token}
255382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
256b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);}
25760218d2aSdrh signed ::= plus_num.
25860218d2aSdrh signed ::= minus_num.
259487e262fSdrh 
260487e262fSdrh // "carglist" is a list of additional constraints that come after the
261487e262fSdrh // column name and column type in a CREATE TABLE statement.
262487e262fSdrh //
263348784efSdrh carglist ::= carglist carg.
264348784efSdrh carglist ::= .
2655ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
266348784efSdrh carg ::= ccons.
2672b7acc35Sdrh ccons ::= DEFAULT term(X).            {sqlite3AddDefaultValue(pParse,X);}
2682b7acc35Sdrh ccons ::= DEFAULT LP expr(X) RP.      {sqlite3AddDefaultValue(pParse,X);}
2692b7acc35Sdrh ccons ::= DEFAULT PLUS term(X).       {sqlite3AddDefaultValue(pParse,X);}
270f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X).      {
27117435752Sdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0);
272f96a3778Sdanielk1977   sqlite3ExprSpan(p,&A,&X->span);
2737977a17fSdanielk1977   sqlite3AddDefaultValue(pParse,p);
2747977a17fSdanielk1977 }
2752b7acc35Sdrh ccons ::= DEFAULT id(X).              {
27617435752Sdrh   Expr *p = sqlite3PExpr(pParse, TK_STRING, 0, 0, &X);
2777977a17fSdanielk1977   sqlite3AddDefaultValue(pParse,p);
2787977a17fSdanielk1977 }
279348784efSdrh 
280382c0247Sdrh // In addition to the type name, we also care about the primary key and
281382c0247Sdrh // UNIQUE constraints.
282348784efSdrh //
2830d316a40Sdrh ccons ::= NULL onconf.
2844adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).               {sqlite3AddNotNull(pParse, R);}
285fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
286fdd6e85aSdrh                                      {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
2874d91a701Sdrh ccons ::= UNIQUE onconf(R).    {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);}
288ffe07b2dSdrh ccons ::= CHECK LP expr(X) RP.       {sqlite3AddCheckConstraint(pParse,X);}
289c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
2904adee20fSdanielk1977                                 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
2914adee20fSdanielk1977 ccons ::= defer_subclause(D).   {sqlite3DeferForeignKey(pParse,D);}
29239002505Sdanielk1977 ccons ::= COLLATE ids(C).  {sqlite3AddCollateType(pParse, &C);}
29304738cb9Sdrh 
294205f48e6Sdrh // The optional AUTOINCREMENT keyword
295205f48e6Sdrh %type autoinc {int}
296205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
2972958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
298205f48e6Sdrh 
299c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
300c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
301c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
302c2eef3b3Sdrh // check fails.
30304738cb9Sdrh //
304c2eef3b3Sdrh %type refargs {int}
305c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
30650af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; }
307c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
308c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
309c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
310c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
311c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
312c2eef3b3Sdrh %type refact {int}
313c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
314c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
315c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
316c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
317c2eef3b3Sdrh %type defer_subclause {int}
318c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
319c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
320c2eef3b3Sdrh %type init_deferred_pred_opt {int}
321c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
322c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
323c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
324348784efSdrh 
325348784efSdrh // For the time being, the only constraint we care about is the primary
326382c0247Sdrh // key and UNIQUE.  Both create indices.
327348784efSdrh //
32819a8e7e8Sdanielk1977 conslist_opt(A) ::= .                   {A.n = 0; A.z = 0;}
32919a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist.  {A = X;}
330348784efSdrh conslist ::= conslist COMMA tcons.
331a2e1bb5aSdrh conslist ::= conslist tcons.
332348784efSdrh conslist ::= tcons.
3335ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
334f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R).
335fdd6e85aSdrh                                          {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
3369cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
3374d91a701Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);}
338e72e728bSdrh tcons ::= CHECK LP expr(E) RP onconf. {sqlite3AddCheckConstraint(pParse,E);}
339c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
340c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3414adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3424adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
343c2eef3b3Sdrh }
344c2eef3b3Sdrh %type defer_subclause_opt {int}
345c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
346c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
3479cfcf5d4Sdrh 
3489cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3499cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3509cfcf5d4Sdrh //
3519cfcf5d4Sdrh %type onconf {int}
3521c92853dSdrh %type orconf {int}
3531c92853dSdrh %type resolvetype {int}
3541c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
3551c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
3561c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
3571c92853dSdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
35874ad7fe9Sdrh resolvetype(A) ::= raisetype(X).             {A = X;}
3591c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
3601c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
361348784efSdrh 
362382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
363348784efSdrh //
364a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
365a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
366a8858103Sdanielk1977 }
367a073384fSdrh %type ifexists {int}
368a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
369a073384fSdrh ifexists(A) ::= .            {A = 0;}
370348784efSdrh 
371a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
372a76b5dfcSdrh //
373b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
374d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). {
375fdd48a76Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E);
376a76b5dfcSdrh }
377a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
378a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
379a76b5dfcSdrh }
380154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
381a76b5dfcSdrh 
382382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
383348784efSdrh //
3849bb61fe7Sdrh cmd ::= select(X).  {
3857d10d5a6Sdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0};
3867d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
387633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
3889bb61fe7Sdrh }
389efb7251dSdrh 
3909bb61fe7Sdrh %type select {Select*}
391633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
39282c3d636Sdrh %type oneselect {Select*}
393633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
3949bb61fe7Sdrh 
39582c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
396b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
3970a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
398daffd0e5Sdrh   if( Z ){
399b27b7f5dSdrh     Z->op = (u8)Y;
40082c3d636Sdrh     Z->pPrior = X;
40143b78826Sdrh   }else{
402633e6d57Sdrh     sqlite3SelectDelete(pParse->db, X);
403daffd0e5Sdrh   }
40482c3d636Sdrh   A = Z;
40582c3d636Sdrh }
4060a36c57eSdrh %type multiselect_op {int}
40774ad7fe9Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP;}
4080a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
409fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP;}
410154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
41182c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
4129bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
41317435752Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
4149bb61fe7Sdrh }
4159bb61fe7Sdrh 
4169bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
4179bb61fe7Sdrh // present and false (0) if it is not.
4189bb61fe7Sdrh //
419efb7251dSdrh %type distinct {int}
420efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
421fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
422efb7251dSdrh distinct(A) ::= .           {A = 0;}
423348784efSdrh 
4249bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
4257c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
4267c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
4277c917d19Sdrh // opcode of TK_ALL.
4289bb61fe7Sdrh //
429348784efSdrh %type selcollist {ExprList*}
430633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
431348784efSdrh %type sclp {ExprList*}
432633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
433348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
434348784efSdrh sclp(A) ::= .                                {A = 0;}
43501f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
43617435752Sdrh    A = sqlite3ExprListAppend(pParse,P,X,Y.n?&Y:0);
43701f3f253Sdrh }
4387c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
4391e536953Sdanielk1977   Expr *p = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0);
44017435752Sdrh   A = sqlite3ExprListAppend(pParse, P, p, 0);
4417c917d19Sdrh }
442e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). {
443e54a62adSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y);
44417435752Sdrh   Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
44517435752Sdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
44617435752Sdrh   A = sqlite3ExprListAppend(pParse,P, pDot, 0);
44754473229Sdrh }
44801f3f253Sdrh 
44901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
45001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
45101f3f253Sdrh //
45201f3f253Sdrh %type as {Token}
4535ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
4545ad1a6c8Sdrh as(X) ::= ids(Y).      {X = Y;}
45501f3f253Sdrh as(X) ::= .            {X.n = 0;}
4569bb61fe7Sdrh 
457348784efSdrh 
458ad3cab52Sdrh %type seltablist {SrcList*}
459633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
460ad3cab52Sdrh %type stl_prefix {SrcList*}
461633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
462ad3cab52Sdrh %type from {SrcList*}
463633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
464348784efSdrh 
46501f3f253Sdrh // A complete FROM clause.
46601f3f253Sdrh //
46717435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
46861dfc31dSdrh from(A) ::= FROM seltablist(X). {
46961dfc31dSdrh   A = X;
47061dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
47161dfc31dSdrh }
47201f3f253Sdrh 
47301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
47401f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
47501f3f253Sdrh //
47601f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
47701f3f253Sdrh    A = X;
478b27b7f5dSdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = (u8)Y;
47901f3f253Sdrh }
480348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
48185574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). {
482b1c685b0Sdanielk1977   A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
483b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
48401f3f253Sdrh }
48551522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
486fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP select(S) RP
487b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
488b1c685b0Sdanielk1977     A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U);
48922f70c32Sdrh   }
490fbdc7f69Sdrh   seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP
491fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
492fbdc7f69Sdrh     if( X==0 && Z.n==0 && N==0 && U==0 ){
493fbdc7f69Sdrh       A = F;
494fbdc7f69Sdrh     }else{
495fbdc7f69Sdrh       Select *pSubquery;
496fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
497fbdc7f69Sdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
498fbdc7f69Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U);
499fbdc7f69Sdrh     }
500fbdc7f69Sdrh   }
501348784efSdrh 
502b733d037Sdrh   // A seltablist_paren nonterminal represents anything in a FROM that
503b733d037Sdrh   // is contained inside parentheses.  This can be either a subquery or
504b733d037Sdrh   // a grouping of table and subqueries.
505b733d037Sdrh   //
506fbdc7f69Sdrh //  %type seltablist_paren {Select*}
507fbdc7f69Sdrh //  %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);}
508fbdc7f69Sdrh //  seltablist_paren(A) ::= select(S).      {A = S;}
509fbdc7f69Sdrh //  seltablist_paren(A) ::= seltablist(F).  {
510fbdc7f69Sdrh //     sqlite3SrcListShiftJoinType(F);
511fbdc7f69Sdrh //     A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
512fbdc7f69Sdrh //  }
513154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
514b733d037Sdrh 
515113088ecSdrh %type dbnm {Token}
516113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
517113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
518113088ecSdrh 
51974ad7fe9Sdrh %type fullname {SrcList*}
520633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
52117435752Sdrh fullname(A) ::= nm(X) dbnm(Y).  {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);}
52274ad7fe9Sdrh 
52301f3f253Sdrh %type joinop {int}
52401f3f253Sdrh %type joinop2 {int}
525fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
5264adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
5274adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
5285ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
5294adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
53001f3f253Sdrh 
53101f3f253Sdrh %type on_opt {Expr*}
532633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
53301f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
53401f3f253Sdrh on_opt(N) ::= .             {N = 0;}
53501f3f253Sdrh 
53685574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
53785574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
53885574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
53985574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
54085574e31Sdanielk1977 // in the token.
54185574e31Sdanielk1977 //
54285574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
543b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
54485574e31Sdanielk1977 // recognizes and interprets this as a special case.
54585574e31Sdanielk1977 //
54685574e31Sdanielk1977 %type indexed_opt {Token}
54785574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
54885574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
54985574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
55085574e31Sdanielk1977 
55101f3f253Sdrh %type using_opt {IdList*}
552633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
5530202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP.  {U = L;}
55401f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
55501f3f253Sdrh 
55601f3f253Sdrh 
557348784efSdrh %type orderby_opt {ExprList*}
558633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
559348784efSdrh %type sortlist {ExprList*}
560633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
561348784efSdrh %type sortitem {Expr*}
562633e6d57Sdrh %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);}
563348784efSdrh 
564348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
565348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
5668b4c40d8Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). {
56717435752Sdrh   A = sqlite3ExprListAppend(pParse,X,Y,0);
568b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
569348784efSdrh }
5708b4c40d8Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). {
57117435752Sdrh   A = sqlite3ExprListAppend(pParse,0,Y,0);
572b27b7f5dSdrh   if( A && A->a ) A->a[0].sortOrder = (u8)Z;
573348784efSdrh }
574da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
575348784efSdrh 
576348784efSdrh %type sortorder {int}
577348784efSdrh 
5788e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
5798e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
5808e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
581348784efSdrh 
5822282792aSdrh %type groupby_opt {ExprList*}
583633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
5842282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
5859245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
5862282792aSdrh 
5872282792aSdrh %type having_opt {Expr*}
588633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
5892282792aSdrh having_opt(A) ::= .                {A = 0;}
5902282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
5912282792aSdrh 
592ad3cab52Sdrh %type limit_opt {struct LimitVal}
59315926590Sdrh 
59415926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
59515926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
59615926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
59715926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
59815926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
59915926590Sdrh // except as a transient.  So there is never anything to destroy.
60015926590Sdrh //
60115926590Sdrh //%destructor limit_opt {
602633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pLimit);
603633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pOffset);
60415926590Sdrh //}
605a2dc3b1aSdanielk1977 limit_opt(A) ::= .                     {A.pLimit = 0; A.pOffset = 0;}
606a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X).        {A.pLimit = X; A.pOffset = 0;}
607a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
608a2dc3b1aSdanielk1977                                        {A.pLimit = X; A.pOffset = Y;}
609a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
610a2dc3b1aSdanielk1977                                        {A.pOffset = X; A.pLimit = Y;}
6119bbca4c1Sdrh 
612382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
613382c0247Sdrh //
614273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
615931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
616931577f1Sdrh         orderby_opt(O) limit_opt(L). {
617b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
61849ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
6194281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6204281bd42Sshane }
6214281bd42Sshane %endif
622273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6234281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
6244281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6254281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
6264281bd42Sshane }
6274281bd42Sshane %endif
628348784efSdrh 
629348784efSdrh %type where_opt {Expr*}
630633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
631348784efSdrh 
632348784efSdrh where_opt(A) ::= .                    {A = 0;}
633348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
634348784efSdrh 
635382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
636382c0247Sdrh //
637273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6384281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L).  {
639b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
640b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
64149ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
6424281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6434281bd42Sshane }
6444281bd42Sshane %endif
645273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
6464281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W).  {
6474281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
6484281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
6494281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
6504281bd42Sshane }
6514281bd42Sshane %endif
652348784efSdrh 
653f8db1bc0Sdrh %type setlist {ExprList*}
654633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
655f8db1bc0Sdrh 
6565ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
65717435752Sdrh     {A = sqlite3ExprListAppend(pParse,Z,Y,&X);}
65817435752Sdrh setlist(A) ::= nm(X) EQ expr(Y).
65917435752Sdrh     {A = sqlite3ExprListAppend(pParse,0,Y,&X);}
660348784efSdrh 
661382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
662382c0247Sdrh //
66374ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F)
664113088ecSdrh         VALUES LP itemlist(Y) RP.
66574ad7fe9Sdrh             {sqlite3Insert(pParse, X, Y, 0, F, R);}
66674ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
66774ad7fe9Sdrh             {sqlite3Insert(pParse, X, 0, S, F, R);}
668147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES.
669147d0cccSdrh             {sqlite3Insert(pParse, X, 0, 0, F, R);}
670348784efSdrh 
671fa86c412Sdrh %type insert_cmd {int}
672fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
673fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
674fa86c412Sdrh 
675348784efSdrh 
676348784efSdrh %type itemlist {ExprList*}
677633e6d57Sdrh %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);}
678348784efSdrh 
67917435752Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).
68017435752Sdrh     {A = sqlite3ExprListAppend(pParse,X,Y,0);}
68117435752Sdrh itemlist(A) ::= expr(X).
68217435752Sdrh     {A = sqlite3ExprListAppend(pParse,0,X,0);}
683348784efSdrh 
684967e8b73Sdrh %type inscollist_opt {IdList*}
685633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);}
686967e8b73Sdrh %type inscollist {IdList*}
687633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);}
688348784efSdrh 
689967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
690967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
69117435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y).
69217435752Sdrh     {A = sqlite3IdListAppend(pParse->db,X,&Y);}
69317435752Sdrh inscollist(A) ::= nm(Y).
69417435752Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y);}
695348784efSdrh 
696382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
697382c0247Sdrh //
698348784efSdrh 
699348784efSdrh %type expr {Expr*}
700633e6d57Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
7017977a17fSdanielk1977 %type term {Expr*}
702633e6d57Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
703348784efSdrh 
7047977a17fSdanielk1977 expr(A) ::= term(X).             {A = X;}
705752e679aSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); }
70617435752Sdrh term(A) ::= NULL(X).             {A = sqlite3PExpr(pParse, @X, 0, 0, &X);}
707296a483cSdrh expr(A) ::= id(X).               {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);}
70817435752Sdrh expr(A) ::= JOIN_KW(X).          {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);}
7095ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
71017435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
71117435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
71217435752Sdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
713e1b6a5b8Sdrh }
714d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
71517435752Sdrh   Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
71617435752Sdrh   Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
71717435752Sdrh   Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z);
71817435752Sdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
71917435752Sdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
720d24cc427Sdrh }
72117435752Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X).  {A = sqlite3PExpr(pParse, @X, 0, 0, &X);}
72217435752Sdrh term(A) ::= STRING(X).       {A = sqlite3PExpr(pParse, @X, 0, 0, &X);}
7234e0cff60Sdrh expr(A) ::= REGISTER(X).     {A = sqlite3RegisterExpr(pParse, &X);}
7247c972decSdrh expr(A) ::= VARIABLE(X).     {
725895d7472Sdrh   Token *pToken = &X;
72617435752Sdrh   Expr *pExpr = A = sqlite3PExpr(pParse, TK_VARIABLE, 0, 0, pToken);
727fa6bc000Sdrh   sqlite3ExprAssignVarNumber(pParse, pExpr);
728895d7472Sdrh }
72939002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). {
7308b4c40d8Sdrh   A = sqlite3ExprSetColl(pParse, E, &C);
7318b4c40d8Sdrh }
732487e262fSdrh %ifndef SQLITE_OMIT_CAST
733487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
73417435752Sdrh   A = sqlite3PExpr(pParse, TK_CAST, E, 0, &T);
735487e262fSdrh   sqlite3ExprSpan(A,&X,&Y);
736487e262fSdrh }
737154d4b24Sdrh %endif  SQLITE_OMIT_CAST
738fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). {
739c9cf901dSdanielk1977   if( Y && Y->nExpr>SQLITE_MAX_FUNCTION_ARG ){
740e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
7414e05c83bSdrh   }
74217435752Sdrh   A = sqlite3ExprFunction(pParse, Y, &X);
7434adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
7448aa34ae0Sdrh   if( D && A ){
745fd357974Sdrh     A->flags |= EP_Distinct;
746fd357974Sdrh   }
747e1b6a5b8Sdrh }
748e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
74917435752Sdrh   A = sqlite3ExprFunction(pParse, 0, &X);
7504adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
751e1b6a5b8Sdrh }
752b71090fdSdrh term(A) ::= CTIME_KW(OP). {
753b71090fdSdrh   /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are
754b71090fdSdrh   ** treated as functions that return constants */
75517435752Sdrh   A = sqlite3ExprFunction(pParse, 0,&OP);
756417ec638Sdrh   if( A ){
757417ec638Sdrh     A->op = TK_CONST_FUNC;
758417ec638Sdrh     A->span = OP;
759417ec638Sdrh   }
760b71090fdSdrh }
76117435752Sdrh expr(A) ::= expr(X) AND(OP) expr(Y).       {A = sqlite3PExpr(pParse,@OP,X,Y,0);}
76217435752Sdrh expr(A) ::= expr(X) OR(OP) expr(Y).        {A = sqlite3PExpr(pParse,@OP,X,Y,0);}
76317435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y).
76417435752Sdrh                                            {A = sqlite3PExpr(pParse,@OP,X,Y,0);}
76517435752Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y).     {A = sqlite3PExpr(pParse,@OP,X,Y,0);}
766fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
76717435752Sdrh                                            {A = sqlite3PExpr(pParse,@OP,X,Y,0);}
76817435752Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).{A = sqlite3PExpr(pParse,@OP,X,Y,0);}
76917435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y).
77017435752Sdrh                                            {A = sqlite3PExpr(pParse,@OP,X,Y,0);}
77117435752Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y).    {A = sqlite3PExpr(pParse,@OP,X,Y,0);}
77274ad7fe9Sdrh %type likeop {struct LikeOp}
773b52076cdSdrh likeop(A) ::= LIKE_KW(X).     {A.eOperator = X; A.not = 0;}
774b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;}
77503bea70cSdrh likeop(A) ::= MATCH(X).       {A.eOperator = X; A.not = 0;}
77603bea70cSdrh likeop(A) ::= NOT MATCH(X).   {A.eOperator = X; A.not = 1;}
7777c6303c0Sdanielk1977 %type escape {Expr*}
778633e6d57Sdrh %destructor escape {sqlite3ExprDelete(pParse->db, $$);}
7797c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;}
7807c6303c0Sdanielk1977 escape(X) ::= .               [ESCAPE] {X = 0;}
781b71090fdSdrh expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E).  [LIKE_KW]  {
7828aa34ae0Sdrh   ExprList *pList;
78317435752Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y, 0);
78417435752Sdrh   pList = sqlite3ExprListAppend(pParse,pList, X, 0);
7857c6303c0Sdanielk1977   if( E ){
78617435752Sdrh     pList = sqlite3ExprListAppend(pParse,pList, E, 0);
7877c6303c0Sdanielk1977   }
78817435752Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
78917435752Sdrh   if( OP.not ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0);
7904adee20fSdanielk1977   sqlite3ExprSpan(A, &X->span, &Y->span);
7916a03a1c5Sdrh   if( A ) A->flags |= EP_InfixFunc;
7920ac65892Sdrh }
7937c6303c0Sdanielk1977 
794fd405314Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). {
79517435752Sdrh   A = sqlite3PExpr(pParse, @E, X, 0, 0);
7964adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
797e1b6a5b8Sdrh }
79833048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
79917435752Sdrh   A = sqlite3PExpr(pParse, TK_ISNULL, X, 0, 0);
8004adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
80133048c0bSdrh }
80233048c0bSdrh expr(A) ::= expr(X) NOT NULL(E). {
80317435752Sdrh   A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0);
8044adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
80533048c0bSdrh }
80681a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
80717435752Sdrh   A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0);
8084adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
80981a20f21Sdrh }
810e9cf59e3Sdrh expr(A) ::= NOT(B) expr(X). {
811e9cf59e3Sdrh   A = sqlite3PExpr(pParse, @B, X, 0, 0);
812e9cf59e3Sdrh   sqlite3ExprSpan(A,&B,&X->span);
813e9cf59e3Sdrh }
814e9cf59e3Sdrh expr(A) ::= BITNOT(B) expr(X). {
81517435752Sdrh   A = sqlite3PExpr(pParse, @B, X, 0, 0);
8164adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
81781a20f21Sdrh }
818e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
81917435752Sdrh   A = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0);
8204adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
821e1b6a5b8Sdrh }
8224b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
82317435752Sdrh   A = sqlite3PExpr(pParse, TK_UPLUS, X, 0, 0);
8244adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
825e1b6a5b8Sdrh }
8262e3a1f16Sdrh %type between_op {int}
8272e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
8282e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
8292e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
83017435752Sdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X, 0);
83117435752Sdrh   pList = sqlite3ExprListAppend(pParse,pList, Y, 0);
83217435752Sdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, W, 0, 0);
83353f733c7Sdrh   if( A ){
8346ab3a2ecSdanielk1977     A->x.pList = pList;
83553f733c7Sdrh   }else{
836633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
83753f733c7Sdrh   }
83817435752Sdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0);
8394adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
840fef5208cSdrh }
8413e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
8422e3a1f16Sdrh   %type in_op {int}
8432e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
8442e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
8452e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
84617435752Sdrh     A = sqlite3PExpr(pParse, TK_IN, X, 0, 0);
847d5d56523Sdanielk1977     if( A ){
8486ab3a2ecSdanielk1977       A->x.pList = Y;
8494b5255acSdanielk1977       sqlite3ExprSetHeight(pParse, A);
850d5d56523Sdanielk1977     }else{
851633e6d57Sdrh       sqlite3ExprListDelete(pParse->db, Y);
852d5d56523Sdanielk1977     }
85317435752Sdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0);
8544adee20fSdanielk1977     sqlite3ExprSpan(A,&X->span,&E);
855fef5208cSdrh   }
85651522cd3Sdrh   expr(A) ::= LP(B) select(X) RP(E). {
85717435752Sdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
85853f733c7Sdrh     if( A ){
8596ab3a2ecSdanielk1977       A->x.pSelect = X;
8606ab3a2ecSdanielk1977       ExprSetProperty(A, EP_xIsSelect);
8614b5255acSdanielk1977       sqlite3ExprSetHeight(pParse, A);
86253f733c7Sdrh     }else{
863633e6d57Sdrh       sqlite3SelectDelete(pParse->db, X);
86453f733c7Sdrh     }
86551522cd3Sdrh     sqlite3ExprSpan(A,&B,&E);
86651522cd3Sdrh   }
8672e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E).  [IN] {
86817435752Sdrh     A = sqlite3PExpr(pParse, TK_IN, X, 0, 0);
86953f733c7Sdrh     if( A ){
8706ab3a2ecSdanielk1977       A->x.pSelect = Y;
8716ab3a2ecSdanielk1977       ExprSetProperty(A, EP_xIsSelect);
8724b5255acSdanielk1977       sqlite3ExprSetHeight(pParse, A);
87353f733c7Sdrh     }else{
874633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
87553f733c7Sdrh     }
87617435752Sdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0);
8774adee20fSdanielk1977     sqlite3ExprSpan(A,&X->span,&E);
878fef5208cSdrh   }
87974ad7fe9Sdrh   expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
88017435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
88117435752Sdrh     A = sqlite3PExpr(pParse, TK_IN, X, 0, 0);
88253f733c7Sdrh     if( A ){
8836ab3a2ecSdanielk1977       A->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
8846ab3a2ecSdanielk1977       ExprSetProperty(A, EP_xIsSelect);
8854b5255acSdanielk1977       sqlite3ExprSetHeight(pParse, A);
88653f733c7Sdrh     }else{
887633e6d57Sdrh       sqlite3SrcListDelete(pParse->db, pSrc);
88853f733c7Sdrh     }
88917435752Sdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0);
89074ad7fe9Sdrh     sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y);
89123b2db23Sdrh   }
89251522cd3Sdrh   expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
89317435752Sdrh     Expr *p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
89451522cd3Sdrh     if( p ){
8956ab3a2ecSdanielk1977       p->x.pSelect = Y;
8966ab3a2ecSdanielk1977       ExprSetProperty(A, EP_xIsSelect);
89751522cd3Sdrh       sqlite3ExprSpan(p,&B,&E);
8984b5255acSdanielk1977       sqlite3ExprSetHeight(pParse, A);
89953f733c7Sdrh     }else{
900633e6d57Sdrh       sqlite3SelectDelete(pParse->db, Y);
90151522cd3Sdrh     }
90251522cd3Sdrh   }
903154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
904fef5208cSdrh 
90517a7f8ddSdrh /* CASE expressions */
90617a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
90717435752Sdrh   A = sqlite3PExpr(pParse, TK_CASE, X, Z, 0);
90853f733c7Sdrh   if( A ){
9096ab3a2ecSdanielk1977     A->x.pList = Y;
9104b5255acSdanielk1977     sqlite3ExprSetHeight(pParse, A);
91153f733c7Sdrh   }else{
912633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
91353f733c7Sdrh   }
9144adee20fSdanielk1977   sqlite3ExprSpan(A, &C, &E);
91517a7f8ddSdrh }
91617a7f8ddSdrh %type case_exprlist {ExprList*}
917633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
91817a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
91917435752Sdrh   A = sqlite3ExprListAppend(pParse,X, Y, 0);
92017435752Sdrh   A = sqlite3ExprListAppend(pParse,A, Z, 0);
92117a7f8ddSdrh }
92217a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
92317435752Sdrh   A = sqlite3ExprListAppend(pParse,0, Y, 0);
92417435752Sdrh   A = sqlite3ExprListAppend(pParse,A, Z, 0);
92517a7f8ddSdrh }
92617a7f8ddSdrh %type case_else {Expr*}
927633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
92817a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
92917a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
93017a7f8ddSdrh %type case_operand {Expr*}
931633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
93217a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
93317a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
934348784efSdrh 
935348784efSdrh %type exprlist {ExprList*}
936633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
9379245c243Sdrh %type nexprlist {ExprList*}
938633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
939348784efSdrh 
9409245c243Sdrh exprlist(A) ::= nexprlist(X).                {A = X;}
9419245c243Sdrh exprlist(A) ::= .                            {A = 0;}
94217435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y).
94317435752Sdrh     {A = sqlite3ExprListAppend(pParse,X,Y,0);}
94417435752Sdrh nexprlist(A) ::= expr(Y).
94517435752Sdrh     {A = sqlite3ExprListAppend(pParse,0,Y,0);}
9469245c243Sdrh 
947cce7d176Sdrh 
948382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
949382c0247Sdrh //
950d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
95177e96d14Sdrh         ON nm(Y) LP idxlist(Z) RP(E). {
95217435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
95317435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
9544d91a701Sdrh                       &S, &E, SQLITE_SO_ASC, NE);
9559cfcf5d4Sdrh }
956717e6402Sdrh 
957717e6402Sdrh %type uniqueflag {int}
9589cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
9599cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
960348784efSdrh 
9610202b29eSdanielk1977 %type idxlist {ExprList*}
962633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);}
9630202b29eSdanielk1977 %type idxlist_opt {ExprList*}
964633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
965348784efSdrh 
966c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
967c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
968200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z).  {
9690202b29eSdanielk1977   Expr *p = 0;
9700202b29eSdanielk1977   if( C.n>0 ){
97117435752Sdrh     p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
97239002505Sdanielk1977     sqlite3ExprSetColl(pParse, p, &C);
9730202b29eSdanielk1977   }
97417435752Sdrh   A = sqlite3ExprListAppend(pParse,X, p, &Y);
975b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
976b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
9770202b29eSdanielk1977 }
978200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). {
9790202b29eSdanielk1977   Expr *p = 0;
9800202b29eSdanielk1977   if( C.n>0 ){
98117435752Sdrh     p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
98239002505Sdanielk1977     sqlite3ExprSetColl(pParse, p, &C);
9830202b29eSdanielk1977   }
98417435752Sdrh   A = sqlite3ExprListAppend(pParse,0, p, &Y);
985b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse, A, "index");
986b27b7f5dSdrh   if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
9870202b29eSdanielk1977 }
9880202b29eSdanielk1977 
989a34001c9Sdrh %type collate {Token}
990a34001c9Sdrh collate(C) ::= .                {C.z = 0; C.n = 0;}
99139002505Sdanielk1977 collate(C) ::= COLLATE ids(X).   {C = X;}
992a34001c9Sdrh 
993348784efSdrh 
9948aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
995382c0247Sdrh //
9964d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
997982cef7eSdrh 
998382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
999382c0247Sdrh //
1000154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1001fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
100274161705Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse);}
100374161705Sdrh cmd ::= VACUUM nm.             {sqlite3Vacuum(pParse);}
1004fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1005154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1006f57b14a6Sdrh 
1007382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1008382c0247Sdrh //
100904e86f4dSshane %ifndef SQLITE_OMIT_PARSER
101013d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
101191cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1012ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1013ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1014ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1015ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1016ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1017ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1018ada2ee0dSdrh 
1019a3eb4b44Sdrh nmnum(A) ::= plus_num(X).             {A = X;}
1020a3eb4b44Sdrh nmnum(A) ::= nm(X).                   {A = X;}
1021ada2ee0dSdrh nmnum(A) ::= ON(X).                   {A = X;}
1022ada2ee0dSdrh nmnum(A) ::= DELETE(X).               {A = X;}
10236da861beSdrh nmnum(A) ::= DEFAULT(X).              {A = X;}
1024154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
102504e86f4dSshane %endif SQLITE_OMIT_PARSER
1026f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
1027f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1028fd405314Sdrh number(A) ::= INTEGER|FLOAT(X).       {A = X;}
1029f57b14a6Sdrh plus_opt ::= PLUS.
1030f57b14a6Sdrh plus_opt ::= .
1031c3f9bad2Sdanielk1977 
1032c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1033f0f258b1Sdrh 
1034b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1035b7f9164eSdrh 
1036d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
10374b59ab5eSdrh   Token all;
10384b59ab5eSdrh   all.z = A.z;
1039b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
10404adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1041f0f258b1Sdrh }
1042f0f258b1Sdrh 
1043fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1044fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
104560218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
104660218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
10473df6b257Sdanielk1977   A = (Z.n==0?B:Z);
1048c3f9bad2Sdanielk1977 }
1049c3f9bad2Sdanielk1977 
1050c3f9bad2Sdanielk1977 %type trigger_time {int}
1051c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
1052c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
1053c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1054c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1055c3f9bad2Sdanielk1977 
1056ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1057633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1058fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP).       {A.a = @OP; A.b = 0;}
105974ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP).              {A.a = @OP; A.b = 0;}
1060c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}
1061c3f9bad2Sdanielk1977 
106260218d2aSdrh foreach_clause ::= .
106360218d2aSdrh foreach_clause ::= FOR EACH ROW.
1064c3f9bad2Sdanielk1977 
1065c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1066633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1067c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
1068c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
1069c3f9bad2Sdanielk1977 
1070c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1071633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
1072187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
107381238966Sdrh /*
1074187e4c6aSdrh   if( Y ){
1075187e4c6aSdrh     Y->pLast->pNext = X;
1076187e4c6aSdrh   }else{
1077187e4c6aSdrh     Y = X;
1078187e4c6aSdrh   }
107981238966Sdrh */
108081238966Sdrh   assert( Y!=0 );
108181238966Sdrh   Y->pLast->pNext = X;
1082187e4c6aSdrh   Y->pLast = X;
1083187e4c6aSdrh   A = Y;
1084a69d9168Sdrh }
108581238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. {
108681238966Sdrh   /* if( X ) */
108781238966Sdrh   assert( X!=0 );
108881238966Sdrh   X->pLast = X;
108981238966Sdrh   A = X;
109081238966Sdrh }
1091c3f9bad2Sdanielk1977 
1092c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1093633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1094c3f9bad2Sdanielk1977 // UPDATE
10955ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
109617435752Sdrh                { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); }
1097c3f9bad2Sdanielk1977 
1098c3f9bad2Sdanielk1977 // INSERT
10993054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F)
1100c3f9bad2Sdanielk1977                    VALUES LP itemlist(Y) RP.
110117435752Sdrh                {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);}
1102c3f9bad2Sdanielk1977 
11033054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
110417435752Sdrh                {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);}
1105c3f9bad2Sdanielk1977 
1106c3f9bad2Sdanielk1977 // DELETE
11075ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
110817435752Sdrh                {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
1109c3f9bad2Sdanielk1977 
1110c3f9bad2Sdanielk1977 // SELECT
111117435752Sdrh trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(pParse->db, X); }
1112c3f9bad2Sdanielk1977 
11136f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
11144b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
111517435752Sdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
11168aa34ae0Sdrh   if( A ){
11176ab3a2ecSdanielk1977     A->affinity = OE_Ignore;
11184adee20fSdanielk1977     sqlite3ExprSpan(A, &X, &Y);
11194b59ab5eSdrh   }
11208aa34ae0Sdrh }
112174ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y).  {
112217435752Sdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z);
11238aa34ae0Sdrh   if( A ) {
1124c0688ea1Sshane     A->affinity = (char)T;
11254adee20fSdanielk1977     sqlite3ExprSpan(A, &X, &Y);
11264b59ab5eSdrh   }
11278aa34ae0Sdrh }
1128154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1129b7f9164eSdrh 
113074ad7fe9Sdrh %type raisetype {int}
113174ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
113274ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
113374ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
113474ad7fe9Sdrh 
11356f34903eSdanielk1977 
1136c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1137b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1138fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1139fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1140c3f9bad2Sdanielk1977 }
1141154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1142113088ecSdrh 
1143113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1144fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1145f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
1146f744bb56Sdanielk1977   sqlite3Attach(pParse, F, D, K);
11471c2d8414Sdrh }
1148fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
1149fdbcdee5Sdrh   sqlite3Detach(pParse, D);
1150fdbcdee5Sdrh }
1151fdbcdee5Sdrh 
1152f744bb56Sdanielk1977 %type key_opt {Expr*}
1153633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1154f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
1155f744bb56Sdanielk1977 key_opt(A) ::= KEY expr(X).          { A = X; }
1156113088ecSdrh 
1157113088ecSdrh database_kw_opt ::= DATABASE.
1158113088ecSdrh database_kw_opt ::= .
1159fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
11604343fea2Sdrh 
11614343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
11624343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
11634343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
11644343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1165154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
11669fd2a9a0Sdanielk1977 
11679f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
11689f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
11699f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
11709f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
11719f18e8a0Sdrh %endif
11729f18e8a0Sdrh 
11739fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
11749fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
11759fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
11769fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
11779fd2a9a0Sdanielk1977 }
117819a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). {
117919a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
118019a8e7e8Sdanielk1977 }
118119a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
1182d9da78a2Sdrh   pParse->db->lookaside.bEnabled = 0;
118319a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
118419a8e7e8Sdanielk1977 }
118519a8e7e8Sdanielk1977 kwcolumn_opt ::= .
118619a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1187154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1188e09daa90Sdrh 
1189e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1190e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1191b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1192b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1193d9da78a2Sdrh create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). {
1194b9bb7c18Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z);
1195b9bb7c18Sdrh }
1196e09daa90Sdrh vtabarglist ::= vtabarg.
1197e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1198b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1199b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1200b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1201b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1202b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1203b9bb7c18Sdrh anylist ::= .
1204*aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1205*aaac8b4eSdrh anylist ::= anylist ANY.
1206154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
1207