xref: /sqlite-3.40.0/src/parse.y (revision eda079cd)
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
1966a8700b9Sdrh // at the beginning, but also so that the comparison tokens NE through GE
1976a8700b9Sdrh // are as large as possible so that they are near to FUNCTION, which is a
1986a8700b9Sdrh // token synthesized by addopcodes.tcl.
1996a8700b9Sdrh //
2006a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST.
2016a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL.
2026a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2036a8700b9Sdrh %token GT LE LT GE ESCAPE.
2046a8700b9Sdrh 
20531d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
20631d6fd55Sdrh // fallback to ID if they will not parse as their original value.
20731d6fd55Sdrh // This obviates the need for the "id" nonterminal.
20831d6fd55Sdrh //
20931d6fd55Sdrh %fallback ID
21031d6fd55Sdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2110a6259f5Sdrh   CONFLICT DATABASE DEFERRED DESC DETACH DO
2126cd7d489Sdrh   EACH END EXCLUSIVE EXPLAIN FAIL FOR
21331d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
21486fb6e17Sdan   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS
21531d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
21631d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
21731d6fd55Sdrh   EXCEPT INTERSECT UNION
21831d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
2193773c25fSdrh %ifndef SQLITE_OMIT_WINDOWFUNC
2206e2210e0Sdan   CURRENT FOLLOWING PARTITION PRECEDING RANGE UNBOUNDED
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 }
3051be266baSdrh 
306487e262fSdrh // "carglist" is a list of additional constraints that come after the
307487e262fSdrh // column name and column type in a CREATE TABLE statement.
308487e262fSdrh //
3094dc330ddSdrh carglist ::= carglist ccons.
310348784efSdrh carglist ::= .
3114dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
3121be266baSdrh ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z).
3131be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A,Z);}
3141be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3151be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
3161be266baSdrh ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z).
3171be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z,Z);}
3181be266baSdrh ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z).      {
3191be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3201be266baSdrh   sqlite3AddDefaultValue(pParse,p,A.z,Z);
3217977a17fSdanielk1977 }
3221be266baSdrh ccons ::= DEFAULT scanpt id(X).       {
3231be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
324d7fd899eSdrh   if( p ){
325171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
32696acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
327d7fd899eSdrh   }
3281be266baSdrh     sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3297977a17fSdanielk1977 }
330348784efSdrh 
331382c0247Sdrh // In addition to the type name, we also care about the primary key and
332382c0247Sdrh // UNIQUE constraints.
333348784efSdrh //
3340d316a40Sdrh ccons ::= NULL onconf.
3354adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
336fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
337fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
33862340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
33962340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3401be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
341108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3424adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3434adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
34459ff4251Sdan ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
34504738cb9Sdrh 
346205f48e6Sdrh // The optional AUTOINCREMENT keyword
347205f48e6Sdrh %type autoinc {int}
348205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3492958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
350205f48e6Sdrh 
351c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
352c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
353c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
354c2eef3b3Sdrh // check fails.
35504738cb9Sdrh //
356c2eef3b3Sdrh %type refargs {int}
357fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3584dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
359c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
360c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
361c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
362c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
363c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
364c2eef3b3Sdrh %type refact {int}
365fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
366fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
367fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
368fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
369fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
370c2eef3b3Sdrh %type defer_subclause {int}
3711da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
372c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
373c2eef3b3Sdrh %type init_deferred_pred_opt {int}
374c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
375c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
376c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
377348784efSdrh 
37819a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3794dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
380ab35eaedSdrh conslist ::= conslist tconscomma tcons.
381ab35eaedSdrh conslist ::= tcons.
382ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
383ab35eaedSdrh tconscomma ::= .
384ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
385108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
386fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
387108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
38862340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
38962340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
390b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
3911be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
392108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
393108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3944adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3954adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
396c2eef3b3Sdrh }
397c2eef3b3Sdrh %type defer_subclause_opt {int}
398c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
3994dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
4009cfcf5d4Sdrh 
4019cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
4029cfcf5d4Sdrh // default behavior when there is a constraint conflict.
4039cfcf5d4Sdrh //
4049cfcf5d4Sdrh %type onconf {int}
4053334d089Sdrh %type orconf {int}
4061c92853dSdrh %type resolvetype {int}
4071c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4081c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4091c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4103334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4114dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4121c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4131c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
414348784efSdrh 
415382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
416348784efSdrh //
417a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
418a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
419a8858103Sdanielk1977 }
420a073384fSdrh %type ifexists {int}
421a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
422a073384fSdrh ifexists(A) ::= .            {A = 0;}
423348784efSdrh 
424a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
425a76b5dfcSdrh //
426b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
427108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4288981b904Sdrh           AS select(S). {
4298981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
430a76b5dfcSdrh }
431a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
432a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
433a76b5dfcSdrh }
434154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
435a76b5dfcSdrh 
436382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
437348784efSdrh //
4387d562dbeSdan cmd ::= select(X).  {
439edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4407d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
441633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4429bb61fe7Sdrh }
443efb7251dSdrh 
4449bb61fe7Sdrh %type select {Select*}
445633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4467d562dbeSdan %type selectnowith {Select*}
4477d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
44882c3d636Sdrh %type oneselect {Select*}
449633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4509bb61fe7Sdrh 
451772460fdSdrh %include {
452772460fdSdrh   /*
453772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
454772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
455772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
456772460fdSdrh   */
457e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
458d227a291Sdrh     if( p->pPrior ){
459772460fdSdrh       Select *pNext = 0, *pLoop;
460772460fdSdrh       int mxSelect, cnt = 0;
461d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
462d227a291Sdrh         pLoop->pNext = pNext;
463d227a291Sdrh         pLoop->selFlags |= SF_Compound;
464d227a291Sdrh       }
465772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
466772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
467772460fdSdrh         cnt>mxSelect
468a0c01768Sdrh       ){
469d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
470d227a291Sdrh       }
471d227a291Sdrh     }
472772460fdSdrh   }
473772460fdSdrh }
474772460fdSdrh 
4756a8b94e2Sdrh %ifndef SQLITE_OMIT_CTE
476a5746e03Sdrh select(A) ::= WITH wqlist(W) selectnowith(X). {
477772460fdSdrh   Select *p = X;
478772460fdSdrh   if( p ){
479772460fdSdrh     p->pWith = W;
480772460fdSdrh     parserDoubleLinkSelect(pParse, p);
481a9f5c13dSdan   }else{
482a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
483a9f5c13dSdan   }
484a5746e03Sdrh   A = p;
485a5746e03Sdrh }
486a5746e03Sdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X). {
487a5746e03Sdrh   Select *p = X;
488a5746e03Sdrh   if( p ){
489a5746e03Sdrh     p->pWith = W;
490a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
491a5746e03Sdrh   }else{
492a5746e03Sdrh     sqlite3WithDelete(pParse->db, W);
493a5746e03Sdrh   }
494a5746e03Sdrh   A = p;
495a5746e03Sdrh }
4966a8b94e2Sdrh %endif /* SQLITE_OMIT_CTE */
497a5746e03Sdrh select(A) ::= selectnowith(X). {
498a5746e03Sdrh   Select *p = X;
499a5746e03Sdrh   if( p ){
500a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
501a5746e03Sdrh   }
502a5746e03Sdrh   A = p; /*A-overwrites-X*/
503a9f5c13dSdan }
5047d562dbeSdan 
5054dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
506b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
5074dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
508c0bf493eSdrh   Select *pRhs = Z;
5094dd0d3f8Sdrh   Select *pLhs = A;
510c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
511c0bf493eSdrh     SrcList *pFrom;
512c0bf493eSdrh     Token x;
513c0bf493eSdrh     x.n = 0;
514772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
515c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
5168c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
517c0bf493eSdrh   }
518c0bf493eSdrh   if( pRhs ){
519c0bf493eSdrh     pRhs->op = (u8)Y;
52000d5ab74Sdrh     pRhs->pPrior = pLhs;
52100d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
522772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
523d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
52443b78826Sdrh   }else{
52500d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
526daffd0e5Sdrh   }
527c0bf493eSdrh   A = pRhs;
52882c3d636Sdrh }
5290a36c57eSdrh %type multiselect_op {int}
530cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5310a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
532cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
533154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
534550a3309Sdrh 
535fef37760Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
53667a9b8edSdan                  groupby_opt(P) having_opt(Q)
537e3bf632cSdan                  orderby_opt(Z) limit_opt(L). {
5388c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
539550a3309Sdrh }
540550a3309Sdrh %ifndef SQLITE_OMIT_WINDOWFUNC
541550a3309Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
542550a3309Sdrh                  groupby_opt(P) having_opt(Q) window_clause(R)
543550a3309Sdrh                  orderby_opt(Z) limit_opt(L). {
544550a3309Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
5456fde1799Sdan   if( A ){
5466fde1799Sdan     A->pWinDefn = R;
5476fde1799Sdan   }else{
5486fde1799Sdan     sqlite3WindowListDelete(pParse->db, R);
5496fde1799Sdan   }
5509bb61fe7Sdrh }
551550a3309Sdrh %endif
552550a3309Sdrh 
553550a3309Sdrh 
5544dd0d3f8Sdrh oneselect(A) ::= values(A).
55575593d96Sdrh 
55675593d96Sdrh %type values {Select*}
55775593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
55875593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5598c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
56075593d96Sdrh }
561954733b3Sdrh values(A) ::= values(A) COMMA LP nexprlist(Y) RP. {
5624dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5638c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
564f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
56575593d96Sdrh   if( pRight ){
56675593d96Sdrh     pRight->op = TK_ALL;
567772460fdSdrh     pRight->pPrior = pLeft;
56875593d96Sdrh     A = pRight;
56975593d96Sdrh   }else{
570772460fdSdrh     A = pLeft;
57175593d96Sdrh   }
57275593d96Sdrh }
5739bb61fe7Sdrh 
5749bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5759bb61fe7Sdrh // present and false (0) if it is not.
5769bb61fe7Sdrh //
5773334d089Sdrh %type distinct {int}
578832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5797cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
580efb7251dSdrh distinct(A) ::= .           {A = 0;}
581348784efSdrh 
5829bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5837c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5847c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5851a1d3cd2Sdrh // opcode of TK_ASTERISK.
5869bb61fe7Sdrh //
587348784efSdrh %type selcollist {ExprList*}
588633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
589348784efSdrh %type sclp {ExprList*}
590633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
5914dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
592348784efSdrh sclp(A) ::= .                                {A = 0;}
5931be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
5941be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
595b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
5961be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
59701f3f253Sdrh }
598d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
5991a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
6004dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
6017c917d19Sdrh }
6021be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
603abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
604abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
605abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
6064dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
60754473229Sdrh }
60801f3f253Sdrh 
60901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
61001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
61101f3f253Sdrh //
61201f3f253Sdrh %type as {Token}
6135ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
6144dd0d3f8Sdrh as(X) ::= ids(X).
615986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6169bb61fe7Sdrh 
617348784efSdrh 
618ad3cab52Sdrh %type seltablist {SrcList*}
619633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
620ad3cab52Sdrh %type stl_prefix {SrcList*}
621633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
622ad3cab52Sdrh %type from {SrcList*}
623633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
624348784efSdrh 
62501f3f253Sdrh // A complete FROM clause.
62601f3f253Sdrh //
62717435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
62861dfc31dSdrh from(A) ::= FROM seltablist(X). {
62961dfc31dSdrh   A = X;
63061dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
63161dfc31dSdrh }
63201f3f253Sdrh 
63301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
63401f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
63501f3f253Sdrh //
6364dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6378a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
63801f3f253Sdrh }
639348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6404dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
641e9240418Sdrh                   on_opt(N) using_opt(U). {
6424dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
643b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
64401f3f253Sdrh }
6454dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
64601d230ceSdrh                   on_opt(N) using_opt(U). {
6474dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
64801d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
64901d230ceSdrh }
65051522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6514dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
652b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6534dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
65422f70c32Sdrh   }
6554dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
656fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6574dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
658fbdc7f69Sdrh       A = F;
659832ee3d4Sdrh     }else if( F->nSrc==1 ){
6604dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
661832ee3d4Sdrh       if( A ){
662832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
663832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
664832ee3d4Sdrh         pNew->zName = pOld->zName;
665832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6663c449c6bSdrh         pNew->pSelect = pOld->pSelect;
667832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6683c449c6bSdrh         pOld->pSelect = 0;
669832ee3d4Sdrh       }
670832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
671fbdc7f69Sdrh     }else{
672fbdc7f69Sdrh       Select *pSubquery;
673fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6748c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6754dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
676fbdc7f69Sdrh     }
677fbdc7f69Sdrh   }
678154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
679b733d037Sdrh 
680113088ecSdrh %type dbnm {Token}
681113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
682113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
683113088ecSdrh 
68474ad7fe9Sdrh %type fullname {SrcList*}
685633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
686c9461eccSdan fullname(A) ::= nm(X).  {
687c9461eccSdan   A = sqlite3SrcListAppend(pParse->db,0,&X,0);
688c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &X);
689c9461eccSdan }
690c9461eccSdan fullname(A) ::= nm(X) DOT nm(Y). {
691c9461eccSdan   A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);
692c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &Y);
693c9461eccSdan }
69474ad7fe9Sdrh 
6955e3a6ebfSdrh %type xfullname {SrcList*}
6965e3a6ebfSdrh %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);}
6975e3a6ebfSdrh xfullname(A) ::= nm(X).
6985e3a6ebfSdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/}
6995e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y).
7005e3a6ebfSdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
7015e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z).  {
7025e3a6ebfSdrh    A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/
7035e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7045e3a6ebfSdrh }
7055e3a6ebfSdrh xfullname(A) ::= nm(X) AS nm(Z). {
7065e3a6ebfSdrh    A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/
7075e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7085e3a6ebfSdrh }
7095e3a6ebfSdrh 
71001f3f253Sdrh %type joinop {int}
711fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
712cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
713cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
714cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
715cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
7165ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
717cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
71801f3f253Sdrh 
71926cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a
72026cf56f8Sdrh // SELECT on the RHS of a the INSERT:
72126cf56f8Sdrh //
72226cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ...
72326cf56f8Sdrh //                                        here ----^^
72426cf56f8Sdrh //
72526cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is
72626cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON
72726cf56f8Sdrh // clause associated with the JOIN.  The conflict is resolved in favor
72826cf56f8Sdrh // of the JOIN.  If an ON CONFLICT clause is intended, insert a dummy
72926cf56f8Sdrh // WHERE clause in between, like this:
73026cf56f8Sdrh //
73126cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ...
73226cf56f8Sdrh //
73326cf56f8Sdrh // The [AND] and [OR] precedence marks in the rules for on_opt cause the
73426cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN.
73526cf56f8Sdrh //
73601f3f253Sdrh %type on_opt {Expr*}
737633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
7381be266baSdrh on_opt(N) ::= ON expr(E).  {N = E;}
73926cf56f8Sdrh on_opt(N) ::= .     [OR]   {N = 0;}
74001f3f253Sdrh 
74185574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
74285574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
74385574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
74485574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
74585574e31Sdanielk1977 // in the token.
74685574e31Sdanielk1977 //
74785574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
748b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
74985574e31Sdanielk1977 // recognizes and interprets this as a special case.
75085574e31Sdanielk1977 //
75185574e31Sdanielk1977 %type indexed_opt {Token}
75285574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
75385574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
75485574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
75585574e31Sdanielk1977 
75601f3f253Sdrh %type using_opt {IdList*}
757633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
75881eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
75901f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
76001f3f253Sdrh 
76101f3f253Sdrh 
762348784efSdrh %type orderby_opt {ExprList*}
763633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
764108aa00aSdrh 
765108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
766108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
767108aa00aSdrh // sort order.
768108aa00aSdrh //
769348784efSdrh %type sortlist {ExprList*}
770633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
771348784efSdrh 
772348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
773348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7744dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). {
7751be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
776bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
777348784efSdrh }
7788395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
7791be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
780bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
781348784efSdrh }
782348784efSdrh 
783348784efSdrh %type sortorder {int}
784348784efSdrh 
7858e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
7868e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
787bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
788348784efSdrh 
7892282792aSdrh %type groupby_opt {ExprList*}
790633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
7912282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
7929245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
7932282792aSdrh 
7942282792aSdrh %type having_opt {Expr*}
795633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
7962282792aSdrh having_opt(A) ::= .                {A = 0;}
7971be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
7982282792aSdrh 
7998c0833fbSdrh %type limit_opt {Expr*}
80015926590Sdrh 
80115926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
80215926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
80315926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
80415926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
80515926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
80615926590Sdrh // except as a transient.  So there is never anything to destroy.
80715926590Sdrh //
8088c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
8098c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
8108c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
8111be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
812a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
8131be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
814a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
8151be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
8169bbca4c1Sdrh 
817382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
818382c0247Sdrh //
819273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8205e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W)
821931577f1Sdrh         orderby_opt(O) limit_opt(L). {
822b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
8238c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
8244281bd42Sshane }
8254281bd42Sshane %endif
826273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8275e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W). {
8284281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8298c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
8304281bd42Sshane }
8314281bd42Sshane %endif
832348784efSdrh 
833348784efSdrh %type where_opt {Expr*}
834633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
835348784efSdrh 
836348784efSdrh where_opt(A) ::= .                    {A = 0;}
8371be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
838348784efSdrh 
839382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
840382c0247Sdrh //
841273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8425e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
8438b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
844b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
845b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
846eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L,0);
8474281bd42Sshane }
8484281bd42Sshane %endif
849273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8505e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
851e9240418Sdrh         where_opt(W).  {
8524281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8534281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
854eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0,0);
8554281bd42Sshane }
8564281bd42Sshane %endif
857348784efSdrh 
858f8db1bc0Sdrh %type setlist {ExprList*}
859633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
860f8db1bc0Sdrh 
8614dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8621be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
863b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
864b7916a78Sdrh }
865a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8661be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
867a1251bc4Sdrh }
868b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8691be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
870b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
871b7916a78Sdrh }
872a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
8731be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
874a1251bc4Sdrh }
875348784efSdrh 
876382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
877382c0247Sdrh //
8785e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) select(S)
8792c2e844aSdrh         upsert(U). {
88046d2e5c3Sdrh   sqlite3Insert(pParse, X, S, F, R, U);
8814e9119d9Sdan }
8825e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) DEFAULT VALUES.
8834e9119d9Sdan {
8842c2e844aSdrh   sqlite3Insert(pParse, X, 0, F, R, 0);
8854e9119d9Sdan }
886348784efSdrh 
88746d2e5c3Sdrh %type upsert {Upsert*}
88854514c98Sdrh 
88954514c98Sdrh // Because upsert only occurs at the tip end of the INSERT rule for cmd,
89054514c98Sdrh // there is never a case where the value of the upsert pointer will not
89154514c98Sdrh // be destroyed by the cmd action.  So comment-out the destructor to
89254514c98Sdrh // avoid unreachable code.
89354514c98Sdrh //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);}
89446d2e5c3Sdrh upsert(A) ::= . { A = 0; }
895e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW)
896dab0eb58Sdrh               DO UPDATE SET setlist(Z) where_opt(W).
897e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W);}
898e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING.
899e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,0,0); }
900e9c2e772Sdrh upsert(A) ::= ON CONFLICT DO NOTHING.
901e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,0,0,0,0); }
90226cf56f8Sdrh 
9033334d089Sdrh %type insert_cmd {int}
904fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
905fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
906fa86c412Sdrh 
9078981b904Sdrh %type idlist_opt {IdList*}
9088981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
90981eba73eSdrh %type idlist {IdList*}
91081eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
911348784efSdrh 
9128981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
9138981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
9144dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
9155496d6a2Sdan     {A = sqlite3IdListAppend(pParse,A,&Y);}
91681eba73eSdrh idlist(A) ::= nm(Y).
9175496d6a2Sdan     {A = sqlite3IdListAppend(pParse,0,&Y); /*A-overwrites-Y*/}
918348784efSdrh 
919382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
920382c0247Sdrh //
921348784efSdrh 
9221be266baSdrh %type expr {Expr*}
9231be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
9241be266baSdrh %type term {Expr*}
9251be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
926b7916a78Sdrh 
927b7916a78Sdrh %include {
928b7916a78Sdrh 
929b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
930b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
931b7916a78Sdrh   ** that created the expression.
932b7916a78Sdrh   */
9331be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
9340cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
9350cd874bdSdrh     if( p ){
936d145e5f4Sdan       /* memset(p, 0, sizeof(Expr)); */
9370cd874bdSdrh       p->op = (u8)op;
938d145e5f4Sdan       p->affinity = 0;
9390cd874bdSdrh       p->flags = EP_Leaf;
9400cd874bdSdrh       p->iAgg = -1;
941d145e5f4Sdan       p->pLeft = p->pRight = 0;
942d145e5f4Sdan       p->x.pList = 0;
943d145e5f4Sdan       p->pAggInfo = 0;
944*eda079cdSdrh       p->y.pTab = 0;
945d145e5f4Sdan       p->op2 = 0;
9464fe759b2Sdrh       p->iTable = 0;
947d3130dabSdrh       p->iColumn = 0;
9480cd874bdSdrh       p->u.zToken = (char*)&p[1];
9490cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
9500cd874bdSdrh       p->u.zToken[t.n] = 0;
9510cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
9520cd874bdSdrh         if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted;
9530cd874bdSdrh         sqlite3Dequote(p->u.zToken);
9540cd874bdSdrh       }
9550cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
9560cd874bdSdrh       p->nHeight = 1;
9570cd874bdSdrh #endif
958c9461eccSdan       if( IN_RENAME_OBJECT ){
95907e95233Sdan         return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t);
960d145e5f4Sdan       }
9610cd874bdSdrh     }
9621be266baSdrh     return p;
963b7916a78Sdrh   }
964d145e5f4Sdan 
965b7916a78Sdrh }
966348784efSdrh 
9674dd0d3f8Sdrh expr(A) ::= term(A).
9681be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
9691be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9701be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9715ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
972410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
973410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
974c9461eccSdan   if( IN_RENAME_OBJECT ){
975c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp2, &Y);
976c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp1, &X);
977c9461eccSdan   }
9781be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
979e1b6a5b8Sdrh }
980d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
981410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
982410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
983410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
984abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
985c9461eccSdan   if( IN_RENAME_OBJECT ){
986c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp3, &Z);
987c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp2, &Y);
988c9461eccSdan   }
9891be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
990d24cc427Sdrh }
9911be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9921be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9930cd874bdSdrh term(A) ::= INTEGER(X). {
9941be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
9950cd874bdSdrh }
996f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
9978679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
998de25a88cSdrh     u32 n = X.n;
9991be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
10001be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
10018f3b137fSdrh   }else{
1002b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
1003b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
1004b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
10058f3b137fSdrh     Token t = X; /*A-overwrites-X*/
10068f3b137fSdrh     assert( t.n>=2 );
1007b7916a78Sdrh     if( pParse->nested==0 ){
100843303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
10091be266baSdrh       A = 0;
1010b7916a78Sdrh     }else{
10111be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
10121be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
1013b7916a78Sdrh     }
1014f59b12fbSdrh   }
1015895d7472Sdrh }
101659ff4251Sdan expr(A) ::= expr(A) COLLATE ids(C). {
10171be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
10188b4c40d8Sdrh }
1019487e262fSdrh %ifndef SQLITE_OMIT_CAST
10201be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
10211be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
10221be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
1023487e262fSdrh }
1024154d4b24Sdrh %endif  SQLITE_OMIT_CAST
1025550a3309Sdrh 
1026550a3309Sdrh 
1027550a3309Sdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
1028954733b3Sdrh   A = sqlite3ExprFunction(pParse, Y, &X, D);
1029550a3309Sdrh }
1030550a3309Sdrh expr(A) ::= id(X) LP STAR RP. {
1031954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
1032550a3309Sdrh }
1033550a3309Sdrh 
103467a9b8edSdan %ifndef SQLITE_OMIT_WINDOWFUNC
1035550a3309Sdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP over_clause(Z). {
1036954733b3Sdrh   A = sqlite3ExprFunction(pParse, Y, &X, D);
1037e33f6e7cSdan   sqlite3WindowAttach(pParse, A, Z);
1038e1b6a5b8Sdrh }
1039550a3309Sdrh expr(A) ::= id(X) LP STAR RP over_clause(Z). {
1040954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
1041b6e9f7a4Sdan   sqlite3WindowAttach(pParse, A, Z);
1042e1b6a5b8Sdrh }
1043550a3309Sdrh %endif
1044550a3309Sdrh 
1045b71090fdSdrh term(A) ::= CTIME_KW(OP). {
1046954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &OP, 0);
1047b7916a78Sdrh }
1048b7916a78Sdrh 
10491be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
10501be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
10511be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
10521be266baSdrh   if( A ){
10531be266baSdrh     A->x.pList = pList;
10548bd0d58eSdrh   }else{
10558bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
105671c57db0Sdan   }
105771c57db0Sdan }
105871c57db0Sdan 
10591be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y).    {A=sqlite3PExpr(pParse,@OP,A,Y);}
10601be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
10614dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
10621be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10631be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
10644dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
10651be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10664dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
10671be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10684dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
10691be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10701be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
1071410c301fSdrh %type likeop {Token}
10727e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
1073410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
10744dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
10758aa34ae0Sdrh   ExprList *pList;
1076410c301fSdrh   int bNot = OP.n & 0x80000000;
1077410c301fSdrh   OP.n &= 0x7fffffff;
10781be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
10791be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
1080954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
10811be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
10821be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
10830ac65892Sdrh }
10844dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
10851dca1458Sdrh   ExprList *pList;
1086410c301fSdrh   int bNot = OP.n & 0x80000000;
1087410c301fSdrh   OP.n &= 0x7fffffff;
10881be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
10891be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
10901be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
1091954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
10921be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
10931be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
10941dca1458Sdrh }
10957c6303c0Sdanielk1977 
10961be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
10971be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
10986a2fe093Sdrh 
10996a51741dSdrh %include {
11006a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
11016a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
11026a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
11036a51741dSdrh     sqlite3 *db = pParse->db;
1104c50f75dfSdan     if( pA && pY && pY->op==TK_NULL && !IN_RENAME_OBJECT ){
11055e17e8b7Sshaneh       pA->op = (u8)op;
11066a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
11076a51741dSdrh       pA->pRight = 0;
11086a51741dSdrh     }
11096a51741dSdrh   }
11106a51741dSdrh }
11116a51741dSdrh 
11126a2fe093Sdrh //    expr1 IS expr2
11136a2fe093Sdrh //    expr1 IS NOT expr2
11146a2fe093Sdrh //
11156a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
11166a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
11176a2fe093Sdrh //
11184dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
11191be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
11201be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
11216a2fe093Sdrh }
11224dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
11231be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
11241be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
11256a2fe093Sdrh }
1126b7916a78Sdrh 
112743303de9Sdrh expr(A) ::= NOT(B) expr(X).
11281be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
112943303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
11301be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
1131ca5aa594Sdrh expr(A) ::= PLUS|MINUS(B) expr(X). [BITNOT] {
1132ca5aa594Sdrh   A = sqlite3PExpr(pParse, @B==TK_PLUS ? TK_UPLUS : TK_UMINUS, X, 0);
1133ca5aa594Sdrh   /*A-overwrites-B*/
1134ca5aa594Sdrh }
1135b7916a78Sdrh 
11362e3a1f16Sdrh %type between_op {int}
11372e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
11382e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
11394dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
11401be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
11411be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
11421be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
11431be266baSdrh   if( A ){
11441be266baSdrh     A->x.pList = pList;
114553f733c7Sdrh   }else{
1146633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
114753f733c7Sdrh   }
11481be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1149fef5208cSdrh }
11503e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
11512e3a1f16Sdrh   %type in_op {int}
11522e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
11532e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
11541be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1155094430ebSdrh     if( Y==0 ){
1156473c1bf2Sdan       /* Expressions of the form
1157473c1bf2Sdan       **
1158473c1bf2Sdan       **      expr1 IN ()
1159473c1bf2Sdan       **      expr1 NOT IN ()
1160473c1bf2Sdan       **
1161473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1162473c1bf2Sdan       ** regardless of the value of expr1.
1163473c1bf2Sdan       */
11641be266baSdrh       sqlite3ExprDelete(pParse->db, A);
11651be266baSdrh       A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1);
11662b59b3a4Sdrh     }else if( Y->nExpr==1 ){
11672b59b3a4Sdrh       /* Expressions of the form:
11682b59b3a4Sdrh       **
11692b59b3a4Sdrh       **      expr1 IN (?1)
11702b59b3a4Sdrh       **      expr1 NOT IN (?2)
11712b59b3a4Sdrh       **
1172fbb24d10Sdrh       ** with exactly one value on the RHS can be simplified to something
1173fbb24d10Sdrh       ** like this:
11742b59b3a4Sdrh       **
1175fbb24d10Sdrh       **      expr1 == ?1
1176fbb24d10Sdrh       **      expr1 <> ?2
1177fbb24d10Sdrh       **
1178fbb24d10Sdrh       ** But, the RHS of the == or <> is marked with the EP_Generic flag
1179fbb24d10Sdrh       ** so that it may not contribute to the computation of comparison
1180fbb24d10Sdrh       ** affinity or the collating sequence to use for comparison.  Otherwise,
1181fbb24d10Sdrh       ** the semantics would be subtly different from IN or NOT IN.
11822b59b3a4Sdrh       */
1183fbb24d10Sdrh       Expr *pRHS = Y->a[0].pExpr;
11842b59b3a4Sdrh       Y->a[0].pExpr = 0;
11852b59b3a4Sdrh       sqlite3ExprListDelete(pParse->db, Y);
11865b1420e0Sdrh       /* pRHS cannot be NULL because a malloc error would have been detected
11875b1420e0Sdrh       ** before now and control would have never reached this point */
11885b1420e0Sdrh       if( ALWAYS(pRHS) ){
1189fbb24d10Sdrh         pRHS->flags &= ~EP_Collate;
1190fbb24d10Sdrh         pRHS->flags |= EP_Generic;
1191fbb24d10Sdrh       }
11921be266baSdrh       A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS);
1193094430ebSdrh     }else{
11941be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
11951be266baSdrh       if( A ){
11961be266baSdrh         A->x.pList = Y;
11971be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1198d5d56523Sdanielk1977       }else{
1199633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1200d5d56523Sdanielk1977       }
12011be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1202094430ebSdrh     }
1203fef5208cSdrh   }
12041be266baSdrh   expr(A) ::= LP select(X) RP. {
12051be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
12061be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
120751522cd3Sdrh   }
12081be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
12091be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12101be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
12111be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1212fef5208cSdrh   }
12135fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
121417435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
12158c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
12169de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
12171be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12181be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
12191be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
122023b2db23Sdrh   }
12211be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
122243303de9Sdrh     Expr *p;
12231be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
122408de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
122551522cd3Sdrh   }
1226154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1227fef5208cSdrh 
122817a7f8ddSdrh /* CASE expressions */
12291be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
12301be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
12311be266baSdrh   if( A ){
12321be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
12331be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
123453f733c7Sdrh   }else{
1235633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1236c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
123753f733c7Sdrh   }
123817a7f8ddSdrh }
123917a7f8ddSdrh %type case_exprlist {ExprList*}
1240633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12414dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
12421be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
12431be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
124417a7f8ddSdrh }
124517a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
12461be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
12471be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
124817a7f8ddSdrh }
124917a7f8ddSdrh %type case_else {Expr*}
1250633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
12511be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
125217a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
125317a7f8ddSdrh %type case_operand {Expr*}
1254633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
12551be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
125617a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1257348784efSdrh 
1258348784efSdrh %type exprlist {ExprList*}
1259633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12609245c243Sdrh %type nexprlist {ExprList*}
1261633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1262348784efSdrh 
12634dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
12649245c243Sdrh exprlist(A) ::= .                            {A = 0;}
12654dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
12661be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
126717435752Sdrh nexprlist(A) ::= expr(Y).
12681be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
12699245c243Sdrh 
1270a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
12715fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
12725fbab882Sdrh ** of parenthesis */
12735fbab882Sdrh %type paren_exprlist {ExprList*}
12745fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12755fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
12765fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1277a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
12785fbab882Sdrh 
1279cce7d176Sdrh 
1280382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1281382c0247Sdrh //
1282d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1283108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
128417435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
128517435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
128662340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
1287c9461eccSdan   if( IN_RENAME_OBJECT && pParse->pNewIndex ){
1288c9461eccSdan     sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &Y);
1289c9461eccSdan   }
12909cfcf5d4Sdrh }
1291717e6402Sdrh 
1292717e6402Sdrh %type uniqueflag {int}
12939cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
12949cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1295348784efSdrh 
1296348784efSdrh 
1297108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1298108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1299108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1300108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1301108aa00aSdrh //
1302108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1303108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1304108aa00aSdrh //
1305108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1306108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1307108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1308108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1309108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1310108aa00aSdrh // historical schemas.
1311108aa00aSdrh //
1312108aa00aSdrh %type eidlist {ExprList*}
1313108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1314108aa00aSdrh %type eidlist_opt {ExprList*}
1315108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1316108aa00aSdrh 
1317108aa00aSdrh %include {
1318108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1319108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1320108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1321108aa00aSdrh   ** error while parsing a legacy schema.
1322108aa00aSdrh   */
1323108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1324108aa00aSdrh     Parse *pParse,
1325108aa00aSdrh     ExprList *pPrior,
1326108aa00aSdrh     Token *pIdToken,
1327108aa00aSdrh     int hasCollate,
1328108aa00aSdrh     int sortOrder
1329108aa00aSdrh   ){
1330108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1331108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1332108aa00aSdrh         && pParse->db->init.busy==0
1333108aa00aSdrh     ){
1334108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1335108aa00aSdrh                          pIdToken->n, pIdToken->z);
13360202b29eSdanielk1977     }
1337108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1338108aa00aSdrh     return p;
1339108aa00aSdrh   }
1340108aa00aSdrh } // end %include
1341108aa00aSdrh 
1342108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1343108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
13444dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
13454dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1346108aa00aSdrh }
1347108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1348cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
13490202b29eSdanielk1977 }
13500202b29eSdanielk1977 
1351108aa00aSdrh %type collate {int}
1352108aa00aSdrh collate(C) ::= .              {C = 0;}
135359ff4251Sdan collate(C) ::= COLLATE ids.   {C = 1;}
1354a34001c9Sdrh 
1355348784efSdrh 
13568aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1357382c0247Sdrh //
13584d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1359982cef7eSdrh 
1360382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1361382c0247Sdrh //
1362154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1363fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
13649ef5e770Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
13659ef5e770Sdrh cmd ::= VACUUM nm(X).          {sqlite3Vacuum(pParse,&X);}
1366fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1367154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1368f57b14a6Sdrh 
1369382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1370382c0247Sdrh //
137113d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
137291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1373ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1374ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1375ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1376ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1377ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1378ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1379ada2ee0dSdrh 
1380cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1381cf82f0d3Sdrh nmnum(A) ::= nm(A).
1382cf82f0d3Sdrh nmnum(A) ::= ON(A).
1383cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1384cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1385154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1386f59b12fbSdrh %token_class number INTEGER|FLOAT.
13878395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1388cf82f0d3Sdrh plus_num(A) ::= number(A).
1389f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1390c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1391f0f258b1Sdrh 
1392b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1393b7f9164eSdrh 
1394d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
13954b59ab5eSdrh   Token all;
13964b59ab5eSdrh   all.z = A.z;
1397b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
13984adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1399f0f258b1Sdrh }
1400f0f258b1Sdrh 
1401fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1402fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
140360218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
140460218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1405cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1406c3f9bad2Sdanielk1977 }
1407c3f9bad2Sdanielk1977 
1408c3f9bad2Sdanielk1977 %type trigger_time {int}
14096559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1410c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1411c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1412c3f9bad2Sdanielk1977 
1413ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1414633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1415cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1416cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
141781eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1418c3f9bad2Sdanielk1977 
141960218d2aSdrh foreach_clause ::= .
142060218d2aSdrh foreach_clause ::= FOR EACH ROW.
1421c3f9bad2Sdanielk1977 
1422c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1423633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1424c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
14251be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1426c3f9bad2Sdanielk1977 
1427c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1428633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
14294dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
14304dd0d3f8Sdrh   assert( A!=0 );
14314dd0d3f8Sdrh   A->pLast->pNext = X;
14324dd0d3f8Sdrh   A->pLast = X;
1433a69d9168Sdrh }
14344dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
14354dd0d3f8Sdrh   assert( A!=0 );
14364dd0d3f8Sdrh   A->pLast = A;
143781238966Sdrh }
1438c3f9bad2Sdanielk1977 
1439b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1440b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1441b1819a0bSdrh // the same database as the table that the trigger fires on.
1442b1819a0bSdrh //
1443b1819a0bSdrh %type trnm {Token}
14444dd0d3f8Sdrh trnm(A) ::= nm(A).
1445b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1446b1819a0bSdrh   A = X;
1447b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1448b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1449b1819a0bSdrh         "statements within triggers");
1450b1819a0bSdrh }
1451b1819a0bSdrh 
1452b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1453b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1454b1819a0bSdrh // since it is an exception to the default grammar rules.
1455b1819a0bSdrh //
1456b1819a0bSdrh tridxby ::= .
1457b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1458b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1459b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1460b1819a0bSdrh         "within triggers");
1461b1819a0bSdrh }
1462b1819a0bSdrh tridxby ::= NOT INDEXED. {
1463b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1464b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1465b1819a0bSdrh         "within triggers");
1466b1819a0bSdrh }
1467b1819a0bSdrh 
1468b1819a0bSdrh 
1469b1819a0bSdrh 
1470c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1471633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1472c3f9bad2Sdanielk1977 // UPDATE
1473b1819a0bSdrh trigger_cmd(A) ::=
1474f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
14755be60c55Sdan    {A = sqlite3TriggerUpdateStep(pParse, &X, Y, Z, R, B.z, E);}
1476c3f9bad2Sdanielk1977 
1477c3f9bad2Sdanielk1977 // INSERT
1478f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
14792c2e844aSdrh                       trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). {
14805be60c55Sdan    A = sqlite3TriggerInsertStep(pParse,&X,F,S,R,U,B,Z);/*A-overwrites-R*/
14812c2e844aSdrh }
1482c3f9bad2Sdanielk1977 // DELETE
1483f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
14845be60c55Sdan    {A = sqlite3TriggerDeleteStep(pParse, &X, Y, B.z, E);}
1485c3f9bad2Sdanielk1977 
1486c3f9bad2Sdanielk1977 // SELECT
1487f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1488f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1489c3f9bad2Sdanielk1977 
14906f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
14911be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
14921be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
14931be266baSdrh   if( A ){
14941be266baSdrh     A->affinity = OE_Ignore;
14954b59ab5eSdrh   }
14968aa34ae0Sdrh }
14971be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
14981be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
14991be266baSdrh   if( A ) {
15001be266baSdrh     A->affinity = (char)T;
15014b59ab5eSdrh   }
15028aa34ae0Sdrh }
1503154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1504b7f9164eSdrh 
150574ad7fe9Sdrh %type raisetype {int}
150674ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
150774ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
150874ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
150974ad7fe9Sdrh 
15106f34903eSdanielk1977 
1511c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1512b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1513fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1514fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1515c3f9bad2Sdanielk1977 }
1516154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1517113088ecSdrh 
1518113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1519fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1520f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
15211be266baSdrh   sqlite3Attach(pParse, F, D, K);
15221c2d8414Sdrh }
1523fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
15241be266baSdrh   sqlite3Detach(pParse, D);
1525fdbcdee5Sdrh }
1526fdbcdee5Sdrh 
1527f744bb56Sdanielk1977 %type key_opt {Expr*}
1528633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1529f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
15301be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1531113088ecSdrh 
1532113088ecSdrh database_kw_opt ::= DATABASE.
1533113088ecSdrh database_kw_opt ::= .
1534fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
15354343fea2Sdrh 
15364343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
15374343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
15384343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
15394343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1540154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
15419fd2a9a0Sdanielk1977 
15429f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
15439f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
15449f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
15459f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
15469f18e8a0Sdrh %endif
15479f18e8a0Sdrh 
15489fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
15499fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
15509fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
15519fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
15529fd2a9a0Sdanielk1977 }
1553986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1554986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1555986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
155619a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
155719a8e7e8Sdanielk1977 }
155819a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
15594a642b60Sdrh   disableLookaside(pParse);
156019a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
156119a8e7e8Sdanielk1977 }
1562cf8f2895Sdan cmd ::= ALTER TABLE fullname(X) RENAME kwcolumn_opt nm(Y) TO nm(Z). {
1563cf8f2895Sdan   sqlite3AlterRenameColumn(pParse, X, &Y, &Z);
1564cf8f2895Sdan }
1565cf8f2895Sdan 
156619a8e7e8Sdanielk1977 kwcolumn_opt ::= .
156719a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1568cf8f2895Sdan 
1569154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1570e09daa90Sdrh 
1571e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1572e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1573b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1574b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1575b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1576b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1577b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1578b9bb7c18Sdrh }
1579e09daa90Sdrh vtabarglist ::= vtabarg.
1580e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1581b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1582b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1583b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1584b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1585b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1586b9bb7c18Sdrh anylist ::= .
1587aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1588aaac8b4eSdrh anylist ::= anylist ANY.
1589154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
15908b471863Sdrh 
15918b471863Sdrh 
15928b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
15937d562dbeSdan %type wqlist {With*}
15944e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
15957d562dbeSdan 
1596a5746e03Sdrh with ::= .
15978b471863Sdrh %ifndef SQLITE_OMIT_CTE
1598a5746e03Sdrh with ::= WITH wqlist(W).              { sqlite3WithPush(pParse, W, 1); }
1599a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W).    { sqlite3WithPush(pParse, W, 1); }
16007d562dbeSdan 
1601108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1602cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
16037d562dbeSdan }
16044dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
16054dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
16068b471863Sdrh }
16078b471863Sdrh %endif  SQLITE_OMIT_CTE
160834a7d790Sdan 
160934a7d790Sdan //////////////////////// WINDOW FUNCTION EXPRESSIONS /////////////////////////
16106e2210e0Sdan // These must be at the end of this file. Specifically, the rules that
16116e2210e0Sdan // introduce tokens WINDOW, OVER and FILTER must appear last. This causes
16126e2210e0Sdan // the integer values assigned to these tokens to be larger than all other
16136e2210e0Sdan // tokens that may be output by the tokenizer except TK_SPACE and TK_ILLEGAL.
161434a7d790Sdan //
161534a7d790Sdan %ifndef SQLITE_OMIT_WINDOWFUNC
161634a7d790Sdan %type windowdefn_list {Window*}
1617a57aac26Sdrh %destructor windowdefn_list {sqlite3WindowListDelete(pParse->db, $$);}
161834a7d790Sdan windowdefn_list(A) ::= windowdefn(Z). { A = Z; }
161934a7d790Sdan windowdefn_list(A) ::= windowdefn_list(Y) COMMA windowdefn(Z). {
1620a57aac26Sdrh   assert( Z!=0 );
1621a57aac26Sdrh   Z->pNextWin = Y;
162234a7d790Sdan   A = Z;
162334a7d790Sdan }
162434a7d790Sdan 
162534a7d790Sdan %type windowdefn {Window*}
162634a7d790Sdan %destructor windowdefn {sqlite3WindowDelete(pParse->db, $$);}
162734a7d790Sdan windowdefn(A) ::= nm(X) AS window(Y). {
1628a57aac26Sdrh   if( ALWAYS(Y) ){
162934a7d790Sdan     Y->zName = sqlite3DbStrNDup(pParse->db, X.z, X.n);
163034a7d790Sdan   }
163134a7d790Sdan   A = Y;
163234a7d790Sdan }
163334a7d790Sdan 
163434a7d790Sdan %type window {Window*}
163534a7d790Sdan %destructor window {sqlite3WindowDelete(pParse->db, $$);}
163634a7d790Sdan 
163734a7d790Sdan %type frame_opt {Window*}
163834a7d790Sdan %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);}
163934a7d790Sdan 
164034a7d790Sdan %type part_opt {ExprList*}
164134a7d790Sdan %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);}
164234a7d790Sdan 
164334a7d790Sdan %type filter_opt {Expr*}
164434a7d790Sdan %destructor filter_opt {sqlite3ExprDelete(pParse->db, $$);}
164534a7d790Sdan 
164634a7d790Sdan %type range_or_rows {int}
164734a7d790Sdan 
164834a7d790Sdan %type frame_bound {struct FrameBound}
164934a7d790Sdan %destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1650287fa17bSdan %type frame_bound_s {struct FrameBound}
1651287fa17bSdan %destructor frame_bound_s {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1652287fa17bSdan %type frame_bound_e {struct FrameBound}
1653287fa17bSdan %destructor frame_bound_e {sqlite3ExprDelete(pParse->db, $$.pExpr);}
165434a7d790Sdan 
165534a7d790Sdan window(A) ::= LP part_opt(X) orderby_opt(Y) frame_opt(Z) RP. {
165634a7d790Sdan   A = Z;
1657a57aac26Sdrh   if( ALWAYS(A) ){
165834a7d790Sdan     A->pPartition = X;
165934a7d790Sdan     A->pOrderBy = Y;
166034a7d790Sdan   }
166134a7d790Sdan }
166234a7d790Sdan 
1663954733b3Sdrh part_opt(A) ::= PARTITION BY nexprlist(X). { A = X; }
166434a7d790Sdan part_opt(A) ::= .                          { A = 0; }
166534a7d790Sdan 
166634a7d790Sdan frame_opt(A) ::= .                             {
166734a7d790Sdan   A = sqlite3WindowAlloc(pParse, TK_RANGE, TK_UNBOUNDED, 0, TK_CURRENT, 0);
166834a7d790Sdan }
1669287fa17bSdan frame_opt(A) ::= range_or_rows(X) frame_bound_s(Y). {
167034a7d790Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0);
167134a7d790Sdan }
1672287fa17bSdan frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound_s(Y) AND frame_bound_e(Z). {
167334a7d790Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr);
167434a7d790Sdan }
167534a7d790Sdan 
167634a7d790Sdan range_or_rows(A) ::= RANGE.   { A = TK_RANGE; }
167734a7d790Sdan range_or_rows(A) ::= ROWS.    { A = TK_ROWS;  }
167834a7d790Sdan 
1679287fa17bSdan 
1680287fa17bSdan frame_bound_s(A) ::= frame_bound(X). { A = X; }
1681287fa17bSdan frame_bound_s(A) ::= UNBOUNDED PRECEDING. {A.eType = TK_UNBOUNDED; A.pExpr = 0;}
1682287fa17bSdan frame_bound_e(A) ::= frame_bound(X). { A = X; }
1683287fa17bSdan frame_bound_e(A) ::= UNBOUNDED FOLLOWING. {A.eType = TK_UNBOUNDED; A.pExpr = 0;}
1684287fa17bSdan 
168534a7d790Sdan frame_bound(A) ::= expr(X) PRECEDING.   { A.eType = TK_PRECEDING; A.pExpr = X; }
168634a7d790Sdan frame_bound(A) ::= CURRENT ROW.         { A.eType = TK_CURRENT  ; A.pExpr = 0; }
168734a7d790Sdan frame_bound(A) ::= expr(X) FOLLOWING.   { A.eType = TK_FOLLOWING; A.pExpr = X; }
168834a7d790Sdan 
1689550a3309Sdrh %type window_clause {Window*}
1690550a3309Sdrh %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);}
1691550a3309Sdrh window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; }
16926e2210e0Sdan 
1693550a3309Sdrh %type over_clause {Window*}
1694550a3309Sdrh %destructor over_clause {sqlite3WindowDelete(pParse->db, $$);}
1695550a3309Sdrh over_clause(A) ::= filter_opt(W) OVER window(Z). {
16966e2210e0Sdan   A = Z;
1697a57aac26Sdrh   assert( A!=0 );
1698a57aac26Sdrh   A->pFilter = W;
1699a57aac26Sdrh }
1700550a3309Sdrh over_clause(A) ::= filter_opt(W) OVER nm(Z). {
1701a57aac26Sdrh   A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
1702a57aac26Sdrh   if( A ){
1703a57aac26Sdrh     A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n);
1704a57aac26Sdrh     A->pFilter = W;
1705a57aac26Sdrh   }else{
1706a57aac26Sdrh     sqlite3ExprDelete(pParse->db, W);
1707a57aac26Sdrh   }
17086e2210e0Sdan }
17096e2210e0Sdan 
17106e2210e0Sdan filter_opt(A) ::= .                            { A = 0; }
17116e2210e0Sdan filter_opt(A) ::= FILTER LP WHERE expr(X) RP.  { A = X; }
1712c7bf5716Sdrh %endif /* SQLITE_OMIT_WINDOWFUNC */
1713