xref: /sqlite-3.40.0/src/parse.y (revision 0bd1f4ea)
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*0bd1f4eaSdrh ** @(#) $Id: parse.y,v 1.71 2002/06/06 18:54:40 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 ::= cmd SEMI.          {sqliteExec(pParse);}
69094b2bbfSdrh ecmd ::= SEMI.
70348784efSdrh explain ::= EXPLAIN.    {pParse->explain = 1;}
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}
90f57b3399Sdrh temp(A) ::= TEMP.  {A = 1;}
91f57b3399Sdrh temp(A) ::= .      {A = 0;}
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}
113*0bd1f4eaSdrh //id(A) ::= ABORT(X).      {A = X;}
114*0bd1f4eaSdrh //id(A) ::= AFTER(X).      {A = X;}
115*0bd1f4eaSdrh //id(A) ::= ASC(X).        {A = X;}
116*0bd1f4eaSdrh //id(A) ::= BEFORE(X).     {A = X;}
117*0bd1f4eaSdrh //id(A) ::= BEGIN(X).      {A = X;}
118*0bd1f4eaSdrh //id(A) ::= CASCADE(X).    {A = X;}
119*0bd1f4eaSdrh //id(A) ::= CLUSTER(X).    {A = X;}
120*0bd1f4eaSdrh //id(A) ::= CONFLICT(X).   {A = X;}
121*0bd1f4eaSdrh //id(A) ::= COPY(X).       {A = X;}
122*0bd1f4eaSdrh //id(A) ::= DEFERRED(X).   {A = X;}
123*0bd1f4eaSdrh //id(A) ::= DELIMITERS(X). {A = X;}
124*0bd1f4eaSdrh //id(A) ::= DESC(X).       {A = X;}
125*0bd1f4eaSdrh //id(A) ::= EACH(X).       {A = X;}
126*0bd1f4eaSdrh //id(A) ::= END(X).        {A = X;}
127*0bd1f4eaSdrh //id(A) ::= EXPLAIN(X).    {A = X;}
128*0bd1f4eaSdrh //id(A) ::= FAIL(X).       {A = X;}
129*0bd1f4eaSdrh //id(A) ::= FOR(X).        {A = X;}
130*0bd1f4eaSdrh //id(A) ::= FULL(X).       {A = X;}
131f18543caSdrh id(A) ::= ID(X).         {A = X;}
132*0bd1f4eaSdrh //id(A) ::= IGNORE(X).     {A = X;}
133*0bd1f4eaSdrh //id(A) ::= IMMEDATE(X).   {A = X;}
134*0bd1f4eaSdrh //id(A) ::= INITIALLY(X).  {A = X;}
135*0bd1f4eaSdrh //id(A) ::= INSTEAD(X).    {A = X;}
136*0bd1f4eaSdrh //id(A) ::= MATCH(X).      {A = X;}
137*0bd1f4eaSdrh //id(A) ::= JOIN(X).       {A = X;}
138*0bd1f4eaSdrh //id(A) ::= KEY(X).        {A = X;}
139*0bd1f4eaSdrh //id(A) ::= OF(X).         {A = X;}
140*0bd1f4eaSdrh //id(A) ::= OFFSET(X).     {A = X;}
141*0bd1f4eaSdrh //id(A) ::= PARTIAL(X).    {A = X;}
142*0bd1f4eaSdrh //id(A) ::= PRAGMA(X).     {A = X;}
143*0bd1f4eaSdrh //id(A) ::= REPLACE(X).    {A = X;}
144*0bd1f4eaSdrh //id(A) ::= RESTRICT(X).   {A = X;}
145*0bd1f4eaSdrh //id(A) ::= ROW(X).        {A = X;}
146*0bd1f4eaSdrh //id(A) ::= STATEMENT(X).  {A = X;}
147*0bd1f4eaSdrh //id(A) ::= TEMP(X).       {A = X;}
148*0bd1f4eaSdrh //id(A) ::= TRIGGER(X).    {A = X;}
149*0bd1f4eaSdrh //id(A) ::= VACUUM(X).     {A = X;}
150*0bd1f4eaSdrh //id(A) ::= VIEW(X).       {A = X;}
151*0bd1f4eaSdrh 
152*0bd1f4eaSdrh %fallback ID
153*0bd1f4eaSdrh   ABORT AFTER ASC BEFORE BEGIN CASCADE CLUSTER CONFLICT
154*0bd1f4eaSdrh   COPY DEFERRED DELIMITERS DESC EACH END EXPLAIN FAIL FOR
155*0bd1f4eaSdrh   FULL IGNORE IMMEDIATE INITIALLY INSTEAD MATCH JOIN KEY
156*0bd1f4eaSdrh   OF OFFSET PARTIAL PRAGMA REPLACE RESTRICT ROW STATEMENT
157*0bd1f4eaSdrh   TEMP TRIGGER VACUUM VIEW.
158c4a3c779Sdrh 
159c4a3c779Sdrh // And "ids" is an identifer-or-string.
160c4a3c779Sdrh //
161c4a3c779Sdrh %type ids {Token}
162c4a3c779Sdrh ids(A) ::= id(X).        {A = X;}
163c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
164c4a3c779Sdrh 
165382c0247Sdrh type ::= .
166382c0247Sdrh type ::= typename(X).                    {sqliteAddColumnType(pParse,&X,&X);}
167382c0247Sdrh type ::= typename(X) LP signed RP(Y).    {sqliteAddColumnType(pParse,&X,&Y);}
168382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
169382c0247Sdrh                                          {sqliteAddColumnType(pParse,&X,&Y);}
170382c0247Sdrh %type typename {Token}
171382c0247Sdrh typename(A) ::= ids(X).           {A = X;}
172382c0247Sdrh typename(A) ::= typename(X) ids.  {A = X;}
173348784efSdrh signed ::= INTEGER.
174348784efSdrh signed ::= PLUS INTEGER.
175348784efSdrh signed ::= MINUS INTEGER.
176348784efSdrh carglist ::= carglist carg.
177348784efSdrh carglist ::= .
178c4a3c779Sdrh carg ::= CONSTRAINT ids ccons.
179348784efSdrh carg ::= ccons.
1807020f651Sdrh carg ::= DEFAULT STRING(X).          {sqliteAddDefaultValue(pParse,&X,0);}
1817020f651Sdrh carg ::= DEFAULT ID(X).              {sqliteAddDefaultValue(pParse,&X,0);}
1827020f651Sdrh carg ::= DEFAULT INTEGER(X).         {sqliteAddDefaultValue(pParse,&X,0);}
1837020f651Sdrh carg ::= DEFAULT PLUS INTEGER(X).    {sqliteAddDefaultValue(pParse,&X,0);}
1847020f651Sdrh carg ::= DEFAULT MINUS INTEGER(X).   {sqliteAddDefaultValue(pParse,&X,1);}
1857020f651Sdrh carg ::= DEFAULT FLOAT(X).           {sqliteAddDefaultValue(pParse,&X,0);}
1867020f651Sdrh carg ::= DEFAULT PLUS FLOAT(X).      {sqliteAddDefaultValue(pParse,&X,0);}
1877020f651Sdrh carg ::= DEFAULT MINUS FLOAT(X).     {sqliteAddDefaultValue(pParse,&X,1);}
1887020f651Sdrh carg ::= DEFAULT NULL.
189348784efSdrh 
190382c0247Sdrh // In addition to the type name, we also care about the primary key and
191382c0247Sdrh // UNIQUE constraints.
192348784efSdrh //
1939cfcf5d4Sdrh ccons ::= NOT NULL onconf(R).               {sqliteAddNotNull(pParse, R);}
1949cfcf5d4Sdrh ccons ::= PRIMARY KEY sortorder onconf(R).  {sqliteAddPrimaryKey(pParse,0,R);}
1959cfcf5d4Sdrh ccons ::= UNIQUE onconf(R).            {sqliteCreateIndex(pParse,0,0,0,R,0,0);}
1969cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
19704738cb9Sdrh ccons ::= references.
19804738cb9Sdrh ccons ::= defer_subclause.
19904738cb9Sdrh 
20004738cb9Sdrh // A REFERENCES clause is parsed but the current implementation does not
20104738cb9Sdrh // do anything with it.
20204738cb9Sdrh //
20304738cb9Sdrh references ::= REFERENCES ids LP idxlist RP refargs.
20404738cb9Sdrh references ::= REFERENCES ids refargs.
20504738cb9Sdrh refargs ::= .
20604738cb9Sdrh refargs ::= refargs refarg.
20704738cb9Sdrh refarg ::= MATCH FULL.
20804738cb9Sdrh refarg ::= MATCH PARTIAL.
20904738cb9Sdrh refarg ::= ON DELETE refact.
21004738cb9Sdrh refarg ::= ON UPDATE refact.
21104738cb9Sdrh refact ::= SET NULL.
21204738cb9Sdrh refact ::= SET DEFAULT.
21304738cb9Sdrh refact ::= CASCADE.
21404738cb9Sdrh refact ::= RESTRICT.
21504738cb9Sdrh defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt.
21604738cb9Sdrh defer_subclause ::= DEFERRABLE init_deferred_pred_opt.
21704738cb9Sdrh init_deferred_pred_opt ::= .
21804738cb9Sdrh init_deferred_pred_opt ::= INITIALLY DEFERRED.
21904738cb9Sdrh init_deferred_pred_opt ::= INITIALLY IMMEDIATE.
220348784efSdrh 
221348784efSdrh // For the time being, the only constraint we care about is the primary
222382c0247Sdrh // key and UNIQUE.  Both create indices.
223348784efSdrh //
224348784efSdrh conslist_opt ::= .
225348784efSdrh conslist_opt ::= COMMA conslist.
226348784efSdrh conslist ::= conslist COMMA tcons.
227a2e1bb5aSdrh conslist ::= conslist tcons.
228348784efSdrh conslist ::= tcons.
229c4a3c779Sdrh tcons ::= CONSTRAINT ids.
2309cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
2319cfcf5d4Sdrh                                              {sqliteAddPrimaryKey(pParse,X,R);}
2329cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
2339cfcf5d4Sdrh                                        {sqliteCreateIndex(pParse,0,0,X,R,0,0);}
2349cfcf5d4Sdrh tcons ::= CHECK expr onconf.
23504738cb9Sdrh tcons ::= FOREIGN KEY LP idxlist RP references defer_subclause_opt.
23604738cb9Sdrh defer_subclause_opt ::= .
23704738cb9Sdrh defer_subclause_opt ::= defer_subclause.
2389cfcf5d4Sdrh 
2399cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2409cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2419cfcf5d4Sdrh //
2429cfcf5d4Sdrh %type onconf {int}
2431c92853dSdrh %type orconf {int}
2441c92853dSdrh %type resolvetype {int}
2451c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
2461c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
2471c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
2481c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
2491c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
2501c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
2511c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
2521c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
2531c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
254348784efSdrh 
255382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
256348784efSdrh //
2574ff6dfa7Sdrh cmd ::= DROP TABLE ids(X).          {sqliteDropTable(pParse,&X,0);}
258348784efSdrh 
259a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
260a76b5dfcSdrh //
261a76b5dfcSdrh cmd ::= CREATE(X) VIEW ids(Y) AS select(S). {
262a76b5dfcSdrh   sqliteCreateView(pParse, &X, &Y, S);
263a76b5dfcSdrh }
264a76b5dfcSdrh cmd ::= DROP VIEW ids(X). {
2654ff6dfa7Sdrh   sqliteDropTable(pParse, &X, 1);
266a76b5dfcSdrh }
267a76b5dfcSdrh 
268382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
269348784efSdrh //
2709bb61fe7Sdrh cmd ::= select(X).  {
271832508b7Sdrh   sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0);
2729bb61fe7Sdrh   sqliteSelectDelete(X);
2739bb61fe7Sdrh }
274efb7251dSdrh 
2759bb61fe7Sdrh %type select {Select*}
2769bb61fe7Sdrh %destructor select {sqliteSelectDelete($$);}
27782c3d636Sdrh %type oneselect {Select*}
27882c3d636Sdrh %destructor oneselect {sqliteSelectDelete($$);}
2799bb61fe7Sdrh 
28082c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
2810a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
282daffd0e5Sdrh   if( Z ){
28382c3d636Sdrh     Z->op = Y;
28482c3d636Sdrh     Z->pPrior = X;
285daffd0e5Sdrh   }
28682c3d636Sdrh   A = Z;
28782c3d636Sdrh }
2880a36c57eSdrh %type multiselect_op {int}
2890a36c57eSdrh multiselect_op(A) ::= UNION.      {A = TK_UNION;}
2900a36c57eSdrh multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
2910a36c57eSdrh multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
2920a36c57eSdrh multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
29382c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
2949bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
295ad3cab52Sdrh   A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
2969bb61fe7Sdrh }
2979bb61fe7Sdrh 
2989bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
2999bb61fe7Sdrh // present and false (0) if it is not.
3009bb61fe7Sdrh //
301efb7251dSdrh %type distinct {int}
302efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
303fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
304efb7251dSdrh distinct(A) ::= .           {A = 0;}
305348784efSdrh 
3069bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
3077c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
3087c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
3097c917d19Sdrh // opcode of TK_ALL.
3109bb61fe7Sdrh //
311348784efSdrh %type selcollist {ExprList*}
312348784efSdrh %destructor selcollist {sqliteExprListDelete($$);}
313348784efSdrh %type sclp {ExprList*}
314348784efSdrh %destructor sclp {sqliteExprListDelete($$);}
315348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
316348784efSdrh sclp(A) ::= .                                {A = 0;}
31701f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
31801f3f253Sdrh    A = sqliteExprListAppend(P,X,Y.n?&Y:0);
31901f3f253Sdrh }
3207c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
3217c917d19Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0);
3227c917d19Sdrh }
32354473229Sdrh selcollist(A) ::= sclp(P) ids(X) DOT STAR. {
32454473229Sdrh   Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0);
32554473229Sdrh   Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X);
32654473229Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0);
32754473229Sdrh }
32801f3f253Sdrh 
32901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
33001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
33101f3f253Sdrh //
33201f3f253Sdrh %type as {Token}
33301f3f253Sdrh as(X) ::= AS ids(Y).    { X = Y; }
33401f3f253Sdrh as(X) ::= .             { X.n = 0; }
3359bb61fe7Sdrh 
336348784efSdrh 
337ad3cab52Sdrh %type seltablist {SrcList*}
338ad3cab52Sdrh %destructor seltablist {sqliteSrcListDelete($$);}
339ad3cab52Sdrh %type stl_prefix {SrcList*}
340ad3cab52Sdrh %destructor stl_prefix {sqliteSrcListDelete($$);}
341ad3cab52Sdrh %type from {SrcList*}
342ad3cab52Sdrh %destructor from {sqliteSrcListDelete($$);}
343348784efSdrh 
34401f3f253Sdrh // A complete FROM clause.
34501f3f253Sdrh //
346bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
347348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
34801f3f253Sdrh 
34901f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
35001f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
35101f3f253Sdrh //
35201f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
35301f3f253Sdrh    A = X;
35401f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
35501f3f253Sdrh }
356348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
35701f3f253Sdrh seltablist(A) ::= stl_prefix(X) ids(Y) as(Z) on_opt(N) using_opt(U). {
358ad3cab52Sdrh   A = sqliteSrcListAppend(X,&Y);
35901f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
36001f3f253Sdrh   if( N ){
36101f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
36201f3f253Sdrh     else { sqliteExprDelete(N); }
363c4a3c779Sdrh   }
36401f3f253Sdrh   if( U ){
36501f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
36601f3f253Sdrh     else { sqliteIdListDelete(U); }
36701f3f253Sdrh   }
36801f3f253Sdrh }
36901f3f253Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP as(Z) on_opt(N) using_opt(U). {
370ad3cab52Sdrh   A = sqliteSrcListAppend(X,0);
371ad3cab52Sdrh   A->a[A->nSrc-1].pSelect = S;
372d5feede1Sdrh   if( S->pOrderBy ){
373d5feede1Sdrh     sqliteExprListDelete(S->pOrderBy);
374d5feede1Sdrh     S->pOrderBy = 0;
375d5feede1Sdrh   }
37601f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
37701f3f253Sdrh   if( N ){
37801f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
37901f3f253Sdrh     else { sqliteExprDelete(N); }
38022f70c32Sdrh   }
38101f3f253Sdrh   if( U ){
38201f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
38301f3f253Sdrh     else { sqliteIdListDelete(U); }
384d5feede1Sdrh   }
38522f70c32Sdrh }
386348784efSdrh 
38701f3f253Sdrh %type joinop {int}
38801f3f253Sdrh %type joinop2 {int}
38901f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
39001f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
39101f3f253Sdrh joinop(X) ::= ID(A) JOIN.              { X = sqliteJoinType(pParse,&A,0,0); }
39201f3f253Sdrh joinop(X) ::= ID(A) ID(B) JOIN.        { X = sqliteJoinType(pParse,&A,&B,0); }
39301f3f253Sdrh joinop(X) ::= ID(A) ID(B) ID(C) JOIN.  { X = sqliteJoinType(pParse,&A,&B,&C); }
39401f3f253Sdrh 
39501f3f253Sdrh %type on_opt {Expr*}
39601f3f253Sdrh %destructor on_opt {sqliteExprDelete($$);}
39701f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
39801f3f253Sdrh on_opt(N) ::= .             {N = 0;}
39901f3f253Sdrh 
40001f3f253Sdrh %type using_opt {IdList*}
40101f3f253Sdrh %destructor using_opt {sqliteIdListDelete($$);}
40201f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP.  {U = L;}
40301f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
40401f3f253Sdrh 
40501f3f253Sdrh 
406348784efSdrh %type orderby_opt {ExprList*}
407348784efSdrh %destructor orderby_opt {sqliteExprListDelete($$);}
408348784efSdrh %type sortlist {ExprList*}
409348784efSdrh %destructor sortlist {sqliteExprListDelete($$);}
410348784efSdrh %type sortitem {Expr*}
411348784efSdrh %destructor sortitem {sqliteExprDelete($$);}
412348784efSdrh 
413348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
414348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
4159bb61fe7Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). {
416348784efSdrh   A = sqliteExprListAppend(X,Y,0);
417daffd0e5Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = Z;  /* 0=ascending, 1=decending */
418348784efSdrh }
4199bb61fe7Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). {
420348784efSdrh   A = sqliteExprListAppend(0,Y,0);
421daffd0e5Sdrh   if( A ) A->a[0].sortOrder = Z;
422348784efSdrh }
423da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
424348784efSdrh 
425348784efSdrh %type sortorder {int}
426348784efSdrh 
427348784efSdrh sortorder(A) ::= ASC.      {A = 0;}
428348784efSdrh sortorder(A) ::= DESC.     {A = 1;}
429348784efSdrh sortorder(A) ::= .         {A = 0;}
430348784efSdrh 
4312282792aSdrh %type groupby_opt {ExprList*}
4322282792aSdrh %destructor groupby_opt {sqliteExprListDelete($$);}
4332282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
4342282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
4352282792aSdrh 
4362282792aSdrh %type having_opt {Expr*}
4372282792aSdrh %destructor having_opt {sqliteExprDelete($$);}
4382282792aSdrh having_opt(A) ::= .                {A = 0;}
4392282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
4402282792aSdrh 
441ad3cab52Sdrh %type limit_opt {struct LimitVal}
442ad3cab52Sdrh limit_opt(A) ::= .                  {A.limit = -1; A.offset = 0;}
443ad3cab52Sdrh limit_opt(A) ::= LIMIT INTEGER(X).  {A.limit = atoi(X.z); A.offset = 0;}
4449bbca4c1Sdrh limit_opt(A) ::= LIMIT INTEGER(X) limit_sep INTEGER(Y).
445ad3cab52Sdrh                                     {A.limit = atoi(X.z); A.offset = atoi(Y.z);}
4469bbca4c1Sdrh limit_sep ::= OFFSET.
4479bbca4c1Sdrh limit_sep ::= COMMA.
4489bbca4c1Sdrh 
449382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
450382c0247Sdrh //
451c4a3c779Sdrh cmd ::= DELETE FROM ids(X) where_opt(Y).
452348784efSdrh     {sqliteDeleteFrom(pParse, &X, Y);}
453348784efSdrh 
454348784efSdrh %type where_opt {Expr*}
455348784efSdrh %destructor where_opt {sqliteExprDelete($$);}
456348784efSdrh 
457348784efSdrh where_opt(A) ::= .                    {A = 0;}
458348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
459348784efSdrh 
460348784efSdrh %type setlist {ExprList*}
461348784efSdrh %destructor setlist {sqliteExprListDelete($$);}
462348784efSdrh 
463382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
464382c0247Sdrh //
4651c92853dSdrh cmd ::= UPDATE orconf(R) ids(X) SET setlist(Y) where_opt(Z).
4669cfcf5d4Sdrh     {sqliteUpdate(pParse,&X,Y,Z,R);}
467348784efSdrh 
468c4a3c779Sdrh setlist(A) ::= setlist(Z) COMMA ids(X) EQ expr(Y).
469348784efSdrh     {A = sqliteExprListAppend(Z,Y,&X);}
470c4a3c779Sdrh setlist(A) ::= ids(X) EQ expr(Y).   {A = sqliteExprListAppend(0,Y,&X);}
471348784efSdrh 
472382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
473382c0247Sdrh //
474fa86c412Sdrh cmd ::= insert_cmd(R) INTO ids(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
4759cfcf5d4Sdrh                {sqliteInsert(pParse, &X, Y, 0, F, R);}
476fa86c412Sdrh cmd ::= insert_cmd(R) INTO ids(X) inscollist_opt(F) select(S).
4779cfcf5d4Sdrh                {sqliteInsert(pParse, &X, 0, S, F, R);}
478348784efSdrh 
479fa86c412Sdrh %type insert_cmd {int}
480fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
481fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
482fa86c412Sdrh 
483348784efSdrh 
484348784efSdrh %type itemlist {ExprList*}
485348784efSdrh %destructor itemlist {sqliteExprListDelete($$);}
486348784efSdrh 
487e64e7b20Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqliteExprListAppend(X,Y,0);}
488e64e7b20Sdrh itemlist(A) ::= expr(X).                    {A = sqliteExprListAppend(0,X,0);}
489348784efSdrh 
490967e8b73Sdrh %type inscollist_opt {IdList*}
491967e8b73Sdrh %destructor inscollist_opt {sqliteIdListDelete($$);}
492967e8b73Sdrh %type inscollist {IdList*}
493967e8b73Sdrh %destructor inscollist {sqliteIdListDelete($$);}
494348784efSdrh 
495967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
496967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
497c4a3c779Sdrh inscollist(A) ::= inscollist(X) COMMA ids(Y). {A = sqliteIdListAppend(X,&Y);}
498c4a3c779Sdrh inscollist(A) ::= ids(Y).                     {A = sqliteIdListAppend(0,&Y);}
499348784efSdrh 
500382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
501382c0247Sdrh //
502348784efSdrh %left OR.
503348784efSdrh %left AND.
5048be51133Sdrh %right NOT.
505fef5208cSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
506348784efSdrh %left GT GE LT LE.
50781a20f21Sdrh %left BITAND BITOR LSHIFT RSHIFT.
508348784efSdrh %left PLUS MINUS.
509bf4133cbSdrh %left STAR SLASH REM.
5100040077dSdrh %left CONCAT.
51181a20f21Sdrh %right UMINUS BITNOT.
512348784efSdrh 
513348784efSdrh %type expr {Expr*}
514348784efSdrh %destructor expr {sqliteExprDelete($$);}
515348784efSdrh 
516e1b6a5b8Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E);}
517e1b6a5b8Sdrh expr(A) ::= NULL(X).             {A = sqliteExpr(TK_NULL, 0, 0, &X);}
518c4a3c779Sdrh expr(A) ::= id(X).               {A = sqliteExpr(TK_ID, 0, 0, &X);}
519c4a3c779Sdrh expr(A) ::= ids(X) DOT ids(Y). {
520e1b6a5b8Sdrh   Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
521348784efSdrh   Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
522e1b6a5b8Sdrh   A = sqliteExpr(TK_DOT, temp1, temp2, 0);
523e1b6a5b8Sdrh }
524348784efSdrh expr(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
525348784efSdrh expr(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
526348784efSdrh expr(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
527e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
528e1b6a5b8Sdrh   A = sqliteExprFunction(Y, &X);
529e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
530e1b6a5b8Sdrh }
531e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
532e1b6a5b8Sdrh   A = sqliteExprFunction(0, &X);
533e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
534e1b6a5b8Sdrh }
535348784efSdrh expr(A) ::= expr(X) AND expr(Y).   {A = sqliteExpr(TK_AND, X, Y, 0);}
536348784efSdrh expr(A) ::= expr(X) OR expr(Y).    {A = sqliteExpr(TK_OR, X, Y, 0);}
537348784efSdrh expr(A) ::= expr(X) LT expr(Y).    {A = sqliteExpr(TK_LT, X, Y, 0);}
538348784efSdrh expr(A) ::= expr(X) GT expr(Y).    {A = sqliteExpr(TK_GT, X, Y, 0);}
539348784efSdrh expr(A) ::= expr(X) LE expr(Y).    {A = sqliteExpr(TK_LE, X, Y, 0);}
540348784efSdrh expr(A) ::= expr(X) GE expr(Y).    {A = sqliteExpr(TK_GE, X, Y, 0);}
541348784efSdrh expr(A) ::= expr(X) NE expr(Y).    {A = sqliteExpr(TK_NE, X, Y, 0);}
542348784efSdrh expr(A) ::= expr(X) EQ expr(Y).    {A = sqliteExpr(TK_EQ, X, Y, 0);}
54381a20f21Sdrh expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
54481a20f21Sdrh expr(A) ::= expr(X) BITOR expr(Y).  {A = sqliteExpr(TK_BITOR, X, Y, 0);}
54581a20f21Sdrh expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
54681a20f21Sdrh expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);}
5470ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
5480ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
5490ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
5500ac65892Sdrh   A = sqliteExprFunction(pList, &OP);
5510ac65892Sdrh   sqliteExprSpan(A, &X->span, &Y->span);
5520ac65892Sdrh }
5530ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
5540ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
5550ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
5560ac65892Sdrh   A = sqliteExprFunction(pList, &OP);
5574794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
558e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&Y->span);
5594794b980Sdrh }
5600ac65892Sdrh likeop(A) ::= LIKE(X). {A = X;}
5610ac65892Sdrh likeop(A) ::= GLOB(X). {A = X;}
562348784efSdrh expr(A) ::= expr(X) PLUS expr(Y).  {A = sqliteExpr(TK_PLUS, X, Y, 0);}
563348784efSdrh expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
564348784efSdrh expr(A) ::= expr(X) STAR expr(Y).  {A = sqliteExpr(TK_STAR, X, Y, 0);}
565348784efSdrh expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
566bf4133cbSdrh expr(A) ::= expr(X) REM expr(Y).   {A = sqliteExpr(TK_REM, X, Y, 0);}
5670040077dSdrh expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
568e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
569e1b6a5b8Sdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
570e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
571e1b6a5b8Sdrh }
57233048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
57333048c0bSdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
57433048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
57533048c0bSdrh }
57633048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
57733048c0bSdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
57833048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
57933048c0bSdrh }
580e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
581e1b6a5b8Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
582e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
583e1b6a5b8Sdrh }
58481a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
58581a20f21Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
58681a20f21Sdrh   sqliteExprSpan(A,&X->span,&E);
58781a20f21Sdrh }
588e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
589e1b6a5b8Sdrh   A = sqliteExpr(TK_NOT, X, 0, 0);
590e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
591e1b6a5b8Sdrh }
59281a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
59381a20f21Sdrh   A = sqliteExpr(TK_BITNOT, X, 0, 0);
59481a20f21Sdrh   sqliteExprSpan(A,&B,&X->span);
59581a20f21Sdrh }
596e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
597e1b6a5b8Sdrh   A = sqliteExpr(TK_UMINUS, X, 0, 0);
598e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
599e1b6a5b8Sdrh }
600e1b6a5b8Sdrh expr(A) ::= PLUS(B) expr(X). [UMINUS] {
601e1b6a5b8Sdrh   A = X;
602e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
603e1b6a5b8Sdrh }
604e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
60519a775c2Sdrh   A = sqliteExpr(TK_SELECT, 0, 0, 0);
606daffd0e5Sdrh   if( A ) A->pSelect = X;
607e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&E);
60819a775c2Sdrh }
609fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
610fef5208cSdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
611fef5208cSdrh   pList = sqliteExprListAppend(pList, Y, 0);
612fef5208cSdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
613daffd0e5Sdrh   if( A ) A->pList = pList;
614e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
615fef5208cSdrh }
6164794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
6174794b980Sdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
6184794b980Sdrh   pList = sqliteExprListAppend(pList, Y, 0);
6194794b980Sdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
620daffd0e5Sdrh   if( A ) A->pList = pList;
6214794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
622e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
6234794b980Sdrh }
624e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
625fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
626daffd0e5Sdrh   if( A ) A->pList = Y;
627e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
628fef5208cSdrh }
629e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
630fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
631daffd0e5Sdrh   if( A ) A->pSelect = Y;
632e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
633fef5208cSdrh }
634e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
6354794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
636daffd0e5Sdrh   if( A ) A->pList = Y;
6374794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
638e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
6394794b980Sdrh }
640e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
6414794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
642daffd0e5Sdrh   if( A ) A->pSelect = Y;
6434794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
644e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
6454794b980Sdrh }
646fef5208cSdrh 
64717a7f8ddSdrh /* CASE expressions */
64817a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
64917a7f8ddSdrh   A = sqliteExpr(TK_CASE, X, Z, 0);
65017a7f8ddSdrh   if( A ) A->pList = Y;
65117a7f8ddSdrh   sqliteExprSpan(A, &C, &E);
65217a7f8ddSdrh }
65317a7f8ddSdrh %type case_exprlist {ExprList*}
65417a7f8ddSdrh %destructor case_exprlist {sqliteExprListDelete($$);}
65517a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
65617a7f8ddSdrh   A = sqliteExprListAppend(X, Y, 0);
65717a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
65817a7f8ddSdrh }
65917a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
66017a7f8ddSdrh   A = sqliteExprListAppend(0, Y, 0);
66117a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
66217a7f8ddSdrh }
66317a7f8ddSdrh %type case_else {Expr*}
66417a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
66517a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
66617a7f8ddSdrh %type case_operand {Expr*}
66717a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
66817a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
669348784efSdrh 
670348784efSdrh %type exprlist {ExprList*}
671348784efSdrh %destructor exprlist {sqliteExprListDelete($$);}
672348784efSdrh %type expritem {Expr*}
673348784efSdrh %destructor expritem {sqliteExprDelete($$);}
674348784efSdrh 
675348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
676348784efSdrh    {A = sqliteExprListAppend(X,Y,0);}
677348784efSdrh exprlist(A) ::= expritem(X).            {A = sqliteExprListAppend(0,X,0);}
678348784efSdrh expritem(A) ::= expr(X).                {A = X;}
679348784efSdrh expritem(A) ::= .                       {A = 0;}
680cce7d176Sdrh 
681382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
682382c0247Sdrh //
6839cfcf5d4Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX ids(X)
6849cfcf5d4Sdrh         ON ids(Y) LP idxlist(Z) RP(E) onconf(R). {
6859cfcf5d4Sdrh   if( U!=OE_None ) U = R;
6869cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
6879cfcf5d4Sdrh   sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);
6889cfcf5d4Sdrh }
689717e6402Sdrh 
690717e6402Sdrh %type uniqueflag {int}
6919cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
6929cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
693348784efSdrh 
694348784efSdrh %type idxlist {IdList*}
695348784efSdrh %destructor idxlist {sqliteIdListDelete($$);}
696348784efSdrh %type idxitem {Token}
697348784efSdrh 
698348784efSdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y).
699348784efSdrh      {A = sqliteIdListAppend(X,&Y);}
700348784efSdrh idxlist(A) ::= idxitem(Y).
701348784efSdrh      {A = sqliteIdListAppend(0,&Y);}
702c4a3c779Sdrh idxitem(A) ::= ids(X).          {A = X;}
703348784efSdrh 
7048aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
705382c0247Sdrh //
706382c0247Sdrh 
707c4a3c779Sdrh cmd ::= DROP INDEX ids(X).      {sqliteDropIndex(pParse, &X);}
708982cef7eSdrh 
709382c0247Sdrh 
7108aff1015Sdrh ///////////////////////////// The COPY command ///////////////////////////////
711382c0247Sdrh //
7121c92853dSdrh cmd ::= COPY orconf(R) ids(X) FROM ids(Y) USING DELIMITERS STRING(Z).
713b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,&Z,R);}
7141c92853dSdrh cmd ::= COPY orconf(R) ids(X) FROM ids(Y).
715b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,0,R);}
716dce2cbe6Sdrh 
717382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
718382c0247Sdrh //
719dce2cbe6Sdrh cmd ::= VACUUM.                {sqliteVacuum(pParse,0);}
720c4a3c779Sdrh cmd ::= VACUUM ids(X).         {sqliteVacuum(pParse,&X);}
721f57b14a6Sdrh 
722382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
723382c0247Sdrh //
724f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ids(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);}
728382c0247Sdrh cmd ::= PRAGMA ids(X) LP ids(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 /////////////////////
738c3f9bad2Sdanielk1977 cmd ::= CREATE(A) TRIGGER ids(B) trigger_time(C) trigger_event(D) ON ids(E)
739c3f9bad2Sdanielk1977                   foreach_clause(F) when_clause(G)
740c3f9bad2Sdanielk1977                   BEGIN trigger_cmd_list(S) END(Z). {
741c3f9bad2Sdanielk1977   sqliteCreateTrigger(pParse, &B, C, D.a, D.b, &E, F, G, S,
742c3f9bad2Sdanielk1977       A.z, (int)(Z.z - A.z) + Z.n );
743c3f9bad2Sdanielk1977 }
744c3f9bad2Sdanielk1977 
745c3f9bad2Sdanielk1977 %type trigger_time  {int}
746c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
747c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
748c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
749c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
750c3f9bad2Sdanielk1977 
751ad3cab52Sdrh %type trigger_event {struct TrigEvent}
752ad3cab52Sdrh %destructor trigger_event {sqliteIdListDelete($$.b);}
753c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
754c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
755c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
756c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
757c3f9bad2Sdanielk1977 
758c3f9bad2Sdanielk1977 %type foreach_clause {int}
759c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
760c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
761c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
762c3f9bad2Sdanielk1977 
763c3f9bad2Sdanielk1977 %type when_clause {Expr *}
764c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
765c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
766c3f9bad2Sdanielk1977 
767c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *}
768c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
769c3f9bad2Sdanielk1977   X->pNext = Y ; A = X; }
770c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
771c3f9bad2Sdanielk1977 
772c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *}
773c3f9bad2Sdanielk1977 // UPDATE
774c3f9bad2Sdanielk1977 trigger_cmd(A) ::= UPDATE orconf(R) ids(X) SET setlist(Y) where_opt(Z).
775c3f9bad2Sdanielk1977                { A = sqliteTriggerUpdateStep(&X, Y, Z, R); }
776c3f9bad2Sdanielk1977 
777c3f9bad2Sdanielk1977 // INSERT
778c3f9bad2Sdanielk1977 trigger_cmd(A) ::= INSERT orconf(R) INTO ids(X) inscollist_opt(F)
779c3f9bad2Sdanielk1977   VALUES LP itemlist(Y) RP.
780c3f9bad2Sdanielk1977 {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);}
781c3f9bad2Sdanielk1977 
782c3f9bad2Sdanielk1977 trigger_cmd(A) ::= INSERT orconf(R) INTO ids(X) inscollist_opt(F) select(S).
783c3f9bad2Sdanielk1977                {A = sqliteTriggerInsertStep(&X, F, 0, S, R);}
784c3f9bad2Sdanielk1977 
785c3f9bad2Sdanielk1977 // DELETE
786c3f9bad2Sdanielk1977 trigger_cmd(A) ::= DELETE FROM ids(X) where_opt(Y).
787c3f9bad2Sdanielk1977                {A = sqliteTriggerDeleteStep(&X, Y);}
788c3f9bad2Sdanielk1977 
789c3f9bad2Sdanielk1977 // SELECT
790c3f9bad2Sdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqliteTriggerSelectStep(X); }
791c3f9bad2Sdanielk1977 
792c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
793c3f9bad2Sdanielk1977 cmd ::= DROP TRIGGER ids(X). {
794c3f9bad2Sdanielk1977     sqliteDropTrigger(pParse,&X,0);
795c3f9bad2Sdanielk1977 }
796