xref: /sqlite-3.40.0/src/parse.y (revision ef2cb63e)
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*ef2cb63eSdanielk1977 ** @(#) $Id: parse.y,v 1.123 2004/05/29 02:37:19 danielk1977 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 
57caec2f12Sdrh } // end %include
58348784efSdrh 
59348784efSdrh // These are extra tokens used by the lexer but never seen by the
60348784efSdrh // parser.  We put them in a rule so that the parser generator will
616206d50aSdrh // add them to the parse.h output file.
62348784efSdrh //
63c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
64c4a3c779Sdrh           COLUMN AGG_FUNCTION.
65c4a3c779Sdrh 
66826fb5a3Sdrh // Input is a single SQL command
67c4a3c779Sdrh input ::= cmdlist.
68094b2bbfSdrh cmdlist ::= cmdlist ecmd.
69826fb5a3Sdrh cmdlist ::= ecmd.
70483750baSdrh ecmd ::= explain cmdx SEMI.
71094b2bbfSdrh ecmd ::= SEMI.
724adee20fSdanielk1977 cmdx ::= cmd.           { sqlite3Exec(pParse); }
734adee20fSdanielk1977 explain ::= EXPLAIN.    { sqlite3BeginParse(pParse, 1); }
744adee20fSdanielk1977 explain ::= .           { sqlite3BeginParse(pParse, 0); }
75348784efSdrh 
76382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
77c4a3c779Sdrh //
78fa86c412Sdrh 
794adee20fSdanielk1977 cmd ::= BEGIN trans_opt onconf(R).  {sqlite3BeginTransaction(pParse,R);}
80c4a3c779Sdrh trans_opt ::= .
81c4a3c779Sdrh trans_opt ::= TRANSACTION.
825ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
834adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
844adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
854adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
86c4a3c779Sdrh 
87382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
88348784efSdrh //
89348784efSdrh cmd ::= create_table create_table_args.
90cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). {
91cbb18d22Sdanielk1977    sqlite3StartTable(pParse,&X,&Y,&Z,T,0);
92969fa7c1Sdrh }
93f57b3399Sdrh %type temp {int}
94d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
95d24cc427Sdrh temp(A) ::= .      {A = 0;}
96969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
974adee20fSdanielk1977   sqlite3EndTable(pParse,&X,0);
98969fa7c1Sdrh }
99969fa7c1Sdrh create_table_args ::= AS select(S). {
1004adee20fSdanielk1977   sqlite3EndTable(pParse,0,S);
1014adee20fSdanielk1977   sqlite3SelectDelete(S);
102969fa7c1Sdrh }
103348784efSdrh columnlist ::= columnlist COMMA column.
104348784efSdrh columnlist ::= column.
105348784efSdrh 
106348784efSdrh // About the only information used for a column is the name of the
107348784efSdrh // column.  The type is always just "text".  But the code will accept
108348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
109348784efSdrh //
110348784efSdrh column ::= columnid type carglist.
1114adee20fSdanielk1977 columnid ::= nm(X).                {sqlite3AddColumn(pParse,&X);}
112c4a3c779Sdrh 
113c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
114c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
115c4a3c779Sdrh //
116982cef7eSdrh %type id {Token}
117f18543caSdrh id(A) ::= ID(X).         {A = X;}
1180bd1f4eaSdrh 
11934e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
12034e33bb8Sdrh // fallback to ID if they will not parse as their original value.
12134e33bb8Sdrh // This obviates the need for the "id" nonterminal.
12234e33bb8Sdrh //
1230bd1f4eaSdrh %fallback ID
124113088ecSdrh   ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CLUSTER CONFLICT
1255f3b4ab5Sdrh   DATABASE DEFERRED DESC DETACH EACH END EXPLAIN FAIL FOR
126319e4e74Sdrh   GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY
1275ad1a6c8Sdrh   OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
1280bd1f4eaSdrh   TEMP TRIGGER VACUUM VIEW.
129c4a3c779Sdrh 
1302d3917daSdrh // Define operator precedence early so that this is the first occurance
1312d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
1322d3917daSdrh // causes them to be assigned integer values that are close together,
1332d3917daSdrh // which keeps parser tables smaller.
1342d3917daSdrh //
1352d3917daSdrh %left OR.
1362d3917daSdrh %left AND.
1372d3917daSdrh %right NOT.
1382d3917daSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
1392d3917daSdrh %left GT GE LT LE.
1402d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
1412d3917daSdrh %left PLUS MINUS.
1422d3917daSdrh %left STAR SLASH REM.
1432d3917daSdrh %left CONCAT.
1442d3917daSdrh %right UMINUS UPLUS BITNOT.
1452d3917daSdrh 
146c4a3c779Sdrh // And "ids" is an identifer-or-string.
147c4a3c779Sdrh //
148c4a3c779Sdrh %type ids {Token}
1495ad1a6c8Sdrh ids(A) ::= ID(X).        {A = X;}
150c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
151c4a3c779Sdrh 
1525ad1a6c8Sdrh // The name of a column or table can be any of the following:
1535ad1a6c8Sdrh //
1545ad1a6c8Sdrh %type nm {Token}
1555ad1a6c8Sdrh nm(A) ::= ID(X).         {A = X;}
1565ad1a6c8Sdrh nm(A) ::= STRING(X).     {A = X;}
1575ad1a6c8Sdrh nm(A) ::= JOIN_KW(X).    {A = X;}
1585ad1a6c8Sdrh 
159382c0247Sdrh type ::= .
1604adee20fSdanielk1977 type ::= typename(X).                    {sqlite3AddColumnType(pParse,&X,&X);}
1614adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y).    {sqlite3AddColumnType(pParse,&X,&Y);}
162382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
1634adee20fSdanielk1977                                          {sqlite3AddColumnType(pParse,&X,&Y);}
164382c0247Sdrh %type typename {Token}
165382c0247Sdrh typename(A) ::= ids(X).             {A = X;}
166e2ea40d3Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=X.n+Addr(Y.z)-Addr(X.z);}
167ef0cae50Sdrh %type signed {int}
168ef0cae50Sdrh signed(A) ::= INTEGER(X).         { A = atoi(X.z); }
169ef0cae50Sdrh signed(A) ::= PLUS INTEGER(X).    { A = atoi(X.z); }
170ef0cae50Sdrh signed(A) ::= MINUS INTEGER(X).   { A = -atoi(X.z); }
171348784efSdrh carglist ::= carglist carg.
172348784efSdrh carglist ::= .
1735ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons.
174348784efSdrh carg ::= ccons.
1754adee20fSdanielk1977 carg ::= DEFAULT STRING(X).          {sqlite3AddDefaultValue(pParse,&X,0);}
1764adee20fSdanielk1977 carg ::= DEFAULT ID(X).              {sqlite3AddDefaultValue(pParse,&X,0);}
1774adee20fSdanielk1977 carg ::= DEFAULT INTEGER(X).         {sqlite3AddDefaultValue(pParse,&X,0);}
1784adee20fSdanielk1977 carg ::= DEFAULT PLUS INTEGER(X).    {sqlite3AddDefaultValue(pParse,&X,0);}
1794adee20fSdanielk1977 carg ::= DEFAULT MINUS INTEGER(X).   {sqlite3AddDefaultValue(pParse,&X,1);}
1804adee20fSdanielk1977 carg ::= DEFAULT FLOAT(X).           {sqlite3AddDefaultValue(pParse,&X,0);}
1814adee20fSdanielk1977 carg ::= DEFAULT PLUS FLOAT(X).      {sqlite3AddDefaultValue(pParse,&X,0);}
1824adee20fSdanielk1977 carg ::= DEFAULT MINUS FLOAT(X).     {sqlite3AddDefaultValue(pParse,&X,1);}
1837020f651Sdrh carg ::= DEFAULT NULL.
184348784efSdrh 
185382c0247Sdrh // In addition to the type name, we also care about the primary key and
186382c0247Sdrh // UNIQUE constraints.
187348784efSdrh //
1880d316a40Sdrh ccons ::= NULL onconf.
1894adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).               {sqlite3AddNotNull(pParse, R);}
1904adee20fSdanielk1977 ccons ::= PRIMARY KEY sortorder onconf(R).  {sqlite3AddPrimaryKey(pParse,0,R);}
191cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R).           {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);}
1929cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
193c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
1944adee20fSdanielk1977                                 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
1954adee20fSdanielk1977 ccons ::= defer_subclause(D).   {sqlite3DeferForeignKey(pParse,D);}
196d3d39e93Sdrh ccons ::= COLLATE id(C).  {sqlite3AddCollateType(pParse, C.z, C.n);}
19704738cb9Sdrh 
198c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
199c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
200c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
201c2eef3b3Sdrh // check fails.
20204738cb9Sdrh //
203c2eef3b3Sdrh %type refargs {int}
204c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
205c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
206c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
207c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
208c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
209c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
210c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
211c2eef3b3Sdrh %type refact {int}
212c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
213c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
214c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
215c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
216c2eef3b3Sdrh %type defer_subclause {int}
217c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
218c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
219c2eef3b3Sdrh %type init_deferred_pred_opt {int}
220c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
221c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
222c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
223348784efSdrh 
224348784efSdrh // For the time being, the only constraint we care about is the primary
225382c0247Sdrh // key and UNIQUE.  Both create indices.
226348784efSdrh //
227348784efSdrh conslist_opt ::= .
228348784efSdrh conslist_opt ::= COMMA conslist.
229348784efSdrh conslist ::= conslist COMMA tcons.
230a2e1bb5aSdrh conslist ::= conslist tcons.
231348784efSdrh conslist ::= tcons.
2325ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
2339cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
2344adee20fSdanielk1977                                              {sqlite3AddPrimaryKey(pParse,X,R);}
2359cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
236cbb18d22Sdanielk1977                                        {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);}
2379cfcf5d4Sdrh tcons ::= CHECK expr onconf.
238c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
239c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
2404adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
2414adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
242c2eef3b3Sdrh }
243c2eef3b3Sdrh %type defer_subclause_opt {int}
244c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
245c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
2469cfcf5d4Sdrh 
2479cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2489cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2499cfcf5d4Sdrh //
2509cfcf5d4Sdrh %type onconf {int}
2511c92853dSdrh %type orconf {int}
2521c92853dSdrh %type resolvetype {int}
2531c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
2541c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
2551c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
2561c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
2571c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
2581c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
2591c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
2601c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
2611c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
262348784efSdrh 
263382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
264348784efSdrh //
265a8858103Sdanielk1977 cmd ::= DROP TABLE nm(X) dbnm(Y).   {
266a8858103Sdanielk1977   sqlite3DropTable(pParse, sqlite3SrcListAppend(0,&X,&Y), 0);
267a8858103Sdanielk1977 }
268348784efSdrh 
269a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
270a76b5dfcSdrh //
27148dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). {
27248dec7e2Sdanielk1977   sqlite3CreateView(pParse, &X, &Y, &Z, S, T);
273a76b5dfcSdrh }
27448dec7e2Sdanielk1977 cmd ::= DROP VIEW nm(X) dbnm(Y). {
27548dec7e2Sdanielk1977   sqlite3DropTable(pParse, sqlite3SrcListAppend(0,&X,&Y), 1);
276a76b5dfcSdrh }
277a76b5dfcSdrh 
278382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
279348784efSdrh //
2809bb61fe7Sdrh cmd ::= select(X).  {
281bf3b721fSdanielk1977   sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0);
2824adee20fSdanielk1977   sqlite3SelectDelete(X);
2839bb61fe7Sdrh }
284efb7251dSdrh 
2859bb61fe7Sdrh %type select {Select*}
2864adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);}
28782c3d636Sdrh %type oneselect {Select*}
2884adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);}
2899bb61fe7Sdrh 
29082c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
2910a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
292daffd0e5Sdrh   if( Z ){
29382c3d636Sdrh     Z->op = Y;
29482c3d636Sdrh     Z->pPrior = X;
295daffd0e5Sdrh   }
29682c3d636Sdrh   A = Z;
29782c3d636Sdrh }
2980a36c57eSdrh %type multiselect_op {int}
2990a36c57eSdrh multiselect_op(A) ::= UNION.      {A = TK_UNION;}
3000a36c57eSdrh multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
3010a36c57eSdrh multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
3020a36c57eSdrh multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
30382c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
3049bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
3054adee20fSdanielk1977   A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
3069bb61fe7Sdrh }
3079bb61fe7Sdrh 
3089bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
3099bb61fe7Sdrh // present and false (0) if it is not.
3109bb61fe7Sdrh //
311efb7251dSdrh %type distinct {int}
312efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
313fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
314efb7251dSdrh distinct(A) ::= .           {A = 0;}
315348784efSdrh 
3169bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
3177c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
3187c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
3197c917d19Sdrh // opcode of TK_ALL.
3209bb61fe7Sdrh //
321348784efSdrh %type selcollist {ExprList*}
3224adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);}
323348784efSdrh %type sclp {ExprList*}
3244adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);}
325348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
326348784efSdrh sclp(A) ::= .                                {A = 0;}
32701f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y).     {
3284adee20fSdanielk1977    A = sqlite3ExprListAppend(P,X,Y.n?&Y:0);
32901f3f253Sdrh }
3307c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
3314adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0);
3327c917d19Sdrh }
3335ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
3344adee20fSdanielk1977   Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0);
3354adee20fSdanielk1977   Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X);
3364adee20fSdanielk1977   A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0);
33754473229Sdrh }
33801f3f253Sdrh 
33901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
34001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
34101f3f253Sdrh //
34201f3f253Sdrh %type as {Token}
3435ad1a6c8Sdrh as(X) ::= AS nm(Y).    { X = Y; }
3445ad1a6c8Sdrh as(X) ::= ids(Y).      { X = Y; }
34501f3f253Sdrh as(X) ::= .            { X.n = 0; }
3469bb61fe7Sdrh 
347348784efSdrh 
348ad3cab52Sdrh %type seltablist {SrcList*}
3494adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);}
350ad3cab52Sdrh %type stl_prefix {SrcList*}
3514adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);}
352ad3cab52Sdrh %type from {SrcList*}
3534adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);}
354348784efSdrh 
35501f3f253Sdrh // A complete FROM clause.
35601f3f253Sdrh //
357bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
358348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
35901f3f253Sdrh 
36001f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
36101f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
36201f3f253Sdrh //
36301f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y).    {
36401f3f253Sdrh    A = X;
36501f3f253Sdrh    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
36601f3f253Sdrh }
367348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
368113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). {
3694adee20fSdanielk1977   A = sqlite3SrcListAppend(X,&Y,&D);
3704adee20fSdanielk1977   if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
37101f3f253Sdrh   if( N ){
37201f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
3734adee20fSdanielk1977     else { sqlite3ExprDelete(N); }
374c4a3c779Sdrh   }
37501f3f253Sdrh   if( U ){
37601f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
3774adee20fSdanielk1977     else { sqlite3IdListDelete(U); }
37801f3f253Sdrh   }
37901f3f253Sdrh }
380b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP
381b733d037Sdrh                   as(Z) on_opt(N) using_opt(U). {
3824adee20fSdanielk1977   A = sqlite3SrcListAppend(X,0,0);
383ad3cab52Sdrh   A->a[A->nSrc-1].pSelect = S;
3844adee20fSdanielk1977   if( Z.n ) sqlite3SrcListAddAlias(A,&Z);
38501f3f253Sdrh   if( N ){
38601f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
3874adee20fSdanielk1977     else { sqlite3ExprDelete(N); }
38822f70c32Sdrh   }
38901f3f253Sdrh   if( U ){
39001f3f253Sdrh     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
3914adee20fSdanielk1977     else { sqlite3IdListDelete(U); }
392d5feede1Sdrh   }
39322f70c32Sdrh }
394348784efSdrh 
395b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that
396b733d037Sdrh // is contained inside parentheses.  This can be either a subquery or
397b733d037Sdrh // a grouping of table and subqueries.
398b733d037Sdrh //
399b733d037Sdrh %type seltablist_paren {Select*}
4004adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);}
401b733d037Sdrh seltablist_paren(A) ::= select(S).      {A = S;}
402b733d037Sdrh seltablist_paren(A) ::= seltablist(F).  {
4034adee20fSdanielk1977    A = sqlite3SelectNew(0,F,0,0,0,0,0,-1,0);
404b733d037Sdrh }
405b733d037Sdrh 
406113088ecSdrh %type dbnm {Token}
407113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
408113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
409113088ecSdrh 
41001f3f253Sdrh %type joinop {int}
41101f3f253Sdrh %type joinop2 {int}
41201f3f253Sdrh joinop(X) ::= COMMA.                   { X = JT_INNER; }
41301f3f253Sdrh joinop(X) ::= JOIN.                    { X = JT_INNER; }
4144adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqlite3JoinType(pParse,&A,0,0); }
4154adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqlite3JoinType(pParse,&A,&B,0); }
4165ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
4174adee20fSdanielk1977                                        { X = sqlite3JoinType(pParse,&A,&B,&C); }
41801f3f253Sdrh 
41901f3f253Sdrh %type on_opt {Expr*}
4204adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);}
42101f3f253Sdrh on_opt(N) ::= ON expr(E).   {N = E;}
42201f3f253Sdrh on_opt(N) ::= .             {N = 0;}
42301f3f253Sdrh 
42401f3f253Sdrh %type using_opt {IdList*}
4254adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);}
42601f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP.  {U = L;}
42701f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
42801f3f253Sdrh 
42901f3f253Sdrh 
430348784efSdrh %type orderby_opt {ExprList*}
4314adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);}
432348784efSdrh %type sortlist {ExprList*}
4334adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);}
434348784efSdrh %type sortitem {Expr*}
4354adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);}
436348784efSdrh 
437348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
438348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
4398e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
4401186b0a0Sdrh   A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0);
441d3d39e93Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = Z;
442348784efSdrh }
44338640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
4441186b0a0Sdrh   A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0);
445d3d39e93Sdrh   if( A ) A->a[0].sortOrder = Z;
446348784efSdrh }
447da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
448348784efSdrh 
449348784efSdrh %type sortorder {int}
450d3d39e93Sdrh %type collate {Token}
451348784efSdrh 
4528e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
4538e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
4548e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
455d3d39e93Sdrh collate(C) ::= .                {C.z = 0; C.n = 0;}
456d3d39e93Sdrh collate(C) ::= COLLATE id(X).   {C = X;}
457348784efSdrh 
4582282792aSdrh %type groupby_opt {ExprList*}
4594adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);}
4602282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
4612282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
4622282792aSdrh 
4632282792aSdrh %type having_opt {Expr*}
4644adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);}
4652282792aSdrh having_opt(A) ::= .                {A = 0;}
4662282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
4672282792aSdrh 
468ad3cab52Sdrh %type limit_opt {struct LimitVal}
469ad3cab52Sdrh limit_opt(A) ::= .                     {A.limit = -1; A.offset = 0;}
470ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X).      {A.limit = X; A.offset = 0;}
471ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y).
472ef0cae50Sdrh                                        {A.limit = X; A.offset = Y;}
473ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y).
474ef0cae50Sdrh                                        {A.limit = Y; A.offset = X;}
4759bbca4c1Sdrh 
476382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
477382c0247Sdrh //
478113088ecSdrh cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). {
4794adee20fSdanielk1977    sqlite3DeleteFrom(pParse, sqlite3SrcListAppend(0,&X,&D), Y);
480113088ecSdrh }
481348784efSdrh 
482348784efSdrh %type where_opt {Expr*}
4834adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);}
484348784efSdrh 
485348784efSdrh where_opt(A) ::= .                    {A = 0;}
486348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
487348784efSdrh 
488348784efSdrh %type setlist {ExprList*}
4894adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);}
490348784efSdrh 
491382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
492382c0247Sdrh //
493113088ecSdrh cmd ::= UPDATE orconf(R) nm(X) dbnm(D) SET setlist(Y) where_opt(Z).
4944adee20fSdanielk1977     {sqlite3Update(pParse,sqlite3SrcListAppend(0,&X,&D),Y,Z,R);}
495348784efSdrh 
4965ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
4974adee20fSdanielk1977     {A = sqlite3ExprListAppend(Z,Y,&X);}
4984adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y).   {A = sqlite3ExprListAppend(0,Y,&X);}
499348784efSdrh 
500382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
501382c0247Sdrh //
502113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F)
503113088ecSdrh         VALUES LP itemlist(Y) RP.
5044adee20fSdanielk1977             {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), Y, 0, F, R);}
505113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) select(S).
5064adee20fSdanielk1977             {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), 0, S, F, R);}
507348784efSdrh 
508fa86c412Sdrh %type insert_cmd {int}
509fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
510fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
511fa86c412Sdrh 
512348784efSdrh 
513348784efSdrh %type itemlist {ExprList*}
5144adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);}
515348784efSdrh 
5164adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqlite3ExprListAppend(X,Y,0);}
5174adee20fSdanielk1977 itemlist(A) ::= expr(X).                    {A = sqlite3ExprListAppend(0,X,0);}
518348784efSdrh 
519967e8b73Sdrh %type inscollist_opt {IdList*}
5204adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);}
521967e8b73Sdrh %type inscollist {IdList*}
5224adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);}
523348784efSdrh 
524967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
525967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
5264adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = sqlite3IdListAppend(X,&Y);}
5274adee20fSdanielk1977 inscollist(A) ::= nm(Y).                      {A = sqlite3IdListAppend(0,&Y);}
528348784efSdrh 
529382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
530382c0247Sdrh //
531348784efSdrh 
532348784efSdrh %type expr {Expr*}
5334adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);}
534348784efSdrh 
5354adee20fSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); }
5364adee20fSdanielk1977 expr(A) ::= NULL(X).             {A = sqlite3Expr(TK_NULL, 0, 0, &X);}
5374adee20fSdanielk1977 expr(A) ::= ID(X).               {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5384adee20fSdanielk1977 expr(A) ::= JOIN_KW(X).          {A = sqlite3Expr(TK_ID, 0, 0, &X);}
5395ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
5404adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5414adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5424adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp2, 0);
543e1b6a5b8Sdrh }
544d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
5454adee20fSdanielk1977   Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X);
5464adee20fSdanielk1977   Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y);
5474adee20fSdanielk1977   Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z);
5484adee20fSdanielk1977   Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0);
5494adee20fSdanielk1977   A = sqlite3Expr(TK_DOT, temp1, temp4, 0);
550d24cc427Sdrh }
5514adee20fSdanielk1977 expr(A) ::= INTEGER(X).      {A = sqlite3Expr(TK_INTEGER, 0, 0, &X);}
5524adee20fSdanielk1977 expr(A) ::= FLOAT(X).        {A = sqlite3Expr(TK_FLOAT, 0, 0, &X);}
5534adee20fSdanielk1977 expr(A) ::= STRING(X).       {A = sqlite3Expr(TK_STRING, 0, 0, &X);}
554c572ef7fSdanielk1977 expr(A) ::= BLOB(X).         {A = sqlite3Expr(TK_BLOB, 0, 0, &X);}
5557c972decSdrh expr(A) ::= VARIABLE(X).     {
5564adee20fSdanielk1977   A = sqlite3Expr(TK_VARIABLE, 0, 0, &X);
5577c972decSdrh   if( A ) A->iTable = ++pParse->nVar;
5587c972decSdrh }
559e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
5604adee20fSdanielk1977   A = sqlite3ExprFunction(Y, &X);
5614adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
562e1b6a5b8Sdrh }
563e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
5644adee20fSdanielk1977   A = sqlite3ExprFunction(0, &X);
5654adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
566e1b6a5b8Sdrh }
5674adee20fSdanielk1977 expr(A) ::= expr(X) AND expr(Y).   {A = sqlite3Expr(TK_AND, X, Y, 0);}
5684adee20fSdanielk1977 expr(A) ::= expr(X) OR expr(Y).    {A = sqlite3Expr(TK_OR, X, Y, 0);}
5694adee20fSdanielk1977 expr(A) ::= expr(X) LT expr(Y).    {A = sqlite3Expr(TK_LT, X, Y, 0);}
5704adee20fSdanielk1977 expr(A) ::= expr(X) GT expr(Y).    {A = sqlite3Expr(TK_GT, X, Y, 0);}
5714adee20fSdanielk1977 expr(A) ::= expr(X) LE expr(Y).    {A = sqlite3Expr(TK_LE, X, Y, 0);}
5724adee20fSdanielk1977 expr(A) ::= expr(X) GE expr(Y).    {A = sqlite3Expr(TK_GE, X, Y, 0);}
5734adee20fSdanielk1977 expr(A) ::= expr(X) NE expr(Y).    {A = sqlite3Expr(TK_NE, X, Y, 0);}
5744adee20fSdanielk1977 expr(A) ::= expr(X) EQ expr(Y).    {A = sqlite3Expr(TK_EQ, X, Y, 0);}
5754adee20fSdanielk1977 expr(A) ::= expr(X) BITAND expr(Y). {A = sqlite3Expr(TK_BITAND, X, Y, 0);}
5764adee20fSdanielk1977 expr(A) ::= expr(X) BITOR expr(Y).  {A = sqlite3Expr(TK_BITOR, X, Y, 0);}
5774adee20fSdanielk1977 expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqlite3Expr(TK_LSHIFT, X, Y, 0);}
5784adee20fSdanielk1977 expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqlite3Expr(TK_RSHIFT, X, Y, 0);}
5790ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
5804adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
5814adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
5824adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
5834b59ab5eSdrh   if( A ) A->op = OP;
5844adee20fSdanielk1977   sqlite3ExprSpan(A, &X->span, &Y->span);
5850ac65892Sdrh }
5860ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
5874adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
5884adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
5894adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
5904b59ab5eSdrh   if( A ) A->op = OP;
5914adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
5924adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&Y->span);
5934794b980Sdrh }
5944b59ab5eSdrh %type likeop {int}
5954b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;}
5964b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;}
5974adee20fSdanielk1977 expr(A) ::= expr(X) PLUS expr(Y).  {A = sqlite3Expr(TK_PLUS, X, Y, 0);}
5984adee20fSdanielk1977 expr(A) ::= expr(X) MINUS expr(Y). {A = sqlite3Expr(TK_MINUS, X, Y, 0);}
5994adee20fSdanielk1977 expr(A) ::= expr(X) STAR expr(Y).  {A = sqlite3Expr(TK_STAR, X, Y, 0);}
6004adee20fSdanielk1977 expr(A) ::= expr(X) SLASH expr(Y). {A = sqlite3Expr(TK_SLASH, X, Y, 0);}
6014adee20fSdanielk1977 expr(A) ::= expr(X) REM expr(Y).   {A = sqlite3Expr(TK_REM, X, Y, 0);}
6024adee20fSdanielk1977 expr(A) ::= expr(X) CONCAT expr(Y). {A = sqlite3Expr(TK_CONCAT, X, Y, 0);}
603e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
6044adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6054adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
606e1b6a5b8Sdrh }
60733048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
6084adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6094adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
61033048c0bSdrh }
61133048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
6124adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6134adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
61433048c0bSdrh }
615e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
6164adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6174adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
618e1b6a5b8Sdrh }
61981a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
6204adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6214adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
62281a20f21Sdrh }
623e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
6244adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, X, 0, 0);
6254adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
626e1b6a5b8Sdrh }
62781a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
6284adee20fSdanielk1977   A = sqlite3Expr(TK_BITNOT, X, 0, 0);
6294adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
63081a20f21Sdrh }
631e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
6324adee20fSdanielk1977   A = sqlite3Expr(TK_UMINUS, X, 0, 0);
6334adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
634e1b6a5b8Sdrh }
6354b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
6364adee20fSdanielk1977   A = sqlite3Expr(TK_UPLUS, X, 0, 0);
6374adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
638e1b6a5b8Sdrh }
639e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
6404adee20fSdanielk1977   A = sqlite3Expr(TK_SELECT, 0, 0, 0);
641daffd0e5Sdrh   if( A ) A->pSelect = X;
6424adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&E);
64319a775c2Sdrh }
644fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
6454adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
6464adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
6474adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
648daffd0e5Sdrh   if( A ) A->pList = pList;
6494adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
650fef5208cSdrh }
6514794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
6524adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
6534adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
6544adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
655daffd0e5Sdrh   if( A ) A->pList = pList;
6564adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6574adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
6584794b980Sdrh }
659e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
6604adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
661daffd0e5Sdrh   if( A ) A->pList = Y;
6624adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
663fef5208cSdrh }
664e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
6654adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
666daffd0e5Sdrh   if( A ) A->pSelect = Y;
6674adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
668fef5208cSdrh }
669e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
6704adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
671daffd0e5Sdrh   if( A ) A->pList = Y;
6724adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6734adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
6744794b980Sdrh }
675e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
6764adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
677daffd0e5Sdrh   if( A ) A->pSelect = Y;
6784adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6794adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
6804794b980Sdrh }
68123b2db23Sdrh expr(A) ::= expr(X) IN nm(Y) dbnm(D). {
6824adee20fSdanielk1977   SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D);
6834adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
6844adee20fSdanielk1977   if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0);
6854adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,D.z?&D:&Y);
68623b2db23Sdrh }
68723b2db23Sdrh expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). {
6884adee20fSdanielk1977   SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D);
6894adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
6904adee20fSdanielk1977   if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0);
6914adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6924adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,D.z?&D:&Y);
69323b2db23Sdrh }
69423b2db23Sdrh 
695fef5208cSdrh 
69617a7f8ddSdrh /* CASE expressions */
69717a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
6984adee20fSdanielk1977   A = sqlite3Expr(TK_CASE, X, Z, 0);
69917a7f8ddSdrh   if( A ) A->pList = Y;
7004adee20fSdanielk1977   sqlite3ExprSpan(A, &C, &E);
70117a7f8ddSdrh }
70217a7f8ddSdrh %type case_exprlist {ExprList*}
7034adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);}
70417a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
7054adee20fSdanielk1977   A = sqlite3ExprListAppend(X, Y, 0);
7064adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
70717a7f8ddSdrh }
70817a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
7094adee20fSdanielk1977   A = sqlite3ExprListAppend(0, Y, 0);
7104adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
71117a7f8ddSdrh }
71217a7f8ddSdrh %type case_else {Expr*}
71317a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
71417a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
71517a7f8ddSdrh %type case_operand {Expr*}
71617a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
71717a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
718348784efSdrh 
719348784efSdrh %type exprlist {ExprList*}
7204adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);}
721348784efSdrh %type expritem {Expr*}
7224adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);}
723348784efSdrh 
724348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
7254adee20fSdanielk1977    {A = sqlite3ExprListAppend(X,Y,0);}
7264adee20fSdanielk1977 exprlist(A) ::= expritem(X).            {A = sqlite3ExprListAppend(0,X,0);}
727348784efSdrh expritem(A) ::= expr(X).                {A = X;}
728348784efSdrh expritem(A) ::= .                       {A = 0;}
729cce7d176Sdrh 
730382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
731382c0247Sdrh //
732cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D)
733*ef2cb63eSdanielk1977         ON nm(Y) dbnm(C) LP idxlist(Z) RP(E) onconf(R). {
7349cfcf5d4Sdrh   if( U!=OE_None ) U = R;
7359cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
736*ef2cb63eSdanielk1977   sqlite3CreateIndex(pParse, &X, &D, sqlite3SrcListAppend(0,&Y,&C),
737*ef2cb63eSdanielk1977       Z, U, &S, &E);
7389cfcf5d4Sdrh }
739717e6402Sdrh 
740717e6402Sdrh %type uniqueflag {int}
7419cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
7429cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
743348784efSdrh 
744348784efSdrh %type idxlist {IdList*}
7454adee20fSdanielk1977 %destructor idxlist {sqlite3IdListDelete($$);}
746c2eef3b3Sdrh %type idxlist_opt {IdList*}
7474adee20fSdanielk1977 %destructor idxlist_opt {sqlite3IdListDelete($$);}
748348784efSdrh %type idxitem {Token}
749348784efSdrh 
750c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
751c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
7524adee20fSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y).  {A = sqlite3IdListAppend(X,&Y);}
7534adee20fSdanielk1977 idxlist(A) ::= idxitem(Y).                   {A = sqlite3IdListAppend(0,&Y);}
75486e5cc05Sdrh idxitem(A) ::= nm(X) sortorder.              {A = X;}
755348784efSdrh 
7568aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
757382c0247Sdrh //
758382c0247Sdrh 
759d24cc427Sdrh cmd ::= DROP INDEX nm(X) dbnm(Y).   {
7604adee20fSdanielk1977   sqlite3DropIndex(pParse, sqlite3SrcListAppend(0,&X,&Y));
761d24cc427Sdrh }
762982cef7eSdrh 
763382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
764382c0247Sdrh //
7654adee20fSdanielk1977 cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
7664adee20fSdanielk1977 cmd ::= VACUUM nm(X).         {sqlite3Vacuum(pParse,&X);}
767f57b14a6Sdrh 
768382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
769382c0247Sdrh //
7704adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ nm(Y).         {sqlite3Pragma(pParse,&X,&Y,0);}
7714adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlite3Pragma(pParse,&X,&Y,0);}
7724adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlite3Pragma(pParse,&X,&Y,0);}
7734adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlite3Pragma(pParse,&X,&Y,1);}
7744adee20fSdanielk1977 cmd ::= PRAGMA ids(X) LP nm(Y) RP.      {sqlite3Pragma(pParse,&X,&Y,0);}
7754adee20fSdanielk1977 cmd ::= PRAGMA ids(X).                   {sqlite3Pragma(pParse,&X,&X,0);}
776f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
777f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
778f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
779f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
780f57b14a6Sdrh plus_opt ::= PLUS.
781f57b14a6Sdrh plus_opt ::= .
782c3f9bad2Sdanielk1977 
783c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
784f0f258b1Sdrh 
785f0f258b1Sdrh cmd ::= CREATE(A) trigger_decl BEGIN trigger_cmd_list(S) END(Z). {
7864b59ab5eSdrh   Token all;
7874b59ab5eSdrh   all.z = A.z;
7884b59ab5eSdrh   all.n = (Z.z - A.z) + Z.n;
7894adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
790f0f258b1Sdrh }
791f0f258b1Sdrh 
792*ef2cb63eSdanielk1977 trigger_decl ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C) trigger_event(D)
793f0f258b1Sdrh                  ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). {
7944adee20fSdanielk1977   SrcList *pTab = sqlite3SrcListAppend(0, &E, &DB);
795*ef2cb63eSdanielk1977   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, pTab, F, G, T);
796c3f9bad2Sdanielk1977 }
797c3f9bad2Sdanielk1977 
798c3f9bad2Sdanielk1977 %type trigger_time  {int}
799c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
800c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
801c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
802c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
803c3f9bad2Sdanielk1977 
804ad3cab52Sdrh %type trigger_event {struct TrigEvent}
8054adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);}
806c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
807c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
808c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
809c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
810c3f9bad2Sdanielk1977 
811c3f9bad2Sdanielk1977 %type foreach_clause {int}
812c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
813c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
814c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
815c3f9bad2Sdanielk1977 
816c3f9bad2Sdanielk1977 %type when_clause {Expr *}
817c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
818c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
819c3f9bad2Sdanielk1977 
820c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *}
8214adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}
822c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
823a69d9168Sdrh   X->pNext = Y;
824a69d9168Sdrh   A = X;
825a69d9168Sdrh }
826c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
827c3f9bad2Sdanielk1977 
828c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *}
8294adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);}
830c3f9bad2Sdanielk1977 // UPDATE
8315ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
8324adee20fSdanielk1977                { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); }
833c3f9bad2Sdanielk1977 
834c3f9bad2Sdanielk1977 // INSERT
8353054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F)
836c3f9bad2Sdanielk1977   VALUES LP itemlist(Y) RP.
8374adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);}
838c3f9bad2Sdanielk1977 
8393054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
8404adee20fSdanielk1977                {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);}
841c3f9bad2Sdanielk1977 
842c3f9bad2Sdanielk1977 // DELETE
8435ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
8444adee20fSdanielk1977                {A = sqlite3TriggerDeleteStep(&X, Y);}
845c3f9bad2Sdanielk1977 
846c3f9bad2Sdanielk1977 // SELECT
8474adee20fSdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(X); }
848c3f9bad2Sdanielk1977 
8496f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
8504b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
8514adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, 0);
8524b59ab5eSdrh   A->iColumn = OE_Ignore;
8534adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8544b59ab5eSdrh }
8554b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y).  {
8564adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8574b59ab5eSdrh   A->iColumn = OE_Rollback;
8584adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8594b59ab5eSdrh }
8604b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y).  {
8614adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8624b59ab5eSdrh   A->iColumn = OE_Abort;
8634adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8644b59ab5eSdrh }
8654b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y).  {
8664adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8674b59ab5eSdrh   A->iColumn = OE_Fail;
8684adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8694b59ab5eSdrh }
8706f34903eSdanielk1977 
871c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
872d24cc427Sdrh cmd ::= DROP TRIGGER nm(X) dbnm(D). {
8734adee20fSdanielk1977   sqlite3DropTrigger(pParse,sqlite3SrcListAppend(0,&X,&D));
874c3f9bad2Sdanielk1977 }
875113088ecSdrh 
876113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
8774d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). {
8784adee20fSdanielk1977   sqlite3Attach(pParse, &F, &D, &K);
8791c2d8414Sdrh }
8804d189ca4Sdrh %type key_opt {Token}
8814d189ca4Sdrh key_opt(A) ::= USING ids(X).  { A = X; }
8824d189ca4Sdrh key_opt(A) ::= .              { A.z = 0; A.n = 0; }
883113088ecSdrh 
884113088ecSdrh database_kw_opt ::= DATABASE.
885113088ecSdrh database_kw_opt ::= .
886113088ecSdrh 
887113088ecSdrh //////////////////////// DETACH DATABASE name /////////////////////////////////
8881c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). {
8894adee20fSdanielk1977   sqlite3Detach(pParse, &D);
8901c2d8414Sdrh }
891