xref: /sqlite-3.40.0/src/parse.y (revision 35e86bf1)
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 /*
1022c2e844aSdrh ** An instance of this object holds the argument of the ON CONFLICT
1032c2e844aSdrh ** clause of an UPSERT.
1042c2e844aSdrh **
1052c2e844aSdrh ** The ON CONFLICT clause takes three forms, identified by the Upsert.e
1062c2e844aSdrh ** field:
1072c2e844aSdrh **
1082c2e844aSdrh **   OE_None:      No ON CONFLICT clause
1092c2e844aSdrh **   OE_Ignore:    ON CONFLICT DO NOTHING
1102c2e844aSdrh **   OE_Update:    ON CONFLICT DO UPDATE ...
1112c2e844aSdrh */
1122c2e844aSdrh struct Upsert {
1132c2e844aSdrh   ExprList *p;    /* column=expr entries for the UPDATE.  Or NULL */
1142c2e844aSdrh   int e;          /* OE_None, OE_Replace, or OE_Ignore */
1152c2e844aSdrh };
1162c2e844aSdrh 
1172c2e844aSdrh /*
1184a642b60Sdrh ** Disable lookaside memory allocation for objects that might be
1194a642b60Sdrh ** shared across database connections.
1204a642b60Sdrh */
1214a642b60Sdrh static void disableLookaside(Parse *pParse){
1224a642b60Sdrh   pParse->disableLookaside++;
1234a642b60Sdrh   pParse->db->lookaside.bDisable++;
1244a642b60Sdrh }
1254a642b60Sdrh 
126caec2f12Sdrh } // end %include
127348784efSdrh 
128826fb5a3Sdrh // Input is a single SQL command
129c4a3c779Sdrh input ::= cmdlist.
130094b2bbfSdrh cmdlist ::= cmdlist ecmd.
131826fb5a3Sdrh cmdlist ::= ecmd.
132b7f9164eSdrh ecmd ::= SEMI.
133*2424aa72Sdrh ecmd ::= cmdx SEMI.
134b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
135*2424aa72Sdrh ecmd ::= explain cmdx.
1368549d55eSdrh explain ::= EXPLAIN.              { pParse->explain = 1; }
1378549d55eSdrh explain ::= EXPLAIN QUERY PLAN.   { pParse->explain = 2; }
138154d4b24Sdrh %endif  SQLITE_OMIT_EXPLAIN
139200a81dcSdrh cmdx ::= cmd.           { sqlite3FinishCoding(pParse); }
140348784efSdrh 
141382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
142c4a3c779Sdrh //
143fa86c412Sdrh 
144684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt.  {sqlite3BeginTransaction(pParse, Y);}
145c4a3c779Sdrh trans_opt ::= .
146c4a3c779Sdrh trans_opt ::= TRANSACTION.
1475ad1a6c8Sdrh trans_opt ::= TRANSACTION nm.
148684917c2Sdrh %type transtype {int}
149684917c2Sdrh transtype(A) ::= .             {A = TK_DEFERRED;}
150cf82f0d3Sdrh transtype(A) ::= DEFERRED(X).  {A = @X; /*A-overwrites-X*/}
151cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/}
152cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/}
15307a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt.   {sqlite3EndTransaction(pParse,@X);}
15407a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt.     {sqlite3EndTransaction(pParse,@X);}
155c4a3c779Sdrh 
156fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT.
157fd7f0452Sdanielk1977 savepoint_opt ::= .
158fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). {
159fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
160fd7f0452Sdanielk1977 }
161fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). {
162fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
163fd7f0452Sdanielk1977 }
164fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
165fd7f0452Sdanielk1977   sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
166fd7f0452Sdanielk1977 }
167fd7f0452Sdanielk1977 
168382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
169348784efSdrh //
170348784efSdrh cmd ::= create_table create_table_args.
171d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
172f1a381e7Sdanielk1977    sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
173969fa7c1Sdrh }
174dabd04c6Sdrh createkw(A) ::= CREATE(A).  {disableLookaside(pParse);}
175dabd04c6Sdrh 
176faa59554Sdrh %type ifnotexists {int}
177faa59554Sdrh ifnotexists(A) ::= .              {A = 0;}
178faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
179f57b3399Sdrh %type temp {int}
18053c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB
181d24cc427Sdrh temp(A) ::= TEMP.  {A = 1;}
182154d4b24Sdrh %endif  SQLITE_OMIT_TEMPDB
183d24cc427Sdrh temp(A) ::= .      {A = 0;}
1845969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). {
1855969da4aSdrh   sqlite3EndTable(pParse,&X,&E,F,0);
186969fa7c1Sdrh }
187969fa7c1Sdrh create_table_args ::= AS select(S). {
1885969da4aSdrh   sqlite3EndTable(pParse,0,0,0,S);
189633e6d57Sdrh   sqlite3SelectDelete(pParse->db, S);
190969fa7c1Sdrh }
1913334d089Sdrh %type table_options {int}
1925969da4aSdrh table_options(A) ::= .    {A = 0;}
1935969da4aSdrh table_options(A) ::= WITHOUT nm(X). {
1945969da4aSdrh   if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){
195fccda8a1Sdrh     A = TF_WithoutRowid | TF_NoVisibleRowid;
1965969da4aSdrh   }else{
1975969da4aSdrh     A = 0;
1985969da4aSdrh     sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z);
1995969da4aSdrh   }
2005969da4aSdrh }
201986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist.
202986dde70Sdrh columnlist ::= columnname carglist.
2032881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);}
204c4a3c779Sdrh 
2056a8700b9Sdrh // Declare some tokens early in order to influence their values, to
2066a8700b9Sdrh // improve performance and reduce the executable size.  The goal here is
2076a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric
2086a8700b9Sdrh // values that are early enough so that all jump operations are clustered
2096a8700b9Sdrh // at the beginning, but also so that the comparison tokens NE through GE
2106a8700b9Sdrh // are as large as possible so that they are near to FUNCTION, which is a
2116a8700b9Sdrh // token synthesized by addopcodes.tcl.
2126a8700b9Sdrh //
2136a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST.
2146a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL.
2156a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2166a8700b9Sdrh %token GT LE LT GE ESCAPE.
2176a8700b9Sdrh 
21831d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to
21931d6fd55Sdrh // fallback to ID if they will not parse as their original value.
22031d6fd55Sdrh // This obviates the need for the "id" nonterminal.
22131d6fd55Sdrh //
22231d6fd55Sdrh %fallback ID
22331d6fd55Sdrh   ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
2242c2e844aSdrh   CONFLICT DATABASE DEFERRED DESC DETACH DO EACH END EXCLUSIVE EXPLAIN FAIL FOR
22531d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
22631d6fd55Sdrh   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW
22731d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
22831d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
22931d6fd55Sdrh   EXCEPT INTERSECT UNION
23031d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
23131d6fd55Sdrh   REINDEX RENAME CTIME_KW IF
23231d6fd55Sdrh   .
23331d6fd55Sdrh %wildcard ANY.
23431d6fd55Sdrh 
235f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
2362d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2372d3917daSdrh // causes them to be assigned integer values that are close together,
2382d3917daSdrh // which keeps parser tables smaller.
2392d3917daSdrh //
240f2bc013cSdrh // The token values assigned to these symbols is determined by the order
241f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
242f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
243f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
244f2bc013cSdrh // constraint.
245f2bc013cSdrh //
2462d3917daSdrh %left OR.
2472d3917daSdrh %left AND.
2482d3917daSdrh %right NOT.
24903bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2509a43267bSdrh %left GT LE LT GE.
2517c6303c0Sdanielk1977 %right ESCAPE.
2522d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2532d3917daSdrh %left PLUS MINUS.
2542d3917daSdrh %left STAR SLASH REM.
255a34001c9Sdrh %left CONCAT.
256a34001c9Sdrh %left COLLATE.
2577ba5bc5bSdrh %right BITNOT.
25826cf56f8Sdrh %nonassoc ON.
2592d3917daSdrh 
2607cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2617cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2627cc84c2cSdrh //
2637cc84c2cSdrh %token_class id  ID|INDEXED.
2647cc84c2cSdrh 
2657cc84c2cSdrh 
266c4a3c779Sdrh // And "ids" is an identifer-or-string.
267c4a3c779Sdrh //
268f59b12fbSdrh %token_class ids  ID|STRING.
269c4a3c779Sdrh 
2705ad1a6c8Sdrh // The name of a column or table can be any of the following:
2715ad1a6c8Sdrh //
2725ad1a6c8Sdrh %type nm {Token}
2734dd0d3f8Sdrh nm(A) ::= id(A).
2744dd0d3f8Sdrh nm(A) ::= STRING(A).
2754dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
2765ad1a6c8Sdrh 
277986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
278487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
279487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
280487e262fSdrh //
281487e262fSdrh %type typetoken {Token}
282986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
2834dd0d3f8Sdrh typetoken(A) ::= typename(A).
2844dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
2854dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
286487e262fSdrh }
2874dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
2884dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
289487e262fSdrh }
290382c0247Sdrh %type typename {Token}
2914dd0d3f8Sdrh typename(A) ::= ids(A).
2924dd0d3f8Sdrh typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
29360218d2aSdrh signed ::= plus_num.
29460218d2aSdrh signed ::= minus_num.
295487e262fSdrh 
2961be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the
2971be266baSdrh // input text just past the last token that has been shifted into
2981be266baSdrh // the parser.  By surrounding some phrase in the grammar with two
2991be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase.
3001be266baSdrh // For example:
3011be266baSdrh //
3021be266baSdrh //      something ::= .... scanpt(A) phrase scanpt(Z).
3031be266baSdrh //
3041be266baSdrh // The text that is parsed as "phrase" is a string starting at A
3051be266baSdrh // and containing (int)(Z-A) characters.  There might be some extra
3061be266baSdrh // whitespace on either end of the text, but that can be removed in
3071be266baSdrh // post-processing, if needed.
3081be266baSdrh //
3091be266baSdrh %type scanpt {const char*}
3101be266baSdrh scanpt(A) ::= . {
311f259df5fSdrh   assert( yyLookahead!=YYNOCODE );
3121be266baSdrh   A = yyLookaheadToken.z;
3131be266baSdrh }
3141be266baSdrh 
315487e262fSdrh // "carglist" is a list of additional constraints that come after the
316487e262fSdrh // column name and column type in a CREATE TABLE statement.
317487e262fSdrh //
3184dc330ddSdrh carglist ::= carglist ccons.
319348784efSdrh carglist ::= .
3204dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
3211be266baSdrh ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z).
3221be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A,Z);}
3231be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3241be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
3251be266baSdrh ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z).
3261be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z,Z);}
3271be266baSdrh ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z).      {
3281be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3291be266baSdrh   sqlite3AddDefaultValue(pParse,p,A.z,Z);
3307977a17fSdanielk1977 }
3311be266baSdrh ccons ::= DEFAULT scanpt id(X).       {
3321be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
333d7fd899eSdrh   if( p ){
334171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
33596acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
336d7fd899eSdrh   }
3371be266baSdrh   sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3387977a17fSdanielk1977 }
339348784efSdrh 
340382c0247Sdrh // In addition to the type name, we also care about the primary key and
341382c0247Sdrh // UNIQUE constraints.
342348784efSdrh //
3430d316a40Sdrh ccons ::= NULL onconf.
3444adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
345fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
346fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
34762340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
34862340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3491be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
350108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3514adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3524adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
35339002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
35404738cb9Sdrh 
355205f48e6Sdrh // The optional AUTOINCREMENT keyword
356205f48e6Sdrh %type autoinc {int}
357205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3582958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
359205f48e6Sdrh 
360c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
361c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
362c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
363c2eef3b3Sdrh // check fails.
36404738cb9Sdrh //
365c2eef3b3Sdrh %type refargs {int}
366fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3674dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
368c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
369c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
370c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
371c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
372c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
373c2eef3b3Sdrh %type refact {int}
374fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
375fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
376fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
377fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
378fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
379c2eef3b3Sdrh %type defer_subclause {int}
3801da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
381c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
382c2eef3b3Sdrh %type init_deferred_pred_opt {int}
383c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
384c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
385c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
386348784efSdrh 
38719a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3884dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
389ab35eaedSdrh conslist ::= conslist tconscomma tcons.
390ab35eaedSdrh conslist ::= tcons.
391ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
392ab35eaedSdrh tconscomma ::= .
393ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
394108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
395fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
396108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
39762340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
39862340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
399b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
4001be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
401108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
402108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
4034adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
4044adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
405c2eef3b3Sdrh }
406c2eef3b3Sdrh %type defer_subclause_opt {int}
407c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
4084dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
4099cfcf5d4Sdrh 
4109cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
4119cfcf5d4Sdrh // default behavior when there is a constraint conflict.
4129cfcf5d4Sdrh //
4139cfcf5d4Sdrh %type onconf {int}
4143334d089Sdrh %type orconf {int}
4151c92853dSdrh %type resolvetype {int}
4161c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4171c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4181c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4193334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4204dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4211c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4221c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
423348784efSdrh 
424382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
425348784efSdrh //
426a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
427a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
428a8858103Sdanielk1977 }
429a073384fSdrh %type ifexists {int}
430a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
431a073384fSdrh ifexists(A) ::= .            {A = 0;}
432348784efSdrh 
433a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
434a76b5dfcSdrh //
435b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
436108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4378981b904Sdrh           AS select(S). {
4388981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
439a76b5dfcSdrh }
440a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
441a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
442a76b5dfcSdrh }
443154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
444a76b5dfcSdrh 
445382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
446348784efSdrh //
4477d562dbeSdan cmd ::= select(X).  {
448edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4497d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
450633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4519bb61fe7Sdrh }
452efb7251dSdrh 
4539bb61fe7Sdrh %type select {Select*}
454633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4557d562dbeSdan %type selectnowith {Select*}
4567d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
45782c3d636Sdrh %type oneselect {Select*}
458633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4599bb61fe7Sdrh 
460772460fdSdrh %include {
461772460fdSdrh   /*
462772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
463772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
464772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
465772460fdSdrh   */
466e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
467d227a291Sdrh     if( p->pPrior ){
468772460fdSdrh       Select *pNext = 0, *pLoop;
469772460fdSdrh       int mxSelect, cnt = 0;
470d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
471d227a291Sdrh         pLoop->pNext = pNext;
472d227a291Sdrh         pLoop->selFlags |= SF_Compound;
473d227a291Sdrh       }
474772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
475772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
476772460fdSdrh         cnt>mxSelect
477a0c01768Sdrh       ){
478d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
479d227a291Sdrh       }
480d227a291Sdrh     }
481772460fdSdrh   }
482772460fdSdrh }
483772460fdSdrh 
484a5746e03Sdrh select(A) ::= WITH wqlist(W) selectnowith(X). {
485772460fdSdrh   Select *p = X;
486772460fdSdrh   if( p ){
487772460fdSdrh     p->pWith = W;
488772460fdSdrh     parserDoubleLinkSelect(pParse, p);
489a9f5c13dSdan   }else{
490a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
491a9f5c13dSdan   }
492a5746e03Sdrh   A = p;
493a5746e03Sdrh }
494a5746e03Sdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X). {
495a5746e03Sdrh   Select *p = X;
496a5746e03Sdrh   if( p ){
497a5746e03Sdrh     p->pWith = W;
498a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
499a5746e03Sdrh   }else{
500a5746e03Sdrh     sqlite3WithDelete(pParse->db, W);
501a5746e03Sdrh   }
502a5746e03Sdrh   A = p;
503a5746e03Sdrh }
504a5746e03Sdrh select(A) ::= selectnowith(X). {
505a5746e03Sdrh   Select *p = X;
506a5746e03Sdrh   if( p ){
507a5746e03Sdrh     parserDoubleLinkSelect(pParse, p);
508a5746e03Sdrh   }
509a5746e03Sdrh   A = p; /*A-overwrites-X*/
510a9f5c13dSdan }
5117d562dbeSdan 
5124dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
513b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
5144dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
515c0bf493eSdrh   Select *pRhs = Z;
5164dd0d3f8Sdrh   Select *pLhs = A;
517c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
518c0bf493eSdrh     SrcList *pFrom;
519c0bf493eSdrh     Token x;
520c0bf493eSdrh     x.n = 0;
521772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
522c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
5238c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
524c0bf493eSdrh   }
525c0bf493eSdrh   if( pRhs ){
526c0bf493eSdrh     pRhs->op = (u8)Y;
52700d5ab74Sdrh     pRhs->pPrior = pLhs;
52800d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
529772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
530d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
53143b78826Sdrh   }else{
53200d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
533daffd0e5Sdrh   }
534c0bf493eSdrh   A = pRhs;
53582c3d636Sdrh }
5360a36c57eSdrh %type multiselect_op {int}
537cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5380a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
539cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
540154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
541abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
5429bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
54343303de9Sdrh #if SELECTTRACE_ENABLED
54443303de9Sdrh   Token s = S; /*A-overwrites-S*/
54543303de9Sdrh #endif
5468c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
547abd4c723Sdrh #if SELECTTRACE_ENABLED
548eb9b884cSdrh   /* Populate the Select.zSelName[] string that is used to help with
549abd4c723Sdrh   ** query planner debugging, to differentiate between multiple Select
550abd4c723Sdrh   ** objects in a complex query.
551abd4c723Sdrh   **
552abd4c723Sdrh   ** If the SELECT keyword is immediately followed by a C-style comment
553abd4c723Sdrh   ** then extract the first few alphanumeric characters from within that
554eb9b884cSdrh   ** comment to be the zSelName value.  Otherwise, the label is #N where
555abd4c723Sdrh   ** is an integer that is incremented with each SELECT statement seen.
556abd4c723Sdrh   */
557abd4c723Sdrh   if( A!=0 ){
55843303de9Sdrh     const char *z = s.z+6;
559abd4c723Sdrh     int i;
560cfd74700Sdrh     sqlite3_snprintf(sizeof(A->zSelName), A->zSelName,"#%d",++pParse->nSelect);
561abd4c723Sdrh     while( z[0]==' ' ) z++;
562abd4c723Sdrh     if( z[0]=='/' && z[1]=='*' ){
563abd4c723Sdrh       z += 2;
564abd4c723Sdrh       while( z[0]==' ' ) z++;
565abd4c723Sdrh       for(i=0; sqlite3Isalnum(z[i]); i++){}
566eb9b884cSdrh       sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
567abd4c723Sdrh     }
568abd4c723Sdrh   }
569abd4c723Sdrh #endif /* SELECTRACE_ENABLED */
5709bb61fe7Sdrh }
5714dd0d3f8Sdrh oneselect(A) ::= values(A).
57275593d96Sdrh 
57375593d96Sdrh %type values {Select*}
57475593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
57575593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5768c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
57775593d96Sdrh }
5784dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. {
5794dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5808c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
581f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
58275593d96Sdrh   if( pRight ){
58375593d96Sdrh     pRight->op = TK_ALL;
584772460fdSdrh     pRight->pPrior = pLeft;
58575593d96Sdrh     A = pRight;
58675593d96Sdrh   }else{
587772460fdSdrh     A = pLeft;
58875593d96Sdrh   }
58975593d96Sdrh }
5909bb61fe7Sdrh 
5919bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5929bb61fe7Sdrh // present and false (0) if it is not.
5939bb61fe7Sdrh //
5943334d089Sdrh %type distinct {int}
595832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5967cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
597efb7251dSdrh distinct(A) ::= .           {A = 0;}
598348784efSdrh 
5999bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
6007c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
6017c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
6021a1d3cd2Sdrh // opcode of TK_ASTERISK.
6039bb61fe7Sdrh //
604348784efSdrh %type selcollist {ExprList*}
605633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
606348784efSdrh %type sclp {ExprList*}
607633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
6084dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
609348784efSdrh sclp(A) ::= .                                {A = 0;}
6101be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
6111be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
612b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
6131be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
61401f3f253Sdrh }
615d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
6161a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
6174dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
6187c917d19Sdrh }
6191be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
620abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
621abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
622abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
6234dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
62454473229Sdrh }
62501f3f253Sdrh 
62601f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
62701f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
62801f3f253Sdrh //
62901f3f253Sdrh %type as {Token}
6305ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
6314dd0d3f8Sdrh as(X) ::= ids(X).
632986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6339bb61fe7Sdrh 
634348784efSdrh 
635ad3cab52Sdrh %type seltablist {SrcList*}
636633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
637ad3cab52Sdrh %type stl_prefix {SrcList*}
638633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
639ad3cab52Sdrh %type from {SrcList*}
640633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
641348784efSdrh 
64201f3f253Sdrh // A complete FROM clause.
64301f3f253Sdrh //
64417435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
64561dfc31dSdrh from(A) ::= FROM seltablist(X). {
64661dfc31dSdrh   A = X;
64761dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
64861dfc31dSdrh }
64901f3f253Sdrh 
65001f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
65101f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
65201f3f253Sdrh //
6534dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6548a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
65501f3f253Sdrh }
656348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6574dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
658e9240418Sdrh                   on_opt(N) using_opt(U). {
6594dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
660b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
66101f3f253Sdrh }
6624dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
66301d230ceSdrh                   on_opt(N) using_opt(U). {
6644dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
66501d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
66601d230ceSdrh }
66751522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6684dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
669b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6704dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
67122f70c32Sdrh   }
6724dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
673fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6744dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
675fbdc7f69Sdrh       A = F;
676832ee3d4Sdrh     }else if( F->nSrc==1 ){
6774dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
678832ee3d4Sdrh       if( A ){
679832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
680832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
681832ee3d4Sdrh         pNew->zName = pOld->zName;
682832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6833c449c6bSdrh         pNew->pSelect = pOld->pSelect;
684832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6853c449c6bSdrh         pOld->pSelect = 0;
686832ee3d4Sdrh       }
687832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
688fbdc7f69Sdrh     }else{
689fbdc7f69Sdrh       Select *pSubquery;
690fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6918c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6924dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
693fbdc7f69Sdrh     }
694fbdc7f69Sdrh   }
695154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
696b733d037Sdrh 
697113088ecSdrh %type dbnm {Token}
698113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
699113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
700113088ecSdrh 
70174ad7fe9Sdrh %type fullname {SrcList*}
702633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
703a5746e03Sdrh fullname(A) ::= nm(X).
704a5746e03Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/}
705a5746e03Sdrh fullname(A) ::= nm(X) DOT nm(Y).
706cf82f0d3Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
70774ad7fe9Sdrh 
70801f3f253Sdrh %type joinop {int}
709fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
710cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
711cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
712cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
713cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
7145ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
715cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
71601f3f253Sdrh 
71726cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a
71826cf56f8Sdrh // SELECT on the RHS of a the INSERT:
71926cf56f8Sdrh //
72026cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ...
72126cf56f8Sdrh //                                        here ----^^
72226cf56f8Sdrh //
72326cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is
72426cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON
72526cf56f8Sdrh // clause associated with the JOIN.  The conflict is resolved in favor
72626cf56f8Sdrh // of the JOIN.  If an ON CONFLICT clause is intended, insert a dummy
72726cf56f8Sdrh // WHERE clause in between, like this:
72826cf56f8Sdrh //
72926cf56f8Sdrh //      INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ...
73026cf56f8Sdrh //
73126cf56f8Sdrh // The [AND] and [OR] precedence marks in the rules for on_opt cause the
73226cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN.
73326cf56f8Sdrh //
73401f3f253Sdrh %type on_opt {Expr*}
735633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
7361be266baSdrh on_opt(N) ::= ON expr(E).  {N = E;}
73726cf56f8Sdrh on_opt(N) ::= .     [OR]   {N = 0;}
73801f3f253Sdrh 
73985574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
74085574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
74185574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
74285574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
74385574e31Sdanielk1977 // in the token.
74485574e31Sdanielk1977 //
74585574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
746b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
74785574e31Sdanielk1977 // recognizes and interprets this as a special case.
74885574e31Sdanielk1977 //
74985574e31Sdanielk1977 %type indexed_opt {Token}
75085574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
75185574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
75285574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
75385574e31Sdanielk1977 
75401f3f253Sdrh %type using_opt {IdList*}
755633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
75681eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
75701f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
75801f3f253Sdrh 
75901f3f253Sdrh 
760348784efSdrh %type orderby_opt {ExprList*}
761633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
762108aa00aSdrh 
763108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
764108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
765108aa00aSdrh // sort order.
766108aa00aSdrh //
767348784efSdrh %type sortlist {ExprList*}
768633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
769348784efSdrh 
770348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
771348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7724dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). {
7731be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
774bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
775348784efSdrh }
7768395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
7771be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
778bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
779348784efSdrh }
780348784efSdrh 
781348784efSdrh %type sortorder {int}
782348784efSdrh 
7838e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
7848e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
785bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
786348784efSdrh 
7872282792aSdrh %type groupby_opt {ExprList*}
788633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
7892282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
7909245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
7912282792aSdrh 
7922282792aSdrh %type having_opt {Expr*}
793633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
7942282792aSdrh having_opt(A) ::= .                {A = 0;}
7951be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
7962282792aSdrh 
7978c0833fbSdrh %type limit_opt {Expr*}
79815926590Sdrh 
79915926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
80015926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
80115926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
80215926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
80315926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
80415926590Sdrh // except as a transient.  So there is never anything to destroy.
80515926590Sdrh //
8068c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
8078c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
8088c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
8091be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
810a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
8111be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
812a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
8131be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
8149bbca4c1Sdrh 
815382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
816382c0247Sdrh //
817273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
818a5746e03Sdrh cmd ::= with DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
819931577f1Sdrh         orderby_opt(O) limit_opt(L). {
820b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
8218c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
8224281bd42Sshane }
8234281bd42Sshane %endif
824273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
825a5746e03Sdrh cmd ::= with DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
8264281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8278c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
8284281bd42Sshane }
8294281bd42Sshane %endif
830348784efSdrh 
831348784efSdrh %type where_opt {Expr*}
832633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
833348784efSdrh 
834348784efSdrh where_opt(A) ::= .                    {A = 0;}
8351be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
836348784efSdrh 
837382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
838382c0247Sdrh //
839273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
840a5746e03Sdrh cmd ::= with UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
8418b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
842b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
843b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
8448c0833fbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L);
8454281bd42Sshane }
8464281bd42Sshane %endif
847273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
848a5746e03Sdrh cmd ::= with UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
849e9240418Sdrh         where_opt(W).  {
8504281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8514281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
8528c0833fbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0);
8534281bd42Sshane }
8544281bd42Sshane %endif
855348784efSdrh 
856f8db1bc0Sdrh %type setlist {ExprList*}
857633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
858f8db1bc0Sdrh 
8594dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8601be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
861b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
862b7916a78Sdrh }
863a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8641be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
865a1251bc4Sdrh }
866b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8671be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
868b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
869b7916a78Sdrh }
870a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
8711be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
872a1251bc4Sdrh }
873348784efSdrh 
874382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
875382c0247Sdrh //
87635e86bf1Sdrh cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S)
8772c2e844aSdrh         upsert(U). {
8782c2e844aSdrh   sqlite3Insert(pParse, X, S, F, upsertType(pParse, R, U.e), U.p);
8794e9119d9Sdan }
880a5746e03Sdrh cmd ::= with insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
8814e9119d9Sdan {
8822c2e844aSdrh   sqlite3Insert(pParse, X, 0, F, R, 0);
8834e9119d9Sdan }
884348784efSdrh 
8852c2e844aSdrh %type upsert {struct Upsert}
8862c2e844aSdrh %destructor upsert {sqlite3ExprListDelete(pParse->db,$$.p);}
8872c2e844aSdrh upsert(A) ::= . {
8882c2e844aSdrh   A.p = 0;
8892c2e844aSdrh   A.e = OE_None;
8902c2e844aSdrh }
8912c2e844aSdrh upsert(A) ::= ON CONFLICT DO UPDATE SET setlist(X). {
8922c2e844aSdrh   A.p = X;  /*A-overwrites-X*/
8932c2e844aSdrh   A.e = OE_Update;
8942c2e844aSdrh }
8952c2e844aSdrh upsert(A) ::= ON CONFLICT DO NOTHING. {
8962c2e844aSdrh   A.p = 0;
8972c2e844aSdrh   A.e = OE_Ignore;
8982c2e844aSdrh }
8992c2e844aSdrh 
9002c2e844aSdrh %include {
9012c2e844aSdrh   /* Compute and return the correct conflict resolution strategy for an
9022c2e844aSdrh   ** INSERT statement.  If the statement begins with REPLACE or with
9032c2e844aSdrh   ** INSERT OR, and it contains an ON CONFLICT clause, throw an error.
9042c2e844aSdrh   */
9052c2e844aSdrh   static int upsertType(Parse *pParse, int orconf, int upsertType){
9062c2e844aSdrh     if( upsertType!=OE_None ){
9072c2e844aSdrh       if( orconf!=OE_Default ){
9082c2e844aSdrh         sqlite3ErrorMsg(pParse, "ON CONFLICT clause not allowed");
9092c2e844aSdrh       }
9102c2e844aSdrh       return upsertType;
9112c2e844aSdrh     }else{
9122c2e844aSdrh       return orconf;
9132c2e844aSdrh     }
9142c2e844aSdrh   }
9152c2e844aSdrh }
91626cf56f8Sdrh 
9173334d089Sdrh %type insert_cmd {int}
918fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
919fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
920fa86c412Sdrh 
9218981b904Sdrh %type idlist_opt {IdList*}
9228981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
92381eba73eSdrh %type idlist {IdList*}
92481eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
925348784efSdrh 
9268981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
9278981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
9284dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
9294dd0d3f8Sdrh     {A = sqlite3IdListAppend(pParse->db,A,&Y);}
93081eba73eSdrh idlist(A) ::= nm(Y).
931cf82f0d3Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/}
932348784efSdrh 
933382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
934382c0247Sdrh //
935348784efSdrh 
9361be266baSdrh %type expr {Expr*}
9371be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
9381be266baSdrh %type term {Expr*}
9391be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
940b7916a78Sdrh 
941b7916a78Sdrh %include {
942b7916a78Sdrh 
943b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
944b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
945b7916a78Sdrh   ** that created the expression.
946b7916a78Sdrh   */
9471be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
9480cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
9490cd874bdSdrh     if( p ){
9500cd874bdSdrh       memset(p, 0, sizeof(Expr));
9510cd874bdSdrh       p->op = (u8)op;
9520cd874bdSdrh       p->flags = EP_Leaf;
9530cd874bdSdrh       p->iAgg = -1;
9540cd874bdSdrh       p->u.zToken = (char*)&p[1];
9550cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
9560cd874bdSdrh       p->u.zToken[t.n] = 0;
9570cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
9580cd874bdSdrh         if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted;
9590cd874bdSdrh         sqlite3Dequote(p->u.zToken);
9600cd874bdSdrh       }
9610cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
9620cd874bdSdrh       p->nHeight = 1;
9630cd874bdSdrh #endif
9640cd874bdSdrh     }
9651be266baSdrh     return p;
966b7916a78Sdrh   }
967b7916a78Sdrh }
968348784efSdrh 
9694dd0d3f8Sdrh expr(A) ::= term(A).
9701be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
9711be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9721be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
9735ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
974410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
975410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
9761be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
977e1b6a5b8Sdrh }
978d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
979410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
980410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
981410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
982abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
9831be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
984d24cc427Sdrh }
9851be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9861be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9870cd874bdSdrh term(A) ::= INTEGER(X). {
9881be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
9890cd874bdSdrh }
990f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
9918679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
992de25a88cSdrh     u32 n = X.n;
9931be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
9941be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
9958f3b137fSdrh   }else{
996b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
997b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
998b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
9998f3b137fSdrh     Token t = X; /*A-overwrites-X*/
10008f3b137fSdrh     assert( t.n>=2 );
1001b7916a78Sdrh     if( pParse->nested==0 ){
100243303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
10031be266baSdrh       A = 0;
1004b7916a78Sdrh     }else{
10051be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
10061be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
1007b7916a78Sdrh     }
1008f59b12fbSdrh   }
1009895d7472Sdrh }
10104dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). {
10111be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
10128b4c40d8Sdrh }
1013487e262fSdrh %ifndef SQLITE_OMIT_CAST
10141be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
10151be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
10161be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
1017487e262fSdrh }
1018154d4b24Sdrh %endif  SQLITE_OMIT_CAST
10191be266baSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
1020994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
1021e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
10224e05c83bSdrh   }
10231be266baSdrh   A = sqlite3ExprFunction(pParse, Y, &X);
10241be266baSdrh   if( D==SF_Distinct && A ){
10251be266baSdrh     A->flags |= EP_Distinct;
1026fd357974Sdrh   }
1027e1b6a5b8Sdrh }
10281be266baSdrh expr(A) ::= id(X) LP STAR RP. {
10291be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &X);
1030e1b6a5b8Sdrh }
1031b71090fdSdrh term(A) ::= CTIME_KW(OP). {
10321be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &OP);
1033b7916a78Sdrh }
1034b7916a78Sdrh 
10351be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
10361be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
10371be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
10381be266baSdrh   if( A ){
10391be266baSdrh     A->x.pList = pList;
10408bd0d58eSdrh   }else{
10418bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
104271c57db0Sdan   }
104371c57db0Sdan }
104471c57db0Sdan 
10451be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y).    {A=sqlite3PExpr(pParse,@OP,A,Y);}
10461be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
10474dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
10481be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10491be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
10504dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
10511be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10524dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
10531be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10544dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
10551be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
10561be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
1057410c301fSdrh %type likeop {Token}
10587e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
1059410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
10604dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
10618aa34ae0Sdrh   ExprList *pList;
1062410c301fSdrh   int bNot = OP.n & 0x80000000;
1063410c301fSdrh   OP.n &= 0x7fffffff;
10641be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
10651be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
10661be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
10671be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
10681be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
10690ac65892Sdrh }
10704dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
10711dca1458Sdrh   ExprList *pList;
1072410c301fSdrh   int bNot = OP.n & 0x80000000;
1073410c301fSdrh   OP.n &= 0x7fffffff;
10741be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
10751be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
10761be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
10771be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
10781be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
10791be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
10801dca1458Sdrh }
10817c6303c0Sdanielk1977 
10821be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
10831be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
10846a2fe093Sdrh 
10856a51741dSdrh %include {
10866a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
10876a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
10886a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
10896a51741dSdrh     sqlite3 *db = pParse->db;
1090895c00e1Sdan     if( pA && pY && pY->op==TK_NULL ){
10915e17e8b7Sshaneh       pA->op = (u8)op;
10926a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
10936a51741dSdrh       pA->pRight = 0;
10946a51741dSdrh     }
10956a51741dSdrh   }
10966a51741dSdrh }
10976a51741dSdrh 
10986a2fe093Sdrh //    expr1 IS expr2
10996a2fe093Sdrh //    expr1 IS NOT expr2
11006a2fe093Sdrh //
11016a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
11026a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
11036a2fe093Sdrh //
11044dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
11051be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
11061be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
11076a2fe093Sdrh }
11084dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
11091be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
11101be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
11116a2fe093Sdrh }
1112b7916a78Sdrh 
111343303de9Sdrh expr(A) ::= NOT(B) expr(X).
11141be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
111543303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
11161be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
11171be266baSdrh expr(A) ::= MINUS expr(X). [BITNOT]
11181be266baSdrh               {A = sqlite3PExpr(pParse, TK_UMINUS, X, 0);}
11191be266baSdrh expr(A) ::= PLUS expr(X). [BITNOT]
11201be266baSdrh               {A = sqlite3PExpr(pParse, TK_UPLUS, X, 0);}
1121b7916a78Sdrh 
11222e3a1f16Sdrh %type between_op {int}
11232e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
11242e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
11254dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
11261be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
11271be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
11281be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
11291be266baSdrh   if( A ){
11301be266baSdrh     A->x.pList = pList;
113153f733c7Sdrh   }else{
1132633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
113353f733c7Sdrh   }
11341be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1135fef5208cSdrh }
11363e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
11372e3a1f16Sdrh   %type in_op {int}
11382e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
11392e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
11401be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1141094430ebSdrh     if( Y==0 ){
1142473c1bf2Sdan       /* Expressions of the form
1143473c1bf2Sdan       **
1144473c1bf2Sdan       **      expr1 IN ()
1145473c1bf2Sdan       **      expr1 NOT IN ()
1146473c1bf2Sdan       **
1147473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1148473c1bf2Sdan       ** regardless of the value of expr1.
1149473c1bf2Sdan       */
11501be266baSdrh       sqlite3ExprDelete(pParse->db, A);
11511be266baSdrh       A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1);
11522b59b3a4Sdrh     }else if( Y->nExpr==1 ){
11532b59b3a4Sdrh       /* Expressions of the form:
11542b59b3a4Sdrh       **
11552b59b3a4Sdrh       **      expr1 IN (?1)
11562b59b3a4Sdrh       **      expr1 NOT IN (?2)
11572b59b3a4Sdrh       **
1158fbb24d10Sdrh       ** with exactly one value on the RHS can be simplified to something
1159fbb24d10Sdrh       ** like this:
11602b59b3a4Sdrh       **
1161fbb24d10Sdrh       **      expr1 == ?1
1162fbb24d10Sdrh       **      expr1 <> ?2
1163fbb24d10Sdrh       **
1164fbb24d10Sdrh       ** But, the RHS of the == or <> is marked with the EP_Generic flag
1165fbb24d10Sdrh       ** so that it may not contribute to the computation of comparison
1166fbb24d10Sdrh       ** affinity or the collating sequence to use for comparison.  Otherwise,
1167fbb24d10Sdrh       ** the semantics would be subtly different from IN or NOT IN.
11682b59b3a4Sdrh       */
1169fbb24d10Sdrh       Expr *pRHS = Y->a[0].pExpr;
11702b59b3a4Sdrh       Y->a[0].pExpr = 0;
11712b59b3a4Sdrh       sqlite3ExprListDelete(pParse->db, Y);
11725b1420e0Sdrh       /* pRHS cannot be NULL because a malloc error would have been detected
11735b1420e0Sdrh       ** before now and control would have never reached this point */
11745b1420e0Sdrh       if( ALWAYS(pRHS) ){
1175fbb24d10Sdrh         pRHS->flags &= ~EP_Collate;
1176fbb24d10Sdrh         pRHS->flags |= EP_Generic;
1177fbb24d10Sdrh       }
11781be266baSdrh       A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS);
1179094430ebSdrh     }else{
11801be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
11811be266baSdrh       if( A ){
11821be266baSdrh         A->x.pList = Y;
11831be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1184d5d56523Sdanielk1977       }else{
1185633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1186d5d56523Sdanielk1977       }
11871be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1188094430ebSdrh     }
1189fef5208cSdrh   }
11901be266baSdrh   expr(A) ::= LP select(X) RP. {
11911be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
11921be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
119351522cd3Sdrh   }
11941be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
11951be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
11961be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
11971be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1198fef5208cSdrh   }
11995fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
120017435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
12018c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
12029de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
12031be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
12041be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
12051be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
120623b2db23Sdrh   }
12071be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
120843303de9Sdrh     Expr *p;
12091be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
121008de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
121151522cd3Sdrh   }
1212154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1213fef5208cSdrh 
121417a7f8ddSdrh /* CASE expressions */
12151be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
12161be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
12171be266baSdrh   if( A ){
12181be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
12191be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
122053f733c7Sdrh   }else{
1221633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1222c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
122353f733c7Sdrh   }
122417a7f8ddSdrh }
122517a7f8ddSdrh %type case_exprlist {ExprList*}
1226633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12274dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
12281be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
12291be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
123017a7f8ddSdrh }
123117a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
12321be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
12331be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
123417a7f8ddSdrh }
123517a7f8ddSdrh %type case_else {Expr*}
1236633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
12371be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
123817a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
123917a7f8ddSdrh %type case_operand {Expr*}
1240633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
12411be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
124217a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1243348784efSdrh 
1244348784efSdrh %type exprlist {ExprList*}
1245633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12469245c243Sdrh %type nexprlist {ExprList*}
1247633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1248348784efSdrh 
12494dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
12509245c243Sdrh exprlist(A) ::= .                            {A = 0;}
12514dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
12521be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
125317435752Sdrh nexprlist(A) ::= expr(Y).
12541be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
12559245c243Sdrh 
1256a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
12575fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
12585fbab882Sdrh ** of parenthesis */
12595fbab882Sdrh %type paren_exprlist {ExprList*}
12605fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
12615fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
12625fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1263a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
12645fbab882Sdrh 
1265cce7d176Sdrh 
1266382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1267382c0247Sdrh //
1268d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1269108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
127017435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
127117435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
127262340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
12739cfcf5d4Sdrh }
1274717e6402Sdrh 
1275717e6402Sdrh %type uniqueflag {int}
12769cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
12779cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1278348784efSdrh 
1279348784efSdrh 
1280108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1281108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1282108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1283108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1284108aa00aSdrh //
1285108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1286108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1287108aa00aSdrh //
1288108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1289108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1290108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1291108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1292108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1293108aa00aSdrh // historical schemas.
1294108aa00aSdrh //
1295108aa00aSdrh %type eidlist {ExprList*}
1296108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1297108aa00aSdrh %type eidlist_opt {ExprList*}
1298108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1299108aa00aSdrh 
1300108aa00aSdrh %include {
1301108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1302108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1303108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1304108aa00aSdrh   ** error while parsing a legacy schema.
1305108aa00aSdrh   */
1306108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1307108aa00aSdrh     Parse *pParse,
1308108aa00aSdrh     ExprList *pPrior,
1309108aa00aSdrh     Token *pIdToken,
1310108aa00aSdrh     int hasCollate,
1311108aa00aSdrh     int sortOrder
1312108aa00aSdrh   ){
1313108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1314108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1315108aa00aSdrh         && pParse->db->init.busy==0
1316108aa00aSdrh     ){
1317108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1318108aa00aSdrh                          pIdToken->n, pIdToken->z);
13190202b29eSdanielk1977     }
1320108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1321108aa00aSdrh     return p;
1322108aa00aSdrh   }
1323108aa00aSdrh } // end %include
1324108aa00aSdrh 
1325108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1326108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
13274dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
13284dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1329108aa00aSdrh }
1330108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1331cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
13320202b29eSdanielk1977 }
13330202b29eSdanielk1977 
1334108aa00aSdrh %type collate {int}
1335108aa00aSdrh collate(C) ::= .              {C = 0;}
1336108aa00aSdrh collate(C) ::= COLLATE ids.   {C = 1;}
1337a34001c9Sdrh 
1338348784efSdrh 
13398aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1340382c0247Sdrh //
13414d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1342982cef7eSdrh 
1343382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1344382c0247Sdrh //
1345154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1346fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
13479ef5e770Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
13489ef5e770Sdrh cmd ::= VACUUM nm(X).          {sqlite3Vacuum(pParse,&X);}
1349fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1350154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1351f57b14a6Sdrh 
1352382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1353382c0247Sdrh //
135413d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
135591cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1356ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1357ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1358ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1359ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1360ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1361ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1362ada2ee0dSdrh 
1363cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1364cf82f0d3Sdrh nmnum(A) ::= nm(A).
1365cf82f0d3Sdrh nmnum(A) ::= ON(A).
1366cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1367cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1368154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1369f59b12fbSdrh %token_class number INTEGER|FLOAT.
13708395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1371cf82f0d3Sdrh plus_num(A) ::= number(A).
1372f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1373c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1374f0f258b1Sdrh 
1375b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1376b7f9164eSdrh 
1377d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
13784b59ab5eSdrh   Token all;
13794b59ab5eSdrh   all.z = A.z;
1380b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
13814adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1382f0f258b1Sdrh }
1383f0f258b1Sdrh 
1384fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1385fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
138660218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
138760218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1388cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1389c3f9bad2Sdanielk1977 }
1390c3f9bad2Sdanielk1977 
1391c3f9bad2Sdanielk1977 %type trigger_time {int}
13926559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1393c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1394c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1395c3f9bad2Sdanielk1977 
1396ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1397633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1398cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1399cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
140081eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1401c3f9bad2Sdanielk1977 
140260218d2aSdrh foreach_clause ::= .
140360218d2aSdrh foreach_clause ::= FOR EACH ROW.
1404c3f9bad2Sdanielk1977 
1405c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1406633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1407c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
14081be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1409c3f9bad2Sdanielk1977 
1410c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1411633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
14124dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
14134dd0d3f8Sdrh   assert( A!=0 );
14144dd0d3f8Sdrh   A->pLast->pNext = X;
14154dd0d3f8Sdrh   A->pLast = X;
1416a69d9168Sdrh }
14174dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
14184dd0d3f8Sdrh   assert( A!=0 );
14194dd0d3f8Sdrh   A->pLast = A;
142081238966Sdrh }
1421c3f9bad2Sdanielk1977 
1422b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1423b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1424b1819a0bSdrh // the same database as the table that the trigger fires on.
1425b1819a0bSdrh //
1426b1819a0bSdrh %type trnm {Token}
14274dd0d3f8Sdrh trnm(A) ::= nm(A).
1428b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1429b1819a0bSdrh   A = X;
1430b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1431b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1432b1819a0bSdrh         "statements within triggers");
1433b1819a0bSdrh }
1434b1819a0bSdrh 
1435b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1436b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1437b1819a0bSdrh // since it is an exception to the default grammar rules.
1438b1819a0bSdrh //
1439b1819a0bSdrh tridxby ::= .
1440b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1441b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1442b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1443b1819a0bSdrh         "within triggers");
1444b1819a0bSdrh }
1445b1819a0bSdrh tridxby ::= NOT INDEXED. {
1446b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1447b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1448b1819a0bSdrh         "within triggers");
1449b1819a0bSdrh }
1450b1819a0bSdrh 
1451b1819a0bSdrh 
1452b1819a0bSdrh 
1453c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1454633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1455c3f9bad2Sdanielk1977 // UPDATE
1456b1819a0bSdrh trigger_cmd(A) ::=
1457f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
1458f259df5fSdrh    {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R, B.z, E);}
1459c3f9bad2Sdanielk1977 
1460c3f9bad2Sdanielk1977 // INSERT
1461f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
14622c2e844aSdrh                       trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). {
14632c2e844aSdrh    A = sqlite3TriggerInsertStep(pParse->db,&X,F,S,upsertType(pParse,R,U.e),
14642c2e844aSdrh                                 U.p,B,Z);/*A-overwrites-R*/
14652c2e844aSdrh }
1466c3f9bad2Sdanielk1977 // DELETE
1467f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
1468f259df5fSdrh    {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y, B.z, E);}
1469c3f9bad2Sdanielk1977 
1470c3f9bad2Sdanielk1977 // SELECT
1471f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1472f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1473c3f9bad2Sdanielk1977 
14746f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
14751be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
14761be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
14771be266baSdrh   if( A ){
14781be266baSdrh     A->affinity = OE_Ignore;
14794b59ab5eSdrh   }
14808aa34ae0Sdrh }
14811be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
14821be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
14831be266baSdrh   if( A ) {
14841be266baSdrh     A->affinity = (char)T;
14854b59ab5eSdrh   }
14868aa34ae0Sdrh }
1487154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1488b7f9164eSdrh 
148974ad7fe9Sdrh %type raisetype {int}
149074ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
149174ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
149274ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
149374ad7fe9Sdrh 
14946f34903eSdanielk1977 
1495c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1496b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1497fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1498fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1499c3f9bad2Sdanielk1977 }
1500154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1501113088ecSdrh 
1502113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1503fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1504f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
15051be266baSdrh   sqlite3Attach(pParse, F, D, K);
15061c2d8414Sdrh }
1507fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
15081be266baSdrh   sqlite3Detach(pParse, D);
1509fdbcdee5Sdrh }
1510fdbcdee5Sdrh 
1511f744bb56Sdanielk1977 %type key_opt {Expr*}
1512633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1513f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
15141be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1515113088ecSdrh 
1516113088ecSdrh database_kw_opt ::= DATABASE.
1517113088ecSdrh database_kw_opt ::= .
1518fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
15194343fea2Sdrh 
15204343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
15214343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
15224343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
15234343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1524154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
15259fd2a9a0Sdanielk1977 
15269f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
15279f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
15289f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
15299f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
15309f18e8a0Sdrh %endif
15319f18e8a0Sdrh 
15329fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
15339fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
15349fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
15359fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
15369fd2a9a0Sdanielk1977 }
1537986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1538986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1539986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
154019a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
154119a8e7e8Sdanielk1977 }
154219a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
15434a642b60Sdrh   disableLookaside(pParse);
154419a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
154519a8e7e8Sdanielk1977 }
154619a8e7e8Sdanielk1977 kwcolumn_opt ::= .
154719a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1548154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1549e09daa90Sdrh 
1550e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1551e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1552b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1553b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1554b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1555b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1556b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1557b9bb7c18Sdrh }
1558e09daa90Sdrh vtabarglist ::= vtabarg.
1559e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1560b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1561b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1562b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1563b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1564b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1565b9bb7c18Sdrh anylist ::= .
1566aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1567aaac8b4eSdrh anylist ::= anylist ANY.
1568154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
15698b471863Sdrh 
15708b471863Sdrh 
15718b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
15727d562dbeSdan %type wqlist {With*}
15734e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
15747d562dbeSdan 
1575a5746e03Sdrh with ::= .
15768b471863Sdrh %ifndef SQLITE_OMIT_CTE
1577a5746e03Sdrh with ::= WITH wqlist(W).              { sqlite3WithPush(pParse, W, 1); }
1578a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W).    { sqlite3WithPush(pParse, W, 1); }
15797d562dbeSdan 
1580108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1581cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
15827d562dbeSdan }
15834dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
15844dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
15858b471863Sdrh }
15868b471863Sdrh %endif  SQLITE_OMIT_CTE
1587