xref: /sqlite-3.40.0/src/parse.y (revision aee18ef8)
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*aee18ef8Sdanielk1977 ** @(#) $Id: parse.y,v 1.167 2005/03/09 12:26:51 danielk1977 Exp $
18348784efSdrh */
19348784efSdrh %token_prefix TK_
20348784efSdrh %token_type {Token}
21f57b14a6Sdrh %default_type {Token}
22348784efSdrh %extra_argument {Parse *pParse}
23348784efSdrh %syntax_error {
24b86ccfb2Sdrh   if( pParse->zErrMsg==0 ){
25b86ccfb2Sdrh     if( TOKEN.z[0] ){
264adee20fSdanielk1977       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
27b86ccfb2Sdrh     }else{
284adee20fSdanielk1977       sqlite3ErrorMsg(pParse, "incomplete SQL statement");
29b86ccfb2Sdrh     }
30b86ccfb2Sdrh   }
31348784efSdrh }
324adee20fSdanielk1977 %name sqlite3Parser
33348784efSdrh %include {
34348784efSdrh #include "sqliteInt.h"
35348784efSdrh #include "parse.h"
369bbca4c1Sdrh 
379bbca4c1Sdrh /*
38ad3cab52Sdrh ** An instance of this structure holds information about the
39ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
409bbca4c1Sdrh */
41ad3cab52Sdrh struct LimitVal {
42a2dc3b1aSdanielk1977   Expr *pLimit;    /* The LIMIT expression.  NULL if there is no limit */
43a2dc3b1aSdanielk1977   Expr *pOffset;   /* The OFFSET expression.  NULL if there is none */
44ad3cab52Sdrh };
45c3f9bad2Sdanielk1977 
46c3f9bad2Sdanielk1977 /*
472e3a1f16Sdrh ** An instance of this structure is used to store the LIKE,
482e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators.
492e3a1f16Sdrh */
502e3a1f16Sdrh struct LikeOp {
512e3a1f16Sdrh   int opcode;   /* Either TK_GLOB or TK_LIKE */
522e3a1f16Sdrh   int not;      /* True if the NOT keyword is present */
532e3a1f16Sdrh };
542e3a1f16Sdrh 
552e3a1f16Sdrh /*
56ad3cab52Sdrh ** An instance of the following structure describes the event of a
57ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
58ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
59ad3cab52Sdrh **
60ad3cab52Sdrh **      UPDATE ON (a,b,c)
61ad3cab52Sdrh **
62ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
63c3f9bad2Sdanielk1977 */
64ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
65caec2f12Sdrh 
6625d6543dSdrh /*
6725d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type.
6825d6543dSdrh */
6925d6543dSdrh struct AttachKey { int type;  Token key; };
7025d6543dSdrh 
71caec2f12Sdrh } // end %include
72348784efSdrh 
73348784efSdrh // These are extra tokens used by the lexer but never seen by the
74348784efSdrh // parser.  We put them in a rule so that the parser generator will
756206d50aSdrh // add them to the parse.h output file.
76348784efSdrh //
77c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
78c4a3c779Sdrh           COLUMN AGG_FUNCTION.
79c4a3c779Sdrh 
80826fb5a3Sdrh // Input is a single SQL command
81c4a3c779Sdrh input ::= cmdlist.
82094b2bbfSdrh cmdlist ::= cmdlist ecmd.
83826fb5a3Sdrh cmdlist ::= ecmd.
8480242055Sdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
85b7f9164eSdrh ecmd ::= SEMI.
86b7f9164eSdrh ecmd ::= explain cmdx SEMI.
874adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
88b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
89b7f9164eSdrh explain ::= EXPLAIN.    { sqlite3BeginParse(pParse, 1); }
90b7f9164eSdrh %endif
91348784efSdrh 
92382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
93c4a3c779Sdrh //
94fa86c412Sdrh 
95684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
96c4a3c779Sdrh trans_opt ::= .
97c4a3c779Sdrh trans_opt ::= TRANSACTION.
985ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
99684917c2Sdrh %type transtype {int}
100684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
101684917c2Sdrh transtype(A) ::= DEFERRED(X).  {A = @X;}
102684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;}
103684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;}
1044adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
1054adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
1064adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
107c4a3c779Sdrh 
108382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
109348784efSdrh //
110348784efSdrh cmd ::= create_table create_table_args.
111cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). {
112cbb18d22Sdanielk1977    sqlite3StartTable(pParse,&X,&Y,&Z,T,0);
113969fa7c1Sdrh }
114f57b3399Sdrh %type temp {int}
115d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
116d24cc427Sdrh temp(A) ::= .      {A = 0;}
117969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
1184adee20fSdanielk1977   sqlite3EndTable(pParse,&X,0);
119969fa7c1Sdrh }
120969fa7c1Sdrh create_table_args ::= AS select(S). {
1214adee20fSdanielk1977   sqlite3EndTable(pParse,0,S);
1224adee20fSdanielk1977   sqlite3SelectDelete(S);
123969fa7c1Sdrh }
124348784efSdrh columnlist ::= columnlist COMMA column.
125348784efSdrh columnlist ::= column.
126348784efSdrh 
127348784efSdrh // About the only information used for a column is the name of the
128348784efSdrh // column.  The type is always just "text".  But the code will accept
129348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
130348784efSdrh //
131348784efSdrh column ::= columnid type carglist.
1324adee20fSdanielk1977 columnid ::= nm(X).                {sqlite3AddColumn(pParse,&X);}
133c4a3c779Sdrh 
134c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
135c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
136c4a3c779Sdrh //
137982cef7eSdrh %type id {Token}
138f18543caSdrh id(A) ::= ID(X).         {A = X;}
1390bd1f4eaSdrh 
14034e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
14134e33bb8Sdrh // fallback to ID if they will not parse as their original value.
14234e33bb8Sdrh // This obviates the need for the "id" nonterminal.
14334e33bb8Sdrh //
1440bd1f4eaSdrh %fallback ID
14510e8266bSdrh   ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CONFLICT
146684917c2Sdrh   DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
147319e4e74Sdrh   GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY
1485ad1a6c8Sdrh   OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
149b7f9164eSdrh   TEMP TRIGGER VACUUM VIEW
150b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
151b7f9164eSdrh   EXCEPT INTERSECT UNION
152b7f9164eSdrh %endif
1532958a4e6Sdrh   REINDEX RENAME CDATE CTIME CTIMESTAMP ALTER
154b7f9164eSdrh   .
155c4a3c779Sdrh 
1562d3917daSdrh // Define operator precedence early so that this is the first occurance
1572d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
1582d3917daSdrh // causes them to be assigned integer values that are close together,
1592d3917daSdrh // which keeps parser tables smaller.
1602d3917daSdrh //
161f2bc013cSdrh // The token values assigned to these symbols is determined by the order
162f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
163f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
164f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
165f2bc013cSdrh // constraint.
166f2bc013cSdrh //
1672d3917daSdrh %left OR.
1682d3917daSdrh %left AND.
1692d3917daSdrh %right NOT.
170f2bc013cSdrh %left IS LIKE GLOB BETWEEN IN ISNULL NOTNULL NE EQ.
1719a43267bSdrh %left GT LE LT GE.
1727c6303c0Sdanielk1977 %right ESCAPE.
1732d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
1742d3917daSdrh %left PLUS MINUS.
1752d3917daSdrh %left STAR SLASH REM.
1762d3917daSdrh %left CONCAT.
1772d3917daSdrh %right UMINUS UPLUS BITNOT.
1782d3917daSdrh 
179c4a3c779Sdrh // And "ids" is an identifer-or-string.
180c4a3c779Sdrh //
181c4a3c779Sdrh %type ids {Token}
1825ad1a6c8Sdrh ids(A) ::= ID(X).        {A = X;}
183c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
184c4a3c779Sdrh 
1855ad1a6c8Sdrh // The name of a column or table can be any of the following:
1865ad1a6c8Sdrh //
1875ad1a6c8Sdrh %type nm {Token}
1885ad1a6c8Sdrh nm(A) ::= ID(X).         {A = X;}
1895ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
1905ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
1915ad1a6c8Sdrh 
192382c0247Sdrh type ::= .
1934adee20fSdanielk1977 type ::= typename(X).                    {sqlite3AddColumnType(pParse,&X,&X);}
1944adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y).    {sqlite3AddColumnType(pParse,&X,&Y);}
195382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
1964adee20fSdanielk1977                                          {sqlite3AddColumnType(pParse,&X,&Y);}
197382c0247Sdrh %type typename {Token}
198382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
199596bd235Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);}
200ef0cae50Sdrh %type signed {int}
20174ad7fe9Sdrh signed(A) ::= plus_num(X).    { A = atoi(X.z); }
20274ad7fe9Sdrh signed(A) ::= minus_num(X).   { A = -atoi(X.z); }
203348784efSdrh carglist ::= carglist carg.
204348784efSdrh carglist ::= .
2055ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
206348784efSdrh carg ::= ccons.
2077977a17fSdanielk1977 carg ::= DEFAULT term(X).            {sqlite3AddDefaultValue(pParse,X);}
2087977a17fSdanielk1977 carg ::= DEFAULT PLUS term(X).       {sqlite3AddDefaultValue(pParse,X);}
2097977a17fSdanielk1977 carg ::= DEFAULT MINUS term(X).      {
2107977a17fSdanielk1977   Expr *p = sqlite3Expr(TK_UMINUS, X, 0, 0);
2117977a17fSdanielk1977   sqlite3AddDefaultValue(pParse,p);
2127977a17fSdanielk1977 }
2137977a17fSdanielk1977 carg ::= DEFAULT id(X).              {
2147977a17fSdanielk1977   Expr *p = sqlite3Expr(TK_STRING, 0, 0, &X);
2157977a17fSdanielk1977   sqlite3AddDefaultValue(pParse,p);
2167977a17fSdanielk1977 }
217348784efSdrh 
218382c0247Sdrh // In addition to the type name, we also care about the primary key and
219382c0247Sdrh // UNIQUE constraints.
220348784efSdrh //
2210d316a40Sdrh ccons ::= NULL onconf.
2224adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).               {sqlite3AddNotNull(pParse, R);}
223205f48e6Sdrh ccons ::= PRIMARY KEY sortorder onconf(R) autoinc(I).
224205f48e6Sdrh                                      {sqlite3AddPrimaryKey(pParse,0,R,I);}
225cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R).          {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);}
2269cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
227c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
2284adee20fSdanielk1977                                 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
2294adee20fSdanielk1977 ccons ::= defer_subclause(D).   {sqlite3DeferForeignKey(pParse,D);}
230d3d39e93Sdrh ccons ::= COLLATE id(C).  {sqlite3AddCollateType(pParse, C.z, C.n);}
23104738cb9Sdrh 
232205f48e6Sdrh // The optional AUTOINCREMENT keyword
233205f48e6Sdrh %type autoinc {int}
234205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
2352958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
236205f48e6Sdrh 
237c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
238c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
239c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
240c2eef3b3Sdrh // check fails.
24104738cb9Sdrh //
242c2eef3b3Sdrh %type refargs {int}
243c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
244c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
245c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
246c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
247c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
248c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
249c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
250c2eef3b3Sdrh %type refact {int}
251c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
252c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
253c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
254c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
255c2eef3b3Sdrh %type defer_subclause {int}
256c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
257c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
258c2eef3b3Sdrh %type init_deferred_pred_opt {int}
259c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
260c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
261c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
262348784efSdrh 
263348784efSdrh // For the time being, the only constraint we care about is the primary
264382c0247Sdrh // key and UNIQUE.  Both create indices.
265348784efSdrh //
266348784efSdrh conslist_opt ::= .
267348784efSdrh conslist_opt ::= COMMA conslist.
268348784efSdrh conslist ::= conslist COMMA tcons.
269a2e1bb5aSdrh conslist ::= conslist tcons.
270348784efSdrh conslist ::= tcons.
2715ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
272f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R).
273205f48e6Sdrh                                          {sqlite3AddPrimaryKey(pParse,X,R,I);}
2749cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
275cbb18d22Sdanielk1977                                        {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);}
2769cfcf5d4Sdrh tcons ::= CHECK expr onconf.
277c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
278c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
2794adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
2804adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
281c2eef3b3Sdrh }
282c2eef3b3Sdrh %type defer_subclause_opt {int}
283c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
284c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
2859cfcf5d4Sdrh 
2869cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2879cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2889cfcf5d4Sdrh //
2899cfcf5d4Sdrh %type onconf {int}
2901c92853dSdrh %type orconf {int}
2911c92853dSdrh %type resolvetype {int}
2921c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
2931c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
2941c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
2951c92853dSdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
29674ad7fe9Sdrh resolvetype(A) ::= raisetype(X).             {A = X;}
2971c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
2981c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
299348784efSdrh 
300382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
301348784efSdrh //
30274ad7fe9Sdrh cmd ::= DROP TABLE fullname(X). {
30374ad7fe9Sdrh   sqlite3DropTable(pParse, X, 0);
304a8858103Sdanielk1977 }
305348784efSdrh 
306a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
307a76b5dfcSdrh //
308b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
30948dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). {
31048dec7e2Sdanielk1977   sqlite3CreateView(pParse, &X, &Y, &Z, S, T);
311a76b5dfcSdrh }
31274ad7fe9Sdrh cmd ::= DROP VIEW fullname(X). {
31374ad7fe9Sdrh   sqlite3DropTable(pParse, X, 1);
314a76b5dfcSdrh }
315b7f9164eSdrh %endif // SQLITE_OMIT_VIEW
316a76b5dfcSdrh 
317382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
318348784efSdrh //
3199bb61fe7Sdrh cmd ::= select(X).  {
320b3bce662Sdanielk1977   sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0);
3214adee20fSdanielk1977   sqlite3SelectDelete(X);
3229bb61fe7Sdrh }
323efb7251dSdrh 
3249bb61fe7Sdrh %type select {Select*}
3254adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);}
32682c3d636Sdrh %type oneselect {Select*}
3274adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);}
3289bb61fe7Sdrh 
32982c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
330b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
3310a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
332daffd0e5Sdrh   if( Z ){
33382c3d636Sdrh     Z->op = Y;
33482c3d636Sdrh     Z->pPrior = X;
335daffd0e5Sdrh   }
33682c3d636Sdrh   A = Z;
33782c3d636Sdrh }
3380a36c57eSdrh %type multiselect_op {int}
33974ad7fe9Sdrh multiselect_op(A) ::= UNION(OP).      {A = @OP;}
3400a36c57eSdrh multiselect_op(A) ::= UNION ALL.      {A = TK_ALL;}
34174ad7fe9Sdrh multiselect_op(A) ::= INTERSECT(OP).  {A = @OP;}
34274ad7fe9Sdrh multiselect_op(A) ::= EXCEPT(OP).     {A = @OP;}
343b7f9164eSdrh %endif // SQLITE_OMIT_COMPOUND_SELECT
34482c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
3459bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
346a2dc3b1aSdanielk1977   A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
3479bb61fe7Sdrh }
3489bb61fe7Sdrh 
3499bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
3509bb61fe7Sdrh // present and false (0) if it is not.
3519bb61fe7Sdrh //
352efb7251dSdrh %type distinct {int}
353efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
354fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
355efb7251dSdrh distinct(A) ::= .           {A = 0;}
356348784efSdrh 
3579bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
3587c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
3597c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
3607c917d19Sdrh // opcode of TK_ALL.
3619bb61fe7Sdrh //
362348784efSdrh %type selcollist {ExprList*}
3634adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);}
364348784efSdrh %type sclp {ExprList*}
3654adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);}
366348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
367348784efSdrh sclp(A) ::= .                                {A = 0;}
36801f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
3694adee20fSdanielk1977    A = sqlite3ExprListAppend(P,X,Y.n?&Y:0);
37001f3f253Sdrh }
3717c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
3724adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0);
3737c917d19Sdrh }
3745ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
3754adee20fSdanielk1977   Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0);
3764adee20fSdanielk1977   Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X);
3774adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0);
37854473229Sdrh }
37901f3f253Sdrh 
38001f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
38101f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
38201f3f253Sdrh //
38301f3f253Sdrh %type as {Token}
3845ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
3855ad1a6c8Sdrh as(X) ::= ids(Y).      {X = Y;}
38601f3f253Sdrh as(X) ::= .            {X.n = 0;}
3879bb61fe7Sdrh 
388348784efSdrh 
389ad3cab52Sdrh %type seltablist {SrcList*}
3904adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);}
391ad3cab52Sdrh %type stl_prefix {SrcList*}
3924adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);}
393ad3cab52Sdrh %type from {SrcList*}
3944adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);}
395348784efSdrh 
39601f3f253Sdrh // A complete FROM clause.
39701f3f253Sdrh //
398bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
399348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
40001f3f253Sdrh 
40101f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
40201f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
40301f3f253Sdrh //
40401f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
40501f3f253Sdrh    A = X;
40601f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
40701f3f253Sdrh }
408348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
409113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). {
4104adee20fSdanielk1977   A = sqlite3SrcListAppend(X,&Y,&D);
4114adee20fSdanielk1977   if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
41201f3f253Sdrh   if( N ){
41301f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
4144adee20fSdanielk1977     else { sqlite3ExprDelete(N); }
415c4a3c779Sdrh   }
41601f3f253Sdrh   if( U ){
41701f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
4184adee20fSdanielk1977     else { sqlite3IdListDelete(U); }
41901f3f253Sdrh   }
42001f3f253Sdrh }
42151522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
422b733d037Sdrh   seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP
423b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
4244adee20fSdanielk1977     A = sqlite3SrcListAppend(X,0,0);
425ad3cab52Sdrh     A->a[A->nSrc-1].pSelect = S;
4264adee20fSdanielk1977     if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
42701f3f253Sdrh     if( N ){
42801f3f253Sdrh       if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
4294adee20fSdanielk1977       else { sqlite3ExprDelete(N); }
43022f70c32Sdrh     }
43101f3f253Sdrh     if( U ){
43201f3f253Sdrh       if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
4334adee20fSdanielk1977       else { sqlite3IdListDelete(U); }
434d5feede1Sdrh     }
43522f70c32Sdrh   }
436348784efSdrh 
437b733d037Sdrh  // A seltablist_paren nonterminal represents anything in a FROM that
438b733d037Sdrh   // is contained inside parentheses.  This can be either a subquery or
439b733d037Sdrh   // a grouping of table and subqueries.
440b733d037Sdrh   //
441b733d037Sdrh   %type seltablist_paren {Select*}
4424adee20fSdanielk1977   %destructor seltablist_paren {sqlite3SelectDelete($$);}
443b733d037Sdrh   seltablist_paren(A) ::= select(S).      {A = S;}
444b733d037Sdrh   seltablist_paren(A) ::= seltablist(F).  {
445a2dc3b1aSdanielk1977      A = sqlite3SelectNew(0,F,0,0,0,0,0,0,0);
446b733d037Sdrh   }
44751522cd3Sdrh %endif // SQLITE_OMIT_SUBQUERY
448b733d037Sdrh 
449113088ecSdrh %type dbnm {Token}
450113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
451113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
452113088ecSdrh 
45374ad7fe9Sdrh %type fullname {SrcList*}
45474ad7fe9Sdrh %destructor fullname {sqlite3SrcListDelete($$);}
45574ad7fe9Sdrh fullname(A) ::= nm(X) dbnm(Y).  {A = sqlite3SrcListAppend(0,&X,&Y);}
45674ad7fe9Sdrh 
45701f3f253Sdrh %type joinop {int}
45801f3f253Sdrh %type joinop2 {int}
45901f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
46001f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
4614adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
4624adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
4635ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
4644adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
46501f3f253Sdrh 
46601f3f253Sdrh %type on_opt {Expr*}
4674adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);}
46801f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
46901f3f253Sdrh on_opt(N) ::= .             {N = 0;}
47001f3f253Sdrh 
47101f3f253Sdrh %type using_opt {IdList*}
4724adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);}
4730202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP.  {U = L;}
47401f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
47501f3f253Sdrh 
47601f3f253Sdrh 
477348784efSdrh %type orderby_opt {ExprList*}
4784adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);}
479348784efSdrh %type sortlist {ExprList*}
4804adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);}
481348784efSdrh %type sortitem {Expr*}
4824adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);}
483348784efSdrh 
484348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
485348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
4868e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
4871186b0a0Sdrh   A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0);
488d3d39e93Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = Z;
489348784efSdrh }
49038640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
4911186b0a0Sdrh   A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0);
49296fb0dd5Sdanielk1977   if( A && A->a ) A->a[0].sortOrder = Z;
493348784efSdrh }
494da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
495348784efSdrh 
496348784efSdrh %type sortorder {int}
497d3d39e93Sdrh %type collate {Token}
498348784efSdrh 
4998e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
5008e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
5018e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
502d3d39e93Sdrh collate(C) ::= .                {C.z = 0; C.n = 0;}
503d3d39e93Sdrh collate(C) ::= COLLATE id(X).   {C = X;}
504348784efSdrh 
5052282792aSdrh %type groupby_opt {ExprList*}
5064adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);}
5072282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
5082282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
5092282792aSdrh 
5102282792aSdrh %type having_opt {Expr*}
5114adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);}
5122282792aSdrh having_opt(A) ::= .                {A = 0;}
5132282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
5142282792aSdrh 
515ad3cab52Sdrh %type limit_opt {struct LimitVal}
516a2dc3b1aSdanielk1977 %destructor limit_opt {
517a2dc3b1aSdanielk1977   sqlite3ExprDelete($$.pLimit);
518a2dc3b1aSdanielk1977   sqlite3ExprDelete($$.pOffset);
519a2dc3b1aSdanielk1977 }
520a2dc3b1aSdanielk1977 limit_opt(A) ::= .                     {A.pLimit = 0; A.pOffset = 0;}
521a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X).        {A.pLimit = X; A.pOffset = 0;}
522a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
523a2dc3b1aSdanielk1977                                        {A.pLimit = X; A.pOffset = Y;}
524a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
525a2dc3b1aSdanielk1977                                        {A.pOffset = X; A.pLimit = Y;}
5269bbca4c1Sdrh 
527382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
528382c0247Sdrh //
52974ad7fe9Sdrh cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);}
530348784efSdrh 
531348784efSdrh %type where_opt {Expr*}
5324adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);}
533348784efSdrh 
534348784efSdrh where_opt(A) ::= .                    {A = 0;}
535348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
536348784efSdrh 
537348784efSdrh %type setlist {ExprList*}
5384adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);}
539348784efSdrh 
540382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
541382c0247Sdrh //
54274ad7fe9Sdrh cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z).
54374ad7fe9Sdrh     {sqlite3Update(pParse,X,Y,Z,R);}
544348784efSdrh 
5455ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
5464adee20fSdanielk1977     {A = sqlite3ExprListAppend(Z,Y,&X);}
5474adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y).   {A = sqlite3ExprListAppend(0,Y,&X);}
548348784efSdrh 
549382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
550382c0247Sdrh //
55174ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F)
552113088ecSdrh         VALUES LP itemlist(Y) RP.
55374ad7fe9Sdrh             {sqlite3Insert(pParse, X, Y, 0, F, R);}
55474ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
55574ad7fe9Sdrh             {sqlite3Insert(pParse, X, 0, S, F, R);}
556348784efSdrh 
557fa86c412Sdrh %type insert_cmd {int}
558fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
559fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
560fa86c412Sdrh 
561348784efSdrh 
562348784efSdrh %type itemlist {ExprList*}
5634adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);}
564348784efSdrh 
5654adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqlite3ExprListAppend(X,Y,0);}
5664adee20fSdanielk1977 itemlist(A) ::= expr(X).                    {A = sqlite3ExprListAppend(0,X,0);}
567348784efSdrh 
568967e8b73Sdrh %type inscollist_opt {IdList*}
5694adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);}
570967e8b73Sdrh %type inscollist {IdList*}
5714adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);}
572348784efSdrh 
573967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
574967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
5754adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = sqlite3IdListAppend(X,&Y);}
5764adee20fSdanielk1977 inscollist(A) ::= nm(Y).                      {A = sqlite3IdListAppend(0,&Y);}
577348784efSdrh 
578382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
579382c0247Sdrh //
580348784efSdrh 
581348784efSdrh %type expr {Expr*}
5824adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);}
5837977a17fSdanielk1977 %type term {Expr*}
5847977a17fSdanielk1977 %destructor term {sqlite3ExprDelete($$);}
585348784efSdrh 
5867977a17fSdanielk1977 expr(A) ::= term(X).             {A = X;}
587752e679aSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); }
5887977a17fSdanielk1977 term(A) ::= NULL(X).             {A = sqlite3Expr(@X, 0, 0, &X);}
5894adee20fSdanielk1977 expr(A) ::= ID(X).               {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5904adee20fSdanielk1977 expr(A) ::= JOIN_KW(X).          {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5915ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
5924adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5934adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5944adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp2, 0);
595e1b6a5b8Sdrh }
596d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
5974adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5984adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5994adee20fSdanielk1977   Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z);
6004adee20fSdanielk1977   Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0);
6014adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp4, 0);
602d24cc427Sdrh }
6037977a17fSdanielk1977 term(A) ::= INTEGER(X).      {A = sqlite3Expr(@X, 0, 0, &X);}
6047977a17fSdanielk1977 term(A) ::= FLOAT(X).        {A = sqlite3Expr(@X, 0, 0, &X);}
6057977a17fSdanielk1977 term(A) ::= STRING(X).       {A = sqlite3Expr(@X, 0, 0, &X);}
606*aee18ef8Sdanielk1977 term(A) ::= BLOB(X).         {A = sqlite3Expr(@X, 0, 0, &X);}
6074e0cff60Sdrh expr(A) ::= REGISTER(X).     {A = sqlite3RegisterExpr(pParse, &X);}
6087c972decSdrh expr(A) ::= VARIABLE(X).     {
609895d7472Sdrh   Token *pToken = &X;
610895d7472Sdrh   Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken);
611fa6bc000Sdrh   sqlite3ExprAssignVarNumber(pParse, pExpr);
612895d7472Sdrh }
613b3bce662Sdanielk1977 expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
6144adee20fSdanielk1977   A = sqlite3ExprFunction(Y, &X);
6154adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
616e1b6a5b8Sdrh }
617e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
6184adee20fSdanielk1977   A = sqlite3ExprFunction(0, &X);
6194adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
620e1b6a5b8Sdrh }
6217977a17fSdanielk1977 term(A) ::= CTIME(OP).                  {A = sqlite3Expr(@OP,0,0,0);}
6227977a17fSdanielk1977 term(A) ::= CDATE(OP).                  {A = sqlite3Expr(@OP,0,0,0);}
6237977a17fSdanielk1977 term(A) ::= CTIMESTAMP(OP).             {A = sqlite3Expr(@OP,0,0,0);}
6247ac25c75Sdrh expr(A) ::= expr(X) AND(OP) expr(Y).    {A = sqlite3Expr(@OP, X, Y, 0);}
6257ac25c75Sdrh expr(A) ::= expr(X) OR(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6267ac25c75Sdrh expr(A) ::= expr(X) LT(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6277ac25c75Sdrh expr(A) ::= expr(X) GT(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6287ac25c75Sdrh expr(A) ::= expr(X) LE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6297ac25c75Sdrh expr(A) ::= expr(X) GE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6307ac25c75Sdrh expr(A) ::= expr(X) NE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6317ac25c75Sdrh expr(A) ::= expr(X) EQ(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6327ac25c75Sdrh expr(A) ::= expr(X) BITAND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
6337ac25c75Sdrh expr(A) ::= expr(X) BITOR(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
6347ac25c75Sdrh expr(A) ::= expr(X) LSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
6357ac25c75Sdrh expr(A) ::= expr(X) RSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
63674ad7fe9Sdrh expr(A) ::= expr(X) PLUS(OP) expr(Y).   {A = sqlite3Expr(@OP, X, Y, 0);}
63774ad7fe9Sdrh expr(A) ::= expr(X) MINUS(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
63874ad7fe9Sdrh expr(A) ::= expr(X) STAR(OP) expr(Y).   {A = sqlite3Expr(@OP, X, Y, 0);}
63974ad7fe9Sdrh expr(A) ::= expr(X) SLASH(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
64074ad7fe9Sdrh expr(A) ::= expr(X) REM(OP) expr(Y).    {A = sqlite3Expr(@OP, X, Y, 0);}
64174ad7fe9Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
64274ad7fe9Sdrh %type likeop {struct LikeOp}
64374ad7fe9Sdrh likeop(A) ::= LIKE.     {A.opcode = TK_LIKE; A.not = 0;}
64474ad7fe9Sdrh likeop(A) ::= GLOB.     {A.opcode = TK_GLOB; A.not = 0;}
64574ad7fe9Sdrh likeop(A) ::= NOT LIKE. {A.opcode = TK_LIKE; A.not = 1;}
64674ad7fe9Sdrh likeop(A) ::= NOT GLOB. {A.opcode = TK_GLOB; A.not = 1;}
6477c6303c0Sdanielk1977 %type escape {Expr*}
6487c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;}
6497c6303c0Sdanielk1977 escape(X) ::= .               [ESCAPE] {X = 0;}
6507c6303c0Sdanielk1977 expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E).  [LIKE]  {
6514adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
6524adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
6537c6303c0Sdanielk1977   if( E ){
6547c6303c0Sdanielk1977     pList = sqlite3ExprListAppend(pList, E, 0);
6557c6303c0Sdanielk1977   }
6564adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
6572e3a1f16Sdrh   if( A ) A->op = OP.opcode;
6582e3a1f16Sdrh   if( OP.not ) A = sqlite3Expr(TK_NOT, A, 0, 0);
6594adee20fSdanielk1977   sqlite3ExprSpan(A, &X->span, &Y->span);
6600ac65892Sdrh }
6617c6303c0Sdanielk1977 
662e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
6634adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6644adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
665e1b6a5b8Sdrh }
66633048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
6674adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6684adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
66933048c0bSdrh }
67033048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
6714adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6724adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
67333048c0bSdrh }
674e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
6754adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6764adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
677e1b6a5b8Sdrh }
67881a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
6794adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6804adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
68181a20f21Sdrh }
682e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
6837ac25c75Sdrh   A = sqlite3Expr(@B, X, 0, 0);
6844adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
685e1b6a5b8Sdrh }
68681a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
6877ac25c75Sdrh   A = sqlite3Expr(@B, X, 0, 0);
6884adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
68981a20f21Sdrh }
690e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
6914adee20fSdanielk1977   A = sqlite3Expr(TK_UMINUS, X, 0, 0);
6924adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
693e1b6a5b8Sdrh }
6944b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
6954adee20fSdanielk1977   A = sqlite3Expr(TK_UPLUS, X, 0, 0);
6964adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
697e1b6a5b8Sdrh }
6982e3a1f16Sdrh %type between_op {int}
6992e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
7002e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
7012e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
7024adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
7034adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
7044adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
705daffd0e5Sdrh   if( A ) A->pList = pList;
7062e3a1f16Sdrh   if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
7074adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
708fef5208cSdrh }
7093e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
7102e3a1f16Sdrh   %type in_op {int}
7112e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
7122e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
7132e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
7144adee20fSdanielk1977     A = sqlite3Expr(TK_IN, X, 0, 0);
715daffd0e5Sdrh     if( A ) A->pList = Y;
7162e3a1f16Sdrh     if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
7174adee20fSdanielk1977     sqlite3ExprSpan(A,&X->span,&E);
718fef5208cSdrh   }
71951522cd3Sdrh   expr(A) ::= LP(B) select(X) RP(E). {
72051522cd3Sdrh     A = sqlite3Expr(TK_SELECT, 0, 0, 0);
72151522cd3Sdrh     if( A ) A->pSelect = X;
72251522cd3Sdrh     sqlite3ExprSpan(A,&B,&E);
72351522cd3Sdrh   }
7242e3a1f16Sdrh   expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E).  [IN] {
7254adee20fSdanielk1977     A = sqlite3Expr(TK_IN, X, 0, 0);
726daffd0e5Sdrh     if( A ) A->pSelect = Y;
7272e3a1f16Sdrh     if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
7284adee20fSdanielk1977     sqlite3ExprSpan(A,&X->span,&E);
729fef5208cSdrh   }
73074ad7fe9Sdrh   expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
73174ad7fe9Sdrh     SrcList *pSrc = sqlite3SrcListAppend(0,&Y,&Z);
7324adee20fSdanielk1977     A = sqlite3Expr(TK_IN, X, 0, 0);
733a2dc3b1aSdanielk1977     if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,0,0);
7342e3a1f16Sdrh     if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
73574ad7fe9Sdrh     sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y);
73623b2db23Sdrh   }
73751522cd3Sdrh   expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
73851522cd3Sdrh     Expr *p = A = sqlite3Expr(TK_EXISTS, 0, 0, 0);
73951522cd3Sdrh     if( p ){
74051522cd3Sdrh       p->pSelect = Y;
74151522cd3Sdrh       sqlite3ExprSpan(p,&B,&E);
74251522cd3Sdrh     }
74351522cd3Sdrh   }
74451522cd3Sdrh %endif // SQLITE_OMIT_SUBQUERY
745fef5208cSdrh 
74617a7f8ddSdrh /* CASE expressions */
74717a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
7484adee20fSdanielk1977   A = sqlite3Expr(TK_CASE, X, Z, 0);
74917a7f8ddSdrh   if( A ) A->pList = Y;
7504adee20fSdanielk1977   sqlite3ExprSpan(A, &C, &E);
75117a7f8ddSdrh }
75217a7f8ddSdrh %type case_exprlist {ExprList*}
7534adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);}
75417a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
7554adee20fSdanielk1977   A = sqlite3ExprListAppend(X, Y, 0);
7564adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
75717a7f8ddSdrh }
75817a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
7594adee20fSdanielk1977   A = sqlite3ExprListAppend(0, Y, 0);
7604adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
76117a7f8ddSdrh }
76217a7f8ddSdrh %type case_else {Expr*}
76317a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
76417a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
76517a7f8ddSdrh %type case_operand {Expr*}
76617a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
76717a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
768348784efSdrh 
769348784efSdrh %type exprlist {ExprList*}
7704adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);}
771348784efSdrh %type expritem {Expr*}
7724adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);}
773348784efSdrh 
774348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
7754adee20fSdanielk1977                                         {A = sqlite3ExprListAppend(X,Y,0);}
7764adee20fSdanielk1977 exprlist(A) ::= expritem(X).            {A = sqlite3ExprListAppend(0,X,0);}
777348784efSdrh expritem(A) ::= expr(X).                {A = X;}
778348784efSdrh expritem(A) ::= .                       {A = 0;}
779cce7d176Sdrh 
780382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
781382c0247Sdrh //
782cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D)
7832b6d46b9Sdanielk1977         ON nm(Y) LP idxlist(Z) RP(E) onconf(R). {
7849cfcf5d4Sdrh   if( U!=OE_None ) U = R;
7859cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
7862b6d46b9Sdanielk1977   sqlite3CreateIndex(pParse, &X, &D, sqlite3SrcListAppend(0,&Y,0),Z,U, &S, &E);
7879cfcf5d4Sdrh }
788717e6402Sdrh 
789717e6402Sdrh %type uniqueflag {int}
7909cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
7919cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
792348784efSdrh 
7930202b29eSdanielk1977 %type idxlist {ExprList*}
7940202b29eSdanielk1977 %destructor idxlist {sqlite3ExprListDelete($$);}
7950202b29eSdanielk1977 %type idxlist_opt {ExprList*}
7960202b29eSdanielk1977 %destructor idxlist_opt {sqlite3ExprListDelete($$);}
797348784efSdrh %type idxitem {Token}
798348784efSdrh 
799c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
800c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
8010202b29eSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder.  {
8020202b29eSdanielk1977   Expr *p = 0;
8030202b29eSdanielk1977   if( C.n>0 ){
8040202b29eSdanielk1977     p = sqlite3Expr(TK_COLUMN, 0, 0, 0);
8050202b29eSdanielk1977     if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n);
8060202b29eSdanielk1977   }
8070202b29eSdanielk1977   A = sqlite3ExprListAppend(X, p, &Y);
8080202b29eSdanielk1977 }
8090202b29eSdanielk1977 idxlist(A) ::= idxitem(Y) collate(C) sortorder. {
8100202b29eSdanielk1977   Expr *p = 0;
8110202b29eSdanielk1977   if( C.n>0 ){
8120202b29eSdanielk1977     p = sqlite3Expr(TK_COLUMN, 0, 0, 0);
8130202b29eSdanielk1977     if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n);
8140202b29eSdanielk1977   }
8150202b29eSdanielk1977   A = sqlite3ExprListAppend(0, p, &Y);
8160202b29eSdanielk1977 }
8170202b29eSdanielk1977 idxitem(A) ::= nm(X).              {A = X;}
8180202b29eSdanielk1977 
819348784efSdrh 
8208aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
821382c0247Sdrh //
82274ad7fe9Sdrh cmd ::= DROP INDEX fullname(X).   {sqlite3DropIndex(pParse, X);}
823982cef7eSdrh 
824382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
825382c0247Sdrh //
8264adee20fSdanielk1977 cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
82774ad7fe9Sdrh cmd ::= VACUUM nm.             {sqlite3Vacuum(pParse,0);}
828f57b14a6Sdrh 
829382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
830382c0247Sdrh //
83113d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
83291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ nm(Y).  {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
83391cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y).  {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
83491cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
83591cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). {
83691cf71b0Sdanielk1977   sqlite3Pragma(pParse,&X,&Z,&Y,1);
83791cf71b0Sdanielk1977 }
83891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
83991cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).             {sqlite3Pragma(pParse,&X,&Z,0,0);}
84013d7042aSdrh %endif // SQLITE_OMIT_PRAGMA
841f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
842f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
843f57b14a6Sdrh number(A) ::= INTEGER(X).             {A = X;}
844f57b14a6Sdrh number(A) ::= FLOAT(X).               {A = X;}
845f57b14a6Sdrh plus_opt ::= PLUS.
846f57b14a6Sdrh plus_opt ::= .
847c3f9bad2Sdanielk1977 
848c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
849f0f258b1Sdrh 
850b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
851b7f9164eSdrh 
8523df6b257Sdanielk1977 cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
8534b59ab5eSdrh   Token all;
8544b59ab5eSdrh   all.z = A.z;
8554b59ab5eSdrh   all.n = (Z.z - A.z) + Z.n;
8564adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
857f0f258b1Sdrh }
858f0f258b1Sdrh 
85974ad7fe9Sdrh trigger_decl(A) ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C)
86074ad7fe9Sdrh                     trigger_event(D)
86174ad7fe9Sdrh                     ON fullname(E) foreach_clause(F) when_clause(G). {
86274ad7fe9Sdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, F, G, T);
8633df6b257Sdanielk1977   A = (Z.n==0?B:Z);
864c3f9bad2Sdanielk1977 }
865c3f9bad2Sdanielk1977 
866c3f9bad2Sdanielk1977 %type trigger_time  {int}
867c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
868c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
869c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
870c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
871c3f9bad2Sdanielk1977 
872ad3cab52Sdrh %type trigger_event {struct TrigEvent}
8734adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);}
87474ad7fe9Sdrh trigger_event(A) ::= DELETE(OP).              {A.a = @OP; A.b = 0;}
87574ad7fe9Sdrh trigger_event(A) ::= INSERT(OP).              {A.a = @OP; A.b = 0;}
87674ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP).              {A.a = @OP; A.b = 0;}
877c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}
878c3f9bad2Sdanielk1977 
879c3f9bad2Sdanielk1977 %type foreach_clause {int}
880c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
881c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
882c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
883c3f9bad2Sdanielk1977 
884c3f9bad2Sdanielk1977 %type when_clause {Expr*}
885c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
886c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
887c3f9bad2Sdanielk1977 
888c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
8894adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}
890c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
891a69d9168Sdrh   X->pNext = Y;
892a69d9168Sdrh   A = X;
893a69d9168Sdrh }
894c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
895c3f9bad2Sdanielk1977 
896c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
8974adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);}
898c3f9bad2Sdanielk1977 // UPDATE
8995ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
9004adee20fSdanielk1977                { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); }
901c3f9bad2Sdanielk1977 
902c3f9bad2Sdanielk1977 // INSERT
9033054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F)
904c3f9bad2Sdanielk1977                    VALUES LP itemlist(Y) RP.
9054adee20fSdanielk1977                {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);}
906c3f9bad2Sdanielk1977 
9073054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
9084adee20fSdanielk1977                {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);}
909c3f9bad2Sdanielk1977 
910c3f9bad2Sdanielk1977 // DELETE
9115ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
9124adee20fSdanielk1977                {A = sqlite3TriggerDeleteStep(&X, Y);}
913c3f9bad2Sdanielk1977 
914c3f9bad2Sdanielk1977 // SELECT
9154adee20fSdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(X); }
916c3f9bad2Sdanielk1977 
9176f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
9184b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
9194adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, 0);
9204b59ab5eSdrh   A->iColumn = OE_Ignore;
9214adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
9224b59ab5eSdrh }
92374ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y).  {
9244adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
92574ad7fe9Sdrh   A->iColumn = T;
9264adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
9274b59ab5eSdrh }
928b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER
929b7f9164eSdrh 
93074ad7fe9Sdrh %type raisetype {int}
93174ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
93274ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
93374ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
93474ad7fe9Sdrh 
9356f34903eSdanielk1977 
936c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
937b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
93874ad7fe9Sdrh cmd ::= DROP TRIGGER fullname(X). {
93974ad7fe9Sdrh   sqlite3DropTrigger(pParse,X);
940c3f9bad2Sdanielk1977 }
941b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER
942113088ecSdrh 
943113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
9444d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). {
94525d6543dSdrh   sqlite3Attach(pParse, &F, &D, K.type, &K.key);
9461c2d8414Sdrh }
94725d6543dSdrh %type key_opt {struct AttachKey}
94825d6543dSdrh key_opt(A) ::= .                     { A.type = 0; }
94925d6543dSdrh key_opt(A) ::= KEY ids(X).           { A.type=1; A.key = X; }
950feac5f8dSdrh key_opt(A) ::= KEY BLOB(X).          { A.type=2; A.key = X; }
951113088ecSdrh 
952113088ecSdrh database_kw_opt ::= DATABASE.
953113088ecSdrh database_kw_opt ::= .
954113088ecSdrh 
955113088ecSdrh //////////////////////// DETACH DATABASE name /////////////////////////////////
9561c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). {
9574adee20fSdanielk1977   sqlite3Detach(pParse, &D);
9581c2d8414Sdrh }
9594343fea2Sdrh 
9604343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
9614343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
9624343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
9634343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
9644343fea2Sdrh %endif
9659fd2a9a0Sdanielk1977 
9669fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
9679fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
9689fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
9699fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
9709fd2a9a0Sdanielk1977 }
9719fd2a9a0Sdanielk1977 %endif
972