xref: /sqlite-3.40.0/src/parse.y (revision 1943005f)
160c71b02Sdrh %include {
2348784efSdrh /*
360c71b02Sdrh ** 2001-09-15
4348784efSdrh **
5b19a2bc6Sdrh ** The author disclaims copyright to this source code.  In place of
6b19a2bc6Sdrh ** a legal notice, here is a blessing:
7348784efSdrh **
8b19a2bc6Sdrh **    May you do good and not evil.
9b19a2bc6Sdrh **    May you find forgiveness for yourself and forgive others.
10b19a2bc6Sdrh **    May you share freely, never taking more than you give.
11348784efSdrh **
12348784efSdrh *************************************************************************
1360c71b02Sdrh ** This file contains SQLite's SQL parser.
1460c71b02Sdrh **
1560c71b02Sdrh ** The canonical source code to this file ("parse.y") is a Lemon grammar
1660c71b02Sdrh ** file that specifies the input grammar and actions to take while parsing.
1760c71b02Sdrh ** That input file is processed by Lemon to generate a C-language
1860c71b02Sdrh ** implementation of a parser for the given grammer.  You might be reading
1960c71b02Sdrh ** this comment as part of the translated C-code.  Edits should be made
2060c71b02Sdrh ** to the original parse.y sources.
21348784efSdrh */
2260c71b02Sdrh }
23487e262fSdrh 
24487e262fSdrh // All token codes are small integers with #defines that begin with "TK_"
25348784efSdrh %token_prefix TK_
26487e262fSdrh 
27487e262fSdrh // The type of the data attached to each token is Token.  This is also the
28487e262fSdrh // default type for non-terminals.
29487e262fSdrh //
30348784efSdrh %token_type {Token}
31f57b14a6Sdrh %default_type {Token}
32487e262fSdrh 
33fb32c44eSdrh // An extra argument to the constructor for the parser, which is available
34fb32c44eSdrh // to all actions.
35fb32c44eSdrh %extra_context {Parse *pParse}
36487e262fSdrh 
37487e262fSdrh // This code runs whenever there is a syntax error
38487e262fSdrh //
39348784efSdrh %syntax_error {
40128255fcSdrh   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
416116ee4eSdrh   if( TOKEN.z[0] ){
424adee20fSdanielk1977     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
436116ee4eSdrh   }else{
446116ee4eSdrh     sqlite3ErrorMsg(pParse, "incomplete input");
456116ee4eSdrh   }
46b86ccfb2Sdrh }
478fc3345fSdrh %stack_overflow {
488fc3345fSdrh   sqlite3ErrorMsg(pParse, "parser stack overflow");
498fc3345fSdrh }
50487e262fSdrh 
51487e262fSdrh // The name of the generated procedure that implements the parser
52487e262fSdrh // is as follows:
534adee20fSdanielk1977 %name sqlite3Parser
54487e262fSdrh 
55487e262fSdrh // The following text is included near the beginning of the C source
56487e262fSdrh // code file that implements the parser.
57487e262fSdrh //
58348784efSdrh %include {
59348784efSdrh #include "sqliteInt.h"
609bbca4c1Sdrh 
619bbca4c1Sdrh /*
62d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down
63d3ec02d3Sdrh ** automaton.
64d3ec02d3Sdrh */
65d3ec02d3Sdrh #define YYNOERRORRECOVERY 1
66d3ec02d3Sdrh 
67d3ec02d3Sdrh /*
688a415d37Sdrh ** Make yytestcase() the same as testcase()
698a415d37Sdrh */
708a415d37Sdrh #define yytestcase(X) testcase(X)
718a415d37Sdrh 
728a415d37Sdrh /*
7382415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null
7482415f2dSdrh ** pointer.
7582415f2dSdrh */
76644f4c1bSdrh #define YYPARSEFREENEVERNULL 1
7782415f2dSdrh 
7882415f2dSdrh /*
79d26cc541Sdrh ** In the amalgamation, the parse.c file generated by lemon and the
80d26cc541Sdrh ** tokenize.c file are concatenated.  In that case, sqlite3RunParser()
81d26cc541Sdrh ** has access to the the size of the yyParser object and so the parser
82d26cc541Sdrh ** engine can be allocated from stack.  In that case, only the
83d26cc541Sdrh ** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked
84d26cc541Sdrh ** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be
85d26cc541Sdrh ** omitted.
86d26cc541Sdrh */
87d26cc541Sdrh #ifdef SQLITE_AMALGAMATION
88d26cc541Sdrh # define sqlite3Parser_ENGINEALWAYSONSTACK 1
89d26cc541Sdrh #endif
90d26cc541Sdrh 
91d26cc541Sdrh /*
9282415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed
9382415f2dSdrh ** into sqlite3ParserAlloc().  The default is size_t.
9482415f2dSdrh */
9582415f2dSdrh #define YYMALLOCARGTYPE  u64
9682415f2dSdrh 
9782415f2dSdrh /*
98ad3cab52Sdrh ** An instance of the following structure describes the event of a
99ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
100ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
101ad3cab52Sdrh **
102ad3cab52Sdrh **      UPDATE ON (a,b,c)
103ad3cab52Sdrh **
104ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
105c3f9bad2Sdanielk1977 */
106ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
107caec2f12Sdrh 
10886fb6e17Sdan struct FrameBound     { int eType; Expr *pExpr; };
10986fb6e17Sdan 
11025d6543dSdrh /*
1114a642b60Sdrh ** Disable lookaside memory allocation for objects that might be
1124a642b60Sdrh ** shared across database connections.
1134a642b60Sdrh */
disableLookaside(Parse * pParse)1144a642b60Sdrh static void disableLookaside(Parse *pParse){
11531f69626Sdrh   sqlite3 *db = pParse->db;
1164a642b60Sdrh   pParse->disableLookaside++;
11731f69626Sdrh   DisableLookaside;
1184a642b60Sdrh }
1194a642b60Sdrh 
12027ee29f6Sdrh #if !defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) \
12127ee29f6Sdrh  && defined(SQLITE_UDL_CAPABLE_PARSER)
122c601f101Sdrh /*
123c601f101Sdrh ** Issue an error message if an ORDER BY or LIMIT clause occurs on an
124c601f101Sdrh ** UPDATE or DELETE statement.
125c601f101Sdrh */
updateDeleteLimitError(Parse * pParse,ExprList * pOrderBy,Expr * pLimit)126c601f101Sdrh static void updateDeleteLimitError(
127c601f101Sdrh   Parse *pParse,
128c601f101Sdrh   ExprList *pOrderBy,
129c601f101Sdrh   Expr *pLimit
130c601f101Sdrh ){
131c601f101Sdrh   if( pOrderBy ){
132c601f101Sdrh     sqlite3ErrorMsg(pParse, "syntax error near \"ORDER BY\"");
133c601f101Sdrh   }else{
134c601f101Sdrh     sqlite3ErrorMsg(pParse, "syntax error near \"LIMIT\"");
135c601f101Sdrh   }
136c601f101Sdrh   sqlite3ExprListDelete(pParse->db, pOrderBy);
137c601f101Sdrh   sqlite3ExprDelete(pParse->db, pLimit);
138c601f101Sdrh }
139c601f101Sdrh #endif /* SQLITE_ENABLE_UPDATE_DELETE_LIMIT */
140c601f101Sdrh 
141caec2f12Sdrh } // end %include
142348784efSdrh 
143826fb5a3Sdrh // Input is a single SQL command
144c4a3c779Sdrh input ::= cmdlist.
145094b2bbfSdrh cmdlist ::= cmdlist ecmd.
146826fb5a3Sdrh cmdlist ::= ecmd.
147b7f9164eSdrh ecmd ::= SEMI.
1482424aa72Sdrh ecmd ::= cmdx SEMI.
149b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
150e94006ebSdrh ecmd ::= explain cmdx SEMI.       {NEVER-REDUCE}
1518549d55eSdrh explain ::= EXPLAIN.              { pParse->explain = 1; }
1528549d55eSdrh explain ::= EXPLAIN QUERY PLAN.   { pParse->explain = 2; }
153154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
154200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
155348784efSdrh 
156382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
157c4a3c779Sdrh //
158fa86c412Sdrh 
transtype(Y)159684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
160c4a3c779Sdrh trans_opt ::= .
161c4a3c779Sdrh trans_opt ::= TRANSACTION.
1625ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
163684917c2Sdrh %type transtype {int}
transtype(A)164684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
transtype(A)165cf82f0d3Sdrh transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
transtype(A)166cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
transtype(A)167cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
16807a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt.   {sqlite3EndTransaction(pParse,@X);}
ROLLBACK(X)16907a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt.     {sqlite3EndTransaction(pParse,@X);}
170c4a3c779Sdrh 
171fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
172fd7f0452Sdanielk1977 savepoint_opt ::= .
nm(X)173fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
174fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
175fd7f0452Sdanielk1977 }
nm(X)176fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
177fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
178fd7f0452Sdanielk1977 }
nm(X)179fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
180fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
181fd7f0452Sdanielk1977 }
182fd7f0452Sdanielk1977 
183382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
184348784efSdrh //
185348784efSdrh cmd ::= create_table create_table_args.
temp(T)186d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
187f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
188969fa7c1Sdrh }
createkw(A)189dabd04c6Sdrh createkw(A) ::= CREATE(A).  {disableLookaside(pParse);}
190dabd04c6Sdrh 
191faa59554Sdrh %type ifnotexists {int}
ifnotexists(A)192faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
ifnotexists(A)193faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
194f57b3399Sdrh %type temp {int}
19553c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
196c6458711Sdrh temp(A) ::= TEMP.  {A = pParse->db->init.busy==0;}
197154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
198d24cc427Sdrh temp(A) ::= .      {A = 0;}
conslist_opt(X)19944183f83Sdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_option_set(F). {
2005969da4aSdrh   sqlite3EndTable(pParse,&X,&E,F,0);
201969fa7c1Sdrh }
select(S)202969fa7c1Sdrh create_table_args ::= AS select(S). {
2035969da4aSdrh   sqlite3EndTable(pParse,0,0,0,S);
204633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
205969fa7c1Sdrh }
20644183f83Sdrh %type table_option_set {u32}
20744183f83Sdrh %type table_option {u32}
table_option_set(A)20844183f83Sdrh table_option_set(A) ::= .    {A = 0;}
table_option_set(A)20944183f83Sdrh table_option_set(A) ::= table_option(A).
21044183f83Sdrh table_option_set(A) ::= table_option_set(X) COMMA table_option(Y). {A = X|Y;}
table_option(A)21144183f83Sdrh table_option(A) ::= WITHOUT nm(X). {
2125969da4aSdrh   if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
213fccda8a1Sdrh     A = TF_WithoutRowid | TF_NoVisibleRowid;
2145969da4aSdrh   }else{
2155969da4aSdrh     A = 0;
2165969da4aSdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
2175969da4aSdrh   }
2185969da4aSdrh }
table_option(A)21944183f83Sdrh table_option(A) ::= nm(X). {
22044183f83Sdrh   if( X.n==6 && sqlite3_strnicmp(X.z,"strict",6)==0 ){
22144183f83Sdrh     A = TF_Strict;
22244183f83Sdrh   }else{
22344183f83Sdrh     A = 0;
22444183f83Sdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
22544183f83Sdrh   }
22644183f83Sdrh }
227986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist.
228986dde70Sdrh columnlist ::= columnname carglist.
columnname(A)22977441fafSdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,A,Y);}
230c4a3c779Sdrh 
2316a8700b9Sdrh // Declare some tokens early in order to influence their values, to
2326a8700b9Sdrh // improve performance and reduce the executable size.  The goal here is
2336a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric
2346a8700b9Sdrh // values that are early enough so that all jump operations are clustered
2357bbdc3c5Sdrh // at the beginning.
2366a8700b9Sdrh //
2376a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST.
2386a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL.
239d5326c33Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2406a8700b9Sdrh %token GT LE LT GE ESCAPE.
2416a8700b9Sdrh 
24231d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
24331d6fd55Sdrh // fallback to ID if they will not parse as their original value.
24431d6fd55Sdrh // This obviates the need for the "id" nonterminal.
24531d6fd55Sdrh //
24631d6fd55Sdrh %fallback ID
24731d6fd55Sdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2480a6259f5Sdrh   CONFLICT DATABASE DEFERRED DESC DETACH DO
2496cd7d489Sdrh   EACH END EXCLUSIVE EXPLAIN FAIL FOR
25031d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
25186fb6e17Sdan   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS
25231d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
2536e11892dSdan   NULLS FIRST LAST
25431d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
25531d6fd55Sdrh   EXCEPT INTERSECT UNION
25631d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
2573773c25fSdrh %ifndef SQLITE_OMIT_WINDOWFUNC
2586e2210e0Sdan   CURRENT FOLLOWING PARTITION PRECEDING RANGE UNBOUNDED
259ced89124Sdan   EXCLUDE GROUPS OTHERS TIES
2603773c25fSdrh %endif SQLITE_OMIT_WINDOWFUNC
2619ee94147Sdrh %ifndef SQLITE_OMIT_GENERATED_COLUMNS
262089c4bc2Sdrh   GENERATED ALWAYS
2639ee94147Sdrh %endif
264745912efSdrh   MATERIALIZED
26531d6fd55Sdrh   REINDEX RENAME CTIME_KW IF
26631d6fd55Sdrh   .
26731d6fd55Sdrh %wildcard ANY.
26831d6fd55Sdrh 
269f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
2702d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2712d3917daSdrh // causes them to be assigned integer values that are close together,
2722d3917daSdrh // which keeps parser tables smaller.
2732d3917daSdrh //
274f2bc013cSdrh // The token values assigned to these symbols is determined by the order
275f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
276f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
277f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
278f2bc013cSdrh // constraint.
279f2bc013cSdrh //
2802d3917daSdrh %left OR.
2812d3917daSdrh %left AND.
2822d3917daSdrh %right NOT.
28303bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2849a43267bSdrh %left GT LE LT GE.
2857c6303c0Sdanielk1977 %right ESCAPE.
2862d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2872d3917daSdrh %left PLUS MINUS.
2882d3917daSdrh %left STAR SLASH REM.
289d5326c33Sdrh %left CONCAT PTR.
290a34001c9Sdrh %left COLLATE.
2917ba5bc5bSdrh %right BITNOT.
29226cf56f8Sdrh %nonassoc ON.
2932d3917daSdrh 
2947cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2957cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2967cc84c2cSdrh //
2977cc84c2cSdrh %token_class id  ID|INDEXED.
2987cc84c2cSdrh 
2997cc84c2cSdrh 
300c4a3c779Sdrh // And "ids" is an identifer-or-string.
301c4a3c779Sdrh //
302f59b12fbSdrh %token_class ids  ID|STRING.
303c4a3c779Sdrh 
3045ad1a6c8Sdrh // The name of a column or table can be any of the following:
3055ad1a6c8Sdrh //
3065ad1a6c8Sdrh %type nm {Token}
3074dd0d3f8Sdrh nm(A) ::= id(A).
3084dd0d3f8Sdrh nm(A) ::= STRING(A).
3094dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
3105ad1a6c8Sdrh 
311986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
312487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
313487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
314487e262fSdrh //
315487e262fSdrh %type typetoken {Token}
typetoken(A)316986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
typetoken(A)3174dd0d3f8Sdrh typetoken(A) ::= typename(A).
3184dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
3194dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
320487e262fSdrh }
typetoken(A)3214dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
3224dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
323487e262fSdrh }
324382c0247Sdrh %type typename {Token}
typename(A)32559ff4251Sdan typename(A) ::= ids(A).
32659ff4251Sdan typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
32760218d2aSdrh signed ::= plus_num.
32860218d2aSdrh signed ::= minus_num.
329487e262fSdrh 
3301be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the
3311be266baSdrh // input text just past the last token that has been shifted into
3321be266baSdrh // the parser.  By surrounding some phrase in the grammar with two
3331be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase.
3341be266baSdrh // For example:
3351be266baSdrh //
3361be266baSdrh //      something ::= .... scanpt(A) phrase scanpt(Z).
3371be266baSdrh //
3381be266baSdrh // The text that is parsed as "phrase" is a string starting at A
3391be266baSdrh // and containing (int)(Z-A) characters.  There might be some extra
3401be266baSdrh // whitespace on either end of the text, but that can be removed in
3411be266baSdrh // post-processing, if needed.
3421be266baSdrh //
3431be266baSdrh %type scanpt {const char*}
scanpt(A)3441be266baSdrh scanpt(A) ::= . {
345f259df5fSdrh   assert( yyLookahead!=YYNOCODE );
3461be266baSdrh   A = yyLookaheadToken.z;
3471be266baSdrh }
scantok(A)3484db4b5b4Sdan scantok(A) ::= . {
3494db4b5b4Sdan   assert( yyLookahead!=YYNOCODE );
3504db4b5b4Sdan   A = yyLookaheadToken;
3514db4b5b4Sdan }
3521be266baSdrh 
353487e262fSdrh // "carglist" is a list of additional constraints that come after the
354487e262fSdrh // column name and column type in a CREATE TABLE statement.
355487e262fSdrh //
3564dc330ddSdrh carglist ::= carglist ccons.
357348784efSdrh carglist ::= .
nm(X)3584dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
scantok(A)3594db4b5b4Sdan ccons ::= DEFAULT scantok(A) term(X).
3604db4b5b4Sdan                             {sqlite3AddDefaultValue(pParse,X,A.z,&A.z[A.n]);}
LP(A)3611be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3621be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
PLUS(A)3634db4b5b4Sdan ccons ::= DEFAULT PLUS(A) scantok(Z) term(X).
3644db4b5b4Sdan                             {sqlite3AddDefaultValue(pParse,X,A.z,&Z.z[Z.n]);}
MINUS(A)3654db4b5b4Sdan ccons ::= DEFAULT MINUS(A) scantok(Z) term(X). {
3661be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3674db4b5b4Sdan   sqlite3AddDefaultValue(pParse,p,A.z,&Z.z[Z.n]);
3687977a17fSdanielk1977 }
id(X)3694db4b5b4Sdan ccons ::= DEFAULT scantok id(X).       {
3701be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
371d7fd899eSdrh   if( p ){
372171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
37396acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
374d7fd899eSdrh   }
3751be266baSdrh     sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3767977a17fSdanielk1977 }
377348784efSdrh 
378382c0247Sdrh // In addition to the type name, we also care about the primary key and
379382c0247Sdrh // UNIQUE constraints.
380348784efSdrh //
3810d316a40Sdrh ccons ::= NULL onconf.
onconf(R)3824adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
sortorder(Z)383fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
384fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
onconf(R)38562340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
38662340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
LP(A)38792e21ef0Sdrh ccons ::= CHECK LP(A) expr(X) RP(B).  {sqlite3AddCheckConstraint(pParse,X,A.z,B.z);}
nm(T)388108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3894adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
defer_subclause(D)3904adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
ids(C)39159ff4251Sdan ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
39281f7b372Sdrh ccons ::= GENERATED ALWAYS AS generated.
39381f7b372Sdrh ccons ::= AS generated.
expr(E)3947e508f1eSdrh generated ::= LP expr(E) RP.          {sqlite3AddGenerated(pParse,E,0);}
expr(E)3957e508f1eSdrh generated ::= LP expr(E) RP ID(TYPE). {sqlite3AddGenerated(pParse,E,&TYPE);}
39604738cb9Sdrh 
397205f48e6Sdrh // The optional AUTOINCREMENT keyword
398205f48e6Sdrh %type autoinc {int}
autoinc(X)399205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
autoinc(X)4002958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
401205f48e6Sdrh 
402c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
403c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
404c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
405c2eef3b3Sdrh // check fails.
40604738cb9Sdrh //
407c2eef3b3Sdrh %type refargs {int}
refargs(A)408fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
refargs(A)4094dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
410c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
411c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
412c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
413c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
414c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
415c2eef3b3Sdrh %type refact {int}
416fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
417fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
418fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
419fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
420fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
421c2eef3b3Sdrh %type defer_subclause {int}
4221da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
423c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
424c2eef3b3Sdrh %type init_deferred_pred_opt {int}
425c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
426c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
427c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
428348784efSdrh 
42919a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
4304dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
431ab35eaedSdrh conslist ::= conslist tconscomma tcons.
432ab35eaedSdrh conslist ::= tcons.
433ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
434ab35eaedSdrh tconscomma ::= .
435ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
436108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
437fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
438108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
43962340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
44062340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
44192e21ef0Sdrh tcons ::= CHECK LP(A) expr(E) RP(B) onconf.
44292e21ef0Sdrh                                  {sqlite3AddCheckConstraint(pParse,E,A.z,B.z);}
443108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
444108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
4454adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
4464adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
447c2eef3b3Sdrh }
448c2eef3b3Sdrh %type defer_subclause_opt {int}
449c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
4504dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
4519cfcf5d4Sdrh 
4529cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
4539cfcf5d4Sdrh // default behavior when there is a constraint conflict.
4549cfcf5d4Sdrh //
4559cfcf5d4Sdrh %type onconf {int}
4563334d089Sdrh %type orconf {int}
4571c92853dSdrh %type resolvetype {int}
4581c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4591c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4601c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4613334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4624dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4631c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4641c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
465348784efSdrh 
466382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
467348784efSdrh //
468a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
469a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
470a8858103Sdanielk1977 }
471a073384fSdrh %type ifexists {int}
472a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
473a073384fSdrh ifexists(A) ::= .            {A = 0;}
474348784efSdrh 
475a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
476a76b5dfcSdrh //
477b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
478108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4798981b904Sdrh           AS select(S). {
4808981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
481a76b5dfcSdrh }
482a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
483a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
484a76b5dfcSdrh }
485154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
486a76b5dfcSdrh 
487382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
488348784efSdrh //
4897d562dbeSdan cmd ::= select(X).  {
490a7c74006Sdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0, 0};
4917d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
492633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4939bb61fe7Sdrh }
494efb7251dSdrh 
4959bb61fe7Sdrh %type select {Select*}
496633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4977d562dbeSdan %type selectnowith {Select*}
4987d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
49982c3d636Sdrh %type oneselect {Select*}
500633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
5019bb61fe7Sdrh 
502772460fdSdrh %include {
503772460fdSdrh   /*
504772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
505772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
506772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
507772460fdSdrh   */
508e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
50955f66b34Sdrh     assert( p!=0 );
510d227a291Sdrh     if( p->pPrior ){
511aae0f74eSdrh       Select *pNext = 0, *pLoop = p;
512aae0f74eSdrh       int mxSelect, cnt = 1;
513aae0f74eSdrh       while(1){
514d227a291Sdrh         pLoop->pNext = pNext;
515d227a291Sdrh         pLoop->selFlags |= SF_Compound;
516aae0f74eSdrh         pNext = pLoop;
517aae0f74eSdrh         pLoop = pLoop->pPrior;
518aae0f74eSdrh         if( pLoop==0 ) break;
519aae0f74eSdrh         cnt++;
520aae0f74eSdrh         if( pLoop->pOrderBy || pLoop->pLimit ){
521aae0f74eSdrh           sqlite3ErrorMsg(pParse,"%s clause should come after %s not before",
522aae0f74eSdrh              pLoop->pOrderBy!=0 ? "ORDER BY" : "LIMIT",
523aae0f74eSdrh              sqlite3SelectOpName(pNext->op));
524aae0f74eSdrh           break;
525aae0f74eSdrh         }
526d227a291Sdrh       }
527772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
528772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
529772460fdSdrh         cnt>mxSelect
530a0c01768Sdrh       ){
531d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
532d227a291Sdrh       }
533d227a291Sdrh     }
534772460fdSdrh   }
535f824b41eSdrh 
536f824b41eSdrh   /* Attach a With object describing the WITH clause to a Select
537f824b41eSdrh   ** object describing the query for which the WITH clause is a prefix.
538f824b41eSdrh   */
539f824b41eSdrh   static Select *attachWithToSelect(Parse *pParse, Select *pSelect, With *pWith){
540f824b41eSdrh     if( pSelect ){
541f824b41eSdrh       pSelect->pWith = pWith;
542f824b41eSdrh       parserDoubleLinkSelect(pParse, pSelect);
543f824b41eSdrh     }else{
544f824b41eSdrh       sqlite3WithDelete(pParse->db, pWith);
545f824b41eSdrh     }
546f824b41eSdrh     return pSelect;
547f824b41eSdrh   }
548772460fdSdrh }
549772460fdSdrh 
5506a8b94e2Sdrh %ifndef SQLITE_OMIT_CTE
551f824b41eSdrh select(A) ::= WITH wqlist(W) selectnowith(X). {A = attachWithToSelect(pParse,X,W);}
552f824b41eSdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X).
553f824b41eSdrh                                               {A = attachWithToSelect(pParse,X,W);}
5546a8b94e2Sdrh %endif /* SQLITE_OMIT_CTE */
555a5746e03Sdrh select(A) ::= selectnowith(X). {
556a5746e03Sdrh   Select *p = X;
557a5746e03Sdrh   if( p ){
558a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
559a5746e03Sdrh   }
560a5746e03Sdrh   A = p; /*A-overwrites-X*/
561a9f5c13dSdan }
5627d562dbeSdan 
5634dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
564b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
5654dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
566c0bf493eSdrh   Select *pRhs = Z;
5674dd0d3f8Sdrh   Select *pLhs = A;
568c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
569c0bf493eSdrh     SrcList *pFrom;
570c0bf493eSdrh     Token x;
571c0bf493eSdrh     x.n = 0;
572772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
573d44f8b23Sdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0);
5748c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
575c0bf493eSdrh   }
576c0bf493eSdrh   if( pRhs ){
577c0bf493eSdrh     pRhs->op = (u8)Y;
57800d5ab74Sdrh     pRhs->pPrior = pLhs;
57900d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
580772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
581d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
58243b78826Sdrh   }else{
58300d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
584daffd0e5Sdrh   }
585c0bf493eSdrh   A = pRhs;
58682c3d636Sdrh }
5870a36c57eSdrh %type multiselect_op {int}
588cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5890a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
590cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
591154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
592550a3309Sdrh 
593fef37760Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
59467a9b8edSdan                  groupby_opt(P) having_opt(Q)
595e3bf632cSdan                  orderby_opt(Z) limit_opt(L). {
5968c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
597550a3309Sdrh }
598550a3309Sdrh %ifndef SQLITE_OMIT_WINDOWFUNC
599550a3309Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
600550a3309Sdrh                  groupby_opt(P) having_opt(Q) window_clause(R)
601550a3309Sdrh                  orderby_opt(Z) limit_opt(L). {
602550a3309Sdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
6036fde1799Sdan   if( A ){
6046fde1799Sdan     A->pWinDefn = R;
6056fde1799Sdan   }else{
6066fde1799Sdan     sqlite3WindowListDelete(pParse->db, R);
6076fde1799Sdan   }
6089bb61fe7Sdrh }
609550a3309Sdrh %endif
610550a3309Sdrh 
611550a3309Sdrh 
6124dd0d3f8Sdrh oneselect(A) ::= values(A).
61375593d96Sdrh 
61475593d96Sdrh %type values {Select*}
61575593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
61675593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
6178c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
61875593d96Sdrh }
619954733b3Sdrh values(A) ::= values(A) COMMA LP nexprlist(Y) RP. {
6204dd0d3f8Sdrh   Select *pRight, *pLeft = A;
6218c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
622f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
62375593d96Sdrh   if( pRight ){
62475593d96Sdrh     pRight->op = TK_ALL;
625772460fdSdrh     pRight->pPrior = pLeft;
62675593d96Sdrh     A = pRight;
62775593d96Sdrh   }else{
628772460fdSdrh     A = pLeft;
62975593d96Sdrh   }
63075593d96Sdrh }
6319bb61fe7Sdrh 
6329bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
6339bb61fe7Sdrh // present and false (0) if it is not.
6349bb61fe7Sdrh //
6353334d089Sdrh %type distinct {int}
636832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
6377cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
638efb7251dSdrh distinct(A) ::= .           {A = 0;}
639348784efSdrh 
6409bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
6417c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
6427c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
6431a1d3cd2Sdrh // opcode of TK_ASTERISK.
6449bb61fe7Sdrh //
645348784efSdrh %type selcollist {ExprList*}
646633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
647348784efSdrh %type sclp {ExprList*}
648633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
6494dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
650348784efSdrh sclp(A) ::= .                                {A = 0;}
6511be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
6521be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
653b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
6541be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
65501f3f253Sdrh }
656d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
6571a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
6584dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
6597c917d19Sdrh }
6601be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
661abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
662796588aeSdrh   Expr *pLeft = tokenExpr(pParse, TK_ID, X);
663abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
6644dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
66554473229Sdrh }
66601f3f253Sdrh 
66701f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
66801f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
66901f3f253Sdrh //
67001f3f253Sdrh %type as {Token}
6715ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
6724dd0d3f8Sdrh as(X) ::= ids(X).
673986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6749bb61fe7Sdrh 
675348784efSdrh 
676ad3cab52Sdrh %type seltablist {SrcList*}
677633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
678ad3cab52Sdrh %type stl_prefix {SrcList*}
679633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
680ad3cab52Sdrh %type from {SrcList*}
681633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
682348784efSdrh 
68301f3f253Sdrh // A complete FROM clause.
68401f3f253Sdrh //
68569887c99Sdan from(A) ::= .                {A = 0;}
68661dfc31dSdrh from(A) ::= FROM seltablist(X). {
68761dfc31dSdrh   A = X;
688fdc621aeSdrh   sqlite3SrcListShiftJoinType(pParse,A);
68961dfc31dSdrh }
69001f3f253Sdrh 
69101f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
69201f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
69301f3f253Sdrh //
6944dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6958a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
69601f3f253Sdrh }
697348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
698d44f8b23Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) on_using(N). {
699d44f8b23Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,&N);
700200adc9eSdrh }
701d44f8b23Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_by(I) on_using(N). {
702d44f8b23Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,&N);
703b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
70401f3f253Sdrh }
705d44f8b23Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) on_using(N). {
706d44f8b23Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,&N);
70701d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
70801d230ceSdrh }
70951522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
710d44f8b23Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP as(Z) on_using(N). {
711d44f8b23Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,&N);
71222f70c32Sdrh   }
713d44f8b23Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP as(Z) on_using(N). {
714d44f8b23Sdrh     if( A==0 && Z.n==0 && N.pOn==0 && N.pUsing==0 ){
715fbdc7f69Sdrh       A = F;
716832ee3d4Sdrh     }else if( F->nSrc==1 ){
717d44f8b23Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,&N);
718832ee3d4Sdrh       if( A ){
7197601294aSdrh         SrcItem *pNew = &A->a[A->nSrc-1];
7207601294aSdrh         SrcItem *pOld = F->a;
721832ee3d4Sdrh         pNew->zName = pOld->zName;
722832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
7233c449c6bSdrh         pNew->pSelect = pOld->pSelect;
724825a6bffSdrh         if( pNew->pSelect && (pNew->pSelect->selFlags & SF_NestedFrom)!=0 ){
725825a6bffSdrh           pNew->fg.isNestedFrom = 1;
726825a6bffSdrh         }
7274a5cff73Sdrh         if( pOld->fg.isTabFunc ){
7284a5cff73Sdrh           pNew->u1.pFuncArg = pOld->u1.pFuncArg;
7294a5cff73Sdrh           pOld->u1.pFuncArg = 0;
7304a5cff73Sdrh           pOld->fg.isTabFunc = 0;
7314a5cff73Sdrh           pNew->fg.isTabFunc = 1;
7324a5cff73Sdrh         }
733832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
7343c449c6bSdrh         pOld->pSelect = 0;
735832ee3d4Sdrh       }
736832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
737fbdc7f69Sdrh     }else{
738fbdc7f69Sdrh       Select *pSubquery;
739fdc621aeSdrh       sqlite3SrcListShiftJoinType(pParse,F);
7408c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
741d44f8b23Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,&N);
742fbdc7f69Sdrh     }
743fbdc7f69Sdrh   }
744154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
745b733d037Sdrh 
746113088ecSdrh %type dbnm {Token}
747113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
748113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
749113088ecSdrh 
75074ad7fe9Sdrh %type fullname {SrcList*}
751633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
752c9461eccSdan fullname(A) ::= nm(X).  {
75329c992cbSdrh   A = sqlite3SrcListAppend(pParse,0,&X,0);
754c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &X);
755c9461eccSdan }
756c9461eccSdan fullname(A) ::= nm(X) DOT nm(Y). {
75729c992cbSdrh   A = sqlite3SrcListAppend(pParse,0,&X,&Y);
758c9461eccSdan   if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &Y);
759c9461eccSdan }
76074ad7fe9Sdrh 
7615e3a6ebfSdrh %type xfullname {SrcList*}
7625e3a6ebfSdrh %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);}
7635e3a6ebfSdrh xfullname(A) ::= nm(X).
76429c992cbSdrh    {A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/}
7655e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y).
76629c992cbSdrh    {A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/}
7675e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z).  {
76829c992cbSdrh    A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/
7695e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7705e3a6ebfSdrh }
7715e3a6ebfSdrh xfullname(A) ::= nm(X) AS nm(Z). {
77229c992cbSdrh    A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/
7735e3a6ebfSdrh    if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z);
7745e3a6ebfSdrh }
7755e3a6ebfSdrh 
77601f3f253Sdrh %type joinop {int}
777fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
778cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
779cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
780cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
781cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
7825ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
783cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
78401f3f253Sdrh 
78526cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a
78626cf56f8Sdrh // SELECT on the RHS of a the INSERT:
78726cf56f8Sdrh //
78826cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ...
78926cf56f8Sdrh //                                        here ----^^
79026cf56f8Sdrh //
79126cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is
79226cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON
79326cf56f8Sdrh // clause associated with the JOIN.  The conflict is resolved in favor
79426cf56f8Sdrh // of the JOIN.  If an ON CONFLICT clause is intended, insert a dummy
79526cf56f8Sdrh // WHERE clause in between, like this:
79626cf56f8Sdrh //
79726cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ...
79826cf56f8Sdrh //
799d44f8b23Sdrh // The [AND] and [OR] precedence marks in the rules for on_using cause the
80026cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN.
80126cf56f8Sdrh //
802d44f8b23Sdrh %type on_using {OnOrUsing}
803d44f8b23Sdrh //%destructor on_using {sqlite3ClearOnOrUsing(pParse->db, &$$);}
804d44f8b23Sdrh on_using(N) ::= ON expr(E).            {N.pOn = E; N.pUsing = 0;}
805d44f8b23Sdrh on_using(N) ::= USING LP idlist(L) RP. {N.pOn = 0; N.pUsing = L;}
806d44f8b23Sdrh on_using(N) ::= .                 [OR] {N.pOn = 0; N.pUsing = 0;}
80701f3f253Sdrh 
80885574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
80985574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
81085574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
81185574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
81285574e31Sdanielk1977 // in the token.
81385574e31Sdanielk1977 //
81485574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
815b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
81685574e31Sdanielk1977 // recognizes and interprets this as a special case.
81785574e31Sdanielk1977 //
81885574e31Sdanielk1977 %type indexed_opt {Token}
819200adc9eSdrh %type indexed_by  {Token}
82085574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
821200adc9eSdrh indexed_opt(A) ::= indexed_by(A).
822200adc9eSdrh indexed_by(A)  ::= INDEXED BY nm(X). {A = X;}
823200adc9eSdrh indexed_by(A)  ::= NOT INDEXED.      {A.z=0; A.n=1;}
82485574e31Sdanielk1977 
825348784efSdrh %type orderby_opt {ExprList*}
826633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
827108aa00aSdrh 
828108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
829108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
830108aa00aSdrh // sort order.
831108aa00aSdrh //
832348784efSdrh %type sortlist {ExprList*}
833633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
834348784efSdrh 
835348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
836348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
8376e11892dSdan sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z) nulls(X). {
8381be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
8396e11892dSdan   sqlite3ExprListSetSortOrder(A,Z,X);
840348784efSdrh }
8416e11892dSdan sortlist(A) ::= expr(Y) sortorder(Z) nulls(X). {
8421be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
8436e11892dSdan   sqlite3ExprListSetSortOrder(A,Z,X);
844348784efSdrh }
845348784efSdrh 
846348784efSdrh %type sortorder {int}
847348784efSdrh 
8488e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
8498e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
850bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
851348784efSdrh 
8526e11892dSdan %type nulls {int}
8536e11892dSdan nulls(A) ::= NULLS FIRST.       {A = SQLITE_SO_ASC;}
8546e11892dSdan nulls(A) ::= NULLS LAST.        {A = SQLITE_SO_DESC;}
8556e11892dSdan nulls(A) ::= .                  {A = SQLITE_SO_UNDEFINED;}
8566e11892dSdan 
8572282792aSdrh %type groupby_opt {ExprList*}
858633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
8592282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
8609245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
8612282792aSdrh 
8622282792aSdrh %type having_opt {Expr*}
863633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
8642282792aSdrh having_opt(A) ::= .                {A = 0;}
8651be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
8662282792aSdrh 
8678c0833fbSdrh %type limit_opt {Expr*}
86815926590Sdrh 
86915926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
87015926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
87115926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
87215926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
87315926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
87415926590Sdrh // except as a transient.  So there is never anything to destroy.
87515926590Sdrh //
8768c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
8778c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
8788c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
8791be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
880a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
8811be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
882a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
8831be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
8849bbca4c1Sdrh 
885382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
886382c0247Sdrh //
887c601f101Sdrh %if SQLITE_ENABLE_UPDATE_DELETE_LIMIT || SQLITE_UDL_CAPABLE_PARSER
8882053f313Sdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt_ret(W)
889931577f1Sdrh         orderby_opt(O) limit_opt(L). {
890b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
8916a0db87aSdrh #ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
892c601f101Sdrh   if( O || L ){
893c601f101Sdrh     updateDeleteLimitError(pParse,O,L);
894c601f101Sdrh     O = 0;
895c601f101Sdrh     L = 0;
896c601f101Sdrh   }
8976a0db87aSdrh #endif
8988c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
8994281bd42Sshane }
900c601f101Sdrh %else
9012053f313Sdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt_ret(W). {
9024281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
9038c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
9044281bd42Sshane }
9054281bd42Sshane %endif
906348784efSdrh 
907348784efSdrh %type where_opt {Expr*}
908633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
9092053f313Sdrh %type where_opt_ret {Expr*}
9102053f313Sdrh %destructor where_opt_ret {sqlite3ExprDelete(pParse->db, $$);}
911348784efSdrh 
912348784efSdrh where_opt(A) ::= .                    {A = 0;}
9131be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
9142053f313Sdrh where_opt_ret(A) ::= .                                      {A = 0;}
9152053f313Sdrh where_opt_ret(A) ::= WHERE expr(X).                         {A = X;}
9162053f313Sdrh where_opt_ret(A) ::= RETURNING selcollist(X).
9172053f313Sdrh        {sqlite3AddReturning(pParse,X); A = 0;}
9182053f313Sdrh where_opt_ret(A) ::= WHERE expr(X) RETURNING selcollist(Y).
9192053f313Sdrh        {sqlite3AddReturning(pParse,Y); A = X;}
920348784efSdrh 
921382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
922382c0247Sdrh //
923c601f101Sdrh %if SQLITE_ENABLE_UPDATE_DELETE_LIMIT || SQLITE_UDL_CAPABLE_PARSER
92469887c99Sdan cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) from(F)
925b8352479Sdrh         where_opt_ret(W) orderby_opt(O) limit_opt(L).  {
926b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
927*1943005fSdrh   if( F ){
928*1943005fSdrh     SrcList *pFromClause = F;
929*1943005fSdrh     if( pFromClause->nSrc>1 ){
930*1943005fSdrh       Select *pSubquery;
931*1943005fSdrh       Token as;
932*1943005fSdrh       pSubquery = sqlite3SelectNew(pParse,0,pFromClause,0,0,0,0,SF_NestedFrom,0);
933*1943005fSdrh       as.n = 0;
934*1943005fSdrh       as.z = 0;
935*1943005fSdrh       pFromClause = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0);
936*1943005fSdrh     }
937*1943005fSdrh     X = sqlite3SrcListAppendList(pParse, X, pFromClause);
938*1943005fSdrh   }
939b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
940c601f101Sdrh #ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
941c601f101Sdrh   if( O || L ){
942c601f101Sdrh     updateDeleteLimitError(pParse,O,L);
943c601f101Sdrh     O = 0;
944c601f101Sdrh     L = 0;
945c601f101Sdrh   }
946c601f101Sdrh #endif
947eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L,0);
9484281bd42Sshane }
949c601f101Sdrh %else
95069887c99Sdan cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) from(F)
951b8352479Sdrh         where_opt_ret(W). {
9524281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
9534281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
954fb98dac0Sdrh   if( F ){
955fb98dac0Sdrh     SrcList *pFromClause = F;
956fb98dac0Sdrh     if( pFromClause->nSrc>1 ){
957fb98dac0Sdrh       Select *pSubquery;
958fb98dac0Sdrh       Token as;
959fb98dac0Sdrh       pSubquery = sqlite3SelectNew(pParse,0,pFromClause,0,0,0,0,SF_NestedFrom,0);
960fb98dac0Sdrh       as.n = 0;
961fb98dac0Sdrh       as.z = 0;
962fb98dac0Sdrh       pFromClause = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0);
963fb98dac0Sdrh     }
964fb98dac0Sdrh     X = sqlite3SrcListAppendList(pParse, X, pFromClause);
965fb98dac0Sdrh   }
966eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0,0);
9674281bd42Sshane }
9684281bd42Sshane %endif
969348784efSdrh 
970c601f101Sdrh 
971c601f101Sdrh 
972f8db1bc0Sdrh %type setlist {ExprList*}
973633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
974f8db1bc0Sdrh 
9754dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
9761be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
977b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
978b7916a78Sdrh }
979a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
9801be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
981a1251bc4Sdrh }
982b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
9831be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
984b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
985b7916a78Sdrh }
986a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
9871be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
988a1251bc4Sdrh }
989348784efSdrh 
990382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
991382c0247Sdrh //
9925e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) select(S)
9932c2e844aSdrh         upsert(U). {
99446d2e5c3Sdrh   sqlite3Insert(pParse, X, S, F, R, U);
9954e9119d9Sdan }
9962053f313Sdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) DEFAULT VALUES returning.
9974e9119d9Sdan {
9982c2e844aSdrh   sqlite3Insert(pParse, X, 0, F, R, 0);
9994e9119d9Sdan }
1000348784efSdrh 
100146d2e5c3Sdrh %type upsert {Upsert*}
10021c198483Sdrh 
10031c198483Sdrh // Because upsert only occurs at the tip end of the INSERT rule for cmd,
10041c198483Sdrh // there is never a case where the value of the upsert pointer will not
10051c198483Sdrh // be destroyed by the cmd action.  So comment-out the destructor to
10061c198483Sdrh // avoid unreachable code.
10071c198483Sdrh //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);}
100846d2e5c3Sdrh upsert(A) ::= . { A = 0; }
10092053f313Sdrh upsert(A) ::= RETURNING selcollist(X).  { A = 0; sqlite3AddReturning(pParse,X); }
1010e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW)
10112549e4ccSdrh               DO UPDATE SET setlist(Z) where_opt(W) upsert(N).
10122549e4ccSdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W,N);}
10132549e4ccSdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING upsert(N).
10142549e4ccSdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,0,0,N); }
10152053f313Sdrh upsert(A) ::= ON CONFLICT DO NOTHING returning.
10162549e4ccSdrh               { A = sqlite3UpsertNew(pParse->db,0,0,0,0,0); }
10172053f313Sdrh upsert(A) ::= ON CONFLICT DO UPDATE SET setlist(Z) where_opt(W) returning.
10182549e4ccSdrh               { A = sqlite3UpsertNew(pParse->db,0,0,Z,W,0);}
101926cf56f8Sdrh 
10202053f313Sdrh returning ::= RETURNING selcollist(X).  {sqlite3AddReturning(pParse,X);}
10212053f313Sdrh returning ::= .
10222053f313Sdrh 
10233334d089Sdrh %type insert_cmd {int}
1024fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
1025fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
1026fa86c412Sdrh 
10278981b904Sdrh %type idlist_opt {IdList*}
10288981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
102981eba73eSdrh %type idlist {IdList*}
103081eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
1031348784efSdrh 
10328981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
10338981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
10344dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
10355496d6a2Sdan     {A = sqlite3IdListAppend(pParse,A,&Y);}
103681eba73eSdrh idlist(A) ::= nm(Y).
10375496d6a2Sdan     {A = sqlite3IdListAppend(pParse,0,&Y); /*A-overwrites-Y*/}
1038348784efSdrh 
1039382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
1040382c0247Sdrh //
1041348784efSdrh 
10421be266baSdrh %type expr {Expr*}
10431be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
10441be266baSdrh %type term {Expr*}
10451be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
1046b7916a78Sdrh 
1047b7916a78Sdrh %include {
1048b7916a78Sdrh 
1049796588aeSdrh   /* Construct a new Expr object from a single token */
10501be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
10510cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
10520cd874bdSdrh     if( p ){
1053d145e5f4Sdan       /* memset(p, 0, sizeof(Expr)); */
10540cd874bdSdrh       p->op = (u8)op;
10551194904bSdrh       p->affExpr = 0;
10560cd874bdSdrh       p->flags = EP_Leaf;
1057e7375bfaSdrh       ExprClearVVAProperties(p);
10589c949b1cSdrh       /* p->iAgg = -1; // Not required */
1059d145e5f4Sdan       p->pLeft = p->pRight = 0;
1060d145e5f4Sdan       p->pAggInfo = 0;
1061477572b9Sdrh       memset(&p->x, 0, sizeof(p->x));
1062477572b9Sdrh       memset(&p->y, 0, sizeof(p->y));
1063d145e5f4Sdan       p->op2 = 0;
10644fe759b2Sdrh       p->iTable = 0;
1065d3130dabSdrh       p->iColumn = 0;
10660cd874bdSdrh       p->u.zToken = (char*)&p[1];
10670cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
10680cd874bdSdrh       p->u.zToken[t.n] = 0;
1069796588aeSdrh       p->w.iOfst = (int)(t.z - pParse->zTail);
10700cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
107151d35b0fSdrh         sqlite3DequoteExpr(p);
10720cd874bdSdrh       }
10730cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
10740cd874bdSdrh       p->nHeight = 1;
10750cd874bdSdrh #endif
1076c9461eccSdan       if( IN_RENAME_OBJECT ){
107707e95233Sdan         return (Expr*)sqlite3RenameTokenMap(pParse, (void*)p, &t);
1078d145e5f4Sdan       }
10790cd874bdSdrh     }
10801be266baSdrh     return p;
1081b7916a78Sdrh   }
1082d145e5f4Sdan 
1083b7916a78Sdrh }
1084348784efSdrh 
10854dd0d3f8Sdrh expr(A) ::= term(A).
10861be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
10871be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
10881be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
10895ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
1090796588aeSdrh   Expr *temp1 = tokenExpr(pParse,TK_ID,X);
1091796588aeSdrh   Expr *temp2 = tokenExpr(pParse,TK_ID,Y);
10921be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
1093e1b6a5b8Sdrh }
1094d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
1095796588aeSdrh   Expr *temp1 = tokenExpr(pParse,TK_ID,X);
1096796588aeSdrh   Expr *temp2 = tokenExpr(pParse,TK_ID,Y);
1097796588aeSdrh   Expr *temp3 = tokenExpr(pParse,TK_ID,Z);
1098abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
109902ede43dSdan   if( IN_RENAME_OBJECT ){
110002ede43dSdan     sqlite3RenameTokenRemap(pParse, 0, temp1);
110102ede43dSdan   }
11021be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
1103d24cc427Sdrh }
11041be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
11051be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
11060cd874bdSdrh term(A) ::= INTEGER(X). {
11071be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
110817a93ae1Sdrh   if( A ) A->w.iOfst = (int)(X.z - pParse->zTail);
11090cd874bdSdrh }
1110f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
11118679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
1112de25a88cSdrh     u32 n = X.n;
11131be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
11141be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
11158f3b137fSdrh   }else{
1116b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
1117b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
1118b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
11198f3b137fSdrh     Token t = X; /*A-overwrites-X*/
11208f3b137fSdrh     assert( t.n>=2 );
1121b7916a78Sdrh     if( pParse->nested==0 ){
112243303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
11231be266baSdrh       A = 0;
1124b7916a78Sdrh     }else{
11251be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
11261be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
1127b7916a78Sdrh     }
1128f59b12fbSdrh   }
1129895d7472Sdrh }
113059ff4251Sdan expr(A) ::= expr(A) COLLATE ids(C). {
11311be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
11328b4c40d8Sdrh }
1133487e262fSdrh %ifndef SQLITE_OMIT_CAST
11341be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
11351be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
11361be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
1137487e262fSdrh }
1138154d4b24Sdrh %endif  SQLITE_OMIT_CAST
1139550a3309Sdrh 
1140550a3309Sdrh 
1141550a3309Sdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
1142954733b3Sdrh   A = sqlite3ExprFunction(pParse, Y, &X, D);
1143550a3309Sdrh }
1144550a3309Sdrh expr(A) ::= id(X) LP STAR RP. {
1145954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
1146550a3309Sdrh }
1147550a3309Sdrh 
114867a9b8edSdan %ifndef SQLITE_OMIT_WINDOWFUNC
11494f9adee2Sdan expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_over(Z). {
11506488271fSdan   A = sqlite3ExprFunction(pParse, Y, &X, D);
11514f9adee2Sdan   sqlite3WindowAttach(pParse, A, Z);
11526488271fSdan }
11534f9adee2Sdan expr(A) ::= id(X) LP STAR RP filter_over(Z). {
1154954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &X, 0);
11554f9adee2Sdan   sqlite3WindowAttach(pParse, A, Z);
1156e1b6a5b8Sdrh }
1157550a3309Sdrh %endif
1158550a3309Sdrh 
1159b71090fdSdrh term(A) ::= CTIME_KW(OP). {
1160954733b3Sdrh   A = sqlite3ExprFunction(pParse, 0, &OP, 0);
1161b7916a78Sdrh }
1162b7916a78Sdrh 
11631be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
11641be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
11651be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
11661be266baSdrh   if( A ){
11671be266baSdrh     A->x.pList = pList;
116876baf799Sdrh     if( ALWAYS(pList->nExpr) ){
1169269d322dSdrh       A->flags |= pList->a[0].pExpr->flags & EP_Propagate;
1170269d322dSdrh     }
11718bd0d58eSdrh   }else{
11728bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
117371c57db0Sdan   }
117471c57db0Sdan }
117571c57db0Sdan 
1176d5c851c1Sdrh expr(A) ::= expr(A) AND expr(Y).        {A=sqlite3ExprAnd(pParse,A,Y);}
11771be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
11784dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
11791be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
11801be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
11814dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
11821be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
11834dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
11841be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
11854dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
11861be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
11871be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
1188410c301fSdrh %type likeop {Token}
11897e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
1190410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
11914dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
11928aa34ae0Sdrh   ExprList *pList;
1193410c301fSdrh   int bNot = OP.n & 0x80000000;
1194410c301fSdrh   OP.n &= 0x7fffffff;
11951be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
11961be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
1197954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
11981be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
11991be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
12000ac65892Sdrh }
12014dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
12021dca1458Sdrh   ExprList *pList;
1203410c301fSdrh   int bNot = OP.n & 0x80000000;
1204410c301fSdrh   OP.n &= 0x7fffffff;
12051be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
12061be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
12071be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
1208954733b3Sdrh   A = sqlite3ExprFunction(pParse, pList, &OP, 0);
12091be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
12101be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
12111dca1458Sdrh }
12127c6303c0Sdanielk1977 
12131be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
12141be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
12156a2fe093Sdrh 
12166a51741dSdrh %include {
12176a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
12186a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
12196a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
12206a51741dSdrh     sqlite3 *db = pParse->db;
1221c50f75dfSdan     if( pA && pY && pY->op==TK_NULL && !IN_RENAME_OBJECT ){
12225e17e8b7Sshaneh       pA->op = (u8)op;
12236a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
12246a51741dSdrh       pA->pRight = 0;
12256a51741dSdrh     }
12266a51741dSdrh   }
12276a51741dSdrh }
12286a51741dSdrh 
12296a2fe093Sdrh //    expr1 IS expr2
12306a2fe093Sdrh //    expr1 IS NOT expr2
12316a2fe093Sdrh //
12326a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
12336a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
12346a2fe093Sdrh //
12354dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
12361be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
12371be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
12386a2fe093Sdrh }
12394dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
12401be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
12411be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
12426a2fe093Sdrh }
1243902e2602Sdrh expr(A) ::= expr(A) IS NOT DISTINCT FROM expr(Y).     {
1244902e2602Sdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
1245902e2602Sdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
1246902e2602Sdrh }
1247902e2602Sdrh expr(A) ::= expr(A) IS DISTINCT FROM expr(Y). {
1248902e2602Sdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
1249902e2602Sdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
1250902e2602Sdrh }
1251b7916a78Sdrh 
125243303de9Sdrh expr(A) ::= NOT(B) expr(X).
12531be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
125443303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
12551be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
1256ca5aa594Sdrh expr(A) ::= PLUS|MINUS(B) expr(X). [BITNOT] {
1257ca5aa594Sdrh   A = sqlite3PExpr(pParse, @B==TK_PLUS ? TK_UPLUS : TK_UMINUS, X, 0);
1258ca5aa594Sdrh   /*A-overwrites-B*/
1259ca5aa594Sdrh }
1260b7916a78Sdrh 
1261d5326c33Sdrh expr(A) ::= expr(B) PTR(C) expr(D). {
1262d5326c33Sdrh   ExprList *pList = sqlite3ExprListAppend(pParse, 0, B);
1263d5326c33Sdrh   pList = sqlite3ExprListAppend(pParse, pList, D);
1264d5326c33Sdrh   A = sqlite3ExprFunction(pParse, pList, &C, 0);
1265d5326c33Sdrh }
1266d5326c33Sdrh 
12672e3a1f16Sdrh %type between_op {int}
12682e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
12692e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
12704dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
12711be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
12721be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
12731be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
12741be266baSdrh   if( A ){
12751be266baSdrh     A->x.pList = pList;
127653f733c7Sdrh   }else{
1277633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
127853f733c7Sdrh   }
12791be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1280fef5208cSdrh }
12813e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
12822e3a1f16Sdrh   %type in_op {int}
12832e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
12842e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
12851be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1286094430ebSdrh     if( Y==0 ){
1287473c1bf2Sdan       /* Expressions of the form
1288473c1bf2Sdan       **
1289473c1bf2Sdan       **      expr1 IN ()
1290473c1bf2Sdan       **      expr1 NOT IN ()
1291473c1bf2Sdan       **
1292473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1293473c1bf2Sdan       ** regardless of the value of expr1.
1294473c1bf2Sdan       */
12958e34e406Sdrh       sqlite3ExprUnmapAndDelete(pParse, A);
12965348fbe3Sdan       A = sqlite3Expr(pParse->db, TK_STRING, N ? "true" : "false");
12975348fbe3Sdan       if( A ) sqlite3ExprIdToTrueFalse(A);
12989289f510Sdan     }else{
1299fbfd1133Sdrh       Expr *pRHS = Y->a[0].pExpr;
130074777f99Sdan       if( Y->nExpr==1 && sqlite3ExprIsConstant(pRHS) && A->op!=TK_VECTOR ){
1301fbfd1133Sdrh         Y->a[0].pExpr = 0;
1302fbfd1133Sdrh         sqlite3ExprListDelete(pParse->db, Y);
130395b39590Sdrh         pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0);
1304fbfd1133Sdrh         A = sqlite3PExpr(pParse, TK_EQ, A, pRHS);
1305094430ebSdrh       }else{
13061be266baSdrh         A = sqlite3PExpr(pParse, TK_IN, A, 0);
130774777f99Sdan         if( A==0 ){
130874777f99Sdan           sqlite3ExprListDelete(pParse->db, Y);
130974777f99Sdan         }else if( A->pLeft->op==TK_VECTOR ){
131074777f99Sdan           int nExpr = A->pLeft->x.pList->nExpr;
131170988590Sdrh           Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, Y);
131270988590Sdrh           if( pSelectRHS ){
131370988590Sdrh             parserDoubleLinkSelect(pParse, pSelectRHS);
131470988590Sdrh             sqlite3PExprAddSelect(pParse, A, pSelectRHS);
13159289f510Sdan           }
13169289f510Sdan         }else{
13171be266baSdrh           A->x.pList = Y;
13181be266baSdrh           sqlite3ExprSetHeightAndFlags(pParse, A);
13199289f510Sdan         }
1320d5d56523Sdanielk1977       }
13211be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1322094430ebSdrh     }
1323fef5208cSdrh   }
13241be266baSdrh   expr(A) ::= LP select(X) RP. {
13251be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
13261be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
132751522cd3Sdrh   }
13281be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
13291be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
13301be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
13311be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1332fef5208cSdrh   }
13335fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
133429c992cbSdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&Y,&Z);
13358c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
13369de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
13371be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
13381be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
13391be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
134023b2db23Sdrh   }
13411be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
134243303de9Sdrh     Expr *p;
13431be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
134408de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
134551522cd3Sdrh   }
1346154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1347fef5208cSdrh 
134817a7f8ddSdrh /* CASE expressions */
13491be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
13501be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
13511be266baSdrh   if( A ){
13521be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
13531be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
135453f733c7Sdrh   }else{
1355633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1356c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
135753f733c7Sdrh   }
135817a7f8ddSdrh }
135917a7f8ddSdrh %type case_exprlist {ExprList*}
1360633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
13614dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
13621be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
13631be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
136417a7f8ddSdrh }
136517a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
13661be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
13671be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
136817a7f8ddSdrh }
136917a7f8ddSdrh %type case_else {Expr*}
1370633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
13711be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
137217a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
137317a7f8ddSdrh %type case_operand {Expr*}
1374633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
13751be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
137617a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1377348784efSdrh 
1378348784efSdrh %type exprlist {ExprList*}
1379633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
13809245c243Sdrh %type nexprlist {ExprList*}
1381633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1382348784efSdrh 
13834dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
13849245c243Sdrh exprlist(A) ::= .                            {A = 0;}
13854dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
13861be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
138717435752Sdrh nexprlist(A) ::= expr(Y).
13881be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
13899245c243Sdrh 
1390a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
13915fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
13925fbab882Sdrh ** of parenthesis */
13935fbab882Sdrh %type paren_exprlist {ExprList*}
13945fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
13955fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
13965fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1397a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
13985fbab882Sdrh 
1399cce7d176Sdrh 
1400382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1401382c0247Sdrh //
1402d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1403108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
140417435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
140529c992cbSdrh                      sqlite3SrcListAppend(pParse,0,&Y,0), Z, U,
140662340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
1407c9461eccSdan   if( IN_RENAME_OBJECT && pParse->pNewIndex ){
1408c9461eccSdan     sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &Y);
1409c9461eccSdan   }
14109cfcf5d4Sdrh }
1411717e6402Sdrh 
1412717e6402Sdrh %type uniqueflag {int}
14139cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
14149cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1415348784efSdrh 
1416348784efSdrh 
1417108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1418108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1419108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1420108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1421108aa00aSdrh //
1422108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1423108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1424108aa00aSdrh //
1425108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1426108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1427067b92baSdrh // places - places that might have been stored in the sqlite_schema table.
1428108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1429108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1430108aa00aSdrh // historical schemas.
1431108aa00aSdrh //
1432108aa00aSdrh %type eidlist {ExprList*}
1433108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1434108aa00aSdrh %type eidlist_opt {ExprList*}
1435108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1436108aa00aSdrh 
1437108aa00aSdrh %include {
1438108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1439108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1440108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1441108aa00aSdrh   ** error while parsing a legacy schema.
1442108aa00aSdrh   */
1443108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1444108aa00aSdrh     Parse *pParse,
1445108aa00aSdrh     ExprList *pPrior,
1446108aa00aSdrh     Token *pIdToken,
1447108aa00aSdrh     int hasCollate,
1448108aa00aSdrh     int sortOrder
1449108aa00aSdrh   ){
1450108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1451108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1452108aa00aSdrh         && pParse->db->init.busy==0
1453108aa00aSdrh     ){
1454108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1455108aa00aSdrh                          pIdToken->n, pIdToken->z);
14560202b29eSdanielk1977     }
1457108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1458108aa00aSdrh     return p;
1459108aa00aSdrh   }
1460108aa00aSdrh } // end %include
1461108aa00aSdrh 
1462108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1463108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
14644dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
14654dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1466108aa00aSdrh }
1467108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1468cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
14690202b29eSdanielk1977 }
14700202b29eSdanielk1977 
1471108aa00aSdrh %type collate {int}
1472108aa00aSdrh collate(C) ::= .              {C = 0;}
147359ff4251Sdan collate(C) ::= COLLATE ids.   {C = 1;}
1474a34001c9Sdrh 
1475348784efSdrh 
14768aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1477382c0247Sdrh //
14784d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1479982cef7eSdrh 
1480382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1481382c0247Sdrh //
1482c601f101Sdrh %if !SQLITE_OMIT_VACUUM && !SQLITE_OMIT_ATTACH
14832f6239edSdrh %type vinto {Expr*}
14842f6239edSdrh %destructor vinto {sqlite3ExprDelete(pParse->db, $$);}
14852f6239edSdrh cmd ::= VACUUM vinto(Y).                {sqlite3Vacuum(pParse,0,Y);}
14862f6239edSdrh cmd ::= VACUUM nm(X) vinto(Y).          {sqlite3Vacuum(pParse,&X,Y);}
14872f6239edSdrh vinto(A) ::= INTO expr(X).              {A = X;}
14882f6239edSdrh vinto(A) ::= .                          {A = 0;}
1489c601f101Sdrh %endif
1490f57b14a6Sdrh 
1491382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1492382c0247Sdrh //
149313d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
149491cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1495ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1496ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1497ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1498ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1499ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1500ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1501ada2ee0dSdrh 
1502cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1503cf82f0d3Sdrh nmnum(A) ::= nm(A).
1504cf82f0d3Sdrh nmnum(A) ::= ON(A).
1505cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1506cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1507154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1508f59b12fbSdrh %token_class number INTEGER|FLOAT.
15098395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1510cf82f0d3Sdrh plus_num(A) ::= number(A).
1511f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1512c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1513f0f258b1Sdrh 
1514b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1515b7f9164eSdrh 
1516d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
15174b59ab5eSdrh   Token all;
15184b59ab5eSdrh   all.z = A.z;
1519b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
15204adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1521f0f258b1Sdrh }
1522f0f258b1Sdrh 
1523fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1524fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
152560218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
152660218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1527cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1528c3f9bad2Sdanielk1977 }
1529c3f9bad2Sdanielk1977 
1530c3f9bad2Sdanielk1977 %type trigger_time {int}
15316559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1532c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1533c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1534c3f9bad2Sdanielk1977 
1535ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1536633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1537cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1538cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
153981eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1540c3f9bad2Sdanielk1977 
154160218d2aSdrh foreach_clause ::= .
154260218d2aSdrh foreach_clause ::= FOR EACH ROW.
1543c3f9bad2Sdanielk1977 
1544c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1545633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1546c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
15471be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1548c3f9bad2Sdanielk1977 
1549c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1550633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
15514dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
15524dd0d3f8Sdrh   assert( A!=0 );
15534dd0d3f8Sdrh   A->pLast->pNext = X;
15544dd0d3f8Sdrh   A->pLast = X;
1555a69d9168Sdrh }
15564dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
15574dd0d3f8Sdrh   assert( A!=0 );
15584dd0d3f8Sdrh   A->pLast = A;
155981238966Sdrh }
1560c3f9bad2Sdanielk1977 
1561b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1562b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1563b1819a0bSdrh // the same database as the table that the trigger fires on.
1564b1819a0bSdrh //
1565b1819a0bSdrh %type trnm {Token}
15664dd0d3f8Sdrh trnm(A) ::= nm(A).
1567b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1568b1819a0bSdrh   A = X;
1569b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1570b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1571b1819a0bSdrh         "statements within triggers");
1572b1819a0bSdrh }
1573b1819a0bSdrh 
1574b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1575b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1576b1819a0bSdrh // since it is an exception to the default grammar rules.
1577b1819a0bSdrh //
1578b1819a0bSdrh tridxby ::= .
1579b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1580b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1581b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1582b1819a0bSdrh         "within triggers");
1583b1819a0bSdrh }
1584b1819a0bSdrh tridxby ::= NOT INDEXED. {
1585b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1586b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1587b1819a0bSdrh         "within triggers");
1588b1819a0bSdrh }
1589b1819a0bSdrh 
1590b1819a0bSdrh 
1591b1819a0bSdrh 
1592c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1593633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1594c3f9bad2Sdanielk1977 // UPDATE
1595b1819a0bSdrh trigger_cmd(A) ::=
1596e7877b2dSdan    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) from(F) where_opt(Z) scanpt(E).
1597e7877b2dSdan    {A = sqlite3TriggerUpdateStep(pParse, &X, F, Y, Z, R, B.z, E);}
1598c3f9bad2Sdanielk1977 
1599c3f9bad2Sdanielk1977 // INSERT
1600f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
16012c2e844aSdrh                       trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). {
16025be60c55Sdan    A = sqlite3TriggerInsertStep(pParse,&X,F,S,R,U,B,Z);/*A-overwrites-R*/
16032c2e844aSdrh }
1604c3f9bad2Sdanielk1977 // DELETE
1605f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
16065be60c55Sdan    {A = sqlite3TriggerDeleteStep(pParse, &X, Y, B.z, E);}
1607c3f9bad2Sdanielk1977 
1608c3f9bad2Sdanielk1977 // SELECT
1609f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1610f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1611c3f9bad2Sdanielk1977 
16126f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
16131be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
16141be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
16151be266baSdrh   if( A ){
16161194904bSdrh     A->affExpr = OE_Ignore;
16174b59ab5eSdrh   }
16188aa34ae0Sdrh }
16191be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
16201be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
16211be266baSdrh   if( A ) {
16221194904bSdrh     A->affExpr = (char)T;
16234b59ab5eSdrh   }
16248aa34ae0Sdrh }
1625154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1626b7f9164eSdrh 
162774ad7fe9Sdrh %type raisetype {int}
162874ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
162974ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
163074ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
163174ad7fe9Sdrh 
16326f34903eSdanielk1977 
1633c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1634b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1635fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1636fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1637c3f9bad2Sdanielk1977 }
1638154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1639113088ecSdrh 
1640113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1641fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1642f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
16431be266baSdrh   sqlite3Attach(pParse, F, D, K);
16441c2d8414Sdrh }
1645fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
16461be266baSdrh   sqlite3Detach(pParse, D);
1647fdbcdee5Sdrh }
1648fdbcdee5Sdrh 
1649f744bb56Sdanielk1977 %type key_opt {Expr*}
1650633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1651f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
16521be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1653113088ecSdrh 
1654113088ecSdrh database_kw_opt ::= DATABASE.
1655113088ecSdrh database_kw_opt ::= .
1656fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
16574343fea2Sdrh 
16584343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
16594343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
16604343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
16614343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1662154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
16639fd2a9a0Sdanielk1977 
16649f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
16659f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
16669f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
16679f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
16689f18e8a0Sdrh %endif
16699f18e8a0Sdrh 
16709fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
16719fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
167237f3ac8fSdan %ifndef SQLITE_OMIT_VIRTUALTABLE
16739fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
16749fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
16759fd2a9a0Sdanielk1977 }
1676986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1677986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1678986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
167919a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
168019a8e7e8Sdanielk1977 }
1681329cb9ebSdrh cmd ::= ALTER TABLE fullname(X) DROP kwcolumn_opt nm(Y). {
16826e6d9833Sdan   sqlite3AlterDropColumn(pParse, X, &Y);
16836e6d9833Sdan }
16846e6d9833Sdan 
168519a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
16864a642b60Sdrh   disableLookaside(pParse);
168719a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
168819a8e7e8Sdanielk1977 }
1689cf8f2895Sdan cmd ::= ALTER TABLE fullname(X) RENAME kwcolumn_opt nm(Y) TO nm(Z). {
1690cf8f2895Sdan   sqlite3AlterRenameColumn(pParse, X, &Y, &Z);
1691cf8f2895Sdan }
1692cf8f2895Sdan 
169319a8e7e8Sdanielk1977 kwcolumn_opt ::= .
169419a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1695cf8f2895Sdan 
169637f3ac8fSdan %endif SQLITE_OMIT_VIRTUALTABLE
1697154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE
1698e09daa90Sdrh 
1699e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1700e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1701b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1702b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1703b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1704b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1705b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1706b9bb7c18Sdrh }
1707e09daa90Sdrh vtabarglist ::= vtabarg.
1708e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1709b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1710b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1711b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1712b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1713b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1714b9bb7c18Sdrh anylist ::= .
1715aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1716aaac8b4eSdrh anylist ::= anylist ANY.
1717154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
17188b471863Sdrh 
17198b471863Sdrh 
17208b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
17217d562dbeSdan %type wqlist {With*}
17224e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
1723f824b41eSdrh %type wqitem {Cte*}
1724f824b41eSdrh // %destructor wqitem {sqlite3CteDelete(pParse->db, $$);} // not reachable
17257d562dbeSdan 
1726a5746e03Sdrh with ::= .
17278b471863Sdrh %ifndef SQLITE_OMIT_CTE
1728a5746e03Sdrh with ::= WITH wqlist(W).              { sqlite3WithPush(pParse, W, 1); }
1729a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W).    { sqlite3WithPush(pParse, W, 1); }
17307d562dbeSdan 
1731745912efSdrh %type wqas {u8}
1732745912efSdrh wqas(A)   ::= AS.                  {A = M10d_Any;}
1733745912efSdrh wqas(A)   ::= AS MATERIALIZED.     {A = M10d_Yes;}
1734745912efSdrh wqas(A)   ::= AS NOT MATERIALIZED. {A = M10d_No;}
1735745912efSdrh wqitem(A) ::= nm(X) eidlist_opt(Y) wqas(M) LP select(Z) RP. {
1736745912efSdrh   A = sqlite3CteNew(pParse, &X, Y, Z, M); /*A-overwrites-X*/
17377d562dbeSdan }
1738f824b41eSdrh wqlist(A) ::= wqitem(X). {
1739f824b41eSdrh   A = sqlite3WithAdd(pParse, 0, X); /*A-overwrites-X*/
1740f824b41eSdrh }
1741f824b41eSdrh wqlist(A) ::= wqlist(A) COMMA wqitem(X). {
1742f824b41eSdrh   A = sqlite3WithAdd(pParse, A, X);
17438b471863Sdrh }
17448b471863Sdrh %endif  SQLITE_OMIT_CTE
174534a7d790Sdan 
174634a7d790Sdan //////////////////////// WINDOW FUNCTION EXPRESSIONS /////////////////////////
17476e2210e0Sdan // These must be at the end of this file. Specifically, the rules that
17486e2210e0Sdan // introduce tokens WINDOW, OVER and FILTER must appear last. This causes
17496e2210e0Sdan // the integer values assigned to these tokens to be larger than all other
17506e2210e0Sdan // tokens that may be output by the tokenizer except TK_SPACE and TK_ILLEGAL.
175134a7d790Sdan //
175234a7d790Sdan %ifndef SQLITE_OMIT_WINDOWFUNC
175334a7d790Sdan %type windowdefn_list {Window*}
1754a57aac26Sdrh %destructor windowdefn_list {sqlite3WindowListDelete(pParse->db, $$);}
175534a7d790Sdan windowdefn_list(A) ::= windowdefn(Z). { A = Z; }
175634a7d790Sdan windowdefn_list(A) ::= windowdefn_list(Y) COMMA windowdefn(Z). {
1757a57aac26Sdrh   assert( Z!=0 );
1758e7c9ca41Sdan   sqlite3WindowChain(pParse, Z, Y);
1759a57aac26Sdrh   Z->pNextWin = Y;
176034a7d790Sdan   A = Z;
176134a7d790Sdan }
176234a7d790Sdan 
176334a7d790Sdan %type windowdefn {Window*}
176434a7d790Sdan %destructor windowdefn {sqlite3WindowDelete(pParse->db, $$);}
1765e7c9ca41Sdan windowdefn(A) ::= nm(X) AS LP window(Y) RP. {
1766a57aac26Sdrh   if( ALWAYS(Y) ){
176734a7d790Sdan     Y->zName = sqlite3DbStrNDup(pParse->db, X.z, X.n);
176834a7d790Sdan   }
176934a7d790Sdan   A = Y;
177034a7d790Sdan }
177134a7d790Sdan 
177234a7d790Sdan %type window {Window*}
177334a7d790Sdan %destructor window {sqlite3WindowDelete(pParse->db, $$);}
177434a7d790Sdan 
177534a7d790Sdan %type frame_opt {Window*}
177634a7d790Sdan %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);}
177734a7d790Sdan 
177834a7d790Sdan %type part_opt {ExprList*}
177934a7d790Sdan %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);}
178034a7d790Sdan 
17816488271fSdan %type filter_clause {Expr*}
17826488271fSdan %destructor filter_clause {sqlite3ExprDelete(pParse->db, $$);}
17836488271fSdan 
17846488271fSdan %type over_clause {Window*}
17856488271fSdan %destructor over_clause {sqlite3WindowDelete(pParse->db, $$);}
178634a7d790Sdan 
17874f9adee2Sdan %type filter_over {Window*}
17884f9adee2Sdan %destructor filter_over {sqlite3WindowDelete(pParse->db, $$);}
17894f9adee2Sdan 
179034a7d790Sdan %type range_or_rows {int}
179134a7d790Sdan 
179234a7d790Sdan %type frame_bound {struct FrameBound}
179334a7d790Sdan %destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1794287fa17bSdan %type frame_bound_s {struct FrameBound}
1795287fa17bSdan %destructor frame_bound_s {sqlite3ExprDelete(pParse->db, $$.pExpr);}
1796287fa17bSdan %type frame_bound_e {struct FrameBound}
1797287fa17bSdan %destructor frame_bound_e {sqlite3ExprDelete(pParse->db, $$.pExpr);}
179834a7d790Sdan 
1799e7c9ca41Sdan window(A) ::= PARTITION BY nexprlist(X) orderby_opt(Y) frame_opt(Z). {
1800e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, X, Y, 0);
1801e7c9ca41Sdan }
1802e7c9ca41Sdan window(A) ::= nm(W) PARTITION BY nexprlist(X) orderby_opt(Y) frame_opt(Z). {
1803e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, X, Y, &W);
1804e7c9ca41Sdan }
1805e7c9ca41Sdan window(A) ::= ORDER BY sortlist(Y) frame_opt(Z). {
1806e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, Y, 0);
1807e7c9ca41Sdan }
1808e7c9ca41Sdan window(A) ::= nm(W) ORDER BY sortlist(Y) frame_opt(Z). {
1809e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, Y, &W);
1810e7c9ca41Sdan }
1811e7c9ca41Sdan window(A) ::= frame_opt(Z). {
181234a7d790Sdan   A = Z;
181334a7d790Sdan }
1814e7c9ca41Sdan window(A) ::= nm(W) frame_opt(Z). {
1815e7c9ca41Sdan   A = sqlite3WindowAssemble(pParse, Z, 0, 0, &W);
181634a7d790Sdan }
181734a7d790Sdan 
181834a7d790Sdan frame_opt(A) ::= .                             {
1819d35300f9Sdan   A = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0);
182034a7d790Sdan }
1821d35300f9Sdan frame_opt(A) ::= range_or_rows(X) frame_bound_s(Y) frame_exclude_opt(Z). {
1822d35300f9Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0, Z);
182334a7d790Sdan }
18240f134f02Sdrh frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound_s(Y) AND
18250f134f02Sdrh                           frame_bound_e(Z) frame_exclude_opt(W). {
1826d35300f9Sdan   A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr, W);
182734a7d790Sdan }
182834a7d790Sdan 
18290f134f02Sdrh range_or_rows(A) ::= RANGE|ROWS|GROUPS(X).   {A = @X; /*A-overwrites-X*/}
1830287fa17bSdan 
1831287fa17bSdan frame_bound_s(A) ::= frame_bound(X).         {A = X;}
18320f134f02Sdrh frame_bound_s(A) ::= UNBOUNDED(X) PRECEDING. {A.eType = @X; A.pExpr = 0;}
1833287fa17bSdan frame_bound_e(A) ::= frame_bound(X).         {A = X;}
18340f134f02Sdrh frame_bound_e(A) ::= UNBOUNDED(X) FOLLOWING. {A.eType = @X; A.pExpr = 0;}
1835287fa17bSdan 
18360f134f02Sdrh frame_bound(A) ::= expr(X) PRECEDING|FOLLOWING(Y).
18370f134f02Sdrh                                              {A.eType = @Y; A.pExpr = X;}
18380f134f02Sdrh frame_bound(A) ::= CURRENT(X) ROW.           {A.eType = @X; A.pExpr = 0;}
183934a7d790Sdan 
1840d35300f9Sdan %type frame_exclude_opt {u8}
18411e7cb19bSdan frame_exclude_opt(A) ::= . {A = 0;}
1842d35300f9Sdan frame_exclude_opt(A) ::= EXCLUDE frame_exclude(X). {A = X;}
1843d35300f9Sdan 
1844d35300f9Sdan %type frame_exclude {u8}
18450f134f02Sdrh frame_exclude(A) ::= NO(X) OTHERS.   {A = @X; /*A-overwrites-X*/}
18460f134f02Sdrh frame_exclude(A) ::= CURRENT(X) ROW. {A = @X; /*A-overwrites-X*/}
18470f134f02Sdrh frame_exclude(A) ::= GROUP|TIES(X).  {A = @X; /*A-overwrites-X*/}
1848d35300f9Sdan 
1849d35300f9Sdan 
1850550a3309Sdrh %type window_clause {Window*}
1851550a3309Sdrh %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);}
1852550a3309Sdrh window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; }
18536e2210e0Sdan 
18544f9adee2Sdan filter_over(A) ::= filter_clause(F) over_clause(O). {
1855d4f7ec76Sdrh   if( O ){
18564f9adee2Sdan     O->pFilter = F;
1857d4f7ec76Sdrh   }else{
1858d4f7ec76Sdrh     sqlite3ExprDelete(pParse->db, F);
1859d4f7ec76Sdrh   }
18604f9adee2Sdan   A = O;
18616488271fSdan }
18624f9adee2Sdan filter_over(A) ::= over_clause(O). {
18634f9adee2Sdan   A = O;
18646488271fSdan }
18654f9adee2Sdan filter_over(A) ::= filter_clause(F). {
18664f9adee2Sdan   A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
18674f9adee2Sdan   if( A ){
18684f9adee2Sdan     A->eFrmType = TK_FILTER;
18694f9adee2Sdan     A->pFilter = F;
187000885742Sdan   }else{
187100885742Sdan     sqlite3ExprDelete(pParse->db, F);
18724f9adee2Sdan   }
18736488271fSdan }
18746488271fSdan 
18756488271fSdan over_clause(A) ::= OVER LP window(Z) RP. {
18766e2210e0Sdan   A = Z;
1877a57aac26Sdrh   assert( A!=0 );
1878a57aac26Sdrh }
18796488271fSdan over_clause(A) ::= OVER nm(Z). {
1880a57aac26Sdrh   A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
1881a57aac26Sdrh   if( A ){
1882a57aac26Sdrh     A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n);
1883a57aac26Sdrh   }
18846e2210e0Sdan }
18856e2210e0Sdan 
18866488271fSdan filter_clause(A) ::= FILTER LP WHERE expr(X) RP.  { A = X; }
1887c7bf5716Sdrh %endif /* SQLITE_OMIT_WINDOWFUNC */
1888f1722baaSdrh 
1889f1722baaSdrh /*
1890f1722baaSdrh ** The code generator needs some extra TK_ token values for tokens that
1891f1722baaSdrh ** are synthesized and do not actually appear in the grammar:
1892f1722baaSdrh */
1893f1722baaSdrh %token
1894f1722baaSdrh   COLUMN          /* Reference to a table column */
1895f1722baaSdrh   AGG_FUNCTION    /* An aggregate function */
1896f1722baaSdrh   AGG_COLUMN      /* An aggregated column */
1897ee6c5e5aSdan   TRUEFALSE       /* True or false keyword */
1898ee6c5e5aSdan   ISNOT           /* Combination of IS and NOT */
1899ee6c5e5aSdan   FUNCTION        /* A function invocation */
1900f1722baaSdrh   UMINUS          /* Unary minus */
1901f1722baaSdrh   UPLUS           /* Unary plus */
1902f1722baaSdrh   TRUTH           /* IS TRUE or IS FALSE or IS NOT TRUE or IS NOT FALSE */
1903f1722baaSdrh   REGISTER        /* Reference to a VDBE register */
1904f1722baaSdrh   VECTOR          /* Vector */
1905f1722baaSdrh   SELECT_COLUMN   /* Choose a single column from a multi-column SELECT */
1906f1722baaSdrh   IF_NULL_ROW     /* the if-null-row operator */
1907f1722baaSdrh   ASTERISK        /* The "*" in count(*) and similar */
1908f1722baaSdrh   SPAN            /* The span operator */
190905428127Sdrh   ERROR           /* An expression containing an error */
1910f1722baaSdrh .
1911f1722baaSdrh /* There must be no more than 255 tokens defined above.  If this grammar
1912f1722baaSdrh ** is extended with new rules and tokens, they must either be so few in
1913f1722baaSdrh ** number that TK_SPAN is no more than 255, or else the new tokens must
1914f1722baaSdrh ** appear after this line.
1915f1722baaSdrh */
1916f1722baaSdrh %include {
1917f1722baaSdrh #if TK_SPAN>255
1918f1722baaSdrh # error too many tokens in the grammar
1919f1722baaSdrh #endif
1920f1722baaSdrh }
1921f1722baaSdrh 
1922f1722baaSdrh /*
1923f1722baaSdrh ** The TK_SPACE and TK_ILLEGAL tokens must be the last two tokens.  The
1924f1722baaSdrh ** parser depends on this.  Those tokens are not used in any grammar rule.
1925f1722baaSdrh ** They are only used by the tokenizer.  Declare them last so that they
1926f1722baaSdrh ** are guaranteed to be the last two tokens
1927f1722baaSdrh */
1928f1722baaSdrh %token SPACE ILLEGAL.
1929