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