xref: /sqlite-3.40.0/src/parse.y (revision 54514c98)
1348784efSdrh /*
2b19a2bc6Sdrh ** 2001 September 15
3348784efSdrh **
4b19a2bc6Sdrh ** The author disclaims copyright to this source code.  In place of
5b19a2bc6Sdrh ** a legal notice, here is a blessing:
6348784efSdrh **
7b19a2bc6Sdrh **    May you do good and not evil.
8b19a2bc6Sdrh **    May you find forgiveness for yourself and forgive others.
9b19a2bc6Sdrh **    May you share freely, never taking more than you give.
10348784efSdrh **
11348784efSdrh *************************************************************************
12348784efSdrh ** This file contains SQLite's grammar for SQL.  Process this file
13348784efSdrh ** using the lemon parser generator to generate C code that runs
14348784efSdrh ** the parser.  Lemon will also generate a header file containing
15348784efSdrh ** numeric codes for all of the tokens.
16348784efSdrh */
17487e262fSdrh 
18487e262fSdrh // All token codes are small integers with #defines that begin with "TK_"
19348784efSdrh %token_prefix TK_
20487e262fSdrh 
21487e262fSdrh // The type of the data attached to each token is Token.  This is also the
22487e262fSdrh // default type for non-terminals.
23487e262fSdrh //
24348784efSdrh %token_type {Token}
25f57b14a6Sdrh %default_type {Token}
26487e262fSdrh 
27487e262fSdrh // The generated parser function takes a 4th argument as follows:
28348784efSdrh %extra_argument {Parse *pParse}
29487e262fSdrh 
30487e262fSdrh // This code runs whenever there is a syntax error
31487e262fSdrh //
32348784efSdrh %syntax_error {
33128255fcSdrh   UNUSED_PARAMETER(yymajor);  /* Silence some compiler warnings */
346116ee4eSdrh   if( TOKEN.z[0] ){
354adee20fSdanielk1977     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
366116ee4eSdrh   }else{
376116ee4eSdrh     sqlite3ErrorMsg(pParse, "incomplete input");
386116ee4eSdrh   }
39b86ccfb2Sdrh }
408fc3345fSdrh %stack_overflow {
418fc3345fSdrh   sqlite3ErrorMsg(pParse, "parser stack overflow");
428fc3345fSdrh }
43487e262fSdrh 
44487e262fSdrh // The name of the generated procedure that implements the parser
45487e262fSdrh // is as follows:
464adee20fSdanielk1977 %name sqlite3Parser
47487e262fSdrh 
48487e262fSdrh // The following text is included near the beginning of the C source
49487e262fSdrh // code file that implements the parser.
50487e262fSdrh //
51348784efSdrh %include {
52348784efSdrh #include "sqliteInt.h"
539bbca4c1Sdrh 
549bbca4c1Sdrh /*
55d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down
56d3ec02d3Sdrh ** automaton.
57d3ec02d3Sdrh */
58d3ec02d3Sdrh #define YYNOERRORRECOVERY 1
59d3ec02d3Sdrh 
60d3ec02d3Sdrh /*
618a415d37Sdrh ** Make yytestcase() the same as testcase()
628a415d37Sdrh */
638a415d37Sdrh #define yytestcase(X) testcase(X)
648a415d37Sdrh 
658a415d37Sdrh /*
6682415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null
6782415f2dSdrh ** pointer.
6882415f2dSdrh */
69644f4c1bSdrh #define YYPARSEFREENEVERNULL 1
7082415f2dSdrh 
7182415f2dSdrh /*
72d26cc541Sdrh ** In the amalgamation, the parse.c file generated by lemon and the
73d26cc541Sdrh ** tokenize.c file are concatenated.  In that case, sqlite3RunParser()
74d26cc541Sdrh ** has access to the the size of the yyParser object and so the parser
75d26cc541Sdrh ** engine can be allocated from stack.  In that case, only the
76d26cc541Sdrh ** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked
77d26cc541Sdrh ** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be
78d26cc541Sdrh ** omitted.
79d26cc541Sdrh */
80d26cc541Sdrh #ifdef SQLITE_AMALGAMATION
81d26cc541Sdrh # define sqlite3Parser_ENGINEALWAYSONSTACK 1
82d26cc541Sdrh #endif
83d26cc541Sdrh 
84d26cc541Sdrh /*
8582415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed
8682415f2dSdrh ** into sqlite3ParserAlloc().  The default is size_t.
8782415f2dSdrh */
8882415f2dSdrh #define YYMALLOCARGTYPE  u64
8982415f2dSdrh 
9082415f2dSdrh /*
91ad3cab52Sdrh ** An instance of the following structure describes the event of a
92ad3cab52Sdrh ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
93ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
94ad3cab52Sdrh **
95ad3cab52Sdrh **      UPDATE ON (a,b,c)
96ad3cab52Sdrh **
97ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c".
98c3f9bad2Sdanielk1977 */
99ad3cab52Sdrh struct TrigEvent { int a; IdList * b; };
100caec2f12Sdrh 
10125d6543dSdrh /*
1024a642b60Sdrh ** Disable lookaside memory allocation for objects that might be
1034a642b60Sdrh ** shared across database connections.
1044a642b60Sdrh */
1054a642b60Sdrh static void disableLookaside(Parse *pParse){
1064a642b60Sdrh   pParse->disableLookaside++;
1074a642b60Sdrh   pParse->db->lookaside.bDisable++;
1084a642b60Sdrh }
1094a642b60Sdrh 
110caec2f12Sdrh } // end %include
111348784efSdrh 
112826fb5a3Sdrh // Input is a single SQL command
113c4a3c779Sdrh input ::= cmdlist.
114094b2bbfSdrh cmdlist ::= cmdlist ecmd.
115826fb5a3Sdrh cmdlist ::= ecmd.
116b7f9164eSdrh ecmd ::= SEMI.
1172424aa72Sdrh ecmd ::= cmdx SEMI.
118b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
1192424aa72Sdrh ecmd ::= explain cmdx.
1208549d55eSdrh explain ::= EXPLAIN.              { pParse->explain = 1; }
1218549d55eSdrh explain ::= EXPLAIN QUERY PLAN.   { pParse->explain = 2; }
122154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
123200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
124348784efSdrh 
125382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
126c4a3c779Sdrh //
127fa86c412Sdrh 
128684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
129c4a3c779Sdrh trans_opt ::= .
130c4a3c779Sdrh trans_opt ::= TRANSACTION.
1315ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
132684917c2Sdrh %type transtype {int}
133684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
134cf82f0d3Sdrh transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
135cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
136cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
13707a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt.   {sqlite3EndTransaction(pParse,@X);}
13807a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt.     {sqlite3EndTransaction(pParse,@X);}
139c4a3c779Sdrh 
140fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
141fd7f0452Sdanielk1977 savepoint_opt ::= .
142fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
143fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
144fd7f0452Sdanielk1977 }
145fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
146fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
147fd7f0452Sdanielk1977 }
148fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
149fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
150fd7f0452Sdanielk1977 }
151fd7f0452Sdanielk1977 
152382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
153348784efSdrh //
154348784efSdrh cmd ::= create_table create_table_args.
155d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
156f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
157969fa7c1Sdrh }
158dabd04c6Sdrh createkw(A) ::= CREATE(A).  {disableLookaside(pParse);}
159dabd04c6Sdrh 
160faa59554Sdrh %type ifnotexists {int}
161faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
162faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
163f57b3399Sdrh %type temp {int}
16453c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
165d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
166154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
167d24cc427Sdrh temp(A) ::= .      {A = 0;}
1685969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
1695969da4aSdrh   sqlite3EndTable(pParse,&X,&E,F,0);
170969fa7c1Sdrh }
171969fa7c1Sdrh create_table_args ::= AS select(S). {
1725969da4aSdrh   sqlite3EndTable(pParse,0,0,0,S);
173633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
174969fa7c1Sdrh }
1753334d089Sdrh %type table_options {int}
1765969da4aSdrh table_options(A) ::= .    {A = 0;}
1775969da4aSdrh table_options(A) ::= WITHOUT nm(X). {
1785969da4aSdrh   if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
179fccda8a1Sdrh     A = TF_WithoutRowid | TF_NoVisibleRowid;
1805969da4aSdrh   }else{
1815969da4aSdrh     A = 0;
1825969da4aSdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
1835969da4aSdrh   }
1845969da4aSdrh }
185986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist.
186986dde70Sdrh columnlist ::= columnname carglist.
1872881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);}
188c4a3c779Sdrh 
1896a8700b9Sdrh // Declare some tokens early in order to influence their values, to
1906a8700b9Sdrh // improve performance and reduce the executable size.  The goal here is
1916a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric
1926a8700b9Sdrh // values that are early enough so that all jump operations are clustered
1936a8700b9Sdrh // at the beginning, but also so that the comparison tokens NE through GE
1946a8700b9Sdrh // are as large as possible so that they are near to FUNCTION, which is a
1956a8700b9Sdrh // token synthesized by addopcodes.tcl.
1966a8700b9Sdrh //
1976a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST.
1986a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL.
1996a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2006a8700b9Sdrh %token GT LE LT GE ESCAPE.
2016a8700b9Sdrh 
20231d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
20331d6fd55Sdrh // fallback to ID if they will not parse as their original value.
20431d6fd55Sdrh // This obviates the need for the "id" nonterminal.
20531d6fd55Sdrh //
20631d6fd55Sdrh %fallback ID
20731d6fd55Sdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2080a6259f5Sdrh   CONFLICT DATABASE DEFERRED DESC DETACH DO
2096cd7d489Sdrh   EACH END EXCLUSIVE EXPLAIN FAIL FOR
21031d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
21131d6fd55Sdrh   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW
21231d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
21331d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
21431d6fd55Sdrh   EXCEPT INTERSECT UNION
21531d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
21631d6fd55Sdrh   REINDEX RENAME CTIME_KW IF
21731d6fd55Sdrh   .
21831d6fd55Sdrh %wildcard ANY.
21931d6fd55Sdrh 
220f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
2212d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2222d3917daSdrh // causes them to be assigned integer values that are close together,
2232d3917daSdrh // which keeps parser tables smaller.
2242d3917daSdrh //
225f2bc013cSdrh // The token values assigned to these symbols is determined by the order
226f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
227f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
228f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
229f2bc013cSdrh // constraint.
230f2bc013cSdrh //
2312d3917daSdrh %left OR.
2322d3917daSdrh %left AND.
2332d3917daSdrh %right NOT.
23403bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2359a43267bSdrh %left GT LE LT GE.
2367c6303c0Sdanielk1977 %right ESCAPE.
2372d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2382d3917daSdrh %left PLUS MINUS.
2392d3917daSdrh %left STAR SLASH REM.
240a34001c9Sdrh %left CONCAT.
241a34001c9Sdrh %left COLLATE.
2427ba5bc5bSdrh %right BITNOT.
24326cf56f8Sdrh %nonassoc ON.
2442d3917daSdrh 
2457cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2467cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2477cc84c2cSdrh //
2487cc84c2cSdrh %token_class id  ID|INDEXED.
2497cc84c2cSdrh 
2507cc84c2cSdrh 
251c4a3c779Sdrh // And "ids" is an identifer-or-string.
252c4a3c779Sdrh //
253f59b12fbSdrh %token_class ids  ID|STRING.
254c4a3c779Sdrh 
2555ad1a6c8Sdrh // The name of a column or table can be any of the following:
2565ad1a6c8Sdrh //
2575ad1a6c8Sdrh %type nm {Token}
2584dd0d3f8Sdrh nm(A) ::= id(A).
2594dd0d3f8Sdrh nm(A) ::= STRING(A).
2604dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
2615ad1a6c8Sdrh 
262986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
263487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
264487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
265487e262fSdrh //
266487e262fSdrh %type typetoken {Token}
267986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
2684dd0d3f8Sdrh typetoken(A) ::= typename(A).
2694dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
2704dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
271487e262fSdrh }
2724dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
2734dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
274487e262fSdrh }
275382c0247Sdrh %type typename {Token}
2764dd0d3f8Sdrh typename(A) ::= ids(A).
2774dd0d3f8Sdrh typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
27860218d2aSdrh signed ::= plus_num.
27960218d2aSdrh signed ::= minus_num.
280487e262fSdrh 
2811be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the
2821be266baSdrh // input text just past the last token that has been shifted into
2831be266baSdrh // the parser.  By surrounding some phrase in the grammar with two
2841be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase.
2851be266baSdrh // For example:
2861be266baSdrh //
2871be266baSdrh //      something ::= .... scanpt(A) phrase scanpt(Z).
2881be266baSdrh //
2891be266baSdrh // The text that is parsed as "phrase" is a string starting at A
2901be266baSdrh // and containing (int)(Z-A) characters.  There might be some extra
2911be266baSdrh // whitespace on either end of the text, but that can be removed in
2921be266baSdrh // post-processing, if needed.
2931be266baSdrh //
2941be266baSdrh %type scanpt {const char*}
2951be266baSdrh scanpt(A) ::= . {
296f259df5fSdrh   assert( yyLookahead!=YYNOCODE );
2971be266baSdrh   A = yyLookaheadToken.z;
2981be266baSdrh }
2991be266baSdrh 
300487e262fSdrh // "carglist" is a list of additional constraints that come after the
301487e262fSdrh // column name and column type in a CREATE TABLE statement.
302487e262fSdrh //
3034dc330ddSdrh carglist ::= carglist ccons.
304348784efSdrh carglist ::= .
3054dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
3061be266baSdrh ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z).
3071be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A,Z);}
3081be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3091be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
3101be266baSdrh ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z).
3111be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z,Z);}
3121be266baSdrh ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z).      {
3131be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3141be266baSdrh   sqlite3AddDefaultValue(pParse,p,A.z,Z);
3157977a17fSdanielk1977 }
3161be266baSdrh ccons ::= DEFAULT scanpt id(X).       {
3171be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
318d7fd899eSdrh   if( p ){
319171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
32096acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
321d7fd899eSdrh   }
3221be266baSdrh   sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3237977a17fSdanielk1977 }
324348784efSdrh 
325382c0247Sdrh // In addition to the type name, we also care about the primary key and
326382c0247Sdrh // UNIQUE constraints.
327348784efSdrh //
3280d316a40Sdrh ccons ::= NULL onconf.
3294adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
330fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
331fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
33262340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
33362340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3341be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
335108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3364adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3374adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
33839002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
33904738cb9Sdrh 
340205f48e6Sdrh // The optional AUTOINCREMENT keyword
341205f48e6Sdrh %type autoinc {int}
342205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3432958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
344205f48e6Sdrh 
345c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
346c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
347c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
348c2eef3b3Sdrh // check fails.
34904738cb9Sdrh //
350c2eef3b3Sdrh %type refargs {int}
351fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3524dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
353c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
354c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
355c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
356c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
357c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
358c2eef3b3Sdrh %type refact {int}
359fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
360fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
361fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
362fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
363fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
364c2eef3b3Sdrh %type defer_subclause {int}
3651da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
366c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
367c2eef3b3Sdrh %type init_deferred_pred_opt {int}
368c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
369c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
370c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
371348784efSdrh 
37219a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3734dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
374ab35eaedSdrh conslist ::= conslist tconscomma tcons.
375ab35eaedSdrh conslist ::= tcons.
376ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
377ab35eaedSdrh tconscomma ::= .
378ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
379108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
380fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
381108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
38262340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
38362340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
384b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
3851be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
386108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
387108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3884adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3894adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
390c2eef3b3Sdrh }
391c2eef3b3Sdrh %type defer_subclause_opt {int}
392c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
3934dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
3949cfcf5d4Sdrh 
3959cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3969cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3979cfcf5d4Sdrh //
3989cfcf5d4Sdrh %type onconf {int}
3993334d089Sdrh %type orconf {int}
4001c92853dSdrh %type resolvetype {int}
4011c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4021c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4031c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4043334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4054dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4061c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4071c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
408348784efSdrh 
409382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
410348784efSdrh //
411a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
412a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
413a8858103Sdanielk1977 }
414a073384fSdrh %type ifexists {int}
415a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
416a073384fSdrh ifexists(A) ::= .            {A = 0;}
417348784efSdrh 
418a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
419a76b5dfcSdrh //
420b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
421108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4228981b904Sdrh           AS select(S). {
4238981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
424a76b5dfcSdrh }
425a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
426a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
427a76b5dfcSdrh }
428154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
429a76b5dfcSdrh 
430382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
431348784efSdrh //
4327d562dbeSdan cmd ::= select(X).  {
433edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4347d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
435633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4369bb61fe7Sdrh }
437efb7251dSdrh 
4389bb61fe7Sdrh %type select {Select*}
439633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4407d562dbeSdan %type selectnowith {Select*}
4417d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
44282c3d636Sdrh %type oneselect {Select*}
443633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4449bb61fe7Sdrh 
445772460fdSdrh %include {
446772460fdSdrh   /*
447772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
448772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
449772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
450772460fdSdrh   */
451e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
452d227a291Sdrh     if( p->pPrior ){
453772460fdSdrh       Select *pNext = 0, *pLoop;
454772460fdSdrh       int mxSelect, cnt = 0;
455d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
456d227a291Sdrh         pLoop->pNext = pNext;
457d227a291Sdrh         pLoop->selFlags |= SF_Compound;
458d227a291Sdrh       }
459772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
460772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
461772460fdSdrh         cnt>mxSelect
462a0c01768Sdrh       ){
463d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
464d227a291Sdrh       }
465d227a291Sdrh     }
466772460fdSdrh   }
467772460fdSdrh }
468772460fdSdrh 
469a5746e03Sdrh select(A) ::= WITH wqlist(W) selectnowith(X). {
470772460fdSdrh   Select *p = X;
471772460fdSdrh   if( p ){
472772460fdSdrh     p->pWith = W;
473772460fdSdrh     parserDoubleLinkSelect(pParse, p);
474a9f5c13dSdan   }else{
475a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
476a9f5c13dSdan   }
477a5746e03Sdrh   A = p;
478a5746e03Sdrh }
479a5746e03Sdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X). {
480a5746e03Sdrh   Select *p = X;
481a5746e03Sdrh   if( p ){
482a5746e03Sdrh     p->pWith = W;
483a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
484a5746e03Sdrh   }else{
485a5746e03Sdrh     sqlite3WithDelete(pParse->db, W);
486a5746e03Sdrh   }
487a5746e03Sdrh   A = p;
488a5746e03Sdrh }
489a5746e03Sdrh select(A) ::= selectnowith(X). {
490a5746e03Sdrh   Select *p = X;
491a5746e03Sdrh   if( p ){
492a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
493a5746e03Sdrh   }
494a5746e03Sdrh   A = p; /*A-overwrites-X*/
495a9f5c13dSdan }
4967d562dbeSdan 
4974dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
498b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
4994dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
500c0bf493eSdrh   Select *pRhs = Z;
5014dd0d3f8Sdrh   Select *pLhs = A;
502c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
503c0bf493eSdrh     SrcList *pFrom;
504c0bf493eSdrh     Token x;
505c0bf493eSdrh     x.n = 0;
506772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
507c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
5088c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
509c0bf493eSdrh   }
510c0bf493eSdrh   if( pRhs ){
511c0bf493eSdrh     pRhs->op = (u8)Y;
51200d5ab74Sdrh     pRhs->pPrior = pLhs;
51300d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
514772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
515d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
51643b78826Sdrh   }else{
51700d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
518daffd0e5Sdrh   }
519c0bf493eSdrh   A = pRhs;
52082c3d636Sdrh }
5210a36c57eSdrh %type multiselect_op {int}
522cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5230a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
524cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
525154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
526abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
5279bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
52843303de9Sdrh #if SELECTTRACE_ENABLED
52943303de9Sdrh   Token s = S; /*A-overwrites-S*/
53043303de9Sdrh #endif
5318c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
532abd4c723Sdrh #if SELECTTRACE_ENABLED
533eb9b884cSdrh   /* Populate the Select.zSelName[] string that is used to help with
534abd4c723Sdrh   ** query planner debugging, to differentiate between multiple Select
535abd4c723Sdrh   ** objects in a complex query.
536abd4c723Sdrh   **
537abd4c723Sdrh   ** If the SELECT keyword is immediately followed by a C-style comment
538abd4c723Sdrh   ** then extract the first few alphanumeric characters from within that
539eb9b884cSdrh   ** comment to be the zSelName value.  Otherwise, the label is #N where
540abd4c723Sdrh   ** is an integer that is incremented with each SELECT statement seen.
541abd4c723Sdrh   */
542abd4c723Sdrh   if( A!=0 ){
54343303de9Sdrh     const char *z = s.z+6;
544abd4c723Sdrh     int i;
545cfd74700Sdrh     sqlite3_snprintf(sizeof(A->zSelName), A->zSelName,"#%d",++pParse->nSelect);
546abd4c723Sdrh     while( z[0]==' ' ) z++;
547abd4c723Sdrh     if( z[0]=='/' && z[1]=='*' ){
548abd4c723Sdrh       z += 2;
549abd4c723Sdrh       while( z[0]==' ' ) z++;
550abd4c723Sdrh       for(i=0; sqlite3Isalnum(z[i]); i++){}
551eb9b884cSdrh       sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
552abd4c723Sdrh     }
553abd4c723Sdrh   }
554abd4c723Sdrh #endif /* SELECTRACE_ENABLED */
5559bb61fe7Sdrh }
5564dd0d3f8Sdrh oneselect(A) ::= values(A).
55775593d96Sdrh 
55875593d96Sdrh %type values {Select*}
55975593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
56075593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5618c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
56275593d96Sdrh }
5634dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. {
5644dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5658c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
566f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
56775593d96Sdrh   if( pRight ){
56875593d96Sdrh     pRight->op = TK_ALL;
569772460fdSdrh     pRight->pPrior = pLeft;
57075593d96Sdrh     A = pRight;
57175593d96Sdrh   }else{
572772460fdSdrh     A = pLeft;
57375593d96Sdrh   }
57475593d96Sdrh }
5759bb61fe7Sdrh 
5769bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5779bb61fe7Sdrh // present and false (0) if it is not.
5789bb61fe7Sdrh //
5793334d089Sdrh %type distinct {int}
580832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5817cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
582efb7251dSdrh distinct(A) ::= .           {A = 0;}
583348784efSdrh 
5849bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5857c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5867c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5871a1d3cd2Sdrh // opcode of TK_ASTERISK.
5889bb61fe7Sdrh //
589348784efSdrh %type selcollist {ExprList*}
590633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
591348784efSdrh %type sclp {ExprList*}
592633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
5934dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
594348784efSdrh sclp(A) ::= .                                {A = 0;}
5951be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
5961be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
597b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
5981be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
59901f3f253Sdrh }
600d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
6011a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
6024dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
6037c917d19Sdrh }
6041be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
605abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
606abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
607abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
6084dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
60954473229Sdrh }
61001f3f253Sdrh 
61101f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
61201f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
61301f3f253Sdrh //
61401f3f253Sdrh %type as {Token}
6155ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
6164dd0d3f8Sdrh as(X) ::= ids(X).
617986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6189bb61fe7Sdrh 
619348784efSdrh 
620ad3cab52Sdrh %type seltablist {SrcList*}
621633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
622ad3cab52Sdrh %type stl_prefix {SrcList*}
623633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
624ad3cab52Sdrh %type from {SrcList*}
625633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
626348784efSdrh 
62701f3f253Sdrh // A complete FROM clause.
62801f3f253Sdrh //
62917435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
63061dfc31dSdrh from(A) ::= FROM seltablist(X). {
63161dfc31dSdrh   A = X;
63261dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
63361dfc31dSdrh }
63401f3f253Sdrh 
63501f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
63601f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
63701f3f253Sdrh //
6384dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6398a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
64001f3f253Sdrh }
641348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6424dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
643e9240418Sdrh                   on_opt(N) using_opt(U). {
6444dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
645b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
64601f3f253Sdrh }
6474dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
64801d230ceSdrh                   on_opt(N) using_opt(U). {
6494dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
65001d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
65101d230ceSdrh }
65251522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6534dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
654b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6554dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
65622f70c32Sdrh   }
6574dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
658fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6594dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
660fbdc7f69Sdrh       A = F;
661832ee3d4Sdrh     }else if( F->nSrc==1 ){
6624dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
663832ee3d4Sdrh       if( A ){
664832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
665832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
666832ee3d4Sdrh         pNew->zName = pOld->zName;
667832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6683c449c6bSdrh         pNew->pSelect = pOld->pSelect;
669832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6703c449c6bSdrh         pOld->pSelect = 0;
671832ee3d4Sdrh       }
672832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
673fbdc7f69Sdrh     }else{
674fbdc7f69Sdrh       Select *pSubquery;
675fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6768c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6774dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
678fbdc7f69Sdrh     }
679fbdc7f69Sdrh   }
680154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
681b733d037Sdrh 
682113088ecSdrh %type dbnm {Token}
683113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
684113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
685113088ecSdrh 
68674ad7fe9Sdrh %type fullname {SrcList*}
687633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
688a5746e03Sdrh fullname(A) ::= nm(X).
689a5746e03Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/}
690a5746e03Sdrh fullname(A) ::= nm(X) DOT nm(Y).
691cf82f0d3Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
69274ad7fe9Sdrh 
69301f3f253Sdrh %type joinop {int}
694fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
695cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
696cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
697cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
698cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
6995ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
700cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
70101f3f253Sdrh 
70226cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a
70326cf56f8Sdrh // SELECT on the RHS of a the INSERT:
70426cf56f8Sdrh //
70526cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ...
70626cf56f8Sdrh //                                        here ----^^
70726cf56f8Sdrh //
70826cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is
70926cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON
71026cf56f8Sdrh // clause associated with the JOIN.  The conflict is resolved in favor
71126cf56f8Sdrh // of the JOIN.  If an ON CONFLICT clause is intended, insert a dummy
71226cf56f8Sdrh // WHERE clause in between, like this:
71326cf56f8Sdrh //
71426cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ...
71526cf56f8Sdrh //
71626cf56f8Sdrh // The [AND] and [OR] precedence marks in the rules for on_opt cause the
71726cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN.
71826cf56f8Sdrh //
71901f3f253Sdrh %type on_opt {Expr*}
720633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
7211be266baSdrh on_opt(N) ::= ON expr(E).  {N = E;}
72226cf56f8Sdrh on_opt(N) ::= .     [OR]   {N = 0;}
72301f3f253Sdrh 
72485574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
72585574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
72685574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
72785574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
72885574e31Sdanielk1977 // in the token.
72985574e31Sdanielk1977 //
73085574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
731b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
73285574e31Sdanielk1977 // recognizes and interprets this as a special case.
73385574e31Sdanielk1977 //
73485574e31Sdanielk1977 %type indexed_opt {Token}
73585574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
73685574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
73785574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
73885574e31Sdanielk1977 
73901f3f253Sdrh %type using_opt {IdList*}
740633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
74181eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
74201f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
74301f3f253Sdrh 
74401f3f253Sdrh 
745348784efSdrh %type orderby_opt {ExprList*}
746633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
747108aa00aSdrh 
748108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
749108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
750108aa00aSdrh // sort order.
751108aa00aSdrh //
752348784efSdrh %type sortlist {ExprList*}
753633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
754348784efSdrh 
755348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
756348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7574dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). {
7581be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
759bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
760348784efSdrh }
7618395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
7621be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
763bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
764348784efSdrh }
765348784efSdrh 
766348784efSdrh %type sortorder {int}
767348784efSdrh 
7688e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
7698e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
770bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
771348784efSdrh 
7722282792aSdrh %type groupby_opt {ExprList*}
773633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
7742282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
7759245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
7762282792aSdrh 
7772282792aSdrh %type having_opt {Expr*}
778633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
7792282792aSdrh having_opt(A) ::= .                {A = 0;}
7801be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
7812282792aSdrh 
7828c0833fbSdrh %type limit_opt {Expr*}
78315926590Sdrh 
78415926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
78515926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
78615926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
78715926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
78815926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
78915926590Sdrh // except as a transient.  So there is never anything to destroy.
79015926590Sdrh //
7918c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
7928c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
7938c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
7941be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
795a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
7961be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
797a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
7981be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
7999bbca4c1Sdrh 
800382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
801382c0247Sdrh //
802273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
803a5746e03Sdrh cmd ::= with DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
804931577f1Sdrh         orderby_opt(O) limit_opt(L). {
805b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
8068c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
8074281bd42Sshane }
8084281bd42Sshane %endif
809273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
810a5746e03Sdrh cmd ::= with DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
8114281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8128c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
8134281bd42Sshane }
8144281bd42Sshane %endif
815348784efSdrh 
816348784efSdrh %type where_opt {Expr*}
817633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
818348784efSdrh 
819348784efSdrh where_opt(A) ::= .                    {A = 0;}
8201be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
821348784efSdrh 
822382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
823382c0247Sdrh //
824273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
825a5746e03Sdrh cmd ::= with UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
8268b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
827b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
828b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
829eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L,0);
8304281bd42Sshane }
8314281bd42Sshane %endif
832273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
833a5746e03Sdrh cmd ::= with UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
834e9240418Sdrh         where_opt(W).  {
8354281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8364281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
837eac9fabbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0,0);
8384281bd42Sshane }
8394281bd42Sshane %endif
840348784efSdrh 
841f8db1bc0Sdrh %type setlist {ExprList*}
842633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
843f8db1bc0Sdrh 
8444dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8451be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
846b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
847b7916a78Sdrh }
848a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8491be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
850a1251bc4Sdrh }
851b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8521be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
853b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
854b7916a78Sdrh }
855a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
8561be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
857a1251bc4Sdrh }
858348784efSdrh 
859382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
860382c0247Sdrh //
86135e86bf1Sdrh cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S)
8622c2e844aSdrh         upsert(U). {
86346d2e5c3Sdrh   sqlite3Insert(pParse, X, S, F, R, U);
8644e9119d9Sdan }
8650a6259f5Sdrh cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) AS nm(A) select(S)
8660a6259f5Sdrh         upsert(U). {
867*54514c98Sdrh   /* X could only be NULL following a OOM, but an OOM would have been detected
868*54514c98Sdrh   ** and stopped the parse long before this rule reduces. */
869*54514c98Sdrh   assert( X!=0 );
870*54514c98Sdrh   X->a[0].zAlias = sqlite3NameFromToken(pParse->db, &A);
8710a6259f5Sdrh   sqlite3Insert(pParse, X, S, F, R, U);
8720a6259f5Sdrh }
873a5746e03Sdrh cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
8744e9119d9Sdan {
8752c2e844aSdrh   sqlite3Insert(pParse, X, 0, F, R, 0);
8764e9119d9Sdan }
877348784efSdrh 
87846d2e5c3Sdrh %type upsert {Upsert*}
879*54514c98Sdrh 
880*54514c98Sdrh // Because upsert only occurs at the tip end of the INSERT rule for cmd,
881*54514c98Sdrh // there is never a case where the value of the upsert pointer will not
882*54514c98Sdrh // be destroyed by the cmd action.  So comment-out the destructor to
883*54514c98Sdrh // avoid unreachable code.
884*54514c98Sdrh //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);}
88546d2e5c3Sdrh upsert(A) ::= . { A = 0; }
886e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW)
887dab0eb58Sdrh               DO UPDATE SET setlist(Z) where_opt(W).
888e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W);}
889e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING.
890e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,T,TW,0,0); }
891e9c2e772Sdrh upsert(A) ::= ON CONFLICT DO NOTHING.
892e9c2e772Sdrh               { A = sqlite3UpsertNew(pParse->db,0,0,0,0); }
89326cf56f8Sdrh 
8943334d089Sdrh %type insert_cmd {int}
895fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
896fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
897fa86c412Sdrh 
8988981b904Sdrh %type idlist_opt {IdList*}
8998981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
90081eba73eSdrh %type idlist {IdList*}
90181eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
902348784efSdrh 
9038981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
9048981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
9054dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
9064dd0d3f8Sdrh     {A = sqlite3IdListAppend(pParse->db,A,&Y);}
90781eba73eSdrh idlist(A) ::= nm(Y).
908cf82f0d3Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/}
909348784efSdrh 
910382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
911382c0247Sdrh //
912348784efSdrh 
9131be266baSdrh %type expr {Expr*}
9141be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
9151be266baSdrh %type term {Expr*}
9161be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
917b7916a78Sdrh 
918b7916a78Sdrh %include {
919b7916a78Sdrh 
920b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
921b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
922b7916a78Sdrh   ** that created the expression.
923b7916a78Sdrh   */
9241be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
9250cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
9260cd874bdSdrh     if( p ){
9270cd874bdSdrh       memset(p, 0, sizeof(Expr));
9280cd874bdSdrh       p->op = (u8)op;
9290cd874bdSdrh       p->flags = EP_Leaf;
9300cd874bdSdrh       p->iAgg = -1;
9310cd874bdSdrh       p->u.zToken = (char*)&p[1];
9320cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
9330cd874bdSdrh       p->u.zToken[t.n] = 0;
9340cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
9350cd874bdSdrh         if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted;
9360cd874bdSdrh         sqlite3Dequote(p->u.zToken);
9370cd874bdSdrh       }
9380cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
9390cd874bdSdrh       p->nHeight = 1;
9400cd874bdSdrh #endif
9410cd874bdSdrh     }
9421be266baSdrh     return p;
943b7916a78Sdrh   }
944b7916a78Sdrh }
945348784efSdrh 
9464dd0d3f8Sdrh expr(A) ::= term(A).
9471be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
9481be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9491be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9505ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
951410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
952410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
9531be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
954e1b6a5b8Sdrh }
955d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
956410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
957410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
958410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
959abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
9601be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
961d24cc427Sdrh }
9621be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9631be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9640cd874bdSdrh term(A) ::= INTEGER(X). {
9651be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
9660cd874bdSdrh }
967f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
9688679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
969de25a88cSdrh     u32 n = X.n;
9701be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
9711be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
9728f3b137fSdrh   }else{
973b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
974b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
975b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
9768f3b137fSdrh     Token t = X; /*A-overwrites-X*/
9778f3b137fSdrh     assert( t.n>=2 );
978b7916a78Sdrh     if( pParse->nested==0 ){
97943303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
9801be266baSdrh       A = 0;
981b7916a78Sdrh     }else{
9821be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
9831be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
984b7916a78Sdrh     }
985f59b12fbSdrh   }
986895d7472Sdrh }
9874dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). {
9881be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
9898b4c40d8Sdrh }
990487e262fSdrh %ifndef SQLITE_OMIT_CAST
9911be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
9921be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
9931be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
994487e262fSdrh }
995154d4b24Sdrh %endif  SQLITE_OMIT_CAST
9961be266baSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
997994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
998e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
9994e05c83bSdrh   }
10001be266baSdrh   A = sqlite3ExprFunction(pParse, Y, &X);
10011be266baSdrh   if( D==SF_Distinct && A ){
10021be266baSdrh     A->flags |= EP_Distinct;
1003fd357974Sdrh   }
1004e1b6a5b8Sdrh }
10051be266baSdrh expr(A) ::= id(X) LP STAR RP. {
10061be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &X);
1007e1b6a5b8Sdrh }
1008b71090fdSdrh term(A) ::= CTIME_KW(OP). {
10091be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &OP);
1010b7916a78Sdrh }
1011b7916a78Sdrh 
10121be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
10131be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
10141be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
10151be266baSdrh   if( A ){
10161be266baSdrh     A->x.pList = pList;
10178bd0d58eSdrh   }else{
10188bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
101971c57db0Sdan   }
102071c57db0Sdan }
102171c57db0Sdan 
10221be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y).    {A=sqlite3PExpr(pParse,@OP,A,Y);}
10231be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
10244dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
10251be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10261be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
10274dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
10281be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10294dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
10301be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10314dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
10321be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10331be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
1034410c301fSdrh %type likeop {Token}
10357e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
1036410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
10374dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
10388aa34ae0Sdrh   ExprList *pList;
1039410c301fSdrh   int bNot = OP.n & 0x80000000;
1040410c301fSdrh   OP.n &= 0x7fffffff;
10411be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
10421be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
10431be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
10441be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
10451be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
10460ac65892Sdrh }
10474dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
10481dca1458Sdrh   ExprList *pList;
1049410c301fSdrh   int bNot = OP.n & 0x80000000;
1050410c301fSdrh   OP.n &= 0x7fffffff;
10511be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
10521be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
10531be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
10541be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
10551be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
10561be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
10571dca1458Sdrh }
10587c6303c0Sdanielk1977 
10591be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
10601be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
10616a2fe093Sdrh 
10626a51741dSdrh %include {
10636a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
10646a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
10656a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
10666a51741dSdrh     sqlite3 *db = pParse->db;
1067895c00e1Sdan     if( pA && pY && pY->op==TK_NULL ){
10685e17e8b7Sshaneh       pA->op = (u8)op;
10696a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
10706a51741dSdrh       pA->pRight = 0;
10716a51741dSdrh     }
10726a51741dSdrh   }
10736a51741dSdrh }
10746a51741dSdrh 
10756a2fe093Sdrh //    expr1 IS expr2
10766a2fe093Sdrh //    expr1 IS NOT expr2
10776a2fe093Sdrh //
10786a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
10796a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
10806a2fe093Sdrh //
10814dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
10821be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
10831be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
10846a2fe093Sdrh }
10854dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
10861be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
10871be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
10886a2fe093Sdrh }
1089b7916a78Sdrh 
109043303de9Sdrh expr(A) ::= NOT(B) expr(X).
10911be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
109243303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
10931be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
10941be266baSdrh expr(A) ::= MINUS expr(X). [BITNOT]
10951be266baSdrh               {A = sqlite3PExpr(pParse, TK_UMINUS, X, 0);}
10961be266baSdrh expr(A) ::= PLUS expr(X). [BITNOT]
10971be266baSdrh               {A = sqlite3PExpr(pParse, TK_UPLUS, X, 0);}
1098b7916a78Sdrh 
10992e3a1f16Sdrh %type between_op {int}
11002e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
11012e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
11024dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
11031be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
11041be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
11051be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
11061be266baSdrh   if( A ){
11071be266baSdrh     A->x.pList = pList;
110853f733c7Sdrh   }else{
1109633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
111053f733c7Sdrh   }
11111be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1112fef5208cSdrh }
11133e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
11142e3a1f16Sdrh   %type in_op {int}
11152e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
11162e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
11171be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1118094430ebSdrh     if( Y==0 ){
1119473c1bf2Sdan       /* Expressions of the form
1120473c1bf2Sdan       **
1121473c1bf2Sdan       **      expr1 IN ()
1122473c1bf2Sdan       **      expr1 NOT IN ()
1123473c1bf2Sdan       **
1124473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1125473c1bf2Sdan       ** regardless of the value of expr1.
1126473c1bf2Sdan       */
11271be266baSdrh       sqlite3ExprDelete(pParse->db, A);
11281be266baSdrh       A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1);
11292b59b3a4Sdrh     }else if( Y->nExpr==1 ){
11302b59b3a4Sdrh       /* Expressions of the form:
11312b59b3a4Sdrh       **
11322b59b3a4Sdrh       **      expr1 IN (?1)
11332b59b3a4Sdrh       **      expr1 NOT IN (?2)
11342b59b3a4Sdrh       **
1135fbb24d10Sdrh       ** with exactly one value on the RHS can be simplified to something
1136fbb24d10Sdrh       ** like this:
11372b59b3a4Sdrh       **
1138fbb24d10Sdrh       **      expr1 == ?1
1139fbb24d10Sdrh       **      expr1 <> ?2
1140fbb24d10Sdrh       **
1141fbb24d10Sdrh       ** But, the RHS of the == or <> is marked with the EP_Generic flag
1142fbb24d10Sdrh       ** so that it may not contribute to the computation of comparison
1143fbb24d10Sdrh       ** affinity or the collating sequence to use for comparison.  Otherwise,
1144fbb24d10Sdrh       ** the semantics would be subtly different from IN or NOT IN.
11452b59b3a4Sdrh       */
1146fbb24d10Sdrh       Expr *pRHS = Y->a[0].pExpr;
11472b59b3a4Sdrh       Y->a[0].pExpr = 0;
11482b59b3a4Sdrh       sqlite3ExprListDelete(pParse->db, Y);
11495b1420e0Sdrh       /* pRHS cannot be NULL because a malloc error would have been detected
11505b1420e0Sdrh       ** before now and control would have never reached this point */
11515b1420e0Sdrh       if( ALWAYS(pRHS) ){
1152fbb24d10Sdrh         pRHS->flags &= ~EP_Collate;
1153fbb24d10Sdrh         pRHS->flags |= EP_Generic;
1154fbb24d10Sdrh       }
11551be266baSdrh       A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS);
1156094430ebSdrh     }else{
11571be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
11581be266baSdrh       if( A ){
11591be266baSdrh         A->x.pList = Y;
11601be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1161d5d56523Sdanielk1977       }else{
1162633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1163d5d56523Sdanielk1977       }
11641be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1165094430ebSdrh     }
1166fef5208cSdrh   }
11671be266baSdrh   expr(A) ::= LP select(X) RP. {
11681be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
11691be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
117051522cd3Sdrh   }
11711be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
11721be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
11731be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
11741be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1175fef5208cSdrh   }
11765fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
117717435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
11788c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
11799de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
11801be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
11811be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
11821be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
118323b2db23Sdrh   }
11841be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
118543303de9Sdrh     Expr *p;
11861be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
118708de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
118851522cd3Sdrh   }
1189154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1190fef5208cSdrh 
119117a7f8ddSdrh /* CASE expressions */
11921be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
11931be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
11941be266baSdrh   if( A ){
11951be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
11961be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
119753f733c7Sdrh   }else{
1198633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1199c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
120053f733c7Sdrh   }
120117a7f8ddSdrh }
120217a7f8ddSdrh %type case_exprlist {ExprList*}
1203633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12044dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
12051be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
12061be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
120717a7f8ddSdrh }
120817a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
12091be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
12101be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
121117a7f8ddSdrh }
121217a7f8ddSdrh %type case_else {Expr*}
1213633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
12141be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
121517a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
121617a7f8ddSdrh %type case_operand {Expr*}
1217633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
12181be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
121917a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1220348784efSdrh 
1221348784efSdrh %type exprlist {ExprList*}
1222633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12239245c243Sdrh %type nexprlist {ExprList*}
1224633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1225348784efSdrh 
12264dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
12279245c243Sdrh exprlist(A) ::= .                            {A = 0;}
12284dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
12291be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
123017435752Sdrh nexprlist(A) ::= expr(Y).
12311be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
12329245c243Sdrh 
1233a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
12345fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
12355fbab882Sdrh ** of parenthesis */
12365fbab882Sdrh %type paren_exprlist {ExprList*}
12375fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12385fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
12395fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1240a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
12415fbab882Sdrh 
1242cce7d176Sdrh 
1243382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1244382c0247Sdrh //
1245d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1246108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
124717435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
124817435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
124962340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
12509cfcf5d4Sdrh }
1251717e6402Sdrh 
1252717e6402Sdrh %type uniqueflag {int}
12539cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
12549cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1255348784efSdrh 
1256348784efSdrh 
1257108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1258108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1259108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1260108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1261108aa00aSdrh //
1262108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1263108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1264108aa00aSdrh //
1265108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1266108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1267108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1268108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1269108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1270108aa00aSdrh // historical schemas.
1271108aa00aSdrh //
1272108aa00aSdrh %type eidlist {ExprList*}
1273108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1274108aa00aSdrh %type eidlist_opt {ExprList*}
1275108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1276108aa00aSdrh 
1277108aa00aSdrh %include {
1278108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1279108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1280108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1281108aa00aSdrh   ** error while parsing a legacy schema.
1282108aa00aSdrh   */
1283108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1284108aa00aSdrh     Parse *pParse,
1285108aa00aSdrh     ExprList *pPrior,
1286108aa00aSdrh     Token *pIdToken,
1287108aa00aSdrh     int hasCollate,
1288108aa00aSdrh     int sortOrder
1289108aa00aSdrh   ){
1290108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1291108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1292108aa00aSdrh         && pParse->db->init.busy==0
1293108aa00aSdrh     ){
1294108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1295108aa00aSdrh                          pIdToken->n, pIdToken->z);
12960202b29eSdanielk1977     }
1297108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1298108aa00aSdrh     return p;
1299108aa00aSdrh   }
1300108aa00aSdrh } // end %include
1301108aa00aSdrh 
1302108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1303108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
13044dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
13054dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1306108aa00aSdrh }
1307108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1308cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
13090202b29eSdanielk1977 }
13100202b29eSdanielk1977 
1311108aa00aSdrh %type collate {int}
1312108aa00aSdrh collate(C) ::= .              {C = 0;}
1313108aa00aSdrh collate(C) ::= COLLATE ids.   {C = 1;}
1314a34001c9Sdrh 
1315348784efSdrh 
13168aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1317382c0247Sdrh //
13184d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1319982cef7eSdrh 
1320382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1321382c0247Sdrh //
1322154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1323fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
13249ef5e770Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
13259ef5e770Sdrh cmd ::= VACUUM nm(X).          {sqlite3Vacuum(pParse,&X);}
1326fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1327154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1328f57b14a6Sdrh 
1329382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1330382c0247Sdrh //
133113d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
133291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1333ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1334ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1335ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1336ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1337ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1338ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1339ada2ee0dSdrh 
1340cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1341cf82f0d3Sdrh nmnum(A) ::= nm(A).
1342cf82f0d3Sdrh nmnum(A) ::= ON(A).
1343cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1344cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1345154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1346f59b12fbSdrh %token_class number INTEGER|FLOAT.
13478395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1348cf82f0d3Sdrh plus_num(A) ::= number(A).
1349f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1350c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1351f0f258b1Sdrh 
1352b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1353b7f9164eSdrh 
1354d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
13554b59ab5eSdrh   Token all;
13564b59ab5eSdrh   all.z = A.z;
1357b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
13584adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1359f0f258b1Sdrh }
1360f0f258b1Sdrh 
1361fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1362fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
136360218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
136460218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1365cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1366c3f9bad2Sdanielk1977 }
1367c3f9bad2Sdanielk1977 
1368c3f9bad2Sdanielk1977 %type trigger_time {int}
13696559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1370c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1371c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1372c3f9bad2Sdanielk1977 
1373ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1374633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1375cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1376cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
137781eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1378c3f9bad2Sdanielk1977 
137960218d2aSdrh foreach_clause ::= .
138060218d2aSdrh foreach_clause ::= FOR EACH ROW.
1381c3f9bad2Sdanielk1977 
1382c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1383633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1384c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
13851be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1386c3f9bad2Sdanielk1977 
1387c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1388633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
13894dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
13904dd0d3f8Sdrh   assert( A!=0 );
13914dd0d3f8Sdrh   A->pLast->pNext = X;
13924dd0d3f8Sdrh   A->pLast = X;
1393a69d9168Sdrh }
13944dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
13954dd0d3f8Sdrh   assert( A!=0 );
13964dd0d3f8Sdrh   A->pLast = A;
139781238966Sdrh }
1398c3f9bad2Sdanielk1977 
1399b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1400b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1401b1819a0bSdrh // the same database as the table that the trigger fires on.
1402b1819a0bSdrh //
1403b1819a0bSdrh %type trnm {Token}
14044dd0d3f8Sdrh trnm(A) ::= nm(A).
1405b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1406b1819a0bSdrh   A = X;
1407b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1408b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1409b1819a0bSdrh         "statements within triggers");
1410b1819a0bSdrh }
1411b1819a0bSdrh 
1412b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1413b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1414b1819a0bSdrh // since it is an exception to the default grammar rules.
1415b1819a0bSdrh //
1416b1819a0bSdrh tridxby ::= .
1417b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1418b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1419b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1420b1819a0bSdrh         "within triggers");
1421b1819a0bSdrh }
1422b1819a0bSdrh tridxby ::= NOT INDEXED. {
1423b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1424b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1425b1819a0bSdrh         "within triggers");
1426b1819a0bSdrh }
1427b1819a0bSdrh 
1428b1819a0bSdrh 
1429b1819a0bSdrh 
1430c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1431633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1432c3f9bad2Sdanielk1977 // UPDATE
1433b1819a0bSdrh trigger_cmd(A) ::=
1434f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
1435f259df5fSdrh    {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R, B.z, E);}
1436c3f9bad2Sdanielk1977 
1437c3f9bad2Sdanielk1977 // INSERT
1438f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
14392c2e844aSdrh                       trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). {
144046d2e5c3Sdrh    A = sqlite3TriggerInsertStep(pParse->db,&X,F,S,R,U,B,Z);/*A-overwrites-R*/
14412c2e844aSdrh }
1442c3f9bad2Sdanielk1977 // DELETE
1443f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
1444f259df5fSdrh    {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y, B.z, E);}
1445c3f9bad2Sdanielk1977 
1446c3f9bad2Sdanielk1977 // SELECT
1447f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1448f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1449c3f9bad2Sdanielk1977 
14506f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
14511be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
14521be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
14531be266baSdrh   if( A ){
14541be266baSdrh     A->affinity = OE_Ignore;
14554b59ab5eSdrh   }
14568aa34ae0Sdrh }
14571be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
14581be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
14591be266baSdrh   if( A ) {
14601be266baSdrh     A->affinity = (char)T;
14614b59ab5eSdrh   }
14628aa34ae0Sdrh }
1463154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1464b7f9164eSdrh 
146574ad7fe9Sdrh %type raisetype {int}
146674ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
146774ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
146874ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
146974ad7fe9Sdrh 
14706f34903eSdanielk1977 
1471c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1472b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1473fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1474fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1475c3f9bad2Sdanielk1977 }
1476154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1477113088ecSdrh 
1478113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1479fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1480f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
14811be266baSdrh   sqlite3Attach(pParse, F, D, K);
14821c2d8414Sdrh }
1483fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
14841be266baSdrh   sqlite3Detach(pParse, D);
1485fdbcdee5Sdrh }
1486fdbcdee5Sdrh 
1487f744bb56Sdanielk1977 %type key_opt {Expr*}
1488633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1489f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
14901be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1491113088ecSdrh 
1492113088ecSdrh database_kw_opt ::= DATABASE.
1493113088ecSdrh database_kw_opt ::= .
1494fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
14954343fea2Sdrh 
14964343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
14974343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
14984343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
14994343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1500154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
15019fd2a9a0Sdanielk1977 
15029f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
15039f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
15049f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
15059f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
15069f18e8a0Sdrh %endif
15079f18e8a0Sdrh 
15089fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
15099fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
15109fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
15119fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
15129fd2a9a0Sdanielk1977 }
1513986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1514986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1515986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
151619a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
151719a8e7e8Sdanielk1977 }
151819a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
15194a642b60Sdrh   disableLookaside(pParse);
152019a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
152119a8e7e8Sdanielk1977 }
152219a8e7e8Sdanielk1977 kwcolumn_opt ::= .
152319a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1524154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1525e09daa90Sdrh 
1526e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1527e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1528b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1529b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1530b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1531b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1532b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1533b9bb7c18Sdrh }
1534e09daa90Sdrh vtabarglist ::= vtabarg.
1535e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1536b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1537b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1538b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1539b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1540b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1541b9bb7c18Sdrh anylist ::= .
1542aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1543aaac8b4eSdrh anylist ::= anylist ANY.
1544154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
15458b471863Sdrh 
15468b471863Sdrh 
15478b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
15487d562dbeSdan %type wqlist {With*}
15494e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
15507d562dbeSdan 
1551a5746e03Sdrh with ::= .
15528b471863Sdrh %ifndef SQLITE_OMIT_CTE
1553a5746e03Sdrh with ::= WITH wqlist(W).              { sqlite3WithPush(pParse, W, 1); }
1554a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W).    { sqlite3WithPush(pParse, W, 1); }
15557d562dbeSdan 
1556108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1557cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
15587d562dbeSdan }
15594dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
15604dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
15618b471863Sdrh }
15628b471863Sdrh %endif  SQLITE_OMIT_CTE
1563