xref: /sqlite-3.40.0/src/parse.y (revision b86ccfb2)
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*b86ccfb2Sdrh ** @(#) $Id: parse.y,v 1.89 2003/01/28 23:13:12 drh Exp $
18348784efSdrh */
19348784efSdrh %token_prefix TK_
20348784efSdrh %token_type {Token}
21f57b14a6Sdrh %default_type {Token}
22348784efSdrh %extra_argument {Parse *pParse}
23348784efSdrh %syntax_error {
24*b86ccfb2Sdrh   if( pParse->zErrMsg==0 ){
25*b86ccfb2Sdrh     if( TOKEN.z[0] ){
26*b86ccfb2Sdrh       sqliteSetNString(&pParse->zErrMsg,
27*b86ccfb2Sdrh           "near \"", -1, TOKEN.z, TOKEN.n, "\": syntax error", -1, 0);
28*b86ccfb2Sdrh     }else{
29*b86ccfb2Sdrh       sqliteSetString(&pParse->zErrMsg, "incomplete SQL statement", 0);
30*b86ccfb2Sdrh     }
31*b86ccfb2Sdrh   }
32*b86ccfb2Sdrh   pParse->nErr++;
33348784efSdrh }
34348784efSdrh %name sqliteParser
35348784efSdrh %include {
36348784efSdrh #include "sqliteInt.h"
37348784efSdrh #include "parse.h"
389bbca4c1Sdrh 
399bbca4c1Sdrh /*
40ad3cab52Sdrh ** An instance of this structure holds information about the
41ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
429bbca4c1Sdrh */
43ad3cab52Sdrh struct LimitVal {
44ad3cab52Sdrh   int limit;    /* The LIMIT value.  -1 if there is no limit */
45ad3cab52Sdrh   int offset;   /* The OFFSET.  0 if there is none */
46ad3cab52Sdrh };
47c3f9bad2Sdanielk1977 
48c3f9bad2Sdanielk1977 /*
49ad3cab52Sdrh ** An instance of the following structure describes the event of a
50ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
51ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
52ad3cab52Sdrh **
53ad3cab52Sdrh **      UPDATE ON (a,b,c)
54ad3cab52Sdrh **
55ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
56c3f9bad2Sdanielk1977 */
57ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
58caec2f12Sdrh 
59caec2f12Sdrh } // end %include
60348784efSdrh 
61348784efSdrh // These are extra tokens used by the lexer but never seen by the
62348784efSdrh // parser.  We put them in a rule so that the parser generator will
636206d50aSdrh // add them to the parse.h output file.
64348784efSdrh //
65c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
66c4a3c779Sdrh           COLUMN AGG_FUNCTION.
67c4a3c779Sdrh 
68c4a3c779Sdrh // Input is zero or more commands.
69c4a3c779Sdrh input ::= cmdlist.
70348784efSdrh 
71348784efSdrh // A list of commands is zero or more commands
72348784efSdrh //
73348784efSdrh cmdlist ::= ecmd.
74094b2bbfSdrh cmdlist ::= cmdlist ecmd.
75094b2bbfSdrh ecmd ::= explain cmd SEMI.  {sqliteExec(pParse);}
76094b2bbfSdrh ecmd ::= SEMI.
77e0bc4048Sdrh explain ::= EXPLAIN.    { sqliteBeginParse(pParse, 1); }
78e0bc4048Sdrh explain ::= .           { sqliteBeginParse(pParse, 0); }
79348784efSdrh 
80382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
81c4a3c779Sdrh //
82fa86c412Sdrh 
830d65dc0eSdrh cmd ::= BEGIN trans_opt onconf(R).  {sqliteBeginTransaction(pParse,R);}
84c4a3c779Sdrh trans_opt ::= .
85c4a3c779Sdrh trans_opt ::= TRANSACTION.
865ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
87c4a3c779Sdrh cmd ::= COMMIT trans_opt.      {sqliteCommitTransaction(pParse);}
88c4a3c779Sdrh cmd ::= END trans_opt.         {sqliteCommitTransaction(pParse);}
89c4a3c779Sdrh cmd ::= ROLLBACK trans_opt.    {sqliteRollbackTransaction(pParse);}
90c4a3c779Sdrh 
91382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
92348784efSdrh //
93348784efSdrh cmd ::= create_table create_table_args.
945ad1a6c8Sdrh create_table ::= CREATE(X) temp(T) TABLE nm(Y). {
95e5f9c644Sdrh    sqliteStartTable(pParse,&X,&Y,T,0);
96969fa7c1Sdrh }
97f57b3399Sdrh %type temp {int}
98e0bc4048Sdrh temp(A) ::= TEMP.  {A = pParse->isTemp || !pParse->initFlag;}
99e0bc4048Sdrh temp(A) ::= .      {A = pParse->isTemp;}
100969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
101969fa7c1Sdrh   sqliteEndTable(pParse,&X,0);
102969fa7c1Sdrh }
103969fa7c1Sdrh create_table_args ::= AS select(S). {
104969fa7c1Sdrh   sqliteEndTable(pParse,0,S);
105969fa7c1Sdrh   sqliteSelectDelete(S);
106969fa7c1Sdrh }
107348784efSdrh columnlist ::= columnlist COMMA column.
108348784efSdrh columnlist ::= column.
109348784efSdrh 
110348784efSdrh // About the only information used for a column is the name of the
111348784efSdrh // column.  The type is always just "text".  But the code will accept
112348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
113348784efSdrh //
114348784efSdrh column ::= columnid type carglist.
1155ad1a6c8Sdrh columnid ::= nm(X).                {sqliteAddColumn(pParse,&X);}
116c4a3c779Sdrh 
117c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
118c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
119c4a3c779Sdrh //
120982cef7eSdrh %type id {Token}
121f18543caSdrh id(A) ::= ID(X).         {A = X;}
1220bd1f4eaSdrh 
12334e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
12434e33bb8Sdrh // fallback to ID if they will not parse as their original value.
12534e33bb8Sdrh // This obviates the need for the "id" nonterminal.
12634e33bb8Sdrh //
1270bd1f4eaSdrh %fallback ID
128f04d5081Sdrh   ABORT AFTER ASC BEFORE BEGIN CASCADE CLUSTER CONFLICT
1290bd1f4eaSdrh   COPY DEFERRED DELIMITERS DESC EACH END EXPLAIN FAIL FOR
1305ad1a6c8Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD MATCH KEY
1315ad1a6c8Sdrh   OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
1320bd1f4eaSdrh   TEMP TRIGGER VACUUM VIEW.
133c4a3c779Sdrh 
134c4a3c779Sdrh // And "ids" is an identifer-or-string.
135c4a3c779Sdrh //
136c4a3c779Sdrh %type ids {Token}
1375ad1a6c8Sdrh ids(A) ::= ID(X).        {A = X;}
138c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
139c4a3c779Sdrh 
1405ad1a6c8Sdrh // The name of a column or table can be any of the following:
1415ad1a6c8Sdrh //
1425ad1a6c8Sdrh %type nm {Token}
1435ad1a6c8Sdrh nm(A) ::= ID(X).         {A = X;}
1445ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
1455ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
1465ad1a6c8Sdrh 
147382c0247Sdrh type ::= .
148382c0247Sdrh type ::= typename(X).                    {sqliteAddColumnType(pParse,&X,&X);}
149382c0247Sdrh type ::= typename(X) LP signed RP(Y).    {sqliteAddColumnType(pParse,&X,&Y);}
150382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
151382c0247Sdrh                                          {sqliteAddColumnType(pParse,&X,&Y);}
152382c0247Sdrh %type typename {Token}
153382c0247Sdrh typename(A) ::= ids(X).           {A = X;}
154382c0247Sdrh typename(A) ::= typename(X) ids.  {A = X;}
155348784efSdrh signed ::= INTEGER.
156348784efSdrh signed ::= PLUS INTEGER.
157348784efSdrh signed ::= MINUS INTEGER.
158348784efSdrh carglist ::= carglist carg.
159348784efSdrh carglist ::= .
1605ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
161348784efSdrh carg ::= ccons.
1627020f651Sdrh carg ::= DEFAULT STRING(X).          {sqliteAddDefaultValue(pParse,&X,0);}
1637020f651Sdrh carg ::= DEFAULT ID(X).              {sqliteAddDefaultValue(pParse,&X,0);}
1647020f651Sdrh carg ::= DEFAULT INTEGER(X).         {sqliteAddDefaultValue(pParse,&X,0);}
1657020f651Sdrh carg ::= DEFAULT PLUS INTEGER(X).    {sqliteAddDefaultValue(pParse,&X,0);}
1667020f651Sdrh carg ::= DEFAULT MINUS INTEGER(X).   {sqliteAddDefaultValue(pParse,&X,1);}
1677020f651Sdrh carg ::= DEFAULT FLOAT(X).           {sqliteAddDefaultValue(pParse,&X,0);}
1687020f651Sdrh carg ::= DEFAULT PLUS FLOAT(X).      {sqliteAddDefaultValue(pParse,&X,0);}
1697020f651Sdrh carg ::= DEFAULT MINUS FLOAT(X).     {sqliteAddDefaultValue(pParse,&X,1);}
1707020f651Sdrh carg ::= DEFAULT NULL.
171348784efSdrh 
172382c0247Sdrh // In addition to the type name, we also care about the primary key and
173382c0247Sdrh // UNIQUE constraints.
174348784efSdrh //
1750d316a40Sdrh ccons ::= NULL onconf.
1769cfcf5d4Sdrh ccons ::= NOT NULL onconf(R).               {sqliteAddNotNull(pParse, R);}
1779cfcf5d4Sdrh ccons ::= PRIMARY KEY sortorder onconf(R).  {sqliteAddPrimaryKey(pParse,0,R);}
1789cfcf5d4Sdrh ccons ::= UNIQUE onconf(R).            {sqliteCreateIndex(pParse,0,0,0,R,0,0);}
1799cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
180c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
181c2eef3b3Sdrh                                 {sqliteCreateForeignKey(pParse,0,&T,TA,R);}
182c2eef3b3Sdrh ccons ::= defer_subclause(D).   {sqliteDeferForeignKey(pParse,D);}
1838e2ca029Sdrh ccons ::= COLLATE id(C).  {
184fcb78a49Sdrh    sqliteAddCollateType(pParse, sqliteCollateType(C.z, C.n));
1858e2ca029Sdrh }
18604738cb9Sdrh 
187c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
188c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
189c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
190c2eef3b3Sdrh // check fails.
19104738cb9Sdrh //
192c2eef3b3Sdrh %type refargs {int}
193c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
194c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
195c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
196c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
197c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
198c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
199c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
200c2eef3b3Sdrh %type refact {int}
201c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
202c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
203c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
204c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
205c2eef3b3Sdrh %type defer_subclause {int}
206c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
207c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
208c2eef3b3Sdrh %type init_deferred_pred_opt {int}
209c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
210c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
211c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
212348784efSdrh 
213348784efSdrh // For the time being, the only constraint we care about is the primary
214382c0247Sdrh // key and UNIQUE.  Both create indices.
215348784efSdrh //
216348784efSdrh conslist_opt ::= .
217348784efSdrh conslist_opt ::= COMMA conslist.
218348784efSdrh conslist ::= conslist COMMA tcons.
219a2e1bb5aSdrh conslist ::= conslist tcons.
220348784efSdrh conslist ::= tcons.
2215ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
2229cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
2239cfcf5d4Sdrh                                              {sqliteAddPrimaryKey(pParse,X,R);}
2249cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
2259cfcf5d4Sdrh                                        {sqliteCreateIndex(pParse,0,0,X,R,0,0);}
2269cfcf5d4Sdrh tcons ::= CHECK expr onconf.
227c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
228c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
229c2eef3b3Sdrh     sqliteCreateForeignKey(pParse, FA, &T, TA, R);
230c2eef3b3Sdrh     sqliteDeferForeignKey(pParse, D);
231c2eef3b3Sdrh }
232c2eef3b3Sdrh %type defer_subclause_opt {int}
233c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
234c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
2359cfcf5d4Sdrh 
2369cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2379cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2389cfcf5d4Sdrh //
2399cfcf5d4Sdrh %type onconf {int}
2401c92853dSdrh %type orconf {int}
2411c92853dSdrh %type resolvetype {int}
2421c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
2431c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
2441c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
2451c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
2461c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
2471c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
2481c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
2491c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
2501c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
251348784efSdrh 
252382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
253348784efSdrh //
2545ad1a6c8Sdrh cmd ::= DROP TABLE nm(X).          {sqliteDropTable(pParse,&X,0);}
255348784efSdrh 
256a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
257a76b5dfcSdrh //
2586276c1cbSdrh cmd ::= CREATE(X) temp(T) VIEW nm(Y) AS select(S). {
2596276c1cbSdrh   sqliteCreateView(pParse, &X, &Y, S, T);
260a76b5dfcSdrh }
2615ad1a6c8Sdrh cmd ::= DROP VIEW nm(X). {
2624ff6dfa7Sdrh   sqliteDropTable(pParse, &X, 1);
263a76b5dfcSdrh }
264a76b5dfcSdrh 
265382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
266348784efSdrh //
2679bb61fe7Sdrh cmd ::= select(X).  {
268832508b7Sdrh   sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0);
2699bb61fe7Sdrh   sqliteSelectDelete(X);
2709bb61fe7Sdrh }
271efb7251dSdrh 
2729bb61fe7Sdrh %type select {Select*}
2739bb61fe7Sdrh %destructor select {sqliteSelectDelete($$);}
27482c3d636Sdrh %type oneselect {Select*}
27582c3d636Sdrh %destructor oneselect {sqliteSelectDelete($$);}
2769bb61fe7Sdrh 
27782c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
2780a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
279daffd0e5Sdrh   if( Z ){
28082c3d636Sdrh     Z->op = Y;
28182c3d636Sdrh     Z->pPrior = X;
282daffd0e5Sdrh   }
28382c3d636Sdrh   A = Z;
28482c3d636Sdrh }
2850a36c57eSdrh %type multiselect_op {int}
2860a36c57eSdrh multiselect_op(A) ::= UNION.      {A = TK_UNION;}
2870a36c57eSdrh multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
2880a36c57eSdrh multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
2890a36c57eSdrh multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
29082c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
2919bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
292ad3cab52Sdrh   A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
2939bb61fe7Sdrh }
2949bb61fe7Sdrh 
2959bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
2969bb61fe7Sdrh // present and false (0) if it is not.
2979bb61fe7Sdrh //
298efb7251dSdrh %type distinct {int}
299efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
300fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
301efb7251dSdrh distinct(A) ::= .           {A = 0;}
302348784efSdrh 
3039bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
3047c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
3057c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
3067c917d19Sdrh // opcode of TK_ALL.
3079bb61fe7Sdrh //
308348784efSdrh %type selcollist {ExprList*}
309348784efSdrh %destructor selcollist {sqliteExprListDelete($$);}
310348784efSdrh %type sclp {ExprList*}
311348784efSdrh %destructor sclp {sqliteExprListDelete($$);}
312348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
313348784efSdrh sclp(A) ::= .                                {A = 0;}
31401f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
31501f3f253Sdrh    A = sqliteExprListAppend(P,X,Y.n?&Y:0);
31601f3f253Sdrh }
3177c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
3187c917d19Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0);
3197c917d19Sdrh }
3205ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
32154473229Sdrh   Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0);
32254473229Sdrh   Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X);
32354473229Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0);
32454473229Sdrh }
32501f3f253Sdrh 
32601f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
32701f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
32801f3f253Sdrh //
32901f3f253Sdrh %type as {Token}
3305ad1a6c8Sdrh as(X) ::= AS nm(Y).    { X = Y; }
3315ad1a6c8Sdrh as(X) ::= ids(Y).      { X = Y; }
33201f3f253Sdrh as(X) ::= .            { X.n = 0; }
3339bb61fe7Sdrh 
334348784efSdrh 
335ad3cab52Sdrh %type seltablist {SrcList*}
336ad3cab52Sdrh %destructor seltablist {sqliteSrcListDelete($$);}
337ad3cab52Sdrh %type stl_prefix {SrcList*}
338ad3cab52Sdrh %destructor stl_prefix {sqliteSrcListDelete($$);}
339ad3cab52Sdrh %type from {SrcList*}
340ad3cab52Sdrh %destructor from {sqliteSrcListDelete($$);}
341348784efSdrh 
34201f3f253Sdrh // A complete FROM clause.
34301f3f253Sdrh //
344bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
345348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
34601f3f253Sdrh 
34701f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
34801f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
34901f3f253Sdrh //
35001f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
35101f3f253Sdrh    A = X;
35201f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
35301f3f253Sdrh }
354348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
3555ad1a6c8Sdrh seltablist(A) ::= stl_prefix(X) nm(Y) as(Z) on_opt(N) using_opt(U). {
356ad3cab52Sdrh   A = sqliteSrcListAppend(X,&Y);
35701f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
35801f3f253Sdrh   if( N ){
35901f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
36001f3f253Sdrh     else { sqliteExprDelete(N); }
361c4a3c779Sdrh   }
36201f3f253Sdrh   if( U ){
36301f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
36401f3f253Sdrh     else { sqliteIdListDelete(U); }
36501f3f253Sdrh   }
36601f3f253Sdrh }
36701f3f253Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP as(Z) on_opt(N) using_opt(U). {
368ad3cab52Sdrh   A = sqliteSrcListAppend(X,0);
369ad3cab52Sdrh   A->a[A->nSrc-1].pSelect = S;
37001f3f253Sdrh   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
37101f3f253Sdrh   if( N ){
37201f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
37301f3f253Sdrh     else { sqliteExprDelete(N); }
37422f70c32Sdrh   }
37501f3f253Sdrh   if( U ){
37601f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
37701f3f253Sdrh     else { sqliteIdListDelete(U); }
378d5feede1Sdrh   }
37922f70c32Sdrh }
380348784efSdrh 
38101f3f253Sdrh %type joinop {int}
38201f3f253Sdrh %type joinop2 {int}
38301f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
38401f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
3855ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqliteJoinType(pParse,&A,0,0); }
3865ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqliteJoinType(pParse,&A,&B,0); }
3875ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
3885ad1a6c8Sdrh                                        { X = sqliteJoinType(pParse,&A,&B,&C); }
38901f3f253Sdrh 
39001f3f253Sdrh %type on_opt {Expr*}
39101f3f253Sdrh %destructor on_opt {sqliteExprDelete($$);}
39201f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
39301f3f253Sdrh on_opt(N) ::= .             {N = 0;}
39401f3f253Sdrh 
39501f3f253Sdrh %type using_opt {IdList*}
39601f3f253Sdrh %destructor using_opt {sqliteIdListDelete($$);}
39701f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP.  {U = L;}
39801f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
39901f3f253Sdrh 
40001f3f253Sdrh 
401348784efSdrh %type orderby_opt {ExprList*}
402348784efSdrh %destructor orderby_opt {sqliteExprListDelete($$);}
403348784efSdrh %type sortlist {ExprList*}
404348784efSdrh %destructor sortlist {sqliteExprListDelete($$);}
405348784efSdrh %type sortitem {Expr*}
406348784efSdrh %destructor sortitem {sqliteExprDelete($$);}
407348784efSdrh 
408348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
409348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
4108e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
411348784efSdrh   A = sqliteExprListAppend(X,Y,0);
4128e2ca029Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = C+Z;
413348784efSdrh }
41438640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
415348784efSdrh   A = sqliteExprListAppend(0,Y,0);
41638640e15Sdrh   if( A ) A->a[0].sortOrder = C+Z;
417348784efSdrh }
418da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
419348784efSdrh 
420348784efSdrh %type sortorder {int}
4218e2ca029Sdrh %type collate {int}
422348784efSdrh 
4238e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
4248e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
4258e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
4268e2ca029Sdrh collate(C) ::= .                {C = SQLITE_SO_UNK;}
427fcb78a49Sdrh collate(C) ::= COLLATE id(X).   {C = sqliteCollateType(X.z, X.n);}
428348784efSdrh 
4292282792aSdrh %type groupby_opt {ExprList*}
4302282792aSdrh %destructor groupby_opt {sqliteExprListDelete($$);}
4312282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
4322282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
4332282792aSdrh 
4342282792aSdrh %type having_opt {Expr*}
4352282792aSdrh %destructor having_opt {sqliteExprDelete($$);}
4362282792aSdrh having_opt(A) ::= .                {A = 0;}
4372282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
4382282792aSdrh 
439ad3cab52Sdrh %type limit_opt {struct LimitVal}
440ad3cab52Sdrh limit_opt(A) ::= .                  {A.limit = -1; A.offset = 0;}
441ad3cab52Sdrh limit_opt(A) ::= LIMIT INTEGER(X).  {A.limit = atoi(X.z); A.offset = 0;}
4429bbca4c1Sdrh limit_opt(A) ::= LIMIT INTEGER(X) limit_sep INTEGER(Y).
443ad3cab52Sdrh                                     {A.limit = atoi(X.z); A.offset = atoi(Y.z);}
4449bbca4c1Sdrh limit_sep ::= OFFSET.
4459bbca4c1Sdrh limit_sep ::= COMMA.
4469bbca4c1Sdrh 
447382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
448382c0247Sdrh //
4495ad1a6c8Sdrh cmd ::= DELETE FROM nm(X) where_opt(Y).
450348784efSdrh     {sqliteDeleteFrom(pParse, &X, Y);}
451348784efSdrh 
452348784efSdrh %type where_opt {Expr*}
453348784efSdrh %destructor where_opt {sqliteExprDelete($$);}
454348784efSdrh 
455348784efSdrh where_opt(A) ::= .                    {A = 0;}
456348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
457348784efSdrh 
458348784efSdrh %type setlist {ExprList*}
459348784efSdrh %destructor setlist {sqliteExprListDelete($$);}
460348784efSdrh 
461382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
462382c0247Sdrh //
4635ad1a6c8Sdrh cmd ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
4649cfcf5d4Sdrh     {sqliteUpdate(pParse,&X,Y,Z,R);}
465348784efSdrh 
4665ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
467348784efSdrh     {A = sqliteExprListAppend(Z,Y,&X);}
4685ad1a6c8Sdrh setlist(A) ::= nm(X) EQ expr(Y).   {A = sqliteExprListAppend(0,Y,&X);}
469348784efSdrh 
470382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
471382c0247Sdrh //
4725ad1a6c8Sdrh cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
4739cfcf5d4Sdrh                {sqliteInsert(pParse, &X, Y, 0, F, R);}
4745ad1a6c8Sdrh cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
4759cfcf5d4Sdrh                {sqliteInsert(pParse, &X, 0, S, F, R);}
476348784efSdrh 
477fa86c412Sdrh %type insert_cmd {int}
478fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
479fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
480fa86c412Sdrh 
481348784efSdrh 
482348784efSdrh %type itemlist {ExprList*}
483348784efSdrh %destructor itemlist {sqliteExprListDelete($$);}
484348784efSdrh 
485e64e7b20Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqliteExprListAppend(X,Y,0);}
486e64e7b20Sdrh itemlist(A) ::= expr(X).                    {A = sqliteExprListAppend(0,X,0);}
487348784efSdrh 
488967e8b73Sdrh %type inscollist_opt {IdList*}
489967e8b73Sdrh %destructor inscollist_opt {sqliteIdListDelete($$);}
490967e8b73Sdrh %type inscollist {IdList*}
491967e8b73Sdrh %destructor inscollist {sqliteIdListDelete($$);}
492348784efSdrh 
493967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
494967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
4955ad1a6c8Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = sqliteIdListAppend(X,&Y);}
4965ad1a6c8Sdrh inscollist(A) ::= nm(Y).                      {A = sqliteIdListAppend(0,&Y);}
497348784efSdrh 
498382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
499382c0247Sdrh //
500348784efSdrh %left OR.
501348784efSdrh %left AND.
5028be51133Sdrh %right NOT.
503fef5208cSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
504348784efSdrh %left GT GE LT LE.
50581a20f21Sdrh %left BITAND BITOR LSHIFT RSHIFT.
506348784efSdrh %left PLUS MINUS.
507bf4133cbSdrh %left STAR SLASH REM.
5080040077dSdrh %left CONCAT.
5094b59ab5eSdrh %right UMINUS UPLUS BITNOT.
5101f16230bSdrh %right ORACLE_OUTER_JOIN.
511348784efSdrh 
512348784efSdrh %type expr {Expr*}
513348784efSdrh %destructor expr {sqliteExprDelete($$);}
514348784efSdrh 
515e1b6a5b8Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E); }
516e1b6a5b8Sdrh expr(A) ::= NULL(X).             {A = sqliteExpr(TK_NULL, 0, 0, &X);}
5175ad1a6c8Sdrh expr(A) ::= ID(X).               {A = sqliteExpr(TK_ID, 0, 0, &X);}
5185ad1a6c8Sdrh expr(A) ::= JOIN_KW(X).          {A = sqliteExpr(TK_ID, 0, 0, &X);}
5195ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(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 }
5241f16230bSdrh expr(A) ::= expr(B) ORACLE_OUTER_JOIN.
5251f16230bSdrh                              {A = B; ExprSetProperty(A,EP_Oracle8Join);}
526348784efSdrh expr(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
527348784efSdrh expr(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
528348784efSdrh expr(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
529e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
530e1b6a5b8Sdrh   A = sqliteExprFunction(Y, &X);
531e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
532e1b6a5b8Sdrh }
533e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
534e1b6a5b8Sdrh   A = sqliteExprFunction(0, &X);
535e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
536e1b6a5b8Sdrh }
537348784efSdrh expr(A) ::= expr(X) AND expr(Y).   {A = sqliteExpr(TK_AND, X, Y, 0);}
538348784efSdrh expr(A) ::= expr(X) OR expr(Y).    {A = sqliteExpr(TK_OR, X, Y, 0);}
539348784efSdrh expr(A) ::= expr(X) LT expr(Y).    {A = sqliteExpr(TK_LT, X, Y, 0);}
540348784efSdrh expr(A) ::= expr(X) GT expr(Y).    {A = sqliteExpr(TK_GT, X, Y, 0);}
541348784efSdrh expr(A) ::= expr(X) LE expr(Y).    {A = sqliteExpr(TK_LE, X, Y, 0);}
542348784efSdrh expr(A) ::= expr(X) GE expr(Y).    {A = sqliteExpr(TK_GE, X, Y, 0);}
543348784efSdrh expr(A) ::= expr(X) NE expr(Y).    {A = sqliteExpr(TK_NE, X, Y, 0);}
544348784efSdrh expr(A) ::= expr(X) EQ expr(Y).    {A = sqliteExpr(TK_EQ, X, Y, 0);}
54581a20f21Sdrh expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
54681a20f21Sdrh expr(A) ::= expr(X) BITOR expr(Y).  {A = sqliteExpr(TK_BITOR, X, Y, 0);}
54781a20f21Sdrh expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
54881a20f21Sdrh expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);}
5490ac65892Sdrh expr(A) ::= expr(X) 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;
5546977fea8Sdrh   sqliteExprSpan(A, &X->span, &Y->span);
5550ac65892Sdrh }
5560ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
5570ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
5580ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
5594b59ab5eSdrh   A = sqliteExprFunction(pList, 0);
5604b59ab5eSdrh   if( A ) A->op = OP;
5614794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
5626977fea8Sdrh   sqliteExprSpan(A,&X->span,&Y->span);
5634794b980Sdrh }
5644b59ab5eSdrh %type likeop {int}
5654b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;}
5664b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;}
567348784efSdrh expr(A) ::= expr(X) PLUS expr(Y).  {A = sqliteExpr(TK_PLUS, X, Y, 0);}
568348784efSdrh expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
569348784efSdrh expr(A) ::= expr(X) STAR expr(Y).  {A = sqliteExpr(TK_STAR, X, Y, 0);}
570348784efSdrh expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
571bf4133cbSdrh expr(A) ::= expr(X) REM expr(Y).   {A = sqliteExpr(TK_REM, X, Y, 0);}
5720040077dSdrh expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
573e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
574e1b6a5b8Sdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
5756977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
576e1b6a5b8Sdrh }
57733048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
57833048c0bSdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
5796977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
58033048c0bSdrh }
58133048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
58233048c0bSdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
5836977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
58433048c0bSdrh }
585e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
586e1b6a5b8Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
5876977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
588e1b6a5b8Sdrh }
58981a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
59081a20f21Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
5916977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
59281a20f21Sdrh }
593e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
594e1b6a5b8Sdrh   A = sqliteExpr(TK_NOT, X, 0, 0);
5956977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
596e1b6a5b8Sdrh }
59781a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
59881a20f21Sdrh   A = sqliteExpr(TK_BITNOT, X, 0, 0);
5996977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
60081a20f21Sdrh }
601e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
602e1b6a5b8Sdrh   A = sqliteExpr(TK_UMINUS, X, 0, 0);
6036977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
604e1b6a5b8Sdrh }
6054b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
6064b59ab5eSdrh   A = sqliteExpr(TK_UPLUS, X, 0, 0);
6076977fea8Sdrh   sqliteExprSpan(A,&B,&X->span);
608e1b6a5b8Sdrh }
609e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
61019a775c2Sdrh   A = sqliteExpr(TK_SELECT, 0, 0, 0);
611daffd0e5Sdrh   if( A ) A->pSelect = X;
612e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&E);
61319a775c2Sdrh }
614fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
615fef5208cSdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
616fef5208cSdrh   pList = sqliteExprListAppend(pList, Y, 0);
617fef5208cSdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
618daffd0e5Sdrh   if( A ) A->pList = pList;
6196977fea8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
620fef5208cSdrh }
6214794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
6224794b980Sdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
6234794b980Sdrh   pList = sqliteExprListAppend(pList, Y, 0);
6244794b980Sdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
625daffd0e5Sdrh   if( A ) A->pList = pList;
6264794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
6276977fea8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
6284794b980Sdrh }
629e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
630fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
631daffd0e5Sdrh   if( A ) A->pList = Y;
6326977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
633fef5208cSdrh }
634e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
635fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
636daffd0e5Sdrh   if( A ) A->pSelect = Y;
6376977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
638fef5208cSdrh }
639e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
6404794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
641daffd0e5Sdrh   if( A ) A->pList = Y;
6424794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
6436977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
6444794b980Sdrh }
645e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
6464794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
647daffd0e5Sdrh   if( A ) A->pSelect = Y;
6484794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
6496977fea8Sdrh   sqliteExprSpan(A,&X->span,&E);
6504794b980Sdrh }
651fef5208cSdrh 
65217a7f8ddSdrh /* CASE expressions */
65317a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
65417a7f8ddSdrh   A = sqliteExpr(TK_CASE, X, Z, 0);
65517a7f8ddSdrh   if( A ) A->pList = Y;
65617a7f8ddSdrh   sqliteExprSpan(A, &C, &E);
65717a7f8ddSdrh }
65817a7f8ddSdrh %type case_exprlist {ExprList*}
65917a7f8ddSdrh %destructor case_exprlist {sqliteExprListDelete($$);}
66017a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
66117a7f8ddSdrh   A = sqliteExprListAppend(X, Y, 0);
66217a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
66317a7f8ddSdrh }
66417a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
66517a7f8ddSdrh   A = sqliteExprListAppend(0, Y, 0);
66617a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
66717a7f8ddSdrh }
66817a7f8ddSdrh %type case_else {Expr*}
66917a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
67017a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
67117a7f8ddSdrh %type case_operand {Expr*}
67217a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
67317a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
674348784efSdrh 
675348784efSdrh %type exprlist {ExprList*}
676348784efSdrh %destructor exprlist {sqliteExprListDelete($$);}
677348784efSdrh %type expritem {Expr*}
678348784efSdrh %destructor expritem {sqliteExprDelete($$);}
679348784efSdrh 
680348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
681348784efSdrh    {A = sqliteExprListAppend(X,Y,0);}
682348784efSdrh exprlist(A) ::= expritem(X).            {A = sqliteExprListAppend(0,X,0);}
683348784efSdrh expritem(A) ::= expr(X).                {A = X;}
684348784efSdrh expritem(A) ::= .                       {A = 0;}
685cce7d176Sdrh 
686382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
687382c0247Sdrh //
6885ad1a6c8Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X)
6895ad1a6c8Sdrh         ON nm(Y) LP idxlist(Z) RP(E) onconf(R). {
6909cfcf5d4Sdrh   if( U!=OE_None ) U = R;
6919cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
6929cfcf5d4Sdrh   sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);
6939cfcf5d4Sdrh }
694717e6402Sdrh 
695717e6402Sdrh %type uniqueflag {int}
6969cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
6979cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
698348784efSdrh 
699348784efSdrh %type idxlist {IdList*}
700348784efSdrh %destructor idxlist {sqliteIdListDelete($$);}
701c2eef3b3Sdrh %type idxlist_opt {IdList*}
702c2eef3b3Sdrh %destructor idxlist_opt {sqliteIdListDelete($$);}
703348784efSdrh %type idxitem {Token}
704348784efSdrh 
705c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
706c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
707c2eef3b3Sdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y).  {A = sqliteIdListAppend(X,&Y);}
708c2eef3b3Sdrh idxlist(A) ::= idxitem(Y).                   {A = sqliteIdListAppend(0,&Y);}
7095ad1a6c8Sdrh idxitem(A) ::= nm(X).                        {A = X;}
710348784efSdrh 
7118aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
712382c0247Sdrh //
713382c0247Sdrh 
7145ad1a6c8Sdrh cmd ::= DROP INDEX nm(X).      {sqliteDropIndex(pParse, &X);}
715982cef7eSdrh 
716382c0247Sdrh 
7178aff1015Sdrh ///////////////////////////// The COPY command ///////////////////////////////
718382c0247Sdrh //
7195ad1a6c8Sdrh cmd ::= COPY orconf(R) nm(X) FROM nm(Y) USING DELIMITERS STRING(Z).
720b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,&Z,R);}
7215ad1a6c8Sdrh cmd ::= COPY orconf(R) nm(X) FROM nm(Y).
722b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,0,R);}
723dce2cbe6Sdrh 
724382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
725382c0247Sdrh //
726dce2cbe6Sdrh cmd ::= VACUUM.                {sqliteVacuum(pParse,0);}
7275ad1a6c8Sdrh cmd ::= VACUUM nm(X).         {sqliteVacuum(pParse,&X);}
728f57b14a6Sdrh 
729382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
730382c0247Sdrh //
7315ad1a6c8Sdrh cmd ::= PRAGMA ids(X) EQ nm(Y).         {sqlitePragma(pParse,&X,&Y,0);}
732f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlitePragma(pParse,&X,&Y,0);}
733f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlitePragma(pParse,&X,&Y,0);}
734f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlitePragma(pParse,&X,&Y,1);}
7355ad1a6c8Sdrh cmd ::= PRAGMA ids(X) LP nm(Y) RP.      {sqlitePragma(pParse,&X,&Y,0);}
736603240cfSdrh cmd ::= PRAGMA ids(X).                   {sqlitePragma(pParse,&X,&X,0);}
737f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
738f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
739f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
740f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
741f57b14a6Sdrh plus_opt ::= PLUS.
742f57b14a6Sdrh plus_opt ::= .
743c3f9bad2Sdanielk1977 
744c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
7455ad1a6c8Sdrh cmd ::= CREATE(A) TRIGGER nm(B) trigger_time(C) trigger_event(D) ON nm(E)
746c3f9bad2Sdanielk1977                   foreach_clause(F) when_clause(G)
747c3f9bad2Sdanielk1977                   BEGIN trigger_cmd_list(S) END(Z). {
7484b59ab5eSdrh   Token all;
7494b59ab5eSdrh   all.z = A.z;
7504b59ab5eSdrh   all.n = (Z.z - A.z) + Z.n;
7514b59ab5eSdrh   sqliteCreateTrigger(pParse, &B, C, D.a, D.b, &E, F, G, S, &all);
752c3f9bad2Sdanielk1977 }
753c3f9bad2Sdanielk1977 
754c3f9bad2Sdanielk1977 %type trigger_time  {int}
755c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
756c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
757c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
758c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
759c3f9bad2Sdanielk1977 
760ad3cab52Sdrh %type trigger_event {struct TrigEvent}
761ad3cab52Sdrh %destructor trigger_event {sqliteIdListDelete($$.b);}
762c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
763c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
764c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
765c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
766c3f9bad2Sdanielk1977 
767c3f9bad2Sdanielk1977 %type foreach_clause {int}
768c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
769c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
770c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
771c3f9bad2Sdanielk1977 
772c3f9bad2Sdanielk1977 %type when_clause {Expr *}
773c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
774c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
775c3f9bad2Sdanielk1977 
776c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *}
777c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
778c3f9bad2Sdanielk1977   X->pNext = Y ; A = X; }
779c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
780c3f9bad2Sdanielk1977 
781c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *}
782c3f9bad2Sdanielk1977 // UPDATE
7835ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
784c3f9bad2Sdanielk1977                { A = sqliteTriggerUpdateStep(&X, Y, Z, R); }
785c3f9bad2Sdanielk1977 
786c3f9bad2Sdanielk1977 // INSERT
7875ad1a6c8Sdrh trigger_cmd(A) ::= INSERT orconf(R) INTO nm(X) inscollist_opt(F)
788c3f9bad2Sdanielk1977   VALUES LP itemlist(Y) RP.
789c3f9bad2Sdanielk1977 {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);}
790c3f9bad2Sdanielk1977 
7915ad1a6c8Sdrh trigger_cmd(A) ::= INSERT orconf(R) INTO nm(X) inscollist_opt(F) select(S).
792c3f9bad2Sdanielk1977                {A = sqliteTriggerInsertStep(&X, F, 0, S, R);}
793c3f9bad2Sdanielk1977 
794c3f9bad2Sdanielk1977 // DELETE
7955ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
796c3f9bad2Sdanielk1977                {A = sqliteTriggerDeleteStep(&X, Y);}
797c3f9bad2Sdanielk1977 
798c3f9bad2Sdanielk1977 // SELECT
799c3f9bad2Sdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqliteTriggerSelectStep(X); }
800c3f9bad2Sdanielk1977 
8016f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
8024b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
8034b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, 0);
8044b59ab5eSdrh   A->iColumn = OE_Ignore;
8056977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
8064b59ab5eSdrh }
8074b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y).  {
8084b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, &Z);
8094b59ab5eSdrh   A->iColumn = OE_Rollback;
8106977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
8114b59ab5eSdrh }
8124b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y).  {
8134b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, &Z);
8144b59ab5eSdrh   A->iColumn = OE_Abort;
8156977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
8164b59ab5eSdrh }
8174b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y).  {
8184b59ab5eSdrh   A = sqliteExpr(TK_RAISE, 0, 0, &Z);
8194b59ab5eSdrh   A->iColumn = OE_Fail;
8206977fea8Sdrh   sqliteExprSpan(A, &X, &Y);
8214b59ab5eSdrh }
8226f34903eSdanielk1977 
823c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
8245ad1a6c8Sdrh cmd ::= DROP TRIGGER nm(X). {
825c3f9bad2Sdanielk1977     sqliteDropTrigger(pParse,&X,0);
826c3f9bad2Sdanielk1977 }
827