xref: /sqlite-3.40.0/src/parse.y (revision d7fd899e)
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.
117b7f9164eSdrh ecmd ::= explain cmdx SEMI.
1188549d55eSdrh explain ::= .
119b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN
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
20831d6fd55Sdrh   CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
20931d6fd55Sdrh   IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
21031d6fd55Sdrh   QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW
21131d6fd55Sdrh   ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT
21231d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT
21331d6fd55Sdrh   EXCEPT INTERSECT UNION
21431d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
21531d6fd55Sdrh   REINDEX RENAME CTIME_KW IF
21631d6fd55Sdrh   .
21731d6fd55Sdrh %wildcard ANY.
21831d6fd55Sdrh 
219f7b5496eSdrh // Define operator precedence early so that this is the first occurrence
2202d3917daSdrh // of the operator tokens in the grammer.  Keeping the operators together
2212d3917daSdrh // causes them to be assigned integer values that are close together,
2222d3917daSdrh // which keeps parser tables smaller.
2232d3917daSdrh //
224f2bc013cSdrh // The token values assigned to these symbols is determined by the order
225f2bc013cSdrh // in which lemon first sees them.  It must be the case that ISNULL/NOTNULL,
226f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value.  See
227f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this
228f2bc013cSdrh // constraint.
229f2bc013cSdrh //
2302d3917daSdrh %left OR.
2312d3917daSdrh %left AND.
2322d3917daSdrh %right NOT.
23303bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
2349a43267bSdrh %left GT LE LT GE.
2357c6303c0Sdanielk1977 %right ESCAPE.
2362d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT.
2372d3917daSdrh %left PLUS MINUS.
2382d3917daSdrh %left STAR SLASH REM.
239a34001c9Sdrh %left CONCAT.
240a34001c9Sdrh %left COLLATE.
2417ba5bc5bSdrh %right BITNOT.
2422d3917daSdrh 
2437cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several
2447cc84c2cSdrh // keywords.  Any non-standard keyword can also be an identifier.
2457cc84c2cSdrh //
2467cc84c2cSdrh %token_class id  ID|INDEXED.
2477cc84c2cSdrh 
2487cc84c2cSdrh 
249c4a3c779Sdrh // And "ids" is an identifer-or-string.
250c4a3c779Sdrh //
251f59b12fbSdrh %token_class ids  ID|STRING.
252c4a3c779Sdrh 
2535ad1a6c8Sdrh // The name of a column or table can be any of the following:
2545ad1a6c8Sdrh //
2555ad1a6c8Sdrh %type nm {Token}
2564dd0d3f8Sdrh nm(A) ::= id(A).
2574dd0d3f8Sdrh nm(A) ::= STRING(A).
2584dd0d3f8Sdrh nm(A) ::= JOIN_KW(A).
2595ad1a6c8Sdrh 
260986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such
261487e262fSdrh // as can be found after the column name in a CREATE TABLE statement.
262487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken.
263487e262fSdrh //
264487e262fSdrh %type typetoken {Token}
265986dde70Sdrh typetoken(A) ::= .   {A.n = 0; A.z = 0;}
2664dd0d3f8Sdrh typetoken(A) ::= typename(A).
2674dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). {
2684dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
269487e262fSdrh }
2704dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). {
2714dd0d3f8Sdrh   A.n = (int)(&Y.z[Y.n] - A.z);
272487e262fSdrh }
273382c0247Sdrh %type typename {Token}
2744dd0d3f8Sdrh typename(A) ::= ids(A).
2754dd0d3f8Sdrh typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);}
27660218d2aSdrh signed ::= plus_num.
27760218d2aSdrh signed ::= minus_num.
278487e262fSdrh 
2791be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the
2801be266baSdrh // input text just past the last token that has been shifted into
2811be266baSdrh // the parser.  By surrounding some phrase in the grammar with two
2821be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase.
2831be266baSdrh // For example:
2841be266baSdrh //
2851be266baSdrh //      something ::= .... scanpt(A) phrase scanpt(Z).
2861be266baSdrh //
2871be266baSdrh // The text that is parsed as "phrase" is a string starting at A
2881be266baSdrh // and containing (int)(Z-A) characters.  There might be some extra
2891be266baSdrh // whitespace on either end of the text, but that can be removed in
2901be266baSdrh // post-processing, if needed.
2911be266baSdrh //
2921be266baSdrh %type scanpt {const char*}
2931be266baSdrh scanpt(A) ::= . {
294f259df5fSdrh   assert( yyLookahead!=YYNOCODE );
2951be266baSdrh   A = yyLookaheadToken.z;
2961be266baSdrh }
2971be266baSdrh 
298487e262fSdrh // "carglist" is a list of additional constraints that come after the
299487e262fSdrh // column name and column type in a CREATE TABLE statement.
300487e262fSdrh //
3014dc330ddSdrh carglist ::= carglist ccons.
302348784efSdrh carglist ::= .
3034dc330ddSdrh ccons ::= CONSTRAINT nm(X).           {pParse->constraintName = X;}
3041be266baSdrh ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z).
3051be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A,Z);}
3061be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z).
3071be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);}
3081be266baSdrh ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z).
3091be266baSdrh                             {sqlite3AddDefaultValue(pParse,X,A.z,Z);}
3101be266baSdrh ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z).      {
3111be266baSdrh   Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0);
3121be266baSdrh   sqlite3AddDefaultValue(pParse,p,A.z,Z);
3137977a17fSdanielk1977 }
3141be266baSdrh ccons ::= DEFAULT scanpt id(X).       {
3151be266baSdrh   Expr *p = tokenExpr(pParse, TK_STRING, X);
316*d7fd899eSdrh   if( p ){
317171d16bbSdrh     sqlite3ExprIdToTrueFalse(p);
31896acafbeSdrh     testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) );
319*d7fd899eSdrh   }
3201be266baSdrh   sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3217977a17fSdanielk1977 }
322348784efSdrh 
323382c0247Sdrh // In addition to the type name, we also care about the primary key and
324382c0247Sdrh // UNIQUE constraints.
325348784efSdrh //
3260d316a40Sdrh ccons ::= NULL onconf.
3274adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
328fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
329fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
33062340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
33162340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3321be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
333108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3344adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3354adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
33639002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
33704738cb9Sdrh 
338205f48e6Sdrh // The optional AUTOINCREMENT keyword
339205f48e6Sdrh %type autoinc {int}
340205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3412958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
342205f48e6Sdrh 
343c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
344c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
345c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
346c2eef3b3Sdrh // check fails.
34704738cb9Sdrh //
348c2eef3b3Sdrh %type refargs {int}
349fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3504dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
351c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
352c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
353c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
354c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
355c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
356c2eef3b3Sdrh %type refact {int}
357fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
358fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
359fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
360fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
361fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
362c2eef3b3Sdrh %type defer_subclause {int}
3631da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
364c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
365c2eef3b3Sdrh %type init_deferred_pred_opt {int}
366c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
367c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
368c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
369348784efSdrh 
37019a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3714dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
372ab35eaedSdrh conslist ::= conslist tconscomma tcons.
373ab35eaedSdrh conslist ::= tcons.
374ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
375ab35eaedSdrh tconscomma ::= .
376ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
377108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
378fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
379108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
38062340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
38162340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
382b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
3831be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
384108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
385108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3864adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3874adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
388c2eef3b3Sdrh }
389c2eef3b3Sdrh %type defer_subclause_opt {int}
390c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
3914dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
3929cfcf5d4Sdrh 
3939cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3949cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3959cfcf5d4Sdrh //
3969cfcf5d4Sdrh %type onconf {int}
3973334d089Sdrh %type orconf {int}
3981c92853dSdrh %type resolvetype {int}
3991c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
4001c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
4011c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
4023334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
4034dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4041c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4051c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
406348784efSdrh 
407382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
408348784efSdrh //
409a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
410a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
411a8858103Sdanielk1977 }
412a073384fSdrh %type ifexists {int}
413a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
414a073384fSdrh ifexists(A) ::= .            {A = 0;}
415348784efSdrh 
416a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
417a76b5dfcSdrh //
418b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
419108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4208981b904Sdrh           AS select(S). {
4218981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
422a76b5dfcSdrh }
423a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
424a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
425a76b5dfcSdrh }
426154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
427a76b5dfcSdrh 
428382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
429348784efSdrh //
4307d562dbeSdan cmd ::= select(X).  {
431edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4327d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
433633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4349bb61fe7Sdrh }
435efb7251dSdrh 
4369bb61fe7Sdrh %type select {Select*}
437633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4387d562dbeSdan %type selectnowith {Select*}
4397d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
44082c3d636Sdrh %type oneselect {Select*}
441633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4429bb61fe7Sdrh 
443772460fdSdrh %include {
444772460fdSdrh   /*
445772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
446772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
447772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
448772460fdSdrh   */
449e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
450d227a291Sdrh     if( p->pPrior ){
451772460fdSdrh       Select *pNext = 0, *pLoop;
452772460fdSdrh       int mxSelect, cnt = 0;
453d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
454d227a291Sdrh         pLoop->pNext = pNext;
455d227a291Sdrh         pLoop->selFlags |= SF_Compound;
456d227a291Sdrh       }
457772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
458772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
459772460fdSdrh         cnt>mxSelect
460a0c01768Sdrh       ){
461d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
462d227a291Sdrh       }
463d227a291Sdrh     }
464772460fdSdrh   }
465772460fdSdrh }
466772460fdSdrh 
467772460fdSdrh select(A) ::= with(W) selectnowith(X). {
468772460fdSdrh   Select *p = X;
469772460fdSdrh   if( p ){
470772460fdSdrh     p->pWith = W;
471772460fdSdrh     parserDoubleLinkSelect(pParse, p);
472a9f5c13dSdan   }else{
473a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
474a9f5c13dSdan   }
475cf82f0d3Sdrh   A = p; /*A-overwrites-W*/
476a9f5c13dSdan }
4777d562dbeSdan 
4784dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
479b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
4804dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
481c0bf493eSdrh   Select *pRhs = Z;
4824dd0d3f8Sdrh   Select *pLhs = A;
483c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
484c0bf493eSdrh     SrcList *pFrom;
485c0bf493eSdrh     Token x;
486c0bf493eSdrh     x.n = 0;
487772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
488c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
4898c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
490c0bf493eSdrh   }
491c0bf493eSdrh   if( pRhs ){
492c0bf493eSdrh     pRhs->op = (u8)Y;
49300d5ab74Sdrh     pRhs->pPrior = pLhs;
49400d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
495772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
496d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
49743b78826Sdrh   }else{
49800d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
499daffd0e5Sdrh   }
500c0bf493eSdrh   A = pRhs;
50182c3d636Sdrh }
5020a36c57eSdrh %type multiselect_op {int}
503cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5040a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
505cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
506154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
507abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
5089bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
50943303de9Sdrh #if SELECTTRACE_ENABLED
51043303de9Sdrh   Token s = S; /*A-overwrites-S*/
51143303de9Sdrh #endif
5128c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
513abd4c723Sdrh #if SELECTTRACE_ENABLED
514eb9b884cSdrh   /* Populate the Select.zSelName[] string that is used to help with
515abd4c723Sdrh   ** query planner debugging, to differentiate between multiple Select
516abd4c723Sdrh   ** objects in a complex query.
517abd4c723Sdrh   **
518abd4c723Sdrh   ** If the SELECT keyword is immediately followed by a C-style comment
519abd4c723Sdrh   ** then extract the first few alphanumeric characters from within that
520eb9b884cSdrh   ** comment to be the zSelName value.  Otherwise, the label is #N where
521abd4c723Sdrh   ** is an integer that is incremented with each SELECT statement seen.
522abd4c723Sdrh   */
523abd4c723Sdrh   if( A!=0 ){
52443303de9Sdrh     const char *z = s.z+6;
525abd4c723Sdrh     int i;
526eb9b884cSdrh     sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d",
527abd4c723Sdrh                      ++pParse->nSelect);
528abd4c723Sdrh     while( z[0]==' ' ) z++;
529abd4c723Sdrh     if( z[0]=='/' && z[1]=='*' ){
530abd4c723Sdrh       z += 2;
531abd4c723Sdrh       while( z[0]==' ' ) z++;
532abd4c723Sdrh       for(i=0; sqlite3Isalnum(z[i]); i++){}
533eb9b884cSdrh       sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
534abd4c723Sdrh     }
535abd4c723Sdrh   }
536abd4c723Sdrh #endif /* SELECTRACE_ENABLED */
5379bb61fe7Sdrh }
5384dd0d3f8Sdrh oneselect(A) ::= values(A).
53975593d96Sdrh 
54075593d96Sdrh %type values {Select*}
54175593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
54275593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5438c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
54475593d96Sdrh }
5454dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. {
5464dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5478c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
548f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
54975593d96Sdrh   if( pRight ){
55075593d96Sdrh     pRight->op = TK_ALL;
551772460fdSdrh     pRight->pPrior = pLeft;
55275593d96Sdrh     A = pRight;
55375593d96Sdrh   }else{
554772460fdSdrh     A = pLeft;
55575593d96Sdrh   }
55675593d96Sdrh }
5579bb61fe7Sdrh 
5589bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5599bb61fe7Sdrh // present and false (0) if it is not.
5609bb61fe7Sdrh //
5613334d089Sdrh %type distinct {int}
562832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5637cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
564efb7251dSdrh distinct(A) ::= .           {A = 0;}
565348784efSdrh 
5669bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5677c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5687c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5691a1d3cd2Sdrh // opcode of TK_ASTERISK.
5709bb61fe7Sdrh //
571348784efSdrh %type selcollist {ExprList*}
572633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
573348784efSdrh %type sclp {ExprList*}
574633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
5754dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
576348784efSdrh sclp(A) ::= .                                {A = 0;}
5771be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
5781be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
579b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
5801be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
58101f3f253Sdrh }
582d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
5831a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
5844dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
5857c917d19Sdrh }
5861be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
587abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
588abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
589abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
5904dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
59154473229Sdrh }
59201f3f253Sdrh 
59301f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
59401f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
59501f3f253Sdrh //
59601f3f253Sdrh %type as {Token}
5975ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
5984dd0d3f8Sdrh as(X) ::= ids(X).
599986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
6009bb61fe7Sdrh 
601348784efSdrh 
602ad3cab52Sdrh %type seltablist {SrcList*}
603633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
604ad3cab52Sdrh %type stl_prefix {SrcList*}
605633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
606ad3cab52Sdrh %type from {SrcList*}
607633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
608348784efSdrh 
60901f3f253Sdrh // A complete FROM clause.
61001f3f253Sdrh //
61117435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
61261dfc31dSdrh from(A) ::= FROM seltablist(X). {
61361dfc31dSdrh   A = X;
61461dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
61561dfc31dSdrh }
61601f3f253Sdrh 
61701f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
61801f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
61901f3f253Sdrh //
6204dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6218a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
62201f3f253Sdrh }
623348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6244dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
625e9240418Sdrh                   on_opt(N) using_opt(U). {
6264dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
627b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
62801f3f253Sdrh }
6294dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
63001d230ceSdrh                   on_opt(N) using_opt(U). {
6314dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
63201d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
63301d230ceSdrh }
63451522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6354dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
636b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6374dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
63822f70c32Sdrh   }
6394dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
640fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6414dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
642fbdc7f69Sdrh       A = F;
643832ee3d4Sdrh     }else if( F->nSrc==1 ){
6444dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
645832ee3d4Sdrh       if( A ){
646832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
647832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
648832ee3d4Sdrh         pNew->zName = pOld->zName;
649832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6503c449c6bSdrh         pNew->pSelect = pOld->pSelect;
651832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6523c449c6bSdrh         pOld->pSelect = 0;
653832ee3d4Sdrh       }
654832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
655fbdc7f69Sdrh     }else{
656fbdc7f69Sdrh       Select *pSubquery;
657fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6588c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6594dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
660fbdc7f69Sdrh     }
661fbdc7f69Sdrh   }
662154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
663b733d037Sdrh 
664113088ecSdrh %type dbnm {Token}
665113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
666113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
667113088ecSdrh 
66874ad7fe9Sdrh %type fullname {SrcList*}
669633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
670cf82f0d3Sdrh fullname(A) ::= nm(X) dbnm(Y).
671cf82f0d3Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
67274ad7fe9Sdrh 
67301f3f253Sdrh %type joinop {int}
674fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
675cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
676cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
677cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
678cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
6795ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
680cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
68101f3f253Sdrh 
68201f3f253Sdrh %type on_opt {Expr*}
683633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
6841be266baSdrh on_opt(N) ::= ON expr(E).   {N = E;}
68501f3f253Sdrh on_opt(N) ::= .             {N = 0;}
68601f3f253Sdrh 
68785574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
68885574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
68985574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
69085574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
69185574e31Sdanielk1977 // in the token.
69285574e31Sdanielk1977 //
69385574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
694b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
69585574e31Sdanielk1977 // recognizes and interprets this as a special case.
69685574e31Sdanielk1977 //
69785574e31Sdanielk1977 %type indexed_opt {Token}
69885574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
69985574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
70085574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
70185574e31Sdanielk1977 
70201f3f253Sdrh %type using_opt {IdList*}
703633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
70481eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
70501f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
70601f3f253Sdrh 
70701f3f253Sdrh 
708348784efSdrh %type orderby_opt {ExprList*}
709633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
710108aa00aSdrh 
711108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
712108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
713108aa00aSdrh // sort order.
714108aa00aSdrh //
715348784efSdrh %type sortlist {ExprList*}
716633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
717348784efSdrh 
718348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
719348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7204dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). {
7211be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
722bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
723348784efSdrh }
7248395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
7251be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
726bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
727348784efSdrh }
728348784efSdrh 
729348784efSdrh %type sortorder {int}
730348784efSdrh 
7318e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
7328e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
733bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
734348784efSdrh 
7352282792aSdrh %type groupby_opt {ExprList*}
736633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
7372282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
7389245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
7392282792aSdrh 
7402282792aSdrh %type having_opt {Expr*}
741633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
7422282792aSdrh having_opt(A) ::= .                {A = 0;}
7431be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
7442282792aSdrh 
7458c0833fbSdrh %type limit_opt {Expr*}
74615926590Sdrh 
74715926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
74815926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
74915926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
75015926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
75115926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
75215926590Sdrh // except as a transient.  So there is never anything to destroy.
75315926590Sdrh //
7548c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
7558c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
7568c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
7571be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
758a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
7591be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
760a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
7611be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
7629bbca4c1Sdrh 
763382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
764382c0247Sdrh //
765273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7664e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
767931577f1Sdrh         orderby_opt(O) limit_opt(L). {
768b290f117Sdan   sqlite3WithPush(pParse, C, 1);
769b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
7708c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
7714281bd42Sshane }
7724281bd42Sshane %endif
773273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7744e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
775b290f117Sdan   sqlite3WithPush(pParse, C, 1);
7764281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
7778c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
7784281bd42Sshane }
7794281bd42Sshane %endif
780348784efSdrh 
781348784efSdrh %type where_opt {Expr*}
782633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
783348784efSdrh 
784348784efSdrh where_opt(A) ::= .                    {A = 0;}
7851be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
786348784efSdrh 
787382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
788382c0247Sdrh //
789273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
790bfe31e7fSdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
7918b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
792b290f117Sdan   sqlite3WithPush(pParse, C, 1);
793b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
794b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
7958c0833fbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L);
7964281bd42Sshane }
7974281bd42Sshane %endif
798273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7994e9119d9Sdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
800e9240418Sdrh         where_opt(W).  {
801b290f117Sdan   sqlite3WithPush(pParse, C, 1);
8024281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
8034281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
8048c0833fbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0);
8054281bd42Sshane }
8064281bd42Sshane %endif
807348784efSdrh 
808f8db1bc0Sdrh %type setlist {ExprList*}
809633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
810f8db1bc0Sdrh 
8114dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8121be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
813b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
814b7916a78Sdrh }
815a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8161be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
817a1251bc4Sdrh }
818b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8191be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
820b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
821b7916a78Sdrh }
822a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
8231be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
824a1251bc4Sdrh }
825348784efSdrh 
826382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
827382c0247Sdrh //
8288981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). {
829b290f117Sdan   sqlite3WithPush(pParse, W, 1);
8304e9119d9Sdan   sqlite3Insert(pParse, X, S, F, R);
8314e9119d9Sdan }
8328981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
8334e9119d9Sdan {
834b290f117Sdan   sqlite3WithPush(pParse, W, 1);
8354e9119d9Sdan   sqlite3Insert(pParse, X, 0, F, R);
8364e9119d9Sdan }
837348784efSdrh 
8383334d089Sdrh %type insert_cmd {int}
839fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
840fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
841fa86c412Sdrh 
8428981b904Sdrh %type idlist_opt {IdList*}
8438981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
84481eba73eSdrh %type idlist {IdList*}
84581eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
846348784efSdrh 
8478981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
8488981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
8494dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
8504dd0d3f8Sdrh     {A = sqlite3IdListAppend(pParse->db,A,&Y);}
85181eba73eSdrh idlist(A) ::= nm(Y).
852cf82f0d3Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/}
853348784efSdrh 
854382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
855382c0247Sdrh //
856348784efSdrh 
8571be266baSdrh %type expr {Expr*}
8581be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
8591be266baSdrh %type term {Expr*}
8601be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
861b7916a78Sdrh 
862b7916a78Sdrh %include {
863b7916a78Sdrh 
864b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
865b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
866b7916a78Sdrh   ** that created the expression.
867b7916a78Sdrh   */
8681be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
8690cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
8700cd874bdSdrh     if( p ){
8710cd874bdSdrh       memset(p, 0, sizeof(Expr));
8720cd874bdSdrh       p->op = (u8)op;
8730cd874bdSdrh       p->flags = EP_Leaf;
8740cd874bdSdrh       p->iAgg = -1;
8750cd874bdSdrh       p->u.zToken = (char*)&p[1];
8760cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
8770cd874bdSdrh       p->u.zToken[t.n] = 0;
8780cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
8790cd874bdSdrh         if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted;
8800cd874bdSdrh         sqlite3Dequote(p->u.zToken);
8810cd874bdSdrh       }
8820cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
8830cd874bdSdrh       p->nHeight = 1;
8840cd874bdSdrh #endif
8850cd874bdSdrh     }
8861be266baSdrh     return p;
887b7916a78Sdrh   }
888b7916a78Sdrh }
889348784efSdrh 
8904dd0d3f8Sdrh expr(A) ::= term(A).
8911be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
8921be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
8931be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
8945ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
895410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
896410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
8971be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
898e1b6a5b8Sdrh }
899d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
900410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
901410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
902410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
903abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
9041be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
905d24cc427Sdrh }
9061be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9071be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9080cd874bdSdrh term(A) ::= INTEGER(X). {
9091be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
9100cd874bdSdrh }
911f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
9128679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
913de25a88cSdrh     u32 n = X.n;
9141be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
9151be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
9168f3b137fSdrh   }else{
917b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
918b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
919b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
9208f3b137fSdrh     Token t = X; /*A-overwrites-X*/
9218f3b137fSdrh     assert( t.n>=2 );
922b7916a78Sdrh     if( pParse->nested==0 ){
92343303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
9241be266baSdrh       A = 0;
925b7916a78Sdrh     }else{
9261be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
9271be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
928b7916a78Sdrh     }
929f59b12fbSdrh   }
930895d7472Sdrh }
9314dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). {
9321be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
9338b4c40d8Sdrh }
934487e262fSdrh %ifndef SQLITE_OMIT_CAST
9351be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
9361be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
9371be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
938487e262fSdrh }
939154d4b24Sdrh %endif  SQLITE_OMIT_CAST
9401be266baSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
941994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
942e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
9434e05c83bSdrh   }
9441be266baSdrh   A = sqlite3ExprFunction(pParse, Y, &X);
9451be266baSdrh   if( D==SF_Distinct && A ){
9461be266baSdrh     A->flags |= EP_Distinct;
947fd357974Sdrh   }
948e1b6a5b8Sdrh }
9491be266baSdrh expr(A) ::= id(X) LP STAR RP. {
9501be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &X);
951e1b6a5b8Sdrh }
952b71090fdSdrh term(A) ::= CTIME_KW(OP). {
9531be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &OP);
954b7916a78Sdrh }
955b7916a78Sdrh 
9561be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
9571be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
9581be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
9591be266baSdrh   if( A ){
9601be266baSdrh     A->x.pList = pList;
9618bd0d58eSdrh   }else{
9628bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
96371c57db0Sdan   }
96471c57db0Sdan }
96571c57db0Sdan 
9661be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y).    {A=sqlite3PExpr(pParse,@OP,A,Y);}
9671be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
9684dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
9691be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9701be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
9714dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
9721be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9734dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
9741be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9754dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
9761be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9771be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
978410c301fSdrh %type likeop {Token}
9797e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
980410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
9814dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
9828aa34ae0Sdrh   ExprList *pList;
983410c301fSdrh   int bNot = OP.n & 0x80000000;
984410c301fSdrh   OP.n &= 0x7fffffff;
9851be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
9861be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
9871be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
9881be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
9891be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
9900ac65892Sdrh }
9914dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
9921dca1458Sdrh   ExprList *pList;
993410c301fSdrh   int bNot = OP.n & 0x80000000;
994410c301fSdrh   OP.n &= 0x7fffffff;
9951be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
9961be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
9971be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
9981be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
9991be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
10001be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
10011dca1458Sdrh }
10027c6303c0Sdanielk1977 
10031be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
10041be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
10056a2fe093Sdrh 
10066a51741dSdrh %include {
10076a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
10086a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
10096a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
10106a51741dSdrh     sqlite3 *db = pParse->db;
1011895c00e1Sdan     if( pA && pY && pY->op==TK_NULL ){
10125e17e8b7Sshaneh       pA->op = (u8)op;
10136a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
10146a51741dSdrh       pA->pRight = 0;
10156a51741dSdrh     }
10166a51741dSdrh   }
10176a51741dSdrh }
10186a51741dSdrh 
10196a2fe093Sdrh //    expr1 IS expr2
10206a2fe093Sdrh //    expr1 IS NOT expr2
10216a2fe093Sdrh //
10226a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
10236a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
10246a2fe093Sdrh //
10254dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
10261be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
10271be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
10286a2fe093Sdrh }
10294dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
10301be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
10311be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
10326a2fe093Sdrh }
1033b7916a78Sdrh 
103443303de9Sdrh expr(A) ::= NOT(B) expr(X).
10351be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
103643303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
10371be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
10381be266baSdrh expr(A) ::= MINUS expr(X). [BITNOT]
10391be266baSdrh               {A = sqlite3PExpr(pParse, TK_UMINUS, X, 0);}
10401be266baSdrh expr(A) ::= PLUS expr(X). [BITNOT]
10411be266baSdrh               {A = sqlite3PExpr(pParse, TK_UPLUS, X, 0);}
1042b7916a78Sdrh 
10432e3a1f16Sdrh %type between_op {int}
10442e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
10452e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
10464dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
10471be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
10481be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
10491be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
10501be266baSdrh   if( A ){
10511be266baSdrh     A->x.pList = pList;
105253f733c7Sdrh   }else{
1053633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
105453f733c7Sdrh   }
10551be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1056fef5208cSdrh }
10573e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
10582e3a1f16Sdrh   %type in_op {int}
10592e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
10602e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
10611be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1062094430ebSdrh     if( Y==0 ){
1063473c1bf2Sdan       /* Expressions of the form
1064473c1bf2Sdan       **
1065473c1bf2Sdan       **      expr1 IN ()
1066473c1bf2Sdan       **      expr1 NOT IN ()
1067473c1bf2Sdan       **
1068473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1069473c1bf2Sdan       ** regardless of the value of expr1.
1070473c1bf2Sdan       */
10711be266baSdrh       sqlite3ExprDelete(pParse->db, A);
10721be266baSdrh       A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1);
10732b59b3a4Sdrh     }else if( Y->nExpr==1 ){
10742b59b3a4Sdrh       /* Expressions of the form:
10752b59b3a4Sdrh       **
10762b59b3a4Sdrh       **      expr1 IN (?1)
10772b59b3a4Sdrh       **      expr1 NOT IN (?2)
10782b59b3a4Sdrh       **
1079fbb24d10Sdrh       ** with exactly one value on the RHS can be simplified to something
1080fbb24d10Sdrh       ** like this:
10812b59b3a4Sdrh       **
1082fbb24d10Sdrh       **      expr1 == ?1
1083fbb24d10Sdrh       **      expr1 <> ?2
1084fbb24d10Sdrh       **
1085fbb24d10Sdrh       ** But, the RHS of the == or <> is marked with the EP_Generic flag
1086fbb24d10Sdrh       ** so that it may not contribute to the computation of comparison
1087fbb24d10Sdrh       ** affinity or the collating sequence to use for comparison.  Otherwise,
1088fbb24d10Sdrh       ** the semantics would be subtly different from IN or NOT IN.
10892b59b3a4Sdrh       */
1090fbb24d10Sdrh       Expr *pRHS = Y->a[0].pExpr;
10912b59b3a4Sdrh       Y->a[0].pExpr = 0;
10922b59b3a4Sdrh       sqlite3ExprListDelete(pParse->db, Y);
10935b1420e0Sdrh       /* pRHS cannot be NULL because a malloc error would have been detected
10945b1420e0Sdrh       ** before now and control would have never reached this point */
10955b1420e0Sdrh       if( ALWAYS(pRHS) ){
1096fbb24d10Sdrh         pRHS->flags &= ~EP_Collate;
1097fbb24d10Sdrh         pRHS->flags |= EP_Generic;
1098fbb24d10Sdrh       }
10991be266baSdrh       A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS);
1100094430ebSdrh     }else{
11011be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
11021be266baSdrh       if( A ){
11031be266baSdrh         A->x.pList = Y;
11041be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1105d5d56523Sdanielk1977       }else{
1106633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1107d5d56523Sdanielk1977       }
11081be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1109094430ebSdrh     }
1110fef5208cSdrh   }
11111be266baSdrh   expr(A) ::= LP select(X) RP. {
11121be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
11131be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
111451522cd3Sdrh   }
11151be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
11161be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
11171be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
11181be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1119fef5208cSdrh   }
11205fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
112117435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
11228c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
11239de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
11241be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
11251be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
11261be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
112723b2db23Sdrh   }
11281be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
112943303de9Sdrh     Expr *p;
11301be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
113108de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
113251522cd3Sdrh   }
1133154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1134fef5208cSdrh 
113517a7f8ddSdrh /* CASE expressions */
11361be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
11371be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
11381be266baSdrh   if( A ){
11391be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
11401be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
114153f733c7Sdrh   }else{
1142633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1143c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
114453f733c7Sdrh   }
114517a7f8ddSdrh }
114617a7f8ddSdrh %type case_exprlist {ExprList*}
1147633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
11484dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
11491be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
11501be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
115117a7f8ddSdrh }
115217a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
11531be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
11541be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
115517a7f8ddSdrh }
115617a7f8ddSdrh %type case_else {Expr*}
1157633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
11581be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
115917a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
116017a7f8ddSdrh %type case_operand {Expr*}
1161633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
11621be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
116317a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1164348784efSdrh 
1165348784efSdrh %type exprlist {ExprList*}
1166633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
11679245c243Sdrh %type nexprlist {ExprList*}
1168633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1169348784efSdrh 
11704dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
11719245c243Sdrh exprlist(A) ::= .                            {A = 0;}
11724dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
11731be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
117417435752Sdrh nexprlist(A) ::= expr(Y).
11751be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
11769245c243Sdrh 
1177a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
11785fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
11795fbab882Sdrh ** of parenthesis */
11805fbab882Sdrh %type paren_exprlist {ExprList*}
11815fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
11825fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
11835fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1184a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
11855fbab882Sdrh 
1186cce7d176Sdrh 
1187382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1188382c0247Sdrh //
1189d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1190108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
119117435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
119217435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
119362340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
11949cfcf5d4Sdrh }
1195717e6402Sdrh 
1196717e6402Sdrh %type uniqueflag {int}
11979cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
11989cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1199348784efSdrh 
1200348784efSdrh 
1201108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1202108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1203108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1204108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1205108aa00aSdrh //
1206108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1207108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1208108aa00aSdrh //
1209108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1210108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1211108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1212108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1213108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1214108aa00aSdrh // historical schemas.
1215108aa00aSdrh //
1216108aa00aSdrh %type eidlist {ExprList*}
1217108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1218108aa00aSdrh %type eidlist_opt {ExprList*}
1219108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1220108aa00aSdrh 
1221108aa00aSdrh %include {
1222108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1223108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1224108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1225108aa00aSdrh   ** error while parsing a legacy schema.
1226108aa00aSdrh   */
1227108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1228108aa00aSdrh     Parse *pParse,
1229108aa00aSdrh     ExprList *pPrior,
1230108aa00aSdrh     Token *pIdToken,
1231108aa00aSdrh     int hasCollate,
1232108aa00aSdrh     int sortOrder
1233108aa00aSdrh   ){
1234108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1235108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1236108aa00aSdrh         && pParse->db->init.busy==0
1237108aa00aSdrh     ){
1238108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1239108aa00aSdrh                          pIdToken->n, pIdToken->z);
12400202b29eSdanielk1977     }
1241108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1242108aa00aSdrh     return p;
1243108aa00aSdrh   }
1244108aa00aSdrh } // end %include
1245108aa00aSdrh 
1246108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1247108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
12484dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
12494dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1250108aa00aSdrh }
1251108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1252cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
12530202b29eSdanielk1977 }
12540202b29eSdanielk1977 
1255108aa00aSdrh %type collate {int}
1256108aa00aSdrh collate(C) ::= .              {C = 0;}
1257108aa00aSdrh collate(C) ::= COLLATE ids.   {C = 1;}
1258a34001c9Sdrh 
1259348784efSdrh 
12608aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1261382c0247Sdrh //
12624d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1263982cef7eSdrh 
1264382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1265382c0247Sdrh //
1266154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1267fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
12689ef5e770Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
12699ef5e770Sdrh cmd ::= VACUUM nm(X).          {sqlite3Vacuum(pParse,&X);}
1270fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1271154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1272f57b14a6Sdrh 
1273382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1274382c0247Sdrh //
127513d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
127691cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1277ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1278ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1279ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1280ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1281ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1282ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1283ada2ee0dSdrh 
1284cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1285cf82f0d3Sdrh nmnum(A) ::= nm(A).
1286cf82f0d3Sdrh nmnum(A) ::= ON(A).
1287cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1288cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1289154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1290f59b12fbSdrh %token_class number INTEGER|FLOAT.
12918395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1292cf82f0d3Sdrh plus_num(A) ::= number(A).
1293f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1294c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1295f0f258b1Sdrh 
1296b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1297b7f9164eSdrh 
1298d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
12994b59ab5eSdrh   Token all;
13004b59ab5eSdrh   all.z = A.z;
1301b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
13024adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1303f0f258b1Sdrh }
1304f0f258b1Sdrh 
1305fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1306fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
130760218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
130860218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1309cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1310c3f9bad2Sdanielk1977 }
1311c3f9bad2Sdanielk1977 
1312c3f9bad2Sdanielk1977 %type trigger_time {int}
13136559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1314c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1315c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1316c3f9bad2Sdanielk1977 
1317ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1318633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1319cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1320cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
132181eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1322c3f9bad2Sdanielk1977 
132360218d2aSdrh foreach_clause ::= .
132460218d2aSdrh foreach_clause ::= FOR EACH ROW.
1325c3f9bad2Sdanielk1977 
1326c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1327633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1328c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
13291be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1330c3f9bad2Sdanielk1977 
1331c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1332633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
13334dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
13344dd0d3f8Sdrh   assert( A!=0 );
13354dd0d3f8Sdrh   A->pLast->pNext = X;
13364dd0d3f8Sdrh   A->pLast = X;
1337a69d9168Sdrh }
13384dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
13394dd0d3f8Sdrh   assert( A!=0 );
13404dd0d3f8Sdrh   A->pLast = A;
134181238966Sdrh }
1342c3f9bad2Sdanielk1977 
1343b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1344b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1345b1819a0bSdrh // the same database as the table that the trigger fires on.
1346b1819a0bSdrh //
1347b1819a0bSdrh %type trnm {Token}
13484dd0d3f8Sdrh trnm(A) ::= nm(A).
1349b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1350b1819a0bSdrh   A = X;
1351b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1352b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1353b1819a0bSdrh         "statements within triggers");
1354b1819a0bSdrh }
1355b1819a0bSdrh 
1356b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1357b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1358b1819a0bSdrh // since it is an exception to the default grammar rules.
1359b1819a0bSdrh //
1360b1819a0bSdrh tridxby ::= .
1361b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1362b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1363b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1364b1819a0bSdrh         "within triggers");
1365b1819a0bSdrh }
1366b1819a0bSdrh tridxby ::= NOT INDEXED. {
1367b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1368b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1369b1819a0bSdrh         "within triggers");
1370b1819a0bSdrh }
1371b1819a0bSdrh 
1372b1819a0bSdrh 
1373b1819a0bSdrh 
1374c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1375633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1376c3f9bad2Sdanielk1977 // UPDATE
1377b1819a0bSdrh trigger_cmd(A) ::=
1378f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
1379f259df5fSdrh    {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R, B.z, E);}
1380c3f9bad2Sdanielk1977 
1381c3f9bad2Sdanielk1977 // INSERT
1382f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
1383f259df5fSdrh                       trnm(X) idlist_opt(F) select(S) scanpt(Z).
1384f259df5fSdrh    {A = sqlite3TriggerInsertStep(pParse->db,&X,F,S,R,B,Z);/*A-overwrites-R*/}
1385c3f9bad2Sdanielk1977 
1386c3f9bad2Sdanielk1977 // DELETE
1387f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
1388f259df5fSdrh    {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y, B.z, E);}
1389c3f9bad2Sdanielk1977 
1390c3f9bad2Sdanielk1977 // SELECT
1391f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1392f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1393c3f9bad2Sdanielk1977 
13946f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
13951be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
13961be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
13971be266baSdrh   if( A ){
13981be266baSdrh     A->affinity = OE_Ignore;
13994b59ab5eSdrh   }
14008aa34ae0Sdrh }
14011be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
14021be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
14031be266baSdrh   if( A ) {
14041be266baSdrh     A->affinity = (char)T;
14054b59ab5eSdrh   }
14068aa34ae0Sdrh }
1407154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1408b7f9164eSdrh 
140974ad7fe9Sdrh %type raisetype {int}
141074ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
141174ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
141274ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
141374ad7fe9Sdrh 
14146f34903eSdanielk1977 
1415c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1416b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1417fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1418fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1419c3f9bad2Sdanielk1977 }
1420154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1421113088ecSdrh 
1422113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1423fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1424f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
14251be266baSdrh   sqlite3Attach(pParse, F, D, K);
14261c2d8414Sdrh }
1427fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
14281be266baSdrh   sqlite3Detach(pParse, D);
1429fdbcdee5Sdrh }
1430fdbcdee5Sdrh 
1431f744bb56Sdanielk1977 %type key_opt {Expr*}
1432633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1433f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
14341be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1435113088ecSdrh 
1436113088ecSdrh database_kw_opt ::= DATABASE.
1437113088ecSdrh database_kw_opt ::= .
1438fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
14394343fea2Sdrh 
14404343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
14414343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
14424343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
14434343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1444154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
14459fd2a9a0Sdanielk1977 
14469f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
14479f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
14489f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
14499f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
14509f18e8a0Sdrh %endif
14519f18e8a0Sdrh 
14529fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
14539fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
14549fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
14559fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
14569fd2a9a0Sdanielk1977 }
1457986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1458986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1459986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
146019a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
146119a8e7e8Sdanielk1977 }
146219a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
14634a642b60Sdrh   disableLookaside(pParse);
146419a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
146519a8e7e8Sdanielk1977 }
146619a8e7e8Sdanielk1977 kwcolumn_opt ::= .
146719a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1468154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1469e09daa90Sdrh 
1470e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1471e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1472b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1473b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1474b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1475b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1476b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1477b9bb7c18Sdrh }
1478e09daa90Sdrh vtabarglist ::= vtabarg.
1479e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1480b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1481b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1482b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1483b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1484b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1485b9bb7c18Sdrh anylist ::= .
1486aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1487aaac8b4eSdrh anylist ::= anylist ANY.
1488154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
14898b471863Sdrh 
14908b471863Sdrh 
14918b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
14927d562dbeSdan %type with {With*}
14937d562dbeSdan %type wqlist {With*}
14947d562dbeSdan %destructor with {sqlite3WithDelete(pParse->db, $$);}
14954e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
14967d562dbeSdan 
14977d562dbeSdan with(A) ::= . {A = 0;}
14988b471863Sdrh %ifndef SQLITE_OMIT_CTE
14997d562dbeSdan with(A) ::= WITH wqlist(W).              { A = W; }
15007d562dbeSdan with(A) ::= WITH RECURSIVE wqlist(W).    { A = W; }
15017d562dbeSdan 
1502108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1503cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
15047d562dbeSdan }
15054dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
15064dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
15078b471863Sdrh }
15088b471863Sdrh %endif  SQLITE_OMIT_CTE
1509