xref: /sqlite-3.40.0/src/parse.y (revision 5776ee5c)
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 
27fb32c44eSdrh // An extra argument to the constructor for the parser, which is available
28fb32c44eSdrh // to all actions.
29fb32c44eSdrh %extra_context {Parse *pParse}
30487e262fSdrh 
31487e262fSdrh // This code runs whenever there is a syntax error
32487e262fSdrh //
33348784efSdrh %syntax_error {
34128255fcSdrh   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
356116ee4eSdrh   if( TOKEN.z[0] ){
364adee20fSdanielk1977     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
376116ee4eSdrh   }else{
386116ee4eSdrh     sqlite3ErrorMsg(pParse, "incomplete input");
396116ee4eSdrh   }
40b86ccfb2Sdrh }
418fc3345fSdrh %stack_overflow {
428fc3345fSdrh   sqlite3ErrorMsg(pParse, "parser stack overflow");
438fc3345fSdrh }
44487e262fSdrh 
45487e262fSdrh // The name of the generated procedure that implements the parser
46487e262fSdrh // is as follows:
474adee20fSdanielk1977 %name sqlite3Parser
48487e262fSdrh 
49487e262fSdrh // The following text is included near the beginning of the C source
50487e262fSdrh // code file that implements the parser.
51487e262fSdrh //
52348784efSdrh %include {
53348784efSdrh #include "sqliteInt.h"
549bbca4c1Sdrh 
559bbca4c1Sdrh /*
56d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down
57d3ec02d3Sdrh ** automaton.
58d3ec02d3Sdrh */
59d3ec02d3Sdrh #define YYNOERRORRECOVERY 1
60d3ec02d3Sdrh 
61d3ec02d3Sdrh /*
628a415d37Sdrh ** Make yytestcase() the same as testcase()
638a415d37Sdrh */
648a415d37Sdrh #define yytestcase(X) testcase(X)
658a415d37Sdrh 
668a415d37Sdrh /*
6782415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null
6882415f2dSdrh ** pointer.
6982415f2dSdrh */
70644f4c1bSdrh #define YYPARSEFREENEVERNULL 1
7182415f2dSdrh 
7282415f2dSdrh /*
73d26cc541Sdrh ** In the amalgamation, the parse.c file generated by lemon and the
74d26cc541Sdrh ** tokenize.c file are concatenated.  In that case, sqlite3RunParser()
75d26cc541Sdrh ** has access to the the size of the yyParser object and so the parser
76d26cc541Sdrh ** engine can be allocated from stack.  In that case, only the
77d26cc541Sdrh ** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked
78d26cc541Sdrh ** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be
79d26cc541Sdrh ** omitted.
80d26cc541Sdrh */
81d26cc541Sdrh #ifdef SQLITE_AMALGAMATION
82d26cc541Sdrh # define sqlite3Parser_ENGINEALWAYSONSTACK 1
83d26cc541Sdrh #endif
84d26cc541Sdrh 
85d26cc541Sdrh /*
8682415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed
8782415f2dSdrh ** into sqlite3ParserAlloc().  The default is size_t.
8882415f2dSdrh */
8982415f2dSdrh #define YYMALLOCARGTYPE  u64
9082415f2dSdrh 
9182415f2dSdrh /*
92ad3cab52Sdrh ** An instance of the following structure describes the event of a
93ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
94ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
95ad3cab52Sdrh **
96ad3cab52Sdrh **      UPDATE ON (a,b,c)
97ad3cab52Sdrh **
98ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
99c3f9bad2Sdanielk1977 */
100ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
101caec2f12Sdrh 
10286fb6e17Sdan struct FrameBound     { int eType; Expr *pExpr; };
10386fb6e17Sdan 
10425d6543dSdrh /*
1054a642b60Sdrh ** Disable lookaside memory allocation for objects that might be
1064a642b60Sdrh ** shared across database connections.
1074a642b60Sdrh */
1084a642b60Sdrh static void disableLookaside(Parse *pParse){
1094a642b60Sdrh   pParse->disableLookaside++;
1104a642b60Sdrh   pParse->db->lookaside.bDisable++;
1114a642b60Sdrh }
1124a642b60Sdrh 
113caec2f12Sdrh } // end %include
114348784efSdrh 
115826fb5a3Sdrh // Input is a single SQL command
116c4a3c779Sdrh input ::= cmdlist.
117094b2bbfSdrh cmdlist ::= cmdlist ecmd.
118826fb5a3Sdrh cmdlist ::= ecmd.
119b7f9164eSdrh ecmd ::= SEMI.
1202424aa72Sdrh ecmd ::= cmdx SEMI.
121b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
1222424aa72Sdrh ecmd ::= explain cmdx.
1238549d55eSdrh explain ::= EXPLAIN.              { pParse->explain = 1; }
1248549d55eSdrh explain ::= EXPLAIN QUERY PLAN.   { pParse->explain = 2; }
125154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
126200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
127348784efSdrh 
128382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
129c4a3c779Sdrh //
130fa86c412Sdrh 
131684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
132c4a3c779Sdrh trans_opt ::= .
133c4a3c779Sdrh trans_opt ::= TRANSACTION.
1345ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
135684917c2Sdrh %type transtype {int}
136684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
137cf82f0d3Sdrh transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
138cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
139cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
14007a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt.   {sqlite3EndTransaction(pParse,@X);}
14107a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt.     {sqlite3EndTransaction(pParse,@X);}
142c4a3c779Sdrh 
143fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
144fd7f0452Sdanielk1977 savepoint_opt ::= .
145fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
146fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
147fd7f0452Sdanielk1977 }
148fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
149fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
150fd7f0452Sdanielk1977 }
151fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
152fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
153fd7f0452Sdanielk1977 }
154fd7f0452Sdanielk1977 
155382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
156348784efSdrh //
157348784efSdrh cmd ::= create_table create_table_args.
158d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
159f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
160969fa7c1Sdrh }
161dabd04c6Sdrh createkw(A) ::= CREATE(A).  {disableLookaside(pParse);}
162dabd04c6Sdrh 
163faa59554Sdrh %type ifnotexists {int}
164faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
165faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
166f57b3399Sdrh %type temp {int}
16753c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
168d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
169154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
170d24cc427Sdrh temp(A) ::= .      {A = 0;}
1715969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
1725969da4aSdrh   sqlite3EndTable(pParse,&X,&E,F,0);
173969fa7c1Sdrh }
174969fa7c1Sdrh create_table_args ::= AS select(S). {
1755969da4aSdrh   sqlite3EndTable(pParse,0,0,0,S);
176633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
177969fa7c1Sdrh }
1783334d089Sdrh %type table_options {int}
1795969da4aSdrh table_options(A) ::= .    {A = 0;}
1805969da4aSdrh table_options(A) ::= WITHOUT nm(X). {
1815969da4aSdrh   if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
182fccda8a1Sdrh     A = TF_WithoutRowid | TF_NoVisibleRowid;
1835969da4aSdrh   }else{
1845969da4aSdrh     A = 0;
1855969da4aSdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
1865969da4aSdrh   }
1875969da4aSdrh }
188986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist.
189986dde70Sdrh columnlist ::= columnname carglist.
1902881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);}
191c4a3c779Sdrh 
1926a8700b9Sdrh // Declare some tokens early in order to influence their values, to
1936a8700b9Sdrh // improve performance and reduce the executable size.  The goal here is
1946a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric
1956a8700b9Sdrh // values that are early enough so that all jump operations are clustered
1967bbdc3c5Sdrh // at the beginning.
1976a8700b9Sdrh //
1986a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST.
1996a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL.
2006a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2016a8700b9Sdrh %token GT LE LT GE ESCAPE.
2026a8700b9Sdrh 
20331d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
20431d6fd55Sdrh // fallback to ID if they will not parse as their original value.
20531d6fd55Sdrh // This obviates the need for the "id" nonterminal.
20631d6fd55Sdrh //
20731d6fd55Sdrh %fallback ID
20831d6fd55Sdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2090a6259f5Sdrh   CONFLICT DATABASE DEFERRED DESC DETACH DO
2106cd7d489Sdrh   EACH END EXCLUSIVE EXPLAIN FAIL FOR
21131d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
21286fb6e17Sdan   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS
21331d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
2146e11892dSdan   NULLS FIRST LAST
21531d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
21631d6fd55Sdrh   EXCEPT INTERSECT UNION
21731d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
2183773c25fSdrh %ifndef SQLITE_OMIT_WINDOWFUNC
2196e2210e0Sdan   CURRENT FOLLOWING PARTITION PRECEDING RANGE UNBOUNDED
220ced89124Sdan   EXCLUDE GROUPS OTHERS TIES
2213773c25fSdrh %endif SQLITE_OMIT_WINDOWFUNC
22231d6fd55Sdrh   REINDEX RENAME CTIME_KW IF
22331d6fd55Sdrh   .
22431d6fd55Sdrh %wildcard ANY.
22531d6fd55Sdrh 
226f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
2272d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2282d3917daSdrh // causes them to be assigned integer values that are close together,
2292d3917daSdrh // which keeps parser tables smaller.
2302d3917daSdrh //
231f2bc013cSdrh // The token values assigned to these symbols is determined by the order
232f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
233f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
234f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
235f2bc013cSdrh // constraint.
236f2bc013cSdrh //
2372d3917daSdrh %left OR.
2382d3917daSdrh %left AND.
2392d3917daSdrh %right NOT.
24003bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2419a43267bSdrh %left GT LE LT GE.
2427c6303c0Sdanielk1977 %right ESCAPE.
2432d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2442d3917daSdrh %left PLUS MINUS.
2452d3917daSdrh %left STAR SLASH REM.
246a34001c9Sdrh %left CONCAT.
247a34001c9Sdrh %left COLLATE.
2487ba5bc5bSdrh %right BITNOT.
24926cf56f8Sdrh %nonassoc ON.
2502d3917daSdrh 
2517cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2527cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2537cc84c2cSdrh //
2547cc84c2cSdrh %token_class id  ID|INDEXED.
2557cc84c2cSdrh 
2567cc84c2cSdrh 
257c4a3c779Sdrh // And "ids" is an identifer-or-string.
258c4a3c779Sdrh //
259f59b12fbSdrh %token_class ids  ID|STRING.
260c4a3c779Sdrh 
2615ad1a6c8Sdrh // The name of a column or table can be any of the following:
2625ad1a6c8Sdrh //
2635ad1a6c8Sdrh %type nm {Token}
2644dd0d3f8Sdrh nm(A) ::= id(A).
2654dd0d3f8Sdrh nm(A) ::= STRING(A).
2664dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
2675ad1a6c8Sdrh 
268986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
269487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
270487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
271487e262fSdrh //
272487e262fSdrh %type typetoken {Token}
273986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
2744dd0d3f8Sdrh typetoken(A) ::= typename(A).
2754dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
2764dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
277487e262fSdrh }
2784dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
2794dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
280487e262fSdrh }
281382c0247Sdrh %type typename {Token}
28259ff4251Sdan typename(A) ::= ids(A).
28359ff4251Sdan typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
28460218d2aSdrh signed ::= plus_num.
28560218d2aSdrh signed ::= minus_num.
286487e262fSdrh 
2871be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the
2881be266baSdrh // input text just past the last token that has been shifted into
2891be266baSdrh // the parser.  By surrounding some phrase in the grammar with two
2901be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase.
2911be266baSdrh // For example:
2921be266baSdrh //
2931be266baSdrh //      something ::= .... scanpt(A) phrase scanpt(Z).
2941be266baSdrh //
2951be266baSdrh // The text that is parsed as "phrase" is a string starting at A
2961be266baSdrh // and containing (int)(Z-A) characters.  There might be some extra
2971be266baSdrh // whitespace on either end of the text, but that can be removed in
2981be266baSdrh // post-processing, if needed.
2991be266baSdrh //
3001be266baSdrh %type scanpt {const char*}
3011be266baSdrh scanpt(A) ::= . {
302f259df5fSdrh   assert( yyLookahead!=YYNOCODE );
3031be266baSdrh   A = yyLookaheadToken.z;
3041be266baSdrh }
3054db4b5b4Sdan scantok(A) ::= . {
3064db4b5b4Sdan   assert( yyLookahead!=YYNOCODE );
3074db4b5b4Sdan   A = yyLookaheadToken;
3084db4b5b4Sdan }
3091be266baSdrh 
310487e262fSdrh // "carglist" is a list of additional constraints that come after the
311487e262fSdrh // column name and column type in a CREATE TABLE statement.
312487e262fSdrh //
3134dc330ddSdrh carglist ::= carglist ccons.
314348784efSdrh carglist ::= .
3154dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
3164db4b5b4Sdan ccons ::= DEFAULT scantok(A) term(X).
3174db4b5b4Sdan                             {sqlite3AddDefaultValue(pParse,X,A.z,&A.z[A.n]);}
3181be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3191be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
3204db4b5b4Sdan ccons ::= DEFAULT PLUS(A) scantok(Z) term(X).
3214db4b5b4Sdan                             {sqlite3AddDefaultValue(pParse,X,A.z,&Z.z[Z.n]);}
3224db4b5b4Sdan ccons ::= DEFAULT MINUS(A) scantok(Z) term(X). {
3231be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3244db4b5b4Sdan   sqlite3AddDefaultValue(pParse,p,A.z,&Z.z[Z.n]);
3257977a17fSdanielk1977 }
3264db4b5b4Sdan ccons ::= DEFAULT scantok id(X).       {
3271be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
328d7fd899eSdrh   if( p ){
329171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
33096acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
331d7fd899eSdrh   }
3321be266baSdrh     sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3337977a17fSdanielk1977 }
334348784efSdrh 
335382c0247Sdrh // In addition to the type name, we also care about the primary key and
336382c0247Sdrh // UNIQUE constraints.
337348784efSdrh //
3380d316a40Sdrh ccons ::= NULL onconf.
3394adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
340fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
341fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
34262340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
34362340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3441be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
345108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3464adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3474adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
34859ff4251Sdan ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
34904738cb9Sdrh 
350205f48e6Sdrh // The optional AUTOINCREMENT keyword
351205f48e6Sdrh %type autoinc {int}
352205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3532958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
354205f48e6Sdrh 
355c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
356c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
357c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
358c2eef3b3Sdrh // check fails.
35904738cb9Sdrh //
360c2eef3b3Sdrh %type refargs {int}
361fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3624dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
363c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
364c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
365c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
366c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
367c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
368c2eef3b3Sdrh %type refact {int}
369fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
370fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
371fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
372fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
373fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
374c2eef3b3Sdrh %type defer_subclause {int}
3751da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
376c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
377c2eef3b3Sdrh %type init_deferred_pred_opt {int}
378c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
379c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
380c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
381348784efSdrh 
38219a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3834dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
384ab35eaedSdrh conslist ::= conslist tconscomma tcons.
385ab35eaedSdrh conslist ::= tcons.
386ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
387ab35eaedSdrh tconscomma ::= .
388ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
389108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
390fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
391108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
39262340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
39362340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
394b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
3951be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
396108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
397108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3984adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3994adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
400c2eef3b3Sdrh }
401c2eef3b3Sdrh %type defer_subclause_opt {int}
402c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
4034dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
4049cfcf5d4Sdrh 
4059cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
4069cfcf5d4Sdrh // default behavior when there is a constraint conflict.
4079cfcf5d4Sdrh //
4089cfcf5d4Sdrh %type onconf {int}
4093334d089Sdrh %type orconf {int}
4101c92853dSdrh %type resolvetype {int}
4111c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4121c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4131c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4143334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4154dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4161c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4171c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
418348784efSdrh 
419382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
420348784efSdrh //
421a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
422a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
423a8858103Sdanielk1977 }
424a073384fSdrh %type ifexists {int}
425a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
426a073384fSdrh ifexists(A) ::= .            {A = 0;}
427348784efSdrh 
428a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
429a76b5dfcSdrh //
430b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
431108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4328981b904Sdrh           AS select(S). {
4338981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
434a76b5dfcSdrh }
435a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
436a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
437a76b5dfcSdrh }
438154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
439a76b5dfcSdrh 
440382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
441348784efSdrh //
4427d562dbeSdan cmd ::= select(X).  {
443edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4447d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
445633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4469bb61fe7Sdrh }
447efb7251dSdrh 
4489bb61fe7Sdrh %type select {Select*}
449633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4507d562dbeSdan %type selectnowith {Select*}
4517d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
45282c3d636Sdrh %type oneselect {Select*}
453633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4549bb61fe7Sdrh 
455772460fdSdrh %include {
456772460fdSdrh   /*
457772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
458772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
459772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
460772460fdSdrh   */
461e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
46255f66b34Sdrh     assert( p!=0 );
463d227a291Sdrh     if( p->pPrior ){
464772460fdSdrh       Select *pNext = 0, *pLoop;
465772460fdSdrh       int mxSelect, cnt = 0;
466d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
467d227a291Sdrh         pLoop->pNext = pNext;
468d227a291Sdrh         pLoop->selFlags |= SF_Compound;
469d227a291Sdrh       }
470772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
471772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
472772460fdSdrh         cnt>mxSelect
473a0c01768Sdrh       ){
474d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
475d227a291Sdrh       }
476d227a291Sdrh     }
477772460fdSdrh   }
478772460fdSdrh }
479772460fdSdrh 
4806a8b94e2Sdrh %ifndef SQLITE_OMIT_CTE
481a5746e03Sdrh select(A) ::= WITH wqlist(W) selectnowith(X). {
482772460fdSdrh   Select *p = X;
483772460fdSdrh   if( p ){
484772460fdSdrh     p->pWith = W;
485772460fdSdrh     parserDoubleLinkSelect(pParse, p);
486a9f5c13dSdan   }else{
487a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
488a9f5c13dSdan   }
489a5746e03Sdrh   A = p;
490a5746e03Sdrh }
491a5746e03Sdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X). {
492a5746e03Sdrh   Select *p = X;
493a5746e03Sdrh   if( p ){
494a5746e03Sdrh     p->pWith = W;
495a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
496a5746e03Sdrh   }else{
497a5746e03Sdrh     sqlite3WithDelete(pParse->db, W);
498a5746e03Sdrh   }
499a5746e03Sdrh   A = p;
500a5746e03Sdrh }
5016a8b94e2Sdrh %endif /* SQLITE_OMIT_CTE */
502a5746e03Sdrh select(A) ::= selectnowith(X). {
503a5746e03Sdrh   Select *p = X;
504a5746e03Sdrh   if( p ){
505a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
506a5746e03Sdrh   }
507a5746e03Sdrh   A = p; /*A-overwrites-X*/
508a9f5c13dSdan }
5097d562dbeSdan 
5104dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
511b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
5124dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
513c0bf493eSdrh   Select *pRhs = Z;
5144dd0d3f8Sdrh   Select *pLhs = A;
515c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
516c0bf493eSdrh     SrcList *pFrom;
517c0bf493eSdrh     Token x;
518c0bf493eSdrh     x.n = 0;
519772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
520c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
5218c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
522c0bf493eSdrh   }
523c0bf493eSdrh   if( pRhs ){
524c0bf493eSdrh     pRhs->op = (u8)Y;
52500d5ab74Sdrh     pRhs->pPrior = pLhs;
52600d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
527772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
528d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
52943b78826Sdrh   }else{
53000d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
531daffd0e5Sdrh   }
532c0bf493eSdrh   A = pRhs;
53382c3d636Sdrh }
5340a36c57eSdrh %type multiselect_op {int}
535cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5360a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
537cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
538154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
539550a3309Sdrh 
540fef37760Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
54167a9b8edSdan                  groupby_opt(P) having_opt(Q)
542e3bf632cSdan                  orderby_opt(Z) limit_opt(L). {
5438c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
544550a3309Sdrh }
545550a3309Sdrh %ifndef SQLITE_OMIT_WINDOWFUNC
546550a3309Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
547550a3309Sdrh                  groupby_opt(P) having_opt(Q) window_clause(R)
548550a3309Sdrh                  orderby_opt(Z) limit_opt(L). {
549550a3309Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
5506fde1799Sdan   if( A ){
5516fde1799Sdan     A->pWinDefn = R;
5526fde1799Sdan   }else{
5536fde1799Sdan     sqlite3WindowListDelete(pParse->db, R);
5546fde1799Sdan   }
5559bb61fe7Sdrh }
556550a3309Sdrh %endif
557550a3309Sdrh 
558550a3309Sdrh 
5594dd0d3f8Sdrh oneselect(A) ::= values(A).
56075593d96Sdrh 
56175593d96Sdrh %type values {Select*}
56275593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
56375593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5648c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
56575593d96Sdrh }
566954733b3Sdrh values(A) ::= values(A) COMMA LP nexprlist(Y) RP. {
5674dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5688c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
569f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
57075593d96Sdrh   if( pRight ){
57175593d96Sdrh     pRight->op = TK_ALL;
572772460fdSdrh     pRight->pPrior = pLeft;
57375593d96Sdrh     A = pRight;
57475593d96Sdrh   }else{
575772460fdSdrh     A = pLeft;
57675593d96Sdrh   }
57775593d96Sdrh }
5789bb61fe7Sdrh 
5799bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5809bb61fe7Sdrh // present and false (0) if it is not.
5819bb61fe7Sdrh //
5823334d089Sdrh %type distinct {int}
583832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5847cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
585efb7251dSdrh distinct(A) ::= .           {A = 0;}
586348784efSdrh 
5879bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5887c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5897c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5901a1d3cd2Sdrh // opcode of TK_ASTERISK.
5919bb61fe7Sdrh //
592348784efSdrh %type selcollist {ExprList*}
593633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
594348784efSdrh %type sclp {ExprList*}
595633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
5964dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
597348784efSdrh sclp(A) ::= .                                {A = 0;}
5981be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
5991be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
600b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
6011be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
60201f3f253Sdrh }
603d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
6041a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
6054dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
6067c917d19Sdrh }
6071be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
608abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
609abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
610abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
6114dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
61254473229Sdrh }
61301f3f253Sdrh 
61401f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
61501f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
61601f3f253Sdrh //
61701f3f253Sdrh %type as {Token}
6185ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
6194dd0d3f8Sdrh as(X) ::= ids(X).
620986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6219bb61fe7Sdrh 
622348784efSdrh 
623ad3cab52Sdrh %type seltablist {SrcList*}
624633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
625ad3cab52Sdrh %type stl_prefix {SrcList*}
626633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
627ad3cab52Sdrh %type from {SrcList*}
628633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
629348784efSdrh 
63001f3f253Sdrh // A complete FROM clause.
63101f3f253Sdrh //
63217435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
63361dfc31dSdrh from(A) ::= FROM seltablist(X). {
63461dfc31dSdrh   A = X;
63561dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
63661dfc31dSdrh }
63701f3f253Sdrh 
63801f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
63901f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
64001f3f253Sdrh //
6414dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6428a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
64301f3f253Sdrh }
644348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6454dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
646e9240418Sdrh                   on_opt(N) using_opt(U). {
6474dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
648b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
64901f3f253Sdrh }
6504dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
65101d230ceSdrh                   on_opt(N) using_opt(U). {
6524dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
65301d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
65401d230ceSdrh }
65551522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6564dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
657b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6584dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
65922f70c32Sdrh   }
6604dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
661fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6624dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
663fbdc7f69Sdrh       A = F;
664832ee3d4Sdrh     }else if( F->nSrc==1 ){
6654dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
666832ee3d4Sdrh       if( A ){
667832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
668832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
669832ee3d4Sdrh         pNew->zName = pOld->zName;
670832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6713c449c6bSdrh         pNew->pSelect = pOld->pSelect;
6724a5cff73Sdrh         if( pOld->fg.isTabFunc ){
6734a5cff73Sdrh           pNew->u1.pFuncArg = pOld->u1.pFuncArg;
6744a5cff73Sdrh           pOld->u1.pFuncArg = 0;
6754a5cff73Sdrh           pOld->fg.isTabFunc = 0;
6764a5cff73Sdrh           pNew->fg.isTabFunc = 1;
6774a5cff73Sdrh         }
678832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6793c449c6bSdrh         pOld->pSelect = 0;
680832ee3d4Sdrh       }
681832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
682fbdc7f69Sdrh     }else{
683fbdc7f69Sdrh       Select *pSubquery;
684fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6858c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6864dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
687fbdc7f69Sdrh     }
688fbdc7f69Sdrh   }
689154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
690b733d037Sdrh 
691113088ecSdrh %type dbnm {Token}
692113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
693113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
694113088ecSdrh 
69574ad7fe9Sdrh %type fullname {SrcList*}
696633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
697c9461eccSdan fullname(A) ::= nm(X).  {
69829c992cbSdrh   A = sqlite3SrcListAppend(pParse,0,&X,0);
699c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &X);
700c9461eccSdan }
701c9461eccSdan fullname(A) ::= nm(X) DOT nm(Y). {
70229c992cbSdrh   A = sqlite3SrcListAppend(pParse,0,&X,&Y);
703c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &Y);
704c9461eccSdan }
70574ad7fe9Sdrh 
7065e3a6ebfSdrh %type xfullname {SrcList*}
7075e3a6ebfSdrh %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);}
7085e3a6ebfSdrh xfullname(A) ::= nm(X).
70929c992cbSdrh    {A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/}
7105e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y).
71129c992cbSdrh    {A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/}
7125e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z).  {
71329c992cbSdrh    A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/
7145e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7155e3a6ebfSdrh }
7165e3a6ebfSdrh xfullname(A) ::= nm(X) AS nm(Z). {
71729c992cbSdrh    A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/
7185e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7195e3a6ebfSdrh }
7205e3a6ebfSdrh 
72101f3f253Sdrh %type joinop {int}
722fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
723cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
724cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
725cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
726cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
7275ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
728cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
72901f3f253Sdrh 
73026cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a
73126cf56f8Sdrh // SELECT on the RHS of a the INSERT:
73226cf56f8Sdrh //
73326cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ...
73426cf56f8Sdrh //                                        here ----^^
73526cf56f8Sdrh //
73626cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is
73726cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON
73826cf56f8Sdrh // clause associated with the JOIN.  The conflict is resolved in favor
73926cf56f8Sdrh // of the JOIN.  If an ON CONFLICT clause is intended, insert a dummy
74026cf56f8Sdrh // WHERE clause in between, like this:
74126cf56f8Sdrh //
74226cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ...
74326cf56f8Sdrh //
74426cf56f8Sdrh // The [AND] and [OR] precedence marks in the rules for on_opt cause the
74526cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN.
74626cf56f8Sdrh //
74701f3f253Sdrh %type on_opt {Expr*}
748633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
7491be266baSdrh on_opt(N) ::= ON expr(E).  {N = E;}
75026cf56f8Sdrh on_opt(N) ::= .     [OR]   {N = 0;}
75101f3f253Sdrh 
75285574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
75385574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
75485574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
75585574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
75685574e31Sdanielk1977 // in the token.
75785574e31Sdanielk1977 //
75885574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
759b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
76085574e31Sdanielk1977 // recognizes and interprets this as a special case.
76185574e31Sdanielk1977 //
76285574e31Sdanielk1977 %type indexed_opt {Token}
76385574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
76485574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
76585574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
76685574e31Sdanielk1977 
76701f3f253Sdrh %type using_opt {IdList*}
768633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
76981eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
77001f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
77101f3f253Sdrh 
77201f3f253Sdrh 
773348784efSdrh %type orderby_opt {ExprList*}
774633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
775108aa00aSdrh 
776108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
777108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
778108aa00aSdrh // sort order.
779108aa00aSdrh //
780348784efSdrh %type sortlist {ExprList*}
781633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
782348784efSdrh 
783348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
784348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7856e11892dSdan sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z) nulls(X). {
7861be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
7876e11892dSdan   sqlite3ExprListSetSortOrder(A,Z,X);
788348784efSdrh }
7896e11892dSdan sortlist(A) ::= expr(Y) sortorder(Z) nulls(X). {
7901be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
7916e11892dSdan   sqlite3ExprListSetSortOrder(A,Z,X);
792348784efSdrh }
793348784efSdrh 
794348784efSdrh %type sortorder {int}
795348784efSdrh 
7968e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
7978e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
798bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
799348784efSdrh 
8006e11892dSdan %type nulls {int}
8016e11892dSdan nulls(A) ::= NULLS FIRST.       {A = SQLITE_SO_ASC;}
8026e11892dSdan nulls(A) ::= NULLS LAST.        {A = SQLITE_SO_DESC;}
8036e11892dSdan nulls(A) ::= .                  {A = SQLITE_SO_UNDEFINED;}
8046e11892dSdan 
8052282792aSdrh %type groupby_opt {ExprList*}
806633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
8072282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
8089245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
8092282792aSdrh 
8102282792aSdrh %type having_opt {Expr*}
811633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
8122282792aSdrh having_opt(A) ::= .                {A = 0;}
8131be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
8142282792aSdrh 
8158c0833fbSdrh %type limit_opt {Expr*}
81615926590Sdrh 
81715926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
81815926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
81915926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
82015926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
82115926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
82215926590Sdrh // except as a transient.  So there is never anything to destroy.
82315926590Sdrh //
8248c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
8258c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
8268c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
8271be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
828a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
8291be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
830a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
8311be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
8329bbca4c1Sdrh 
833382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
834382c0247Sdrh //
835273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8365e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W)
837931577f1Sdrh         orderby_opt(O) limit_opt(L). {
838b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
8396a0db87aSdrh #ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8406a0db87aSdrh   sqlite3ExprListDelete(pParse->db, O); O = 0;
8416a0db87aSdrh   sqlite3ExprDelete(pParse->db, L); L = 0;
8426a0db87aSdrh #endif
8438c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
8444281bd42Sshane }
8454281bd42Sshane %endif
846273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8475e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W). {
8484281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8498c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
8504281bd42Sshane }
8514281bd42Sshane %endif
852348784efSdrh 
853348784efSdrh %type where_opt {Expr*}
854633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
855348784efSdrh 
856348784efSdrh where_opt(A) ::= .                    {A = 0;}
8571be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
858348784efSdrh 
859382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
860382c0247Sdrh //
861273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8625e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
8638b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
864b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
865b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
866eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L,0);
8674281bd42Sshane }
8684281bd42Sshane %endif
869273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8705e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
871e9240418Sdrh         where_opt(W).  {
8724281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8734281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
874eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0,0);
8754281bd42Sshane }
8764281bd42Sshane %endif
877348784efSdrh 
878f8db1bc0Sdrh %type setlist {ExprList*}
879633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
880f8db1bc0Sdrh 
8814dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8821be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
883b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
884b7916a78Sdrh }
885a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8861be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
887a1251bc4Sdrh }
888b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8891be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
890b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
891b7916a78Sdrh }
892a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
8931be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
894a1251bc4Sdrh }
895348784efSdrh 
896382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
897382c0247Sdrh //
8985e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) select(S)
8992c2e844aSdrh         upsert(U). {
90046d2e5c3Sdrh   sqlite3Insert(pParse, X, S, F, R, U);
9014e9119d9Sdan }
9025e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) DEFAULT VALUES.
9034e9119d9Sdan {
9042c2e844aSdrh   sqlite3Insert(pParse, X, 0, F, R, 0);
9054e9119d9Sdan }
906348784efSdrh 
90746d2e5c3Sdrh %type upsert {Upsert*}
90854514c98Sdrh 
90954514c98Sdrh // Because upsert only occurs at the tip end of the INSERT rule for cmd,
91054514c98Sdrh // there is never a case where the value of the upsert pointer will not
91154514c98Sdrh // be destroyed by the cmd action.  So comment-out the destructor to
91254514c98Sdrh // avoid unreachable code.
91354514c98Sdrh //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);}
91446d2e5c3Sdrh upsert(A) ::= . { A = 0; }
915e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW)
916dab0eb58Sdrh               DO UPDATE SET setlist(Z) where_opt(W).
917e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W);}
918e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING.
919e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,0,0); }
920e9c2e772Sdrh upsert(A) ::= ON CONFLICT DO NOTHING.
921e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,0,0,0,0); }
92226cf56f8Sdrh 
9233334d089Sdrh %type insert_cmd {int}
924fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
925fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
926fa86c412Sdrh 
9278981b904Sdrh %type idlist_opt {IdList*}
9288981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
92981eba73eSdrh %type idlist {IdList*}
93081eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
931348784efSdrh 
9328981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
9338981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
9344dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
9355496d6a2Sdan     {A = sqlite3IdListAppend(pParse,A,&Y);}
93681eba73eSdrh idlist(A) ::= nm(Y).
9375496d6a2Sdan     {A = sqlite3IdListAppend(pParse,0,&Y); /*A-overwrites-Y*/}
938348784efSdrh 
939382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
940382c0247Sdrh //
941348784efSdrh 
9421be266baSdrh %type expr {Expr*}
9431be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
9441be266baSdrh %type term {Expr*}
9451be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
946b7916a78Sdrh 
947b7916a78Sdrh %include {
948b7916a78Sdrh 
949b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
950b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
951b7916a78Sdrh   ** that created the expression.
952b7916a78Sdrh   */
9531be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
9540cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
9550cd874bdSdrh     if( p ){
956d145e5f4Sdan       /* memset(p, 0, sizeof(Expr)); */
9570cd874bdSdrh       p->op = (u8)op;
9581194904bSdrh       p->affExpr = 0;
9590cd874bdSdrh       p->flags = EP_Leaf;
9600cd874bdSdrh       p->iAgg = -1;
961d145e5f4Sdan       p->pLeft = p->pRight = 0;
962d145e5f4Sdan       p->x.pList = 0;
963d145e5f4Sdan       p->pAggInfo = 0;
964eda079cdSdrh       p->y.pTab = 0;
965d145e5f4Sdan       p->op2 = 0;
9664fe759b2Sdrh       p->iTable = 0;
967d3130dabSdrh       p->iColumn = 0;
9680cd874bdSdrh       p->u.zToken = (char*)&p[1];
9690cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
9700cd874bdSdrh       p->u.zToken[t.n] = 0;
9710cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
97251d35b0fSdrh         sqlite3DequoteExpr(p);
9730cd874bdSdrh       }
9740cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
9750cd874bdSdrh       p->nHeight = 1;
9760cd874bdSdrh #endif
977c9461eccSdan       if( IN_RENAME_OBJECT ){
97807e95233Sdan         return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t);
979d145e5f4Sdan       }
9800cd874bdSdrh     }
9811be266baSdrh     return p;
982b7916a78Sdrh   }
983d145e5f4Sdan 
984b7916a78Sdrh }
985348784efSdrh 
9864dd0d3f8Sdrh expr(A) ::= term(A).
9871be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
9881be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9891be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9905ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
991410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
992410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
993c9461eccSdan   if( IN_RENAME_OBJECT ){
994c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp2, &Y);
995c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp1, &X);
996c9461eccSdan   }
9971be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
998e1b6a5b8Sdrh }
999d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
1000410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
1001410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
1002410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
1003abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
1004c9461eccSdan   if( IN_RENAME_OBJECT ){
1005c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp3, &Z);
1006c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp2, &Y);
1007c9461eccSdan   }
10081be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
1009d24cc427Sdrh }
10101be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
10111be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
10120cd874bdSdrh term(A) ::= INTEGER(X). {
10131be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
10140cd874bdSdrh }
1015f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
10168679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
1017de25a88cSdrh     u32 n = X.n;
10181be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
10191be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
10208f3b137fSdrh   }else{
1021b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
1022b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
1023b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
10248f3b137fSdrh     Token t = X; /*A-overwrites-X*/
10258f3b137fSdrh     assert( t.n>=2 );
1026b7916a78Sdrh     if( pParse->nested==0 ){
102743303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
10281be266baSdrh       A = 0;
1029b7916a78Sdrh     }else{
10301be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
10311be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
1032b7916a78Sdrh     }
1033f59b12fbSdrh   }
1034895d7472Sdrh }
103559ff4251Sdan expr(A) ::= expr(A) COLLATE ids(C). {
10361be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
10378b4c40d8Sdrh }
1038487e262fSdrh %ifndef SQLITE_OMIT_CAST
10391be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
10401be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
10411be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
1042487e262fSdrh }
1043154d4b24Sdrh %endif  SQLITE_OMIT_CAST
1044550a3309Sdrh 
1045550a3309Sdrh 
1046550a3309Sdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
1047954733b3Sdrh   A = sqlite3ExprFunction(pParse, Y, &X, D);
1048550a3309Sdrh }
1049550a3309Sdrh expr(A) ::= id(X) LP STAR RP. {
1050954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
1051550a3309Sdrh }
1052550a3309Sdrh 
105367a9b8edSdan %ifndef SQLITE_OMIT_WINDOWFUNC
10544f9adee2Sdan expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_over(Z). {
10556488271fSdan   A = sqlite3ExprFunction(pParse, Y, &X, D);
10564f9adee2Sdan   sqlite3WindowAttach(pParse, A, Z);
10576488271fSdan }
10584f9adee2Sdan expr(A) ::= id(X) LP STAR RP filter_over(Z). {
1059954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
10604f9adee2Sdan   sqlite3WindowAttach(pParse, A, Z);
1061e1b6a5b8Sdrh }
1062550a3309Sdrh %endif
1063550a3309Sdrh 
1064b71090fdSdrh term(A) ::= CTIME_KW(OP). {
1065954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &OP, 0);
1066b7916a78Sdrh }
1067b7916a78Sdrh 
10681be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
10691be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
10701be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
10711be266baSdrh   if( A ){
10721be266baSdrh     A->x.pList = pList;
10738bd0d58eSdrh   }else{
10748bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
107571c57db0Sdan   }
107671c57db0Sdan }
107771c57db0Sdan 
1078d5c851c1Sdrh expr(A) ::= expr(A) AND expr(Y).        {A=sqlite3ExprAnd(pParse,A,Y);}
10791be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
10804dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
10811be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10821be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
10834dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
10841be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10854dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
10861be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10874dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
10881be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10891be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
1090410c301fSdrh %type likeop {Token}
10917e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
1092410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
10934dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
10948aa34ae0Sdrh   ExprList *pList;
1095410c301fSdrh   int bNot = OP.n & 0x80000000;
1096410c301fSdrh   OP.n &= 0x7fffffff;
10971be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
10981be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
1099954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
11001be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
11011be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
11020ac65892Sdrh }
11034dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
11041dca1458Sdrh   ExprList *pList;
1105410c301fSdrh   int bNot = OP.n & 0x80000000;
1106410c301fSdrh   OP.n &= 0x7fffffff;
11071be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
11081be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
11091be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
1110954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
11111be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
11121be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
11131dca1458Sdrh }
11147c6303c0Sdanielk1977 
11151be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
11161be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
11176a2fe093Sdrh 
11186a51741dSdrh %include {
11196a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
11206a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
11216a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
11226a51741dSdrh     sqlite3 *db = pParse->db;
1123c50f75dfSdan     if( pA && pY && pY->op==TK_NULL && !IN_RENAME_OBJECT ){
11245e17e8b7Sshaneh       pA->op = (u8)op;
11256a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
11266a51741dSdrh       pA->pRight = 0;
11276a51741dSdrh     }
11286a51741dSdrh   }
11296a51741dSdrh }
11306a51741dSdrh 
11316a2fe093Sdrh //    expr1 IS expr2
11326a2fe093Sdrh //    expr1 IS NOT expr2
11336a2fe093Sdrh //
11346a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
11356a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
11366a2fe093Sdrh //
11374dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
11381be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
11391be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
11406a2fe093Sdrh }
11414dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
11421be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
11431be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
11446a2fe093Sdrh }
1145b7916a78Sdrh 
114643303de9Sdrh expr(A) ::= NOT(B) expr(X).
11471be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
114843303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
11491be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
1150ca5aa594Sdrh expr(A) ::= PLUS|MINUS(B) expr(X). [BITNOT] {
1151ca5aa594Sdrh   A = sqlite3PExpr(pParse, @B==TK_PLUS ? TK_UPLUS : TK_UMINUS, X, 0);
1152ca5aa594Sdrh   /*A-overwrites-B*/
1153ca5aa594Sdrh }
1154b7916a78Sdrh 
11552e3a1f16Sdrh %type between_op {int}
11562e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
11572e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
11584dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
11591be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
11601be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
11611be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
11621be266baSdrh   if( A ){
11631be266baSdrh     A->x.pList = pList;
116453f733c7Sdrh   }else{
1165633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
116653f733c7Sdrh   }
11671be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1168fef5208cSdrh }
11693e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
11702e3a1f16Sdrh   %type in_op {int}
11712e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
11722e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
11731be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1174094430ebSdrh     if( Y==0 ){
1175473c1bf2Sdan       /* Expressions of the form
1176473c1bf2Sdan       **
1177473c1bf2Sdan       **      expr1 IN ()
1178473c1bf2Sdan       **      expr1 NOT IN ()
1179473c1bf2Sdan       **
1180473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1181473c1bf2Sdan       ** regardless of the value of expr1.
1182473c1bf2Sdan       */
11838e34e406Sdrh       sqlite3ExprUnmapAndDelete(pParse, A);
1184*5776ee5cSdrh       A = sqlite3Expr(pParse->db, TK_INTEGER, N ? "1" : "0");
1185094430ebSdrh     }else{
11861be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
11871be266baSdrh       if( A ){
11881be266baSdrh         A->x.pList = Y;
11891be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1190d5d56523Sdanielk1977       }else{
1191633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1192d5d56523Sdanielk1977       }
11931be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1194094430ebSdrh     }
1195fef5208cSdrh   }
11961be266baSdrh   expr(A) ::= LP select(X) RP. {
11971be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
11981be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
119951522cd3Sdrh   }
12001be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
12011be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12021be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
12031be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1204fef5208cSdrh   }
12055fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
120629c992cbSdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&Y,&Z);
12078c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
12089de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
12091be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12101be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
12111be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
121223b2db23Sdrh   }
12131be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
121443303de9Sdrh     Expr *p;
12151be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
121608de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
121751522cd3Sdrh   }
1218154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1219fef5208cSdrh 
122017a7f8ddSdrh /* CASE expressions */
12211be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
12221be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
12231be266baSdrh   if( A ){
12241be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
12251be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
122653f733c7Sdrh   }else{
1227633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1228c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
122953f733c7Sdrh   }
123017a7f8ddSdrh }
123117a7f8ddSdrh %type case_exprlist {ExprList*}
1232633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12334dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
12341be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
12351be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
123617a7f8ddSdrh }
123717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
12381be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
12391be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
124017a7f8ddSdrh }
124117a7f8ddSdrh %type case_else {Expr*}
1242633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
12431be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
124417a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
124517a7f8ddSdrh %type case_operand {Expr*}
1246633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
12471be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
124817a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1249348784efSdrh 
1250348784efSdrh %type exprlist {ExprList*}
1251633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12529245c243Sdrh %type nexprlist {ExprList*}
1253633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1254348784efSdrh 
12554dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
12569245c243Sdrh exprlist(A) ::= .                            {A = 0;}
12574dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
12581be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
125917435752Sdrh nexprlist(A) ::= expr(Y).
12601be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
12619245c243Sdrh 
1262a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
12635fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
12645fbab882Sdrh ** of parenthesis */
12655fbab882Sdrh %type paren_exprlist {ExprList*}
12665fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12675fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
12685fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1269a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
12705fbab882Sdrh 
1271cce7d176Sdrh 
1272382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1273382c0247Sdrh //
1274d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1275108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
127617435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
127729c992cbSdrh                      sqlite3SrcListAppend(pParse,0,&Y,0), Z, U,
127862340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
1279c9461eccSdan   if( IN_RENAME_OBJECT && pParse->pNewIndex ){
1280c9461eccSdan     sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &Y);
1281c9461eccSdan   }
12829cfcf5d4Sdrh }
1283717e6402Sdrh 
1284717e6402Sdrh %type uniqueflag {int}
12859cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
12869cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1287348784efSdrh 
1288348784efSdrh 
1289108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1290108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1291108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1292108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1293108aa00aSdrh //
1294108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1295108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1296108aa00aSdrh //
1297108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1298108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1299108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1300108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1301108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1302108aa00aSdrh // historical schemas.
1303108aa00aSdrh //
1304108aa00aSdrh %type eidlist {ExprList*}
1305108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1306108aa00aSdrh %type eidlist_opt {ExprList*}
1307108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1308108aa00aSdrh 
1309108aa00aSdrh %include {
1310108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1311108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1312108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1313108aa00aSdrh   ** error while parsing a legacy schema.
1314108aa00aSdrh   */
1315108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1316108aa00aSdrh     Parse *pParse,
1317108aa00aSdrh     ExprList *pPrior,
1318108aa00aSdrh     Token *pIdToken,
1319108aa00aSdrh     int hasCollate,
1320108aa00aSdrh     int sortOrder
1321108aa00aSdrh   ){
1322108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1323108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1324108aa00aSdrh         && pParse->db->init.busy==0
1325108aa00aSdrh     ){
1326108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1327108aa00aSdrh                          pIdToken->n, pIdToken->z);
13280202b29eSdanielk1977     }
1329108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1330108aa00aSdrh     return p;
1331108aa00aSdrh   }
1332108aa00aSdrh } // end %include
1333108aa00aSdrh 
1334108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1335108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
13364dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
13374dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1338108aa00aSdrh }
1339108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1340cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
13410202b29eSdanielk1977 }
13420202b29eSdanielk1977 
1343108aa00aSdrh %type collate {int}
1344108aa00aSdrh collate(C) ::= .              {C = 0;}
134559ff4251Sdan collate(C) ::= COLLATE ids.   {C = 1;}
1346a34001c9Sdrh 
1347348784efSdrh 
13488aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1349382c0247Sdrh //
13504d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1351982cef7eSdrh 
1352382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1353382c0247Sdrh //
1354154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1355fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
13562f6239edSdrh %type vinto {Expr*}
13572f6239edSdrh %destructor vinto {sqlite3ExprDelete(pParse->db, $$);}
13582f6239edSdrh cmd ::= VACUUM vinto(Y).                {sqlite3Vacuum(pParse,0,Y);}
13592f6239edSdrh cmd ::= VACUUM nm(X) vinto(Y).          {sqlite3Vacuum(pParse,&X,Y);}
13602f6239edSdrh vinto(A) ::= INTO expr(X).              {A = X;}
13612f6239edSdrh vinto(A) ::= .                          {A = 0;}
1362fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1363154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1364f57b14a6Sdrh 
1365382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1366382c0247Sdrh //
136713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
136891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1369ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1370ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1371ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1372ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1373ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1374ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1375ada2ee0dSdrh 
1376cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1377cf82f0d3Sdrh nmnum(A) ::= nm(A).
1378cf82f0d3Sdrh nmnum(A) ::= ON(A).
1379cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1380cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1381154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1382f59b12fbSdrh %token_class number INTEGER|FLOAT.
13838395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1384cf82f0d3Sdrh plus_num(A) ::= number(A).
1385f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1386c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1387f0f258b1Sdrh 
1388b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1389b7f9164eSdrh 
1390d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
13914b59ab5eSdrh   Token all;
13924b59ab5eSdrh   all.z = A.z;
1393b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
13944adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1395f0f258b1Sdrh }
1396f0f258b1Sdrh 
1397fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1398fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
139960218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
140060218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1401cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1402c3f9bad2Sdanielk1977 }
1403c3f9bad2Sdanielk1977 
1404c3f9bad2Sdanielk1977 %type trigger_time {int}
14056559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1406c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1407c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1408c3f9bad2Sdanielk1977 
1409ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1410633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1411cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1412cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
141381eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1414c3f9bad2Sdanielk1977 
141560218d2aSdrh foreach_clause ::= .
141660218d2aSdrh foreach_clause ::= FOR EACH ROW.
1417c3f9bad2Sdanielk1977 
1418c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1419633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1420c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
14211be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1422c3f9bad2Sdanielk1977 
1423c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1424633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
14254dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
14264dd0d3f8Sdrh   assert( A!=0 );
14274dd0d3f8Sdrh   A->pLast->pNext = X;
14284dd0d3f8Sdrh   A->pLast = X;
1429a69d9168Sdrh }
14304dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
14314dd0d3f8Sdrh   assert( A!=0 );
14324dd0d3f8Sdrh   A->pLast = A;
143381238966Sdrh }
1434c3f9bad2Sdanielk1977 
1435b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1436b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1437b1819a0bSdrh // the same database as the table that the trigger fires on.
1438b1819a0bSdrh //
1439b1819a0bSdrh %type trnm {Token}
14404dd0d3f8Sdrh trnm(A) ::= nm(A).
1441b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1442b1819a0bSdrh   A = X;
1443b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1444b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1445b1819a0bSdrh         "statements within triggers");
1446b1819a0bSdrh }
1447b1819a0bSdrh 
1448b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1449b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1450b1819a0bSdrh // since it is an exception to the default grammar rules.
1451b1819a0bSdrh //
1452b1819a0bSdrh tridxby ::= .
1453b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1454b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1455b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1456b1819a0bSdrh         "within triggers");
1457b1819a0bSdrh }
1458b1819a0bSdrh tridxby ::= NOT INDEXED. {
1459b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1460b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1461b1819a0bSdrh         "within triggers");
1462b1819a0bSdrh }
1463b1819a0bSdrh 
1464b1819a0bSdrh 
1465b1819a0bSdrh 
1466c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1467633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1468c3f9bad2Sdanielk1977 // UPDATE
1469b1819a0bSdrh trigger_cmd(A) ::=
1470f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
14715be60c55Sdan    {A = sqlite3TriggerUpdateStep(pParse, &X, Y, Z, R, B.z, E);}
1472c3f9bad2Sdanielk1977 
1473c3f9bad2Sdanielk1977 // INSERT
1474f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
14752c2e844aSdrh                       trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). {
14765be60c55Sdan    A = sqlite3TriggerInsertStep(pParse,&X,F,S,R,U,B,Z);/*A-overwrites-R*/
14772c2e844aSdrh }
1478c3f9bad2Sdanielk1977 // DELETE
1479f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
14805be60c55Sdan    {A = sqlite3TriggerDeleteStep(pParse, &X, Y, B.z, E);}
1481c3f9bad2Sdanielk1977 
1482c3f9bad2Sdanielk1977 // SELECT
1483f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1484f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1485c3f9bad2Sdanielk1977 
14866f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
14871be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
14881be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
14891be266baSdrh   if( A ){
14901194904bSdrh     A->affExpr = OE_Ignore;
14914b59ab5eSdrh   }
14928aa34ae0Sdrh }
14931be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
14941be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
14951be266baSdrh   if( A ) {
14961194904bSdrh     A->affExpr = (char)T;
14974b59ab5eSdrh   }
14988aa34ae0Sdrh }
1499154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1500b7f9164eSdrh 
150174ad7fe9Sdrh %type raisetype {int}
150274ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
150374ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
150474ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
150574ad7fe9Sdrh 
15066f34903eSdanielk1977 
1507c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1508b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1509fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1510fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1511c3f9bad2Sdanielk1977 }
1512154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1513113088ecSdrh 
1514113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1515fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1516f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
15171be266baSdrh   sqlite3Attach(pParse, F, D, K);
15181c2d8414Sdrh }
1519fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
15201be266baSdrh   sqlite3Detach(pParse, D);
1521fdbcdee5Sdrh }
1522fdbcdee5Sdrh 
1523f744bb56Sdanielk1977 %type key_opt {Expr*}
1524633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1525f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
15261be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1527113088ecSdrh 
1528113088ecSdrh database_kw_opt ::= DATABASE.
1529113088ecSdrh database_kw_opt ::= .
1530fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
15314343fea2Sdrh 
15324343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
15334343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
15344343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
15354343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1536154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
15379fd2a9a0Sdanielk1977 
15389f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
15399f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
15409f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
15419f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
15429f18e8a0Sdrh %endif
15439f18e8a0Sdrh 
15449fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
15459fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
15469fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
15479fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
15489fd2a9a0Sdanielk1977 }
1549986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1550986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1551986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
155219a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
155319a8e7e8Sdanielk1977 }
155419a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
15554a642b60Sdrh   disableLookaside(pParse);
155619a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
155719a8e7e8Sdanielk1977 }
1558cf8f2895Sdan cmd ::= ALTER TABLE fullname(X) RENAME kwcolumn_opt nm(Y) TO nm(Z). {
1559cf8f2895Sdan   sqlite3AlterRenameColumn(pParse, X, &Y, &Z);
1560cf8f2895Sdan }
1561cf8f2895Sdan 
156219a8e7e8Sdanielk1977 kwcolumn_opt ::= .
156319a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1564cf8f2895Sdan 
1565154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1566e09daa90Sdrh 
1567e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1568e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1569b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1570b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1571b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1572b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1573b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1574b9bb7c18Sdrh }
1575e09daa90Sdrh vtabarglist ::= vtabarg.
1576e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1577b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1578b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1579b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1580b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1581b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1582b9bb7c18Sdrh anylist ::= .
1583aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1584aaac8b4eSdrh anylist ::= anylist ANY.
1585154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
15868b471863Sdrh 
15878b471863Sdrh 
15888b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
15897d562dbeSdan %type wqlist {With*}
15904e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
15917d562dbeSdan 
1592a5746e03Sdrh with ::= .
15938b471863Sdrh %ifndef SQLITE_OMIT_CTE
1594a5746e03Sdrh with ::= WITH wqlist(W).              { sqlite3WithPush(pParse, W, 1); }
1595a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W).    { sqlite3WithPush(pParse, W, 1); }
15967d562dbeSdan 
1597108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1598cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
15997d562dbeSdan }
16004dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
16014dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
16028b471863Sdrh }
16038b471863Sdrh %endif  SQLITE_OMIT_CTE
160434a7d790Sdan 
160534a7d790Sdan //////////////////////// WINDOW FUNCTION EXPRESSIONS /////////////////////////
16066e2210e0Sdan // These must be at the end of this file. Specifically, the rules that
16076e2210e0Sdan // introduce tokens WINDOW, OVER and FILTER must appear last. This causes
16086e2210e0Sdan // the integer values assigned to these tokens to be larger than all other
16096e2210e0Sdan // tokens that may be output by the tokenizer except TK_SPACE and TK_ILLEGAL.
161034a7d790Sdan //
161134a7d790Sdan %ifndef SQLITE_OMIT_WINDOWFUNC
161234a7d790Sdan %type windowdefn_list {Window*}
1613a57aac26Sdrh %destructor windowdefn_list {sqlite3WindowListDelete(pParse->db, $$);}
161434a7d790Sdan windowdefn_list(A) ::= windowdefn(Z). { A = Z; }
161534a7d790Sdan windowdefn_list(A) ::= windowdefn_list(Y) COMMA windowdefn(Z). {
1616a57aac26Sdrh   assert( Z!=0 );
1617e7c9ca41Sdan   sqlite3WindowChain(pParse, Z, Y);
1618a57aac26Sdrh   Z->pNextWin = Y;
161934a7d790Sdan   A = Z;
162034a7d790Sdan }
162134a7d790Sdan 
162234a7d790Sdan %type windowdefn {Window*}
162334a7d790Sdan %destructor windowdefn {sqlite3WindowDelete(pParse->db, $$);}
1624e7c9ca41Sdan windowdefn(A) ::= nm(X) AS LP window(Y) RP. {
1625a57aac26Sdrh   if( ALWAYS(Y) ){
162634a7d790Sdan     Y->zName = sqlite3DbStrNDup(pParse->db, X.z, X.n);
162734a7d790Sdan   }
162834a7d790Sdan   A = Y;
162934a7d790Sdan }
163034a7d790Sdan 
163134a7d790Sdan %type window {Window*}
163234a7d790Sdan %destructor window {sqlite3WindowDelete(pParse->db, $$);}
163334a7d790Sdan 
163434a7d790Sdan %type frame_opt {Window*}
163534a7d790Sdan %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);}
163634a7d790Sdan 
163734a7d790Sdan %type part_opt {ExprList*}
163834a7d790Sdan %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);}
163934a7d790Sdan 
16406488271fSdan %type filter_clause {Expr*}
16416488271fSdan %destructor filter_clause {sqlite3ExprDelete(pParse->db, $$);}
16426488271fSdan 
16436488271fSdan %type over_clause {Window*}
16446488271fSdan %destructor over_clause {sqlite3WindowDelete(pParse->db, $$);}
164534a7d790Sdan 
16464f9adee2Sdan %type filter_over {Window*}
16474f9adee2Sdan %destructor filter_over {sqlite3WindowDelete(pParse->db, $$);}
16484f9adee2Sdan 
164934a7d790Sdan %type range_or_rows {int}
165034a7d790Sdan 
165134a7d790Sdan %type frame_bound {struct FrameBound}
165234a7d790Sdan %destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1653287fa17bSdan %type frame_bound_s {struct FrameBound}
1654287fa17bSdan %destructor frame_bound_s {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1655287fa17bSdan %type frame_bound_e {struct FrameBound}
1656287fa17bSdan %destructor frame_bound_e {sqlite3ExprDelete(pParse->db, $$.pExpr);}
165734a7d790Sdan 
1658e7c9ca41Sdan window(A) ::= PARTITION BY nexprlist(X) orderby_opt(Y) frame_opt(Z). {
1659e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, X, Y, 0);
1660e7c9ca41Sdan }
1661e7c9ca41Sdan window(A) ::= nm(W) PARTITION BY nexprlist(X) orderby_opt(Y) frame_opt(Z). {
1662e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, X, Y, &W);
1663e7c9ca41Sdan }
1664e7c9ca41Sdan window(A) ::= ORDER BY sortlist(Y) frame_opt(Z). {
1665e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, Y, 0);
1666e7c9ca41Sdan }
1667e7c9ca41Sdan window(A) ::= nm(W) ORDER BY sortlist(Y) frame_opt(Z). {
1668e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, Y, &W);
1669e7c9ca41Sdan }
1670e7c9ca41Sdan window(A) ::= frame_opt(Z). {
167134a7d790Sdan   A = Z;
167234a7d790Sdan }
1673e7c9ca41Sdan window(A) ::= nm(W) frame_opt(Z). {
1674e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, 0, &W);
167534a7d790Sdan }
167634a7d790Sdan 
167734a7d790Sdan frame_opt(A) ::= .                             {
1678d35300f9Sdan   A = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0);
167934a7d790Sdan }
1680d35300f9Sdan frame_opt(A) ::= range_or_rows(X) frame_bound_s(Y) frame_exclude_opt(Z). {
1681d35300f9Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0, Z);
168234a7d790Sdan }
16830f134f02Sdrh frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound_s(Y) AND
16840f134f02Sdrh                           frame_bound_e(Z) frame_exclude_opt(W). {
1685d35300f9Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr, W);
168634a7d790Sdan }
168734a7d790Sdan 
16880f134f02Sdrh range_or_rows(A) ::= RANGE|ROWS|GROUPS(X).   {A = @X; /*A-overwrites-X*/}
1689287fa17bSdan 
1690287fa17bSdan frame_bound_s(A) ::= frame_bound(X).         {A = X;}
16910f134f02Sdrh frame_bound_s(A) ::= UNBOUNDED(X) PRECEDING. {A.eType = @X; A.pExpr = 0;}
1692287fa17bSdan frame_bound_e(A) ::= frame_bound(X).         {A = X;}
16930f134f02Sdrh frame_bound_e(A) ::= UNBOUNDED(X) FOLLOWING. {A.eType = @X; A.pExpr = 0;}
1694287fa17bSdan 
16950f134f02Sdrh frame_bound(A) ::= expr(X) PRECEDING|FOLLOWING(Y).
16960f134f02Sdrh                                              {A.eType = @Y; A.pExpr = X;}
16970f134f02Sdrh frame_bound(A) ::= CURRENT(X) ROW.           {A.eType = @X; A.pExpr = 0;}
169834a7d790Sdan 
1699d35300f9Sdan %type frame_exclude_opt {u8}
17001e7cb19bSdan frame_exclude_opt(A) ::= . {A = 0;}
1701d35300f9Sdan frame_exclude_opt(A) ::= EXCLUDE frame_exclude(X). {A = X;}
1702d35300f9Sdan 
1703d35300f9Sdan %type frame_exclude {u8}
17040f134f02Sdrh frame_exclude(A) ::= NO(X) OTHERS.   {A = @X; /*A-overwrites-X*/}
17050f134f02Sdrh frame_exclude(A) ::= CURRENT(X) ROW. {A = @X; /*A-overwrites-X*/}
17060f134f02Sdrh frame_exclude(A) ::= GROUP|TIES(X).  {A = @X; /*A-overwrites-X*/}
1707d35300f9Sdan 
1708d35300f9Sdan 
1709550a3309Sdrh %type window_clause {Window*}
1710550a3309Sdrh %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);}
1711550a3309Sdrh window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; }
17126e2210e0Sdan 
17134f9adee2Sdan filter_over(A) ::= filter_clause(F) over_clause(O). {
17144f9adee2Sdan   O->pFilter = F;
17154f9adee2Sdan   A = O;
17166488271fSdan }
17174f9adee2Sdan filter_over(A) ::= over_clause(O). {
17184f9adee2Sdan   A = O;
17196488271fSdan }
17204f9adee2Sdan filter_over(A) ::= filter_clause(F). {
17214f9adee2Sdan   A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
17224f9adee2Sdan   if( A ){
17234f9adee2Sdan     A->eFrmType = TK_FILTER;
17244f9adee2Sdan     A->pFilter = F;
172500885742Sdan   }else{
172600885742Sdan     sqlite3ExprDelete(pParse->db, F);
17274f9adee2Sdan   }
17286488271fSdan }
17296488271fSdan 
17306488271fSdan over_clause(A) ::= OVER LP window(Z) RP. {
17316e2210e0Sdan   A = Z;
1732a57aac26Sdrh   assert( A!=0 );
1733a57aac26Sdrh }
17346488271fSdan over_clause(A) ::= OVER nm(Z). {
1735a57aac26Sdrh   A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
1736a57aac26Sdrh   if( A ){
1737a57aac26Sdrh     A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n);
1738a57aac26Sdrh   }
17396e2210e0Sdan }
17406e2210e0Sdan 
17416488271fSdan filter_clause(A) ::= FILTER LP WHERE expr(X) RP.  { A = X; }
1742c7bf5716Sdrh %endif /* SQLITE_OMIT_WINDOWFUNC */
1743f1722baaSdrh 
1744f1722baaSdrh /*
1745f1722baaSdrh ** The code generator needs some extra TK_ token values for tokens that
1746f1722baaSdrh ** are synthesized and do not actually appear in the grammar:
1747f1722baaSdrh */
1748f1722baaSdrh %token
1749f1722baaSdrh   COLUMN          /* Reference to a table column */
1750f1722baaSdrh   AGG_FUNCTION    /* An aggregate function */
1751f1722baaSdrh   AGG_COLUMN      /* An aggregated column */
1752ee6c5e5aSdan   TRUEFALSE       /* True or false keyword */
1753ee6c5e5aSdan   ISNOT           /* Combination of IS and NOT */
1754ee6c5e5aSdan   FUNCTION        /* A function invocation */
1755f1722baaSdrh   UMINUS          /* Unary minus */
1756f1722baaSdrh   UPLUS           /* Unary plus */
1757f1722baaSdrh   TRUTH           /* IS TRUE or IS FALSE or IS NOT TRUE or IS NOT FALSE */
1758f1722baaSdrh   REGISTER        /* Reference to a VDBE register */
1759f1722baaSdrh   VECTOR          /* Vector */
1760f1722baaSdrh   SELECT_COLUMN   /* Choose a single column from a multi-column SELECT */
1761f1722baaSdrh   IF_NULL_ROW     /* the if-null-row operator */
1762f1722baaSdrh   ASTERISK        /* The "*" in count(*) and similar */
1763f1722baaSdrh   SPAN            /* The span operator */
1764f1722baaSdrh .
1765f1722baaSdrh /* There must be no more than 255 tokens defined above.  If this grammar
1766f1722baaSdrh ** is extended with new rules and tokens, they must either be so few in
1767f1722baaSdrh ** number that TK_SPAN is no more than 255, or else the new tokens must
1768f1722baaSdrh ** appear after this line.
1769f1722baaSdrh */
1770f1722baaSdrh %include {
1771f1722baaSdrh #if TK_SPAN>255
1772f1722baaSdrh # error too many tokens in the grammar
1773f1722baaSdrh #endif
1774f1722baaSdrh }
1775f1722baaSdrh 
1776f1722baaSdrh /*
1777f1722baaSdrh ** The TK_SPACE and TK_ILLEGAL tokens must be the last two tokens.  The
1778f1722baaSdrh ** parser depends on this.  Those tokens are not used in any grammar rule.
1779f1722baaSdrh ** They are only used by the tokenizer.  Declare them last so that they
1780f1722baaSdrh ** are guaranteed to be the last two tokens
1781f1722baaSdrh */
1782f1722baaSdrh %token SPACE ILLEGAL.
1783