xref: /sqlite-3.40.0/src/parse.y (revision 6116ee4e)
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 */
34*6116ee4eSdrh   if( TOKEN.z[0] ){
354adee20fSdanielk1977     sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
36*6116ee4eSdrh   }else{
37*6116ee4eSdrh     sqlite3ErrorMsg(pParse, "incomplete input");
38*6116ee4eSdrh   }
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);
3161be266baSdrh   sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n);
3177977a17fSdanielk1977 }
318348784efSdrh 
319382c0247Sdrh // In addition to the type name, we also care about the primary key and
320382c0247Sdrh // UNIQUE constraints.
321348784efSdrh //
3220d316a40Sdrh ccons ::= NULL onconf.
3234adee20fSdanielk1977 ccons ::= NOT NULL onconf(R).    {sqlite3AddNotNull(pParse, R);}
324fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
325fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
32662340f84Sdrh ccons ::= UNIQUE onconf(R).      {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0,
32762340f84Sdrh                                    SQLITE_IDXTYPE_UNIQUE);}
3281be266baSdrh ccons ::= CHECK LP expr(X) RP.   {sqlite3AddCheckConstraint(pParse,X);}
329108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R).
3304adee20fSdanielk1977                                  {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
3314adee20fSdanielk1977 ccons ::= defer_subclause(D).    {sqlite3DeferForeignKey(pParse,D);}
33239002505Sdanielk1977 ccons ::= COLLATE ids(C).        {sqlite3AddCollateType(pParse, &C);}
33304738cb9Sdrh 
334205f48e6Sdrh // The optional AUTOINCREMENT keyword
335205f48e6Sdrh %type autoinc {int}
336205f48e6Sdrh autoinc(X) ::= .          {X = 0;}
3372958a4e6Sdrh autoinc(X) ::= AUTOINCR.  {X = 1;}
338205f48e6Sdrh 
339c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause
340c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or
341c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ
342c2eef3b3Sdrh // check fails.
34304738cb9Sdrh //
344c2eef3b3Sdrh %type refargs {int}
345fcf486c3Sdrh refargs(A) ::= .                  { A = OE_None*0x0101; /* EV: R-19803-45884 */}
3464dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; }
347c2eef3b3Sdrh %type refarg {struct {int value; int mask;}}
348c2eef3b3Sdrh refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
349c29c5aa1Sdrh refarg(A) ::= ON INSERT refact.      { A.value = 0;     A.mask = 0x000000; }
350c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
351c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
352c2eef3b3Sdrh %type refact {int}
353fcf486c3Sdrh refact(A) ::= SET NULL.              { A = OE_SetNull;  /* EV: R-33326-45252 */}
354fcf486c3Sdrh refact(A) ::= SET DEFAULT.           { A = OE_SetDflt;  /* EV: R-33326-45252 */}
355fcf486c3Sdrh refact(A) ::= CASCADE.               { A = OE_Cascade;  /* EV: R-33326-45252 */}
356fcf486c3Sdrh refact(A) ::= RESTRICT.              { A = OE_Restrict; /* EV: R-33326-45252 */}
357fcf486c3Sdrh refact(A) ::= NO ACTION.             { A = OE_None;     /* EV: R-33326-45252 */}
358c2eef3b3Sdrh %type defer_subclause {int}
3591da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt.     {A = 0;}
360c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
361c2eef3b3Sdrh %type init_deferred_pred_opt {int}
362c2eef3b3Sdrh init_deferred_pred_opt(A) ::= .                       {A = 0;}
363c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
364c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
365348784efSdrh 
36619a8e7e8Sdanielk1977 conslist_opt(A) ::= .                         {A.n = 0; A.z = 0;}
3674dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist.
368ab35eaedSdrh conslist ::= conslist tconscomma tcons.
369ab35eaedSdrh conslist ::= tcons.
370ab35eaedSdrh tconscomma ::= COMMA.            {pParse->constraintName.n = 0;}
371ab35eaedSdrh tconscomma ::= .
372ab35eaedSdrh tcons ::= CONSTRAINT nm(X).      {pParse->constraintName = X;}
373108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R).
374fdd6e85aSdrh                                  {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
375108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R).
37662340f84Sdrh                                  {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0,
37762340f84Sdrh                                        SQLITE_IDXTYPE_UNIQUE);}
378b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf.
3791be266baSdrh                                  {sqlite3AddCheckConstraint(pParse,E);}
380108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP
381108aa00aSdrh           REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). {
3824adee20fSdanielk1977     sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
3834adee20fSdanielk1977     sqlite3DeferForeignKey(pParse, D);
384c2eef3b3Sdrh }
385c2eef3b3Sdrh %type defer_subclause_opt {int}
386c2eef3b3Sdrh defer_subclause_opt(A) ::= .                    {A = 0;}
3874dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A).
3889cfcf5d4Sdrh 
3899cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
3909cfcf5d4Sdrh // default behavior when there is a constraint conflict.
3919cfcf5d4Sdrh //
3929cfcf5d4Sdrh %type onconf {int}
3933334d089Sdrh %type orconf {int}
3941c92853dSdrh %type resolvetype {int}
3951c92853dSdrh onconf(A) ::= .                              {A = OE_Default;}
3961c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    {A = X;}
3971c92853dSdrh orconf(A) ::= .                              {A = OE_Default;}
3983334d089Sdrh orconf(A) ::= OR resolvetype(X).             {A = X;}
3994dd0d3f8Sdrh resolvetype(A) ::= raisetype(A).
4001c92853dSdrh resolvetype(A) ::= IGNORE.                   {A = OE_Ignore;}
4011c92853dSdrh resolvetype(A) ::= REPLACE.                  {A = OE_Replace;}
402348784efSdrh 
403382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
404348784efSdrh //
405a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). {
406a073384fSdrh   sqlite3DropTable(pParse, X, 0, E);
407a8858103Sdanielk1977 }
408a073384fSdrh %type ifexists {int}
409a073384fSdrh ifexists(A) ::= IF EXISTS.   {A = 1;}
410a073384fSdrh ifexists(A) ::= .            {A = 0;}
411348784efSdrh 
412a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
413a76b5dfcSdrh //
414b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW
415108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C)
4168981b904Sdrh           AS select(S). {
4178981b904Sdrh   sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E);
418a76b5dfcSdrh }
419a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). {
420a073384fSdrh   sqlite3DropTable(pParse, X, 1, E);
421a76b5dfcSdrh }
422154d4b24Sdrh %endif  SQLITE_OMIT_VIEW
423a76b5dfcSdrh 
424382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
425348784efSdrh //
4267d562dbeSdan cmd ::= select(X).  {
427edf83d1eSdrh   SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0};
4287d10d5a6Sdrh   sqlite3Select(pParse, X, &dest);
429633e6d57Sdrh   sqlite3SelectDelete(pParse->db, X);
4309bb61fe7Sdrh }
431efb7251dSdrh 
4329bb61fe7Sdrh %type select {Select*}
433633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);}
4347d562dbeSdan %type selectnowith {Select*}
4357d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);}
43682c3d636Sdrh %type oneselect {Select*}
437633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
4389bb61fe7Sdrh 
439772460fdSdrh %include {
440772460fdSdrh   /*
441772460fdSdrh   ** For a compound SELECT statement, make sure p->pPrior->pNext==p for
442772460fdSdrh   ** all elements in the list.  And make sure list length does not exceed
443772460fdSdrh   ** SQLITE_LIMIT_COMPOUND_SELECT.
444772460fdSdrh   */
445e318a7f8Sdrh   static void parserDoubleLinkSelect(Parse *pParse, Select *p){
446d227a291Sdrh     if( p->pPrior ){
447772460fdSdrh       Select *pNext = 0, *pLoop;
448772460fdSdrh       int mxSelect, cnt = 0;
449d227a291Sdrh       for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){
450d227a291Sdrh         pLoop->pNext = pNext;
451d227a291Sdrh         pLoop->selFlags |= SF_Compound;
452d227a291Sdrh       }
453772460fdSdrh       if( (p->selFlags & SF_MultiValue)==0 &&
454772460fdSdrh         (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 &&
455772460fdSdrh         cnt>mxSelect
456a0c01768Sdrh       ){
457d227a291Sdrh         sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
458d227a291Sdrh       }
459d227a291Sdrh     }
460772460fdSdrh   }
461772460fdSdrh }
462772460fdSdrh 
463772460fdSdrh select(A) ::= with(W) selectnowith(X). {
464772460fdSdrh   Select *p = X;
465772460fdSdrh   if( p ){
466772460fdSdrh     p->pWith = W;
467772460fdSdrh     parserDoubleLinkSelect(pParse, p);
468a9f5c13dSdan   }else{
469a9f5c13dSdan     sqlite3WithDelete(pParse->db, W);
470a9f5c13dSdan   }
471cf82f0d3Sdrh   A = p; /*A-overwrites-W*/
472a9f5c13dSdan }
4737d562dbeSdan 
4744dd0d3f8Sdrh selectnowith(A) ::= oneselect(A).
475b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT
4764dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z).  {
477c0bf493eSdrh   Select *pRhs = Z;
4784dd0d3f8Sdrh   Select *pLhs = A;
479c0bf493eSdrh   if( pRhs && pRhs->pPrior ){
480c0bf493eSdrh     SrcList *pFrom;
481c0bf493eSdrh     Token x;
482c0bf493eSdrh     x.n = 0;
483772460fdSdrh     parserDoubleLinkSelect(pParse, pRhs);
484c0bf493eSdrh     pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0);
4858c0833fbSdrh     pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0);
486c0bf493eSdrh   }
487c0bf493eSdrh   if( pRhs ){
488c0bf493eSdrh     pRhs->op = (u8)Y;
48900d5ab74Sdrh     pRhs->pPrior = pLhs;
49000d5ab74Sdrh     if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue;
491772460fdSdrh     pRhs->selFlags &= ~SF_MultiValue;
492d58d3278Sdrh     if( Y!=TK_ALL ) pParse->hasCompound = 1;
49343b78826Sdrh   }else{
49400d5ab74Sdrh     sqlite3SelectDelete(pParse->db, pLhs);
495daffd0e5Sdrh   }
496c0bf493eSdrh   A = pRhs;
49782c3d636Sdrh }
4980a36c57eSdrh %type multiselect_op {int}
499cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP).             {A = @OP; /*A-overwrites-OP*/}
5000a36c57eSdrh multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
501cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP; /*A-overwrites-OP*/}
502154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT
503abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y)
5049bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
50543303de9Sdrh #if SELECTTRACE_ENABLED
50643303de9Sdrh   Token s = S; /*A-overwrites-S*/
50743303de9Sdrh #endif
5088c0833fbSdrh   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
509abd4c723Sdrh #if SELECTTRACE_ENABLED
510eb9b884cSdrh   /* Populate the Select.zSelName[] string that is used to help with
511abd4c723Sdrh   ** query planner debugging, to differentiate between multiple Select
512abd4c723Sdrh   ** objects in a complex query.
513abd4c723Sdrh   **
514abd4c723Sdrh   ** If the SELECT keyword is immediately followed by a C-style comment
515abd4c723Sdrh   ** then extract the first few alphanumeric characters from within that
516eb9b884cSdrh   ** comment to be the zSelName value.  Otherwise, the label is #N where
517abd4c723Sdrh   ** is an integer that is incremented with each SELECT statement seen.
518abd4c723Sdrh   */
519abd4c723Sdrh   if( A!=0 ){
52043303de9Sdrh     const char *z = s.z+6;
521abd4c723Sdrh     int i;
522eb9b884cSdrh     sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d",
523abd4c723Sdrh                      ++pParse->nSelect);
524abd4c723Sdrh     while( z[0]==' ' ) z++;
525abd4c723Sdrh     if( z[0]=='/' && z[1]=='*' ){
526abd4c723Sdrh       z += 2;
527abd4c723Sdrh       while( z[0]==' ' ) z++;
528abd4c723Sdrh       for(i=0; sqlite3Isalnum(z[i]); i++){}
529eb9b884cSdrh       sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z);
530abd4c723Sdrh     }
531abd4c723Sdrh   }
532abd4c723Sdrh #endif /* SELECTRACE_ENABLED */
5339bb61fe7Sdrh }
5344dd0d3f8Sdrh oneselect(A) ::= values(A).
53575593d96Sdrh 
53675593d96Sdrh %type values {Select*}
53775593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);}
53875593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. {
5398c0833fbSdrh   A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0);
54075593d96Sdrh }
5414dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. {
5424dd0d3f8Sdrh   Select *pRight, *pLeft = A;
5438c0833fbSdrh   pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0);
544f3151f0aSdrh   if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue;
54575593d96Sdrh   if( pRight ){
54675593d96Sdrh     pRight->op = TK_ALL;
547772460fdSdrh     pRight->pPrior = pLeft;
54875593d96Sdrh     A = pRight;
54975593d96Sdrh   }else{
550772460fdSdrh     A = pLeft;
55175593d96Sdrh   }
55275593d96Sdrh }
5539bb61fe7Sdrh 
5549bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
5559bb61fe7Sdrh // present and false (0) if it is not.
5569bb61fe7Sdrh //
5573334d089Sdrh %type distinct {int}
558832ee3d4Sdrh distinct(A) ::= DISTINCT.   {A = SF_Distinct;}
5597cea7f95Sdrh distinct(A) ::= ALL.        {A = SF_All;}
560efb7251dSdrh distinct(A) ::= .           {A = 0;}
561348784efSdrh 
5629bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
5637c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
5647c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
5651a1d3cd2Sdrh // opcode of TK_ASTERISK.
5669bb61fe7Sdrh //
567348784efSdrh %type selcollist {ExprList*}
568633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
569348784efSdrh %type sclp {ExprList*}
570633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
5714dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA.
572348784efSdrh sclp(A) ::= .                                {A = 0;}
5731be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y).     {
5741be266baSdrh    A = sqlite3ExprListAppend(pParse, A, X);
575b7916a78Sdrh    if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
5761be266baSdrh    sqlite3ExprListSetSpan(pParse,A,B,Z);
57701f3f253Sdrh }
578d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. {
5791a1d3cd2Sdrh   Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0);
5804dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse, A, p);
5817c917d19Sdrh }
5821be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. {
583abfd35eaSdrh   Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0);
584abfd35eaSdrh   Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
585abfd35eaSdrh   Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight);
5864dd0d3f8Sdrh   A = sqlite3ExprListAppend(pParse,A, pDot);
58754473229Sdrh }
58801f3f253Sdrh 
58901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that
59001f3f253Sdrh // define the result set, or one of the tables in the FROM clause.
59101f3f253Sdrh //
59201f3f253Sdrh %type as {Token}
5935ad1a6c8Sdrh as(X) ::= AS nm(Y).    {X = Y;}
5944dd0d3f8Sdrh as(X) ::= ids(X).
595986dde70Sdrh as(X) ::= .            {X.n = 0; X.z = 0;}
5969bb61fe7Sdrh 
597348784efSdrh 
598ad3cab52Sdrh %type seltablist {SrcList*}
599633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
600ad3cab52Sdrh %type stl_prefix {SrcList*}
601633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
602ad3cab52Sdrh %type from {SrcList*}
603633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
604348784efSdrh 
60501f3f253Sdrh // A complete FROM clause.
60601f3f253Sdrh //
60717435752Sdrh from(A) ::= .                {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
60861dfc31dSdrh from(A) ::= FROM seltablist(X). {
60961dfc31dSdrh   A = X;
61061dfc31dSdrh   sqlite3SrcListShiftJoinType(A);
61161dfc31dSdrh }
61201f3f253Sdrh 
61301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause
61401f3f253Sdrh // in a SELECT statement.  "stl_prefix" is a prefix of this list.
61501f3f253Sdrh //
6164dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y).    {
6178a48b9c0Sdrh    if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y;
61801f3f253Sdrh }
619348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
6204dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I)
621e9240418Sdrh                   on_opt(N) using_opt(U). {
6224dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
623b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, A, &I);
62401f3f253Sdrh }
6254dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z)
62601d230ceSdrh                   on_opt(N) using_opt(U). {
6274dd0d3f8Sdrh   A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U);
62801d230ceSdrh   sqlite3SrcListFuncArgs(pParse, A, E);
62901d230ceSdrh }
63051522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY
6314dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP select(S) RP
632b733d037Sdrh                     as(Z) on_opt(N) using_opt(U). {
6334dd0d3f8Sdrh     A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U);
63422f70c32Sdrh   }
6354dd0d3f8Sdrh   seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP
636fbdc7f69Sdrh                     as(Z) on_opt(N) using_opt(U). {
6374dd0d3f8Sdrh     if( A==0 && Z.n==0 && N==0 && U==0 ){
638fbdc7f69Sdrh       A = F;
639832ee3d4Sdrh     }else if( F->nSrc==1 ){
6404dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U);
641832ee3d4Sdrh       if( A ){
642832ee3d4Sdrh         struct SrcList_item *pNew = &A->a[A->nSrc-1];
643832ee3d4Sdrh         struct SrcList_item *pOld = F->a;
644832ee3d4Sdrh         pNew->zName = pOld->zName;
645832ee3d4Sdrh         pNew->zDatabase = pOld->zDatabase;
6463c449c6bSdrh         pNew->pSelect = pOld->pSelect;
647832ee3d4Sdrh         pOld->zName = pOld->zDatabase = 0;
6483c449c6bSdrh         pOld->pSelect = 0;
649832ee3d4Sdrh       }
650832ee3d4Sdrh       sqlite3SrcListDelete(pParse->db, F);
651fbdc7f69Sdrh     }else{
652fbdc7f69Sdrh       Select *pSubquery;
653fbdc7f69Sdrh       sqlite3SrcListShiftJoinType(F);
6548c0833fbSdrh       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
6554dd0d3f8Sdrh       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U);
656fbdc7f69Sdrh     }
657fbdc7f69Sdrh   }
658154d4b24Sdrh %endif  SQLITE_OMIT_SUBQUERY
659b733d037Sdrh 
660113088ecSdrh %type dbnm {Token}
661113088ecSdrh dbnm(A) ::= .          {A.z=0; A.n=0;}
662113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;}
663113088ecSdrh 
66474ad7fe9Sdrh %type fullname {SrcList*}
665633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
666cf82f0d3Sdrh fullname(A) ::= nm(X) dbnm(Y).
667cf82f0d3Sdrh    {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/}
66874ad7fe9Sdrh 
66901f3f253Sdrh %type joinop {int}
670fd405314Sdrh joinop(X) ::= COMMA|JOIN.              { X = JT_INNER; }
671cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN.
672cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,0,0);  /*X-overwrites-A*/}
673cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN.
674cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/}
6755ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
676cf82f0d3Sdrh                   {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/}
67701f3f253Sdrh 
67801f3f253Sdrh %type on_opt {Expr*}
679633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
6801be266baSdrh on_opt(N) ::= ON expr(E).   {N = E;}
68101f3f253Sdrh on_opt(N) ::= .             {N = 0;}
68201f3f253Sdrh 
68385574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is
68485574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
68585574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal,
68685574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes
68785574e31Sdanielk1977 // in the token.
68885574e31Sdanielk1977 //
68985574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
690b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function
69185574e31Sdanielk1977 // recognizes and interprets this as a special case.
69285574e31Sdanielk1977 //
69385574e31Sdanielk1977 %type indexed_opt {Token}
69485574e31Sdanielk1977 indexed_opt(A) ::= .                 {A.z=0; A.n=0;}
69585574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
69685574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED.      {A.z=0; A.n=1;}
69785574e31Sdanielk1977 
69801f3f253Sdrh %type using_opt {IdList*}
699633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
70081eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP.  {U = L;}
70101f3f253Sdrh using_opt(U) ::= .                        {U = 0;}
70201f3f253Sdrh 
70301f3f253Sdrh 
704348784efSdrh %type orderby_opt {ExprList*}
705633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
706108aa00aSdrh 
707108aa00aSdrh // the sortlist non-terminal stores a list of expression where each
708108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the
709108aa00aSdrh // sort order.
710108aa00aSdrh //
711348784efSdrh %type sortlist {ExprList*}
712633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
713348784efSdrh 
714348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
715348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
7164dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). {
7171be266baSdrh   A = sqlite3ExprListAppend(pParse,A,Y);
718bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
719348784efSdrh }
7208395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). {
7211be266baSdrh   A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/
722bc622bc0Sdrh   sqlite3ExprListSetSortOrder(A,Z);
723348784efSdrh }
724348784efSdrh 
725348784efSdrh %type sortorder {int}
726348784efSdrh 
7278e2ca029Sdrh sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
7288e2ca029Sdrh sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
729bc622bc0Sdrh sortorder(A) ::= .              {A = SQLITE_SO_UNDEFINED;}
730348784efSdrh 
7312282792aSdrh %type groupby_opt {ExprList*}
732633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
7332282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
7349245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
7352282792aSdrh 
7362282792aSdrh %type having_opt {Expr*}
737633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
7382282792aSdrh having_opt(A) ::= .                {A = 0;}
7391be266baSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
7402282792aSdrh 
7418c0833fbSdrh %type limit_opt {Expr*}
74215926590Sdrh 
74315926590Sdrh // The destructor for limit_opt will never fire in the current grammar.
74415926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production
74515926590Sdrh // rule for SELECT statements.  As soon as the rule that create the
74615926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also
74715926590Sdrh // reduce.  So there is never a limit_opt non-terminal on the stack
74815926590Sdrh // except as a transient.  So there is never anything to destroy.
74915926590Sdrh //
7508c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);}
7518c0833fbSdrh limit_opt(A) ::= .       {A = 0;}
7528c0833fbSdrh limit_opt(A) ::= LIMIT expr(X).
7531be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);}
754a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
7551be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);}
756a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
7571be266baSdrh                          {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);}
7589bbca4c1Sdrh 
759382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
760382c0247Sdrh //
761273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7624e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
763931577f1Sdrh         orderby_opt(O) limit_opt(L). {
764b290f117Sdan   sqlite3WithPush(pParse, C, 1);
765b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
7668c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,O,L);
7674281bd42Sshane }
7684281bd42Sshane %endif
769273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7704e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
771b290f117Sdan   sqlite3WithPush(pParse, C, 1);
7724281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
7738c0833fbSdrh   sqlite3DeleteFrom(pParse,X,W,0,0);
7744281bd42Sshane }
7754281bd42Sshane %endif
776348784efSdrh 
777348784efSdrh %type where_opt {Expr*}
778633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
779348784efSdrh 
780348784efSdrh where_opt(A) ::= .                    {A = 0;}
7811be266baSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
782348784efSdrh 
783382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
784382c0247Sdrh //
785273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
786bfe31e7fSdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
7878b471863Sdrh         where_opt(W) orderby_opt(O) limit_opt(L).  {
788b290f117Sdan   sqlite3WithPush(pParse, C, 1);
789b1c685b0Sdanielk1977   sqlite3SrcListIndexedBy(pParse, X, &I);
790b1a6c3c1Sdrh   sqlite3ExprListCheckLength(pParse,Y,"set list");
7918c0833fbSdrh   sqlite3Update(pParse,X,Y,W,R,O,L);
7924281bd42Sshane }
7934281bd42Sshane %endif
794273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
7954e9119d9Sdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y)
796e9240418Sdrh         where_opt(W).  {
797b290f117Sdan   sqlite3WithPush(pParse, C, 1);
7984281bd42Sshane   sqlite3SrcListIndexedBy(pParse, X, &I);
7994281bd42Sshane   sqlite3ExprListCheckLength(pParse,Y,"set list");
8008c0833fbSdrh   sqlite3Update(pParse,X,Y,W,R,0,0);
8014281bd42Sshane }
8024281bd42Sshane %endif
803348784efSdrh 
804f8db1bc0Sdrh %type setlist {ExprList*}
805633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
806f8db1bc0Sdrh 
8074dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). {
8081be266baSdrh   A = sqlite3ExprListAppend(pParse, A, Y);
809b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
810b7916a78Sdrh }
811a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). {
8121be266baSdrh   A = sqlite3ExprListAppendVector(pParse, A, X, Y);
813a1251bc4Sdrh }
814b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). {
8151be266baSdrh   A = sqlite3ExprListAppend(pParse, 0, Y);
816b7916a78Sdrh   sqlite3ExprListSetName(pParse, A, &X, 1);
817b7916a78Sdrh }
818a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). {
8191be266baSdrh   A = sqlite3ExprListAppendVector(pParse, 0, X, Y);
820a1251bc4Sdrh }
821348784efSdrh 
822382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
823382c0247Sdrh //
8248981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). {
825b290f117Sdan   sqlite3WithPush(pParse, W, 1);
8264e9119d9Sdan   sqlite3Insert(pParse, X, S, F, R);
8274e9119d9Sdan }
8288981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES.
8294e9119d9Sdan {
830b290f117Sdan   sqlite3WithPush(pParse, W, 1);
8314e9119d9Sdan   sqlite3Insert(pParse, X, 0, F, R);
8324e9119d9Sdan }
833348784efSdrh 
8343334d089Sdrh %type insert_cmd {int}
835fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
836fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
837fa86c412Sdrh 
8388981b904Sdrh %type idlist_opt {IdList*}
8398981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);}
84081eba73eSdrh %type idlist {IdList*}
84181eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);}
842348784efSdrh 
8438981b904Sdrh idlist_opt(A) ::= .                       {A = 0;}
8448981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP.    {A = X;}
8454dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y).
8464dd0d3f8Sdrh     {A = sqlite3IdListAppend(pParse->db,A,&Y);}
84781eba73eSdrh idlist(A) ::= nm(Y).
848cf82f0d3Sdrh     {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/}
849348784efSdrh 
850382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
851382c0247Sdrh //
852348784efSdrh 
8531be266baSdrh %type expr {Expr*}
8541be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);}
8551be266baSdrh %type term {Expr*}
8561be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);}
857b7916a78Sdrh 
858b7916a78Sdrh %include {
859b7916a78Sdrh 
860b7916a78Sdrh   /* Construct a new Expr object from a single identifier.  Use the
861b7916a78Sdrh   ** new Expr to populate pOut.  Set the span of pOut to be the identifier
862b7916a78Sdrh   ** that created the expression.
863b7916a78Sdrh   */
8641be266baSdrh   static Expr *tokenExpr(Parse *pParse, int op, Token t){
8650cd874bdSdrh     Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1);
8660cd874bdSdrh     if( p ){
8670cd874bdSdrh       memset(p, 0, sizeof(Expr));
8680cd874bdSdrh       p->op = (u8)op;
8690cd874bdSdrh       p->flags = EP_Leaf;
8700cd874bdSdrh       p->iAgg = -1;
8710cd874bdSdrh       p->u.zToken = (char*)&p[1];
8720cd874bdSdrh       memcpy(p->u.zToken, t.z, t.n);
8730cd874bdSdrh       p->u.zToken[t.n] = 0;
8740cd874bdSdrh       if( sqlite3Isquote(p->u.zToken[0]) ){
8750cd874bdSdrh         if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted;
8760cd874bdSdrh         sqlite3Dequote(p->u.zToken);
8770cd874bdSdrh       }
8780cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0
8790cd874bdSdrh       p->nHeight = 1;
8800cd874bdSdrh #endif
8810cd874bdSdrh     }
8821be266baSdrh     return p;
883b7916a78Sdrh   }
884b7916a78Sdrh }
885348784efSdrh 
8864dd0d3f8Sdrh expr(A) ::= term(A).
8871be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;}
8881be266baSdrh expr(A) ::= id(X).          {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
8891be266baSdrh expr(A) ::= JOIN_KW(X).     {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/}
8905ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). {
891410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
892410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
8931be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2);
894e1b6a5b8Sdrh }
895d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
896410c301fSdrh   Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1);
897410c301fSdrh   Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1);
898410c301fSdrh   Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1);
899abfd35eaSdrh   Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3);
9001be266baSdrh   A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4);
901d24cc427Sdrh }
9021be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9031be266baSdrh term(A) ::= STRING(X).          {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/}
9040cd874bdSdrh term(A) ::= INTEGER(X). {
9051be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1);
9060cd874bdSdrh }
907f59b12fbSdrh expr(A) ::= VARIABLE(X).     {
9088679fbabSdrh   if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){
909de25a88cSdrh     u32 n = X.n;
9101be266baSdrh     A = tokenExpr(pParse, TK_VARIABLE, X);
9111be266baSdrh     sqlite3ExprAssignVarNumber(pParse, A, n);
9128f3b137fSdrh   }else{
913b7916a78Sdrh     /* When doing a nested parse, one can include terms in an expression
914b7916a78Sdrh     ** that look like this:   #1 #2 ...  These terms refer to registers
915b7916a78Sdrh     ** in the virtual machine.  #N is the N-th register. */
9168f3b137fSdrh     Token t = X; /*A-overwrites-X*/
9178f3b137fSdrh     assert( t.n>=2 );
918b7916a78Sdrh     if( pParse->nested==0 ){
91943303de9Sdrh       sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t);
9201be266baSdrh       A = 0;
921b7916a78Sdrh     }else{
9221be266baSdrh       A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0);
9231be266baSdrh       if( A ) sqlite3GetInt32(&t.z[1], &A->iTable);
924b7916a78Sdrh     }
925f59b12fbSdrh   }
926895d7472Sdrh }
9274dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). {
9281be266baSdrh   A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
9298b4c40d8Sdrh }
930487e262fSdrh %ifndef SQLITE_OMIT_CAST
9311be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
9321be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1);
9331be266baSdrh   sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
934487e262fSdrh }
935154d4b24Sdrh %endif  SQLITE_OMIT_CAST
9361be266baSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
937994704d1Sdrh   if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
938e5c941b8Sdrh     sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
9394e05c83bSdrh   }
9401be266baSdrh   A = sqlite3ExprFunction(pParse, Y, &X);
9411be266baSdrh   if( D==SF_Distinct && A ){
9421be266baSdrh     A->flags |= EP_Distinct;
943fd357974Sdrh   }
944e1b6a5b8Sdrh }
9451be266baSdrh expr(A) ::= id(X) LP STAR RP. {
9461be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &X);
947e1b6a5b8Sdrh }
948b71090fdSdrh term(A) ::= CTIME_KW(OP). {
9491be266baSdrh   A = sqlite3ExprFunction(pParse, 0, &OP);
950b7916a78Sdrh }
951b7916a78Sdrh 
9521be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
9531be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
9541be266baSdrh   A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
9551be266baSdrh   if( A ){
9561be266baSdrh     A->x.pList = pList;
9578bd0d58eSdrh   }else{
9588bd0d58eSdrh     sqlite3ExprListDelete(pParse->db, pList);
95971c57db0Sdan   }
96071c57db0Sdan }
96171c57db0Sdan 
9621be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y).    {A=sqlite3PExpr(pParse,@OP,A,Y);}
9631be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y).     {A=sqlite3PExpr(pParse,@OP,A,Y);}
9644dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y).
9651be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9661be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y).  {A=sqlite3PExpr(pParse,@OP,A,Y);}
9674dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
9681be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9694dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y).
9701be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9714dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y).
9721be266baSdrh                                         {A=sqlite3PExpr(pParse,@OP,A,Y);}
9731be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);}
974410c301fSdrh %type likeop {Token}
9757e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A).
976410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/}
9774dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y).  [LIKE_KW]  {
9788aa34ae0Sdrh   ExprList *pList;
979410c301fSdrh   int bNot = OP.n & 0x80000000;
980410c301fSdrh   OP.n &= 0x7fffffff;
9811be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
9821be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
9831be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
9841be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
9851be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
9860ac65892Sdrh }
9874dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E).  [LIKE_KW]  {
9881dca1458Sdrh   ExprList *pList;
989410c301fSdrh   int bNot = OP.n & 0x80000000;
990410c301fSdrh   OP.n &= 0x7fffffff;
9911be266baSdrh   pList = sqlite3ExprListAppend(pParse,0, Y);
9921be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, A);
9931be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, E);
9941be266baSdrh   A = sqlite3ExprFunction(pParse, pList, &OP);
9951be266baSdrh   if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
9961be266baSdrh   if( A ) A->flags |= EP_InfixFunc;
9971dca1458Sdrh }
9987c6303c0Sdanielk1977 
9991be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E).   {A = sqlite3PExpr(pParse,@E,A,0);}
10001be266baSdrh expr(A) ::= expr(A) NOT NULL.    {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);}
10016a2fe093Sdrh 
10026a51741dSdrh %include {
10036a51741dSdrh   /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
10046a51741dSdrh   ** unary TK_ISNULL or TK_NOTNULL expression. */
10056a51741dSdrh   static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
10066a51741dSdrh     sqlite3 *db = pParse->db;
1007895c00e1Sdan     if( pA && pY && pY->op==TK_NULL ){
10085e17e8b7Sshaneh       pA->op = (u8)op;
10096a51741dSdrh       sqlite3ExprDelete(db, pA->pRight);
10106a51741dSdrh       pA->pRight = 0;
10116a51741dSdrh     }
10126a51741dSdrh   }
10136a51741dSdrh }
10146a51741dSdrh 
10156a2fe093Sdrh //    expr1 IS expr2
10166a2fe093Sdrh //    expr1 IS NOT expr2
10176a2fe093Sdrh //
10186a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL.  If expr2
10196a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT.
10206a2fe093Sdrh //
10214dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y).     {
10221be266baSdrh   A = sqlite3PExpr(pParse,TK_IS,A,Y);
10231be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL);
10246a2fe093Sdrh }
10254dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). {
10261be266baSdrh   A = sqlite3PExpr(pParse,TK_ISNOT,A,Y);
10271be266baSdrh   binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL);
10286a2fe093Sdrh }
1029b7916a78Sdrh 
103043303de9Sdrh expr(A) ::= NOT(B) expr(X).
10311be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
103243303de9Sdrh expr(A) ::= BITNOT(B) expr(X).
10331be266baSdrh               {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/}
10341be266baSdrh expr(A) ::= MINUS expr(X). [BITNOT]
10351be266baSdrh               {A = sqlite3PExpr(pParse, TK_UMINUS, X, 0);}
10361be266baSdrh expr(A) ::= PLUS expr(X). [BITNOT]
10371be266baSdrh               {A = sqlite3PExpr(pParse, TK_UPLUS, X, 0);}
1038b7916a78Sdrh 
10392e3a1f16Sdrh %type between_op {int}
10402e3a1f16Sdrh between_op(A) ::= BETWEEN.     {A = 0;}
10412e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;}
10424dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
10431be266baSdrh   ExprList *pList = sqlite3ExprListAppend(pParse,0, X);
10441be266baSdrh   pList = sqlite3ExprListAppend(pParse,pList, Y);
10451be266baSdrh   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
10461be266baSdrh   if( A ){
10471be266baSdrh     A->x.pList = pList;
104853f733c7Sdrh   }else{
1049633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, pList);
105053f733c7Sdrh   }
10511be266baSdrh   if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1052fef5208cSdrh }
10533e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY
10542e3a1f16Sdrh   %type in_op {int}
10552e3a1f16Sdrh   in_op(A) ::= IN.      {A = 0;}
10562e3a1f16Sdrh   in_op(A) ::= NOT IN.  {A = 1;}
10571be266baSdrh   expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] {
1058094430ebSdrh     if( Y==0 ){
1059473c1bf2Sdan       /* Expressions of the form
1060473c1bf2Sdan       **
1061473c1bf2Sdan       **      expr1 IN ()
1062473c1bf2Sdan       **      expr1 NOT IN ()
1063473c1bf2Sdan       **
1064473c1bf2Sdan       ** simplify to constants 0 (false) and 1 (true), respectively,
1065473c1bf2Sdan       ** regardless of the value of expr1.
1066473c1bf2Sdan       */
10671be266baSdrh       sqlite3ExprDelete(pParse->db, A);
10681be266baSdrh       A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1);
10692b59b3a4Sdrh     }else if( Y->nExpr==1 ){
10702b59b3a4Sdrh       /* Expressions of the form:
10712b59b3a4Sdrh       **
10722b59b3a4Sdrh       **      expr1 IN (?1)
10732b59b3a4Sdrh       **      expr1 NOT IN (?2)
10742b59b3a4Sdrh       **
1075fbb24d10Sdrh       ** with exactly one value on the RHS can be simplified to something
1076fbb24d10Sdrh       ** like this:
10772b59b3a4Sdrh       **
1078fbb24d10Sdrh       **      expr1 == ?1
1079fbb24d10Sdrh       **      expr1 <> ?2
1080fbb24d10Sdrh       **
1081fbb24d10Sdrh       ** But, the RHS of the == or <> is marked with the EP_Generic flag
1082fbb24d10Sdrh       ** so that it may not contribute to the computation of comparison
1083fbb24d10Sdrh       ** affinity or the collating sequence to use for comparison.  Otherwise,
1084fbb24d10Sdrh       ** the semantics would be subtly different from IN or NOT IN.
10852b59b3a4Sdrh       */
1086fbb24d10Sdrh       Expr *pRHS = Y->a[0].pExpr;
10872b59b3a4Sdrh       Y->a[0].pExpr = 0;
10882b59b3a4Sdrh       sqlite3ExprListDelete(pParse->db, Y);
10895b1420e0Sdrh       /* pRHS cannot be NULL because a malloc error would have been detected
10905b1420e0Sdrh       ** before now and control would have never reached this point */
10915b1420e0Sdrh       if( ALWAYS(pRHS) ){
1092fbb24d10Sdrh         pRHS->flags &= ~EP_Collate;
1093fbb24d10Sdrh         pRHS->flags |= EP_Generic;
1094fbb24d10Sdrh       }
10951be266baSdrh       A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS);
1096094430ebSdrh     }else{
10971be266baSdrh       A = sqlite3PExpr(pParse, TK_IN, A, 0);
10981be266baSdrh       if( A ){
10991be266baSdrh         A->x.pList = Y;
11001be266baSdrh         sqlite3ExprSetHeightAndFlags(pParse, A);
1101d5d56523Sdanielk1977       }else{
1102633e6d57Sdrh         sqlite3ExprListDelete(pParse->db, Y);
1103d5d56523Sdanielk1977       }
11041be266baSdrh       if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1105094430ebSdrh     }
1106fef5208cSdrh   }
11071be266baSdrh   expr(A) ::= LP select(X) RP. {
11081be266baSdrh     A = sqlite3PExpr(pParse, TK_SELECT, 0, 0);
11091be266baSdrh     sqlite3PExprAddSelect(pParse, A, X);
111051522cd3Sdrh   }
11111be266baSdrh   expr(A) ::= expr(A) in_op(N) LP select(Y) RP.  [IN] {
11121be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
11131be266baSdrh     sqlite3PExprAddSelect(pParse, A, Y);
11141be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
1115fef5208cSdrh   }
11165fbab882Sdrh   expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] {
111717435752Sdrh     SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
11188c0833fbSdrh     Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0);
11199de4757cSdrh     if( E )  sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E);
11201be266baSdrh     A = sqlite3PExpr(pParse, TK_IN, A, 0);
11211be266baSdrh     sqlite3PExprAddSelect(pParse, A, pSelect);
11221be266baSdrh     if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0);
112323b2db23Sdrh   }
11241be266baSdrh   expr(A) ::= EXISTS LP select(Y) RP. {
112543303de9Sdrh     Expr *p;
11261be266baSdrh     p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0);
112708de4f79Sdrh     sqlite3PExprAddSelect(pParse, p, Y);
112851522cd3Sdrh   }
1129154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY
1130fef5208cSdrh 
113117a7f8ddSdrh /* CASE expressions */
11321be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. {
11331be266baSdrh   A = sqlite3PExpr(pParse, TK_CASE, X, 0);
11341be266baSdrh   if( A ){
11351be266baSdrh     A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y;
11361be266baSdrh     sqlite3ExprSetHeightAndFlags(pParse, A);
113753f733c7Sdrh   }else{
1138633e6d57Sdrh     sqlite3ExprListDelete(pParse->db, Y);
1139c5cd1249Sdrh     sqlite3ExprDelete(pParse->db, Z);
114053f733c7Sdrh   }
114117a7f8ddSdrh }
114217a7f8ddSdrh %type case_exprlist {ExprList*}
1143633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
11444dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). {
11451be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Y);
11461be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
114717a7f8ddSdrh }
114817a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
11491be266baSdrh   A = sqlite3ExprListAppend(pParse,0, Y);
11501be266baSdrh   A = sqlite3ExprListAppend(pParse,A, Z);
115117a7f8ddSdrh }
115217a7f8ddSdrh %type case_else {Expr*}
1153633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
11541be266baSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
115517a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
115617a7f8ddSdrh %type case_operand {Expr*}
1157633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
11581be266baSdrh case_operand(A) ::= expr(X).            {A = X; /*A-overwrites-X*/}
115917a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
1160348784efSdrh 
1161348784efSdrh %type exprlist {ExprList*}
1162633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
11639245c243Sdrh %type nexprlist {ExprList*}
1164633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
1165348784efSdrh 
11664dd0d3f8Sdrh exprlist(A) ::= nexprlist(A).
11679245c243Sdrh exprlist(A) ::= .                            {A = 0;}
11684dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y).
11691be266baSdrh     {A = sqlite3ExprListAppend(pParse,A,Y);}
117017435752Sdrh nexprlist(A) ::= expr(Y).
11711be266baSdrh     {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/}
11729245c243Sdrh 
1173a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY
11745fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside
11755fbab882Sdrh ** of parenthesis */
11765fbab882Sdrh %type paren_exprlist {ExprList*}
11775fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
11785fbab882Sdrh paren_exprlist(A) ::= .   {A = 0;}
11795fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP.  {A = X;}
1180a522473cSdrh %endif SQLITE_OMIT_SUBQUERY
11815fbab882Sdrh 
1182cce7d176Sdrh 
1183382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
1184382c0247Sdrh //
1185d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
1186108aa00aSdrh         ON nm(Y) LP sortlist(Z) RP where_opt(W). {
118717435752Sdrh   sqlite3CreateIndex(pParse, &X, &D,
118817435752Sdrh                      sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
118962340f84Sdrh                       &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF);
11909cfcf5d4Sdrh }
1191717e6402Sdrh 
1192717e6402Sdrh %type uniqueflag {int}
11939cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  {A = OE_Abort;}
11949cfcf5d4Sdrh uniqueflag(A) ::= .        {A = OE_None;}
1195348784efSdrh 
1196348784efSdrh 
1197108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList
1198108aa00aSdrh // from a list of identifiers.  The identifier names are in ExprList.a[].zName.
1199108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it
1200108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList().
1201108aa00aSdrh //
1202108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal
1203108aa00aSdrh // used for the arguments to an index.  That is just an historical accident.
1204108aa00aSdrh //
1205108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE:  Some prior versions of SQLite accepted
1206108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate
1207108aa00aSdrh // places - places that might have been stored in the sqlite_master schema.
1208108aa00aSdrh // Those extra features were ignored.  But because they might be in some
1209108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading
1210108aa00aSdrh // historical schemas.
1211108aa00aSdrh //
1212108aa00aSdrh %type eidlist {ExprList*}
1213108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);}
1214108aa00aSdrh %type eidlist_opt {ExprList*}
1215108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
1216108aa00aSdrh 
1217108aa00aSdrh %include {
1218108aa00aSdrh   /* Add a single new term to an ExprList that is used to store a
1219108aa00aSdrh   ** list of identifiers.  Report an error if the ID list contains
1220108aa00aSdrh   ** a COLLATE clause or an ASC or DESC keyword, except ignore the
1221108aa00aSdrh   ** error while parsing a legacy schema.
1222108aa00aSdrh   */
1223108aa00aSdrh   static ExprList *parserAddExprIdListTerm(
1224108aa00aSdrh     Parse *pParse,
1225108aa00aSdrh     ExprList *pPrior,
1226108aa00aSdrh     Token *pIdToken,
1227108aa00aSdrh     int hasCollate,
1228108aa00aSdrh     int sortOrder
1229108aa00aSdrh   ){
1230108aa00aSdrh     ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0);
1231108aa00aSdrh     if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED)
1232108aa00aSdrh         && pParse->db->init.busy==0
1233108aa00aSdrh     ){
1234108aa00aSdrh       sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"",
1235108aa00aSdrh                          pIdToken->n, pIdToken->z);
12360202b29eSdanielk1977     }
1237108aa00aSdrh     sqlite3ExprListSetName(pParse, p, pIdToken, 1);
1238108aa00aSdrh     return p;
1239108aa00aSdrh   }
1240108aa00aSdrh } // end %include
1241108aa00aSdrh 
1242108aa00aSdrh eidlist_opt(A) ::= .                         {A = 0;}
1243108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP.         {A = X;}
12444dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z).  {
12454dd0d3f8Sdrh   A = parserAddExprIdListTerm(pParse, A, &Y, C, Z);
1246108aa00aSdrh }
1247108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). {
1248cf82f0d3Sdrh   A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/
12490202b29eSdanielk1977 }
12500202b29eSdanielk1977 
1251108aa00aSdrh %type collate {int}
1252108aa00aSdrh collate(C) ::= .              {C = 0;}
1253108aa00aSdrh collate(C) ::= COLLATE ids.   {C = 1;}
1254a34001c9Sdrh 
1255348784efSdrh 
12568aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
1257382c0247Sdrh //
12584d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X).   {sqlite3DropIndex(pParse, X, E);}
1259982cef7eSdrh 
1260382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
1261382c0247Sdrh //
1262154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM
1263fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
12649ef5e770Sdrh cmd ::= VACUUM.                {sqlite3Vacuum(pParse,0);}
12659ef5e770Sdrh cmd ::= VACUUM nm(X).          {sqlite3Vacuum(pParse,&X);}
1266fdbcdee5Sdrh %endif  SQLITE_OMIT_ATTACH
1267154d4b24Sdrh %endif  SQLITE_OMIT_VACUUM
1268f57b14a6Sdrh 
1269382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
1270382c0247Sdrh //
127113d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA
127291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z).                {sqlite3Pragma(pParse,&X,&Z,0,0);}
1273ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y).    {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1274ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
1275ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
1276ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1277ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
1278ada2ee0dSdrh                                              {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
1279ada2ee0dSdrh 
1280cf82f0d3Sdrh nmnum(A) ::= plus_num(A).
1281cf82f0d3Sdrh nmnum(A) ::= nm(A).
1282cf82f0d3Sdrh nmnum(A) ::= ON(A).
1283cf82f0d3Sdrh nmnum(A) ::= DELETE(A).
1284cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A).
1285154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA
1286f59b12fbSdrh %token_class number INTEGER|FLOAT.
12878395b7b6Sdrh plus_num(A) ::= PLUS number(X).       {A = X;}
1288cf82f0d3Sdrh plus_num(A) ::= number(A).
1289f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
1290c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command /////////////////////
1291f0f258b1Sdrh 
1292b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1293b7f9164eSdrh 
1294d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
12954b59ab5eSdrh   Token all;
12964b59ab5eSdrh   all.z = A.z;
1297b27b7f5dSdrh   all.n = (int)(Z.z - A.z) + Z.n;
12984adee20fSdanielk1977   sqlite3FinishTrigger(pParse, S, &all);
1299f0f258b1Sdrh }
1300f0f258b1Sdrh 
1301fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
1302fdd48a76Sdrh                     trigger_time(C) trigger_event(D)
130360218d2aSdrh                     ON fullname(E) foreach_clause when_clause(G). {
130460218d2aSdrh   sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
1305cf82f0d3Sdrh   A = (Z.n==0?B:Z); /*A-overwrites-T*/
1306c3f9bad2Sdanielk1977 }
1307c3f9bad2Sdanielk1977 
1308c3f9bad2Sdanielk1977 %type trigger_time {int}
13096559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X).  { A = @X; /*A-overwrites-X*/ }
1310c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
1311c3f9bad2Sdanielk1977 trigger_time(A) ::= .            { A = TK_BEFORE; }
1312c3f9bad2Sdanielk1977 
1313ad3cab52Sdrh %type trigger_event {struct TrigEvent}
1314633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
1315cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X).   {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
1316cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X).          {A.a = @X; /*A-overwrites-X*/ A.b = 0;}
131781eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;}
1318c3f9bad2Sdanielk1977 
131960218d2aSdrh foreach_clause ::= .
132060218d2aSdrh foreach_clause ::= FOR EACH ROW.
1321c3f9bad2Sdanielk1977 
1322c3f9bad2Sdanielk1977 %type when_clause {Expr*}
1323633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
1324c3f9bad2Sdanielk1977 when_clause(A) ::= .             { A = 0; }
13251be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; }
1326c3f9bad2Sdanielk1977 
1327c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*}
1328633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
13294dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. {
13304dd0d3f8Sdrh   assert( A!=0 );
13314dd0d3f8Sdrh   A->pLast->pNext = X;
13324dd0d3f8Sdrh   A->pLast = X;
1333a69d9168Sdrh }
13344dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. {
13354dd0d3f8Sdrh   assert( A!=0 );
13364dd0d3f8Sdrh   A->pLast = A;
133781238966Sdrh }
1338c3f9bad2Sdanielk1977 
1339b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
1340b1819a0bSdrh // within a trigger.  The table to INSERT, UPDATE, or DELETE is always in
1341b1819a0bSdrh // the same database as the table that the trigger fires on.
1342b1819a0bSdrh //
1343b1819a0bSdrh %type trnm {Token}
13444dd0d3f8Sdrh trnm(A) ::= nm(A).
1345b1819a0bSdrh trnm(A) ::= nm DOT nm(X). {
1346b1819a0bSdrh   A = X;
1347b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1348b1819a0bSdrh         "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
1349b1819a0bSdrh         "statements within triggers");
1350b1819a0bSdrh }
1351b1819a0bSdrh 
1352b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
1353b1819a0bSdrh // statements within triggers.  We make a specific error message for this
1354b1819a0bSdrh // since it is an exception to the default grammar rules.
1355b1819a0bSdrh //
1356b1819a0bSdrh tridxby ::= .
1357b1819a0bSdrh tridxby ::= INDEXED BY nm. {
1358b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1359b1819a0bSdrh         "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
1360b1819a0bSdrh         "within triggers");
1361b1819a0bSdrh }
1362b1819a0bSdrh tridxby ::= NOT INDEXED. {
1363b1819a0bSdrh   sqlite3ErrorMsg(pParse,
1364b1819a0bSdrh         "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
1365b1819a0bSdrh         "within triggers");
1366b1819a0bSdrh }
1367b1819a0bSdrh 
1368b1819a0bSdrh 
1369b1819a0bSdrh 
1370c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*}
1371633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
1372c3f9bad2Sdanielk1977 // UPDATE
1373b1819a0bSdrh trigger_cmd(A) ::=
1374f259df5fSdrh    UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E).
1375f259df5fSdrh    {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R, B.z, E);}
1376c3f9bad2Sdanielk1977 
1377c3f9bad2Sdanielk1977 // INSERT
1378f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO
1379f259df5fSdrh                       trnm(X) idlist_opt(F) select(S) scanpt(Z).
1380f259df5fSdrh    {A = sqlite3TriggerInsertStep(pParse->db,&X,F,S,R,B,Z);/*A-overwrites-R*/}
1381c3f9bad2Sdanielk1977 
1382c3f9bad2Sdanielk1977 // DELETE
1383f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E).
1384f259df5fSdrh    {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y, B.z, E);}
1385c3f9bad2Sdanielk1977 
1386c3f9bad2Sdanielk1977 // SELECT
1387f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E).
1388f259df5fSdrh    {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/}
1389c3f9bad2Sdanielk1977 
13906f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs
13911be266baSdrh expr(A) ::= RAISE LP IGNORE RP.  {
13921be266baSdrh   A = sqlite3PExpr(pParse, TK_RAISE, 0, 0);
13931be266baSdrh   if( A ){
13941be266baSdrh     A->affinity = OE_Ignore;
13954b59ab5eSdrh   }
13968aa34ae0Sdrh }
13971be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP.  {
13981be266baSdrh   A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1);
13991be266baSdrh   if( A ) {
14001be266baSdrh     A->affinity = (char)T;
14014b59ab5eSdrh   }
14028aa34ae0Sdrh }
1403154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1404b7f9164eSdrh 
140574ad7fe9Sdrh %type raisetype {int}
140674ad7fe9Sdrh raisetype(A) ::= ROLLBACK.  {A = OE_Rollback;}
140774ad7fe9Sdrh raisetype(A) ::= ABORT.     {A = OE_Abort;}
140874ad7fe9Sdrh raisetype(A) ::= FAIL.      {A = OE_Fail;}
140974ad7fe9Sdrh 
14106f34903eSdanielk1977 
1411c3f9bad2Sdanielk1977 ////////////////////////  DROP TRIGGER statement //////////////////////////////
1412b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER
1413fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
1414fdd48a76Sdrh   sqlite3DropTrigger(pParse,X,NOERR);
1415c3f9bad2Sdanielk1977 }
1416154d4b24Sdrh %endif  !SQLITE_OMIT_TRIGGER
1417113088ecSdrh 
1418113088ecSdrh //////////////////////// ATTACH DATABASE file AS name /////////////////////////
1419fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH
1420f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
14211be266baSdrh   sqlite3Attach(pParse, F, D, K);
14221c2d8414Sdrh }
1423fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). {
14241be266baSdrh   sqlite3Detach(pParse, D);
1425fdbcdee5Sdrh }
1426fdbcdee5Sdrh 
1427f744bb56Sdanielk1977 %type key_opt {Expr*}
1428633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
1429f744bb56Sdanielk1977 key_opt(A) ::= .                     { A = 0; }
14301be266baSdrh key_opt(A) ::= KEY expr(X).          { A = X; }
1431113088ecSdrh 
1432113088ecSdrh database_kw_opt ::= DATABASE.
1433113088ecSdrh database_kw_opt ::= .
1434fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH
14354343fea2Sdrh 
14364343fea2Sdrh ////////////////////////// REINDEX collation //////////////////////////////////
14374343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX
14384343fea2Sdrh cmd ::= REINDEX.                {sqlite3Reindex(pParse, 0, 0);}
14394343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y).  {sqlite3Reindex(pParse, &X, &Y);}
1440154d4b24Sdrh %endif  SQLITE_OMIT_REINDEX
14419fd2a9a0Sdanielk1977 
14429f18e8a0Sdrh /////////////////////////////////// ANALYZE ///////////////////////////////////
14439f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE
14449f18e8a0Sdrh cmd ::= ANALYZE.                {sqlite3Analyze(pParse, 0, 0);}
14459f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y).  {sqlite3Analyze(pParse, &X, &Y);}
14469f18e8a0Sdrh %endif
14479f18e8a0Sdrh 
14489fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... ////////////////////////////////
14499fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE
14509fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
14519fd2a9a0Sdanielk1977   sqlite3AlterRenameTable(pParse,X,&Z);
14529fd2a9a0Sdanielk1977 }
1453986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname
1454986dde70Sdrh         ADD kwcolumn_opt columnname(Y) carglist. {
1455986dde70Sdrh   Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n;
145619a8e7e8Sdanielk1977   sqlite3AlterFinishAddColumn(pParse, &Y);
145719a8e7e8Sdanielk1977 }
145819a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). {
14594a642b60Sdrh   disableLookaside(pParse);
146019a8e7e8Sdanielk1977   sqlite3AlterBeginAddColumn(pParse, X);
146119a8e7e8Sdanielk1977 }
146219a8e7e8Sdanielk1977 kwcolumn_opt ::= .
146319a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW.
1464154d4b24Sdrh %endif  SQLITE_OMIT_ALTERTABLE
1465e09daa90Sdrh 
1466e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
1467e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE
1468b9bb7c18Sdrh cmd ::= create_vtab.                       {sqlite3VtabFinishParse(pParse,0);}
1469b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X).  {sqlite3VtabFinishParse(pParse,&X);}
1470b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E)
1471b421b894Sdrh                 nm(X) dbnm(Y) USING nm(Z). {
1472b421b894Sdrh     sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E);
1473b9bb7c18Sdrh }
1474e09daa90Sdrh vtabarglist ::= vtabarg.
1475e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg.
1476b9bb7c18Sdrh vtabarg ::= .                       {sqlite3VtabArgInit(pParse);}
1477b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken.
1478b9bb7c18Sdrh vtabargtoken ::= ANY(X).            {sqlite3VtabArgExtend(pParse,&X);}
1479b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X).  {sqlite3VtabArgExtend(pParse,&X);}
1480b9bb7c18Sdrh lp ::= LP(X).                       {sqlite3VtabArgExtend(pParse,&X);}
1481b9bb7c18Sdrh anylist ::= .
1482aaac8b4eSdrh anylist ::= anylist LP anylist RP.
1483aaac8b4eSdrh anylist ::= anylist ANY.
1484154d4b24Sdrh %endif  SQLITE_OMIT_VIRTUALTABLE
14858b471863Sdrh 
14868b471863Sdrh 
14878b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS ////////////////////////////
14887d562dbeSdan %type with {With*}
14897d562dbeSdan %type wqlist {With*}
14907d562dbeSdan %destructor with {sqlite3WithDelete(pParse->db, $$);}
14914e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);}
14927d562dbeSdan 
14937d562dbeSdan with(A) ::= . {A = 0;}
14948b471863Sdrh %ifndef SQLITE_OMIT_CTE
14957d562dbeSdan with(A) ::= WITH wqlist(W).              { A = W; }
14967d562dbeSdan with(A) ::= WITH RECURSIVE wqlist(W).    { A = W; }
14977d562dbeSdan 
1498108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
1499cf82f0d3Sdrh   A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/
15007d562dbeSdan }
15014dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
15024dd0d3f8Sdrh   A = sqlite3WithAdd(pParse, A, &X, Y, Z);
15038b471863Sdrh }
15048b471863Sdrh %endif  SQLITE_OMIT_CTE
1505