xref: /sqlite-3.40.0/src/parse.y (revision e2ea40d3)
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*e2ea40d3Sdrh ** @(#) $Id: parse.y,v 1.115 2004/05/20 12:41:20 drh Exp $
18348784efSdrh */
19348784efSdrh %token_prefix TK_
20348784efSdrh %token_type {Token}
21f57b14a6Sdrh %default_type {Token}
22348784efSdrh %extra_argument {Parse *pParse}
23348784efSdrh %syntax_error {
24b86ccfb2Sdrh   if( pParse->zErrMsg==0 ){
25b86ccfb2Sdrh     if( TOKEN.z[0] ){
264adee20fSdanielk1977       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
27b86ccfb2Sdrh     }else{
284adee20fSdanielk1977       sqlite3ErrorMsg(pParse, "incomplete SQL statement");
29b86ccfb2Sdrh     }
30b86ccfb2Sdrh   }
31348784efSdrh }
324adee20fSdanielk1977 %name sqlite3Parser
33348784efSdrh %include {
34348784efSdrh #include "sqliteInt.h"
35348784efSdrh #include "parse.h"
369bbca4c1Sdrh 
379bbca4c1Sdrh /*
38ad3cab52Sdrh ** An instance of this structure holds information about the
39ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
409bbca4c1Sdrh */
41ad3cab52Sdrh struct LimitVal {
42ad3cab52Sdrh   int limit;    /* The LIMIT value.  -1 if there is no limit */
43ad3cab52Sdrh   int offset;   /* The OFFSET.  0 if there is none */
44ad3cab52Sdrh };
45c3f9bad2Sdanielk1977 
46c3f9bad2Sdanielk1977 /*
47ad3cab52Sdrh ** An instance of the following structure describes the event of a
48ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
49ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
50ad3cab52Sdrh **
51ad3cab52Sdrh **      UPDATE ON (a,b,c)
52ad3cab52Sdrh **
53ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
54c3f9bad2Sdanielk1977 */
55ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
56caec2f12Sdrh 
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.
905ad1a6c8Sdrh create_table ::= CREATE(X) temp(T) TABLE nm(Y). {
914adee20fSdanielk1977    sqlite3StartTable(pParse,&X,&Y,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
125113088ecSdrh   COPY DATABASE DEFERRED DELIMITERS 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;}
166*e2ea40d3Sdrh 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);}
1914adee20fSdanielk1977 ccons ::= UNIQUE onconf(R).           {sqlite3CreateIndex(pParse,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);}
1968e2ca029Sdrh ccons ::= COLLATE id(C).  {
1974adee20fSdanielk1977    sqlite3AddCollateType(pParse, sqlite3CollateType(C.z, C.n));
1988e2ca029Sdrh }
19904738cb9Sdrh 
200c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
201c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
202c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
203c2eef3b3Sdrh // check fails.
20404738cb9Sdrh //
205c2eef3b3Sdrh %type refargs {int}
206c2eef3b3Sdrh refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
207c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
208c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
209c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
210c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
211c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
212c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
213c2eef3b3Sdrh %type refact {int}
214c2eef3b3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull; }
215c2eef3b3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
216c2eef3b3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade; }
217c2eef3b3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; }
218c2eef3b3Sdrh %type defer_subclause {int}
219c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
220c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
221c2eef3b3Sdrh %type init_deferred_pred_opt {int}
222c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
223c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
224c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
225348784efSdrh 
226348784efSdrh // For the time being, the only constraint we care about is the primary
227382c0247Sdrh // key and UNIQUE.  Both create indices.
228348784efSdrh //
229348784efSdrh conslist_opt ::= .
230348784efSdrh conslist_opt ::= COMMA conslist.
231348784efSdrh conslist ::= conslist COMMA tcons.
232a2e1bb5aSdrh conslist ::= conslist tcons.
233348784efSdrh conslist ::= tcons.
2345ad1a6c8Sdrh tcons ::= CONSTRAINT nm.
2359cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
2364adee20fSdanielk1977                                              {sqlite3AddPrimaryKey(pParse,X,R);}
2379cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
2384adee20fSdanielk1977                                        {sqlite3CreateIndex(pParse,0,0,X,R,0,0);}
2399cfcf5d4Sdrh tcons ::= CHECK expr onconf.
240c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP
241c2eef3b3Sdrh           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
2424adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
2434adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
244c2eef3b3Sdrh }
245c2eef3b3Sdrh %type defer_subclause_opt {int}
246c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
247c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
2489cfcf5d4Sdrh 
2499cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
2509cfcf5d4Sdrh // default behavior when there is a constraint conflict.
2519cfcf5d4Sdrh //
2529cfcf5d4Sdrh %type onconf {int}
2531c92853dSdrh %type orconf {int}
2541c92853dSdrh %type resolvetype {int}
2551c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
2561c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
2571c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
2581c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
2591c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
2601c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
2611c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
2621c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
2631c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
264348784efSdrh 
265382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
266348784efSdrh //
2674adee20fSdanielk1977 cmd ::= DROP TABLE nm(X).          {sqlite3DropTable(pParse,&X,0);}
268348784efSdrh 
269a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
270a76b5dfcSdrh //
2716276c1cbSdrh cmd ::= CREATE(X) temp(T) VIEW nm(Y) AS select(S). {
2724adee20fSdanielk1977   sqlite3CreateView(pParse, &X, &Y, S, T);
273a76b5dfcSdrh }
2745ad1a6c8Sdrh cmd ::= DROP VIEW nm(X). {
2754adee20fSdanielk1977   sqlite3DropTable(pParse, &X, 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). {
4404adee20fSdanielk1977   A = sqlite3ExprListAppend(X,Y,0);
4418e2ca029Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = C+Z;
442348784efSdrh }
44338640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
4444adee20fSdanielk1977   A = sqlite3ExprListAppend(0,Y,0);
44538640e15Sdrh   if( A ) A->a[0].sortOrder = C+Z;
446348784efSdrh }
447da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
448348784efSdrh 
449348784efSdrh %type sortorder {int}
4508e2ca029Sdrh %type collate {int}
451348784efSdrh 
4528e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
4538e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
4548e2ca029Sdrh sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
4558e2ca029Sdrh collate(C) ::= .                {C = SQLITE_SO_UNK;}
4564adee20fSdanielk1977 collate(C) ::= COLLATE id(X).   {C = sqlite3CollateType(X.z, X.n);}
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);}
5547c972decSdrh expr(A) ::= VARIABLE(X).     {
5554adee20fSdanielk1977   A = sqlite3Expr(TK_VARIABLE, 0, 0, &X);
5567c972decSdrh   if( A ) A->iTable = ++pParse->nVar;
5577c972decSdrh }
558e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
5594adee20fSdanielk1977   A = sqlite3ExprFunction(Y, &X);
5604adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
561e1b6a5b8Sdrh }
562e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
5634adee20fSdanielk1977   A = sqlite3ExprFunction(0, &X);
5644adee20fSdanielk1977   sqlite3ExprSpan(A,&X,&E);
565e1b6a5b8Sdrh }
5664adee20fSdanielk1977 expr(A) ::= expr(X) AND expr(Y).   {A = sqlite3Expr(TK_AND, X, Y, 0);}
5674adee20fSdanielk1977 expr(A) ::= expr(X) OR expr(Y).    {A = sqlite3Expr(TK_OR, X, Y, 0);}
5684adee20fSdanielk1977 expr(A) ::= expr(X) LT expr(Y).    {A = sqlite3Expr(TK_LT, X, Y, 0);}
5694adee20fSdanielk1977 expr(A) ::= expr(X) GT expr(Y).    {A = sqlite3Expr(TK_GT, X, Y, 0);}
5704adee20fSdanielk1977 expr(A) ::= expr(X) LE expr(Y).    {A = sqlite3Expr(TK_LE, X, Y, 0);}
5714adee20fSdanielk1977 expr(A) ::= expr(X) GE expr(Y).    {A = sqlite3Expr(TK_GE, X, Y, 0);}
5724adee20fSdanielk1977 expr(A) ::= expr(X) NE expr(Y).    {A = sqlite3Expr(TK_NE, X, Y, 0);}
5734adee20fSdanielk1977 expr(A) ::= expr(X) EQ expr(Y).    {A = sqlite3Expr(TK_EQ, X, Y, 0);}
5744adee20fSdanielk1977 expr(A) ::= expr(X) BITAND expr(Y). {A = sqlite3Expr(TK_BITAND, X, Y, 0);}
5754adee20fSdanielk1977 expr(A) ::= expr(X) BITOR expr(Y).  {A = sqlite3Expr(TK_BITOR, X, Y, 0);}
5764adee20fSdanielk1977 expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqlite3Expr(TK_LSHIFT, X, Y, 0);}
5774adee20fSdanielk1977 expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqlite3Expr(TK_RSHIFT, X, Y, 0);}
5780ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
5794adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
5804adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
5814adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
5824b59ab5eSdrh   if( A ) A->op = OP;
5834adee20fSdanielk1977   sqlite3ExprSpan(A, &X->span, &Y->span);
5840ac65892Sdrh }
5850ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
5864adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, Y, 0);
5874adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, X, 0);
5884adee20fSdanielk1977   A = sqlite3ExprFunction(pList, 0);
5894b59ab5eSdrh   if( A ) A->op = OP;
5904adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
5914adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&Y->span);
5924794b980Sdrh }
5934b59ab5eSdrh %type likeop {int}
5944b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;}
5954b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;}
5964adee20fSdanielk1977 expr(A) ::= expr(X) PLUS expr(Y).  {A = sqlite3Expr(TK_PLUS, X, Y, 0);}
5974adee20fSdanielk1977 expr(A) ::= expr(X) MINUS expr(Y). {A = sqlite3Expr(TK_MINUS, X, Y, 0);}
5984adee20fSdanielk1977 expr(A) ::= expr(X) STAR expr(Y).  {A = sqlite3Expr(TK_STAR, X, Y, 0);}
5994adee20fSdanielk1977 expr(A) ::= expr(X) SLASH expr(Y). {A = sqlite3Expr(TK_SLASH, X, Y, 0);}
6004adee20fSdanielk1977 expr(A) ::= expr(X) REM expr(Y).   {A = sqlite3Expr(TK_REM, X, Y, 0);}
6014adee20fSdanielk1977 expr(A) ::= expr(X) CONCAT expr(Y). {A = sqlite3Expr(TK_CONCAT, X, Y, 0);}
602e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
6034adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6044adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
605e1b6a5b8Sdrh }
60633048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
6074adee20fSdanielk1977   A = sqlite3Expr(TK_ISNULL, X, 0, 0);
6084adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
60933048c0bSdrh }
61033048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
6114adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6124adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
61333048c0bSdrh }
614e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
6154adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6164adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
617e1b6a5b8Sdrh }
61881a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
6194adee20fSdanielk1977   A = sqlite3Expr(TK_NOTNULL, X, 0, 0);
6204adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
62181a20f21Sdrh }
622e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
6234adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, X, 0, 0);
6244adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
625e1b6a5b8Sdrh }
62681a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
6274adee20fSdanielk1977   A = sqlite3Expr(TK_BITNOT, X, 0, 0);
6284adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
62981a20f21Sdrh }
630e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
6314adee20fSdanielk1977   A = sqlite3Expr(TK_UMINUS, X, 0, 0);
6324adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
633e1b6a5b8Sdrh }
6344b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] {
6354adee20fSdanielk1977   A = sqlite3Expr(TK_UPLUS, X, 0, 0);
6364adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&X->span);
637e1b6a5b8Sdrh }
638e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
6394adee20fSdanielk1977   A = sqlite3Expr(TK_SELECT, 0, 0, 0);
640daffd0e5Sdrh   if( A ) A->pSelect = X;
6414adee20fSdanielk1977   sqlite3ExprSpan(A,&B,&E);
64219a775c2Sdrh }
643fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
6444adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
6454adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
6464adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
647daffd0e5Sdrh   if( A ) A->pList = pList;
6484adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
649fef5208cSdrh }
6504794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
6514adee20fSdanielk1977   ExprList *pList = sqlite3ExprListAppend(0, X, 0);
6524adee20fSdanielk1977   pList = sqlite3ExprListAppend(pList, Y, 0);
6534adee20fSdanielk1977   A = sqlite3Expr(TK_BETWEEN, W, 0, 0);
654daffd0e5Sdrh   if( A ) A->pList = pList;
6554adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6564adee20fSdanielk1977   sqlite3ExprSpan(A,&W->span,&Y->span);
6574794b980Sdrh }
658e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
6594adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
660daffd0e5Sdrh   if( A ) A->pList = Y;
6614adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
662fef5208cSdrh }
663e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
6644adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
665daffd0e5Sdrh   if( A ) A->pSelect = Y;
6664adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
667fef5208cSdrh }
668e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
6694adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
670daffd0e5Sdrh   if( A ) A->pList = Y;
6714adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6724adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
6734794b980Sdrh }
674e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
6754adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
676daffd0e5Sdrh   if( A ) A->pSelect = Y;
6774adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6784adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,&E);
6794794b980Sdrh }
68023b2db23Sdrh expr(A) ::= expr(X) IN nm(Y) dbnm(D). {
6814adee20fSdanielk1977   SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D);
6824adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
6834adee20fSdanielk1977   if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0);
6844adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,D.z?&D:&Y);
68523b2db23Sdrh }
68623b2db23Sdrh expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). {
6874adee20fSdanielk1977   SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D);
6884adee20fSdanielk1977   A = sqlite3Expr(TK_IN, X, 0, 0);
6894adee20fSdanielk1977   if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0);
6904adee20fSdanielk1977   A = sqlite3Expr(TK_NOT, A, 0, 0);
6914adee20fSdanielk1977   sqlite3ExprSpan(A,&X->span,D.z?&D:&Y);
69223b2db23Sdrh }
69323b2db23Sdrh 
694fef5208cSdrh 
69517a7f8ddSdrh /* CASE expressions */
69617a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
6974adee20fSdanielk1977   A = sqlite3Expr(TK_CASE, X, Z, 0);
69817a7f8ddSdrh   if( A ) A->pList = Y;
6994adee20fSdanielk1977   sqlite3ExprSpan(A, &C, &E);
70017a7f8ddSdrh }
70117a7f8ddSdrh %type case_exprlist {ExprList*}
7024adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);}
70317a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
7044adee20fSdanielk1977   A = sqlite3ExprListAppend(X, Y, 0);
7054adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
70617a7f8ddSdrh }
70717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
7084adee20fSdanielk1977   A = sqlite3ExprListAppend(0, Y, 0);
7094adee20fSdanielk1977   A = sqlite3ExprListAppend(A, Z, 0);
71017a7f8ddSdrh }
71117a7f8ddSdrh %type case_else {Expr*}
71217a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
71317a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
71417a7f8ddSdrh %type case_operand {Expr*}
71517a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
71617a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
717348784efSdrh 
718348784efSdrh %type exprlist {ExprList*}
7194adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);}
720348784efSdrh %type expritem {Expr*}
7214adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);}
722348784efSdrh 
723348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
7244adee20fSdanielk1977    {A = sqlite3ExprListAppend(X,Y,0);}
7254adee20fSdanielk1977 exprlist(A) ::= expritem(X).            {A = sqlite3ExprListAppend(0,X,0);}
726348784efSdrh expritem(A) ::= expr(X).                {A = X;}
727348784efSdrh expritem(A) ::= .                       {A = 0;}
728cce7d176Sdrh 
729382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
730382c0247Sdrh //
7314925ca00Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X)
732d24cc427Sdrh         ON nm(Y) dbnm(D) LP idxlist(Z) RP(E) onconf(R). {
7334adee20fSdanielk1977   SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D);
7349cfcf5d4Sdrh   if( U!=OE_None ) U = R;
7359cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
7364adee20fSdanielk1977   sqlite3CreateIndex(pParse, &X, pSrc, Z, U, &S, &E);
7379cfcf5d4Sdrh }
738717e6402Sdrh 
739717e6402Sdrh %type uniqueflag {int}
7409cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
7419cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
742348784efSdrh 
743348784efSdrh %type idxlist {IdList*}
7444adee20fSdanielk1977 %destructor idxlist {sqlite3IdListDelete($$);}
745c2eef3b3Sdrh %type idxlist_opt {IdList*}
7464adee20fSdanielk1977 %destructor idxlist_opt {sqlite3IdListDelete($$);}
747348784efSdrh %type idxitem {Token}
748348784efSdrh 
749c2eef3b3Sdrh idxlist_opt(A) ::= .                         {A = 0;}
750c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
7514adee20fSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y).  {A = sqlite3IdListAppend(X,&Y);}
7524adee20fSdanielk1977 idxlist(A) ::= idxitem(Y).                   {A = sqlite3IdListAppend(0,&Y);}
75386e5cc05Sdrh idxitem(A) ::= nm(X) sortorder.              {A = X;}
754348784efSdrh 
7558aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
756382c0247Sdrh //
757382c0247Sdrh 
758d24cc427Sdrh cmd ::= DROP INDEX nm(X) dbnm(Y).   {
7594adee20fSdanielk1977   sqlite3DropIndex(pParse, sqlite3SrcListAppend(0,&X,&Y));
760d24cc427Sdrh }
761982cef7eSdrh 
762382c0247Sdrh 
7638aff1015Sdrh ///////////////////////////// The COPY command ///////////////////////////////
764382c0247Sdrh //
765d24cc427Sdrh cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y) USING DELIMITERS STRING(Z).
7664adee20fSdanielk1977     {sqlite3Copy(pParse,sqlite3SrcListAppend(0,&X,&D),&Y,&Z,R);}
767d24cc427Sdrh cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y).
7684adee20fSdanielk1977     {sqlite3Copy(pParse,sqlite3SrcListAppend(0,&X,&D),&Y,0,R);}
769dce2cbe6Sdrh 
770382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
771382c0247Sdrh //
7724adee20fSdanielk1977 cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
7734adee20fSdanielk1977 cmd ::= VACUUM nm(X).         {sqlite3Vacuum(pParse,&X);}
774f57b14a6Sdrh 
775382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
776382c0247Sdrh //
7774adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ nm(Y).         {sqlite3Pragma(pParse,&X,&Y,0);}
7784adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlite3Pragma(pParse,&X,&Y,0);}
7794adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlite3Pragma(pParse,&X,&Y,0);}
7804adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlite3Pragma(pParse,&X,&Y,1);}
7814adee20fSdanielk1977 cmd ::= PRAGMA ids(X) LP nm(Y) RP.      {sqlite3Pragma(pParse,&X,&Y,0);}
7824adee20fSdanielk1977 cmd ::= PRAGMA ids(X).                   {sqlite3Pragma(pParse,&X,&X,0);}
783f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
784f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
785f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
786f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
787f57b14a6Sdrh plus_opt ::= PLUS.
788f57b14a6Sdrh plus_opt ::= .
789c3f9bad2Sdanielk1977 
790c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
791f0f258b1Sdrh 
792f0f258b1Sdrh cmd ::= CREATE(A) trigger_decl BEGIN trigger_cmd_list(S) END(Z). {
7934b59ab5eSdrh   Token all;
7944b59ab5eSdrh   all.z = A.z;
7954b59ab5eSdrh   all.n = (Z.z - A.z) + Z.n;
7964adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
797f0f258b1Sdrh }
798f0f258b1Sdrh 
799f0f258b1Sdrh trigger_decl ::= temp(T) TRIGGER nm(B) trigger_time(C) trigger_event(D)
800f0f258b1Sdrh                  ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). {
8014adee20fSdanielk1977   SrcList *pTab = sqlite3SrcListAppend(0, &E, &DB);
8024adee20fSdanielk1977   sqlite3BeginTrigger(pParse, &B, C, D.a, D.b, pTab, F, G, T);
803c3f9bad2Sdanielk1977 }
804c3f9bad2Sdanielk1977 
805c3f9bad2Sdanielk1977 %type trigger_time  {int}
806c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
807c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
808c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
809c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
810c3f9bad2Sdanielk1977 
811ad3cab52Sdrh %type trigger_event {struct TrigEvent}
8124adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);}
813c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
814c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
815c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
816c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
817c3f9bad2Sdanielk1977 
818c3f9bad2Sdanielk1977 %type foreach_clause {int}
819c3f9bad2Sdanielk1977 foreach_clause(A) ::= .                   { A = TK_ROW; }
820c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
821c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
822c3f9bad2Sdanielk1977 
823c3f9bad2Sdanielk1977 %type when_clause {Expr *}
824c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
825c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; }
826c3f9bad2Sdanielk1977 
827c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *}
8284adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}
829c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
830a69d9168Sdrh   X->pNext = Y;
831a69d9168Sdrh   A = X;
832a69d9168Sdrh }
833c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; }
834c3f9bad2Sdanielk1977 
835c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *}
8364adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);}
837c3f9bad2Sdanielk1977 // UPDATE
8385ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).
8394adee20fSdanielk1977                { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); }
840c3f9bad2Sdanielk1977 
841c3f9bad2Sdanielk1977 // INSERT
8423054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F)
843c3f9bad2Sdanielk1977   VALUES LP itemlist(Y) RP.
8444adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);}
845c3f9bad2Sdanielk1977 
8463054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
8474adee20fSdanielk1977                {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);}
848c3f9bad2Sdanielk1977 
849c3f9bad2Sdanielk1977 // DELETE
8505ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
8514adee20fSdanielk1977                {A = sqlite3TriggerDeleteStep(&X, Y);}
852c3f9bad2Sdanielk1977 
853c3f9bad2Sdanielk1977 // SELECT
8544adee20fSdanielk1977 trigger_cmd(A) ::= select(X).  {A = sqlite3TriggerSelectStep(X); }
855c3f9bad2Sdanielk1977 
8566f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
8574b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
8584adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, 0);
8594b59ab5eSdrh   A->iColumn = OE_Ignore;
8604adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8614b59ab5eSdrh }
8624b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y).  {
8634adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8644b59ab5eSdrh   A->iColumn = OE_Rollback;
8654adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8664b59ab5eSdrh }
8674b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y).  {
8684adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8694b59ab5eSdrh   A->iColumn = OE_Abort;
8704adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8714b59ab5eSdrh }
8724b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y).  {
8734adee20fSdanielk1977   A = sqlite3Expr(TK_RAISE, 0, 0, &Z);
8744b59ab5eSdrh   A->iColumn = OE_Fail;
8754adee20fSdanielk1977   sqlite3ExprSpan(A, &X, &Y);
8764b59ab5eSdrh }
8776f34903eSdanielk1977 
878c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
879d24cc427Sdrh cmd ::= DROP TRIGGER nm(X) dbnm(D). {
8804adee20fSdanielk1977   sqlite3DropTrigger(pParse,sqlite3SrcListAppend(0,&X,&D));
881c3f9bad2Sdanielk1977 }
882113088ecSdrh 
883113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
8844d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). {
8854adee20fSdanielk1977   sqlite3Attach(pParse, &F, &D, &K);
8861c2d8414Sdrh }
8874d189ca4Sdrh %type key_opt {Token}
8884d189ca4Sdrh key_opt(A) ::= USING ids(X).  { A = X; }
8894d189ca4Sdrh key_opt(A) ::= .              { A.z = 0; A.n = 0; }
890113088ecSdrh 
891113088ecSdrh database_kw_opt ::= DATABASE.
892113088ecSdrh database_kw_opt ::= .
893113088ecSdrh 
894113088ecSdrh //////////////////////// DETACH DATABASE name /////////////////////////////////
8951c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). {
8964adee20fSdanielk1977   sqlite3Detach(pParse, &D);
8971c2d8414Sdrh }
898