xref: /sqlite-3.40.0/src/parse.y (revision e0bc4048)
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*e0bc4048Sdrh ** @(#) $Id: parse.y,v 1.75 2002/06/25 01:09:12 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; };
51348784efSdrh }
52348784efSdrh 
53348784efSdrh // These are extra tokens used by the lexer but never seen by the
54348784efSdrh // parser.  We put them in a rule so that the parser generator will
556206d50aSdrh // add them to the parse.h output file.
56348784efSdrh //
57c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
58c4a3c779Sdrh           COLUMN AGG_FUNCTION.
59c4a3c779Sdrh 
60c4a3c779Sdrh // Input is zero or more commands.
61c4a3c779Sdrh input ::= cmdlist.
62348784efSdrh 
63348784efSdrh // A list of commands is zero or more commands
64348784efSdrh //
65348784efSdrh cmdlist ::= ecmd.
66094b2bbfSdrh cmdlist ::= cmdlist ecmd.
67094b2bbfSdrh ecmd ::= explain cmd SEMI.  {sqliteExec(pParse);}
68094b2bbfSdrh ecmd ::= SEMI.
69*e0bc4048Sdrh explain ::= EXPLAIN.    { sqliteBeginParse(pParse, 1); }
70*e0bc4048Sdrh explain ::= .           { sqliteBeginParse(pParse, 0); }
71348784efSdrh 
72382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
73c4a3c779Sdrh //
74fa86c412Sdrh 
750d65dc0eSdrh cmd ::= BEGIN trans_opt onconf(R).  {sqliteBeginTransaction(pParse,R);}
76c4a3c779Sdrh trans_opt ::= .
77c4a3c779Sdrh trans_opt ::= TRANSACTION.
78c4a3c779Sdrh trans_opt ::= TRANSACTION ids.
79c4a3c779Sdrh cmd ::= COMMIT trans_opt.      {sqliteCommitTransaction(pParse);}
80c4a3c779Sdrh cmd ::= END trans_opt.         {sqliteCommitTransaction(pParse);}
81c4a3c779Sdrh cmd ::= ROLLBACK trans_opt.    {sqliteRollbackTransaction(pParse);}
82c4a3c779Sdrh 
83382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
84348784efSdrh //
85348784efSdrh cmd ::= create_table create_table_args.
86969fa7c1Sdrh create_table ::= CREATE(X) temp(T) TABLE ids(Y). {
87969fa7c1Sdrh    sqliteStartTable(pParse,&X,&Y,T);
88969fa7c1Sdrh }
89f57b3399Sdrh %type temp {int}
90*e0bc4048Sdrh temp(A) ::= TEMP.  {A = pParse->isTemp || !pParse->initFlag;}
91*e0bc4048Sdrh temp(A) ::= .      {A = pParse->isTemp;}
92969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
93969fa7c1Sdrh   sqliteEndTable(pParse,&X,0);
94969fa7c1Sdrh }
95969fa7c1Sdrh create_table_args ::= AS select(S). {
96969fa7c1Sdrh   sqliteEndTable(pParse,0,S);
97969fa7c1Sdrh   sqliteSelectDelete(S);
98969fa7c1Sdrh }
99348784efSdrh columnlist ::= columnlist COMMA column.
100348784efSdrh columnlist ::= column.
101348784efSdrh 
102348784efSdrh // About the only information used for a column is the name of the
103348784efSdrh // column.  The type is always just "text".  But the code will accept
104348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
105348784efSdrh //
106348784efSdrh column ::= columnid type carglist.
107c4a3c779Sdrh columnid ::= ids(X).                {sqliteAddColumn(pParse,&X);}
108c4a3c779Sdrh 
109c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
110c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
111c4a3c779Sdrh //
112982cef7eSdrh %type id {Token}
113f18543caSdrh id(A) ::= ID(X).         {A = X;}
1140bd1f4eaSdrh 
11534e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
11634e33bb8Sdrh // fallback to ID if they will not parse as their original value.
11734e33bb8Sdrh // This obviates the need for the "id" nonterminal.
11834e33bb8Sdrh //
1190bd1f4eaSdrh %fallback ID
1208e2ca029Sdrh   ABORT AFTER ASC BEFORE BEGIN CASCADE CLUSTER COLLATE CONFLICT
1210bd1f4eaSdrh   COPY DEFERRED DELIMITERS DESC EACH END EXPLAIN FAIL FOR
1220bd1f4eaSdrh   FULL IGNORE IMMEDIATE INITIALLY INSTEAD MATCH JOIN KEY
1236f34903eSdanielk1977   OF OFFSET PARTIAL PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
1240bd1f4eaSdrh   TEMP TRIGGER VACUUM VIEW.
125c4a3c779Sdrh 
126c4a3c779Sdrh // And "ids" is an identifer-or-string.
127c4a3c779Sdrh //
128c4a3c779Sdrh %type ids {Token}
129c4a3c779Sdrh ids(A) ::= id(X).        {A = X;}
130c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
131c4a3c779Sdrh 
132382c0247Sdrh type ::= .
133382c0247Sdrh type ::= typename(X).                    {sqliteAddColumnType(pParse,&X,&X);}
134382c0247Sdrh type ::= typename(X) LP signed RP(Y).    {sqliteAddColumnType(pParse,&X,&Y);}
135382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
136382c0247Sdrh                                          {sqliteAddColumnType(pParse,&X,&Y);}
137382c0247Sdrh %type typename {Token}
138382c0247Sdrh typename(A) ::= ids(X).           {A = X;}
139382c0247Sdrh typename(A) ::= typename(X) ids.  {A = X;}
140348784efSdrh signed ::= INTEGER.
141348784efSdrh signed ::= PLUS INTEGER.
142348784efSdrh signed ::= MINUS INTEGER.
143348784efSdrh carglist ::= carglist carg.
144348784efSdrh carglist ::= .
145c4a3c779Sdrh carg ::= CONSTRAINT ids ccons.
146348784efSdrh carg ::= ccons.
1477020f651Sdrh carg ::= DEFAULT STRING(X).          {sqliteAddDefaultValue(pParse,&X,0);}
1487020f651Sdrh carg ::= DEFAULT ID(X).              {sqliteAddDefaultValue(pParse,&X,0);}
1497020f651Sdrh carg ::= DEFAULT INTEGER(X).         {sqliteAddDefaultValue(pParse,&X,0);}
1507020f651Sdrh carg ::= DEFAULT PLUS INTEGER(X).    {sqliteAddDefaultValue(pParse,&X,0);}
1517020f651Sdrh carg ::= DEFAULT MINUS INTEGER(X).   {sqliteAddDefaultValue(pParse,&X,1);}
1527020f651Sdrh carg ::= DEFAULT FLOAT(X).           {sqliteAddDefaultValue(pParse,&X,0);}
1537020f651Sdrh carg ::= DEFAULT PLUS FLOAT(X).      {sqliteAddDefaultValue(pParse,&X,0);}
1547020f651Sdrh carg ::= DEFAULT MINUS FLOAT(X).     {sqliteAddDefaultValue(pParse,&X,1);}
1557020f651Sdrh carg ::= DEFAULT NULL.
156348784efSdrh 
157382c0247Sdrh // In addition to the type name, we also care about the primary key and
158382c0247Sdrh // UNIQUE constraints.
159348784efSdrh //
1609cfcf5d4Sdrh ccons ::= NOT NULL onconf(R).               {sqliteAddNotNull(pParse, R);}
1619cfcf5d4Sdrh ccons ::= PRIMARY KEY sortorder onconf(R).  {sqliteAddPrimaryKey(pParse,0,R);}
1629cfcf5d4Sdrh ccons ::= UNIQUE onconf(R).            {sqliteCreateIndex(pParse,0,0,0,R,0,0);}
1639cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
16404738cb9Sdrh ccons ::= references.
16504738cb9Sdrh ccons ::= defer_subclause.
1668e2ca029Sdrh ccons ::= COLLATE id(C).  {
1678e2ca029Sdrh    sqliteAddCollateType(pParse, sqliteCollateType(pParse, &C));
1688e2ca029Sdrh }
16904738cb9Sdrh 
17004738cb9Sdrh // A REFERENCES clause is parsed but the current implementation does not
17104738cb9Sdrh // do anything with it.
17204738cb9Sdrh //
17304738cb9Sdrh references ::= REFERENCES ids LP idxlist RP refargs.
17404738cb9Sdrh references ::= REFERENCES ids refargs.
17504738cb9Sdrh refargs ::= .
17604738cb9Sdrh refargs ::= refargs refarg.
17704738cb9Sdrh refarg ::= MATCH FULL.
17804738cb9Sdrh refarg ::= MATCH PARTIAL.
17904738cb9Sdrh refarg ::= ON DELETE refact.
18004738cb9Sdrh refarg ::= ON UPDATE refact.
18104738cb9Sdrh refact ::= SET NULL.
18204738cb9Sdrh refact ::= SET DEFAULT.
18304738cb9Sdrh refact ::= CASCADE.
18404738cb9Sdrh refact ::= RESTRICT.
18504738cb9Sdrh defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt.
18604738cb9Sdrh defer_subclause ::= DEFERRABLE init_deferred_pred_opt.
18704738cb9Sdrh init_deferred_pred_opt ::= .
18804738cb9Sdrh init_deferred_pred_opt ::= INITIALLY DEFERRED.
18904738cb9Sdrh init_deferred_pred_opt ::= INITIALLY IMMEDIATE.
190348784efSdrh 
191348784efSdrh // For the time being, the only constraint we care about is the primary
192382c0247Sdrh // key and UNIQUE.  Both create indices.
193348784efSdrh //
194348784efSdrh conslist_opt ::= .
195348784efSdrh conslist_opt ::= COMMA conslist.
196348784efSdrh conslist ::= conslist COMMA tcons.
197a2e1bb5aSdrh conslist ::= conslist tcons.
198348784efSdrh conslist ::= tcons.
199c4a3c779Sdrh tcons ::= CONSTRAINT ids.
2009cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
2019cfcf5d4Sdrh                                              {sqliteAddPrimaryKey(pParse,X,R);}
2029cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
2039cfcf5d4Sdrh                                        {sqliteCreateIndex(pParse,0,0,X,R,0,0);}
2049cfcf5d4Sdrh tcons ::= CHECK expr onconf.
20504738cb9Sdrh tcons ::= FOREIGN KEY LP idxlist RP references defer_subclause_opt.
20604738cb9Sdrh defer_subclause_opt ::= .
20704738cb9Sdrh defer_subclause_opt ::= defer_subclause.
2089cfcf5d4Sdrh 
2099cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2109cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2119cfcf5d4Sdrh //
2129cfcf5d4Sdrh %type onconf {int}
2131c92853dSdrh %type orconf {int}
2141c92853dSdrh %type resolvetype {int}
2151c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
2161c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
2171c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
2181c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
2191c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
2201c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
2211c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
2221c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
2231c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
224348784efSdrh 
225382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
226348784efSdrh //
2274ff6dfa7Sdrh cmd ::= DROP TABLE ids(X).          {sqliteDropTable(pParse,&X,0);}
228348784efSdrh 
229a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
230a76b5dfcSdrh //
231a76b5dfcSdrh cmd ::= CREATE(X) VIEW ids(Y) AS select(S). {
232a76b5dfcSdrh   sqliteCreateView(pParse, &X, &Y, S);
233a76b5dfcSdrh }
234a76b5dfcSdrh cmd ::= DROP VIEW ids(X). {
2354ff6dfa7Sdrh   sqliteDropTable(pParse, &X, 1);
236a76b5dfcSdrh }
237a76b5dfcSdrh 
238382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
239348784efSdrh //
2409bb61fe7Sdrh cmd ::= select(X).  {
241832508b7Sdrh   sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0);
2429bb61fe7Sdrh   sqliteSelectDelete(X);
2439bb61fe7Sdrh }
244efb7251dSdrh 
2459bb61fe7Sdrh %type select {Select*}
2469bb61fe7Sdrh %destructor select {sqliteSelectDelete($$);}
24782c3d636Sdrh %type oneselect {Select*}
24882c3d636Sdrh %destructor oneselect {sqliteSelectDelete($$);}
2499bb61fe7Sdrh 
25082c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
2510a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
252daffd0e5Sdrh   if( Z ){
25382c3d636Sdrh     Z->op = Y;
25482c3d636Sdrh     Z->pPrior = X;
255daffd0e5Sdrh   }
25682c3d636Sdrh   A = Z;
25782c3d636Sdrh }
2580a36c57eSdrh %type multiselect_op {int}
2590a36c57eSdrh multiselect_op(A) ::= UNION.      {A = TK_UNION;}
2600a36c57eSdrh multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
2610a36c57eSdrh multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
2620a36c57eSdrh multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
26382c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
2649bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
265ad3cab52Sdrh   A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
2669bb61fe7Sdrh }
2679bb61fe7Sdrh 
2689bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
2699bb61fe7Sdrh // present and false (0) if it is not.
2709bb61fe7Sdrh //
271efb7251dSdrh %type distinct {int}
272efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
273fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
274efb7251dSdrh distinct(A) ::= .           {A = 0;}
275348784efSdrh 
2769bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
2777c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
2787c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
2797c917d19Sdrh // opcode of TK_ALL.
2809bb61fe7Sdrh //
281348784efSdrh %type selcollist {ExprList*}
282348784efSdrh %destructor selcollist {sqliteExprListDelete($$);}
283348784efSdrh %type sclp {ExprList*}
284348784efSdrh %destructor sclp {sqliteExprListDelete($$);}
285348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
286348784efSdrh sclp(A) ::= .                                {A = 0;}
28701f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
28801f3f253Sdrh    A = sqliteExprListAppend(P,X,Y.n?&Y:0);
28901f3f253Sdrh }
2907c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
2917c917d19Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0);
2927c917d19Sdrh }
29354473229Sdrh selcollist(A) ::= sclp(P) ids(X) DOT STAR. {
29454473229Sdrh   Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0);
29554473229Sdrh   Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X);
29654473229Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0);
29754473229Sdrh }
29801f3f253Sdrh 
29901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
30001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
30101f3f253Sdrh //
30201f3f253Sdrh %type as {Token}
30301f3f253Sdrh as(X) ::= AS ids(Y).    { X = Y; }
30401f3f253Sdrh as(X) ::= .             { X.n = 0; }
3059bb61fe7Sdrh 
306348784efSdrh 
307ad3cab52Sdrh %type seltablist {SrcList*}
308ad3cab52Sdrh %destructor seltablist {sqliteSrcListDelete($$);}
309ad3cab52Sdrh %type stl_prefix {SrcList*}
310ad3cab52Sdrh %destructor stl_prefix {sqliteSrcListDelete($$);}
311ad3cab52Sdrh %type from {SrcList*}
312ad3cab52Sdrh %destructor from {sqliteSrcListDelete($$);}
313348784efSdrh 
31401f3f253Sdrh // A complete FROM clause.
31501f3f253Sdrh //
316bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
317348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
31801f3f253Sdrh 
31901f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
32001f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
32101f3f253Sdrh //
32201f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
32301f3f253Sdrh    A = X;
32401f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
32501f3f253Sdrh }
326348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
32701f3f253Sdrh seltablist(A) ::= stl_prefix(X) ids(Y) as(Z) on_opt(N) using_opt(U). {
328ad3cab52Sdrh   A = sqliteSrcListAppend(X,&Y);
32901f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
33001f3f253Sdrh   if( N ){
33101f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
33201f3f253Sdrh     else { sqliteExprDelete(N); }
333c4a3c779Sdrh   }
33401f3f253Sdrh   if( U ){
33501f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
33601f3f253Sdrh     else { sqliteIdListDelete(U); }
33701f3f253Sdrh   }
33801f3f253Sdrh }
33901f3f253Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP as(Z) on_opt(N) using_opt(U). {
340ad3cab52Sdrh   A = sqliteSrcListAppend(X,0);
341ad3cab52Sdrh   A->a[A->nSrc-1].pSelect = S;
342d5feede1Sdrh   if( S->pOrderBy ){
343d5feede1Sdrh     sqliteExprListDelete(S->pOrderBy);
344d5feede1Sdrh     S->pOrderBy = 0;
345d5feede1Sdrh   }
34601f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
34701f3f253Sdrh   if( N ){
34801f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
34901f3f253Sdrh     else { sqliteExprDelete(N); }
35022f70c32Sdrh   }
35101f3f253Sdrh   if( U ){
35201f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
35301f3f253Sdrh     else { sqliteIdListDelete(U); }
354d5feede1Sdrh   }
35522f70c32Sdrh }
356348784efSdrh 
35701f3f253Sdrh %type joinop {int}
35801f3f253Sdrh %type joinop2 {int}
35901f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
36001f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
36101f3f253Sdrh joinop(X) ::= ID(A) JOIN.              { X = sqliteJoinType(pParse,&A,0,0); }
36201f3f253Sdrh joinop(X) ::= ID(A) ID(B) JOIN.        { X = sqliteJoinType(pParse,&A,&B,0); }
36301f3f253Sdrh joinop(X) ::= ID(A) ID(B) ID(C) JOIN.  { X = sqliteJoinType(pParse,&A,&B,&C); }
36401f3f253Sdrh 
36501f3f253Sdrh %type on_opt {Expr*}
36601f3f253Sdrh %destructor on_opt {sqliteExprDelete($$);}
36701f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
36801f3f253Sdrh on_opt(N) ::= .             {N = 0;}
36901f3f253Sdrh 
37001f3f253Sdrh %type using_opt {IdList*}
37101f3f253Sdrh %destructor using_opt {sqliteIdListDelete($$);}
37201f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP.  {U = L;}
37301f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
37401f3f253Sdrh 
37501f3f253Sdrh 
376348784efSdrh %type orderby_opt {ExprList*}
377348784efSdrh %destructor orderby_opt {sqliteExprListDelete($$);}
378348784efSdrh %type sortlist {ExprList*}
379348784efSdrh %destructor sortlist {sqliteExprListDelete($$);}
380348784efSdrh %type sortitem {Expr*}
381348784efSdrh %destructor sortitem {sqliteExprDelete($$);}
382348784efSdrh 
383348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
384348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
3858e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
386348784efSdrh   A = sqliteExprListAppend(X,Y,0);
3878e2ca029Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = C+Z;
388348784efSdrh }
3899bb61fe7Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). {
390348784efSdrh   A = sqliteExprListAppend(0,Y,0);
391daffd0e5Sdrh   if( A ) A->a[0].sortOrder = Z;
392348784efSdrh }
393da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
394348784efSdrh 
395348784efSdrh %type sortorder {int}
3968e2ca029Sdrh %type collate {int}
397348784efSdrh 
3988e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
3998e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
4008e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
4018e2ca029Sdrh collate(C) ::= .                {C = SQLITE_SO_UNK;}
4028e2ca029Sdrh collate(C) ::= COLLATE id(X).   {C = sqliteCollateType(pParse, &X);}
403348784efSdrh 
4042282792aSdrh %type groupby_opt {ExprList*}
4052282792aSdrh %destructor groupby_opt {sqliteExprListDelete($$);}
4062282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
4072282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
4082282792aSdrh 
4092282792aSdrh %type having_opt {Expr*}
4102282792aSdrh %destructor having_opt {sqliteExprDelete($$);}
4112282792aSdrh having_opt(A) ::= .                {A = 0;}
4122282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
4132282792aSdrh 
414ad3cab52Sdrh %type limit_opt {struct LimitVal}
415ad3cab52Sdrh limit_opt(A) ::= .                  {A.limit = -1; A.offset = 0;}
416ad3cab52Sdrh limit_opt(A) ::= LIMIT INTEGER(X).  {A.limit = atoi(X.z); A.offset = 0;}
4179bbca4c1Sdrh limit_opt(A) ::= LIMIT INTEGER(X) limit_sep INTEGER(Y).
418ad3cab52Sdrh                                     {A.limit = atoi(X.z); A.offset = atoi(Y.z);}
4199bbca4c1Sdrh limit_sep ::= OFFSET.
4209bbca4c1Sdrh limit_sep ::= COMMA.
4219bbca4c1Sdrh 
422382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
423382c0247Sdrh //
424c4a3c779Sdrh cmd ::= DELETE FROM ids(X) where_opt(Y).
425348784efSdrh     {sqliteDeleteFrom(pParse, &X, Y);}
426348784efSdrh 
427348784efSdrh %type where_opt {Expr*}
428348784efSdrh %destructor where_opt {sqliteExprDelete($$);}
429348784efSdrh 
430348784efSdrh where_opt(A) ::= .                    {A = 0;}
431348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
432348784efSdrh 
433348784efSdrh %type setlist {ExprList*}
434348784efSdrh %destructor setlist {sqliteExprListDelete($$);}
435348784efSdrh 
436382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
437382c0247Sdrh //
4381c92853dSdrh cmd ::= UPDATE orconf(R) ids(X) SET setlist(Y) where_opt(Z).
4399cfcf5d4Sdrh     {sqliteUpdate(pParse,&X,Y,Z,R);}
440348784efSdrh 
441c4a3c779Sdrh setlist(A) ::= setlist(Z) COMMA ids(X) EQ expr(Y).
442348784efSdrh     {A = sqliteExprListAppend(Z,Y,&X);}
443c4a3c779Sdrh setlist(A) ::= ids(X) EQ expr(Y).   {A = sqliteExprListAppend(0,Y,&X);}
444348784efSdrh 
445382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
446382c0247Sdrh //
447fa86c412Sdrh cmd ::= insert_cmd(R) INTO ids(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
4489cfcf5d4Sdrh                {sqliteInsert(pParse, &X, Y, 0, F, R);}
449fa86c412Sdrh cmd ::= insert_cmd(R) INTO ids(X) inscollist_opt(F) select(S).
4509cfcf5d4Sdrh                {sqliteInsert(pParse, &X, 0, S, F, R);}
451348784efSdrh 
452fa86c412Sdrh %type insert_cmd {int}
453fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
454fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
455fa86c412Sdrh 
456348784efSdrh 
457348784efSdrh %type itemlist {ExprList*}
458348784efSdrh %destructor itemlist {sqliteExprListDelete($$);}
459348784efSdrh 
460e64e7b20Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqliteExprListAppend(X,Y,0);}
461e64e7b20Sdrh itemlist(A) ::= expr(X).                    {A = sqliteExprListAppend(0,X,0);}
462348784efSdrh 
463967e8b73Sdrh %type inscollist_opt {IdList*}
464967e8b73Sdrh %destructor inscollist_opt {sqliteIdListDelete($$);}
465967e8b73Sdrh %type inscollist {IdList*}
466967e8b73Sdrh %destructor inscollist {sqliteIdListDelete($$);}
467348784efSdrh 
468967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
469967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
470c4a3c779Sdrh inscollist(A) ::= inscollist(X) COMMA ids(Y). {A = sqliteIdListAppend(X,&Y);}
471c4a3c779Sdrh inscollist(A) ::= ids(Y).                     {A = sqliteIdListAppend(0,&Y);}
472348784efSdrh 
473382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
474382c0247Sdrh //
475348784efSdrh %left OR.
476348784efSdrh %left AND.
4778be51133Sdrh %right NOT.
478fef5208cSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
479348784efSdrh %left GT GE LT LE.
48081a20f21Sdrh %left BITAND BITOR LSHIFT RSHIFT.
481348784efSdrh %left PLUS MINUS.
482bf4133cbSdrh %left STAR SLASH REM.
4830040077dSdrh %left CONCAT.
48481a20f21Sdrh %right UMINUS BITNOT.
485348784efSdrh 
486348784efSdrh %type expr {Expr*}
487348784efSdrh %destructor expr {sqliteExprDelete($$);}
488348784efSdrh 
489e1b6a5b8Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E);}
490e1b6a5b8Sdrh expr(A) ::= NULL(X).             {A = sqliteExpr(TK_NULL, 0, 0, &X);}
491c4a3c779Sdrh expr(A) ::= id(X).               {A = sqliteExpr(TK_ID, 0, 0, &X);}
492c4a3c779Sdrh expr(A) ::= ids(X) DOT ids(Y). {
493e1b6a5b8Sdrh   Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
494348784efSdrh   Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
495e1b6a5b8Sdrh   A = sqliteExpr(TK_DOT, temp1, temp2, 0);
496e1b6a5b8Sdrh }
497348784efSdrh expr(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
498348784efSdrh expr(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
499348784efSdrh expr(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
500e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
501e1b6a5b8Sdrh   A = sqliteExprFunction(Y, &X);
502e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
503e1b6a5b8Sdrh }
504e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
505e1b6a5b8Sdrh   A = sqliteExprFunction(0, &X);
506e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
507e1b6a5b8Sdrh }
508348784efSdrh expr(A) ::= expr(X) AND expr(Y).   {A = sqliteExpr(TK_AND, X, Y, 0);}
509348784efSdrh expr(A) ::= expr(X) OR expr(Y).    {A = sqliteExpr(TK_OR, X, Y, 0);}
510348784efSdrh expr(A) ::= expr(X) LT expr(Y).    {A = sqliteExpr(TK_LT, X, Y, 0);}
511348784efSdrh expr(A) ::= expr(X) GT expr(Y).    {A = sqliteExpr(TK_GT, X, Y, 0);}
512348784efSdrh expr(A) ::= expr(X) LE expr(Y).    {A = sqliteExpr(TK_LE, X, Y, 0);}
513348784efSdrh expr(A) ::= expr(X) GE expr(Y).    {A = sqliteExpr(TK_GE, X, Y, 0);}
514348784efSdrh expr(A) ::= expr(X) NE expr(Y).    {A = sqliteExpr(TK_NE, X, Y, 0);}
515348784efSdrh expr(A) ::= expr(X) EQ expr(Y).    {A = sqliteExpr(TK_EQ, X, Y, 0);}
51681a20f21Sdrh expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
51781a20f21Sdrh expr(A) ::= expr(X) BITOR expr(Y).  {A = sqliteExpr(TK_BITOR, X, Y, 0);}
51881a20f21Sdrh expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
51981a20f21Sdrh expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);}
5200ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
5210ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
5220ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
5230ac65892Sdrh   A = sqliteExprFunction(pList, &OP);
5240ac65892Sdrh   sqliteExprSpan(A, &X->span, &Y->span);
5250ac65892Sdrh }
5260ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
5270ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
5280ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
5290ac65892Sdrh   A = sqliteExprFunction(pList, &OP);
5304794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
531e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&Y->span);
5324794b980Sdrh }
5330ac65892Sdrh likeop(A) ::= LIKE(X). {A = X;}
5340ac65892Sdrh likeop(A) ::= GLOB(X). {A = X;}
535348784efSdrh expr(A) ::= expr(X) PLUS expr(Y).  {A = sqliteExpr(TK_PLUS, X, Y, 0);}
536348784efSdrh expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
537348784efSdrh expr(A) ::= expr(X) STAR expr(Y).  {A = sqliteExpr(TK_STAR, X, Y, 0);}
538348784efSdrh expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
539bf4133cbSdrh expr(A) ::= expr(X) REM expr(Y).   {A = sqliteExpr(TK_REM, X, Y, 0);}
5400040077dSdrh expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
541e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
542e1b6a5b8Sdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
543e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
544e1b6a5b8Sdrh }
54533048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
54633048c0bSdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
54733048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
54833048c0bSdrh }
54933048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
55033048c0bSdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
55133048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
55233048c0bSdrh }
553e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
554e1b6a5b8Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
555e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
556e1b6a5b8Sdrh }
55781a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
55881a20f21Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
55981a20f21Sdrh   sqliteExprSpan(A,&X->span,&E);
56081a20f21Sdrh }
561e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
562e1b6a5b8Sdrh   A = sqliteExpr(TK_NOT, X, 0, 0);
563e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
564e1b6a5b8Sdrh }
56581a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
56681a20f21Sdrh   A = sqliteExpr(TK_BITNOT, X, 0, 0);
56781a20f21Sdrh   sqliteExprSpan(A,&B,&X->span);
56881a20f21Sdrh }
569e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
570e1b6a5b8Sdrh   A = sqliteExpr(TK_UMINUS, X, 0, 0);
571e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
572e1b6a5b8Sdrh }
573e1b6a5b8Sdrh expr(A) ::= PLUS(B) expr(X). [UMINUS] {
574e1b6a5b8Sdrh   A = X;
575e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
576e1b6a5b8Sdrh }
577e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
57819a775c2Sdrh   A = sqliteExpr(TK_SELECT, 0, 0, 0);
579daffd0e5Sdrh   if( A ) A->pSelect = X;
580e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&E);
58119a775c2Sdrh }
582fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
583fef5208cSdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
584fef5208cSdrh   pList = sqliteExprListAppend(pList, Y, 0);
585fef5208cSdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
586daffd0e5Sdrh   if( A ) A->pList = pList;
587e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
588fef5208cSdrh }
5894794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
5904794b980Sdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
5914794b980Sdrh   pList = sqliteExprListAppend(pList, Y, 0);
5924794b980Sdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
593daffd0e5Sdrh   if( A ) A->pList = pList;
5944794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
595e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
5964794b980Sdrh }
597e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
598fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
599daffd0e5Sdrh   if( A ) A->pList = Y;
600e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
601fef5208cSdrh }
602e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
603fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
604daffd0e5Sdrh   if( A ) A->pSelect = Y;
605e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
606fef5208cSdrh }
607e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
6084794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
609daffd0e5Sdrh   if( A ) A->pList = Y;
6104794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
611e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
6124794b980Sdrh }
613e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
6144794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
615daffd0e5Sdrh   if( A ) A->pSelect = Y;
6164794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
617e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
6184794b980Sdrh }
619fef5208cSdrh 
62017a7f8ddSdrh /* CASE expressions */
62117a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
62217a7f8ddSdrh   A = sqliteExpr(TK_CASE, X, Z, 0);
62317a7f8ddSdrh   if( A ) A->pList = Y;
62417a7f8ddSdrh   sqliteExprSpan(A, &C, &E);
62517a7f8ddSdrh }
62617a7f8ddSdrh %type case_exprlist {ExprList*}
62717a7f8ddSdrh %destructor case_exprlist {sqliteExprListDelete($$);}
62817a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
62917a7f8ddSdrh   A = sqliteExprListAppend(X, Y, 0);
63017a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
63117a7f8ddSdrh }
63217a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
63317a7f8ddSdrh   A = sqliteExprListAppend(0, Y, 0);
63417a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
63517a7f8ddSdrh }
63617a7f8ddSdrh %type case_else {Expr*}
63717a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
63817a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
63917a7f8ddSdrh %type case_operand {Expr*}
64017a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
64117a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
642348784efSdrh 
643348784efSdrh %type exprlist {ExprList*}
644348784efSdrh %destructor exprlist {sqliteExprListDelete($$);}
645348784efSdrh %type expritem {Expr*}
646348784efSdrh %destructor expritem {sqliteExprDelete($$);}
647348784efSdrh 
648348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
649348784efSdrh    {A = sqliteExprListAppend(X,Y,0);}
650348784efSdrh exprlist(A) ::= expritem(X).            {A = sqliteExprListAppend(0,X,0);}
651348784efSdrh expritem(A) ::= expr(X).                {A = X;}
652348784efSdrh expritem(A) ::= .                       {A = 0;}
653cce7d176Sdrh 
654382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
655382c0247Sdrh //
6569cfcf5d4Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX ids(X)
6579cfcf5d4Sdrh         ON ids(Y) LP idxlist(Z) RP(E) onconf(R). {
6589cfcf5d4Sdrh   if( U!=OE_None ) U = R;
6599cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
6609cfcf5d4Sdrh   sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);
6619cfcf5d4Sdrh }
662717e6402Sdrh 
663717e6402Sdrh %type uniqueflag {int}
6649cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
6659cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
666348784efSdrh 
667348784efSdrh %type idxlist {IdList*}
668348784efSdrh %destructor idxlist {sqliteIdListDelete($$);}
669348784efSdrh %type idxitem {Token}
670348784efSdrh 
671348784efSdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y).
672348784efSdrh      {A = sqliteIdListAppend(X,&Y);}
673348784efSdrh idxlist(A) ::= idxitem(Y).
674348784efSdrh      {A = sqliteIdListAppend(0,&Y);}
675c4a3c779Sdrh idxitem(A) ::= ids(X).          {A = X;}
676348784efSdrh 
6778aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
678382c0247Sdrh //
679382c0247Sdrh 
680c4a3c779Sdrh cmd ::= DROP INDEX ids(X).      {sqliteDropIndex(pParse, &X);}
681982cef7eSdrh 
682382c0247Sdrh 
6838aff1015Sdrh ///////////////////////////// The COPY command ///////////////////////////////
684382c0247Sdrh //
6851c92853dSdrh cmd ::= COPY orconf(R) ids(X) FROM ids(Y) USING DELIMITERS STRING(Z).
686b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,&Z,R);}
6871c92853dSdrh cmd ::= COPY orconf(R) ids(X) FROM ids(Y).
688b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,0,R);}
689dce2cbe6Sdrh 
690382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
691382c0247Sdrh //
692dce2cbe6Sdrh cmd ::= VACUUM.                {sqliteVacuum(pParse,0);}
693c4a3c779Sdrh cmd ::= VACUUM ids(X).         {sqliteVacuum(pParse,&X);}
694f57b14a6Sdrh 
695382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
696382c0247Sdrh //
697f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ids(Y).         {sqlitePragma(pParse,&X,&Y,0);}
698f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlitePragma(pParse,&X,&Y,0);}
699f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlitePragma(pParse,&X,&Y,0);}
700f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlitePragma(pParse,&X,&Y,1);}
701382c0247Sdrh cmd ::= PRAGMA ids(X) LP ids(Y) RP.      {sqlitePragma(pParse,&X,&Y,0);}
702603240cfSdrh cmd ::= PRAGMA ids(X).                   {sqlitePragma(pParse,&X,&X,0);}
703f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
704f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
705f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
706f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
707f57b14a6Sdrh plus_opt ::= PLUS.
708f57b14a6Sdrh plus_opt ::= .
709c3f9bad2Sdanielk1977 
710c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
711c3f9bad2Sdanielk1977 cmd ::= CREATE(A) TRIGGER ids(B) trigger_time(C) trigger_event(D) ON ids(E)
712c3f9bad2Sdanielk1977                   foreach_clause(F) when_clause(G)
713c3f9bad2Sdanielk1977                   BEGIN trigger_cmd_list(S) END(Z). {
714c3f9bad2Sdanielk1977   sqliteCreateTrigger(pParse, &B, C, D.a, D.b, &E, F, G, S,
715c3f9bad2Sdanielk1977       A.z, (int)(Z.z - A.z) + Z.n );
716c3f9bad2Sdanielk1977 }
717c3f9bad2Sdanielk1977 
718c3f9bad2Sdanielk1977 %type trigger_time  {int}
719c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
720c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
721c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
722c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
723c3f9bad2Sdanielk1977 
724ad3cab52Sdrh %type trigger_event {struct TrigEvent}
725ad3cab52Sdrh %destructor trigger_event {sqliteIdListDelete($$.b);}
726c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
727c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
728c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
729c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
730c3f9bad2Sdanielk1977 
731c3f9bad2Sdanielk1977 %type foreach_clause {int}
732c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
733c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
734c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
735c3f9bad2Sdanielk1977 
736c3f9bad2Sdanielk1977 %type when_clause {Expr *}
737c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
738c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
739c3f9bad2Sdanielk1977 
740c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *}
741c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
742c3f9bad2Sdanielk1977   X->pNext = Y ; A = X; }
743c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
744c3f9bad2Sdanielk1977 
745c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *}
746c3f9bad2Sdanielk1977 // UPDATE
747c3f9bad2Sdanielk1977 trigger_cmd(A) ::= UPDATE orconf(R) ids(X) SET setlist(Y) where_opt(Z).
748c3f9bad2Sdanielk1977                { A = sqliteTriggerUpdateStep(&X, Y, Z, R); }
749c3f9bad2Sdanielk1977 
750c3f9bad2Sdanielk1977 // INSERT
751c3f9bad2Sdanielk1977 trigger_cmd(A) ::= INSERT orconf(R) INTO ids(X) inscollist_opt(F)
752c3f9bad2Sdanielk1977   VALUES LP itemlist(Y) RP.
753c3f9bad2Sdanielk1977 {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);}
754c3f9bad2Sdanielk1977 
755c3f9bad2Sdanielk1977 trigger_cmd(A) ::= INSERT orconf(R) INTO ids(X) inscollist_opt(F) select(S).
756c3f9bad2Sdanielk1977                {A = sqliteTriggerInsertStep(&X, F, 0, S, R);}
757c3f9bad2Sdanielk1977 
758c3f9bad2Sdanielk1977 // DELETE
759c3f9bad2Sdanielk1977 trigger_cmd(A) ::= DELETE FROM ids(X) where_opt(Y).
760c3f9bad2Sdanielk1977                {A = sqliteTriggerDeleteStep(&X, Y);}
761c3f9bad2Sdanielk1977 
762c3f9bad2Sdanielk1977 // SELECT
763c3f9bad2Sdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqliteTriggerSelectStep(X); }
764c3f9bad2Sdanielk1977 
7656f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
7666f34903eSdanielk1977 expr(A) ::= RAISE(X) LP IGNORE RP(Y).  { A = sqliteExpr(TK_RAISE, 0, 0, 0);
7676f34903eSdanielk1977     A->iColumn = OE_Ignore; sqliteExprSpan(A, &X, &Y);}
7686f34903eSdanielk1977 expr(A) ::= RAISE(X) LP ROLLBACK COMMA ids(Z) RP(Y).
7696f34903eSdanielk1977 { A = sqliteExpr(TK_RAISE, 0, 0, &Z);
7706f34903eSdanielk1977     A->iColumn = OE_Rollback; sqliteExprSpan(A, &X, &Y);}
7716f34903eSdanielk1977 expr(A) ::= RAISE(X) LP ABORT COMMA ids(Z) RP(Y).
7726f34903eSdanielk1977 { A = sqliteExpr(TK_RAISE, 0, 0, &Z);
7736f34903eSdanielk1977     A->iColumn = OE_Abort; sqliteExprSpan(A, &X, &Y);}
7746f34903eSdanielk1977 expr(A) ::= RAISE(X) LP FAIL COMMA ids(Z) RP(Y).
7756f34903eSdanielk1977 { A = sqliteExpr(TK_RAISE, 0, 0, &Z);
7766f34903eSdanielk1977     A->iColumn = OE_Fail; sqliteExprSpan(A, &X, &Y);}
7776f34903eSdanielk1977 
778c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
779c3f9bad2Sdanielk1977 cmd ::= DROP TRIGGER ids(X). {
780c3f9bad2Sdanielk1977     sqliteDropTrigger(pParse,&X,0);
781c3f9bad2Sdanielk1977 }
782