xref: /sqlite-3.40.0/src/parse.y (revision e7375bfa)
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){
10931f69626Sdrh   sqlite3 *db = pParse->db;
1104a642b60Sdrh   pParse->disableLookaside++;
11131f69626Sdrh   DisableLookaside;
1124a642b60Sdrh }
1134a642b60Sdrh 
114caec2f12Sdrh } // end %include
115348784efSdrh 
116826fb5a3Sdrh // Input is a single SQL command
117c4a3c779Sdrh input ::= cmdlist.
118094b2bbfSdrh cmdlist ::= cmdlist ecmd.
119826fb5a3Sdrh cmdlist ::= ecmd.
120b7f9164eSdrh ecmd ::= SEMI.
1212424aa72Sdrh ecmd ::= cmdx SEMI.
122b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
123e94006ebSdrh ecmd ::= explain cmdx SEMI.       {NEVER-REDUCE}
1248549d55eSdrh explain ::= EXPLAIN.              { pParse->explain = 1; }
1258549d55eSdrh explain ::= EXPLAIN QUERY PLAN.   { pParse->explain = 2; }
126154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
127200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
128348784efSdrh 
129382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
130c4a3c779Sdrh //
131fa86c412Sdrh 
132684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
133c4a3c779Sdrh trans_opt ::= .
134c4a3c779Sdrh trans_opt ::= TRANSACTION.
1355ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
136684917c2Sdrh %type transtype {int}
137684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
138cf82f0d3Sdrh transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
139cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
140cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
14107a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt.   {sqlite3EndTransaction(pParse,@X);}
14207a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt.     {sqlite3EndTransaction(pParse,@X);}
143c4a3c779Sdrh 
144fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
145fd7f0452Sdanielk1977 savepoint_opt ::= .
146fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
147fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
148fd7f0452Sdanielk1977 }
149fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
150fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
151fd7f0452Sdanielk1977 }
152fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
153fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
154fd7f0452Sdanielk1977 }
155fd7f0452Sdanielk1977 
156382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
157348784efSdrh //
158348784efSdrh cmd ::= create_table create_table_args.
159d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
160f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
161969fa7c1Sdrh }
162dabd04c6Sdrh createkw(A) ::= CREATE(A).  {disableLookaside(pParse);}
163dabd04c6Sdrh 
164faa59554Sdrh %type ifnotexists {int}
165faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
166faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
167f57b3399Sdrh %type temp {int}
16853c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
169d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
170154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
171d24cc427Sdrh temp(A) ::= .      {A = 0;}
1725969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
1735969da4aSdrh   sqlite3EndTable(pParse,&X,&E,F,0);
174969fa7c1Sdrh }
175969fa7c1Sdrh create_table_args ::= AS select(S). {
1765969da4aSdrh   sqlite3EndTable(pParse,0,0,0,S);
177633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
178969fa7c1Sdrh }
1793334d089Sdrh %type table_options {int}
1805969da4aSdrh table_options(A) ::= .    {A = 0;}
1815969da4aSdrh table_options(A) ::= WITHOUT nm(X). {
1825969da4aSdrh   if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
183fccda8a1Sdrh     A = TF_WithoutRowid | TF_NoVisibleRowid;
1845969da4aSdrh   }else{
1855969da4aSdrh     A = 0;
1865969da4aSdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
1875969da4aSdrh   }
1885969da4aSdrh }
189986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist.
190986dde70Sdrh columnlist ::= columnname carglist.
1912881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);}
192c4a3c779Sdrh 
1936a8700b9Sdrh // Declare some tokens early in order to influence their values, to
1946a8700b9Sdrh // improve performance and reduce the executable size.  The goal here is
1956a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric
1966a8700b9Sdrh // values that are early enough so that all jump operations are clustered
1977bbdc3c5Sdrh // at the beginning.
1986a8700b9Sdrh //
1996a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST.
2006a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL.
2016a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2026a8700b9Sdrh %token GT LE LT GE ESCAPE.
2036a8700b9Sdrh 
20431d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
20531d6fd55Sdrh // fallback to ID if they will not parse as their original value.
20631d6fd55Sdrh // This obviates the need for the "id" nonterminal.
20731d6fd55Sdrh //
20831d6fd55Sdrh %fallback ID
20931d6fd55Sdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2100a6259f5Sdrh   CONFLICT DATABASE DEFERRED DESC DETACH DO
2116cd7d489Sdrh   EACH END EXCLUSIVE EXPLAIN FAIL FOR
21231d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
21386fb6e17Sdan   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS
21431d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
2156e11892dSdan   NULLS FIRST LAST
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
221ced89124Sdan   EXCLUDE GROUPS OTHERS TIES
2223773c25fSdrh %endif SQLITE_OMIT_WINDOWFUNC
2239ee94147Sdrh %ifndef SQLITE_OMIT_GENERATED_COLUMNS
224089c4bc2Sdrh   GENERATED ALWAYS
2259ee94147Sdrh %endif
22631d6fd55Sdrh   REINDEX RENAME CTIME_KW IF
22731d6fd55Sdrh   .
22831d6fd55Sdrh %wildcard ANY.
22931d6fd55Sdrh 
230f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
2312d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2322d3917daSdrh // causes them to be assigned integer values that are close together,
2332d3917daSdrh // which keeps parser tables smaller.
2342d3917daSdrh //
235f2bc013cSdrh // The token values assigned to these symbols is determined by the order
236f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
237f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
238f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
239f2bc013cSdrh // constraint.
240f2bc013cSdrh //
2412d3917daSdrh %left OR.
2422d3917daSdrh %left AND.
2432d3917daSdrh %right NOT.
24403bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2459a43267bSdrh %left GT LE LT GE.
2467c6303c0Sdanielk1977 %right ESCAPE.
2472d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2482d3917daSdrh %left PLUS MINUS.
2492d3917daSdrh %left STAR SLASH REM.
250a34001c9Sdrh %left CONCAT.
251a34001c9Sdrh %left COLLATE.
2527ba5bc5bSdrh %right BITNOT.
25326cf56f8Sdrh %nonassoc ON.
2542d3917daSdrh 
2557cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2567cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2577cc84c2cSdrh //
2587cc84c2cSdrh %token_class id  ID|INDEXED.
2597cc84c2cSdrh 
2607cc84c2cSdrh 
261c4a3c779Sdrh // And "ids" is an identifer-or-string.
262c4a3c779Sdrh //
263f59b12fbSdrh %token_class ids  ID|STRING.
264c4a3c779Sdrh 
2655ad1a6c8Sdrh // The name of a column or table can be any of the following:
2665ad1a6c8Sdrh //
2675ad1a6c8Sdrh %type nm {Token}
2684dd0d3f8Sdrh nm(A) ::= id(A).
2694dd0d3f8Sdrh nm(A) ::= STRING(A).
2704dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
2715ad1a6c8Sdrh 
272986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
273487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
274487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
275487e262fSdrh //
276487e262fSdrh %type typetoken {Token}
277986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
2784dd0d3f8Sdrh typetoken(A) ::= typename(A).
2794dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
2804dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
281487e262fSdrh }
2824dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
2834dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
284487e262fSdrh }
285382c0247Sdrh %type typename {Token}
28659ff4251Sdan typename(A) ::= ids(A).
28759ff4251Sdan typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
28860218d2aSdrh signed ::= plus_num.
28960218d2aSdrh signed ::= minus_num.
290487e262fSdrh 
2911be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the
2921be266baSdrh // input text just past the last token that has been shifted into
2931be266baSdrh // the parser.  By surrounding some phrase in the grammar with two
2941be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase.
2951be266baSdrh // For example:
2961be266baSdrh //
2971be266baSdrh //      something ::= .... scanpt(A) phrase scanpt(Z).
2981be266baSdrh //
2991be266baSdrh // The text that is parsed as "phrase" is a string starting at A
3001be266baSdrh // and containing (int)(Z-A) characters.  There might be some extra
3011be266baSdrh // whitespace on either end of the text, but that can be removed in
3021be266baSdrh // post-processing, if needed.
3031be266baSdrh //
3041be266baSdrh %type scanpt {const char*}
3051be266baSdrh scanpt(A) ::= . {
306f259df5fSdrh   assert( yyLookahead!=YYNOCODE );
3071be266baSdrh   A = yyLookaheadToken.z;
3081be266baSdrh }
3094db4b5b4Sdan scantok(A) ::= . {
3104db4b5b4Sdan   assert( yyLookahead!=YYNOCODE );
3114db4b5b4Sdan   A = yyLookaheadToken;
3124db4b5b4Sdan }
3131be266baSdrh 
314487e262fSdrh // "carglist" is a list of additional constraints that come after the
315487e262fSdrh // column name and column type in a CREATE TABLE statement.
316487e262fSdrh //
3174dc330ddSdrh carglist ::= carglist ccons.
318348784efSdrh carglist ::= .
3194dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
3204db4b5b4Sdan ccons ::= DEFAULT scantok(A) term(X).
3214db4b5b4Sdan                             {sqlite3AddDefaultValue(pParse,X,A.z,&A.z[A.n]);}
3221be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3231be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
3244db4b5b4Sdan ccons ::= DEFAULT PLUS(A) scantok(Z) term(X).
3254db4b5b4Sdan                             {sqlite3AddDefaultValue(pParse,X,A.z,&Z.z[Z.n]);}
3264db4b5b4Sdan ccons ::= DEFAULT MINUS(A) scantok(Z) term(X). {
3271be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3284db4b5b4Sdan   sqlite3AddDefaultValue(pParse,p,A.z,&Z.z[Z.n]);
3297977a17fSdanielk1977 }
3304db4b5b4Sdan ccons ::= DEFAULT scantok id(X).       {
3311be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
332d7fd899eSdrh   if( p ){
333171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
33496acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
335d7fd899eSdrh   }
3361be266baSdrh     sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3377977a17fSdanielk1977 }
338348784efSdrh 
339382c0247Sdrh // In addition to the type name, we also care about the primary key and
340382c0247Sdrh // UNIQUE constraints.
341348784efSdrh //
3420d316a40Sdrh ccons ::= NULL onconf.
3434adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
344fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
345fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
34662340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
34762340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3481be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
349108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3504adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3514adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
35259ff4251Sdan ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
35381f7b372Sdrh ccons ::= GENERATED ALWAYS AS generated.
35481f7b372Sdrh ccons ::= AS generated.
3557e508f1eSdrh generated ::= LP expr(E) RP.          {sqlite3AddGenerated(pParse,E,0);}
3567e508f1eSdrh generated ::= LP expr(E) RP ID(TYPE). {sqlite3AddGenerated(pParse,E,&TYPE);}
35704738cb9Sdrh 
358205f48e6Sdrh // The optional AUTOINCREMENT keyword
359205f48e6Sdrh %type autoinc {int}
360205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3612958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
362205f48e6Sdrh 
363c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
364c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
365c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
366c2eef3b3Sdrh // check fails.
36704738cb9Sdrh //
368c2eef3b3Sdrh %type refargs {int}
369fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3704dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
371c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
372c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
373c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
374c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
375c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
376c2eef3b3Sdrh %type refact {int}
377fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
378fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
379fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
380fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
381fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
382c2eef3b3Sdrh %type defer_subclause {int}
3831da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
384c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
385c2eef3b3Sdrh %type init_deferred_pred_opt {int}
386c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
387c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
388c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
389348784efSdrh 
39019a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3914dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
392ab35eaedSdrh conslist ::= conslist tconscomma tcons.
393ab35eaedSdrh conslist ::= tcons.
394ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
395ab35eaedSdrh tconscomma ::= .
396ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
397108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
398fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
399108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
40062340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
40162340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
402b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
4031be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
404108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
405108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
4064adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
4074adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
408c2eef3b3Sdrh }
409c2eef3b3Sdrh %type defer_subclause_opt {int}
410c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
4114dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
4129cfcf5d4Sdrh 
4139cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
4149cfcf5d4Sdrh // default behavior when there is a constraint conflict.
4159cfcf5d4Sdrh //
4169cfcf5d4Sdrh %type onconf {int}
4173334d089Sdrh %type orconf {int}
4181c92853dSdrh %type resolvetype {int}
4191c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4201c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4211c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4223334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4234dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4241c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4251c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
426348784efSdrh 
427382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
428348784efSdrh //
429a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
430a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
431a8858103Sdanielk1977 }
432a073384fSdrh %type ifexists {int}
433a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
434a073384fSdrh ifexists(A) ::= .            {A = 0;}
435348784efSdrh 
436a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
437a76b5dfcSdrh //
438b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
439108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4408981b904Sdrh           AS select(S). {
4418981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
442a76b5dfcSdrh }
443a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
444a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
445a76b5dfcSdrh }
446154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
447a76b5dfcSdrh 
448382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
449348784efSdrh //
4507d562dbeSdan cmd ::= select(X).  {
451edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4527d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
453633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4549bb61fe7Sdrh }
455efb7251dSdrh 
4569bb61fe7Sdrh %type select {Select*}
457633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4587d562dbeSdan %type selectnowith {Select*}
4597d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
46082c3d636Sdrh %type oneselect {Select*}
461633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4629bb61fe7Sdrh 
463772460fdSdrh %include {
464772460fdSdrh   /*
465772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
466772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
467772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
468772460fdSdrh   */
469e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
47055f66b34Sdrh     assert( p!=0 );
471d227a291Sdrh     if( p->pPrior ){
472772460fdSdrh       Select *pNext = 0, *pLoop;
473772460fdSdrh       int mxSelect, cnt = 0;
474d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
475d227a291Sdrh         pLoop->pNext = pNext;
476d227a291Sdrh         pLoop->selFlags |= SF_Compound;
477d227a291Sdrh       }
478772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
479772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
480772460fdSdrh         cnt>mxSelect
481a0c01768Sdrh       ){
482d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
483d227a291Sdrh       }
484d227a291Sdrh     }
485772460fdSdrh   }
486772460fdSdrh }
487772460fdSdrh 
4886a8b94e2Sdrh %ifndef SQLITE_OMIT_CTE
489a5746e03Sdrh select(A) ::= WITH wqlist(W) selectnowith(X). {
490772460fdSdrh   Select *p = X;
491772460fdSdrh   if( p ){
492772460fdSdrh     p->pWith = W;
493772460fdSdrh     parserDoubleLinkSelect(pParse, p);
494a9f5c13dSdan   }else{
495a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
496a9f5c13dSdan   }
497a5746e03Sdrh   A = p;
498a5746e03Sdrh }
499a5746e03Sdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X). {
500a5746e03Sdrh   Select *p = X;
501a5746e03Sdrh   if( p ){
502a5746e03Sdrh     p->pWith = W;
503a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
504a5746e03Sdrh   }else{
505a5746e03Sdrh     sqlite3WithDelete(pParse->db, W);
506a5746e03Sdrh   }
507a5746e03Sdrh   A = p;
508a5746e03Sdrh }
5096a8b94e2Sdrh %endif /* SQLITE_OMIT_CTE */
510a5746e03Sdrh select(A) ::= selectnowith(X). {
511a5746e03Sdrh   Select *p = X;
512a5746e03Sdrh   if( p ){
513a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
514a5746e03Sdrh   }
515a5746e03Sdrh   A = p; /*A-overwrites-X*/
516a9f5c13dSdan }
5177d562dbeSdan 
5184dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
519b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
5204dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
521c0bf493eSdrh   Select *pRhs = Z;
5224dd0d3f8Sdrh   Select *pLhs = A;
523c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
524c0bf493eSdrh     SrcList *pFrom;
525c0bf493eSdrh     Token x;
526c0bf493eSdrh     x.n = 0;
527772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
528c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
5298c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
530c0bf493eSdrh   }
531c0bf493eSdrh   if( pRhs ){
532c0bf493eSdrh     pRhs->op = (u8)Y;
53300d5ab74Sdrh     pRhs->pPrior = pLhs;
53400d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
535772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
536d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
53743b78826Sdrh   }else{
53800d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
539daffd0e5Sdrh   }
540c0bf493eSdrh   A = pRhs;
54182c3d636Sdrh }
5420a36c57eSdrh %type multiselect_op {int}
543cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5440a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
545cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
546154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
547550a3309Sdrh 
548fef37760Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
54967a9b8edSdan                  groupby_opt(P) having_opt(Q)
550e3bf632cSdan                  orderby_opt(Z) limit_opt(L). {
5518c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
552550a3309Sdrh }
553550a3309Sdrh %ifndef SQLITE_OMIT_WINDOWFUNC
554550a3309Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
555550a3309Sdrh                  groupby_opt(P) having_opt(Q) window_clause(R)
556550a3309Sdrh                  orderby_opt(Z) limit_opt(L). {
557550a3309Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
5586fde1799Sdan   if( A ){
5596fde1799Sdan     A->pWinDefn = R;
5606fde1799Sdan   }else{
5616fde1799Sdan     sqlite3WindowListDelete(pParse->db, R);
5626fde1799Sdan   }
5639bb61fe7Sdrh }
564550a3309Sdrh %endif
565550a3309Sdrh 
566550a3309Sdrh 
5674dd0d3f8Sdrh oneselect(A) ::= values(A).
56875593d96Sdrh 
56975593d96Sdrh %type values {Select*}
57075593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
57175593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5728c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
57375593d96Sdrh }
574954733b3Sdrh values(A) ::= values(A) COMMA LP nexprlist(Y) RP. {
5754dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5768c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
577f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
57875593d96Sdrh   if( pRight ){
57975593d96Sdrh     pRight->op = TK_ALL;
580772460fdSdrh     pRight->pPrior = pLeft;
58175593d96Sdrh     A = pRight;
58275593d96Sdrh   }else{
583772460fdSdrh     A = pLeft;
58475593d96Sdrh   }
58575593d96Sdrh }
5869bb61fe7Sdrh 
5879bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5889bb61fe7Sdrh // present and false (0) if it is not.
5899bb61fe7Sdrh //
5903334d089Sdrh %type distinct {int}
591832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5927cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
593efb7251dSdrh distinct(A) ::= .           {A = 0;}
594348784efSdrh 
5959bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5967c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5977c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5981a1d3cd2Sdrh // opcode of TK_ASTERISK.
5999bb61fe7Sdrh //
600348784efSdrh %type selcollist {ExprList*}
601633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
602348784efSdrh %type sclp {ExprList*}
603633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
6044dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
605348784efSdrh sclp(A) ::= .                                {A = 0;}
6061be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
6071be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
608b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
6091be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
61001f3f253Sdrh }
611d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
6121a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
6134dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
6147c917d19Sdrh }
6151be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
616abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
617abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
618abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
6194dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
62054473229Sdrh }
62101f3f253Sdrh 
62201f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
62301f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
62401f3f253Sdrh //
62501f3f253Sdrh %type as {Token}
6265ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
6274dd0d3f8Sdrh as(X) ::= ids(X).
628986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6299bb61fe7Sdrh 
630348784efSdrh 
631ad3cab52Sdrh %type seltablist {SrcList*}
632633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
633ad3cab52Sdrh %type stl_prefix {SrcList*}
634633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
635ad3cab52Sdrh %type from {SrcList*}
636633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
637348784efSdrh 
63801f3f253Sdrh // A complete FROM clause.
63901f3f253Sdrh //
64017435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
64161dfc31dSdrh from(A) ::= FROM seltablist(X). {
64261dfc31dSdrh   A = X;
64361dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
64461dfc31dSdrh }
64501f3f253Sdrh 
64601f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
64701f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
64801f3f253Sdrh //
6494dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6508a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
65101f3f253Sdrh }
652348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6534dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
654e9240418Sdrh                   on_opt(N) using_opt(U). {
6554dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
656b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
65701f3f253Sdrh }
6584dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
65901d230ceSdrh                   on_opt(N) using_opt(U). {
6604dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
66101d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
66201d230ceSdrh }
66351522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6644dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
665b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6664dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
66722f70c32Sdrh   }
6684dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
669fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6704dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
671fbdc7f69Sdrh       A = F;
672832ee3d4Sdrh     }else if( F->nSrc==1 ){
6734dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
674832ee3d4Sdrh       if( A ){
675832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
676832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
677832ee3d4Sdrh         pNew->zName = pOld->zName;
678832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6793c449c6bSdrh         pNew->pSelect = pOld->pSelect;
6804a5cff73Sdrh         if( pOld->fg.isTabFunc ){
6814a5cff73Sdrh           pNew->u1.pFuncArg = pOld->u1.pFuncArg;
6824a5cff73Sdrh           pOld->u1.pFuncArg = 0;
6834a5cff73Sdrh           pOld->fg.isTabFunc = 0;
6844a5cff73Sdrh           pNew->fg.isTabFunc = 1;
6854a5cff73Sdrh         }
686832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6873c449c6bSdrh         pOld->pSelect = 0;
688832ee3d4Sdrh       }
689832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
690fbdc7f69Sdrh     }else{
691fbdc7f69Sdrh       Select *pSubquery;
692fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6938c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6944dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
695fbdc7f69Sdrh     }
696fbdc7f69Sdrh   }
697154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
698b733d037Sdrh 
699113088ecSdrh %type dbnm {Token}
700113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
701113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
702113088ecSdrh 
70374ad7fe9Sdrh %type fullname {SrcList*}
704633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
705c9461eccSdan fullname(A) ::= nm(X).  {
70629c992cbSdrh   A = sqlite3SrcListAppend(pParse,0,&X,0);
707c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &X);
708c9461eccSdan }
709c9461eccSdan fullname(A) ::= nm(X) DOT nm(Y). {
71029c992cbSdrh   A = sqlite3SrcListAppend(pParse,0,&X,&Y);
711c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &Y);
712c9461eccSdan }
71374ad7fe9Sdrh 
7145e3a6ebfSdrh %type xfullname {SrcList*}
7155e3a6ebfSdrh %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);}
7165e3a6ebfSdrh xfullname(A) ::= nm(X).
71729c992cbSdrh    {A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/}
7185e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y).
71929c992cbSdrh    {A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/}
7205e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z).  {
72129c992cbSdrh    A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/
7225e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7235e3a6ebfSdrh }
7245e3a6ebfSdrh xfullname(A) ::= nm(X) AS nm(Z). {
72529c992cbSdrh    A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/
7265e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7275e3a6ebfSdrh }
7285e3a6ebfSdrh 
72901f3f253Sdrh %type joinop {int}
730fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
731cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
732cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
733cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
734cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
7355ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
736cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
73701f3f253Sdrh 
73826cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a
73926cf56f8Sdrh // SELECT on the RHS of a the INSERT:
74026cf56f8Sdrh //
74126cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ...
74226cf56f8Sdrh //                                        here ----^^
74326cf56f8Sdrh //
74426cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is
74526cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON
74626cf56f8Sdrh // clause associated with the JOIN.  The conflict is resolved in favor
74726cf56f8Sdrh // of the JOIN.  If an ON CONFLICT clause is intended, insert a dummy
74826cf56f8Sdrh // WHERE clause in between, like this:
74926cf56f8Sdrh //
75026cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ...
75126cf56f8Sdrh //
75226cf56f8Sdrh // The [AND] and [OR] precedence marks in the rules for on_opt cause the
75326cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN.
75426cf56f8Sdrh //
75501f3f253Sdrh %type on_opt {Expr*}
756633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
7571be266baSdrh on_opt(N) ::= ON expr(E).  {N = E;}
75826cf56f8Sdrh on_opt(N) ::= .     [OR]   {N = 0;}
75901f3f253Sdrh 
76085574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
76185574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
76285574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
76385574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
76485574e31Sdanielk1977 // in the token.
76585574e31Sdanielk1977 //
76685574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
767b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
76885574e31Sdanielk1977 // recognizes and interprets this as a special case.
76985574e31Sdanielk1977 //
77085574e31Sdanielk1977 %type indexed_opt {Token}
77185574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
77285574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
77385574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
77485574e31Sdanielk1977 
77501f3f253Sdrh %type using_opt {IdList*}
776633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
77781eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
77801f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
77901f3f253Sdrh 
78001f3f253Sdrh 
781348784efSdrh %type orderby_opt {ExprList*}
782633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
783108aa00aSdrh 
784108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
785108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
786108aa00aSdrh // sort order.
787108aa00aSdrh //
788348784efSdrh %type sortlist {ExprList*}
789633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
790348784efSdrh 
791348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
792348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7936e11892dSdan sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z) nulls(X). {
7941be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
7956e11892dSdan   sqlite3ExprListSetSortOrder(A,Z,X);
796348784efSdrh }
7976e11892dSdan sortlist(A) ::= expr(Y) sortorder(Z) nulls(X). {
7981be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
7996e11892dSdan   sqlite3ExprListSetSortOrder(A,Z,X);
800348784efSdrh }
801348784efSdrh 
802348784efSdrh %type sortorder {int}
803348784efSdrh 
8048e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
8058e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
806bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
807348784efSdrh 
8086e11892dSdan %type nulls {int}
8096e11892dSdan nulls(A) ::= NULLS FIRST.       {A = SQLITE_SO_ASC;}
8106e11892dSdan nulls(A) ::= NULLS LAST.        {A = SQLITE_SO_DESC;}
8116e11892dSdan nulls(A) ::= .                  {A = SQLITE_SO_UNDEFINED;}
8126e11892dSdan 
8132282792aSdrh %type groupby_opt {ExprList*}
814633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
8152282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
8169245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
8172282792aSdrh 
8182282792aSdrh %type having_opt {Expr*}
819633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
8202282792aSdrh having_opt(A) ::= .                {A = 0;}
8211be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
8222282792aSdrh 
8238c0833fbSdrh %type limit_opt {Expr*}
82415926590Sdrh 
82515926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
82615926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
82715926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
82815926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
82915926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
83015926590Sdrh // except as a transient.  So there is never anything to destroy.
83115926590Sdrh //
8328c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
8338c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
8348c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
8351be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
836a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
8371be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
838a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
8391be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
8409bbca4c1Sdrh 
841382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
842382c0247Sdrh //
843273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8445e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W)
845931577f1Sdrh         orderby_opt(O) limit_opt(L). {
846b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
8476a0db87aSdrh #ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8486a0db87aSdrh   sqlite3ExprListDelete(pParse->db, O); O = 0;
8496a0db87aSdrh   sqlite3ExprDelete(pParse->db, L); L = 0;
8506a0db87aSdrh #endif
8518c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
8524281bd42Sshane }
8534281bd42Sshane %endif
854273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8555e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W). {
8564281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8578c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
8584281bd42Sshane }
8594281bd42Sshane %endif
860348784efSdrh 
861348784efSdrh %type where_opt {Expr*}
862633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
863348784efSdrh 
864348784efSdrh where_opt(A) ::= .                    {A = 0;}
8651be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
866348784efSdrh 
867382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
868382c0247Sdrh //
869273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8705e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
8718b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
872b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
873b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
874eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L,0);
8754281bd42Sshane }
8764281bd42Sshane %endif
877273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8785e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
879e9240418Sdrh         where_opt(W).  {
8804281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8814281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
882eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0,0);
8834281bd42Sshane }
8844281bd42Sshane %endif
885348784efSdrh 
886f8db1bc0Sdrh %type setlist {ExprList*}
887633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
888f8db1bc0Sdrh 
8894dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8901be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
891b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
892b7916a78Sdrh }
893a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8941be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
895a1251bc4Sdrh }
896b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8971be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
898b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
899b7916a78Sdrh }
900a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
9011be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
902a1251bc4Sdrh }
903348784efSdrh 
904382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
905382c0247Sdrh //
9065e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) select(S)
9072c2e844aSdrh         upsert(U). {
90846d2e5c3Sdrh   sqlite3Insert(pParse, X, S, F, R, U);
9094e9119d9Sdan }
9105e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) DEFAULT VALUES.
9114e9119d9Sdan {
9122c2e844aSdrh   sqlite3Insert(pParse, X, 0, F, R, 0);
9134e9119d9Sdan }
914348784efSdrh 
91546d2e5c3Sdrh %type upsert {Upsert*}
91654514c98Sdrh 
91754514c98Sdrh // Because upsert only occurs at the tip end of the INSERT rule for cmd,
91854514c98Sdrh // there is never a case where the value of the upsert pointer will not
91954514c98Sdrh // be destroyed by the cmd action.  So comment-out the destructor to
92054514c98Sdrh // avoid unreachable code.
92154514c98Sdrh //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);}
92246d2e5c3Sdrh upsert(A) ::= . { A = 0; }
923e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW)
924dab0eb58Sdrh               DO UPDATE SET setlist(Z) where_opt(W).
925e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W);}
926e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING.
927e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,0,0); }
928e9c2e772Sdrh upsert(A) ::= ON CONFLICT DO NOTHING.
929e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,0,0,0,0); }
93026cf56f8Sdrh 
9313334d089Sdrh %type insert_cmd {int}
932fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
933fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
934fa86c412Sdrh 
9358981b904Sdrh %type idlist_opt {IdList*}
9368981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
93781eba73eSdrh %type idlist {IdList*}
93881eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
939348784efSdrh 
9408981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
9418981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
9424dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
9435496d6a2Sdan     {A = sqlite3IdListAppend(pParse,A,&Y);}
94481eba73eSdrh idlist(A) ::= nm(Y).
9455496d6a2Sdan     {A = sqlite3IdListAppend(pParse,0,&Y); /*A-overwrites-Y*/}
946348784efSdrh 
947382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
948382c0247Sdrh //
949348784efSdrh 
9501be266baSdrh %type expr {Expr*}
9511be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
9521be266baSdrh %type term {Expr*}
9531be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
954b7916a78Sdrh 
955b7916a78Sdrh %include {
956b7916a78Sdrh 
957b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
958b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
959b7916a78Sdrh   ** that created the expression.
960b7916a78Sdrh   */
9611be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
9620cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
9630cd874bdSdrh     if( p ){
964d145e5f4Sdan       /* memset(p, 0, sizeof(Expr)); */
9650cd874bdSdrh       p->op = (u8)op;
9661194904bSdrh       p->affExpr = 0;
9670cd874bdSdrh       p->flags = EP_Leaf;
968*e7375bfaSdrh       ExprClearVVAProperties(p);
9690cd874bdSdrh       p->iAgg = -1;
970d145e5f4Sdan       p->pLeft = p->pRight = 0;
971d145e5f4Sdan       p->x.pList = 0;
972d145e5f4Sdan       p->pAggInfo = 0;
973eda079cdSdrh       p->y.pTab = 0;
974d145e5f4Sdan       p->op2 = 0;
9754fe759b2Sdrh       p->iTable = 0;
976d3130dabSdrh       p->iColumn = 0;
9770cd874bdSdrh       p->u.zToken = (char*)&p[1];
9780cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
9790cd874bdSdrh       p->u.zToken[t.n] = 0;
9800cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
98151d35b0fSdrh         sqlite3DequoteExpr(p);
9820cd874bdSdrh       }
9830cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
9840cd874bdSdrh       p->nHeight = 1;
9850cd874bdSdrh #endif
986c9461eccSdan       if( IN_RENAME_OBJECT ){
98707e95233Sdan         return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t);
988d145e5f4Sdan       }
9890cd874bdSdrh     }
9901be266baSdrh     return p;
991b7916a78Sdrh   }
992d145e5f4Sdan 
993b7916a78Sdrh }
994348784efSdrh 
9954dd0d3f8Sdrh expr(A) ::= term(A).
9961be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
9971be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9981be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9995ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
1000410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
1001410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
1002c9461eccSdan   if( IN_RENAME_OBJECT ){
1003c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp2, &Y);
1004c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp1, &X);
1005c9461eccSdan   }
10061be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
1007e1b6a5b8Sdrh }
1008d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
1009410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
1010410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
1011410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
1012abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
1013c9461eccSdan   if( IN_RENAME_OBJECT ){
1014c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp3, &Z);
1015c9461eccSdan     sqlite3RenameTokenMap(pParse, (void*)temp2, &Y);
1016c9461eccSdan   }
10171be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
1018d24cc427Sdrh }
10191be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
10201be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
10210cd874bdSdrh term(A) ::= INTEGER(X). {
10221be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
10230cd874bdSdrh }
1024f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
10258679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
1026de25a88cSdrh     u32 n = X.n;
10271be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
10281be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
10298f3b137fSdrh   }else{
1030b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
1031b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
1032b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
10338f3b137fSdrh     Token t = X; /*A-overwrites-X*/
10348f3b137fSdrh     assert( t.n>=2 );
1035b7916a78Sdrh     if( pParse->nested==0 ){
103643303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
10371be266baSdrh       A = 0;
1038b7916a78Sdrh     }else{
10391be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
10401be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
1041b7916a78Sdrh     }
1042f59b12fbSdrh   }
1043895d7472Sdrh }
104459ff4251Sdan expr(A) ::= expr(A) COLLATE ids(C). {
10451be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
10468b4c40d8Sdrh }
1047487e262fSdrh %ifndef SQLITE_OMIT_CAST
10481be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
10491be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
10501be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
1051487e262fSdrh }
1052154d4b24Sdrh %endif  SQLITE_OMIT_CAST
1053550a3309Sdrh 
1054550a3309Sdrh 
1055550a3309Sdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
1056954733b3Sdrh   A = sqlite3ExprFunction(pParse, Y, &X, D);
1057550a3309Sdrh }
1058550a3309Sdrh expr(A) ::= id(X) LP STAR RP. {
1059954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
1060550a3309Sdrh }
1061550a3309Sdrh 
106267a9b8edSdan %ifndef SQLITE_OMIT_WINDOWFUNC
10634f9adee2Sdan expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_over(Z). {
10646488271fSdan   A = sqlite3ExprFunction(pParse, Y, &X, D);
10654f9adee2Sdan   sqlite3WindowAttach(pParse, A, Z);
10666488271fSdan }
10674f9adee2Sdan expr(A) ::= id(X) LP STAR RP filter_over(Z). {
1068954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
10694f9adee2Sdan   sqlite3WindowAttach(pParse, A, Z);
1070e1b6a5b8Sdrh }
1071550a3309Sdrh %endif
1072550a3309Sdrh 
1073b71090fdSdrh term(A) ::= CTIME_KW(OP). {
1074954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &OP, 0);
1075b7916a78Sdrh }
1076b7916a78Sdrh 
10771be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
10781be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
10791be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
10801be266baSdrh   if( A ){
10811be266baSdrh     A->x.pList = pList;
108276baf799Sdrh     if( ALWAYS(pList->nExpr) ){
1083269d322dSdrh       A->flags |= pList->a[0].pExpr->flags & EP_Propagate;
1084269d322dSdrh     }
10858bd0d58eSdrh   }else{
10868bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
108771c57db0Sdan   }
108871c57db0Sdan }
108971c57db0Sdan 
1090d5c851c1Sdrh expr(A) ::= expr(A) AND expr(Y).        {A=sqlite3ExprAnd(pParse,A,Y);}
10911be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
10924dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
10931be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10941be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
10954dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
10961be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10974dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
10981be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10994dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
11001be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
11011be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
1102410c301fSdrh %type likeop {Token}
11037e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
1104410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
11054dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
11068aa34ae0Sdrh   ExprList *pList;
1107410c301fSdrh   int bNot = OP.n & 0x80000000;
1108410c301fSdrh   OP.n &= 0x7fffffff;
11091be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
11101be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
1111954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
11121be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
11131be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
11140ac65892Sdrh }
11154dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
11161dca1458Sdrh   ExprList *pList;
1117410c301fSdrh   int bNot = OP.n & 0x80000000;
1118410c301fSdrh   OP.n &= 0x7fffffff;
11191be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
11201be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
11211be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
1122954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
11231be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
11241be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
11251dca1458Sdrh }
11267c6303c0Sdanielk1977 
11271be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
11281be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
11296a2fe093Sdrh 
11306a51741dSdrh %include {
11316a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
11326a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
11336a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
11346a51741dSdrh     sqlite3 *db = pParse->db;
1135c50f75dfSdan     if( pA && pY && pY->op==TK_NULL && !IN_RENAME_OBJECT ){
11365e17e8b7Sshaneh       pA->op = (u8)op;
11376a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
11386a51741dSdrh       pA->pRight = 0;
11396a51741dSdrh     }
11406a51741dSdrh   }
11416a51741dSdrh }
11426a51741dSdrh 
11436a2fe093Sdrh //    expr1 IS expr2
11446a2fe093Sdrh //    expr1 IS NOT expr2
11456a2fe093Sdrh //
11466a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
11476a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
11486a2fe093Sdrh //
11494dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
11501be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
11511be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
11526a2fe093Sdrh }
11534dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
11541be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
11551be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
11566a2fe093Sdrh }
1157b7916a78Sdrh 
115843303de9Sdrh expr(A) ::= NOT(B) expr(X).
11591be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
116043303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
11611be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
1162ca5aa594Sdrh expr(A) ::= PLUS|MINUS(B) expr(X). [BITNOT] {
1163ca5aa594Sdrh   A = sqlite3PExpr(pParse, @B==TK_PLUS ? TK_UPLUS : TK_UMINUS, X, 0);
1164ca5aa594Sdrh   /*A-overwrites-B*/
1165ca5aa594Sdrh }
1166b7916a78Sdrh 
11672e3a1f16Sdrh %type between_op {int}
11682e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
11692e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
11704dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
11711be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
11721be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
11731be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
11741be266baSdrh   if( A ){
11751be266baSdrh     A->x.pList = pList;
117653f733c7Sdrh   }else{
1177633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
117853f733c7Sdrh   }
11791be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1180fef5208cSdrh }
11813e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
11822e3a1f16Sdrh   %type in_op {int}
11832e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
11842e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
11851be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1186094430ebSdrh     if( Y==0 ){
1187473c1bf2Sdan       /* Expressions of the form
1188473c1bf2Sdan       **
1189473c1bf2Sdan       **      expr1 IN ()
1190473c1bf2Sdan       **      expr1 NOT IN ()
1191473c1bf2Sdan       **
1192473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1193473c1bf2Sdan       ** regardless of the value of expr1.
1194473c1bf2Sdan       */
11958e34e406Sdrh       sqlite3ExprUnmapAndDelete(pParse, A);
11965776ee5cSdrh       A = sqlite3Expr(pParse->db, TK_INTEGER, N ? "1" : "0");
1197fbfd1133Sdrh     }else if( 0 && Y->nExpr==1 && sqlite3ExprIsConstant(Y->a[0].pExpr) ){
1198fbfd1133Sdrh       Expr *pRHS = Y->a[0].pExpr;
1199fbfd1133Sdrh       Y->a[0].pExpr = 0;
1200fbfd1133Sdrh       sqlite3ExprListDelete(pParse->db, Y);
1201fbfd1133Sdrh       A = sqlite3PExpr(pParse, TK_EQ, A, pRHS);
1202fbfd1133Sdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1203094430ebSdrh     }else{
12041be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
12051be266baSdrh       if( A ){
12061be266baSdrh         A->x.pList = Y;
12071be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1208d5d56523Sdanielk1977       }else{
1209633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1210d5d56523Sdanielk1977       }
12111be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1212094430ebSdrh     }
1213fef5208cSdrh   }
12141be266baSdrh   expr(A) ::= LP select(X) RP. {
12151be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
12161be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
121751522cd3Sdrh   }
12181be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
12191be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12201be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
12211be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1222fef5208cSdrh   }
12235fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
122429c992cbSdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&Y,&Z);
12258c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
12269de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
12271be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12281be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
12291be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
123023b2db23Sdrh   }
12311be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
123243303de9Sdrh     Expr *p;
12331be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
123408de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
123551522cd3Sdrh   }
1236154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1237fef5208cSdrh 
123817a7f8ddSdrh /* CASE expressions */
12391be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
12401be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
12411be266baSdrh   if( A ){
12421be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
12431be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
124453f733c7Sdrh   }else{
1245633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1246c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
124753f733c7Sdrh   }
124817a7f8ddSdrh }
124917a7f8ddSdrh %type case_exprlist {ExprList*}
1250633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12514dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
12521be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
12531be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
125417a7f8ddSdrh }
125517a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
12561be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
12571be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
125817a7f8ddSdrh }
125917a7f8ddSdrh %type case_else {Expr*}
1260633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
12611be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
126217a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
126317a7f8ddSdrh %type case_operand {Expr*}
1264633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
12651be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
126617a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1267348784efSdrh 
1268348784efSdrh %type exprlist {ExprList*}
1269633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12709245c243Sdrh %type nexprlist {ExprList*}
1271633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1272348784efSdrh 
12734dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
12749245c243Sdrh exprlist(A) ::= .                            {A = 0;}
12754dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
12761be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
127717435752Sdrh nexprlist(A) ::= expr(Y).
12781be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
12799245c243Sdrh 
1280a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
12815fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
12825fbab882Sdrh ** of parenthesis */
12835fbab882Sdrh %type paren_exprlist {ExprList*}
12845fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12855fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
12865fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1287a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
12885fbab882Sdrh 
1289cce7d176Sdrh 
1290382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1291382c0247Sdrh //
1292d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1293108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
129417435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
129529c992cbSdrh                      sqlite3SrcListAppend(pParse,0,&Y,0), Z, U,
129662340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
1297c9461eccSdan   if( IN_RENAME_OBJECT && pParse->pNewIndex ){
1298c9461eccSdan     sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &Y);
1299c9461eccSdan   }
13009cfcf5d4Sdrh }
1301717e6402Sdrh 
1302717e6402Sdrh %type uniqueflag {int}
13039cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
13049cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1305348784efSdrh 
1306348784efSdrh 
1307108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1308108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1309108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1310108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1311108aa00aSdrh //
1312108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1313108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1314108aa00aSdrh //
1315108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1316108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1317108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1318108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1319108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1320108aa00aSdrh // historical schemas.
1321108aa00aSdrh //
1322108aa00aSdrh %type eidlist {ExprList*}
1323108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1324108aa00aSdrh %type eidlist_opt {ExprList*}
1325108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1326108aa00aSdrh 
1327108aa00aSdrh %include {
1328108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1329108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1330108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1331108aa00aSdrh   ** error while parsing a legacy schema.
1332108aa00aSdrh   */
1333108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1334108aa00aSdrh     Parse *pParse,
1335108aa00aSdrh     ExprList *pPrior,
1336108aa00aSdrh     Token *pIdToken,
1337108aa00aSdrh     int hasCollate,
1338108aa00aSdrh     int sortOrder
1339108aa00aSdrh   ){
1340108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1341108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1342108aa00aSdrh         && pParse->db->init.busy==0
1343108aa00aSdrh     ){
1344108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1345108aa00aSdrh                          pIdToken->n, pIdToken->z);
13460202b29eSdanielk1977     }
1347108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1348108aa00aSdrh     return p;
1349108aa00aSdrh   }
1350108aa00aSdrh } // end %include
1351108aa00aSdrh 
1352108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1353108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
13544dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
13554dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1356108aa00aSdrh }
1357108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1358cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
13590202b29eSdanielk1977 }
13600202b29eSdanielk1977 
1361108aa00aSdrh %type collate {int}
1362108aa00aSdrh collate(C) ::= .              {C = 0;}
136359ff4251Sdan collate(C) ::= COLLATE ids.   {C = 1;}
1364a34001c9Sdrh 
1365348784efSdrh 
13668aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1367382c0247Sdrh //
13684d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1369982cef7eSdrh 
1370382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1371382c0247Sdrh //
1372154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1373fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
13742f6239edSdrh %type vinto {Expr*}
13752f6239edSdrh %destructor vinto {sqlite3ExprDelete(pParse->db, $$);}
13762f6239edSdrh cmd ::= VACUUM vinto(Y).                {sqlite3Vacuum(pParse,0,Y);}
13772f6239edSdrh cmd ::= VACUUM nm(X) vinto(Y).          {sqlite3Vacuum(pParse,&X,Y);}
13782f6239edSdrh vinto(A) ::= INTO expr(X).              {A = X;}
13792f6239edSdrh vinto(A) ::= .                          {A = 0;}
1380fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1381154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1382f57b14a6Sdrh 
1383382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1384382c0247Sdrh //
138513d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
138691cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1387ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1388ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1389ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1390ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1391ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1392ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1393ada2ee0dSdrh 
1394cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1395cf82f0d3Sdrh nmnum(A) ::= nm(A).
1396cf82f0d3Sdrh nmnum(A) ::= ON(A).
1397cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1398cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1399154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1400f59b12fbSdrh %token_class number INTEGER|FLOAT.
14018395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1402cf82f0d3Sdrh plus_num(A) ::= number(A).
1403f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1404c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1405f0f258b1Sdrh 
1406b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1407b7f9164eSdrh 
1408d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
14094b59ab5eSdrh   Token all;
14104b59ab5eSdrh   all.z = A.z;
1411b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
14124adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1413f0f258b1Sdrh }
1414f0f258b1Sdrh 
1415fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1416fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
141760218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
141860218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1419cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1420c3f9bad2Sdanielk1977 }
1421c3f9bad2Sdanielk1977 
1422c3f9bad2Sdanielk1977 %type trigger_time {int}
14236559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1424c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1425c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1426c3f9bad2Sdanielk1977 
1427ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1428633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1429cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1430cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
143181eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1432c3f9bad2Sdanielk1977 
143360218d2aSdrh foreach_clause ::= .
143460218d2aSdrh foreach_clause ::= FOR EACH ROW.
1435c3f9bad2Sdanielk1977 
1436c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1437633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1438c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
14391be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1440c3f9bad2Sdanielk1977 
1441c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1442633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
14434dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
14444dd0d3f8Sdrh   assert( A!=0 );
14454dd0d3f8Sdrh   A->pLast->pNext = X;
14464dd0d3f8Sdrh   A->pLast = X;
1447a69d9168Sdrh }
14484dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
14494dd0d3f8Sdrh   assert( A!=0 );
14504dd0d3f8Sdrh   A->pLast = A;
145181238966Sdrh }
1452c3f9bad2Sdanielk1977 
1453b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1454b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1455b1819a0bSdrh // the same database as the table that the trigger fires on.
1456b1819a0bSdrh //
1457b1819a0bSdrh %type trnm {Token}
14584dd0d3f8Sdrh trnm(A) ::= nm(A).
1459b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1460b1819a0bSdrh   A = X;
1461b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1462b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1463b1819a0bSdrh         "statements within triggers");
1464b1819a0bSdrh }
1465b1819a0bSdrh 
1466b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1467b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1468b1819a0bSdrh // since it is an exception to the default grammar rules.
1469b1819a0bSdrh //
1470b1819a0bSdrh tridxby ::= .
1471b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1472b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1473b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1474b1819a0bSdrh         "within triggers");
1475b1819a0bSdrh }
1476b1819a0bSdrh tridxby ::= NOT INDEXED. {
1477b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1478b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1479b1819a0bSdrh         "within triggers");
1480b1819a0bSdrh }
1481b1819a0bSdrh 
1482b1819a0bSdrh 
1483b1819a0bSdrh 
1484c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1485633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1486c3f9bad2Sdanielk1977 // UPDATE
1487b1819a0bSdrh trigger_cmd(A) ::=
1488f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
14895be60c55Sdan    {A = sqlite3TriggerUpdateStep(pParse, &X, Y, Z, R, B.z, E);}
1490c3f9bad2Sdanielk1977 
1491c3f9bad2Sdanielk1977 // INSERT
1492f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
14932c2e844aSdrh                       trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). {
14945be60c55Sdan    A = sqlite3TriggerInsertStep(pParse,&X,F,S,R,U,B,Z);/*A-overwrites-R*/
14952c2e844aSdrh }
1496c3f9bad2Sdanielk1977 // DELETE
1497f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
14985be60c55Sdan    {A = sqlite3TriggerDeleteStep(pParse, &X, Y, B.z, E);}
1499c3f9bad2Sdanielk1977 
1500c3f9bad2Sdanielk1977 // SELECT
1501f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1502f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1503c3f9bad2Sdanielk1977 
15046f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
15051be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
15061be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
15071be266baSdrh   if( A ){
15081194904bSdrh     A->affExpr = OE_Ignore;
15094b59ab5eSdrh   }
15108aa34ae0Sdrh }
15111be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
15121be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
15131be266baSdrh   if( A ) {
15141194904bSdrh     A->affExpr = (char)T;
15154b59ab5eSdrh   }
15168aa34ae0Sdrh }
1517154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1518b7f9164eSdrh 
151974ad7fe9Sdrh %type raisetype {int}
152074ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
152174ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
152274ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
152374ad7fe9Sdrh 
15246f34903eSdanielk1977 
1525c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1526b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1527fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1528fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1529c3f9bad2Sdanielk1977 }
1530154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1531113088ecSdrh 
1532113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1533fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1534f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
15351be266baSdrh   sqlite3Attach(pParse, F, D, K);
15361c2d8414Sdrh }
1537fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
15381be266baSdrh   sqlite3Detach(pParse, D);
1539fdbcdee5Sdrh }
1540fdbcdee5Sdrh 
1541f744bb56Sdanielk1977 %type key_opt {Expr*}
1542633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1543f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
15441be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1545113088ecSdrh 
1546113088ecSdrh database_kw_opt ::= DATABASE.
1547113088ecSdrh database_kw_opt ::= .
1548fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
15494343fea2Sdrh 
15504343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
15514343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
15524343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
15534343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1554154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
15559fd2a9a0Sdanielk1977 
15569f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
15579f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
15589f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
15599f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
15609f18e8a0Sdrh %endif
15619f18e8a0Sdrh 
15629fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
15639fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
15649fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
15659fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
15669fd2a9a0Sdanielk1977 }
1567986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1568986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1569986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
157019a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
157119a8e7e8Sdanielk1977 }
157219a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
15734a642b60Sdrh   disableLookaside(pParse);
157419a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
157519a8e7e8Sdanielk1977 }
1576cf8f2895Sdan cmd ::= ALTER TABLE fullname(X) RENAME kwcolumn_opt nm(Y) TO nm(Z). {
1577cf8f2895Sdan   sqlite3AlterRenameColumn(pParse, X, &Y, &Z);
1578cf8f2895Sdan }
1579cf8f2895Sdan 
158019a8e7e8Sdanielk1977 kwcolumn_opt ::= .
158119a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1582cf8f2895Sdan 
1583154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1584e09daa90Sdrh 
1585e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1586e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1587b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1588b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1589b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1590b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1591b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1592b9bb7c18Sdrh }
1593e09daa90Sdrh vtabarglist ::= vtabarg.
1594e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1595b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1596b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1597b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1598b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1599b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1600b9bb7c18Sdrh anylist ::= .
1601aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1602aaac8b4eSdrh anylist ::= anylist ANY.
1603154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
16048b471863Sdrh 
16058b471863Sdrh 
16068b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
16077d562dbeSdan %type wqlist {With*}
16084e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
16097d562dbeSdan 
1610a5746e03Sdrh with ::= .
16118b471863Sdrh %ifndef SQLITE_OMIT_CTE
1612a5746e03Sdrh with ::= WITH wqlist(W).              { sqlite3WithPush(pParse, W, 1); }
1613a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W).    { sqlite3WithPush(pParse, W, 1); }
16147d562dbeSdan 
1615108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1616cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
16177d562dbeSdan }
16184dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
16194dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
16208b471863Sdrh }
16218b471863Sdrh %endif  SQLITE_OMIT_CTE
162234a7d790Sdan 
162334a7d790Sdan //////////////////////// WINDOW FUNCTION EXPRESSIONS /////////////////////////
16246e2210e0Sdan // These must be at the end of this file. Specifically, the rules that
16256e2210e0Sdan // introduce tokens WINDOW, OVER and FILTER must appear last. This causes
16266e2210e0Sdan // the integer values assigned to these tokens to be larger than all other
16276e2210e0Sdan // tokens that may be output by the tokenizer except TK_SPACE and TK_ILLEGAL.
162834a7d790Sdan //
162934a7d790Sdan %ifndef SQLITE_OMIT_WINDOWFUNC
163034a7d790Sdan %type windowdefn_list {Window*}
1631a57aac26Sdrh %destructor windowdefn_list {sqlite3WindowListDelete(pParse->db, $$);}
163234a7d790Sdan windowdefn_list(A) ::= windowdefn(Z). { A = Z; }
163334a7d790Sdan windowdefn_list(A) ::= windowdefn_list(Y) COMMA windowdefn(Z). {
1634a57aac26Sdrh   assert( Z!=0 );
1635e7c9ca41Sdan   sqlite3WindowChain(pParse, Z, Y);
1636a57aac26Sdrh   Z->pNextWin = Y;
163734a7d790Sdan   A = Z;
163834a7d790Sdan }
163934a7d790Sdan 
164034a7d790Sdan %type windowdefn {Window*}
164134a7d790Sdan %destructor windowdefn {sqlite3WindowDelete(pParse->db, $$);}
1642e7c9ca41Sdan windowdefn(A) ::= nm(X) AS LP window(Y) RP. {
1643a57aac26Sdrh   if( ALWAYS(Y) ){
164434a7d790Sdan     Y->zName = sqlite3DbStrNDup(pParse->db, X.z, X.n);
164534a7d790Sdan   }
164634a7d790Sdan   A = Y;
164734a7d790Sdan }
164834a7d790Sdan 
164934a7d790Sdan %type window {Window*}
165034a7d790Sdan %destructor window {sqlite3WindowDelete(pParse->db, $$);}
165134a7d790Sdan 
165234a7d790Sdan %type frame_opt {Window*}
165334a7d790Sdan %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);}
165434a7d790Sdan 
165534a7d790Sdan %type part_opt {ExprList*}
165634a7d790Sdan %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);}
165734a7d790Sdan 
16586488271fSdan %type filter_clause {Expr*}
16596488271fSdan %destructor filter_clause {sqlite3ExprDelete(pParse->db, $$);}
16606488271fSdan 
16616488271fSdan %type over_clause {Window*}
16626488271fSdan %destructor over_clause {sqlite3WindowDelete(pParse->db, $$);}
166334a7d790Sdan 
16644f9adee2Sdan %type filter_over {Window*}
16654f9adee2Sdan %destructor filter_over {sqlite3WindowDelete(pParse->db, $$);}
16664f9adee2Sdan 
166734a7d790Sdan %type range_or_rows {int}
166834a7d790Sdan 
166934a7d790Sdan %type frame_bound {struct FrameBound}
167034a7d790Sdan %destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1671287fa17bSdan %type frame_bound_s {struct FrameBound}
1672287fa17bSdan %destructor frame_bound_s {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1673287fa17bSdan %type frame_bound_e {struct FrameBound}
1674287fa17bSdan %destructor frame_bound_e {sqlite3ExprDelete(pParse->db, $$.pExpr);}
167534a7d790Sdan 
1676e7c9ca41Sdan window(A) ::= PARTITION BY nexprlist(X) orderby_opt(Y) frame_opt(Z). {
1677e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, X, Y, 0);
1678e7c9ca41Sdan }
1679e7c9ca41Sdan window(A) ::= nm(W) PARTITION BY nexprlist(X) orderby_opt(Y) frame_opt(Z). {
1680e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, X, Y, &W);
1681e7c9ca41Sdan }
1682e7c9ca41Sdan window(A) ::= ORDER BY sortlist(Y) frame_opt(Z). {
1683e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, Y, 0);
1684e7c9ca41Sdan }
1685e7c9ca41Sdan window(A) ::= nm(W) ORDER BY sortlist(Y) frame_opt(Z). {
1686e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, Y, &W);
1687e7c9ca41Sdan }
1688e7c9ca41Sdan window(A) ::= frame_opt(Z). {
168934a7d790Sdan   A = Z;
169034a7d790Sdan }
1691e7c9ca41Sdan window(A) ::= nm(W) frame_opt(Z). {
1692e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, 0, &W);
169334a7d790Sdan }
169434a7d790Sdan 
169534a7d790Sdan frame_opt(A) ::= .                             {
1696d35300f9Sdan   A = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0);
169734a7d790Sdan }
1698d35300f9Sdan frame_opt(A) ::= range_or_rows(X) frame_bound_s(Y) frame_exclude_opt(Z). {
1699d35300f9Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0, Z);
170034a7d790Sdan }
17010f134f02Sdrh frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound_s(Y) AND
17020f134f02Sdrh                           frame_bound_e(Z) frame_exclude_opt(W). {
1703d35300f9Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr, W);
170434a7d790Sdan }
170534a7d790Sdan 
17060f134f02Sdrh range_or_rows(A) ::= RANGE|ROWS|GROUPS(X).   {A = @X; /*A-overwrites-X*/}
1707287fa17bSdan 
1708287fa17bSdan frame_bound_s(A) ::= frame_bound(X).         {A = X;}
17090f134f02Sdrh frame_bound_s(A) ::= UNBOUNDED(X) PRECEDING. {A.eType = @X; A.pExpr = 0;}
1710287fa17bSdan frame_bound_e(A) ::= frame_bound(X).         {A = X;}
17110f134f02Sdrh frame_bound_e(A) ::= UNBOUNDED(X) FOLLOWING. {A.eType = @X; A.pExpr = 0;}
1712287fa17bSdan 
17130f134f02Sdrh frame_bound(A) ::= expr(X) PRECEDING|FOLLOWING(Y).
17140f134f02Sdrh                                              {A.eType = @Y; A.pExpr = X;}
17150f134f02Sdrh frame_bound(A) ::= CURRENT(X) ROW.           {A.eType = @X; A.pExpr = 0;}
171634a7d790Sdan 
1717d35300f9Sdan %type frame_exclude_opt {u8}
17181e7cb19bSdan frame_exclude_opt(A) ::= . {A = 0;}
1719d35300f9Sdan frame_exclude_opt(A) ::= EXCLUDE frame_exclude(X). {A = X;}
1720d35300f9Sdan 
1721d35300f9Sdan %type frame_exclude {u8}
17220f134f02Sdrh frame_exclude(A) ::= NO(X) OTHERS.   {A = @X; /*A-overwrites-X*/}
17230f134f02Sdrh frame_exclude(A) ::= CURRENT(X) ROW. {A = @X; /*A-overwrites-X*/}
17240f134f02Sdrh frame_exclude(A) ::= GROUP|TIES(X).  {A = @X; /*A-overwrites-X*/}
1725d35300f9Sdan 
1726d35300f9Sdan 
1727550a3309Sdrh %type window_clause {Window*}
1728550a3309Sdrh %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);}
1729550a3309Sdrh window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; }
17306e2210e0Sdan 
17314f9adee2Sdan filter_over(A) ::= filter_clause(F) over_clause(O). {
17324f9adee2Sdan   O->pFilter = F;
17334f9adee2Sdan   A = O;
17346488271fSdan }
17354f9adee2Sdan filter_over(A) ::= over_clause(O). {
17364f9adee2Sdan   A = O;
17376488271fSdan }
17384f9adee2Sdan filter_over(A) ::= filter_clause(F). {
17394f9adee2Sdan   A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
17404f9adee2Sdan   if( A ){
17414f9adee2Sdan     A->eFrmType = TK_FILTER;
17424f9adee2Sdan     A->pFilter = F;
174300885742Sdan   }else{
174400885742Sdan     sqlite3ExprDelete(pParse->db, F);
17454f9adee2Sdan   }
17466488271fSdan }
17476488271fSdan 
17486488271fSdan over_clause(A) ::= OVER LP window(Z) RP. {
17496e2210e0Sdan   A = Z;
1750a57aac26Sdrh   assert( A!=0 );
1751a57aac26Sdrh }
17526488271fSdan over_clause(A) ::= OVER nm(Z). {
1753a57aac26Sdrh   A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
1754a57aac26Sdrh   if( A ){
1755a57aac26Sdrh     A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n);
1756a57aac26Sdrh   }
17576e2210e0Sdan }
17586e2210e0Sdan 
17596488271fSdan filter_clause(A) ::= FILTER LP WHERE expr(X) RP.  { A = X; }
1760c7bf5716Sdrh %endif /* SQLITE_OMIT_WINDOWFUNC */
1761f1722baaSdrh 
1762f1722baaSdrh /*
1763f1722baaSdrh ** The code generator needs some extra TK_ token values for tokens that
1764f1722baaSdrh ** are synthesized and do not actually appear in the grammar:
1765f1722baaSdrh */
1766f1722baaSdrh %token
1767f1722baaSdrh   COLUMN          /* Reference to a table column */
1768f1722baaSdrh   AGG_FUNCTION    /* An aggregate function */
1769f1722baaSdrh   AGG_COLUMN      /* An aggregated column */
1770ee6c5e5aSdan   TRUEFALSE       /* True or false keyword */
1771ee6c5e5aSdan   ISNOT           /* Combination of IS and NOT */
1772ee6c5e5aSdan   FUNCTION        /* A function invocation */
1773f1722baaSdrh   UMINUS          /* Unary minus */
1774f1722baaSdrh   UPLUS           /* Unary plus */
1775f1722baaSdrh   TRUTH           /* IS TRUE or IS FALSE or IS NOT TRUE or IS NOT FALSE */
1776f1722baaSdrh   REGISTER        /* Reference to a VDBE register */
1777f1722baaSdrh   VECTOR          /* Vector */
1778f1722baaSdrh   SELECT_COLUMN   /* Choose a single column from a multi-column SELECT */
1779f1722baaSdrh   IF_NULL_ROW     /* the if-null-row operator */
1780f1722baaSdrh   ASTERISK        /* The "*" in count(*) and similar */
1781f1722baaSdrh   SPAN            /* The span operator */
1782f1722baaSdrh .
1783f1722baaSdrh /* There must be no more than 255 tokens defined above.  If this grammar
1784f1722baaSdrh ** is extended with new rules and tokens, they must either be so few in
1785f1722baaSdrh ** number that TK_SPAN is no more than 255, or else the new tokens must
1786f1722baaSdrh ** appear after this line.
1787f1722baaSdrh */
1788f1722baaSdrh %include {
1789f1722baaSdrh #if TK_SPAN>255
1790f1722baaSdrh # error too many tokens in the grammar
1791f1722baaSdrh #endif
1792f1722baaSdrh }
1793f1722baaSdrh 
1794f1722baaSdrh /*
1795f1722baaSdrh ** The TK_SPACE and TK_ILLEGAL tokens must be the last two tokens.  The
1796f1722baaSdrh ** parser depends on this.  Those tokens are not used in any grammar rule.
1797f1722baaSdrh ** They are only used by the tokenizer.  Declare them last so that they
1798f1722baaSdrh ** are guaranteed to be the last two tokens
1799f1722baaSdrh */
1800f1722baaSdrh %token SPACE ILLEGAL.
1801