xref: /sqlite-3.40.0/src/parse.y (revision caec2f12)
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*caec2f12Sdrh ** @(#) $Id: parse.y,v 1.86 2003/01/07 02:47:48 drh Exp $
18348784efSdrh */
19348784efSdrh %token_prefix TK_
20348784efSdrh %token_type {Token}
21f57b14a6Sdrh %default_type {Token}
22348784efSdrh %extra_argument {Parse *pParse}
23348784efSdrh %syntax_error {
24c837e709Sdrh   sqliteSetString(&pParse->zErrMsg,"syntax error",0);
25348784efSdrh   pParse->sErrToken = TOKEN;
26348784efSdrh }
27348784efSdrh %name sqliteParser
28348784efSdrh %include {
29348784efSdrh #include "sqliteInt.h"
30348784efSdrh #include "parse.h"
319bbca4c1Sdrh 
329bbca4c1Sdrh /*
33ad3cab52Sdrh ** An instance of this structure holds information about the
34ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
359bbca4c1Sdrh */
36ad3cab52Sdrh struct LimitVal {
37ad3cab52Sdrh   int limit;    /* The LIMIT value.  -1 if there is no limit */
38ad3cab52Sdrh   int offset;   /* The OFFSET.  0 if there is none */
39ad3cab52Sdrh };
40c3f9bad2Sdanielk1977 
41c3f9bad2Sdanielk1977 /*
42ad3cab52Sdrh ** An instance of the following structure describes the event of a
43ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
44ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
45ad3cab52Sdrh **
46ad3cab52Sdrh **      UPDATE ON (a,b,c)
47ad3cab52Sdrh **
48ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
49c3f9bad2Sdanielk1977 */
50ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
51*caec2f12Sdrh 
52*caec2f12Sdrh } // end %include
53348784efSdrh 
54348784efSdrh // These are extra tokens used by the lexer but never seen by the
55348784efSdrh // parser.  We put them in a rule so that the parser generator will
566206d50aSdrh // add them to the parse.h output file.
57348784efSdrh //
58c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
59c4a3c779Sdrh           COLUMN AGG_FUNCTION.
60c4a3c779Sdrh 
61c4a3c779Sdrh // Input is zero or more commands.
62c4a3c779Sdrh input ::= cmdlist.
63348784efSdrh 
64348784efSdrh // A list of commands is zero or more commands
65348784efSdrh //
66348784efSdrh cmdlist ::= ecmd.
67094b2bbfSdrh cmdlist ::= cmdlist ecmd.
68094b2bbfSdrh ecmd ::= explain cmd SEMI.  {sqliteExec(pParse);}
69094b2bbfSdrh ecmd ::= SEMI.
70e0bc4048Sdrh explain ::= EXPLAIN.    { sqliteBeginParse(pParse, 1); }
71e0bc4048Sdrh explain ::= .           { sqliteBeginParse(pParse, 0); }
72348784efSdrh 
73382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
74c4a3c779Sdrh //
75fa86c412Sdrh 
760d65dc0eSdrh cmd ::= BEGIN trans_opt onconf(R).  {sqliteBeginTransaction(pParse,R);}
77c4a3c779Sdrh trans_opt ::= .
78c4a3c779Sdrh trans_opt ::= TRANSACTION.
795ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
80c4a3c779Sdrh cmd ::= COMMIT trans_opt.      {sqliteCommitTransaction(pParse);}
81c4a3c779Sdrh cmd ::= END trans_opt.         {sqliteCommitTransaction(pParse);}
82c4a3c779Sdrh cmd ::= ROLLBACK trans_opt.    {sqliteRollbackTransaction(pParse);}
83c4a3c779Sdrh 
84382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
85348784efSdrh //
86348784efSdrh cmd ::= create_table create_table_args.
875ad1a6c8Sdrh create_table ::= CREATE(X) temp(T) TABLE nm(Y). {
88969fa7c1Sdrh    sqliteStartTable(pParse,&X,&Y,T);
89969fa7c1Sdrh }
90f57b3399Sdrh %type temp {int}
91e0bc4048Sdrh temp(A) ::= TEMP.  {A = pParse->isTemp || !pParse->initFlag;}
92e0bc4048Sdrh temp(A) ::= .      {A = pParse->isTemp;}
93969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
94969fa7c1Sdrh   sqliteEndTable(pParse,&X,0);
95969fa7c1Sdrh }
96969fa7c1Sdrh create_table_args ::= AS select(S). {
97969fa7c1Sdrh   sqliteEndTable(pParse,0,S);
98969fa7c1Sdrh   sqliteSelectDelete(S);
99969fa7c1Sdrh }
100348784efSdrh columnlist ::= columnlist COMMA column.
101348784efSdrh columnlist ::= column.
102348784efSdrh 
103348784efSdrh // About the only information used for a column is the name of the
104348784efSdrh // column.  The type is always just "text".  But the code will accept
105348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
106348784efSdrh //
107348784efSdrh column ::= columnid type carglist.
1085ad1a6c8Sdrh columnid ::= nm(X).                {sqliteAddColumn(pParse,&X);}
109c4a3c779Sdrh 
110c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
111c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
112c4a3c779Sdrh //
113982cef7eSdrh %type id {Token}
114f18543caSdrh id(A) ::= ID(X).         {A = X;}
1150bd1f4eaSdrh 
11634e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
11734e33bb8Sdrh // fallback to ID if they will not parse as their original value.
11834e33bb8Sdrh // This obviates the need for the "id" nonterminal.
11934e33bb8Sdrh //
1200bd1f4eaSdrh %fallback ID
121f04d5081Sdrh   ABORT AFTER ASC BEFORE BEGIN CASCADE CLUSTER CONFLICT
1220bd1f4eaSdrh   COPY DEFERRED DELIMITERS DESC EACH END EXPLAIN FAIL FOR
1235ad1a6c8Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD MATCH KEY
1245ad1a6c8Sdrh   OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
1250bd1f4eaSdrh   TEMP TRIGGER VACUUM VIEW.
126c4a3c779Sdrh 
127c4a3c779Sdrh // And "ids" is an identifer-or-string.
128c4a3c779Sdrh //
129c4a3c779Sdrh %type ids {Token}
1305ad1a6c8Sdrh ids(A) ::= ID(X).        {A = X;}
131c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
132c4a3c779Sdrh 
1335ad1a6c8Sdrh // The name of a column or table can be any of the following:
1345ad1a6c8Sdrh //
1355ad1a6c8Sdrh %type nm {Token}
1365ad1a6c8Sdrh nm(A) ::= ID(X).         {A = X;}
1375ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
1385ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
1395ad1a6c8Sdrh 
140382c0247Sdrh type ::= .
141382c0247Sdrh type ::= typename(X).                    {sqliteAddColumnType(pParse,&X,&X);}
142382c0247Sdrh type ::= typename(X) LP signed RP(Y).    {sqliteAddColumnType(pParse,&X,&Y);}
143382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
144382c0247Sdrh                                          {sqliteAddColumnType(pParse,&X,&Y);}
145382c0247Sdrh %type typename {Token}
146382c0247Sdrh typename(A) ::= ids(X).           {A = X;}
147382c0247Sdrh typename(A) ::= typename(X) ids.  {A = X;}
148348784efSdrh signed ::= INTEGER.
149348784efSdrh signed ::= PLUS INTEGER.
150348784efSdrh signed ::= MINUS INTEGER.
151348784efSdrh carglist ::= carglist carg.
152348784efSdrh carglist ::= .
1535ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
154348784efSdrh carg ::= ccons.
1557020f651Sdrh carg ::= DEFAULT STRING(X).          {sqliteAddDefaultValue(pParse,&X,0);}
1567020f651Sdrh carg ::= DEFAULT ID(X).              {sqliteAddDefaultValue(pParse,&X,0);}
1577020f651Sdrh carg ::= DEFAULT INTEGER(X).         {sqliteAddDefaultValue(pParse,&X,0);}
1587020f651Sdrh carg ::= DEFAULT PLUS INTEGER(X).    {sqliteAddDefaultValue(pParse,&X,0);}
1597020f651Sdrh carg ::= DEFAULT MINUS INTEGER(X).   {sqliteAddDefaultValue(pParse,&X,1);}
1607020f651Sdrh carg ::= DEFAULT FLOAT(X).           {sqliteAddDefaultValue(pParse,&X,0);}
1617020f651Sdrh carg ::= DEFAULT PLUS FLOAT(X).      {sqliteAddDefaultValue(pParse,&X,0);}
1627020f651Sdrh carg ::= DEFAULT MINUS FLOAT(X).     {sqliteAddDefaultValue(pParse,&X,1);}
1637020f651Sdrh carg ::= DEFAULT NULL.
164348784efSdrh 
165382c0247Sdrh // In addition to the type name, we also care about the primary key and
166382c0247Sdrh // UNIQUE constraints.
167348784efSdrh //
1680d316a40Sdrh ccons ::= NULL onconf.
1699cfcf5d4Sdrh ccons ::= NOT NULL onconf(R).               {sqliteAddNotNull(pParse, R);}
1709cfcf5d4Sdrh ccons ::= PRIMARY KEY sortorder onconf(R).  {sqliteAddPrimaryKey(pParse,0,R);}
1719cfcf5d4Sdrh ccons ::= UNIQUE onconf(R).            {sqliteCreateIndex(pParse,0,0,0,R,0,0);}
1729cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
173c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
174c2eef3b3Sdrh                                 {sqliteCreateForeignKey(pParse,0,&T,TA,R);}
175c2eef3b3Sdrh ccons ::= defer_subclause(D).   {sqliteDeferForeignKey(pParse,D);}
1768e2ca029Sdrh ccons ::= COLLATE id(C).  {
1778e2ca029Sdrh    sqliteAddCollateType(pParse, sqliteCollateType(pParse, &C));
1788e2ca029Sdrh }
17904738cb9Sdrh 
180c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
181c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
182c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
183c2eef3b3Sdrh // check fails.
18404738cb9Sdrh //
185c2eef3b3Sdrh %type refargs {int}
186c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
187c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
188c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
189c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
190c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
191c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
192c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
193c2eef3b3Sdrh %type refact {int}
194c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
195c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
196c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
197c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
198c2eef3b3Sdrh %type defer_subclause {int}
199c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
200c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
201c2eef3b3Sdrh %type init_deferred_pred_opt {int}
202c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
203c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
204c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
205348784efSdrh 
206348784efSdrh // For the time being, the only constraint we care about is the primary
207382c0247Sdrh // key and UNIQUE.  Both create indices.
208348784efSdrh //
209348784efSdrh conslist_opt ::= .
210348784efSdrh conslist_opt ::= COMMA conslist.
211348784efSdrh conslist ::= conslist COMMA tcons.
212a2e1bb5aSdrh conslist ::= conslist tcons.
213348784efSdrh conslist ::= tcons.
2145ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
2159cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
2169cfcf5d4Sdrh                                              {sqliteAddPrimaryKey(pParse,X,R);}
2179cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
2189cfcf5d4Sdrh                                        {sqliteCreateIndex(pParse,0,0,X,R,0,0);}
2199cfcf5d4Sdrh tcons ::= CHECK expr onconf.
220c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
221c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
222c2eef3b3Sdrh     sqliteCreateForeignKey(pParse, FA, &T, TA, R);
223c2eef3b3Sdrh     sqliteDeferForeignKey(pParse, D);
224c2eef3b3Sdrh }
225c2eef3b3Sdrh %type defer_subclause_opt {int}
226c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
227c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
2289cfcf5d4Sdrh 
2299cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2309cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2319cfcf5d4Sdrh //
2329cfcf5d4Sdrh %type onconf {int}
2331c92853dSdrh %type orconf {int}
2341c92853dSdrh %type resolvetype {int}
2351c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
2361c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
2371c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
2381c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
2391c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
2401c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
2411c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
2421c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
2431c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
244348784efSdrh 
245382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
246348784efSdrh //
2475ad1a6c8Sdrh cmd ::= DROP TABLE nm(X).          {sqliteDropTable(pParse,&X,0);}
248348784efSdrh 
249a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
250a76b5dfcSdrh //
2516276c1cbSdrh cmd ::= CREATE(X) temp(T) VIEW nm(Y) AS select(S). {
2526276c1cbSdrh   sqliteCreateView(pParse, &X, &Y, S, T);
253a76b5dfcSdrh }
2545ad1a6c8Sdrh cmd ::= DROP VIEW nm(X). {
2554ff6dfa7Sdrh   sqliteDropTable(pParse, &X, 1);
256a76b5dfcSdrh }
257a76b5dfcSdrh 
258382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
259348784efSdrh //
2609bb61fe7Sdrh cmd ::= select(X).  {
261832508b7Sdrh   sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0);
2629bb61fe7Sdrh   sqliteSelectDelete(X);
2639bb61fe7Sdrh }
264efb7251dSdrh 
2659bb61fe7Sdrh %type select {Select*}
2669bb61fe7Sdrh %destructor select {sqliteSelectDelete($$);}
26782c3d636Sdrh %type oneselect {Select*}
26882c3d636Sdrh %destructor oneselect {sqliteSelectDelete($$);}
2699bb61fe7Sdrh 
27082c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
2710a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
272daffd0e5Sdrh   if( Z ){
27382c3d636Sdrh     Z->op = Y;
27482c3d636Sdrh     Z->pPrior = X;
275daffd0e5Sdrh   }
27682c3d636Sdrh   A = Z;
27782c3d636Sdrh }
2780a36c57eSdrh %type multiselect_op {int}
2790a36c57eSdrh multiselect_op(A) ::= UNION.      {A = TK_UNION;}
2800a36c57eSdrh multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
2810a36c57eSdrh multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
2820a36c57eSdrh multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
28382c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
2849bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
285ad3cab52Sdrh   A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
2869bb61fe7Sdrh }
2879bb61fe7Sdrh 
2889bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
2899bb61fe7Sdrh // present and false (0) if it is not.
2909bb61fe7Sdrh //
291efb7251dSdrh %type distinct {int}
292efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
293fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
294efb7251dSdrh distinct(A) ::= .           {A = 0;}
295348784efSdrh 
2969bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
2977c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
2987c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
2997c917d19Sdrh // opcode of TK_ALL.
3009bb61fe7Sdrh //
301348784efSdrh %type selcollist {ExprList*}
302348784efSdrh %destructor selcollist {sqliteExprListDelete($$);}
303348784efSdrh %type sclp {ExprList*}
304348784efSdrh %destructor sclp {sqliteExprListDelete($$);}
305348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
306348784efSdrh sclp(A) ::= .                                {A = 0;}
30701f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
30801f3f253Sdrh    A = sqliteExprListAppend(P,X,Y.n?&Y:0);
30901f3f253Sdrh }
3107c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
3117c917d19Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0);
3127c917d19Sdrh }
3135ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
31454473229Sdrh   Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0);
31554473229Sdrh   Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X);
31654473229Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0);
31754473229Sdrh }
31801f3f253Sdrh 
31901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
32001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
32101f3f253Sdrh //
32201f3f253Sdrh %type as {Token}
3235ad1a6c8Sdrh as(X) ::= AS nm(Y).    { X = Y; }
3245ad1a6c8Sdrh as(X) ::= ids(Y).      { X = Y; }
32501f3f253Sdrh as(X) ::= .            { X.n = 0; }
3269bb61fe7Sdrh 
327348784efSdrh 
328ad3cab52Sdrh %type seltablist {SrcList*}
329ad3cab52Sdrh %destructor seltablist {sqliteSrcListDelete($$);}
330ad3cab52Sdrh %type stl_prefix {SrcList*}
331ad3cab52Sdrh %destructor stl_prefix {sqliteSrcListDelete($$);}
332ad3cab52Sdrh %type from {SrcList*}
333ad3cab52Sdrh %destructor from {sqliteSrcListDelete($$);}
334348784efSdrh 
33501f3f253Sdrh // A complete FROM clause.
33601f3f253Sdrh //
337bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
338348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
33901f3f253Sdrh 
34001f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
34101f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
34201f3f253Sdrh //
34301f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
34401f3f253Sdrh    A = X;
34501f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
34601f3f253Sdrh }
347348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
3485ad1a6c8Sdrh seltablist(A) ::= stl_prefix(X) nm(Y) as(Z) on_opt(N) using_opt(U). {
349ad3cab52Sdrh   A = sqliteSrcListAppend(X,&Y);
35001f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
35101f3f253Sdrh   if( N ){
35201f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
35301f3f253Sdrh     else { sqliteExprDelete(N); }
354c4a3c779Sdrh   }
35501f3f253Sdrh   if( U ){
35601f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
35701f3f253Sdrh     else { sqliteIdListDelete(U); }
35801f3f253Sdrh   }
35901f3f253Sdrh }
36001f3f253Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP as(Z) on_opt(N) using_opt(U). {
361ad3cab52Sdrh   A = sqliteSrcListAppend(X,0);
362ad3cab52Sdrh   A->a[A->nSrc-1].pSelect = S;
36301f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
36401f3f253Sdrh   if( N ){
36501f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
36601f3f253Sdrh     else { sqliteExprDelete(N); }
36722f70c32Sdrh   }
36801f3f253Sdrh   if( U ){
36901f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
37001f3f253Sdrh     else { sqliteIdListDelete(U); }
371d5feede1Sdrh   }
37222f70c32Sdrh }
373348784efSdrh 
37401f3f253Sdrh %type joinop {int}
37501f3f253Sdrh %type joinop2 {int}
37601f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
37701f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
3785ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqliteJoinType(pParse,&A,0,0); }
3795ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqliteJoinType(pParse,&A,&B,0); }
3805ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
3815ad1a6c8Sdrh                                        { X = sqliteJoinType(pParse,&A,&B,&C); }
38201f3f253Sdrh 
38301f3f253Sdrh %type on_opt {Expr*}
38401f3f253Sdrh %destructor on_opt {sqliteExprDelete($$);}
38501f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
38601f3f253Sdrh on_opt(N) ::= .             {N = 0;}
38701f3f253Sdrh 
38801f3f253Sdrh %type using_opt {IdList*}
38901f3f253Sdrh %destructor using_opt {sqliteIdListDelete($$);}
39001f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP.  {U = L;}
39101f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
39201f3f253Sdrh 
39301f3f253Sdrh 
394348784efSdrh %type orderby_opt {ExprList*}
395348784efSdrh %destructor orderby_opt {sqliteExprListDelete($$);}
396348784efSdrh %type sortlist {ExprList*}
397348784efSdrh %destructor sortlist {sqliteExprListDelete($$);}
398348784efSdrh %type sortitem {Expr*}
399348784efSdrh %destructor sortitem {sqliteExprDelete($$);}
400348784efSdrh 
401348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
402348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
4038e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
404348784efSdrh   A = sqliteExprListAppend(X,Y,0);
4058e2ca029Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = C+Z;
406348784efSdrh }
40738640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
408348784efSdrh   A = sqliteExprListAppend(0,Y,0);
40938640e15Sdrh   if( A ) A->a[0].sortOrder = C+Z;
410348784efSdrh }
411da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
412348784efSdrh 
413348784efSdrh %type sortorder {int}
4148e2ca029Sdrh %type collate {int}
415348784efSdrh 
4168e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
4178e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
4188e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
4198e2ca029Sdrh collate(C) ::= .                {C = SQLITE_SO_UNK;}
4208e2ca029Sdrh collate(C) ::= COLLATE id(X).   {C = sqliteCollateType(pParse, &X);}
421348784efSdrh 
4222282792aSdrh %type groupby_opt {ExprList*}
4232282792aSdrh %destructor groupby_opt {sqliteExprListDelete($$);}
4242282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
4252282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
4262282792aSdrh 
4272282792aSdrh %type having_opt {Expr*}
4282282792aSdrh %destructor having_opt {sqliteExprDelete($$);}
4292282792aSdrh having_opt(A) ::= .                {A = 0;}
4302282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
4312282792aSdrh 
432ad3cab52Sdrh %type limit_opt {struct LimitVal}
433ad3cab52Sdrh limit_opt(A) ::= .                  {A.limit = -1; A.offset = 0;}
434ad3cab52Sdrh limit_opt(A) ::= LIMIT INTEGER(X).  {A.limit = atoi(X.z); A.offset = 0;}
4359bbca4c1Sdrh limit_opt(A) ::= LIMIT INTEGER(X) limit_sep INTEGER(Y).
436ad3cab52Sdrh                                     {A.limit = atoi(X.z); A.offset = atoi(Y.z);}
4379bbca4c1Sdrh limit_sep ::= OFFSET.
4389bbca4c1Sdrh limit_sep ::= COMMA.
4399bbca4c1Sdrh 
440382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
441382c0247Sdrh //
4425ad1a6c8Sdrh cmd ::= DELETE FROM nm(X) where_opt(Y).
443348784efSdrh     {sqliteDeleteFrom(pParse, &X, Y);}
444348784efSdrh 
445348784efSdrh %type where_opt {Expr*}
446348784efSdrh %destructor where_opt {sqliteExprDelete($$);}
447348784efSdrh 
448348784efSdrh where_opt(A) ::= .                    {A = 0;}
449348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
450348784efSdrh 
451348784efSdrh %type setlist {ExprList*}
452348784efSdrh %destructor setlist {sqliteExprListDelete($$);}
453348784efSdrh 
454382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
455382c0247Sdrh //
4565ad1a6c8Sdrh cmd ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
4579cfcf5d4Sdrh     {sqliteUpdate(pParse,&X,Y,Z,R);}
458348784efSdrh 
4595ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
460348784efSdrh     {A = sqliteExprListAppend(Z,Y,&X);}
4615ad1a6c8Sdrh setlist(A) ::= nm(X) EQ expr(Y).   {A = sqliteExprListAppend(0,Y,&X);}
462348784efSdrh 
463382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
464382c0247Sdrh //
4655ad1a6c8Sdrh cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
4669cfcf5d4Sdrh                {sqliteInsert(pParse, &X, Y, 0, F, R);}
4675ad1a6c8Sdrh cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
4689cfcf5d4Sdrh                {sqliteInsert(pParse, &X, 0, S, F, R);}
469348784efSdrh 
470fa86c412Sdrh %type insert_cmd {int}
471fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
472fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
473fa86c412Sdrh 
474348784efSdrh 
475348784efSdrh %type itemlist {ExprList*}
476348784efSdrh %destructor itemlist {sqliteExprListDelete($$);}
477348784efSdrh 
478e64e7b20Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqliteExprListAppend(X,Y,0);}
479e64e7b20Sdrh itemlist(A) ::= expr(X).                    {A = sqliteExprListAppend(0,X,0);}
480348784efSdrh 
481967e8b73Sdrh %type inscollist_opt {IdList*}
482967e8b73Sdrh %destructor inscollist_opt {sqliteIdListDelete($$);}
483967e8b73Sdrh %type inscollist {IdList*}
484967e8b73Sdrh %destructor inscollist {sqliteIdListDelete($$);}
485348784efSdrh 
486967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
487967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
4885ad1a6c8Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = sqliteIdListAppend(X,&Y);}
4895ad1a6c8Sdrh inscollist(A) ::= nm(Y).                      {A = sqliteIdListAppend(0,&Y);}
490348784efSdrh 
491382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
492382c0247Sdrh //
493348784efSdrh %left OR.
494348784efSdrh %left AND.
4958be51133Sdrh %right NOT.
496fef5208cSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
497348784efSdrh %left GT GE LT LE.
49881a20f21Sdrh %left BITAND BITOR LSHIFT RSHIFT.
499348784efSdrh %left PLUS MINUS.
500bf4133cbSdrh %left STAR SLASH REM.
5010040077dSdrh %left CONCAT.
5024b59ab5eSdrh %right UMINUS UPLUS BITNOT.
5031f16230bSdrh %right ORACLE_OUTER_JOIN.
504348784efSdrh 
505348784efSdrh %type expr {Expr*}
506348784efSdrh %destructor expr {sqliteExprDelete($$);}
507348784efSdrh 
508e1b6a5b8Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E); }
509e1b6a5b8Sdrh expr(A) ::= NULL(X).             {A = sqliteExpr(TK_NULL, 0, 0, &X);}
5105ad1a6c8Sdrh expr(A) ::= ID(X).               {A = sqliteExpr(TK_ID, 0, 0, &X);}
5115ad1a6c8Sdrh expr(A) ::= JOIN_KW(X).          {A = sqliteExpr(TK_ID, 0, 0, &X);}
5125ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
513e1b6a5b8Sdrh   Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
514348784efSdrh   Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
515e1b6a5b8Sdrh   A = sqliteExpr(TK_DOT, temp1, temp2, 0);
516e1b6a5b8Sdrh }
5171f16230bSdrh expr(A) ::= expr(B) ORACLE_OUTER_JOIN.
5181f16230bSdrh                              {A = B; ExprSetProperty(A,EP_Oracle8Join);}
519348784efSdrh expr(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
520348784efSdrh expr(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
521348784efSdrh expr(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
522e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
523e1b6a5b8Sdrh   A = sqliteExprFunction(Y, &X);
524e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
525e1b6a5b8Sdrh }
526e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
527e1b6a5b8Sdrh   A = sqliteExprFunction(0, &X);
528e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
529e1b6a5b8Sdrh }
530348784efSdrh expr(A) ::= expr(X) AND expr(Y).   {A = sqliteExpr(TK_AND, X, Y, 0);}
531348784efSdrh expr(A) ::= expr(X) OR expr(Y).    {A = sqliteExpr(TK_OR, X, Y, 0);}
532348784efSdrh expr(A) ::= expr(X) LT expr(Y).    {A = sqliteExpr(TK_LT, X, Y, 0);}
533348784efSdrh expr(A) ::= expr(X) GT expr(Y).    {A = sqliteExpr(TK_GT, X, Y, 0);}
534348784efSdrh expr(A) ::= expr(X) LE expr(Y).    {A = sqliteExpr(TK_LE, X, Y, 0);}
535348784efSdrh expr(A) ::= expr(X) GE expr(Y).    {A = sqliteExpr(TK_GE, X, Y, 0);}
536348784efSdrh expr(A) ::= expr(X) NE expr(Y).    {A = sqliteExpr(TK_NE, X, Y, 0);}
537348784efSdrh expr(A) ::= expr(X) EQ expr(Y).    {A = sqliteExpr(TK_EQ, X, Y, 0);}
53881a20f21Sdrh expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
53981a20f21Sdrh expr(A) ::= expr(X) BITOR expr(Y).  {A = sqliteExpr(TK_BITOR, X, Y, 0);}
54081a20f21Sdrh expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
54181a20f21Sdrh expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);}
5420ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
5430ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
5440ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
5454b59ab5eSdrh   A = sqliteExprFunction(pList, 0);
5464b59ab5eSdrh   if( A ) A->op = OP;
5476977fea8Sdrh   sqliteExprSpan(A, &X->span, &Y->span);
5480ac65892Sdrh }
5490ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
5500ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
5510ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
5524b59ab5eSdrh   A = sqliteExprFunction(pList, 0);
5534b59ab5eSdrh   if( A ) A->op = OP;
5544794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
5556977fea8Sdrh   sqliteExprSpan(A,&X->span,&Y->span);
5564794b980Sdrh }
5574b59ab5eSdrh %type likeop {int}
5584b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;}
5594b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;}
560348784efSdrh expr(A) ::= expr(X) PLUS expr(Y).  {A = sqliteExpr(TK_PLUS, X, Y, 0);}
561348784efSdrh expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
562348784efSdrh expr(A) ::= expr(X) STAR expr(Y).  {A = sqliteExpr(TK_STAR, X, Y, 0);}
563348784efSdrh expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
564bf4133cbSdrh expr(A) ::= expr(X) REM expr(Y).   {A = sqliteExpr(TK_REM, X, Y, 0);}
5650040077dSdrh expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
566e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
567e1b6a5b8Sdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
5686977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
569e1b6a5b8Sdrh }
57033048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
57133048c0bSdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
5726977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
57333048c0bSdrh }
57433048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
57533048c0bSdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
5766977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
57733048c0bSdrh }
578e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
579e1b6a5b8Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
5806977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
581e1b6a5b8Sdrh }
58281a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
58381a20f21Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
5846977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
58581a20f21Sdrh }
586e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
587e1b6a5b8Sdrh   A = sqliteExpr(TK_NOT, X, 0, 0);
5886977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
589e1b6a5b8Sdrh }
59081a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
59181a20f21Sdrh   A = sqliteExpr(TK_BITNOT, X, 0, 0);
5926977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
59381a20f21Sdrh }
594e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
595e1b6a5b8Sdrh   A = sqliteExpr(TK_UMINUS, X, 0, 0);
5966977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
597e1b6a5b8Sdrh }
5984b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
5994b59ab5eSdrh   A = sqliteExpr(TK_UPLUS, X, 0, 0);
6006977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
601e1b6a5b8Sdrh }
602e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
60319a775c2Sdrh   A = sqliteExpr(TK_SELECT, 0, 0, 0);
604daffd0e5Sdrh   if( A ) A->pSelect = X;
605e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&E);
60619a775c2Sdrh }
607fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
608fef5208cSdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
609fef5208cSdrh   pList = sqliteExprListAppend(pList, Y, 0);
610fef5208cSdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
611daffd0e5Sdrh   if( A ) A->pList = pList;
6126977fea8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
613fef5208cSdrh }
6144794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
6154794b980Sdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
6164794b980Sdrh   pList = sqliteExprListAppend(pList, Y, 0);
6174794b980Sdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
618daffd0e5Sdrh   if( A ) A->pList = pList;
6194794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
6206977fea8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
6214794b980Sdrh }
622e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
623fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
624daffd0e5Sdrh   if( A ) A->pList = Y;
6256977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
626fef5208cSdrh }
627e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
628fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
629daffd0e5Sdrh   if( A ) A->pSelect = Y;
6306977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
631fef5208cSdrh }
632e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
6334794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
634daffd0e5Sdrh   if( A ) A->pList = Y;
6354794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
6366977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
6374794b980Sdrh }
638e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
6394794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
640daffd0e5Sdrh   if( A ) A->pSelect = Y;
6414794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
6426977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
6434794b980Sdrh }
644fef5208cSdrh 
64517a7f8ddSdrh /* CASE expressions */
64617a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
64717a7f8ddSdrh   A = sqliteExpr(TK_CASE, X, Z, 0);
64817a7f8ddSdrh   if( A ) A->pList = Y;
64917a7f8ddSdrh   sqliteExprSpan(A, &C, &E);
65017a7f8ddSdrh }
65117a7f8ddSdrh %type case_exprlist {ExprList*}
65217a7f8ddSdrh %destructor case_exprlist {sqliteExprListDelete($$);}
65317a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
65417a7f8ddSdrh   A = sqliteExprListAppend(X, Y, 0);
65517a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
65617a7f8ddSdrh }
65717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
65817a7f8ddSdrh   A = sqliteExprListAppend(0, Y, 0);
65917a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
66017a7f8ddSdrh }
66117a7f8ddSdrh %type case_else {Expr*}
66217a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
66317a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
66417a7f8ddSdrh %type case_operand {Expr*}
66517a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
66617a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
667348784efSdrh 
668348784efSdrh %type exprlist {ExprList*}
669348784efSdrh %destructor exprlist {sqliteExprListDelete($$);}
670348784efSdrh %type expritem {Expr*}
671348784efSdrh %destructor expritem {sqliteExprDelete($$);}
672348784efSdrh 
673348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
674348784efSdrh    {A = sqliteExprListAppend(X,Y,0);}
675348784efSdrh exprlist(A) ::= expritem(X).            {A = sqliteExprListAppend(0,X,0);}
676348784efSdrh expritem(A) ::= expr(X).                {A = X;}
677348784efSdrh expritem(A) ::= .                       {A = 0;}
678cce7d176Sdrh 
679382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
680382c0247Sdrh //
6815ad1a6c8Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X)
6825ad1a6c8Sdrh         ON nm(Y) LP idxlist(Z) RP(E) onconf(R). {
6839cfcf5d4Sdrh   if( U!=OE_None ) U = R;
6849cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
6859cfcf5d4Sdrh   sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);
6869cfcf5d4Sdrh }
687717e6402Sdrh 
688717e6402Sdrh %type uniqueflag {int}
6899cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
6909cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
691348784efSdrh 
692348784efSdrh %type idxlist {IdList*}
693348784efSdrh %destructor idxlist {sqliteIdListDelete($$);}
694c2eef3b3Sdrh %type idxlist_opt {IdList*}
695c2eef3b3Sdrh %destructor idxlist_opt {sqliteIdListDelete($$);}
696348784efSdrh %type idxitem {Token}
697348784efSdrh 
698c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
699c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
700c2eef3b3Sdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y).  {A = sqliteIdListAppend(X,&Y);}
701c2eef3b3Sdrh idxlist(A) ::= idxitem(Y).                   {A = sqliteIdListAppend(0,&Y);}
7025ad1a6c8Sdrh idxitem(A) ::= nm(X).                        {A = X;}
703348784efSdrh 
7048aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
705382c0247Sdrh //
706382c0247Sdrh 
7075ad1a6c8Sdrh cmd ::= DROP INDEX nm(X).      {sqliteDropIndex(pParse, &X);}
708982cef7eSdrh 
709382c0247Sdrh 
7108aff1015Sdrh ///////////////////////////// The COPY command ///////////////////////////////
711382c0247Sdrh //
7125ad1a6c8Sdrh cmd ::= COPY orconf(R) nm(X) FROM nm(Y) USING DELIMITERS STRING(Z).
713b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,&Z,R);}
7145ad1a6c8Sdrh cmd ::= COPY orconf(R) nm(X) FROM nm(Y).
715b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,0,R);}
716dce2cbe6Sdrh 
717382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
718382c0247Sdrh //
719dce2cbe6Sdrh cmd ::= VACUUM.                {sqliteVacuum(pParse,0);}
7205ad1a6c8Sdrh cmd ::= VACUUM nm(X).         {sqliteVacuum(pParse,&X);}
721f57b14a6Sdrh 
722382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
723382c0247Sdrh //
7245ad1a6c8Sdrh cmd ::= PRAGMA ids(X) EQ nm(Y).         {sqlitePragma(pParse,&X,&Y,0);}
725f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlitePragma(pParse,&X,&Y,0);}
726f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlitePragma(pParse,&X,&Y,0);}
727f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlitePragma(pParse,&X,&Y,1);}
7285ad1a6c8Sdrh cmd ::= PRAGMA ids(X) LP nm(Y) RP.      {sqlitePragma(pParse,&X,&Y,0);}
729603240cfSdrh cmd ::= PRAGMA ids(X).                   {sqlitePragma(pParse,&X,&X,0);}
730f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
731f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
732f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
733f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
734f57b14a6Sdrh plus_opt ::= PLUS.
735f57b14a6Sdrh plus_opt ::= .
736c3f9bad2Sdanielk1977 
737c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
7385ad1a6c8Sdrh cmd ::= CREATE(A) TRIGGER nm(B) trigger_time(C) trigger_event(D) ON nm(E)
739c3f9bad2Sdanielk1977                   foreach_clause(F) when_clause(G)
740c3f9bad2Sdanielk1977                   BEGIN trigger_cmd_list(S) END(Z). {
7414b59ab5eSdrh   Token all;
7424b59ab5eSdrh   all.z = A.z;
7434b59ab5eSdrh   all.n = (Z.z - A.z) + Z.n;
7444b59ab5eSdrh   sqliteCreateTrigger(pParse, &B, C, D.a, D.b, &E, F, G, S, &all);
745c3f9bad2Sdanielk1977 }
746c3f9bad2Sdanielk1977 
747c3f9bad2Sdanielk1977 %type trigger_time  {int}
748c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
749c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
750c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
751c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
752c3f9bad2Sdanielk1977 
753ad3cab52Sdrh %type trigger_event {struct TrigEvent}
754ad3cab52Sdrh %destructor trigger_event {sqliteIdListDelete($$.b);}
755c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
756c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
757c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
758c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
759c3f9bad2Sdanielk1977 
760c3f9bad2Sdanielk1977 %type foreach_clause {int}
761c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
762c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
763c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
764c3f9bad2Sdanielk1977 
765c3f9bad2Sdanielk1977 %type when_clause {Expr *}
766c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
767c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
768c3f9bad2Sdanielk1977 
769c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *}
770c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
771c3f9bad2Sdanielk1977   X->pNext = Y ; A = X; }
772c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
773c3f9bad2Sdanielk1977 
774c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *}
775c3f9bad2Sdanielk1977 // UPDATE
7765ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
777c3f9bad2Sdanielk1977                { A = sqliteTriggerUpdateStep(&X, Y, Z, R); }
778c3f9bad2Sdanielk1977 
779c3f9bad2Sdanielk1977 // INSERT
7805ad1a6c8Sdrh trigger_cmd(A) ::= INSERT orconf(R) INTO nm(X) inscollist_opt(F)
781c3f9bad2Sdanielk1977   VALUES LP itemlist(Y) RP.
782c3f9bad2Sdanielk1977 {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);}
783c3f9bad2Sdanielk1977 
7845ad1a6c8Sdrh trigger_cmd(A) ::= INSERT orconf(R) INTO nm(X) inscollist_opt(F) select(S).
785c3f9bad2Sdanielk1977                {A = sqliteTriggerInsertStep(&X, F, 0, S, R);}
786c3f9bad2Sdanielk1977 
787c3f9bad2Sdanielk1977 // DELETE
7885ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
789c3f9bad2Sdanielk1977                {A = sqliteTriggerDeleteStep(&X, Y);}
790c3f9bad2Sdanielk1977 
791c3f9bad2Sdanielk1977 // SELECT
792c3f9bad2Sdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqliteTriggerSelectStep(X); }
793c3f9bad2Sdanielk1977 
7946f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
7954b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
7964b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, 0);
7974b59ab5eSdrh   A->iColumn = OE_Ignore;
7986977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
7994b59ab5eSdrh }
8004b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y).  {
8014b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, &Z);
8024b59ab5eSdrh   A->iColumn = OE_Rollback;
8036977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
8044b59ab5eSdrh }
8054b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y).  {
8064b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, &Z);
8074b59ab5eSdrh   A->iColumn = OE_Abort;
8086977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
8094b59ab5eSdrh }
8104b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y).  {
8114b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, &Z);
8124b59ab5eSdrh   A->iColumn = OE_Fail;
8136977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
8144b59ab5eSdrh }
8156f34903eSdanielk1977 
816c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
8175ad1a6c8Sdrh cmd ::= DROP TRIGGER nm(X). {
818c3f9bad2Sdanielk1977     sqliteDropTrigger(pParse,&X,0);
819c3f9bad2Sdanielk1977 }
820