xref: /sqlite-3.40.0/src/parse.y (revision 4e0cff60)
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*4e0cff60Sdrh ** @(#) $Id: parse.y,v 1.149 2004/11/05 05:10:29 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 /*
472e3a1f16Sdrh ** An instance of this structure is used to store the LIKE,
482e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators.
492e3a1f16Sdrh */
502e3a1f16Sdrh struct LikeOp {
512e3a1f16Sdrh   int opcode;   /* Either TK_GLOB or TK_LIKE */
522e3a1f16Sdrh   int not;      /* True if the NOT keyword is present */
532e3a1f16Sdrh };
542e3a1f16Sdrh 
552e3a1f16Sdrh /*
56ad3cab52Sdrh ** An instance of the following structure describes the event of a
57ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
58ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
59ad3cab52Sdrh **
60ad3cab52Sdrh **      UPDATE ON (a,b,c)
61ad3cab52Sdrh **
62ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
63c3f9bad2Sdanielk1977 */
64ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
65caec2f12Sdrh 
6625d6543dSdrh /*
6725d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type.
6825d6543dSdrh */
6925d6543dSdrh struct AttachKey { int type;  Token key; };
7025d6543dSdrh 
71caec2f12Sdrh } // end %include
72348784efSdrh 
73348784efSdrh // These are extra tokens used by the lexer but never seen by the
74348784efSdrh // parser.  We put them in a rule so that the parser generator will
756206d50aSdrh // add them to the parse.h output file.
76348784efSdrh //
77c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
78c4a3c779Sdrh           COLUMN AGG_FUNCTION.
79c4a3c779Sdrh 
80826fb5a3Sdrh // Input is a single SQL command
81c4a3c779Sdrh input ::= cmdlist.
82094b2bbfSdrh cmdlist ::= cmdlist ecmd.
83826fb5a3Sdrh cmdlist ::= ecmd.
8480242055Sdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
85b7f9164eSdrh ecmd ::= SEMI.
86b7f9164eSdrh ecmd ::= explain cmdx SEMI.
874adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
88b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
89b7f9164eSdrh explain ::= EXPLAIN.    { sqlite3BeginParse(pParse, 1); }
90b7f9164eSdrh %endif
91348784efSdrh 
92382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
93c4a3c779Sdrh //
94fa86c412Sdrh 
95684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
96c4a3c779Sdrh trans_opt ::= .
97c4a3c779Sdrh trans_opt ::= TRANSACTION.
985ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
99684917c2Sdrh %type transtype {int}
100684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
101684917c2Sdrh transtype(A) ::= DEFERRED(X).  {A = @X;}
102684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;}
103684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;}
1044adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
1054adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
1064adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
107c4a3c779Sdrh 
108382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
109348784efSdrh //
110348784efSdrh cmd ::= create_table create_table_args.
111cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). {
112cbb18d22Sdanielk1977    sqlite3StartTable(pParse,&X,&Y,&Z,T,0);
113969fa7c1Sdrh }
114f57b3399Sdrh %type temp {int}
115d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
116d24cc427Sdrh temp(A) ::= .      {A = 0;}
117969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
1184adee20fSdanielk1977   sqlite3EndTable(pParse,&X,0);
119969fa7c1Sdrh }
120969fa7c1Sdrh create_table_args ::= AS select(S). {
1214adee20fSdanielk1977   sqlite3EndTable(pParse,0,S);
1224adee20fSdanielk1977   sqlite3SelectDelete(S);
123969fa7c1Sdrh }
124348784efSdrh columnlist ::= columnlist COMMA column.
125348784efSdrh columnlist ::= column.
126348784efSdrh 
127348784efSdrh // About the only information used for a column is the name of the
128348784efSdrh // column.  The type is always just "text".  But the code will accept
129348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
130348784efSdrh //
131348784efSdrh column ::= columnid type carglist.
1324adee20fSdanielk1977 columnid ::= nm(X).                {sqlite3AddColumn(pParse,&X);}
133c4a3c779Sdrh 
134c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
135c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
136c4a3c779Sdrh //
137982cef7eSdrh %type id {Token}
138f18543caSdrh id(A) ::= ID(X).         {A = X;}
1390bd1f4eaSdrh 
14034e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
14134e33bb8Sdrh // fallback to ID if they will not parse as their original value.
14234e33bb8Sdrh // This obviates the need for the "id" nonterminal.
14334e33bb8Sdrh //
1440bd1f4eaSdrh %fallback ID
14510e8266bSdrh   ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CONFLICT
146684917c2Sdrh   DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
147319e4e74Sdrh   GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY
1485ad1a6c8Sdrh   OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
149b7f9164eSdrh   TEMP TRIGGER VACUUM VIEW
150b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
151b7f9164eSdrh   EXCEPT INTERSECT UNION
152b7f9164eSdrh %endif
15352fb6d71Sdrh   REINDEX RENAME AUTOINCR CDATE CTIME CTIMESTAMP ALTER
154b7f9164eSdrh   .
155c4a3c779Sdrh 
1562d3917daSdrh // Define operator precedence early so that this is the first occurance
1572d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
1582d3917daSdrh // causes them to be assigned integer values that are close together,
1592d3917daSdrh // which keeps parser tables smaller.
1602d3917daSdrh //
161f2bc013cSdrh // The token values assigned to these symbols is determined by the order
162f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
163f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
164f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
165f2bc013cSdrh // constraint.
166f2bc013cSdrh //
1672d3917daSdrh %left OR.
1682d3917daSdrh %left AND.
1692d3917daSdrh %right NOT.
170f2bc013cSdrh %left IS LIKE GLOB BETWEEN IN ISNULL NOTNULL NE EQ.
1719a43267bSdrh %left GT LE LT GE.
1722d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
1732d3917daSdrh %left PLUS MINUS.
1742d3917daSdrh %left STAR SLASH REM.
1752d3917daSdrh %left CONCAT.
1762d3917daSdrh %right UMINUS UPLUS BITNOT.
1772d3917daSdrh 
178c4a3c779Sdrh // And "ids" is an identifer-or-string.
179c4a3c779Sdrh //
180c4a3c779Sdrh %type ids {Token}
1815ad1a6c8Sdrh ids(A) ::= ID(X).        {A = X;}
182c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
183c4a3c779Sdrh 
1845ad1a6c8Sdrh // The name of a column or table can be any of the following:
1855ad1a6c8Sdrh //
1865ad1a6c8Sdrh %type nm {Token}
1875ad1a6c8Sdrh nm(A) ::= ID(X).         {A = X;}
1885ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
1895ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
1905ad1a6c8Sdrh 
191382c0247Sdrh type ::= .
1924adee20fSdanielk1977 type ::= typename(X).                    {sqlite3AddColumnType(pParse,&X,&X);}
1934adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y).    {sqlite3AddColumnType(pParse,&X,&Y);}
194382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
1954adee20fSdanielk1977                                          {sqlite3AddColumnType(pParse,&X,&Y);}
196382c0247Sdrh %type typename {Token}
197382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
198596bd235Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);}
199ef0cae50Sdrh %type signed {int}
20074ad7fe9Sdrh signed(A) ::= plus_num(X).    { A = atoi(X.z); }
20174ad7fe9Sdrh signed(A) ::= minus_num(X).   { A = -atoi(X.z); }
202348784efSdrh carglist ::= carglist carg.
203348784efSdrh carglist ::= .
2045ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
205348784efSdrh carg ::= ccons.
20674ad7fe9Sdrh carg ::= DEFAULT ids(X).             {sqlite3AddDefaultValue(pParse,&X,0);}
20774ad7fe9Sdrh carg ::= DEFAULT plus_num(X).        {sqlite3AddDefaultValue(pParse,&X,0);}
20874ad7fe9Sdrh carg ::= DEFAULT minus_num(X).       {sqlite3AddDefaultValue(pParse,&X,1);}
2097020f651Sdrh carg ::= DEFAULT NULL.
210348784efSdrh 
211382c0247Sdrh // In addition to the type name, we also care about the primary key and
212382c0247Sdrh // UNIQUE constraints.
213348784efSdrh //
2140d316a40Sdrh ccons ::= NULL onconf.
2154adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).               {sqlite3AddNotNull(pParse, R);}
216205f48e6Sdrh ccons ::= PRIMARY KEY sortorder onconf(R) autoinc(I).
217205f48e6Sdrh                                      {sqlite3AddPrimaryKey(pParse,0,R,I);}
218cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R).          {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);}
2199cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
220c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
2214adee20fSdanielk1977                                 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
2224adee20fSdanielk1977 ccons ::= defer_subclause(D).   {sqlite3DeferForeignKey(pParse,D);}
223d3d39e93Sdrh ccons ::= COLLATE id(C).  {sqlite3AddCollateType(pParse, C.z, C.n);}
22404738cb9Sdrh 
225205f48e6Sdrh // The optional AUTOINCREMENT keyword
226205f48e6Sdrh %type autoinc {int}
227205f48e6Sdrh autoinc(X) ::= .         {X = 0;}
228205f48e6Sdrh autoinc(X) ::= AUTOINC.  {X = 1;}
229205f48e6Sdrh 
230c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
231c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
232c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
233c2eef3b3Sdrh // check fails.
23404738cb9Sdrh //
235c2eef3b3Sdrh %type refargs {int}
236c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
237c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
238c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
239c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
240c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
241c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
242c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
243c2eef3b3Sdrh %type refact {int}
244c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
245c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
246c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
247c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
248c2eef3b3Sdrh %type defer_subclause {int}
249c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
250c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
251c2eef3b3Sdrh %type init_deferred_pred_opt {int}
252c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
253c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
254c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
255348784efSdrh 
256348784efSdrh // For the time being, the only constraint we care about is the primary
257382c0247Sdrh // key and UNIQUE.  Both create indices.
258348784efSdrh //
259348784efSdrh conslist_opt ::= .
260348784efSdrh conslist_opt ::= COMMA conslist.
261348784efSdrh conslist ::= conslist COMMA tcons.
262a2e1bb5aSdrh conslist ::= conslist tcons.
263348784efSdrh conslist ::= tcons.
2645ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
265205f48e6Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R) autoinc(I).
266205f48e6Sdrh                                          {sqlite3AddPrimaryKey(pParse,X,R,I);}
2679cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
268cbb18d22Sdanielk1977                                        {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);}
2699cfcf5d4Sdrh tcons ::= CHECK expr onconf.
270c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
271c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
2724adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
2734adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
274c2eef3b3Sdrh }
275c2eef3b3Sdrh %type defer_subclause_opt {int}
276c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
277c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
2789cfcf5d4Sdrh 
2799cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2809cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2819cfcf5d4Sdrh //
2829cfcf5d4Sdrh %type onconf {int}
2831c92853dSdrh %type orconf {int}
2841c92853dSdrh %type resolvetype {int}
2851c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
2861c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
2871c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
2881c92853dSdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
28974ad7fe9Sdrh resolvetype(A) ::= raisetype(X).             {A = X;}
2901c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
2911c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
292348784efSdrh 
293382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
294348784efSdrh //
29574ad7fe9Sdrh cmd ::= DROP TABLE fullname(X). {
29674ad7fe9Sdrh   sqlite3DropTable(pParse, X, 0);
297a8858103Sdanielk1977 }
298348784efSdrh 
299a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
300a76b5dfcSdrh //
301b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
30248dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). {
30348dec7e2Sdanielk1977   sqlite3CreateView(pParse, &X, &Y, &Z, S, T);
304a76b5dfcSdrh }
30574ad7fe9Sdrh cmd ::= DROP VIEW fullname(X). {
30674ad7fe9Sdrh   sqlite3DropTable(pParse, X, 1);
307a76b5dfcSdrh }
308b7f9164eSdrh %endif // SQLITE_OMIT_VIEW
309a76b5dfcSdrh 
310382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
311348784efSdrh //
3129bb61fe7Sdrh cmd ::= select(X).  {
313bf3b721fSdanielk1977   sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0);
3144adee20fSdanielk1977   sqlite3SelectDelete(X);
3159bb61fe7Sdrh }
316efb7251dSdrh 
3179bb61fe7Sdrh %type select {Select*}
3184adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);}
31982c3d636Sdrh %type oneselect {Select*}
3204adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);}
3219bb61fe7Sdrh 
32282c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
323b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
3240a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
325daffd0e5Sdrh   if( Z ){
32682c3d636Sdrh     Z->op = Y;
32782c3d636Sdrh     Z->pPrior = X;
328daffd0e5Sdrh   }
32982c3d636Sdrh   A = Z;
33082c3d636Sdrh }
3310a36c57eSdrh %type multiselect_op {int}
33274ad7fe9Sdrh multiselect_op(A) ::= UNION(OP).      {A = @OP;}
3330a36c57eSdrh multiselect_op(A) ::= UNION ALL.      {A = TK_ALL;}
33474ad7fe9Sdrh multiselect_op(A) ::= INTERSECT(OP).  {A = @OP;}
33574ad7fe9Sdrh multiselect_op(A) ::= EXCEPT(OP).     {A = @OP;}
336b7f9164eSdrh %endif // SQLITE_OMIT_COMPOUND_SELECT
33782c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
3389bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
3394adee20fSdanielk1977   A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
3409bb61fe7Sdrh }
3419bb61fe7Sdrh 
3429bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
3439bb61fe7Sdrh // present and false (0) if it is not.
3449bb61fe7Sdrh //
345efb7251dSdrh %type distinct {int}
346efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
347fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
348efb7251dSdrh distinct(A) ::= .           {A = 0;}
349348784efSdrh 
3509bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
3517c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
3527c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
3537c917d19Sdrh // opcode of TK_ALL.
3549bb61fe7Sdrh //
355348784efSdrh %type selcollist {ExprList*}
3564adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);}
357348784efSdrh %type sclp {ExprList*}
3584adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);}
359348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
360348784efSdrh sclp(A) ::= .                                {A = 0;}
36101f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
3624adee20fSdanielk1977    A = sqlite3ExprListAppend(P,X,Y.n?&Y:0);
36301f3f253Sdrh }
3647c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
3654adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0);
3667c917d19Sdrh }
3675ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
3684adee20fSdanielk1977   Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0);
3694adee20fSdanielk1977   Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X);
3704adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0);
37154473229Sdrh }
37201f3f253Sdrh 
37301f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
37401f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
37501f3f253Sdrh //
37601f3f253Sdrh %type as {Token}
3775ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
3785ad1a6c8Sdrh as(X) ::= ids(Y).      {X = Y;}
37901f3f253Sdrh as(X) ::= .            {X.n = 0;}
3809bb61fe7Sdrh 
381348784efSdrh 
382ad3cab52Sdrh %type seltablist {SrcList*}
3834adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);}
384ad3cab52Sdrh %type stl_prefix {SrcList*}
3854adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);}
386ad3cab52Sdrh %type from {SrcList*}
3874adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);}
388348784efSdrh 
38901f3f253Sdrh // A complete FROM clause.
39001f3f253Sdrh //
391bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
392348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
39301f3f253Sdrh 
39401f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
39501f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
39601f3f253Sdrh //
39701f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
39801f3f253Sdrh    A = X;
39901f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
40001f3f253Sdrh }
401348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
402113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). {
4034adee20fSdanielk1977   A = sqlite3SrcListAppend(X,&Y,&D);
4044adee20fSdanielk1977   if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
40501f3f253Sdrh   if( N ){
40601f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
4074adee20fSdanielk1977     else { sqlite3ExprDelete(N); }
408c4a3c779Sdrh   }
40901f3f253Sdrh   if( U ){
41001f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
4114adee20fSdanielk1977     else { sqlite3IdListDelete(U); }
41201f3f253Sdrh   }
41301f3f253Sdrh }
414b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP
415b733d037Sdrh                   as(Z) on_opt(N) using_opt(U). {
4164adee20fSdanielk1977   A = sqlite3SrcListAppend(X,0,0);
417ad3cab52Sdrh   A->a[A->nSrc-1].pSelect = S;
4184adee20fSdanielk1977   if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
41901f3f253Sdrh   if( N ){
42001f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
4214adee20fSdanielk1977     else { sqlite3ExprDelete(N); }
42222f70c32Sdrh   }
42301f3f253Sdrh   if( U ){
42401f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
4254adee20fSdanielk1977     else { sqlite3IdListDelete(U); }
426d5feede1Sdrh   }
42722f70c32Sdrh }
428348784efSdrh 
429b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that
430b733d037Sdrh // is contained inside parentheses.  This can be either a subquery or
431b733d037Sdrh // a grouping of table and subqueries.
432b733d037Sdrh //
433b733d037Sdrh %type seltablist_paren {Select*}
4344adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);}
435b733d037Sdrh seltablist_paren(A) ::= select(S).      {A = S;}
436b733d037Sdrh seltablist_paren(A) ::= seltablist(F).  {
4374adee20fSdanielk1977    A = sqlite3SelectNew(0,F,0,0,0,0,0,-1,0);
438b733d037Sdrh }
439b733d037Sdrh 
440113088ecSdrh %type dbnm {Token}
441113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
442113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
443113088ecSdrh 
44474ad7fe9Sdrh %type fullname {SrcList*}
44574ad7fe9Sdrh %destructor fullname {sqlite3SrcListDelete($$);}
44674ad7fe9Sdrh fullname(A) ::= nm(X) dbnm(Y).  {A = sqlite3SrcListAppend(0,&X,&Y);}
44774ad7fe9Sdrh 
44801f3f253Sdrh %type joinop {int}
44901f3f253Sdrh %type joinop2 {int}
45001f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
45101f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
4524adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
4534adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
4545ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
4554adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
45601f3f253Sdrh 
45701f3f253Sdrh %type on_opt {Expr*}
4584adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);}
45901f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
46001f3f253Sdrh on_opt(N) ::= .             {N = 0;}
46101f3f253Sdrh 
46201f3f253Sdrh %type using_opt {IdList*}
4634adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);}
4640202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP.  {U = L;}
46501f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
46601f3f253Sdrh 
46701f3f253Sdrh 
468348784efSdrh %type orderby_opt {ExprList*}
4694adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);}
470348784efSdrh %type sortlist {ExprList*}
4714adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);}
472348784efSdrh %type sortitem {Expr*}
4734adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);}
474348784efSdrh 
475348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
476348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
4778e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
4781186b0a0Sdrh   A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0);
479d3d39e93Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = Z;
480348784efSdrh }
48138640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
4821186b0a0Sdrh   A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0);
48396fb0dd5Sdanielk1977   if( A && A->a ) A->a[0].sortOrder = Z;
484348784efSdrh }
485da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
486348784efSdrh 
487348784efSdrh %type sortorder {int}
488d3d39e93Sdrh %type collate {Token}
489348784efSdrh 
4908e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
4918e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
4928e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
493d3d39e93Sdrh collate(C) ::= .                {C.z = 0; C.n = 0;}
494d3d39e93Sdrh collate(C) ::= COLLATE id(X).   {C = X;}
495348784efSdrh 
4962282792aSdrh %type groupby_opt {ExprList*}
4974adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);}
4982282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
4992282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
5002282792aSdrh 
5012282792aSdrh %type having_opt {Expr*}
5024adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);}
5032282792aSdrh having_opt(A) ::= .                {A = 0;}
5042282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
5052282792aSdrh 
506ad3cab52Sdrh %type limit_opt {struct LimitVal}
507ad3cab52Sdrh limit_opt(A) ::= .                     {A.limit = -1; A.offset = 0;}
508ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X).      {A.limit = X; A.offset = 0;}
509ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y).
510ef0cae50Sdrh                                        {A.limit = X; A.offset = Y;}
511ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y).
512ef0cae50Sdrh                                        {A.limit = Y; A.offset = X;}
5139bbca4c1Sdrh 
514382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
515382c0247Sdrh //
51674ad7fe9Sdrh cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);}
517348784efSdrh 
518348784efSdrh %type where_opt {Expr*}
5194adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);}
520348784efSdrh 
521348784efSdrh where_opt(A) ::= .                    {A = 0;}
522348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
523348784efSdrh 
524348784efSdrh %type setlist {ExprList*}
5254adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);}
526348784efSdrh 
527382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
528382c0247Sdrh //
52974ad7fe9Sdrh cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z).
53074ad7fe9Sdrh     {sqlite3Update(pParse,X,Y,Z,R);}
531348784efSdrh 
5325ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
5334adee20fSdanielk1977     {A = sqlite3ExprListAppend(Z,Y,&X);}
5344adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y).   {A = sqlite3ExprListAppend(0,Y,&X);}
535348784efSdrh 
536382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
537382c0247Sdrh //
53874ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F)
539113088ecSdrh         VALUES LP itemlist(Y) RP.
54074ad7fe9Sdrh             {sqlite3Insert(pParse, X, Y, 0, F, R);}
54174ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
54274ad7fe9Sdrh             {sqlite3Insert(pParse, X, 0, S, F, R);}
543348784efSdrh 
544fa86c412Sdrh %type insert_cmd {int}
545fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
546fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
547fa86c412Sdrh 
548348784efSdrh 
549348784efSdrh %type itemlist {ExprList*}
5504adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);}
551348784efSdrh 
5524adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqlite3ExprListAppend(X,Y,0);}
5534adee20fSdanielk1977 itemlist(A) ::= expr(X).                    {A = sqlite3ExprListAppend(0,X,0);}
554348784efSdrh 
555967e8b73Sdrh %type inscollist_opt {IdList*}
5564adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);}
557967e8b73Sdrh %type inscollist {IdList*}
5584adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);}
559348784efSdrh 
560967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
561967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
5624adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = sqlite3IdListAppend(X,&Y);}
5634adee20fSdanielk1977 inscollist(A) ::= nm(Y).                      {A = sqlite3IdListAppend(0,&Y);}
564348784efSdrh 
565382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
566382c0247Sdrh //
567348784efSdrh 
568348784efSdrh %type expr {Expr*}
5694adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);}
570348784efSdrh 
5714adee20fSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); }
5727ac25c75Sdrh expr(A) ::= NULL(X).             {A = sqlite3Expr(@X, 0, 0, &X);}
5734adee20fSdanielk1977 expr(A) ::= ID(X).               {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5744adee20fSdanielk1977 expr(A) ::= JOIN_KW(X).          {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5755ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
5764adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5774adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5784adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp2, 0);
579e1b6a5b8Sdrh }
580d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
5814adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5824adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5834adee20fSdanielk1977   Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z);
5844adee20fSdanielk1977   Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0);
5854adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp4, 0);
586d24cc427Sdrh }
5877ac25c75Sdrh expr(A) ::= INTEGER(X).      {A = sqlite3Expr(@X, 0, 0, &X);}
5887ac25c75Sdrh expr(A) ::= FLOAT(X).        {A = sqlite3Expr(@X, 0, 0, &X);}
5897ac25c75Sdrh expr(A) ::= STRING(X).       {A = sqlite3Expr(@X, 0, 0, &X);}
5907ac25c75Sdrh expr(A) ::= BLOB(X).         {A = sqlite3Expr(@X, 0, 0, &X);}
591*4e0cff60Sdrh expr(A) ::= REGISTER(X).     {A = sqlite3RegisterExpr(pParse, &X);}
5927c972decSdrh expr(A) ::= VARIABLE(X).     {
593895d7472Sdrh   Token *pToken = &X;
594895d7472Sdrh   Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken);
595fa6bc000Sdrh   sqlite3ExprAssignVarNumber(pParse, pExpr);
596895d7472Sdrh }
597e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
5984adee20fSdanielk1977   A = sqlite3ExprFunction(Y, &X);
5994adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
600e1b6a5b8Sdrh }
601e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
6024adee20fSdanielk1977   A = sqlite3ExprFunction(0, &X);
6034adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
604e1b6a5b8Sdrh }
6057ac25c75Sdrh expr(A) ::= expr(X) AND(OP) expr(Y).    {A = sqlite3Expr(@OP, X, Y, 0);}
6067ac25c75Sdrh expr(A) ::= expr(X) OR(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6077ac25c75Sdrh expr(A) ::= expr(X) LT(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6087ac25c75Sdrh expr(A) ::= expr(X) GT(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6097ac25c75Sdrh expr(A) ::= expr(X) LE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6107ac25c75Sdrh expr(A) ::= expr(X) GE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6117ac25c75Sdrh expr(A) ::= expr(X) NE(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6127ac25c75Sdrh expr(A) ::= expr(X) EQ(OP) expr(Y).     {A = sqlite3Expr(@OP, X, Y, 0);}
6137ac25c75Sdrh expr(A) ::= expr(X) BITAND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
6147ac25c75Sdrh expr(A) ::= expr(X) BITOR(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
6157ac25c75Sdrh expr(A) ::= expr(X) LSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
6167ac25c75Sdrh expr(A) ::= expr(X) RSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
61774ad7fe9Sdrh expr(A) ::= expr(X) PLUS(OP) expr(Y).   {A = sqlite3Expr(@OP, X, Y, 0);}
61874ad7fe9Sdrh expr(A) ::= expr(X) MINUS(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
61974ad7fe9Sdrh expr(A) ::= expr(X) STAR(OP) expr(Y).   {A = sqlite3Expr(@OP, X, Y, 0);}
62074ad7fe9Sdrh expr(A) ::= expr(X) SLASH(OP) expr(Y).  {A = sqlite3Expr(@OP, X, Y, 0);}
62174ad7fe9Sdrh expr(A) ::= expr(X) REM(OP) expr(Y).    {A = sqlite3Expr(@OP, X, Y, 0);}
62274ad7fe9Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}
62374ad7fe9Sdrh %type likeop {struct LikeOp}
62474ad7fe9Sdrh likeop(A) ::= LIKE.     {A.opcode = TK_LIKE; A.not = 0;}
62574ad7fe9Sdrh likeop(A) ::= GLOB.     {A.opcode = TK_GLOB; A.not = 0;}
62674ad7fe9Sdrh likeop(A) ::= NOT LIKE. {A.opcode = TK_LIKE; A.not = 1;}
62774ad7fe9Sdrh likeop(A) ::= NOT GLOB. {A.opcode = TK_GLOB; A.not = 1;}
6280ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
6294adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
6304adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
6314adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
6322e3a1f16Sdrh   if( A ) A->op = OP.opcode;
6332e3a1f16Sdrh   if( OP.not ) A = sqlite3Expr(TK_NOT, A, 0, 0);
6344adee20fSdanielk1977   sqlite3ExprSpan(A, &X->span, &Y->span);
6350ac65892Sdrh }
636e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
6374adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6384adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
639e1b6a5b8Sdrh }
64033048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
6414adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6424adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
64333048c0bSdrh }
64433048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
6454adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6464adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
64733048c0bSdrh }
648e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
6494adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6504adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
651e1b6a5b8Sdrh }
65281a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
6534adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6544adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
65581a20f21Sdrh }
656e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
6577ac25c75Sdrh   A = sqlite3Expr(@B, X, 0, 0);
6584adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
659e1b6a5b8Sdrh }
66081a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
6617ac25c75Sdrh   A = sqlite3Expr(@B, X, 0, 0);
6624adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
66381a20f21Sdrh }
664e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
6654adee20fSdanielk1977   A = sqlite3Expr(TK_UMINUS, X, 0, 0);
6664adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
667e1b6a5b8Sdrh }
6684b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
6694adee20fSdanielk1977   A = sqlite3Expr(TK_UPLUS, X, 0, 0);
6704adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
671e1b6a5b8Sdrh }
672e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
6734adee20fSdanielk1977   A = sqlite3Expr(TK_SELECT, 0, 0, 0);
674daffd0e5Sdrh   if( A ) A->pSelect = X;
6754adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&E);
67619a775c2Sdrh }
6772e3a1f16Sdrh %type between_op {int}
6782e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
6792e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
6802e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
6814adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
6824adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
6834adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
684daffd0e5Sdrh   if( A ) A->pList = pList;
6852e3a1f16Sdrh   if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
6864adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
687fef5208cSdrh }
6882e3a1f16Sdrh %type in_op {int}
6892e3a1f16Sdrh in_op(A) ::= IN.      {A = 0;}
6902e3a1f16Sdrh in_op(A) ::= NOT IN.  {A = 1;}
6912e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
6924adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
693daffd0e5Sdrh   if( A ) A->pList = Y;
6942e3a1f16Sdrh   if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
6954adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
696fef5208cSdrh }
6972e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E).  [IN] {
6984adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
699daffd0e5Sdrh   if( A ) A->pSelect = Y;
7002e3a1f16Sdrh   if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
7014adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
702fef5208cSdrh }
70374ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
70474ad7fe9Sdrh   SrcList *pSrc = sqlite3SrcListAppend(0,&Y,&Z);
7054adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
7064adee20fSdanielk1977   if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0);
7072e3a1f16Sdrh   if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0);
70874ad7fe9Sdrh   sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y);
70923b2db23Sdrh }
71023b2db23Sdrh 
711fef5208cSdrh 
71217a7f8ddSdrh /* CASE expressions */
71317a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
7144adee20fSdanielk1977   A = sqlite3Expr(TK_CASE, X, Z, 0);
71517a7f8ddSdrh   if( A ) A->pList = Y;
7164adee20fSdanielk1977   sqlite3ExprSpan(A, &C, &E);
71717a7f8ddSdrh }
71817a7f8ddSdrh %type case_exprlist {ExprList*}
7194adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);}
72017a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
7214adee20fSdanielk1977   A = sqlite3ExprListAppend(X, Y, 0);
7224adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
72317a7f8ddSdrh }
72417a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
7254adee20fSdanielk1977   A = sqlite3ExprListAppend(0, Y, 0);
7264adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
72717a7f8ddSdrh }
72817a7f8ddSdrh %type case_else {Expr*}
72917a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
73017a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
73117a7f8ddSdrh %type case_operand {Expr*}
73217a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
73317a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
734348784efSdrh 
735348784efSdrh %type exprlist {ExprList*}
7364adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);}
737348784efSdrh %type expritem {Expr*}
7384adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);}
739348784efSdrh 
740348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
7414adee20fSdanielk1977                                         {A = sqlite3ExprListAppend(X,Y,0);}
7424adee20fSdanielk1977 exprlist(A) ::= expritem(X).            {A = sqlite3ExprListAppend(0,X,0);}
743348784efSdrh expritem(A) ::= expr(X).                {A = X;}
744348784efSdrh expritem(A) ::= .                       {A = 0;}
745cce7d176Sdrh 
746382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
747382c0247Sdrh //
748cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D)
74974ad7fe9Sdrh         ON fullname(Y) LP idxlist(Z) RP(E) onconf(R). {
7509cfcf5d4Sdrh   if( U!=OE_None ) U = R;
7519cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
75274ad7fe9Sdrh   sqlite3CreateIndex(pParse, &X, &D, Y, Z, U, &S, &E);
7539cfcf5d4Sdrh }
754717e6402Sdrh 
755717e6402Sdrh %type uniqueflag {int}
7569cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
7579cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
758348784efSdrh 
7590202b29eSdanielk1977 %type idxlist {ExprList*}
7600202b29eSdanielk1977 %destructor idxlist {sqlite3ExprListDelete($$);}
7610202b29eSdanielk1977 %type idxlist_opt {ExprList*}
7620202b29eSdanielk1977 %destructor idxlist_opt {sqlite3ExprListDelete($$);}
763348784efSdrh %type idxitem {Token}
764348784efSdrh 
765c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
766c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
7670202b29eSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder.  {
7680202b29eSdanielk1977   Expr *p = 0;
7690202b29eSdanielk1977   if( C.n>0 ){
7700202b29eSdanielk1977     p = sqlite3Expr(TK_COLUMN, 0, 0, 0);
7710202b29eSdanielk1977     if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n);
7720202b29eSdanielk1977   }
7730202b29eSdanielk1977   A = sqlite3ExprListAppend(X, p, &Y);
7740202b29eSdanielk1977 }
7750202b29eSdanielk1977 idxlist(A) ::= idxitem(Y) collate(C) sortorder. {
7760202b29eSdanielk1977   Expr *p = 0;
7770202b29eSdanielk1977   if( C.n>0 ){
7780202b29eSdanielk1977     p = sqlite3Expr(TK_COLUMN, 0, 0, 0);
7790202b29eSdanielk1977     if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n);
7800202b29eSdanielk1977   }
7810202b29eSdanielk1977   A = sqlite3ExprListAppend(0, p, &Y);
7820202b29eSdanielk1977 }
7830202b29eSdanielk1977 idxitem(A) ::= nm(X).              {A = X;}
7840202b29eSdanielk1977 
785348784efSdrh 
7868aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
787382c0247Sdrh //
78874ad7fe9Sdrh cmd ::= DROP INDEX fullname(X).   {sqlite3DropIndex(pParse, X);}
789982cef7eSdrh 
790382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
791382c0247Sdrh //
7924adee20fSdanielk1977 cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
79374ad7fe9Sdrh cmd ::= VACUUM nm.             {sqlite3Vacuum(pParse,0);}
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 
814b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
815b7f9164eSdrh 
8163df6b257Sdanielk1977 cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
8174b59ab5eSdrh   Token all;
8184b59ab5eSdrh   all.z = A.z;
8194b59ab5eSdrh   all.n = (Z.z - A.z) + Z.n;
8204adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
821f0f258b1Sdrh }
822f0f258b1Sdrh 
82374ad7fe9Sdrh trigger_decl(A) ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C)
82474ad7fe9Sdrh                     trigger_event(D)
82574ad7fe9Sdrh                     ON fullname(E) foreach_clause(F) when_clause(G). {
82674ad7fe9Sdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, F, G, T);
8273df6b257Sdanielk1977   A = (Z.n==0?B:Z);
828c3f9bad2Sdanielk1977 }
829c3f9bad2Sdanielk1977 
830c3f9bad2Sdanielk1977 %type trigger_time  {int}
831c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
832c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
833c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
834c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
835c3f9bad2Sdanielk1977 
836ad3cab52Sdrh %type trigger_event {struct TrigEvent}
8374adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);}
83874ad7fe9Sdrh trigger_event(A) ::= DELETE(OP).              {A.a = @OP; A.b = 0;}
83974ad7fe9Sdrh trigger_event(A) ::= INSERT(OP).              {A.a = @OP; A.b = 0;}
84074ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP).              {A.a = @OP; A.b = 0;}
841c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}
842c3f9bad2Sdanielk1977 
843c3f9bad2Sdanielk1977 %type foreach_clause {int}
844c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
845c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
846c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
847c3f9bad2Sdanielk1977 
848c3f9bad2Sdanielk1977 %type when_clause {Expr*}
849c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
850c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
851c3f9bad2Sdanielk1977 
852c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
8534adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}
854c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
855a69d9168Sdrh   X->pNext = Y;
856a69d9168Sdrh   A = X;
857a69d9168Sdrh }
858c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
859c3f9bad2Sdanielk1977 
860c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
8614adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);}
862c3f9bad2Sdanielk1977 // UPDATE
8635ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
8644adee20fSdanielk1977                { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); }
865c3f9bad2Sdanielk1977 
866c3f9bad2Sdanielk1977 // INSERT
8673054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F)
868c3f9bad2Sdanielk1977                    VALUES LP itemlist(Y) RP.
8694adee20fSdanielk1977                {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);}
870c3f9bad2Sdanielk1977 
8713054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
8724adee20fSdanielk1977                {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);}
873c3f9bad2Sdanielk1977 
874c3f9bad2Sdanielk1977 // DELETE
8755ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
8764adee20fSdanielk1977                {A = sqlite3TriggerDeleteStep(&X, Y);}
877c3f9bad2Sdanielk1977 
878c3f9bad2Sdanielk1977 // SELECT
8794adee20fSdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(X); }
880c3f9bad2Sdanielk1977 
8816f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
8824b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
8834adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, 0);
8844b59ab5eSdrh   A->iColumn = OE_Ignore;
8854adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8864b59ab5eSdrh }
88774ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y).  {
8884adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
88974ad7fe9Sdrh   A->iColumn = T;
8904adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8914b59ab5eSdrh }
892b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER
893b7f9164eSdrh 
89474ad7fe9Sdrh %type raisetype {int}
89574ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
89674ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
89774ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
89874ad7fe9Sdrh 
8996f34903eSdanielk1977 
900c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
901b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
90274ad7fe9Sdrh cmd ::= DROP TRIGGER fullname(X). {
90374ad7fe9Sdrh   sqlite3DropTrigger(pParse,X);
904c3f9bad2Sdanielk1977 }
905b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER
906113088ecSdrh 
907113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
9084d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). {
90925d6543dSdrh   sqlite3Attach(pParse, &F, &D, K.type, &K.key);
9101c2d8414Sdrh }
91125d6543dSdrh %type key_opt {struct AttachKey}
91225d6543dSdrh key_opt(A) ::= .                     { A.type = 0; }
91325d6543dSdrh key_opt(A) ::= KEY ids(X).           { A.type=1; A.key = X; }
914feac5f8dSdrh key_opt(A) ::= KEY BLOB(X).          { A.type=2; A.key = X; }
915113088ecSdrh 
916113088ecSdrh database_kw_opt ::= DATABASE.
917113088ecSdrh database_kw_opt ::= .
918113088ecSdrh 
919113088ecSdrh //////////////////////// DETACH DATABASE name /////////////////////////////////
9201c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). {
9214adee20fSdanielk1977   sqlite3Detach(pParse, &D);
9221c2d8414Sdrh }
923