xref: /sqlite-3.40.0/src/parse.y (revision abfd35ea)
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 */
17487e262fSdrh 
18487e262fSdrh // All token codes are small integers with #defines that begin with "TK_"
19348784efSdrh %token_prefix TK_
20487e262fSdrh 
21487e262fSdrh // The type of the data attached to each token is Token.  This is also the
22487e262fSdrh // default type for non-terminals.
23487e262fSdrh //
24348784efSdrh %token_type {Token}
25f57b14a6Sdrh %default_type {Token}
26487e262fSdrh 
27487e262fSdrh // The generated parser function takes a 4th argument as follows:
28348784efSdrh %extra_argument {Parse *pParse}
29487e262fSdrh 
30487e262fSdrh // This code runs whenever there is a syntax error
31487e262fSdrh //
32348784efSdrh %syntax_error {
33128255fcSdrh   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
3455176259Sdrh   assert( TOKEN.z[0] );  /* The tokenizer always gives us a token */
354adee20fSdanielk1977   sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
36b86ccfb2Sdrh }
378fc3345fSdrh %stack_overflow {
388fc3345fSdrh   sqlite3ErrorMsg(pParse, "parser stack overflow");
398fc3345fSdrh }
40487e262fSdrh 
41487e262fSdrh // The name of the generated procedure that implements the parser
42487e262fSdrh // is as follows:
434adee20fSdanielk1977 %name sqlite3Parser
44487e262fSdrh 
45487e262fSdrh // The following text is included near the beginning of the C source
46487e262fSdrh // code file that implements the parser.
47487e262fSdrh //
48348784efSdrh %include {
49348784efSdrh #include "sqliteInt.h"
509bbca4c1Sdrh 
519bbca4c1Sdrh /*
52d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down
53d3ec02d3Sdrh ** automaton.
54d3ec02d3Sdrh */
55d3ec02d3Sdrh #define YYNOERRORRECOVERY 1
56d3ec02d3Sdrh 
57d3ec02d3Sdrh /*
588a415d37Sdrh ** Make yytestcase() the same as testcase()
598a415d37Sdrh */
608a415d37Sdrh #define yytestcase(X) testcase(X)
618a415d37Sdrh 
628a415d37Sdrh /*
6382415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null
6482415f2dSdrh ** pointer.
6582415f2dSdrh */
66644f4c1bSdrh #define YYPARSEFREENEVERNULL 1
6782415f2dSdrh 
6882415f2dSdrh /*
6982415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed
7082415f2dSdrh ** into sqlite3ParserAlloc().  The default is size_t.
7182415f2dSdrh */
7282415f2dSdrh #define YYMALLOCARGTYPE  u64
7382415f2dSdrh 
7482415f2dSdrh /*
75ad3cab52Sdrh ** An instance of this structure holds information about the
76ad3cab52Sdrh ** LIMIT clause of a SELECT statement.
779bbca4c1Sdrh */
78ad3cab52Sdrh struct LimitVal {
79a2dc3b1aSdanielk1977   Expr *pLimit;    /* The LIMIT expression.  NULL if there is no limit */
80a2dc3b1aSdanielk1977   Expr *pOffset;   /* The OFFSET expression.  NULL if there is none */
81ad3cab52Sdrh };
82c3f9bad2Sdanielk1977 
83c3f9bad2Sdanielk1977 /*
84ad3cab52Sdrh ** An instance of the following structure describes the event of a
85ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
86ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
87ad3cab52Sdrh **
88ad3cab52Sdrh **      UPDATE ON (a,b,c)
89ad3cab52Sdrh **
90ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
91c3f9bad2Sdanielk1977 */
92ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
93caec2f12Sdrh 
9425d6543dSdrh /*
954a642b60Sdrh ** Disable lookaside memory allocation for objects that might be
964a642b60Sdrh ** shared across database connections.
974a642b60Sdrh */
984a642b60Sdrh static void disableLookaside(Parse *pParse){
994a642b60Sdrh   pParse->disableLookaside++;
1004a642b60Sdrh   pParse->db->lookaside.bDisable++;
1014a642b60Sdrh }
1024a642b60Sdrh 
103caec2f12Sdrh } // end %include
104348784efSdrh 
105826fb5a3Sdrh // Input is a single SQL command
106c4a3c779Sdrh input ::= cmdlist.
107094b2bbfSdrh cmdlist ::= cmdlist ecmd.
108826fb5a3Sdrh cmdlist ::= ecmd.
109b7f9164eSdrh ecmd ::= SEMI.
110b7f9164eSdrh ecmd ::= explain cmdx SEMI.
1118549d55eSdrh explain ::= .
112b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
1138549d55eSdrh explain ::= EXPLAIN.              { pParse->explain = 1; }
1148549d55eSdrh explain ::= EXPLAIN QUERY PLAN.   { pParse->explain = 2; }
115154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
116200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
117348784efSdrh 
118382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
119c4a3c779Sdrh //
120fa86c412Sdrh 
121684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
122c4a3c779Sdrh trans_opt ::= .
123c4a3c779Sdrh trans_opt ::= TRANSACTION.
1245ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
125684917c2Sdrh %type transtype {int}
126684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
127cf82f0d3Sdrh transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
128cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
129cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
1304adee20fSdanielk1977 cmd ::= COMMIT trans_opt.      {sqlite3CommitTransaction(pParse);}
1314adee20fSdanielk1977 cmd ::= END trans_opt.         {sqlite3CommitTransaction(pParse);}
1324adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt.    {sqlite3RollbackTransaction(pParse);}
133c4a3c779Sdrh 
134fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
135fd7f0452Sdanielk1977 savepoint_opt ::= .
136fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
137fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
138fd7f0452Sdanielk1977 }
139fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
140fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
141fd7f0452Sdanielk1977 }
142fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
143fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
144fd7f0452Sdanielk1977 }
145fd7f0452Sdanielk1977 
146382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
147348784efSdrh //
148348784efSdrh cmd ::= create_table create_table_args.
149d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
150f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
151969fa7c1Sdrh }
152dabd04c6Sdrh createkw(A) ::= CREATE(A).  {disableLookaside(pParse);}
153dabd04c6Sdrh 
154faa59554Sdrh %type ifnotexists {int}
155faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
156faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
157f57b3399Sdrh %type temp {int}
15853c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
159d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
160154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
161d24cc427Sdrh temp(A) ::= .      {A = 0;}
1625969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
1635969da4aSdrh   sqlite3EndTable(pParse,&X,&E,F,0);
164969fa7c1Sdrh }
165969fa7c1Sdrh create_table_args ::= AS select(S). {
1665969da4aSdrh   sqlite3EndTable(pParse,0,0,0,S);
167633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
168969fa7c1Sdrh }
1693334d089Sdrh %type table_options {int}
1705969da4aSdrh table_options(A) ::= .    {A = 0;}
1715969da4aSdrh table_options(A) ::= WITHOUT nm(X). {
1725969da4aSdrh   if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
173fccda8a1Sdrh     A = TF_WithoutRowid | TF_NoVisibleRowid;
1745969da4aSdrh   }else{
1755969da4aSdrh     A = 0;
1765969da4aSdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
1775969da4aSdrh   }
1785969da4aSdrh }
179986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist.
180986dde70Sdrh columnlist ::= columnname carglist.
1812881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);}
182c4a3c779Sdrh 
183f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
1842d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
1852d3917daSdrh // causes them to be assigned integer values that are close together,
1862d3917daSdrh // which keeps parser tables smaller.
1872d3917daSdrh //
188f2bc013cSdrh // The token values assigned to these symbols is determined by the order
189f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
190f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
191f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
192f2bc013cSdrh // constraint.
193f2bc013cSdrh //
1942d3917daSdrh %left OR.
1952d3917daSdrh %left AND.
1962d3917daSdrh %right NOT.
19703bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
1989a43267bSdrh %left GT LE LT GE.
1997c6303c0Sdanielk1977 %right ESCAPE.
2002d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2012d3917daSdrh %left PLUS MINUS.
2022d3917daSdrh %left STAR SLASH REM.
203a34001c9Sdrh %left CONCAT.
204a34001c9Sdrh %left COLLATE.
2057ba5bc5bSdrh %right BITNOT.
2062d3917daSdrh 
2077cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2087cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2097cc84c2cSdrh //
2107cc84c2cSdrh %token_class id  ID|INDEXED.
2117cc84c2cSdrh 
2127cc84c2cSdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
2137cc84c2cSdrh // fallback to ID if they will not parse as their original value.
2147cc84c2cSdrh // This obviates the need for the "id" nonterminal.
2157cc84c2cSdrh //
2167cc84c2cSdrh %fallback ID
2177cc84c2cSdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2187cc84c2cSdrh   CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
2197cc84c2cSdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
2207cc84c2cSdrh   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW
2217cc84c2cSdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
2227cc84c2cSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
2237cc84c2cSdrh   EXCEPT INTERSECT UNION
2247cc84c2cSdrh %endif SQLITE_OMIT_COMPOUND_SELECT
2257cc84c2cSdrh   REINDEX RENAME CTIME_KW IF
2267cc84c2cSdrh   .
2277cc84c2cSdrh %wildcard ANY.
2287cc84c2cSdrh 
2297cc84c2cSdrh 
230c4a3c779Sdrh // And "ids" is an identifer-or-string.
231c4a3c779Sdrh //
232f59b12fbSdrh %token_class ids  ID|STRING.
233c4a3c779Sdrh 
2345ad1a6c8Sdrh // The name of a column or table can be any of the following:
2355ad1a6c8Sdrh //
2365ad1a6c8Sdrh %type nm {Token}
2374dd0d3f8Sdrh nm(A) ::= id(A).
2384dd0d3f8Sdrh nm(A) ::= STRING(A).
2394dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
2405ad1a6c8Sdrh 
241986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
242487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
243487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
244487e262fSdrh //
245487e262fSdrh %type typetoken {Token}
246986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
2474dd0d3f8Sdrh typetoken(A) ::= typename(A).
2484dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
2494dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
250487e262fSdrh }
2514dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
2524dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
253487e262fSdrh }
254382c0247Sdrh %type typename {Token}
2554dd0d3f8Sdrh typename(A) ::= ids(A).
2564dd0d3f8Sdrh typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
25760218d2aSdrh signed ::= plus_num.
25860218d2aSdrh signed ::= minus_num.
259487e262fSdrh 
260487e262fSdrh // "carglist" is a list of additional constraints that come after the
261487e262fSdrh // column name and column type in a CREATE TABLE statement.
262487e262fSdrh //
2634dc330ddSdrh carglist ::= carglist ccons.
264348784efSdrh carglist ::= .
2654dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
266b7916a78Sdrh ccons ::= DEFAULT term(X).            {sqlite3AddDefaultValue(pParse,&X);}
267b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP.      {sqlite3AddDefaultValue(pParse,&X);}
268b7916a78Sdrh ccons ::= DEFAULT PLUS term(X).       {sqlite3AddDefaultValue(pParse,&X);}
269f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X).      {
270b7916a78Sdrh   ExprSpan v;
271*abfd35eaSdrh   v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0);
272b7916a78Sdrh   v.zStart = A.z;
273b7916a78Sdrh   v.zEnd = X.zEnd;
274b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2757977a17fSdanielk1977 }
2762b7acc35Sdrh ccons ::= DEFAULT id(X).              {
277b7916a78Sdrh   ExprSpan v;
27843303de9Sdrh   spanExpr(&v, pParse, TK_STRING, X);
279b7916a78Sdrh   sqlite3AddDefaultValue(pParse,&v);
2807977a17fSdanielk1977 }
281348784efSdrh 
282382c0247Sdrh // In addition to the type name, we also care about the primary key and
283382c0247Sdrh // UNIQUE constraints.
284348784efSdrh //
2850d316a40Sdrh ccons ::= NULL onconf.
2864adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
287fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
288fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
28962340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
29062340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
291b7916a78Sdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X.pExpr);}
292108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
2934adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
2944adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
29539002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
29604738cb9Sdrh 
297205f48e6Sdrh // The optional AUTOINCREMENT keyword
298205f48e6Sdrh %type autoinc {int}
299205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3002958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
301205f48e6Sdrh 
302c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
303c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
304c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
305c2eef3b3Sdrh // check fails.
30604738cb9Sdrh //
307c2eef3b3Sdrh %type refargs {int}
308fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3094dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
310c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
311c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
312c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
313c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
314c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
315c2eef3b3Sdrh %type refact {int}
316fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
317fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
318fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
319fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
320fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
321c2eef3b3Sdrh %type defer_subclause {int}
3221da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
323c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
324c2eef3b3Sdrh %type init_deferred_pred_opt {int}
325c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
326c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
327c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
328348784efSdrh 
32919a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3304dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
331ab35eaedSdrh conslist ::= conslist tconscomma tcons.
332ab35eaedSdrh conslist ::= tcons.
333ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
334ab35eaedSdrh tconscomma ::= .
335ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
336108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
337fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
338108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
33962340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
34062340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
341b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
342b7916a78Sdrh                                  {sqlite3AddCheckConstraint(pParse,E.pExpr);}
343108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
344108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3454adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3464adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
347c2eef3b3Sdrh }
348c2eef3b3Sdrh %type defer_subclause_opt {int}
349c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
3504dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
3519cfcf5d4Sdrh 
3529cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3539cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3549cfcf5d4Sdrh //
3559cfcf5d4Sdrh %type onconf {int}
3563334d089Sdrh %type orconf {int}
3571c92853dSdrh %type resolvetype {int}
3581c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
3591c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
3601c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
3613334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
3624dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
3631c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
3641c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
365348784efSdrh 
366382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
367348784efSdrh //
368a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
369a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
370a8858103Sdanielk1977 }
371a073384fSdrh %type ifexists {int}
372a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
373a073384fSdrh ifexists(A) ::= .            {A = 0;}
374348784efSdrh 
375a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
376a76b5dfcSdrh //
377b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
378108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
3798981b904Sdrh           AS select(S). {
3808981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
381a76b5dfcSdrh }
382a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
383a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
384a76b5dfcSdrh }
385154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
386a76b5dfcSdrh 
387382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
388348784efSdrh //
3897d562dbeSdan cmd ::= select(X).  {
390edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
3917d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
392633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
3939bb61fe7Sdrh }
394efb7251dSdrh 
3959bb61fe7Sdrh %type select {Select*}
396633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
3977d562dbeSdan %type selectnowith {Select*}
3987d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
39982c3d636Sdrh %type oneselect {Select*}
400633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4019bb61fe7Sdrh 
402772460fdSdrh %include {
403772460fdSdrh   /*
404772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
405772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
406772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
407772460fdSdrh   */
408e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
409d227a291Sdrh     if( p->pPrior ){
410772460fdSdrh       Select *pNext = 0, *pLoop;
411772460fdSdrh       int mxSelect, cnt = 0;
412d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
413d227a291Sdrh         pLoop->pNext = pNext;
414d227a291Sdrh         pLoop->selFlags |= SF_Compound;
415d227a291Sdrh       }
416772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
417772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
418772460fdSdrh         cnt>mxSelect
419a0c01768Sdrh       ){
420d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
421d227a291Sdrh       }
422d227a291Sdrh     }
423772460fdSdrh   }
424772460fdSdrh }
425772460fdSdrh 
426772460fdSdrh select(A) ::= with(W) selectnowith(X). {
427772460fdSdrh   Select *p = X;
428772460fdSdrh   if( p ){
429772460fdSdrh     p->pWith = W;
430772460fdSdrh     parserDoubleLinkSelect(pParse, p);
431a9f5c13dSdan   }else{
432a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
433a9f5c13dSdan   }
434cf82f0d3Sdrh   A = p; /*A-overwrites-W*/
435a9f5c13dSdan }
4367d562dbeSdan 
4374dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
438b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
4394dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
440c0bf493eSdrh   Select *pRhs = Z;
4414dd0d3f8Sdrh   Select *pLhs = A;
442c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
443c0bf493eSdrh     SrcList *pFrom;
444c0bf493eSdrh     Token x;
445c0bf493eSdrh     x.n = 0;
446772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
447c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
448c0bf493eSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0);
449c0bf493eSdrh   }
450c0bf493eSdrh   if( pRhs ){
451c0bf493eSdrh     pRhs->op = (u8)Y;
45200d5ab74Sdrh     pRhs->pPrior = pLhs;
45300d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
454772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
455d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
45643b78826Sdrh   }else{
45700d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
458daffd0e5Sdrh   }
459c0bf493eSdrh   A = pRhs;
46082c3d636Sdrh }
4610a36c57eSdrh %type multiselect_op {int}
462cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
4630a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
464cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
465154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
466abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
4679bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
46843303de9Sdrh #if SELECTTRACE_ENABLED
46943303de9Sdrh   Token s = S; /*A-overwrites-S*/
47043303de9Sdrh #endif
47117435752Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
472abd4c723Sdrh #if SELECTTRACE_ENABLED
473eb9b884cSdrh   /* Populate the Select.zSelName[] string that is used to help with
474abd4c723Sdrh   ** query planner debugging, to differentiate between multiple Select
475abd4c723Sdrh   ** objects in a complex query.
476abd4c723Sdrh   **
477abd4c723Sdrh   ** If the SELECT keyword is immediately followed by a C-style comment
478abd4c723Sdrh   ** then extract the first few alphanumeric characters from within that
479eb9b884cSdrh   ** comment to be the zSelName value.  Otherwise, the label is #N where
480abd4c723Sdrh   ** is an integer that is incremented with each SELECT statement seen.
481abd4c723Sdrh   */
482abd4c723Sdrh   if( A!=0 ){
48343303de9Sdrh     const char *z = s.z+6;
484abd4c723Sdrh     int i;
485eb9b884cSdrh     sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d",
486abd4c723Sdrh                      ++pParse->nSelect);
487abd4c723Sdrh     while( z[0]==' ' ) z++;
488abd4c723Sdrh     if( z[0]=='/' && z[1]=='*' ){
489abd4c723Sdrh       z += 2;
490abd4c723Sdrh       while( z[0]==' ' ) z++;
491abd4c723Sdrh       for(i=0; sqlite3Isalnum(z[i]); i++){}
492eb9b884cSdrh       sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
493abd4c723Sdrh     }
494abd4c723Sdrh   }
495abd4c723Sdrh #endif /* SELECTRACE_ENABLED */
4969bb61fe7Sdrh }
4974dd0d3f8Sdrh oneselect(A) ::= values(A).
49875593d96Sdrh 
49975593d96Sdrh %type values {Select*}
50075593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
50175593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
50275593d96Sdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0,0);
50375593d96Sdrh }
5044dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. {
5054dd0d3f8Sdrh   Select *pRight, *pLeft = A;
506772460fdSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0,0);
507f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
50875593d96Sdrh   if( pRight ){
50975593d96Sdrh     pRight->op = TK_ALL;
510772460fdSdrh     pRight->pPrior = pLeft;
51175593d96Sdrh     A = pRight;
51275593d96Sdrh   }else{
513772460fdSdrh     A = pLeft;
51475593d96Sdrh   }
51575593d96Sdrh }
5169bb61fe7Sdrh 
5179bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5189bb61fe7Sdrh // present and false (0) if it is not.
5199bb61fe7Sdrh //
5203334d089Sdrh %type distinct {int}
521832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5227cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
523efb7251dSdrh distinct(A) ::= .           {A = 0;}
524348784efSdrh 
5259bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5267c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5277c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5281a1d3cd2Sdrh // opcode of TK_ASTERISK.
5299bb61fe7Sdrh //
530348784efSdrh %type selcollist {ExprList*}
531633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
532348784efSdrh %type sclp {ExprList*}
533633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
5344dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
535348784efSdrh sclp(A) ::= .                                {A = 0;}
5364dd0d3f8Sdrh selcollist(A) ::= sclp(A) expr(X) as(Y).     {
5374dd0d3f8Sdrh    A = sqlite3ExprListAppend(pParse, A, X.pExpr);
538b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
539b7916a78Sdrh    sqlite3ExprListSetSpan(pParse,A,&X);
54001f3f253Sdrh }
5414dd0d3f8Sdrh selcollist(A) ::= sclp(A) STAR. {
5421a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
5434dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
5447c917d19Sdrh }
5450cd874bdSdrh selcollist(A) ::= sclp(A) nm(X) DOT STAR. {
546*abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
547*abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
548*abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
5494dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
55054473229Sdrh }
55101f3f253Sdrh 
55201f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
55301f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
55401f3f253Sdrh //
55501f3f253Sdrh %type as {Token}
5565ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
5574dd0d3f8Sdrh as(X) ::= ids(X).
558986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
5599bb61fe7Sdrh 
560348784efSdrh 
561ad3cab52Sdrh %type seltablist {SrcList*}
562633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
563ad3cab52Sdrh %type stl_prefix {SrcList*}
564633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
565ad3cab52Sdrh %type from {SrcList*}
566633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
567348784efSdrh 
56801f3f253Sdrh // A complete FROM clause.
56901f3f253Sdrh //
57017435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
57161dfc31dSdrh from(A) ::= FROM seltablist(X). {
57261dfc31dSdrh   A = X;
57361dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
57461dfc31dSdrh }
57501f3f253Sdrh 
57601f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
57701f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
57801f3f253Sdrh //
5794dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
5808a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
58101f3f253Sdrh }
582348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
5834dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
584e9240418Sdrh                   on_opt(N) using_opt(U). {
5854dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
586b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
58701f3f253Sdrh }
5884dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
58901d230ceSdrh                   on_opt(N) using_opt(U). {
5904dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
59101d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
59201d230ceSdrh }
59351522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
5944dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
595b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
5964dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
59722f70c32Sdrh   }
5984dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
599fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6004dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
601fbdc7f69Sdrh       A = F;
602832ee3d4Sdrh     }else if( F->nSrc==1 ){
6034dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
604832ee3d4Sdrh       if( A ){
605832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
606832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
607832ee3d4Sdrh         pNew->zName = pOld->zName;
608832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6093c449c6bSdrh         pNew->pSelect = pOld->pSelect;
610832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6113c449c6bSdrh         pOld->pSelect = 0;
612832ee3d4Sdrh       }
613832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
614fbdc7f69Sdrh     }else{
615fbdc7f69Sdrh       Select *pSubquery;
616fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
617832ee3d4Sdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0,0);
6184dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
619fbdc7f69Sdrh     }
620fbdc7f69Sdrh   }
621154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
622b733d037Sdrh 
623113088ecSdrh %type dbnm {Token}
624113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
625113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
626113088ecSdrh 
62774ad7fe9Sdrh %type fullname {SrcList*}
628633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
629cf82f0d3Sdrh fullname(A) ::= nm(X) dbnm(Y).
630cf82f0d3Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
63174ad7fe9Sdrh 
63201f3f253Sdrh %type joinop {int}
633fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
634cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
635cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
636cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
637cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
6385ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
639cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
64001f3f253Sdrh 
64101f3f253Sdrh %type on_opt {Expr*}
642633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
643b7916a78Sdrh on_opt(N) ::= ON expr(E).   {N = E.pExpr;}
64401f3f253Sdrh on_opt(N) ::= .             {N = 0;}
64501f3f253Sdrh 
64685574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
64785574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
64885574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
64985574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
65085574e31Sdanielk1977 // in the token.
65185574e31Sdanielk1977 //
65285574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
653b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
65485574e31Sdanielk1977 // recognizes and interprets this as a special case.
65585574e31Sdanielk1977 //
65685574e31Sdanielk1977 %type indexed_opt {Token}
65785574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
65885574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
65985574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
66085574e31Sdanielk1977 
66101f3f253Sdrh %type using_opt {IdList*}
662633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
66381eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
66401f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
66501f3f253Sdrh 
66601f3f253Sdrh 
667348784efSdrh %type orderby_opt {ExprList*}
668633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
669108aa00aSdrh 
670108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
671108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
672108aa00aSdrh // sort order.
673108aa00aSdrh //
674348784efSdrh %type sortlist {ExprList*}
675633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
676348784efSdrh 
677348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
678348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
6794dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). {
6804dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A,Y.pExpr);
681bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
682348784efSdrh }
6838395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
684cf82f0d3Sdrh   A = sqlite3ExprListAppend(pParse,0,Y.pExpr); /*A-overwrites-Y*/
685bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
686348784efSdrh }
687348784efSdrh 
688348784efSdrh %type sortorder {int}
689348784efSdrh 
6908e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
6918e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
692bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
693348784efSdrh 
6942282792aSdrh %type groupby_opt {ExprList*}
695633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
6962282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
6979245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
6982282792aSdrh 
6992282792aSdrh %type having_opt {Expr*}
700633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
7012282792aSdrh having_opt(A) ::= .                {A = 0;}
702b7916a78Sdrh having_opt(A) ::= HAVING expr(X).  {A = X.pExpr;}
7032282792aSdrh 
704ad3cab52Sdrh %type limit_opt {struct LimitVal}
70515926590Sdrh 
70615926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
70715926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
70815926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
70915926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
71015926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
71115926590Sdrh // except as a transient.  So there is never anything to destroy.
71215926590Sdrh //
71315926590Sdrh //%destructor limit_opt {
714633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pLimit);
715633e6d57Sdrh //  sqlite3ExprDelete(pParse->db, $$.pOffset);
71615926590Sdrh //}
717a2dc3b1aSdanielk1977 limit_opt(A) ::= .                    {A.pLimit = 0; A.pOffset = 0;}
718b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X).       {A.pLimit = X.pExpr; A.pOffset = 0;}
719a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
720b7916a78Sdrh                                       {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;}
721a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
722b7916a78Sdrh                                       {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
7239bbca4c1Sdrh 
724382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
725382c0247Sdrh //
726273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7274e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
728931577f1Sdrh         orderby_opt(O) limit_opt(L). {
729b290f117Sdan   sqlite3WithPush(pParse, C, 1);
730b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
73149ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
7324281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
7334281bd42Sshane }
7344281bd42Sshane %endif
735273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7364e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
737b290f117Sdan   sqlite3WithPush(pParse, C, 1);
7384281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
7394281bd42Sshane   sqlite3DeleteFrom(pParse,X,W);
7404281bd42Sshane }
7414281bd42Sshane %endif
742348784efSdrh 
743348784efSdrh %type where_opt {Expr*}
744633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
745348784efSdrh 
746348784efSdrh where_opt(A) ::= .                    {A = 0;}
747b7916a78Sdrh where_opt(A) ::= WHERE expr(X).       {A = X.pExpr;}
748348784efSdrh 
749382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
750382c0247Sdrh //
751273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
752bfe31e7fSdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
7538b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
754b290f117Sdan   sqlite3WithPush(pParse, C, 1);
755b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
756b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
75749ffdbf4Sshane   W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
7584281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
7594281bd42Sshane }
7604281bd42Sshane %endif
761273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7624e9119d9Sdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
763e9240418Sdrh         where_opt(W).  {
764b290f117Sdan   sqlite3WithPush(pParse, C, 1);
7654281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
7664281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
7674281bd42Sshane   sqlite3Update(pParse,X,Y,W,R);
7684281bd42Sshane }
7694281bd42Sshane %endif
770348784efSdrh 
771f8db1bc0Sdrh %type setlist {ExprList*}
772633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
773f8db1bc0Sdrh 
7744dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
7754dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, Y.pExpr);
776b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
777b7916a78Sdrh }
778a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
779a1251bc4Sdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y.pExpr);
780a1251bc4Sdrh }
781b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
782b7916a78Sdrh   A = sqlite3ExprListAppend(pParse, 0, Y.pExpr);
783b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
784b7916a78Sdrh }
785a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
786a1251bc4Sdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y.pExpr);
787a1251bc4Sdrh }
788348784efSdrh 
789382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
790382c0247Sdrh //
7918981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). {
792b290f117Sdan   sqlite3WithPush(pParse, W, 1);
7934e9119d9Sdan   sqlite3Insert(pParse, X, S, F, R);
7944e9119d9Sdan }
7958981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
7964e9119d9Sdan {
797b290f117Sdan   sqlite3WithPush(pParse, W, 1);
7984e9119d9Sdan   sqlite3Insert(pParse, X, 0, F, R);
7994e9119d9Sdan }
800348784efSdrh 
8013334d089Sdrh %type insert_cmd {int}
802fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
803fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
804fa86c412Sdrh 
8058981b904Sdrh %type idlist_opt {IdList*}
8068981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
80781eba73eSdrh %type idlist {IdList*}
80881eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
809348784efSdrh 
8108981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
8118981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
8124dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
8134dd0d3f8Sdrh     {A = sqlite3IdListAppend(pParse->db,A,&Y);}
81481eba73eSdrh idlist(A) ::= nm(Y).
815cf82f0d3Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/}
816348784efSdrh 
817382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
818382c0247Sdrh //
819348784efSdrh 
820b7916a78Sdrh %type expr {ExprSpan}
821b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);}
822b7916a78Sdrh %type term {ExprSpan}
823b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);}
824b7916a78Sdrh 
825b7916a78Sdrh %include {
826b7916a78Sdrh   /* This is a utility routine used to set the ExprSpan.zStart and
827b7916a78Sdrh   ** ExprSpan.zEnd values of pOut so that the span covers the complete
828b7916a78Sdrh   ** range of text beginning with pStart and going to the end of pEnd.
829b7916a78Sdrh   */
830b7916a78Sdrh   static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
831b7916a78Sdrh     pOut->zStart = pStart->z;
832b7916a78Sdrh     pOut->zEnd = &pEnd->z[pEnd->n];
833b7916a78Sdrh   }
834b7916a78Sdrh 
835b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
836b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
837b7916a78Sdrh   ** that created the expression.
838b7916a78Sdrh   */
83943303de9Sdrh   static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token t){
8400cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
8410cd874bdSdrh     if( p ){
8420cd874bdSdrh       memset(p, 0, sizeof(Expr));
8430cd874bdSdrh       p->op = (u8)op;
8440cd874bdSdrh       p->flags = EP_Leaf;
8450cd874bdSdrh       p->iAgg = -1;
8460cd874bdSdrh       p->u.zToken = (char*)&p[1];
8470cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
8480cd874bdSdrh       p->u.zToken[t.n] = 0;
8490cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
8500cd874bdSdrh         if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted;
8510cd874bdSdrh         sqlite3Dequote(p->u.zToken);
8520cd874bdSdrh       }
8530cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
8540cd874bdSdrh       p->nHeight = 1;
8550cd874bdSdrh #endif
8560cd874bdSdrh     }
8570cd874bdSdrh     pOut->pExpr = p;
85843303de9Sdrh     pOut->zStart = t.z;
85943303de9Sdrh     pOut->zEnd = &t.z[t.n];
860b7916a78Sdrh   }
861b7916a78Sdrh }
862348784efSdrh 
8634dd0d3f8Sdrh expr(A) ::= term(A).
86443303de9Sdrh expr(A) ::= LP(B) expr(X) RP(E).
86543303de9Sdrh             {spanSet(&A,&B,&E); /*A-overwrites-B*/  A.pExpr = X.pExpr;}
86643303de9Sdrh term(A) ::= NULL(X).        {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/}
86743303de9Sdrh expr(A) ::= id(X).          {spanExpr(&A,pParse,TK_ID,X); /*A-overwrites-X*/}
86843303de9Sdrh expr(A) ::= JOIN_KW(X).     {spanExpr(&A,pParse,TK_ID,X); /*A-overwrites-X*/}
8695ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
870410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
871410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
872cf82f0d3Sdrh   spanSet(&A,&X,&Y); /*A-overwrites-X*/
873*abfd35eaSdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
874e1b6a5b8Sdrh }
875d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
876410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
877410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
878410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
879*abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
880cf82f0d3Sdrh   spanSet(&A,&X,&Z); /*A-overwrites-X*/
881*abfd35eaSdrh   A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
882d24cc427Sdrh }
8830cd874bdSdrh term(A) ::= FLOAT|BLOB(X). {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/}
88443303de9Sdrh term(A) ::= STRING(X).     {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/}
8850cd874bdSdrh term(A) ::= INTEGER(X). {
8860cd874bdSdrh   A.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
8870cd874bdSdrh   A.zStart = X.z;
8880cd874bdSdrh   A.zEnd = X.z + X.n;
8890cd874bdSdrh   if( A.pExpr ) A.pExpr->flags |= EP_Leaf;
8900cd874bdSdrh }
891f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
8928679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
893de25a88cSdrh     u32 n = X.n;
8948f3b137fSdrh     spanExpr(&A, pParse, TK_VARIABLE, X);
895de25a88cSdrh     sqlite3ExprAssignVarNumber(pParse, A.pExpr, n);
8968f3b137fSdrh   }else{
897b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
898b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
899b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
9008f3b137fSdrh     Token t = X; /*A-overwrites-X*/
9018f3b137fSdrh     assert( t.n>=2 );
90243303de9Sdrh     spanSet(&A, &t, &t);
903b7916a78Sdrh     if( pParse->nested==0 ){
90443303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
905b7916a78Sdrh       A.pExpr = 0;
906b7916a78Sdrh     }else{
907*abfd35eaSdrh       A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
90843303de9Sdrh       if( A.pExpr ) sqlite3GetInt32(&t.z[1], &A.pExpr->iTable);
909b7916a78Sdrh     }
910f59b12fbSdrh   }
911895d7472Sdrh }
9124dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). {
9134dd0d3f8Sdrh   A.pExpr = sqlite3ExprAddCollateToken(pParse, A.pExpr, &C, 1);
914b7916a78Sdrh   A.zEnd = &C.z[C.n];
9158b4c40d8Sdrh }
916487e262fSdrh %ifndef SQLITE_OMIT_CAST
917487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
91843303de9Sdrh   spanSet(&A,&X,&Y); /*A-overwrites-X*/
919*abfd35eaSdrh   A.pExpr = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
920*abfd35eaSdrh   sqlite3ExprAttachSubtrees(pParse->db, A.pExpr, E.pExpr, 0);
921487e262fSdrh }
922154d4b24Sdrh %endif  SQLITE_OMIT_CAST
923f59b12fbSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). {
924994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
925e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
9264e05c83bSdrh   }
927b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, Y, &X);
928b7916a78Sdrh   spanSet(&A,&X,&E);
9297cea7f95Sdrh   if( D==SF_Distinct && A.pExpr ){
930b7916a78Sdrh     A.pExpr->flags |= EP_Distinct;
931fd357974Sdrh   }
932e1b6a5b8Sdrh }
933f59b12fbSdrh expr(A) ::= id(X) LP STAR RP(E). {
934b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
935b7916a78Sdrh   spanSet(&A,&X,&E);
936e1b6a5b8Sdrh }
937b71090fdSdrh term(A) ::= CTIME_KW(OP). {
938b7916a78Sdrh   A.pExpr = sqlite3ExprFunction(pParse, 0, &OP);
939b7916a78Sdrh   spanSet(&A, &OP, &OP);
940b7916a78Sdrh }
941b7916a78Sdrh 
942b7916a78Sdrh %include {
943b7916a78Sdrh   /* This routine constructs a binary expression node out of two ExprSpan
944b7916a78Sdrh   ** objects and uses the result to populate a new ExprSpan object.
945b7916a78Sdrh   */
946b7916a78Sdrh   static void spanBinaryExpr(
947b7916a78Sdrh     Parse *pParse,      /* The parsing context.  Errors accumulate here */
948b7916a78Sdrh     int op,             /* The binary operation */
9494dd0d3f8Sdrh     ExprSpan *pLeft,    /* The left operand, and output */
950b7916a78Sdrh     ExprSpan *pRight    /* The right operand */
951b7916a78Sdrh   ){
952*abfd35eaSdrh     pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr);
9534dd0d3f8Sdrh     pLeft->zEnd = pRight->zEnd;
954417ec638Sdrh   }
9559109b7f8Sdrh 
9569109b7f8Sdrh   /* If doNot is true, then add a TK_NOT Expr-node wrapper around the
9579109b7f8Sdrh   ** outside of *ppExpr.
9589109b7f8Sdrh   */
9594dd0d3f8Sdrh   static void exprNot(Parse *pParse, int doNot, ExprSpan *pSpan){
9604dd0d3f8Sdrh     if( doNot ){
961*abfd35eaSdrh       pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0);
9624dd0d3f8Sdrh     }
9639109b7f8Sdrh   }
964b71090fdSdrh }
965b7916a78Sdrh 
96671c57db0Sdan expr(A) ::= LP(L) nexprlist(X) COMMA expr(Y) RP(R). {
9678bd0d58eSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y.pExpr);
968*abfd35eaSdrh   A.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
96971c57db0Sdan   if( A.pExpr ){
9708bd0d58eSdrh     A.pExpr->x.pList = pList;
97171c57db0Sdan     spanSet(&A, &L, &R);
9728bd0d58eSdrh   }else{
9738bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
97471c57db0Sdan   }
97571c57db0Sdan }
97671c57db0Sdan 
9774dd0d3f8Sdrh expr(A) ::= expr(A) AND(OP) expr(Y).    {spanBinaryExpr(pParse,@OP,&A,&Y);}
9784dd0d3f8Sdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {spanBinaryExpr(pParse,@OP,&A,&Y);}
9794dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
9804dd0d3f8Sdrh                                         {spanBinaryExpr(pParse,@OP,&A,&Y);}
9814dd0d3f8Sdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {spanBinaryExpr(pParse,@OP,&A,&Y);}
9824dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
9834dd0d3f8Sdrh                                         {spanBinaryExpr(pParse,@OP,&A,&Y);}
9844dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
9854dd0d3f8Sdrh                                         {spanBinaryExpr(pParse,@OP,&A,&Y);}
9864dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
9874dd0d3f8Sdrh                                         {spanBinaryExpr(pParse,@OP,&A,&Y);}
9884dd0d3f8Sdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {spanBinaryExpr(pParse,@OP,&A,&Y);}
989410c301fSdrh %type likeop {Token}
990410c301fSdrh likeop(A) ::= LIKE_KW|MATCH(X).     {A=X;/*A-overwrites-X*/}
991410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
9924dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
9938aa34ae0Sdrh   ExprList *pList;
994410c301fSdrh   int bNot = OP.n & 0x80000000;
995410c301fSdrh   OP.n &= 0x7fffffff;
996b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
9974dd0d3f8Sdrh   pList = sqlite3ExprListAppend(pParse,pList, A.pExpr);
998410c301fSdrh   A.pExpr = sqlite3ExprFunction(pParse, pList, &OP);
999410c301fSdrh   exprNot(pParse, bNot, &A);
1000b7916a78Sdrh   A.zEnd = Y.zEnd;
1001b7916a78Sdrh   if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
10020ac65892Sdrh }
10034dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
10041dca1458Sdrh   ExprList *pList;
1005410c301fSdrh   int bNot = OP.n & 0x80000000;
1006410c301fSdrh   OP.n &= 0x7fffffff;
10071dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
10084dd0d3f8Sdrh   pList = sqlite3ExprListAppend(pParse,pList, A.pExpr);
10091dca1458Sdrh   pList = sqlite3ExprListAppend(pParse,pList, E.pExpr);
1010410c301fSdrh   A.pExpr = sqlite3ExprFunction(pParse, pList, &OP);
1011410c301fSdrh   exprNot(pParse, bNot, &A);
10121dca1458Sdrh   A.zEnd = E.zEnd;
10131dca1458Sdrh   if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
10141dca1458Sdrh }
10157c6303c0Sdanielk1977 
1016b7916a78Sdrh %include {
1017b7916a78Sdrh   /* Construct an expression node for a unary postfix operator
1018b7916a78Sdrh   */
1019b7916a78Sdrh   static void spanUnaryPostfix(
1020b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
1021b7916a78Sdrh     int op,                /* The operator */
10224dd0d3f8Sdrh     ExprSpan *pOperand,    /* The operand, and output */
1023b7916a78Sdrh     Token *pPostOp         /* The operand token for setting the span */
1024b7916a78Sdrh   ){
1025*abfd35eaSdrh     pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
10264dd0d3f8Sdrh     pOperand->zEnd = &pPostOp->z[pPostOp->n];
1027e1b6a5b8Sdrh   }
102833048c0bSdrh }
1029b7916a78Sdrh 
10304dd0d3f8Sdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {spanUnaryPostfix(pParse,@E,&A,&E);}
10314dd0d3f8Sdrh expr(A) ::= expr(A) NOT NULL(E). {spanUnaryPostfix(pParse,TK_NOTNULL,&A,&E);}
10326a2fe093Sdrh 
10336a51741dSdrh %include {
10346a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
10356a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
10366a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
10376a51741dSdrh     sqlite3 *db = pParse->db;
1038895c00e1Sdan     if( pA && pY && pY->op==TK_NULL ){
10395e17e8b7Sshaneh       pA->op = (u8)op;
10406a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
10416a51741dSdrh       pA->pRight = 0;
10426a51741dSdrh     }
10436a51741dSdrh   }
10446a51741dSdrh }
10456a51741dSdrh 
10466a2fe093Sdrh //    expr1 IS expr2
10476a2fe093Sdrh //    expr1 IS NOT expr2
10486a2fe093Sdrh //
10496a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
10506a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
10516a2fe093Sdrh //
10524dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
10534dd0d3f8Sdrh   spanBinaryExpr(pParse,TK_IS,&A,&Y);
10546a51741dSdrh   binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL);
10556a2fe093Sdrh }
10564dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
10574dd0d3f8Sdrh   spanBinaryExpr(pParse,TK_ISNOT,&A,&Y);
10586a51741dSdrh   binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL);
10596a2fe093Sdrh }
1060b7916a78Sdrh 
1061b7916a78Sdrh %include {
1062b7916a78Sdrh   /* Construct an expression node for a unary prefix operator
1063b7916a78Sdrh   */
1064b7916a78Sdrh   static void spanUnaryPrefix(
1065b7916a78Sdrh     ExprSpan *pOut,        /* Write the new expression node here */
1066b7916a78Sdrh     Parse *pParse,         /* Parsing context to record errors */
1067b7916a78Sdrh     int op,                /* The operator */
1068b7916a78Sdrh     ExprSpan *pOperand,    /* The operand */
1069b7916a78Sdrh     Token *pPreOp         /* The operand token for setting the span */
1070b7916a78Sdrh   ){
1071b7916a78Sdrh     pOut->zStart = pPreOp->z;
1072*abfd35eaSdrh     pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0);
1073b7916a78Sdrh     pOut->zEnd = pOperand->zEnd;
107433048c0bSdrh   }
107581a20f21Sdrh }
1076b7916a78Sdrh 
1077b7916a78Sdrh 
1078b7916a78Sdrh 
107943303de9Sdrh expr(A) ::= NOT(B) expr(X).
108043303de9Sdrh               {spanUnaryPrefix(&A,pParse,@B,&X,&B);/*A-overwrites-B*/}
108143303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
108243303de9Sdrh               {spanUnaryPrefix(&A,pParse,@B,&X,&B);/*A-overwrites-B*/}
10837ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT]
108443303de9Sdrh               {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);/*A-overwrites-B*/}
10857ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT]
108643303de9Sdrh               {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);/*A-overwrites-B*/}
1087b7916a78Sdrh 
10882e3a1f16Sdrh %type between_op {int}
10892e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
10902e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
10914dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
1092b7916a78Sdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr);
1093b7916a78Sdrh   pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr);
1094*abfd35eaSdrh   A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, A.pExpr, 0);
1095b7916a78Sdrh   if( A.pExpr ){
1096b7916a78Sdrh     A.pExpr->x.pList = pList;
109753f733c7Sdrh   }else{
1098633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
109953f733c7Sdrh   }
11004dd0d3f8Sdrh   exprNot(pParse, N, &A);
1101b7916a78Sdrh   A.zEnd = Y.zEnd;
1102fef5208cSdrh }
11033e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
11042e3a1f16Sdrh   %type in_op {int}
11052e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
11062e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
11074dd0d3f8Sdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP(E). [IN] {
1108094430ebSdrh     if( Y==0 ){
1109473c1bf2Sdan       /* Expressions of the form
1110473c1bf2Sdan       **
1111473c1bf2Sdan       **      expr1 IN ()
1112473c1bf2Sdan       **      expr1 NOT IN ()
1113473c1bf2Sdan       **
1114473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1115473c1bf2Sdan       ** regardless of the value of expr1.
1116473c1bf2Sdan       */
11174dd0d3f8Sdrh       sqlite3ExprDelete(pParse->db, A.pExpr);
1118*abfd35eaSdrh       A.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1);
11192b59b3a4Sdrh     }else if( Y->nExpr==1 ){
11202b59b3a4Sdrh       /* Expressions of the form:
11212b59b3a4Sdrh       **
11222b59b3a4Sdrh       **      expr1 IN (?1)
11232b59b3a4Sdrh       **      expr1 NOT IN (?2)
11242b59b3a4Sdrh       **
1125fbb24d10Sdrh       ** with exactly one value on the RHS can be simplified to something
1126fbb24d10Sdrh       ** like this:
11272b59b3a4Sdrh       **
1128fbb24d10Sdrh       **      expr1 == ?1
1129fbb24d10Sdrh       **      expr1 <> ?2
1130fbb24d10Sdrh       **
1131fbb24d10Sdrh       ** But, the RHS of the == or <> is marked with the EP_Generic flag
1132fbb24d10Sdrh       ** so that it may not contribute to the computation of comparison
1133fbb24d10Sdrh       ** affinity or the collating sequence to use for comparison.  Otherwise,
1134fbb24d10Sdrh       ** the semantics would be subtly different from IN or NOT IN.
11352b59b3a4Sdrh       */
1136fbb24d10Sdrh       Expr *pRHS = Y->a[0].pExpr;
11372b59b3a4Sdrh       Y->a[0].pExpr = 0;
11382b59b3a4Sdrh       sqlite3ExprListDelete(pParse->db, Y);
11395b1420e0Sdrh       /* pRHS cannot be NULL because a malloc error would have been detected
11405b1420e0Sdrh       ** before now and control would have never reached this point */
11415b1420e0Sdrh       if( ALWAYS(pRHS) ){
1142fbb24d10Sdrh         pRHS->flags &= ~EP_Collate;
1143fbb24d10Sdrh         pRHS->flags |= EP_Generic;
1144fbb24d10Sdrh       }
1145*abfd35eaSdrh       A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A.pExpr, pRHS);
1146094430ebSdrh     }else{
1147*abfd35eaSdrh       A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0);
1148b7916a78Sdrh       if( A.pExpr ){
1149b7916a78Sdrh         A.pExpr->x.pList = Y;
11502308ed38Sdrh         sqlite3ExprSetHeightAndFlags(pParse, A.pExpr);
1151d5d56523Sdanielk1977       }else{
1152633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1153d5d56523Sdanielk1977       }
11544dd0d3f8Sdrh       exprNot(pParse, N, &A);
1155094430ebSdrh     }
1156b7916a78Sdrh     A.zEnd = &E.z[E.n];
1157fef5208cSdrh   }
115851522cd3Sdrh   expr(A) ::= LP(B) select(X) RP(E). {
115943303de9Sdrh     spanSet(&A,&B,&E); /*A-overwrites-B*/
1160*abfd35eaSdrh     A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
116108de4f79Sdrh     sqlite3PExprAddSelect(pParse, A.pExpr, X);
116251522cd3Sdrh   }
11634dd0d3f8Sdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP(E).  [IN] {
1164*abfd35eaSdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0);
116508de4f79Sdrh     sqlite3PExprAddSelect(pParse, A.pExpr, Y);
11664dd0d3f8Sdrh     exprNot(pParse, N, &A);
1167b7916a78Sdrh     A.zEnd = &E.z[E.n];
1168fef5208cSdrh   }
11695fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
117017435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
117108de4f79Sdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
11729de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
1173*abfd35eaSdrh     A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0);
117408de4f79Sdrh     sqlite3PExprAddSelect(pParse, A.pExpr, pSelect);
11754dd0d3f8Sdrh     exprNot(pParse, N, &A);
1176b7916a78Sdrh     A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
117723b2db23Sdrh   }
117851522cd3Sdrh   expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
117943303de9Sdrh     Expr *p;
118043303de9Sdrh     spanSet(&A,&B,&E); /*A-overwrites-B*/
1181*abfd35eaSdrh     p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
118208de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
118351522cd3Sdrh   }
1184154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1185fef5208cSdrh 
118617a7f8ddSdrh /* CASE expressions */
118717a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
118843303de9Sdrh   spanSet(&A,&C,&E);  /*A-overwrites-C*/
1189*abfd35eaSdrh   A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0);
1190b7916a78Sdrh   if( A.pExpr ){
1191c5cd1249Sdrh     A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
11922308ed38Sdrh     sqlite3ExprSetHeightAndFlags(pParse, A.pExpr);
119353f733c7Sdrh   }else{
1194633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1195c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
119653f733c7Sdrh   }
119717a7f8ddSdrh }
119817a7f8ddSdrh %type case_exprlist {ExprList*}
1199633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12004dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
12014dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, Y.pExpr);
1202b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
120317a7f8ddSdrh }
120417a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
1205b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,0, Y.pExpr);
1206b7916a78Sdrh   A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
120717a7f8ddSdrh }
120817a7f8ddSdrh %type case_else {Expr*}
1209633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
1210b7916a78Sdrh case_else(A) ::=  ELSE expr(X).         {A = X.pExpr;}
121117a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
121217a7f8ddSdrh %type case_operand {Expr*}
1213633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
1214cf82f0d3Sdrh case_operand(A) ::= expr(X).            {A = X.pExpr; /*A-overwrites-X*/}
121517a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1216348784efSdrh 
1217348784efSdrh %type exprlist {ExprList*}
1218633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12199245c243Sdrh %type nexprlist {ExprList*}
1220633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1221348784efSdrh 
12224dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
12239245c243Sdrh exprlist(A) ::= .                            {A = 0;}
12244dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
12254dd0d3f8Sdrh     {A = sqlite3ExprListAppend(pParse,A,Y.pExpr);}
122617435752Sdrh nexprlist(A) ::= expr(Y).
1227cf82f0d3Sdrh     {A = sqlite3ExprListAppend(pParse,0,Y.pExpr); /*A-overwrites-Y*/}
12289245c243Sdrh 
1229a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
12305fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
12315fbab882Sdrh ** of parenthesis */
12325fbab882Sdrh %type paren_exprlist {ExprList*}
12335fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12345fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
12355fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1236a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
12375fbab882Sdrh 
1238cce7d176Sdrh 
1239382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1240382c0247Sdrh //
1241d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1242108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
124317435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
124417435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
124562340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
12469cfcf5d4Sdrh }
1247717e6402Sdrh 
1248717e6402Sdrh %type uniqueflag {int}
12499cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
12509cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1251348784efSdrh 
1252348784efSdrh 
1253108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1254108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1255108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1256108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1257108aa00aSdrh //
1258108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1259108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1260108aa00aSdrh //
1261108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1262108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1263108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1264108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1265108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1266108aa00aSdrh // historical schemas.
1267108aa00aSdrh //
1268108aa00aSdrh %type eidlist {ExprList*}
1269108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1270108aa00aSdrh %type eidlist_opt {ExprList*}
1271108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1272108aa00aSdrh 
1273108aa00aSdrh %include {
1274108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1275108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1276108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1277108aa00aSdrh   ** error while parsing a legacy schema.
1278108aa00aSdrh   */
1279108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1280108aa00aSdrh     Parse *pParse,
1281108aa00aSdrh     ExprList *pPrior,
1282108aa00aSdrh     Token *pIdToken,
1283108aa00aSdrh     int hasCollate,
1284108aa00aSdrh     int sortOrder
1285108aa00aSdrh   ){
1286108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1287108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1288108aa00aSdrh         && pParse->db->init.busy==0
1289108aa00aSdrh     ){
1290108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1291108aa00aSdrh                          pIdToken->n, pIdToken->z);
12920202b29eSdanielk1977     }
1293108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1294108aa00aSdrh     return p;
1295108aa00aSdrh   }
1296108aa00aSdrh } // end %include
1297108aa00aSdrh 
1298108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1299108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
13004dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
13014dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1302108aa00aSdrh }
1303108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1304cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
13050202b29eSdanielk1977 }
13060202b29eSdanielk1977 
1307108aa00aSdrh %type collate {int}
1308108aa00aSdrh collate(C) ::= .              {C = 0;}
1309108aa00aSdrh collate(C) ::= COLLATE ids.   {C = 1;}
1310a34001c9Sdrh 
1311348784efSdrh 
13128aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1313382c0247Sdrh //
13144d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1315982cef7eSdrh 
1316382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1317382c0247Sdrh //
1318154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1319fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
13209ef5e770Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
13219ef5e770Sdrh cmd ::= VACUUM nm(X).          {sqlite3Vacuum(pParse,&X);}
1322fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1323154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1324f57b14a6Sdrh 
1325382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1326382c0247Sdrh //
132713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
132891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1329ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1330ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1331ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1332ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1333ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1334ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1335ada2ee0dSdrh 
1336cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1337cf82f0d3Sdrh nmnum(A) ::= nm(A).
1338cf82f0d3Sdrh nmnum(A) ::= ON(A).
1339cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1340cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1341154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1342f59b12fbSdrh %token_class number INTEGER|FLOAT.
13438395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1344cf82f0d3Sdrh plus_num(A) ::= number(A).
1345f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1346c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1347f0f258b1Sdrh 
1348b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1349b7f9164eSdrh 
1350d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
13514b59ab5eSdrh   Token all;
13524b59ab5eSdrh   all.z = A.z;
1353b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
13544adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1355f0f258b1Sdrh }
1356f0f258b1Sdrh 
1357fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1358fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
135960218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
136060218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1361cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1362c3f9bad2Sdanielk1977 }
1363c3f9bad2Sdanielk1977 
1364c3f9bad2Sdanielk1977 %type trigger_time {int}
1365c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
1366c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
1367c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1368c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1369c3f9bad2Sdanielk1977 
1370ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1371633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1372cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1373cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
137481eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1375c3f9bad2Sdanielk1977 
137660218d2aSdrh foreach_clause ::= .
137760218d2aSdrh foreach_clause ::= FOR EACH ROW.
1378c3f9bad2Sdanielk1977 
1379c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1380633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1381c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
1382b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; }
1383c3f9bad2Sdanielk1977 
1384c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1385633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
13864dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
13874dd0d3f8Sdrh   assert( A!=0 );
13884dd0d3f8Sdrh   A->pLast->pNext = X;
13894dd0d3f8Sdrh   A->pLast = X;
1390a69d9168Sdrh }
13914dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
13924dd0d3f8Sdrh   assert( A!=0 );
13934dd0d3f8Sdrh   A->pLast = A;
139481238966Sdrh }
1395c3f9bad2Sdanielk1977 
1396b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1397b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1398b1819a0bSdrh // the same database as the table that the trigger fires on.
1399b1819a0bSdrh //
1400b1819a0bSdrh %type trnm {Token}
14014dd0d3f8Sdrh trnm(A) ::= nm(A).
1402b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1403b1819a0bSdrh   A = X;
1404b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1405b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1406b1819a0bSdrh         "statements within triggers");
1407b1819a0bSdrh }
1408b1819a0bSdrh 
1409b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1410b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1411b1819a0bSdrh // since it is an exception to the default grammar rules.
1412b1819a0bSdrh //
1413b1819a0bSdrh tridxby ::= .
1414b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1415b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1416b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1417b1819a0bSdrh         "within triggers");
1418b1819a0bSdrh }
1419b1819a0bSdrh tridxby ::= NOT INDEXED. {
1420b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1421b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1422b1819a0bSdrh         "within triggers");
1423b1819a0bSdrh }
1424b1819a0bSdrh 
1425b1819a0bSdrh 
1426b1819a0bSdrh 
1427c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1428633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1429c3f9bad2Sdanielk1977 // UPDATE
1430b1819a0bSdrh trigger_cmd(A) ::=
1431b1819a0bSdrh    UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z).
143217435752Sdrh    {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R);}
1433c3f9bad2Sdanielk1977 
1434c3f9bad2Sdanielk1977 // INSERT
14358981b904Sdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) idlist_opt(F) select(S).
143643303de9Sdrh    {A = sqlite3TriggerInsertStep(pParse->db, &X, F, S, R);/*A-overwrites-R*/}
1437c3f9bad2Sdanielk1977 
1438c3f9bad2Sdanielk1977 // DELETE
1439b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y).
144017435752Sdrh    {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
1441c3f9bad2Sdanielk1977 
1442c3f9bad2Sdanielk1977 // SELECT
1443cf82f0d3Sdrh trigger_cmd(A) ::= select(X).
1444cf82f0d3Sdrh    {A = sqlite3TriggerSelectStep(pParse->db, X); /*A-overwrites-X*/}
1445c3f9bad2Sdanielk1977 
14466f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
14474b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
1448cf82f0d3Sdrh   spanSet(&A,&X,&Y);  /*A-overwrites-X*/
1449*abfd35eaSdrh   A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
1450b7916a78Sdrh   if( A.pExpr ){
1451b7916a78Sdrh     A.pExpr->affinity = OE_Ignore;
14524b59ab5eSdrh   }
14538aa34ae0Sdrh }
145474ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y).  {
1455cf82f0d3Sdrh   spanSet(&A,&X,&Y);  /*A-overwrites-X*/
1456*abfd35eaSdrh   A.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
1457b7916a78Sdrh   if( A.pExpr ) {
1458b7916a78Sdrh     A.pExpr->affinity = (char)T;
14594b59ab5eSdrh   }
14608aa34ae0Sdrh }
1461154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1462b7f9164eSdrh 
146374ad7fe9Sdrh %type raisetype {int}
146474ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
146574ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
146674ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
146774ad7fe9Sdrh 
14686f34903eSdanielk1977 
1469c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1470b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1471fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1472fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1473c3f9bad2Sdanielk1977 }
1474154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1475113088ecSdrh 
1476113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1477fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1478f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
1479b7916a78Sdrh   sqlite3Attach(pParse, F.pExpr, D.pExpr, K);
14801c2d8414Sdrh }
1481fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
1482b7916a78Sdrh   sqlite3Detach(pParse, D.pExpr);
1483fdbcdee5Sdrh }
1484fdbcdee5Sdrh 
1485f744bb56Sdanielk1977 %type key_opt {Expr*}
1486633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1487f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
1488b7916a78Sdrh key_opt(A) ::= KEY expr(X).          { A = X.pExpr; }
1489113088ecSdrh 
1490113088ecSdrh database_kw_opt ::= DATABASE.
1491113088ecSdrh database_kw_opt ::= .
1492fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
14934343fea2Sdrh 
14944343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
14954343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
14964343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
14974343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1498154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
14999fd2a9a0Sdanielk1977 
15009f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
15019f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
15029f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
15039f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
15049f18e8a0Sdrh %endif
15059f18e8a0Sdrh 
15069fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
15079fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
15089fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
15099fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
15109fd2a9a0Sdanielk1977 }
1511986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1512986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1513986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
151419a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
151519a8e7e8Sdanielk1977 }
151619a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
15174a642b60Sdrh   disableLookaside(pParse);
151819a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
151919a8e7e8Sdanielk1977 }
152019a8e7e8Sdanielk1977 kwcolumn_opt ::= .
152119a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1522154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1523e09daa90Sdrh 
1524e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1525e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1526b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1527b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1528b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1529b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1530b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1531b9bb7c18Sdrh }
1532e09daa90Sdrh vtabarglist ::= vtabarg.
1533e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1534b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1535b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1536b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1537b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1538b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1539b9bb7c18Sdrh anylist ::= .
1540aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1541aaac8b4eSdrh anylist ::= anylist ANY.
1542154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
15438b471863Sdrh 
15448b471863Sdrh 
15458b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
15467d562dbeSdan %type with {With*}
15477d562dbeSdan %type wqlist {With*}
15487d562dbeSdan %destructor with {sqlite3WithDelete(pParse->db, $$);}
15494e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
15507d562dbeSdan 
15517d562dbeSdan with(A) ::= . {A = 0;}
15528b471863Sdrh %ifndef SQLITE_OMIT_CTE
15537d562dbeSdan with(A) ::= WITH wqlist(W).              { A = W; }
15547d562dbeSdan with(A) ::= WITH RECURSIVE wqlist(W).    { A = W; }
15557d562dbeSdan 
1556108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1557cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
15587d562dbeSdan }
15594dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
15604dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
15618b471863Sdrh }
15628b471863Sdrh %endif  SQLITE_OMIT_CTE
1563