xref: /sqlite-3.40.0/src/parse.y (revision b6e9f7a4)
1348784efSdrh /*
2b19a2bc6Sdrh ** 2001 September 15
3348784efSdrh **
4b19a2bc6Sdrh ** The author disclaims copyright to this source code.  In place of
5b19a2bc6Sdrh ** a legal notice, here is a blessing:
6348784efSdrh **
7b19a2bc6Sdrh **    May you do good and not evil.
8b19a2bc6Sdrh **    May you find forgiveness for yourself and forgive others.
9b19a2bc6Sdrh **    May you share freely, never taking more than you give.
10348784efSdrh **
11348784efSdrh *************************************************************************
12348784efSdrh ** This file contains SQLite's grammar for SQL.  Process this file
13348784efSdrh ** using the lemon parser generator to generate C code that runs
14348784efSdrh ** the parser.  Lemon will also generate a header file containing
15348784efSdrh ** numeric codes for all of the tokens.
16348784efSdrh */
17487e262fSdrh 
18487e262fSdrh // All token codes are small integers with #defines that begin with "TK_"
19348784efSdrh %token_prefix TK_
20487e262fSdrh 
21487e262fSdrh // The type of the data attached to each token is Token.  This is also the
22487e262fSdrh // default type for non-terminals.
23487e262fSdrh //
24348784efSdrh %token_type {Token}
25f57b14a6Sdrh %default_type {Token}
26487e262fSdrh 
27fb32c44eSdrh // An extra argument to the constructor for the parser, which is available
28fb32c44eSdrh // to all actions.
29fb32c44eSdrh %extra_context {Parse *pParse}
30487e262fSdrh 
31487e262fSdrh // This code runs whenever there is a syntax error
32487e262fSdrh //
33348784efSdrh %syntax_error {
34128255fcSdrh   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
356116ee4eSdrh   if( TOKEN.z[0] ){
364adee20fSdanielk1977     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
376116ee4eSdrh   }else{
386116ee4eSdrh     sqlite3ErrorMsg(pParse, "incomplete input");
396116ee4eSdrh   }
40b86ccfb2Sdrh }
418fc3345fSdrh %stack_overflow {
428fc3345fSdrh   sqlite3ErrorMsg(pParse, "parser stack overflow");
438fc3345fSdrh }
44487e262fSdrh 
45487e262fSdrh // The name of the generated procedure that implements the parser
46487e262fSdrh // is as follows:
474adee20fSdanielk1977 %name sqlite3Parser
48487e262fSdrh 
49487e262fSdrh // The following text is included near the beginning of the C source
50487e262fSdrh // code file that implements the parser.
51487e262fSdrh //
52348784efSdrh %include {
53348784efSdrh #include "sqliteInt.h"
549bbca4c1Sdrh 
559bbca4c1Sdrh /*
56d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down
57d3ec02d3Sdrh ** automaton.
58d3ec02d3Sdrh */
59d3ec02d3Sdrh #define YYNOERRORRECOVERY 1
60d3ec02d3Sdrh 
61d3ec02d3Sdrh /*
628a415d37Sdrh ** Make yytestcase() the same as testcase()
638a415d37Sdrh */
648a415d37Sdrh #define yytestcase(X) testcase(X)
658a415d37Sdrh 
668a415d37Sdrh /*
6782415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null
6882415f2dSdrh ** pointer.
6982415f2dSdrh */
70644f4c1bSdrh #define YYPARSEFREENEVERNULL 1
7182415f2dSdrh 
7282415f2dSdrh /*
73d26cc541Sdrh ** In the amalgamation, the parse.c file generated by lemon and the
74d26cc541Sdrh ** tokenize.c file are concatenated.  In that case, sqlite3RunParser()
75d26cc541Sdrh ** has access to the the size of the yyParser object and so the parser
76d26cc541Sdrh ** engine can be allocated from stack.  In that case, only the
77d26cc541Sdrh ** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked
78d26cc541Sdrh ** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be
79d26cc541Sdrh ** omitted.
80d26cc541Sdrh */
81d26cc541Sdrh #ifdef SQLITE_AMALGAMATION
82d26cc541Sdrh # define sqlite3Parser_ENGINEALWAYSONSTACK 1
83d26cc541Sdrh #endif
84d26cc541Sdrh 
85d26cc541Sdrh /*
8682415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed
8782415f2dSdrh ** into sqlite3ParserAlloc().  The default is size_t.
8882415f2dSdrh */
8982415f2dSdrh #define YYMALLOCARGTYPE  u64
9082415f2dSdrh 
9182415f2dSdrh /*
92ad3cab52Sdrh ** An instance of the following structure describes the event of a
93ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
94ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
95ad3cab52Sdrh **
96ad3cab52Sdrh **      UPDATE ON (a,b,c)
97ad3cab52Sdrh **
98ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
99c3f9bad2Sdanielk1977 */
100ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
101caec2f12Sdrh 
10286fb6e17Sdan struct FrameBound     { int eType; Expr *pExpr; };
10386fb6e17Sdan 
10425d6543dSdrh /*
1054a642b60Sdrh ** Disable lookaside memory allocation for objects that might be
1064a642b60Sdrh ** shared across database connections.
1074a642b60Sdrh */
1084a642b60Sdrh static void disableLookaside(Parse *pParse){
1094a642b60Sdrh   pParse->disableLookaside++;
1104a642b60Sdrh   pParse->db->lookaside.bDisable++;
1114a642b60Sdrh }
1124a642b60Sdrh 
113caec2f12Sdrh } // end %include
114348784efSdrh 
115826fb5a3Sdrh // Input is a single SQL command
116c4a3c779Sdrh input ::= cmdlist.
117094b2bbfSdrh cmdlist ::= cmdlist ecmd.
118826fb5a3Sdrh cmdlist ::= ecmd.
119b7f9164eSdrh ecmd ::= SEMI.
1202424aa72Sdrh ecmd ::= cmdx SEMI.
121b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
1222424aa72Sdrh ecmd ::= explain cmdx.
1238549d55eSdrh explain ::= EXPLAIN.              { pParse->explain = 1; }
1248549d55eSdrh explain ::= EXPLAIN QUERY PLAN.   { pParse->explain = 2; }
125154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
126200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
127348784efSdrh 
128382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
129c4a3c779Sdrh //
130fa86c412Sdrh 
131684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
132c4a3c779Sdrh trans_opt ::= .
133c4a3c779Sdrh trans_opt ::= TRANSACTION.
1345ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
135684917c2Sdrh %type transtype {int}
136684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
137cf82f0d3Sdrh transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
138cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
139cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
14007a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt.   {sqlite3EndTransaction(pParse,@X);}
14107a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt.     {sqlite3EndTransaction(pParse,@X);}
142c4a3c779Sdrh 
143fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
144fd7f0452Sdanielk1977 savepoint_opt ::= .
145fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
146fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
147fd7f0452Sdanielk1977 }
148fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
149fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
150fd7f0452Sdanielk1977 }
151fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
152fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
153fd7f0452Sdanielk1977 }
154fd7f0452Sdanielk1977 
155382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
156348784efSdrh //
157348784efSdrh cmd ::= create_table create_table_args.
158d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
159f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
160969fa7c1Sdrh }
161dabd04c6Sdrh createkw(A) ::= CREATE(A).  {disableLookaside(pParse);}
162dabd04c6Sdrh 
163faa59554Sdrh %type ifnotexists {int}
164faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
165faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
166f57b3399Sdrh %type temp {int}
16753c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
168d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
169154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
170d24cc427Sdrh temp(A) ::= .      {A = 0;}
1715969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
1725969da4aSdrh   sqlite3EndTable(pParse,&X,&E,F,0);
173969fa7c1Sdrh }
174969fa7c1Sdrh create_table_args ::= AS select(S). {
1755969da4aSdrh   sqlite3EndTable(pParse,0,0,0,S);
176633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
177969fa7c1Sdrh }
1783334d089Sdrh %type table_options {int}
1795969da4aSdrh table_options(A) ::= .    {A = 0;}
1805969da4aSdrh table_options(A) ::= WITHOUT nm(X). {
1815969da4aSdrh   if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
182fccda8a1Sdrh     A = TF_WithoutRowid | TF_NoVisibleRowid;
1835969da4aSdrh   }else{
1845969da4aSdrh     A = 0;
1855969da4aSdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
1865969da4aSdrh   }
1875969da4aSdrh }
188986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist.
189986dde70Sdrh columnlist ::= columnname carglist.
1902881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);}
191c4a3c779Sdrh 
1926a8700b9Sdrh // Declare some tokens early in order to influence their values, to
1936a8700b9Sdrh // improve performance and reduce the executable size.  The goal here is
1946a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric
1956a8700b9Sdrh // values that are early enough so that all jump operations are clustered
1966a8700b9Sdrh // at the beginning, but also so that the comparison tokens NE through GE
1976a8700b9Sdrh // are as large as possible so that they are near to FUNCTION, which is a
1986a8700b9Sdrh // token synthesized by addopcodes.tcl.
1996a8700b9Sdrh //
2006a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST.
2016a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL.
2026a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2036a8700b9Sdrh %token GT LE LT GE ESCAPE.
2046a8700b9Sdrh 
20531d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
20631d6fd55Sdrh // fallback to ID if they will not parse as their original value.
20731d6fd55Sdrh // This obviates the need for the "id" nonterminal.
20831d6fd55Sdrh //
20931d6fd55Sdrh %fallback ID
21031d6fd55Sdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2110a6259f5Sdrh   CONFLICT DATABASE DEFERRED DESC DETACH DO
2126cd7d489Sdrh   EACH END EXCLUSIVE EXPLAIN FAIL FOR
21331d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
21486fb6e17Sdan   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS
21531d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
21631d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
21731d6fd55Sdrh   EXCEPT INTERSECT UNION
21831d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
21931d6fd55Sdrh   REINDEX RENAME CTIME_KW IF
22031d6fd55Sdrh   .
22131d6fd55Sdrh %wildcard ANY.
22231d6fd55Sdrh 
223f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
2242d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2252d3917daSdrh // causes them to be assigned integer values that are close together,
2262d3917daSdrh // which keeps parser tables smaller.
2272d3917daSdrh //
228f2bc013cSdrh // The token values assigned to these symbols is determined by the order
229f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
230f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
231f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
232f2bc013cSdrh // constraint.
233f2bc013cSdrh //
2342d3917daSdrh %left OR.
2352d3917daSdrh %left AND.
2362d3917daSdrh %right NOT.
23703bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2389a43267bSdrh %left GT LE LT GE.
2397c6303c0Sdanielk1977 %right ESCAPE.
2402d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2412d3917daSdrh %left PLUS MINUS.
2422d3917daSdrh %left STAR SLASH REM.
243a34001c9Sdrh %left CONCAT.
244a34001c9Sdrh %left COLLATE.
2457ba5bc5bSdrh %right BITNOT.
24626cf56f8Sdrh %nonassoc ON.
2472d3917daSdrh 
2487cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2497cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2507cc84c2cSdrh //
2517cc84c2cSdrh %token_class id  ID|INDEXED.
2527cc84c2cSdrh 
2537cc84c2cSdrh 
254c4a3c779Sdrh // And "ids" is an identifer-or-string.
255c4a3c779Sdrh //
256f59b12fbSdrh %token_class ids  ID|STRING.
257c4a3c779Sdrh 
2585ad1a6c8Sdrh // The name of a column or table can be any of the following:
2595ad1a6c8Sdrh //
2605ad1a6c8Sdrh %type nm {Token}
2614dd0d3f8Sdrh nm(A) ::= id(A).
2624dd0d3f8Sdrh nm(A) ::= STRING(A).
2634dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
2645ad1a6c8Sdrh 
265986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
266487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
267487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
268487e262fSdrh //
269487e262fSdrh %type typetoken {Token}
270986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
2714dd0d3f8Sdrh typetoken(A) ::= typename(A).
2724dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
2734dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
274487e262fSdrh }
2754dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
2764dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
277487e262fSdrh }
278382c0247Sdrh %type typename {Token}
2794dd0d3f8Sdrh typename(A) ::= ids(A).
2804dd0d3f8Sdrh typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
28160218d2aSdrh signed ::= plus_num.
28260218d2aSdrh signed ::= minus_num.
283487e262fSdrh 
2841be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the
2851be266baSdrh // input text just past the last token that has been shifted into
2861be266baSdrh // the parser.  By surrounding some phrase in the grammar with two
2871be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase.
2881be266baSdrh // For example:
2891be266baSdrh //
2901be266baSdrh //      something ::= .... scanpt(A) phrase scanpt(Z).
2911be266baSdrh //
2921be266baSdrh // The text that is parsed as "phrase" is a string starting at A
2931be266baSdrh // and containing (int)(Z-A) characters.  There might be some extra
2941be266baSdrh // whitespace on either end of the text, but that can be removed in
2951be266baSdrh // post-processing, if needed.
2961be266baSdrh //
2971be266baSdrh %type scanpt {const char*}
2981be266baSdrh scanpt(A) ::= . {
299f259df5fSdrh   assert( yyLookahead!=YYNOCODE );
3001be266baSdrh   A = yyLookaheadToken.z;
3011be266baSdrh }
3021be266baSdrh 
303487e262fSdrh // "carglist" is a list of additional constraints that come after the
304487e262fSdrh // column name and column type in a CREATE TABLE statement.
305487e262fSdrh //
3064dc330ddSdrh carglist ::= carglist ccons.
307348784efSdrh carglist ::= .
3084dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
3091be266baSdrh ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z).
3101be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A,Z);}
3111be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3121be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
3131be266baSdrh ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z).
3141be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z,Z);}
3151be266baSdrh ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z).      {
3161be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3171be266baSdrh   sqlite3AddDefaultValue(pParse,p,A.z,Z);
3187977a17fSdanielk1977 }
3191be266baSdrh ccons ::= DEFAULT scanpt id(X).       {
3201be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
321d7fd899eSdrh   if( p ){
322171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
32396acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
324d7fd899eSdrh   }
3251be266baSdrh   sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3267977a17fSdanielk1977 }
327348784efSdrh 
328382c0247Sdrh // In addition to the type name, we also care about the primary key and
329382c0247Sdrh // UNIQUE constraints.
330348784efSdrh //
3310d316a40Sdrh ccons ::= NULL onconf.
3324adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
333fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
334fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
33562340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
33662340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3371be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
338108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3394adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3404adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
34139002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
34204738cb9Sdrh 
343205f48e6Sdrh // The optional AUTOINCREMENT keyword
344205f48e6Sdrh %type autoinc {int}
345205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3462958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
347205f48e6Sdrh 
348c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
349c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
350c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
351c2eef3b3Sdrh // check fails.
35204738cb9Sdrh //
353c2eef3b3Sdrh %type refargs {int}
354fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3554dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
356c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
357c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
358c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
359c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
360c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
361c2eef3b3Sdrh %type refact {int}
362fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
363fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
364fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
365fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
366fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
367c2eef3b3Sdrh %type defer_subclause {int}
3681da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
369c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
370c2eef3b3Sdrh %type init_deferred_pred_opt {int}
371c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
372c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
373c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
374348784efSdrh 
37519a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3764dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
377ab35eaedSdrh conslist ::= conslist tconscomma tcons.
378ab35eaedSdrh conslist ::= tcons.
379ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
380ab35eaedSdrh tconscomma ::= .
381ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
382108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
383fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
384108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
38562340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
38662340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
387b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
3881be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
389108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
390108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3914adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3924adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
393c2eef3b3Sdrh }
394c2eef3b3Sdrh %type defer_subclause_opt {int}
395c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
3964dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
3979cfcf5d4Sdrh 
3989cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3999cfcf5d4Sdrh // default behavior when there is a constraint conflict.
4009cfcf5d4Sdrh //
4019cfcf5d4Sdrh %type onconf {int}
4023334d089Sdrh %type orconf {int}
4031c92853dSdrh %type resolvetype {int}
4041c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4051c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4061c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4073334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4084dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4091c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4101c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
411348784efSdrh 
412382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
413348784efSdrh //
414a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
415a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
416a8858103Sdanielk1977 }
417a073384fSdrh %type ifexists {int}
418a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
419a073384fSdrh ifexists(A) ::= .            {A = 0;}
420348784efSdrh 
421a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
422a76b5dfcSdrh //
423b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
424108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4258981b904Sdrh           AS select(S). {
4268981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
427a76b5dfcSdrh }
428a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
429a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
430a76b5dfcSdrh }
431154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
432a76b5dfcSdrh 
433382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
434348784efSdrh //
4357d562dbeSdan cmd ::= select(X).  {
436edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4377d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
438633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4399bb61fe7Sdrh }
440efb7251dSdrh 
4419bb61fe7Sdrh %type select {Select*}
442633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4437d562dbeSdan %type selectnowith {Select*}
4447d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
44582c3d636Sdrh %type oneselect {Select*}
446633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4479bb61fe7Sdrh 
448772460fdSdrh %include {
449772460fdSdrh   /*
450772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
451772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
452772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
453772460fdSdrh   */
454e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
455d227a291Sdrh     if( p->pPrior ){
456772460fdSdrh       Select *pNext = 0, *pLoop;
457772460fdSdrh       int mxSelect, cnt = 0;
458d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
459d227a291Sdrh         pLoop->pNext = pNext;
460d227a291Sdrh         pLoop->selFlags |= SF_Compound;
461d227a291Sdrh       }
462772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
463772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
464772460fdSdrh         cnt>mxSelect
465a0c01768Sdrh       ){
466d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
467d227a291Sdrh       }
468d227a291Sdrh     }
469772460fdSdrh   }
470772460fdSdrh }
471772460fdSdrh 
472a5746e03Sdrh select(A) ::= WITH wqlist(W) selectnowith(X). {
473772460fdSdrh   Select *p = X;
474772460fdSdrh   if( p ){
475772460fdSdrh     p->pWith = W;
476772460fdSdrh     parserDoubleLinkSelect(pParse, p);
477a9f5c13dSdan   }else{
478a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
479a9f5c13dSdan   }
480a5746e03Sdrh   A = p;
481a5746e03Sdrh }
482a5746e03Sdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X). {
483a5746e03Sdrh   Select *p = X;
484a5746e03Sdrh   if( p ){
485a5746e03Sdrh     p->pWith = W;
486a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
487a5746e03Sdrh   }else{
488a5746e03Sdrh     sqlite3WithDelete(pParse->db, W);
489a5746e03Sdrh   }
490a5746e03Sdrh   A = p;
491a5746e03Sdrh }
492a5746e03Sdrh select(A) ::= selectnowith(X). {
493a5746e03Sdrh   Select *p = X;
494a5746e03Sdrh   if( p ){
495a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
496a5746e03Sdrh   }
497a5746e03Sdrh   A = p; /*A-overwrites-X*/
498a9f5c13dSdan }
4997d562dbeSdan 
5004dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
501b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
5024dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
503c0bf493eSdrh   Select *pRhs = Z;
5044dd0d3f8Sdrh   Select *pLhs = A;
505c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
506c0bf493eSdrh     SrcList *pFrom;
507c0bf493eSdrh     Token x;
508c0bf493eSdrh     x.n = 0;
509772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
510c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
5118c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
512c0bf493eSdrh   }
513c0bf493eSdrh   if( pRhs ){
514c0bf493eSdrh     pRhs->op = (u8)Y;
51500d5ab74Sdrh     pRhs->pPrior = pLhs;
51600d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
517772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
518d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
51943b78826Sdrh   }else{
52000d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
521daffd0e5Sdrh   }
522c0bf493eSdrh   A = pRhs;
52382c3d636Sdrh }
5240a36c57eSdrh %type multiselect_op {int}
525cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5260a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
527cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
528154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
529abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
5309bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
53143303de9Sdrh #if SELECTTRACE_ENABLED
53243303de9Sdrh   Token s = S; /*A-overwrites-S*/
53343303de9Sdrh #endif
5348c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
535abd4c723Sdrh #if SELECTTRACE_ENABLED
536eb9b884cSdrh   /* Populate the Select.zSelName[] string that is used to help with
537abd4c723Sdrh   ** query planner debugging, to differentiate between multiple Select
538abd4c723Sdrh   ** objects in a complex query.
539abd4c723Sdrh   **
540abd4c723Sdrh   ** If the SELECT keyword is immediately followed by a C-style comment
541abd4c723Sdrh   ** then extract the first few alphanumeric characters from within that
542eb9b884cSdrh   ** comment to be the zSelName value.  Otherwise, the label is #N where
543abd4c723Sdrh   ** is an integer that is incremented with each SELECT statement seen.
544abd4c723Sdrh   */
545abd4c723Sdrh   if( A!=0 ){
54643303de9Sdrh     const char *z = s.z+6;
547abd4c723Sdrh     int i;
548cfd74700Sdrh     sqlite3_snprintf(sizeof(A->zSelName), A->zSelName,"#%d",++pParse->nSelect);
549abd4c723Sdrh     while( z[0]==' ' ) z++;
550abd4c723Sdrh     if( z[0]=='/' && z[1]=='*' ){
551abd4c723Sdrh       z += 2;
552abd4c723Sdrh       while( z[0]==' ' ) z++;
553abd4c723Sdrh       for(i=0; sqlite3Isalnum(z[i]); i++){}
554eb9b884cSdrh       sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
555abd4c723Sdrh     }
556abd4c723Sdrh   }
557abd4c723Sdrh #endif /* SELECTRACE_ENABLED */
5589bb61fe7Sdrh }
5594dd0d3f8Sdrh oneselect(A) ::= values(A).
56075593d96Sdrh 
56175593d96Sdrh %type values {Select*}
56275593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
56375593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5648c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
56575593d96Sdrh }
5664dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. {
5674dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5688c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
569f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
57075593d96Sdrh   if( pRight ){
57175593d96Sdrh     pRight->op = TK_ALL;
572772460fdSdrh     pRight->pPrior = pLeft;
57375593d96Sdrh     A = pRight;
57475593d96Sdrh   }else{
575772460fdSdrh     A = pLeft;
57675593d96Sdrh   }
57775593d96Sdrh }
5789bb61fe7Sdrh 
5799bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5809bb61fe7Sdrh // present and false (0) if it is not.
5819bb61fe7Sdrh //
5823334d089Sdrh %type distinct {int}
583832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5847cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
585efb7251dSdrh distinct(A) ::= .           {A = 0;}
586348784efSdrh 
5879bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5887c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5897c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5901a1d3cd2Sdrh // opcode of TK_ASTERISK.
5919bb61fe7Sdrh //
592348784efSdrh %type selcollist {ExprList*}
593633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
594348784efSdrh %type sclp {ExprList*}
595633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
5964dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
597348784efSdrh sclp(A) ::= .                                {A = 0;}
5981be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
5991be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
600b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
6011be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
60201f3f253Sdrh }
603d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
6041a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
6054dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
6067c917d19Sdrh }
6071be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
608abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
609abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
610abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
6114dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
61254473229Sdrh }
61301f3f253Sdrh 
61401f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
61501f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
61601f3f253Sdrh //
61701f3f253Sdrh %type as {Token}
6185ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
6194dd0d3f8Sdrh as(X) ::= ids(X).
620986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6219bb61fe7Sdrh 
622348784efSdrh 
623ad3cab52Sdrh %type seltablist {SrcList*}
624633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
625ad3cab52Sdrh %type stl_prefix {SrcList*}
626633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
627ad3cab52Sdrh %type from {SrcList*}
628633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
629348784efSdrh 
63001f3f253Sdrh // A complete FROM clause.
63101f3f253Sdrh //
63217435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
63361dfc31dSdrh from(A) ::= FROM seltablist(X). {
63461dfc31dSdrh   A = X;
63561dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
63661dfc31dSdrh }
63701f3f253Sdrh 
63801f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
63901f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
64001f3f253Sdrh //
6414dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6428a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
64301f3f253Sdrh }
644348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6454dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
646e9240418Sdrh                   on_opt(N) using_opt(U). {
6474dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
648b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
64901f3f253Sdrh }
6504dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
65101d230ceSdrh                   on_opt(N) using_opt(U). {
6524dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
65301d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
65401d230ceSdrh }
65551522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6564dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
657b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6584dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
65922f70c32Sdrh   }
6604dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
661fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6624dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
663fbdc7f69Sdrh       A = F;
664832ee3d4Sdrh     }else if( F->nSrc==1 ){
6654dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
666832ee3d4Sdrh       if( A ){
667832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
668832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
669832ee3d4Sdrh         pNew->zName = pOld->zName;
670832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6713c449c6bSdrh         pNew->pSelect = pOld->pSelect;
672832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6733c449c6bSdrh         pOld->pSelect = 0;
674832ee3d4Sdrh       }
675832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
676fbdc7f69Sdrh     }else{
677fbdc7f69Sdrh       Select *pSubquery;
678fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6798c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6804dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
681fbdc7f69Sdrh     }
682fbdc7f69Sdrh   }
683154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
684b733d037Sdrh 
685113088ecSdrh %type dbnm {Token}
686113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
687113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
688113088ecSdrh 
68974ad7fe9Sdrh %type fullname {SrcList*}
690633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
691a5746e03Sdrh fullname(A) ::= nm(X).
692a5746e03Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/}
693a5746e03Sdrh fullname(A) ::= nm(X) DOT nm(Y).
694cf82f0d3Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
69574ad7fe9Sdrh 
6965e3a6ebfSdrh %type xfullname {SrcList*}
6975e3a6ebfSdrh %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);}
6985e3a6ebfSdrh xfullname(A) ::= nm(X).
6995e3a6ebfSdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/}
7005e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y).
7015e3a6ebfSdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
7025e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z).  {
7035e3a6ebfSdrh    A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/
7045e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7055e3a6ebfSdrh }
7065e3a6ebfSdrh xfullname(A) ::= nm(X) AS nm(Z). {
7075e3a6ebfSdrh    A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/
7085e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7095e3a6ebfSdrh }
7105e3a6ebfSdrh 
71101f3f253Sdrh %type joinop {int}
712fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
713cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
714cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
715cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
716cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
7175ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
718cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
71901f3f253Sdrh 
72026cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a
72126cf56f8Sdrh // SELECT on the RHS of a the INSERT:
72226cf56f8Sdrh //
72326cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ...
72426cf56f8Sdrh //                                        here ----^^
72526cf56f8Sdrh //
72626cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is
72726cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON
72826cf56f8Sdrh // clause associated with the JOIN.  The conflict is resolved in favor
72926cf56f8Sdrh // of the JOIN.  If an ON CONFLICT clause is intended, insert a dummy
73026cf56f8Sdrh // WHERE clause in between, like this:
73126cf56f8Sdrh //
73226cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ...
73326cf56f8Sdrh //
73426cf56f8Sdrh // The [AND] and [OR] precedence marks in the rules for on_opt cause the
73526cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN.
73626cf56f8Sdrh //
73701f3f253Sdrh %type on_opt {Expr*}
738633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
7391be266baSdrh on_opt(N) ::= ON expr(E).  {N = E;}
74026cf56f8Sdrh on_opt(N) ::= .     [OR]   {N = 0;}
74101f3f253Sdrh 
74285574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
74385574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
74485574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
74585574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
74685574e31Sdanielk1977 // in the token.
74785574e31Sdanielk1977 //
74885574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
749b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
75085574e31Sdanielk1977 // recognizes and interprets this as a special case.
75185574e31Sdanielk1977 //
75285574e31Sdanielk1977 %type indexed_opt {Token}
75385574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
75485574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
75585574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
75685574e31Sdanielk1977 
75701f3f253Sdrh %type using_opt {IdList*}
758633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
75981eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
76001f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
76101f3f253Sdrh 
76201f3f253Sdrh 
763348784efSdrh %type orderby_opt {ExprList*}
764633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
765108aa00aSdrh 
766108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
767108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
768108aa00aSdrh // sort order.
769108aa00aSdrh //
770348784efSdrh %type sortlist {ExprList*}
771633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
772348784efSdrh 
773348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
774348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7754dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). {
7761be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
777bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
778348784efSdrh }
7798395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
7801be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
781bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
782348784efSdrh }
783348784efSdrh 
784348784efSdrh %type sortorder {int}
785348784efSdrh 
7868e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
7878e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
788bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
789348784efSdrh 
7902282792aSdrh %type groupby_opt {ExprList*}
791633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
7922282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
7939245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
7942282792aSdrh 
7952282792aSdrh %type having_opt {Expr*}
796633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
7972282792aSdrh having_opt(A) ::= .                {A = 0;}
7981be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
7992282792aSdrh 
8008c0833fbSdrh %type limit_opt {Expr*}
80115926590Sdrh 
80215926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
80315926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
80415926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
80515926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
80615926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
80715926590Sdrh // except as a transient.  So there is never anything to destroy.
80815926590Sdrh //
8098c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
8108c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
8118c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
8121be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
813a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
8141be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
815a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
8161be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
8179bbca4c1Sdrh 
818382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
819382c0247Sdrh //
820273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8215e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W)
822931577f1Sdrh         orderby_opt(O) limit_opt(L). {
823b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
8248c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
8254281bd42Sshane }
8264281bd42Sshane %endif
827273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8285e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W). {
8294281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8308c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
8314281bd42Sshane }
8324281bd42Sshane %endif
833348784efSdrh 
834348784efSdrh %type where_opt {Expr*}
835633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
836348784efSdrh 
837348784efSdrh where_opt(A) ::= .                    {A = 0;}
8381be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
839348784efSdrh 
840382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
841382c0247Sdrh //
842273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8435e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
8448b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
845b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
846b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
847eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L,0);
8484281bd42Sshane }
8494281bd42Sshane %endif
850273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
8515e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y)
852e9240418Sdrh         where_opt(W).  {
8534281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8544281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
855eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0,0);
8564281bd42Sshane }
8574281bd42Sshane %endif
858348784efSdrh 
859f8db1bc0Sdrh %type setlist {ExprList*}
860633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
861f8db1bc0Sdrh 
8624dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8631be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
864b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
865b7916a78Sdrh }
866a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8671be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
868a1251bc4Sdrh }
869b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8701be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
871b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
872b7916a78Sdrh }
873a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
8741be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
875a1251bc4Sdrh }
876348784efSdrh 
877382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
878382c0247Sdrh //
8795e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) select(S)
8802c2e844aSdrh         upsert(U). {
88146d2e5c3Sdrh   sqlite3Insert(pParse, X, S, F, R, U);
8824e9119d9Sdan }
8835e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) DEFAULT VALUES.
8844e9119d9Sdan {
8852c2e844aSdrh   sqlite3Insert(pParse, X, 0, F, R, 0);
8864e9119d9Sdan }
887348784efSdrh 
88846d2e5c3Sdrh %type upsert {Upsert*}
88954514c98Sdrh 
89054514c98Sdrh // Because upsert only occurs at the tip end of the INSERT rule for cmd,
89154514c98Sdrh // there is never a case where the value of the upsert pointer will not
89254514c98Sdrh // be destroyed by the cmd action.  So comment-out the destructor to
89354514c98Sdrh // avoid unreachable code.
89454514c98Sdrh //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);}
89546d2e5c3Sdrh upsert(A) ::= . { A = 0; }
896e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW)
897dab0eb58Sdrh               DO UPDATE SET setlist(Z) where_opt(W).
898e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W);}
899e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING.
900e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,0,0); }
901e9c2e772Sdrh upsert(A) ::= ON CONFLICT DO NOTHING.
902e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,0,0,0,0); }
90326cf56f8Sdrh 
9043334d089Sdrh %type insert_cmd {int}
905fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
906fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
907fa86c412Sdrh 
9088981b904Sdrh %type idlist_opt {IdList*}
9098981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
91081eba73eSdrh %type idlist {IdList*}
91181eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
912348784efSdrh 
9138981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
9148981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
9154dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
9164dd0d3f8Sdrh     {A = sqlite3IdListAppend(pParse->db,A,&Y);}
91781eba73eSdrh idlist(A) ::= nm(Y).
918cf82f0d3Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/}
919348784efSdrh 
920382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
921382c0247Sdrh //
922348784efSdrh 
9231be266baSdrh %type expr {Expr*}
9241be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
9251be266baSdrh %type term {Expr*}
9261be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
927b7916a78Sdrh 
928b7916a78Sdrh %include {
929b7916a78Sdrh 
930b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
931b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
932b7916a78Sdrh   ** that created the expression.
933b7916a78Sdrh   */
9341be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
9350cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
9360cd874bdSdrh     if( p ){
9370cd874bdSdrh       memset(p, 0, sizeof(Expr));
9380cd874bdSdrh       p->op = (u8)op;
9390cd874bdSdrh       p->flags = EP_Leaf;
9400cd874bdSdrh       p->iAgg = -1;
9410cd874bdSdrh       p->u.zToken = (char*)&p[1];
9420cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
9430cd874bdSdrh       p->u.zToken[t.n] = 0;
9440cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
9450cd874bdSdrh         if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted;
9460cd874bdSdrh         sqlite3Dequote(p->u.zToken);
9470cd874bdSdrh       }
9480cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
9490cd874bdSdrh       p->nHeight = 1;
9500cd874bdSdrh #endif
9510cd874bdSdrh     }
9521be266baSdrh     return p;
953b7916a78Sdrh   }
954b7916a78Sdrh }
955348784efSdrh 
9564dd0d3f8Sdrh expr(A) ::= term(A).
9571be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
9581be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9591be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9605ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
961410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
962410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
9631be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
964e1b6a5b8Sdrh }
965d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
966410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
967410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
968410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
969abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
9701be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
971d24cc427Sdrh }
9721be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9731be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9740cd874bdSdrh term(A) ::= INTEGER(X). {
9751be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
9760cd874bdSdrh }
977f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
9788679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
979de25a88cSdrh     u32 n = X.n;
9801be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
9811be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
9828f3b137fSdrh   }else{
983b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
984b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
985b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
9868f3b137fSdrh     Token t = X; /*A-overwrites-X*/
9878f3b137fSdrh     assert( t.n>=2 );
988b7916a78Sdrh     if( pParse->nested==0 ){
98943303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
9901be266baSdrh       A = 0;
991b7916a78Sdrh     }else{
9921be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
9931be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
994b7916a78Sdrh     }
995f59b12fbSdrh   }
996895d7472Sdrh }
9974dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). {
9981be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
9998b4c40d8Sdrh }
1000487e262fSdrh %ifndef SQLITE_OMIT_CAST
10011be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
10021be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
10031be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
1004487e262fSdrh }
1005154d4b24Sdrh %endif  SQLITE_OMIT_CAST
100686fb6e17Sdan expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP window(Z). {
1007994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
1008e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
10094e05c83bSdrh   }
10101be266baSdrh   A = sqlite3ExprFunction(pParse, Y, &X);
101186fb6e17Sdan   sqlite3WindowAttach(pParse, A, Z);
10121be266baSdrh   if( D==SF_Distinct && A ){
10131be266baSdrh     A->flags |= EP_Distinct;
1014fd357974Sdrh   }
1015e1b6a5b8Sdrh }
1016*b6e9f7a4Sdan expr(A) ::= id(X) LP STAR RP window(Z). {
10171be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &X);
1018*b6e9f7a4Sdan   sqlite3WindowAttach(pParse, A, Z);
1019e1b6a5b8Sdrh }
1020b71090fdSdrh term(A) ::= CTIME_KW(OP). {
10211be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &OP);
1022b7916a78Sdrh }
1023b7916a78Sdrh 
102486fb6e17Sdan 
102586fb6e17Sdan %type window {Window*}
102686fb6e17Sdan %destructor window {sqlite3WindowDelete(pParse->db, $$);}
102786fb6e17Sdan 
102886fb6e17Sdan %type frame_opt {Window*}
102986fb6e17Sdan %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);}
103086fb6e17Sdan 
103186fb6e17Sdan %type part_opt {ExprList*}
103286fb6e17Sdan %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);}
103386fb6e17Sdan 
103486fb6e17Sdan %type filter_opt {Expr*}
103586fb6e17Sdan %destructor filter_opt {sqlite3ExprDelete(pParse->db, $$);}
103686fb6e17Sdan 
103786fb6e17Sdan %type range_or_rows {int}
103886fb6e17Sdan 
103986fb6e17Sdan %type frame_bound {struct FrameBound}
104086fb6e17Sdan %destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);}
104186fb6e17Sdan 
104286fb6e17Sdan window(A) ::= . { A = 0; }
104386fb6e17Sdan window(A) ::= filter_opt(W) OVER LP part_opt(X) orderby_opt(Y) frame_opt(Z) RP.{
104486fb6e17Sdan   if( Z ){
104586fb6e17Sdan     A = Z;
104686fb6e17Sdan     A->pFilter = W;
104786fb6e17Sdan     A->pPartition = X;
104886fb6e17Sdan     A->pOrderBy = Y;
104986fb6e17Sdan   }
105086fb6e17Sdan }
105186fb6e17Sdan 
105286fb6e17Sdan part_opt(A) ::= PARTITION BY exprlist(X). { A = X; }
105386fb6e17Sdan part_opt(A) ::= .                         { A = 0; }
105486fb6e17Sdan filter_opt(A) ::= .                            { A = 0; }
105586fb6e17Sdan filter_opt(A) ::= FILTER LP WHERE expr(X) RP.  { A = X; }
105686fb6e17Sdan 
105786fb6e17Sdan frame_opt(A) ::= .                             {
105886fb6e17Sdan   A = sqlite3WindowAlloc(pParse, TK_RANGE, TK_UNBOUNDED, 0, TK_CURRENT, 0);
105986fb6e17Sdan }
106086fb6e17Sdan frame_opt(A) ::= range_or_rows(X) frame_bound(Y). {
106186fb6e17Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0);
106286fb6e17Sdan }
106386fb6e17Sdan frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound(Y) AND frame_bound(Z). {
106486fb6e17Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr);
106586fb6e17Sdan }
106686fb6e17Sdan 
106786fb6e17Sdan range_or_rows(A) ::= RANGE.   { A = TK_RANGE; }
106886fb6e17Sdan range_or_rows(A) ::= ROWS.    { A = TK_ROWS;  }
106986fb6e17Sdan 
107086fb6e17Sdan frame_bound(A) ::= UNBOUNDED PRECEDING. { A.eType = TK_UNBOUNDED; A.pExpr = 0; }
107186fb6e17Sdan frame_bound(A) ::= expr(X) PRECEDING.   { A.eType = TK_PRECEDING; A.pExpr = X; }
107286fb6e17Sdan frame_bound(A) ::= CURRENT ROW.         { A.eType = TK_CURRENT  ; A.pExpr = 0; }
107386fb6e17Sdan frame_bound(A) ::= expr(X) FOLLOWING.   { A.eType = TK_FOLLOWING; A.pExpr = X; }
107486fb6e17Sdan frame_bound(A) ::= UNBOUNDED FOLLOWING. { A.eType = TK_UNBOUNDED; A.pExpr = 0; }
107586fb6e17Sdan 
107686fb6e17Sdan 
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;
10828bd0d58eSdrh   }else{
10838bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
108471c57db0Sdan   }
108571c57db0Sdan }
108671c57db0Sdan 
10871be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y).    {A=sqlite3PExpr(pParse,@OP,A,Y);}
10881be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
10894dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
10901be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10911be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
10924dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
10931be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10944dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
10951be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10964dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
10971be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10981be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
1099410c301fSdrh %type likeop {Token}
11007e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
1101410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
11024dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
11038aa34ae0Sdrh   ExprList *pList;
1104410c301fSdrh   int bNot = OP.n & 0x80000000;
1105410c301fSdrh   OP.n &= 0x7fffffff;
11061be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
11071be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
11081be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
11091be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
11101be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
11110ac65892Sdrh }
11124dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
11131dca1458Sdrh   ExprList *pList;
1114410c301fSdrh   int bNot = OP.n & 0x80000000;
1115410c301fSdrh   OP.n &= 0x7fffffff;
11161be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
11171be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
11181be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
11191be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
11201be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
11211be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
11221dca1458Sdrh }
11237c6303c0Sdanielk1977 
11241be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
11251be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
11266a2fe093Sdrh 
11276a51741dSdrh %include {
11286a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
11296a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
11306a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
11316a51741dSdrh     sqlite3 *db = pParse->db;
1132895c00e1Sdan     if( pA && pY && pY->op==TK_NULL ){
11335e17e8b7Sshaneh       pA->op = (u8)op;
11346a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
11356a51741dSdrh       pA->pRight = 0;
11366a51741dSdrh     }
11376a51741dSdrh   }
11386a51741dSdrh }
11396a51741dSdrh 
11406a2fe093Sdrh //    expr1 IS expr2
11416a2fe093Sdrh //    expr1 IS NOT expr2
11426a2fe093Sdrh //
11436a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
11446a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
11456a2fe093Sdrh //
11464dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
11471be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
11481be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
11496a2fe093Sdrh }
11504dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
11511be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
11521be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
11536a2fe093Sdrh }
1154b7916a78Sdrh 
115543303de9Sdrh expr(A) ::= NOT(B) expr(X).
11561be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
115743303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
11581be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
11591be266baSdrh expr(A) ::= MINUS expr(X). [BITNOT]
11601be266baSdrh               {A = sqlite3PExpr(pParse, TK_UMINUS, X, 0);}
11611be266baSdrh expr(A) ::= PLUS expr(X). [BITNOT]
11621be266baSdrh               {A = sqlite3PExpr(pParse, TK_UPLUS, X, 0);}
1163b7916a78Sdrh 
11642e3a1f16Sdrh %type between_op {int}
11652e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
11662e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
11674dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
11681be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
11691be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
11701be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
11711be266baSdrh   if( A ){
11721be266baSdrh     A->x.pList = pList;
117353f733c7Sdrh   }else{
1174633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
117553f733c7Sdrh   }
11761be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1177fef5208cSdrh }
11783e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
11792e3a1f16Sdrh   %type in_op {int}
11802e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
11812e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
11821be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1183094430ebSdrh     if( Y==0 ){
1184473c1bf2Sdan       /* Expressions of the form
1185473c1bf2Sdan       **
1186473c1bf2Sdan       **      expr1 IN ()
1187473c1bf2Sdan       **      expr1 NOT IN ()
1188473c1bf2Sdan       **
1189473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1190473c1bf2Sdan       ** regardless of the value of expr1.
1191473c1bf2Sdan       */
11921be266baSdrh       sqlite3ExprDelete(pParse->db, A);
11931be266baSdrh       A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1);
11942b59b3a4Sdrh     }else if( Y->nExpr==1 ){
11952b59b3a4Sdrh       /* Expressions of the form:
11962b59b3a4Sdrh       **
11972b59b3a4Sdrh       **      expr1 IN (?1)
11982b59b3a4Sdrh       **      expr1 NOT IN (?2)
11992b59b3a4Sdrh       **
1200fbb24d10Sdrh       ** with exactly one value on the RHS can be simplified to something
1201fbb24d10Sdrh       ** like this:
12022b59b3a4Sdrh       **
1203fbb24d10Sdrh       **      expr1 == ?1
1204fbb24d10Sdrh       **      expr1 <> ?2
1205fbb24d10Sdrh       **
1206fbb24d10Sdrh       ** But, the RHS of the == or <> is marked with the EP_Generic flag
1207fbb24d10Sdrh       ** so that it may not contribute to the computation of comparison
1208fbb24d10Sdrh       ** affinity or the collating sequence to use for comparison.  Otherwise,
1209fbb24d10Sdrh       ** the semantics would be subtly different from IN or NOT IN.
12102b59b3a4Sdrh       */
1211fbb24d10Sdrh       Expr *pRHS = Y->a[0].pExpr;
12122b59b3a4Sdrh       Y->a[0].pExpr = 0;
12132b59b3a4Sdrh       sqlite3ExprListDelete(pParse->db, Y);
12145b1420e0Sdrh       /* pRHS cannot be NULL because a malloc error would have been detected
12155b1420e0Sdrh       ** before now and control would have never reached this point */
12165b1420e0Sdrh       if( ALWAYS(pRHS) ){
1217fbb24d10Sdrh         pRHS->flags &= ~EP_Collate;
1218fbb24d10Sdrh         pRHS->flags |= EP_Generic;
1219fbb24d10Sdrh       }
12201be266baSdrh       A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS);
1221094430ebSdrh     }else{
12221be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
12231be266baSdrh       if( A ){
12241be266baSdrh         A->x.pList = Y;
12251be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1226d5d56523Sdanielk1977       }else{
1227633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1228d5d56523Sdanielk1977       }
12291be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1230094430ebSdrh     }
1231fef5208cSdrh   }
12321be266baSdrh   expr(A) ::= LP select(X) RP. {
12331be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
12341be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
123551522cd3Sdrh   }
12361be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
12371be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12381be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
12391be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1240fef5208cSdrh   }
12415fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
124217435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
12438c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
12449de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
12451be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12461be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
12471be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
124823b2db23Sdrh   }
12491be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
125043303de9Sdrh     Expr *p;
12511be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
125208de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
125351522cd3Sdrh   }
1254154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1255fef5208cSdrh 
125617a7f8ddSdrh /* CASE expressions */
12571be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
12581be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
12591be266baSdrh   if( A ){
12601be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
12611be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
126253f733c7Sdrh   }else{
1263633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1264c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
126553f733c7Sdrh   }
126617a7f8ddSdrh }
126717a7f8ddSdrh %type case_exprlist {ExprList*}
1268633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12694dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
12701be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
12711be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
127217a7f8ddSdrh }
127317a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
12741be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
12751be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
127617a7f8ddSdrh }
127717a7f8ddSdrh %type case_else {Expr*}
1278633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
12791be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
128017a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
128117a7f8ddSdrh %type case_operand {Expr*}
1282633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
12831be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
128417a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1285348784efSdrh 
1286348784efSdrh %type exprlist {ExprList*}
1287633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12889245c243Sdrh %type nexprlist {ExprList*}
1289633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1290348784efSdrh 
12914dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
12929245c243Sdrh exprlist(A) ::= .                            {A = 0;}
12934dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
12941be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
129517435752Sdrh nexprlist(A) ::= expr(Y).
12961be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
12979245c243Sdrh 
1298a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
12995fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
13005fbab882Sdrh ** of parenthesis */
13015fbab882Sdrh %type paren_exprlist {ExprList*}
13025fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
13035fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
13045fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1305a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
13065fbab882Sdrh 
1307cce7d176Sdrh 
1308382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1309382c0247Sdrh //
1310d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1311108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
131217435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
131317435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
131462340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
13159cfcf5d4Sdrh }
1316717e6402Sdrh 
1317717e6402Sdrh %type uniqueflag {int}
13189cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
13199cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1320348784efSdrh 
1321348784efSdrh 
1322108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1323108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1324108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1325108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1326108aa00aSdrh //
1327108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1328108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1329108aa00aSdrh //
1330108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1331108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1332108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1333108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1334108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1335108aa00aSdrh // historical schemas.
1336108aa00aSdrh //
1337108aa00aSdrh %type eidlist {ExprList*}
1338108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1339108aa00aSdrh %type eidlist_opt {ExprList*}
1340108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1341108aa00aSdrh 
1342108aa00aSdrh %include {
1343108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1344108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1345108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1346108aa00aSdrh   ** error while parsing a legacy schema.
1347108aa00aSdrh   */
1348108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1349108aa00aSdrh     Parse *pParse,
1350108aa00aSdrh     ExprList *pPrior,
1351108aa00aSdrh     Token *pIdToken,
1352108aa00aSdrh     int hasCollate,
1353108aa00aSdrh     int sortOrder
1354108aa00aSdrh   ){
1355108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1356108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1357108aa00aSdrh         && pParse->db->init.busy==0
1358108aa00aSdrh     ){
1359108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1360108aa00aSdrh                          pIdToken->n, pIdToken->z);
13610202b29eSdanielk1977     }
1362108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1363108aa00aSdrh     return p;
1364108aa00aSdrh   }
1365108aa00aSdrh } // end %include
1366108aa00aSdrh 
1367108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1368108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
13694dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
13704dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1371108aa00aSdrh }
1372108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1373cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
13740202b29eSdanielk1977 }
13750202b29eSdanielk1977 
1376108aa00aSdrh %type collate {int}
1377108aa00aSdrh collate(C) ::= .              {C = 0;}
1378108aa00aSdrh collate(C) ::= COLLATE ids.   {C = 1;}
1379a34001c9Sdrh 
1380348784efSdrh 
13818aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1382382c0247Sdrh //
13834d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1384982cef7eSdrh 
1385382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1386382c0247Sdrh //
1387154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1388fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
13899ef5e770Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
13909ef5e770Sdrh cmd ::= VACUUM nm(X).          {sqlite3Vacuum(pParse,&X);}
1391fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1392154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1393f57b14a6Sdrh 
1394382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1395382c0247Sdrh //
139613d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
139791cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1398ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1399ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1400ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1401ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1402ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1403ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1404ada2ee0dSdrh 
1405cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1406cf82f0d3Sdrh nmnum(A) ::= nm(A).
1407cf82f0d3Sdrh nmnum(A) ::= ON(A).
1408cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1409cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1410154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1411f59b12fbSdrh %token_class number INTEGER|FLOAT.
14128395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1413cf82f0d3Sdrh plus_num(A) ::= number(A).
1414f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1415c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1416f0f258b1Sdrh 
1417b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1418b7f9164eSdrh 
1419d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
14204b59ab5eSdrh   Token all;
14214b59ab5eSdrh   all.z = A.z;
1422b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
14234adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1424f0f258b1Sdrh }
1425f0f258b1Sdrh 
1426fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1427fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
142860218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
142960218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1430cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1431c3f9bad2Sdanielk1977 }
1432c3f9bad2Sdanielk1977 
1433c3f9bad2Sdanielk1977 %type trigger_time {int}
14346559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1435c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1436c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1437c3f9bad2Sdanielk1977 
1438ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1439633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1440cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1441cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
144281eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1443c3f9bad2Sdanielk1977 
144460218d2aSdrh foreach_clause ::= .
144560218d2aSdrh foreach_clause ::= FOR EACH ROW.
1446c3f9bad2Sdanielk1977 
1447c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1448633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1449c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
14501be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1451c3f9bad2Sdanielk1977 
1452c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1453633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
14544dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
14554dd0d3f8Sdrh   assert( A!=0 );
14564dd0d3f8Sdrh   A->pLast->pNext = X;
14574dd0d3f8Sdrh   A->pLast = X;
1458a69d9168Sdrh }
14594dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
14604dd0d3f8Sdrh   assert( A!=0 );
14614dd0d3f8Sdrh   A->pLast = A;
146281238966Sdrh }
1463c3f9bad2Sdanielk1977 
1464b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1465b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1466b1819a0bSdrh // the same database as the table that the trigger fires on.
1467b1819a0bSdrh //
1468b1819a0bSdrh %type trnm {Token}
14694dd0d3f8Sdrh trnm(A) ::= nm(A).
1470b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1471b1819a0bSdrh   A = X;
1472b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1473b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1474b1819a0bSdrh         "statements within triggers");
1475b1819a0bSdrh }
1476b1819a0bSdrh 
1477b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1478b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1479b1819a0bSdrh // since it is an exception to the default grammar rules.
1480b1819a0bSdrh //
1481b1819a0bSdrh tridxby ::= .
1482b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1483b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1484b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1485b1819a0bSdrh         "within triggers");
1486b1819a0bSdrh }
1487b1819a0bSdrh tridxby ::= NOT INDEXED. {
1488b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1489b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1490b1819a0bSdrh         "within triggers");
1491b1819a0bSdrh }
1492b1819a0bSdrh 
1493b1819a0bSdrh 
1494b1819a0bSdrh 
1495c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1496633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1497c3f9bad2Sdanielk1977 // UPDATE
1498b1819a0bSdrh trigger_cmd(A) ::=
1499f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
1500f259df5fSdrh    {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R, B.z, E);}
1501c3f9bad2Sdanielk1977 
1502c3f9bad2Sdanielk1977 // INSERT
1503f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
15042c2e844aSdrh                       trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). {
150546d2e5c3Sdrh    A = sqlite3TriggerInsertStep(pParse->db,&X,F,S,R,U,B,Z);/*A-overwrites-R*/
15062c2e844aSdrh }
1507c3f9bad2Sdanielk1977 // DELETE
1508f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
1509f259df5fSdrh    {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y, B.z, E);}
1510c3f9bad2Sdanielk1977 
1511c3f9bad2Sdanielk1977 // SELECT
1512f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1513f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1514c3f9bad2Sdanielk1977 
15156f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
15161be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
15171be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
15181be266baSdrh   if( A ){
15191be266baSdrh     A->affinity = OE_Ignore;
15204b59ab5eSdrh   }
15218aa34ae0Sdrh }
15221be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
15231be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
15241be266baSdrh   if( A ) {
15251be266baSdrh     A->affinity = (char)T;
15264b59ab5eSdrh   }
15278aa34ae0Sdrh }
1528154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1529b7f9164eSdrh 
153074ad7fe9Sdrh %type raisetype {int}
153174ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
153274ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
153374ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
153474ad7fe9Sdrh 
15356f34903eSdanielk1977 
1536c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1537b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1538fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1539fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1540c3f9bad2Sdanielk1977 }
1541154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1542113088ecSdrh 
1543113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1544fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1545f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
15461be266baSdrh   sqlite3Attach(pParse, F, D, K);
15471c2d8414Sdrh }
1548fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
15491be266baSdrh   sqlite3Detach(pParse, D);
1550fdbcdee5Sdrh }
1551fdbcdee5Sdrh 
1552f744bb56Sdanielk1977 %type key_opt {Expr*}
1553633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1554f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
15551be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1556113088ecSdrh 
1557113088ecSdrh database_kw_opt ::= DATABASE.
1558113088ecSdrh database_kw_opt ::= .
1559fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
15604343fea2Sdrh 
15614343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
15624343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
15634343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
15644343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1565154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
15669fd2a9a0Sdanielk1977 
15679f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
15689f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
15699f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
15709f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
15719f18e8a0Sdrh %endif
15729f18e8a0Sdrh 
15739fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
15749fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
15759fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
15769fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
15779fd2a9a0Sdanielk1977 }
1578986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1579986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1580986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
158119a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
158219a8e7e8Sdanielk1977 }
158319a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
15844a642b60Sdrh   disableLookaside(pParse);
158519a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
158619a8e7e8Sdanielk1977 }
158719a8e7e8Sdanielk1977 kwcolumn_opt ::= .
158819a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1589154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1590e09daa90Sdrh 
1591e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1592e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1593b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1594b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1595b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1596b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1597b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1598b9bb7c18Sdrh }
1599e09daa90Sdrh vtabarglist ::= vtabarg.
1600e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1601b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1602b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1603b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1604b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1605b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1606b9bb7c18Sdrh anylist ::= .
1607aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1608aaac8b4eSdrh anylist ::= anylist ANY.
1609154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
16108b471863Sdrh 
16118b471863Sdrh 
16128b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
16137d562dbeSdan %type wqlist {With*}
16144e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
16157d562dbeSdan 
1616a5746e03Sdrh with ::= .
16178b471863Sdrh %ifndef SQLITE_OMIT_CTE
1618a5746e03Sdrh with ::= WITH wqlist(W).              { sqlite3WithPush(pParse, W, 1); }
1619a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W).    { sqlite3WithPush(pParse, W, 1); }
16207d562dbeSdan 
1621108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1622cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
16237d562dbeSdan }
16244dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
16254dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
16268b471863Sdrh }
16278b471863Sdrh %endif  SQLITE_OMIT_CTE
1628