xref: /sqlite-3.40.0/src/parse.y (revision f2bc013c)
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*f2bc013cSdrh ** @(#) $Id: parse.y,v 1.140 2004/10/04 13:19:24 drh Exp $
18348784efSdrh */
19348784efSdrh %token_prefix TK_
20348784efSdrh %token_type {Token}
21f57b14a6Sdrh %default_type {Token}
22348784efSdrh %extra_argument {Parse *pParse}
23348784efSdrh %syntax_error {
24b86ccfb2Sdrh   if( pParse->zErrMsg==0 ){
25b86ccfb2Sdrh     if( TOKEN.z[0] ){
264adee20fSdanielk1977       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
27b86ccfb2Sdrh     }else{
284adee20fSdanielk1977       sqlite3ErrorMsg(pParse, "incomplete SQL statement");
29b86ccfb2Sdrh     }
30b86ccfb2Sdrh   }
31348784efSdrh }
324adee20fSdanielk1977 %name sqlite3Parser
33348784efSdrh %include {
34348784efSdrh #include "sqliteInt.h"
35348784efSdrh #include "parse.h"
369bbca4c1Sdrh 
379bbca4c1Sdrh /*
38ad3cab52Sdrh ** An instance of this structure holds information about the
39ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
409bbca4c1Sdrh */
41ad3cab52Sdrh struct LimitVal {
42ad3cab52Sdrh   int limit;    /* The LIMIT value.  -1 if there is no limit */
43ad3cab52Sdrh   int offset;   /* The OFFSET.  0 if there is none */
44ad3cab52Sdrh };
45c3f9bad2Sdanielk1977 
46c3f9bad2Sdanielk1977 /*
47ad3cab52Sdrh ** An instance of the following structure describes the event of a
48ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
49ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
50ad3cab52Sdrh **
51ad3cab52Sdrh **      UPDATE ON (a,b,c)
52ad3cab52Sdrh **
53ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
54c3f9bad2Sdanielk1977 */
55ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
56caec2f12Sdrh 
5725d6543dSdrh /*
5825d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type.
5925d6543dSdrh */
6025d6543dSdrh struct AttachKey { int type;  Token key; };
6125d6543dSdrh 
62caec2f12Sdrh } // end %include
63348784efSdrh 
64348784efSdrh // These are extra tokens used by the lexer but never seen by the
65348784efSdrh // parser.  We put them in a rule so that the parser generator will
666206d50aSdrh // add them to the parse.h output file.
67348784efSdrh //
68c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
69c4a3c779Sdrh           COLUMN AGG_FUNCTION.
70c4a3c779Sdrh 
71826fb5a3Sdrh // Input is a single SQL command
72c4a3c779Sdrh input ::= cmdlist.
73094b2bbfSdrh cmdlist ::= cmdlist ecmd.
74826fb5a3Sdrh cmdlist ::= ecmd.
75483750baSdrh ecmd ::= explain cmdx SEMI.
76094b2bbfSdrh ecmd ::= SEMI.
7780242055Sdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
784adee20fSdanielk1977 explain ::= EXPLAIN.    { sqlite3BeginParse(pParse, 1); }
794adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
80348784efSdrh 
81382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
82c4a3c779Sdrh //
83fa86c412Sdrh 
8433752f8aSdanielk1977 cmd ::= BEGIN trans_opt.  {sqlite3BeginTransaction(pParse);}
85c4a3c779Sdrh trans_opt ::= .
86c4a3c779Sdrh trans_opt ::= TRANSACTION.
875ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
884adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
894adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
904adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
91c4a3c779Sdrh 
92382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
93348784efSdrh //
94348784efSdrh cmd ::= create_table create_table_args.
95cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). {
96cbb18d22Sdanielk1977    sqlite3StartTable(pParse,&X,&Y,&Z,T,0);
97969fa7c1Sdrh }
98f57b3399Sdrh %type temp {int}
99d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
100d24cc427Sdrh temp(A) ::= .      {A = 0;}
101969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
1024adee20fSdanielk1977   sqlite3EndTable(pParse,&X,0);
103969fa7c1Sdrh }
104969fa7c1Sdrh create_table_args ::= AS select(S). {
1054adee20fSdanielk1977   sqlite3EndTable(pParse,0,S);
1064adee20fSdanielk1977   sqlite3SelectDelete(S);
107969fa7c1Sdrh }
108348784efSdrh columnlist ::= columnlist COMMA column.
109348784efSdrh columnlist ::= column.
110348784efSdrh 
111348784efSdrh // About the only information used for a column is the name of the
112348784efSdrh // column.  The type is always just "text".  But the code will accept
113348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
114348784efSdrh //
115348784efSdrh column ::= columnid type carglist.
1164adee20fSdanielk1977 columnid ::= nm(X).                {sqlite3AddColumn(pParse,&X);}
117c4a3c779Sdrh 
118c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
119c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
120c4a3c779Sdrh //
121982cef7eSdrh %type id {Token}
122f18543caSdrh id(A) ::= ID(X).         {A = X;}
1230bd1f4eaSdrh 
12434e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
12534e33bb8Sdrh // fallback to ID if they will not parse as their original value.
12634e33bb8Sdrh // This obviates the need for the "id" nonterminal.
12734e33bb8Sdrh //
1280bd1f4eaSdrh %fallback ID
12910e8266bSdrh   ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CONFLICT
1305f3b4ab5Sdrh   DATABASE DEFERRED DESC DETACH EACH END EXPLAIN FAIL FOR
131319e4e74Sdrh   GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY
1325ad1a6c8Sdrh   OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
1330bd1f4eaSdrh   TEMP TRIGGER VACUUM VIEW.
134c4a3c779Sdrh 
1352d3917daSdrh // Define operator precedence early so that this is the first occurance
1362d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
1372d3917daSdrh // causes them to be assigned integer values that are close together,
1382d3917daSdrh // which keeps parser tables smaller.
1392d3917daSdrh //
140*f2bc013cSdrh // The token values assigned to these symbols is determined by the order
141*f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
142*f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
143*f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
144*f2bc013cSdrh // constraint.
145*f2bc013cSdrh //
1462d3917daSdrh %left OR.
1472d3917daSdrh %left AND.
1482d3917daSdrh %right NOT.
149*f2bc013cSdrh %left IS LIKE GLOB BETWEEN IN ISNULL NOTNULL NE EQ.
150*f2bc013cSdrh %left GT LE GE LT.
1512d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
1522d3917daSdrh %left PLUS MINUS.
1532d3917daSdrh %left STAR SLASH REM.
1542d3917daSdrh %left CONCAT.
1552d3917daSdrh %right UMINUS UPLUS BITNOT.
1562d3917daSdrh 
157c4a3c779Sdrh // And "ids" is an identifer-or-string.
158c4a3c779Sdrh //
159c4a3c779Sdrh %type ids {Token}
1605ad1a6c8Sdrh ids(A) ::= ID(X).        {A = X;}
161c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
162c4a3c779Sdrh 
1635ad1a6c8Sdrh // The name of a column or table can be any of the following:
1645ad1a6c8Sdrh //
1655ad1a6c8Sdrh %type nm {Token}
1665ad1a6c8Sdrh nm(A) ::= ID(X).         {A = X;}
1675ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
1685ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
1695ad1a6c8Sdrh 
170382c0247Sdrh type ::= .
1714adee20fSdanielk1977 type ::= typename(X).                    {sqlite3AddColumnType(pParse,&X,&X);}
1724adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y).    {sqlite3AddColumnType(pParse,&X,&Y);}
173382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
1744adee20fSdanielk1977                                          {sqlite3AddColumnType(pParse,&X,&Y);}
175382c0247Sdrh %type typename {Token}
176382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
177596bd235Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);}
178ef0cae50Sdrh %type signed {int}
179ef0cae50Sdrh signed(A) ::= INTEGER(X).         { A = atoi(X.z); }
180ef0cae50Sdrh signed(A) ::= PLUS INTEGER(X).    { A = atoi(X.z); }
181ef0cae50Sdrh signed(A) ::= MINUS INTEGER(X).   { A = -atoi(X.z); }
182348784efSdrh carglist ::= carglist carg.
183348784efSdrh carglist ::= .
1845ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
185348784efSdrh carg ::= ccons.
1864adee20fSdanielk1977 carg ::= DEFAULT STRING(X).          {sqlite3AddDefaultValue(pParse,&X,0);}
1874adee20fSdanielk1977 carg ::= DEFAULT ID(X).              {sqlite3AddDefaultValue(pParse,&X,0);}
1884adee20fSdanielk1977 carg ::= DEFAULT INTEGER(X).         {sqlite3AddDefaultValue(pParse,&X,0);}
1894adee20fSdanielk1977 carg ::= DEFAULT PLUS INTEGER(X).    {sqlite3AddDefaultValue(pParse,&X,0);}
1904adee20fSdanielk1977 carg ::= DEFAULT MINUS INTEGER(X).   {sqlite3AddDefaultValue(pParse,&X,1);}
1914adee20fSdanielk1977 carg ::= DEFAULT FLOAT(X).           {sqlite3AddDefaultValue(pParse,&X,0);}
1924adee20fSdanielk1977 carg ::= DEFAULT PLUS FLOAT(X).      {sqlite3AddDefaultValue(pParse,&X,0);}
1934adee20fSdanielk1977 carg ::= DEFAULT MINUS FLOAT(X).     {sqlite3AddDefaultValue(pParse,&X,1);}
1947020f651Sdrh carg ::= DEFAULT NULL.
195348784efSdrh 
196382c0247Sdrh // In addition to the type name, we also care about the primary key and
197382c0247Sdrh // UNIQUE constraints.
198348784efSdrh //
1990d316a40Sdrh ccons ::= NULL onconf.
2004adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).               {sqlite3AddNotNull(pParse, R);}
2014adee20fSdanielk1977 ccons ::= PRIMARY KEY sortorder onconf(R).  {sqlite3AddPrimaryKey(pParse,0,R);}
202cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R).           {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);}
2039cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
204c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
2054adee20fSdanielk1977                                 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
2064adee20fSdanielk1977 ccons ::= defer_subclause(D).   {sqlite3DeferForeignKey(pParse,D);}
207d3d39e93Sdrh ccons ::= COLLATE id(C).  {sqlite3AddCollateType(pParse, C.z, C.n);}
20804738cb9Sdrh 
209c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
210c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
211c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
212c2eef3b3Sdrh // check fails.
21304738cb9Sdrh //
214c2eef3b3Sdrh %type refargs {int}
215c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
216c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
217c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
218c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
219c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
220c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
221c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
222c2eef3b3Sdrh %type refact {int}
223c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
224c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
225c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
226c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
227c2eef3b3Sdrh %type defer_subclause {int}
228c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
229c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
230c2eef3b3Sdrh %type init_deferred_pred_opt {int}
231c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
232c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
233c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
234348784efSdrh 
235348784efSdrh // For the time being, the only constraint we care about is the primary
236382c0247Sdrh // key and UNIQUE.  Both create indices.
237348784efSdrh //
238348784efSdrh conslist_opt ::= .
239348784efSdrh conslist_opt ::= COMMA conslist.
240348784efSdrh conslist ::= conslist COMMA tcons.
241a2e1bb5aSdrh conslist ::= conslist tcons.
242348784efSdrh conslist ::= tcons.
2435ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
2449cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
2454adee20fSdanielk1977                                              {sqlite3AddPrimaryKey(pParse,X,R);}
2469cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
247cbb18d22Sdanielk1977                                        {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);}
2489cfcf5d4Sdrh tcons ::= CHECK expr onconf.
249c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
250c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
2514adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
2524adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
253c2eef3b3Sdrh }
254c2eef3b3Sdrh %type defer_subclause_opt {int}
255c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
256c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
2579cfcf5d4Sdrh 
2589cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2599cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2609cfcf5d4Sdrh //
2619cfcf5d4Sdrh %type onconf {int}
2621c92853dSdrh %type orconf {int}
2631c92853dSdrh %type resolvetype {int}
2641c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
2651c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
2661c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
2671c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
2681c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
2691c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
2701c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
2711c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
2721c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
273348784efSdrh 
274382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
275348784efSdrh //
276a8858103Sdanielk1977 cmd ::= DROP TABLE nm(X) dbnm(Y).   {
277a8858103Sdanielk1977   sqlite3DropTable(pParse, sqlite3SrcListAppend(0,&X,&Y), 0);
278a8858103Sdanielk1977 }
279348784efSdrh 
280a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
281a76b5dfcSdrh //
28248dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). {
28348dec7e2Sdanielk1977   sqlite3CreateView(pParse, &X, &Y, &Z, S, T);
284a76b5dfcSdrh }
28548dec7e2Sdanielk1977 cmd ::= DROP VIEW nm(X) dbnm(Y). {
28648dec7e2Sdanielk1977   sqlite3DropTable(pParse, sqlite3SrcListAppend(0,&X,&Y), 1);
287a76b5dfcSdrh }
288a76b5dfcSdrh 
289382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
290348784efSdrh //
2919bb61fe7Sdrh cmd ::= select(X).  {
292bf3b721fSdanielk1977   sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0);
2934adee20fSdanielk1977   sqlite3SelectDelete(X);
2949bb61fe7Sdrh }
295efb7251dSdrh 
2969bb61fe7Sdrh %type select {Select*}
2974adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);}
29882c3d636Sdrh %type oneselect {Select*}
2994adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);}
3009bb61fe7Sdrh 
30182c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
3020a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
303daffd0e5Sdrh   if( Z ){
30482c3d636Sdrh     Z->op = Y;
30582c3d636Sdrh     Z->pPrior = X;
306daffd0e5Sdrh   }
30782c3d636Sdrh   A = Z;
30882c3d636Sdrh }
3090a36c57eSdrh %type multiselect_op {int}
3100a36c57eSdrh multiselect_op(A) ::= UNION.      {A = TK_UNION;}
3110a36c57eSdrh multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
3120a36c57eSdrh multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
3130a36c57eSdrh multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
31482c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
3159bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
3164adee20fSdanielk1977   A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
3179bb61fe7Sdrh }
3189bb61fe7Sdrh 
3199bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
3209bb61fe7Sdrh // present and false (0) if it is not.
3219bb61fe7Sdrh //
322efb7251dSdrh %type distinct {int}
323efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
324fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
325efb7251dSdrh distinct(A) ::= .           {A = 0;}
326348784efSdrh 
3279bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
3287c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
3297c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
3307c917d19Sdrh // opcode of TK_ALL.
3319bb61fe7Sdrh //
332348784efSdrh %type selcollist {ExprList*}
3334adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);}
334348784efSdrh %type sclp {ExprList*}
3354adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);}
336348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
337348784efSdrh sclp(A) ::= .                                {A = 0;}
33801f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
3394adee20fSdanielk1977    A = sqlite3ExprListAppend(P,X,Y.n?&Y:0);
34001f3f253Sdrh }
3417c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
3424adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0);
3437c917d19Sdrh }
3445ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
3454adee20fSdanielk1977   Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0);
3464adee20fSdanielk1977   Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X);
3474adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0);
34854473229Sdrh }
34901f3f253Sdrh 
35001f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
35101f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
35201f3f253Sdrh //
35301f3f253Sdrh %type as {Token}
3545ad1a6c8Sdrh as(X) ::= AS nm(Y).    { X = Y; }
3555ad1a6c8Sdrh as(X) ::= ids(Y).      { X = Y; }
35601f3f253Sdrh as(X) ::= .            { X.n = 0; }
3579bb61fe7Sdrh 
358348784efSdrh 
359ad3cab52Sdrh %type seltablist {SrcList*}
3604adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);}
361ad3cab52Sdrh %type stl_prefix {SrcList*}
3624adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);}
363ad3cab52Sdrh %type from {SrcList*}
3644adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);}
365348784efSdrh 
36601f3f253Sdrh // A complete FROM clause.
36701f3f253Sdrh //
368bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
369348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
37001f3f253Sdrh 
37101f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
37201f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
37301f3f253Sdrh //
37401f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
37501f3f253Sdrh    A = X;
37601f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
37701f3f253Sdrh }
378348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
379113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). {
3804adee20fSdanielk1977   A = sqlite3SrcListAppend(X,&Y,&D);
3814adee20fSdanielk1977   if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
38201f3f253Sdrh   if( N ){
38301f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
3844adee20fSdanielk1977     else { sqlite3ExprDelete(N); }
385c4a3c779Sdrh   }
38601f3f253Sdrh   if( U ){
38701f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
3884adee20fSdanielk1977     else { sqlite3IdListDelete(U); }
38901f3f253Sdrh   }
39001f3f253Sdrh }
391b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP
392b733d037Sdrh                   as(Z) on_opt(N) using_opt(U). {
3934adee20fSdanielk1977   A = sqlite3SrcListAppend(X,0,0);
394ad3cab52Sdrh   A->a[A->nSrc-1].pSelect = S;
3954adee20fSdanielk1977   if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
39601f3f253Sdrh   if( N ){
39701f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
3984adee20fSdanielk1977     else { sqlite3ExprDelete(N); }
39922f70c32Sdrh   }
40001f3f253Sdrh   if( U ){
40101f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
4024adee20fSdanielk1977     else { sqlite3IdListDelete(U); }
403d5feede1Sdrh   }
40422f70c32Sdrh }
405348784efSdrh 
406b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that
407b733d037Sdrh // is contained inside parentheses.  This can be either a subquery or
408b733d037Sdrh // a grouping of table and subqueries.
409b733d037Sdrh //
410b733d037Sdrh %type seltablist_paren {Select*}
4114adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);}
412b733d037Sdrh seltablist_paren(A) ::= select(S).      {A = S;}
413b733d037Sdrh seltablist_paren(A) ::= seltablist(F).  {
4144adee20fSdanielk1977    A = sqlite3SelectNew(0,F,0,0,0,0,0,-1,0);
415b733d037Sdrh }
416b733d037Sdrh 
417113088ecSdrh %type dbnm {Token}
418113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
419113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
420113088ecSdrh 
42101f3f253Sdrh %type joinop {int}
42201f3f253Sdrh %type joinop2 {int}
42301f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
42401f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
4254adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
4264adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
4275ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
4284adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
42901f3f253Sdrh 
43001f3f253Sdrh %type on_opt {Expr*}
4314adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);}
43201f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
43301f3f253Sdrh on_opt(N) ::= .             {N = 0;}
43401f3f253Sdrh 
43501f3f253Sdrh %type using_opt {IdList*}
4364adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);}
4370202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP.  {U = L;}
43801f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
43901f3f253Sdrh 
44001f3f253Sdrh 
441348784efSdrh %type orderby_opt {ExprList*}
4424adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);}
443348784efSdrh %type sortlist {ExprList*}
4444adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);}
445348784efSdrh %type sortitem {Expr*}
4464adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);}
447348784efSdrh 
448348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
449348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
4508e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
4511186b0a0Sdrh   A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0);
452d3d39e93Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = Z;
453348784efSdrh }
45438640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
4551186b0a0Sdrh   A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0);
45696fb0dd5Sdanielk1977   if( A && A->a ) A->a[0].sortOrder = Z;
457348784efSdrh }
458da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
459348784efSdrh 
460348784efSdrh %type sortorder {int}
461d3d39e93Sdrh %type collate {Token}
462348784efSdrh 
4638e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
4648e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
4658e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
466d3d39e93Sdrh collate(C) ::= .                {C.z = 0; C.n = 0;}
467d3d39e93Sdrh collate(C) ::= COLLATE id(X).   {C = X;}
468348784efSdrh 
4692282792aSdrh %type groupby_opt {ExprList*}
4704adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);}
4712282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
4722282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
4732282792aSdrh 
4742282792aSdrh %type having_opt {Expr*}
4754adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);}
4762282792aSdrh having_opt(A) ::= .                {A = 0;}
4772282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
4782282792aSdrh 
479ad3cab52Sdrh %type limit_opt {struct LimitVal}
480ad3cab52Sdrh limit_opt(A) ::= .                     {A.limit = -1; A.offset = 0;}
481ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X).      {A.limit = X; A.offset = 0;}
482ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y).
483ef0cae50Sdrh                                        {A.limit = X; A.offset = Y;}
484ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y).
485ef0cae50Sdrh                                        {A.limit = Y; A.offset = X;}
4869bbca4c1Sdrh 
487382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
488382c0247Sdrh //
489113088ecSdrh cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). {
4904adee20fSdanielk1977    sqlite3DeleteFrom(pParse, sqlite3SrcListAppend(0,&X,&D), Y);
491113088ecSdrh }
492348784efSdrh 
493348784efSdrh %type where_opt {Expr*}
4944adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);}
495348784efSdrh 
496348784efSdrh where_opt(A) ::= .                    {A = 0;}
497348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
498348784efSdrh 
499348784efSdrh %type setlist {ExprList*}
5004adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);}
501348784efSdrh 
502382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
503382c0247Sdrh //
504113088ecSdrh cmd ::= UPDATE orconf(R) nm(X) dbnm(D) SET setlist(Y) where_opt(Z).
5054adee20fSdanielk1977     {sqlite3Update(pParse,sqlite3SrcListAppend(0,&X,&D),Y,Z,R);}
506348784efSdrh 
5075ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
5084adee20fSdanielk1977     {A = sqlite3ExprListAppend(Z,Y,&X);}
5094adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y).   {A = sqlite3ExprListAppend(0,Y,&X);}
510348784efSdrh 
511382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
512382c0247Sdrh //
513113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F)
514113088ecSdrh         VALUES LP itemlist(Y) RP.
5154adee20fSdanielk1977             {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), Y, 0, F, R);}
516113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) select(S).
5174adee20fSdanielk1977             {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), 0, S, F, R);}
518348784efSdrh 
519fa86c412Sdrh %type insert_cmd {int}
520fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
521fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
522fa86c412Sdrh 
523348784efSdrh 
524348784efSdrh %type itemlist {ExprList*}
5254adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);}
526348784efSdrh 
5274adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqlite3ExprListAppend(X,Y,0);}
5284adee20fSdanielk1977 itemlist(A) ::= expr(X).                    {A = sqlite3ExprListAppend(0,X,0);}
529348784efSdrh 
530967e8b73Sdrh %type inscollist_opt {IdList*}
5314adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);}
532967e8b73Sdrh %type inscollist {IdList*}
5334adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);}
534348784efSdrh 
535967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
536967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
5374adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = sqlite3IdListAppend(X,&Y);}
5384adee20fSdanielk1977 inscollist(A) ::= nm(Y).                      {A = sqlite3IdListAppend(0,&Y);}
539348784efSdrh 
540382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
541382c0247Sdrh //
542348784efSdrh 
543348784efSdrh %type expr {Expr*}
5444adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);}
545348784efSdrh 
5464adee20fSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); }
5477ac25c75Sdrh expr(A) ::= NULL(X).             {A = sqlite3Expr(@X, 0, 0, &X);}
5484adee20fSdanielk1977 expr(A) ::= ID(X).               {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5494adee20fSdanielk1977 expr(A) ::= JOIN_KW(X).          {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5505ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
5514adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5524adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5534adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp2, 0);
554e1b6a5b8Sdrh }
555d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
5564adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5574adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5584adee20fSdanielk1977   Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z);
5594adee20fSdanielk1977   Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0);
5604adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp4, 0);
561d24cc427Sdrh }
5627ac25c75Sdrh expr(A) ::= INTEGER(X).      {A = sqlite3Expr(@X, 0, 0, &X);}
5637ac25c75Sdrh expr(A) ::= FLOAT(X).        {A = sqlite3Expr(@X, 0, 0, &X);}
5647ac25c75Sdrh expr(A) ::= STRING(X).       {A = sqlite3Expr(@X, 0, 0, &X);}
5657ac25c75Sdrh expr(A) ::= BLOB(X).         {A = sqlite3Expr(@X, 0, 0, &X);}
5667c972decSdrh expr(A) ::= VARIABLE(X).     {
567895d7472Sdrh   Token *pToken = &X;
568895d7472Sdrh   Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken);
569fa6bc000Sdrh   sqlite3ExprAssignVarNumber(pParse, pExpr);
570895d7472Sdrh }
571e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
5724adee20fSdanielk1977   A = sqlite3ExprFunction(Y, &X);
5734adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
574e1b6a5b8Sdrh }
575e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
5764adee20fSdanielk1977   A = sqlite3ExprFunction(0, &X);
5774adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
578e1b6a5b8Sdrh }
5797ac25c75Sdrh expr(A) ::= expr(X) AND(OP) expr(Y).    {A = sqlite3Expr(@OP, X, Y, 0);}
5807ac25c75Sdrh expr(A) ::= expr(X) OR(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
5817ac25c75Sdrh expr(A) ::= expr(X) LT(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
5827ac25c75Sdrh expr(A) ::= expr(X) GT(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
5837ac25c75Sdrh expr(A) ::= expr(X) LE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
5847ac25c75Sdrh expr(A) ::= expr(X) GE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
5857ac25c75Sdrh expr(A) ::= expr(X) NE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
5867ac25c75Sdrh expr(A) ::= expr(X) EQ(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
5877ac25c75Sdrh expr(A) ::= expr(X) BITAND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
5887ac25c75Sdrh expr(A) ::= expr(X) BITOR(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
5897ac25c75Sdrh expr(A) ::= expr(X) LSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
5907ac25c75Sdrh expr(A) ::= expr(X) RSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
5910ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
5924adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
5934adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
5944adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
5954b59ab5eSdrh   if( A ) A->op = OP;
5964adee20fSdanielk1977   sqlite3ExprSpan(A, &X->span, &Y->span);
5970ac65892Sdrh }
5980ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
5994adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
6004adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
6014adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
6024b59ab5eSdrh   if( A ) A->op = OP;
6034adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6044adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&Y->span);
6054794b980Sdrh }
6064b59ab5eSdrh %type likeop {int}
6074b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;}
6084b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;}
6097ac25c75Sdrh expr(A) ::= expr(X) PLUS(OP) expr(Y).   {A = sqlite3Expr(@OP, X, Y, 0);}
6107ac25c75Sdrh expr(A) ::= expr(X) MINUS(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
6117ac25c75Sdrh expr(A) ::= expr(X) STAR(OP) expr(Y).   {A = sqlite3Expr(@OP, X, Y, 0);}
6127ac25c75Sdrh expr(A) ::= expr(X) SLASH(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
6137ac25c75Sdrh expr(A) ::= expr(X) REM(OP) expr(Y).    {A = sqlite3Expr(@OP, X, Y, 0);}
6147ac25c75Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
615e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
6164adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6174adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
618e1b6a5b8Sdrh }
61933048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
6204adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6214adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
62233048c0bSdrh }
62333048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
6244adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6254adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
62633048c0bSdrh }
627e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
6284adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6294adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
630e1b6a5b8Sdrh }
63181a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
6324adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6334adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
63481a20f21Sdrh }
635e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
6367ac25c75Sdrh   A = sqlite3Expr(@B, X, 0, 0);
6374adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
638e1b6a5b8Sdrh }
63981a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
6407ac25c75Sdrh   A = sqlite3Expr(@B, X, 0, 0);
6414adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
64281a20f21Sdrh }
643e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
6444adee20fSdanielk1977   A = sqlite3Expr(TK_UMINUS, X, 0, 0);
6454adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
646e1b6a5b8Sdrh }
6474b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
6484adee20fSdanielk1977   A = sqlite3Expr(TK_UPLUS, X, 0, 0);
6494adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
650e1b6a5b8Sdrh }
651e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
6524adee20fSdanielk1977   A = sqlite3Expr(TK_SELECT, 0, 0, 0);
653daffd0e5Sdrh   if( A ) A->pSelect = X;
6544adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&E);
65519a775c2Sdrh }
656fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
6574adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
6584adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
6594adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
660daffd0e5Sdrh   if( A ) A->pList = pList;
6614adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
662fef5208cSdrh }
6634794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
6644adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
6654adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
6664adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
667daffd0e5Sdrh   if( A ) A->pList = pList;
6684adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6694adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
6704794b980Sdrh }
671e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
6724adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
673daffd0e5Sdrh   if( A ) A->pList = Y;
6744adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
675fef5208cSdrh }
676e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
6774adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
678daffd0e5Sdrh   if( A ) A->pSelect = Y;
6794adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
680fef5208cSdrh }
681e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
6824adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
683daffd0e5Sdrh   if( A ) A->pList = Y;
6844adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6854adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
6864794b980Sdrh }
687e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
6884adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
689daffd0e5Sdrh   if( A ) A->pSelect = Y;
6904adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6914adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
6924794b980Sdrh }
69323b2db23Sdrh expr(A) ::= expr(X) IN nm(Y) dbnm(D). {
6944adee20fSdanielk1977   SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D);
6954adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
6964adee20fSdanielk1977   if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0);
6974adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,D.z?&D:&Y);
69823b2db23Sdrh }
69923b2db23Sdrh expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). {
7004adee20fSdanielk1977   SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D);
7014adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
7024adee20fSdanielk1977   if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0);
7034adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
7044adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,D.z?&D:&Y);
70523b2db23Sdrh }
70623b2db23Sdrh 
707fef5208cSdrh 
70817a7f8ddSdrh /* CASE expressions */
70917a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
7104adee20fSdanielk1977   A = sqlite3Expr(TK_CASE, X, Z, 0);
71117a7f8ddSdrh   if( A ) A->pList = Y;
7124adee20fSdanielk1977   sqlite3ExprSpan(A, &C, &E);
71317a7f8ddSdrh }
71417a7f8ddSdrh %type case_exprlist {ExprList*}
7154adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);}
71617a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
7174adee20fSdanielk1977   A = sqlite3ExprListAppend(X, Y, 0);
7184adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
71917a7f8ddSdrh }
72017a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
7214adee20fSdanielk1977   A = sqlite3ExprListAppend(0, Y, 0);
7224adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
72317a7f8ddSdrh }
72417a7f8ddSdrh %type case_else {Expr*}
72517a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
72617a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
72717a7f8ddSdrh %type case_operand {Expr*}
72817a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
72917a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
730348784efSdrh 
731348784efSdrh %type exprlist {ExprList*}
7324adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);}
733348784efSdrh %type expritem {Expr*}
7344adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);}
735348784efSdrh 
736348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
7374adee20fSdanielk1977    {A = sqlite3ExprListAppend(X,Y,0);}
7384adee20fSdanielk1977 exprlist(A) ::= expritem(X).            {A = sqlite3ExprListAppend(0,X,0);}
739348784efSdrh expritem(A) ::= expr(X).                {A = X;}
740348784efSdrh expritem(A) ::= .                       {A = 0;}
741cce7d176Sdrh 
742382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
743382c0247Sdrh //
744cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D)
745ef2cb63eSdanielk1977         ON nm(Y) dbnm(C) LP idxlist(Z) RP(E) onconf(R). {
7469cfcf5d4Sdrh   if( U!=OE_None ) U = R;
7479cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
748ef2cb63eSdanielk1977   sqlite3CreateIndex(pParse, &X, &D, sqlite3SrcListAppend(0,&Y,&C),
749ef2cb63eSdanielk1977       Z, U, &S, &E);
7509cfcf5d4Sdrh }
751717e6402Sdrh 
752717e6402Sdrh %type uniqueflag {int}
7539cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
7549cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
755348784efSdrh 
7560202b29eSdanielk1977 %type idxlist {ExprList*}
7570202b29eSdanielk1977 %destructor idxlist {sqlite3ExprListDelete($$);}
7580202b29eSdanielk1977 %type idxlist_opt {ExprList*}
7590202b29eSdanielk1977 %destructor idxlist_opt {sqlite3ExprListDelete($$);}
760348784efSdrh %type idxitem {Token}
761348784efSdrh 
762c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
763c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
7640202b29eSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder.  {
7650202b29eSdanielk1977   Expr *p = 0;
7660202b29eSdanielk1977   if( C.n>0 ){
7670202b29eSdanielk1977     p = sqlite3Expr(TK_COLUMN, 0, 0, 0);
7680202b29eSdanielk1977     if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n);
7690202b29eSdanielk1977   }
7700202b29eSdanielk1977   A = sqlite3ExprListAppend(X, p, &Y);
7710202b29eSdanielk1977 }
7720202b29eSdanielk1977 idxlist(A) ::= idxitem(Y) collate(C) sortorder. {
7730202b29eSdanielk1977   Expr *p = 0;
7740202b29eSdanielk1977   if( C.n>0 ){
7750202b29eSdanielk1977     p = sqlite3Expr(TK_COLUMN, 0, 0, 0);
7760202b29eSdanielk1977     if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n);
7770202b29eSdanielk1977   }
7780202b29eSdanielk1977   A = sqlite3ExprListAppend(0, p, &Y);
7790202b29eSdanielk1977 }
7800202b29eSdanielk1977 idxitem(A) ::= nm(X).              {A = X;}
7810202b29eSdanielk1977 
782348784efSdrh 
7838aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
784382c0247Sdrh //
785382c0247Sdrh 
786d24cc427Sdrh cmd ::= DROP INDEX nm(X) dbnm(Y).   {
7874adee20fSdanielk1977   sqlite3DropIndex(pParse, sqlite3SrcListAppend(0,&X,&Y));
788d24cc427Sdrh }
789982cef7eSdrh 
790382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
791382c0247Sdrh //
7924adee20fSdanielk1977 cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
7934adee20fSdanielk1977 cmd ::= VACUUM nm(X).         {sqlite3Vacuum(pParse,&X);}
794f57b14a6Sdrh 
795382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
796382c0247Sdrh //
79791cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ nm(Y).  {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
79891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y).  {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
79991cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
80091cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). {
80191cf71b0Sdanielk1977   sqlite3Pragma(pParse,&X,&Z,&Y,1);
80291cf71b0Sdanielk1977 }
80391cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
80491cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).  {sqlite3Pragma(pParse,&X,&Z,0,0);}
805f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
806f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
807f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
808f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
809f57b14a6Sdrh plus_opt ::= PLUS.
810f57b14a6Sdrh plus_opt ::= .
811c3f9bad2Sdanielk1977 
812c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
813f0f258b1Sdrh 
8143df6b257Sdanielk1977 cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
8154b59ab5eSdrh   Token all;
8164b59ab5eSdrh   all.z = A.z;
8174b59ab5eSdrh   all.n = (Z.z - A.z) + Z.n;
8184adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
819f0f258b1Sdrh }
820f0f258b1Sdrh 
8213df6b257Sdanielk1977 trigger_decl(A) ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C) trigger_event(D)
822f0f258b1Sdrh                  ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). {
8234adee20fSdanielk1977   SrcList *pTab = sqlite3SrcListAppend(0, &E, &DB);
824ef2cb63eSdanielk1977   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, pTab, F, G, T);
8253df6b257Sdanielk1977   A = (Z.n==0?B:Z);
826c3f9bad2Sdanielk1977 }
827c3f9bad2Sdanielk1977 
828c3f9bad2Sdanielk1977 %type trigger_time  {int}
829c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
830c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
831c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
832c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
833c3f9bad2Sdanielk1977 
834ad3cab52Sdrh %type trigger_event {struct TrigEvent}
8354adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);}
836c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
837c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
838c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
839c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
840c3f9bad2Sdanielk1977 
841c3f9bad2Sdanielk1977 %type foreach_clause {int}
842c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
843c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
844c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
845c3f9bad2Sdanielk1977 
846c3f9bad2Sdanielk1977 %type when_clause {Expr*}
847c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
848c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
849c3f9bad2Sdanielk1977 
850c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
8514adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}
852c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
853a69d9168Sdrh   X->pNext = Y;
854a69d9168Sdrh   A = X;
855a69d9168Sdrh }
856c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
857c3f9bad2Sdanielk1977 
858c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
8594adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);}
860c3f9bad2Sdanielk1977 // UPDATE
8615ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
8624adee20fSdanielk1977                { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); }
863c3f9bad2Sdanielk1977 
864c3f9bad2Sdanielk1977 // INSERT
8653054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F)
866c3f9bad2Sdanielk1977   VALUES LP itemlist(Y) RP.
8674adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);}
868c3f9bad2Sdanielk1977 
8693054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
8704adee20fSdanielk1977                {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);}
871c3f9bad2Sdanielk1977 
872c3f9bad2Sdanielk1977 // DELETE
8735ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
8744adee20fSdanielk1977                {A = sqlite3TriggerDeleteStep(&X, Y);}
875c3f9bad2Sdanielk1977 
876c3f9bad2Sdanielk1977 // SELECT
8774adee20fSdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(X); }
878c3f9bad2Sdanielk1977 
8796f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
8804b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
8814adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, 0);
8824b59ab5eSdrh   A->iColumn = OE_Ignore;
8834adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8844b59ab5eSdrh }
8854b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y).  {
8864adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8874b59ab5eSdrh   A->iColumn = OE_Rollback;
8884adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8894b59ab5eSdrh }
8904b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y).  {
8914adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8924b59ab5eSdrh   A->iColumn = OE_Abort;
8934adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8944b59ab5eSdrh }
8954b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y).  {
8964adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8974b59ab5eSdrh   A->iColumn = OE_Fail;
8984adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8994b59ab5eSdrh }
9006f34903eSdanielk1977 
901c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
902d24cc427Sdrh cmd ::= DROP TRIGGER nm(X) dbnm(D). {
9034adee20fSdanielk1977   sqlite3DropTrigger(pParse,sqlite3SrcListAppend(0,&X,&D));
904c3f9bad2Sdanielk1977 }
905113088ecSdrh 
906113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
9074d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). {
90825d6543dSdrh   sqlite3Attach(pParse, &F, &D, K.type, &K.key);
9091c2d8414Sdrh }
91025d6543dSdrh %type key_opt {struct AttachKey}
91125d6543dSdrh key_opt(A) ::= .                     { A.type = 0; }
91225d6543dSdrh key_opt(A) ::= KEY ids(X).           { A.type=1; A.key = X; }
913feac5f8dSdrh key_opt(A) ::= KEY BLOB(X).          { A.type=2; A.key = X; }
914113088ecSdrh 
915113088ecSdrh database_kw_opt ::= DATABASE.
916113088ecSdrh database_kw_opt ::= .
917113088ecSdrh 
918113088ecSdrh //////////////////////// DETACH DATABASE name /////////////////////////////////
9191c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). {
9204adee20fSdanielk1977   sqlite3Detach(pParse, &D);
9211c2d8414Sdrh }
922