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 27fb32c44eSdrh // An extra argument to the constructor for the parser, which is available 28fb32c44eSdrh // to all actions. 29fb32c44eSdrh %extra_context {Parse *pParse} 30487e262fSdrh 31487e262fSdrh // This code runs whenever there is a syntax error 32487e262fSdrh // 33348784efSdrh %syntax_error { 34128255fcSdrh UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ 356116ee4eSdrh if( TOKEN.z[0] ){ 364adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 376116ee4eSdrh }else{ 386116ee4eSdrh sqlite3ErrorMsg(pParse, "incomplete input"); 396116ee4eSdrh } 40b86ccfb2Sdrh } 418fc3345fSdrh %stack_overflow { 428fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 438fc3345fSdrh } 44487e262fSdrh 45487e262fSdrh // The name of the generated procedure that implements the parser 46487e262fSdrh // is as follows: 474adee20fSdanielk1977 %name sqlite3Parser 48487e262fSdrh 49487e262fSdrh // The following text is included near the beginning of the C source 50487e262fSdrh // code file that implements the parser. 51487e262fSdrh // 52348784efSdrh %include { 53348784efSdrh #include "sqliteInt.h" 549bbca4c1Sdrh 559bbca4c1Sdrh /* 56d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 57d3ec02d3Sdrh ** automaton. 58d3ec02d3Sdrh */ 59d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 60d3ec02d3Sdrh 61d3ec02d3Sdrh /* 628a415d37Sdrh ** Make yytestcase() the same as testcase() 638a415d37Sdrh */ 648a415d37Sdrh #define yytestcase(X) testcase(X) 658a415d37Sdrh 668a415d37Sdrh /* 6782415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null 6882415f2dSdrh ** pointer. 6982415f2dSdrh */ 70644f4c1bSdrh #define YYPARSEFREENEVERNULL 1 7182415f2dSdrh 7282415f2dSdrh /* 73d26cc541Sdrh ** In the amalgamation, the parse.c file generated by lemon and the 74d26cc541Sdrh ** tokenize.c file are concatenated. In that case, sqlite3RunParser() 75d26cc541Sdrh ** has access to the the size of the yyParser object and so the parser 76d26cc541Sdrh ** engine can be allocated from stack. In that case, only the 77d26cc541Sdrh ** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked 78d26cc541Sdrh ** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be 79d26cc541Sdrh ** omitted. 80d26cc541Sdrh */ 81d26cc541Sdrh #ifdef SQLITE_AMALGAMATION 82d26cc541Sdrh # define sqlite3Parser_ENGINEALWAYSONSTACK 1 83d26cc541Sdrh #endif 84d26cc541Sdrh 85d26cc541Sdrh /* 8682415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed 8782415f2dSdrh ** into sqlite3ParserAlloc(). The default is size_t. 8882415f2dSdrh */ 8982415f2dSdrh #define YYMALLOCARGTYPE u64 9082415f2dSdrh 9182415f2dSdrh /* 92ad3cab52Sdrh ** An instance of the following structure describes the event of a 93ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 94ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 95ad3cab52Sdrh ** 96ad3cab52Sdrh ** UPDATE ON (a,b,c) 97ad3cab52Sdrh ** 98ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 99c3f9bad2Sdanielk1977 */ 100ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 101caec2f12Sdrh 10286fb6e17Sdan struct FrameBound { int eType; Expr *pExpr; }; 10386fb6e17Sdan 10425d6543dSdrh /* 1054a642b60Sdrh ** Disable lookaside memory allocation for objects that might be 1064a642b60Sdrh ** shared across database connections. 1074a642b60Sdrh */ 1084a642b60Sdrh static void disableLookaside(Parse *pParse){ 1094a642b60Sdrh pParse->disableLookaside++; 1104a642b60Sdrh pParse->db->lookaside.bDisable++; 1114a642b60Sdrh } 1124a642b60Sdrh 113caec2f12Sdrh } // end %include 114348784efSdrh 115826fb5a3Sdrh // Input is a single SQL command 116c4a3c779Sdrh input ::= cmdlist. 117094b2bbfSdrh cmdlist ::= cmdlist ecmd. 118826fb5a3Sdrh cmdlist ::= ecmd. 119b7f9164eSdrh ecmd ::= SEMI. 1202424aa72Sdrh ecmd ::= cmdx SEMI. 121b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 1222424aa72Sdrh ecmd ::= explain cmdx. 1238549d55eSdrh explain ::= EXPLAIN. { pParse->explain = 1; } 1248549d55eSdrh explain ::= EXPLAIN QUERY PLAN. { pParse->explain = 2; } 125154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 126200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 127348784efSdrh 128382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 129c4a3c779Sdrh // 130fa86c412Sdrh 131684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 132c4a3c779Sdrh trans_opt ::= . 133c4a3c779Sdrh trans_opt ::= TRANSACTION. 1345ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 135684917c2Sdrh %type transtype {int} 136684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 137cf82f0d3Sdrh transtype(A) ::= DEFERRED(X). {A = @X; /*A-overwrites-X*/} 138cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/} 139cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/} 14007a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt. {sqlite3EndTransaction(pParse,@X);} 14107a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt. {sqlite3EndTransaction(pParse,@X);} 142c4a3c779Sdrh 143fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 144fd7f0452Sdanielk1977 savepoint_opt ::= . 145fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 146fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 147fd7f0452Sdanielk1977 } 148fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 149fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 150fd7f0452Sdanielk1977 } 151fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 152fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 153fd7f0452Sdanielk1977 } 154fd7f0452Sdanielk1977 155382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 156348784efSdrh // 157348784efSdrh cmd ::= create_table create_table_args. 158d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 159f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 160969fa7c1Sdrh } 161dabd04c6Sdrh createkw(A) ::= CREATE(A). {disableLookaside(pParse);} 162dabd04c6Sdrh 163faa59554Sdrh %type ifnotexists {int} 164faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 165faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 166f57b3399Sdrh %type temp {int} 16753c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 168d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 169154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 170d24cc427Sdrh temp(A) ::= . {A = 0;} 1715969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). { 1725969da4aSdrh sqlite3EndTable(pParse,&X,&E,F,0); 173969fa7c1Sdrh } 174969fa7c1Sdrh create_table_args ::= AS select(S). { 1755969da4aSdrh sqlite3EndTable(pParse,0,0,0,S); 176633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 177969fa7c1Sdrh } 1783334d089Sdrh %type table_options {int} 1795969da4aSdrh table_options(A) ::= . {A = 0;} 1805969da4aSdrh table_options(A) ::= WITHOUT nm(X). { 1815969da4aSdrh if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){ 182fccda8a1Sdrh A = TF_WithoutRowid | TF_NoVisibleRowid; 1835969da4aSdrh }else{ 1845969da4aSdrh A = 0; 1855969da4aSdrh sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); 1865969da4aSdrh } 1875969da4aSdrh } 188986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist. 189986dde70Sdrh columnlist ::= columnname carglist. 1902881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);} 191c4a3c779Sdrh 1926a8700b9Sdrh // Declare some tokens early in order to influence their values, to 1936a8700b9Sdrh // improve performance and reduce the executable size. The goal here is 1946a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric 1956a8700b9Sdrh // values that are early enough so that all jump operations are clustered 1966a8700b9Sdrh // at the beginning, but also so that the comparison tokens NE through GE 1976a8700b9Sdrh // are as large as possible so that they are near to FUNCTION, which is a 1986a8700b9Sdrh // token synthesized by addopcodes.tcl. 1996a8700b9Sdrh // 2006a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST. 2016a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL. 2026a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2036a8700b9Sdrh %token GT LE LT GE ESCAPE. 2046a8700b9Sdrh 20531d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 20631d6fd55Sdrh // fallback to ID if they will not parse as their original value. 20731d6fd55Sdrh // This obviates the need for the "id" nonterminal. 20831d6fd55Sdrh // 20931d6fd55Sdrh %fallback ID 21031d6fd55Sdrh ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 2110a6259f5Sdrh CONFLICT DATABASE DEFERRED DESC DETACH DO 2126cd7d489Sdrh EACH END EXCLUSIVE EXPLAIN FAIL FOR 21331d6fd55Sdrh IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 21486fb6e17Sdan QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS 21531d6fd55Sdrh ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT 21631d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 21731d6fd55Sdrh EXCEPT INTERSECT UNION 21831d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 2193773c25fSdrh %ifndef SQLITE_OMIT_WINDOWFUNC 2206e2210e0Sdan CURRENT FOLLOWING PARTITION PRECEDING RANGE UNBOUNDED 2213773c25fSdrh %endif SQLITE_OMIT_WINDOWFUNC 22231d6fd55Sdrh REINDEX RENAME CTIME_KW IF 22331d6fd55Sdrh . 22431d6fd55Sdrh %wildcard ANY. 22531d6fd55Sdrh 226f7b5496eSdrh // Define operator precedence early so that this is the first occurrence 2272d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2282d3917daSdrh // causes them to be assigned integer values that are close together, 2292d3917daSdrh // which keeps parser tables smaller. 2302d3917daSdrh // 231f2bc013cSdrh // The token values assigned to these symbols is determined by the order 232f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 233f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 234f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 235f2bc013cSdrh // constraint. 236f2bc013cSdrh // 2372d3917daSdrh %left OR. 2382d3917daSdrh %left AND. 2392d3917daSdrh %right NOT. 24003bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2419a43267bSdrh %left GT LE LT GE. 2427c6303c0Sdanielk1977 %right ESCAPE. 2432d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2442d3917daSdrh %left PLUS MINUS. 2452d3917daSdrh %left STAR SLASH REM. 246a34001c9Sdrh %left CONCAT. 247a34001c9Sdrh %left COLLATE. 2487ba5bc5bSdrh %right BITNOT. 24926cf56f8Sdrh %nonassoc ON. 2502d3917daSdrh 2517cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several 2527cc84c2cSdrh // keywords. Any non-standard keyword can also be an identifier. 2537cc84c2cSdrh // 2547cc84c2cSdrh %token_class id ID|INDEXED. 2557cc84c2cSdrh 2567cc84c2cSdrh 257c4a3c779Sdrh // And "ids" is an identifer-or-string. 258c4a3c779Sdrh // 259f59b12fbSdrh %token_class ids ID|STRING. 260c4a3c779Sdrh 2615ad1a6c8Sdrh // The name of a column or table can be any of the following: 2625ad1a6c8Sdrh // 2635ad1a6c8Sdrh %type nm {Token} 2644dd0d3f8Sdrh nm(A) ::= id(A). 2654dd0d3f8Sdrh nm(A) ::= STRING(A). 2664dd0d3f8Sdrh nm(A) ::= JOIN_KW(A). 2675ad1a6c8Sdrh 268986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such 269487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 270487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 271487e262fSdrh // 272487e262fSdrh %type typetoken {Token} 273986dde70Sdrh typetoken(A) ::= . {A.n = 0; A.z = 0;} 2744dd0d3f8Sdrh typetoken(A) ::= typename(A). 2754dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). { 2764dd0d3f8Sdrh A.n = (int)(&Y.z[Y.n] - A.z); 277487e262fSdrh } 2784dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). { 2794dd0d3f8Sdrh A.n = (int)(&Y.z[Y.n] - A.z); 280487e262fSdrh } 281382c0247Sdrh %type typename {Token} 28259ff4251Sdan typename(A) ::= ids(A). 28359ff4251Sdan typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);} 28460218d2aSdrh signed ::= plus_num. 28560218d2aSdrh signed ::= minus_num. 286487e262fSdrh 2871be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the 2881be266baSdrh // input text just past the last token that has been shifted into 2891be266baSdrh // the parser. By surrounding some phrase in the grammar with two 2901be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase. 2911be266baSdrh // For example: 2921be266baSdrh // 2931be266baSdrh // something ::= .... scanpt(A) phrase scanpt(Z). 2941be266baSdrh // 2951be266baSdrh // The text that is parsed as "phrase" is a string starting at A 2961be266baSdrh // and containing (int)(Z-A) characters. There might be some extra 2971be266baSdrh // whitespace on either end of the text, but that can be removed in 2981be266baSdrh // post-processing, if needed. 2991be266baSdrh // 3001be266baSdrh %type scanpt {const char*} 3011be266baSdrh scanpt(A) ::= . { 302f259df5fSdrh assert( yyLookahead!=YYNOCODE ); 3031be266baSdrh A = yyLookaheadToken.z; 3041be266baSdrh } 3051be266baSdrh 306487e262fSdrh // "carglist" is a list of additional constraints that come after the 307487e262fSdrh // column name and column type in a CREATE TABLE statement. 308487e262fSdrh // 3094dc330ddSdrh carglist ::= carglist ccons. 310348784efSdrh carglist ::= . 3114dc330ddSdrh ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 3121be266baSdrh ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z). 3131be266baSdrh {sqlite3AddDefaultValue(pParse,X,A,Z);} 3141be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z). 3151be266baSdrh {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);} 3161be266baSdrh ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z). 3171be266baSdrh {sqlite3AddDefaultValue(pParse,X,A.z,Z);} 3181be266baSdrh ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z). { 3191be266baSdrh Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0); 3201be266baSdrh sqlite3AddDefaultValue(pParse,p,A.z,Z); 3217977a17fSdanielk1977 } 3221be266baSdrh ccons ::= DEFAULT scanpt id(X). { 3231be266baSdrh Expr *p = tokenExpr(pParse, TK_STRING, X); 324d7fd899eSdrh if( p ){ 325171d16bbSdrh sqlite3ExprIdToTrueFalse(p); 32696acafbeSdrh testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) ); 327d7fd899eSdrh } 3281be266baSdrh sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n); 3297977a17fSdanielk1977 } 330348784efSdrh 331382c0247Sdrh // In addition to the type name, we also care about the primary key and 332382c0247Sdrh // UNIQUE constraints. 333348784efSdrh // 3340d316a40Sdrh ccons ::= NULL onconf. 3354adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 336fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 337fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 33862340f84Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0, 33962340f84Sdrh SQLITE_IDXTYPE_UNIQUE);} 3401be266baSdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X);} 341108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R). 3424adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 3434adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 34459ff4251Sdan ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 34504738cb9Sdrh 346205f48e6Sdrh // The optional AUTOINCREMENT keyword 347205f48e6Sdrh %type autoinc {int} 348205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3492958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 350205f48e6Sdrh 351c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 352c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 353c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 354c2eef3b3Sdrh // check fails. 35504738cb9Sdrh // 356c2eef3b3Sdrh %type refargs {int} 357fcf486c3Sdrh refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */} 3584dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; } 359c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 360c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 361c29c5aa1Sdrh refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; } 362c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 363c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 364c2eef3b3Sdrh %type refact {int} 365fcf486c3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */} 366fcf486c3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */} 367fcf486c3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */} 368fcf486c3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 369fcf486c3Sdrh refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 370c2eef3b3Sdrh %type defer_subclause {int} 3711da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 372c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 373c2eef3b3Sdrh %type init_deferred_pred_opt {int} 374c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 375c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 376c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 377348784efSdrh 37819a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 3794dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist. 380ab35eaedSdrh conslist ::= conslist tconscomma tcons. 381ab35eaedSdrh conslist ::= tcons. 382ab35eaedSdrh tconscomma ::= COMMA. {pParse->constraintName.n = 0;} 383ab35eaedSdrh tconscomma ::= . 384ab35eaedSdrh tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 385108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R). 386fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 387108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R). 38862340f84Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0, 38962340f84Sdrh SQLITE_IDXTYPE_UNIQUE);} 390b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 3911be266baSdrh {sqlite3AddCheckConstraint(pParse,E);} 392108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP 393108aa00aSdrh REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3944adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3954adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 396c2eef3b3Sdrh } 397c2eef3b3Sdrh %type defer_subclause_opt {int} 398c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 3994dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A). 4009cfcf5d4Sdrh 4019cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 4029cfcf5d4Sdrh // default behavior when there is a constraint conflict. 4039cfcf5d4Sdrh // 4049cfcf5d4Sdrh %type onconf {int} 4053334d089Sdrh %type orconf {int} 4061c92853dSdrh %type resolvetype {int} 4071c92853dSdrh onconf(A) ::= . {A = OE_Default;} 4081c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 4091c92853dSdrh orconf(A) ::= . {A = OE_Default;} 4103334d089Sdrh orconf(A) ::= OR resolvetype(X). {A = X;} 4114dd0d3f8Sdrh resolvetype(A) ::= raisetype(A). 4121c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 4131c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 414348784efSdrh 415382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 416348784efSdrh // 417a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 418a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 419a8858103Sdanielk1977 } 420a073384fSdrh %type ifexists {int} 421a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 422a073384fSdrh ifexists(A) ::= . {A = 0;} 423348784efSdrh 424a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 425a76b5dfcSdrh // 426b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 427108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C) 4288981b904Sdrh AS select(S). { 4298981b904Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E); 430a76b5dfcSdrh } 431a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 432a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 433a76b5dfcSdrh } 434154d4b24Sdrh %endif SQLITE_OMIT_VIEW 435a76b5dfcSdrh 436382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 437348784efSdrh // 4387d562dbeSdan cmd ::= select(X). { 439edf83d1eSdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; 4407d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 441633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 4429bb61fe7Sdrh } 443efb7251dSdrh 4449bb61fe7Sdrh %type select {Select*} 445633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 4467d562dbeSdan %type selectnowith {Select*} 4477d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);} 44882c3d636Sdrh %type oneselect {Select*} 449633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4509bb61fe7Sdrh 451772460fdSdrh %include { 452772460fdSdrh /* 453772460fdSdrh ** For a compound SELECT statement, make sure p->pPrior->pNext==p for 454772460fdSdrh ** all elements in the list. And make sure list length does not exceed 455772460fdSdrh ** SQLITE_LIMIT_COMPOUND_SELECT. 456772460fdSdrh */ 457e318a7f8Sdrh static void parserDoubleLinkSelect(Parse *pParse, Select *p){ 458d227a291Sdrh if( p->pPrior ){ 459772460fdSdrh Select *pNext = 0, *pLoop; 460772460fdSdrh int mxSelect, cnt = 0; 461d227a291Sdrh for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ 462d227a291Sdrh pLoop->pNext = pNext; 463d227a291Sdrh pLoop->selFlags |= SF_Compound; 464d227a291Sdrh } 465772460fdSdrh if( (p->selFlags & SF_MultiValue)==0 && 466772460fdSdrh (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && 467772460fdSdrh cnt>mxSelect 468a0c01768Sdrh ){ 469d227a291Sdrh sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); 470d227a291Sdrh } 471d227a291Sdrh } 472772460fdSdrh } 473772460fdSdrh } 474772460fdSdrh 4756a8b94e2Sdrh %ifndef SQLITE_OMIT_CTE 476a5746e03Sdrh select(A) ::= WITH wqlist(W) selectnowith(X). { 477772460fdSdrh Select *p = X; 478772460fdSdrh if( p ){ 479772460fdSdrh p->pWith = W; 480772460fdSdrh parserDoubleLinkSelect(pParse, p); 481a9f5c13dSdan }else{ 482a9f5c13dSdan sqlite3WithDelete(pParse->db, W); 483a9f5c13dSdan } 484a5746e03Sdrh A = p; 485a5746e03Sdrh } 486a5746e03Sdrh select(A) ::= WITH RECURSIVE wqlist(W) selectnowith(X). { 487a5746e03Sdrh Select *p = X; 488a5746e03Sdrh if( p ){ 489a5746e03Sdrh p->pWith = W; 490a5746e03Sdrh parserDoubleLinkSelect(pParse, p); 491a5746e03Sdrh }else{ 492a5746e03Sdrh sqlite3WithDelete(pParse->db, W); 493a5746e03Sdrh } 494a5746e03Sdrh A = p; 495a5746e03Sdrh } 4966a8b94e2Sdrh %endif /* SQLITE_OMIT_CTE */ 497a5746e03Sdrh select(A) ::= selectnowith(X). { 498a5746e03Sdrh Select *p = X; 499a5746e03Sdrh if( p ){ 500a5746e03Sdrh parserDoubleLinkSelect(pParse, p); 501a5746e03Sdrh } 502a5746e03Sdrh A = p; /*A-overwrites-X*/ 503a9f5c13dSdan } 5047d562dbeSdan 5054dd0d3f8Sdrh selectnowith(A) ::= oneselect(A). 506b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 5074dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z). { 508c0bf493eSdrh Select *pRhs = Z; 5094dd0d3f8Sdrh Select *pLhs = A; 510c0bf493eSdrh if( pRhs && pRhs->pPrior ){ 511c0bf493eSdrh SrcList *pFrom; 512c0bf493eSdrh Token x; 513c0bf493eSdrh x.n = 0; 514772460fdSdrh parserDoubleLinkSelect(pParse, pRhs); 515c0bf493eSdrh pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); 5168c0833fbSdrh pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); 517c0bf493eSdrh } 518c0bf493eSdrh if( pRhs ){ 519c0bf493eSdrh pRhs->op = (u8)Y; 52000d5ab74Sdrh pRhs->pPrior = pLhs; 52100d5ab74Sdrh if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; 522772460fdSdrh pRhs->selFlags &= ~SF_MultiValue; 523d58d3278Sdrh if( Y!=TK_ALL ) pParse->hasCompound = 1; 52443b78826Sdrh }else{ 52500d5ab74Sdrh sqlite3SelectDelete(pParse->db, pLhs); 526daffd0e5Sdrh } 527c0bf493eSdrh A = pRhs; 52882c3d636Sdrh } 5290a36c57eSdrh %type multiselect_op {int} 530cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP; /*A-overwrites-OP*/} 5310a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 532cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP; /*A-overwrites-OP*/} 533154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 534abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y) 53567a9b8edSdan groupby_opt(P) having_opt(Q) 53667a9b8edSdan %ifndef SQLITE_OMIT_WINDOWFUNC 53767a9b8edSdan windowdefn_opt(R) 53867a9b8edSdan %endif 539e3bf632cSdan orderby_opt(Z) limit_opt(L). { 54043303de9Sdrh #if SELECTTRACE_ENABLED 54143303de9Sdrh Token s = S; /*A-overwrites-S*/ 54243303de9Sdrh #endif 5438c0833fbSdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L); 54467a9b8edSdan #ifndef SQLITE_OMIT_WINDOWFUNC 5456fde1799Sdan if( A ){ 5466fde1799Sdan A->pWinDefn = R; 5476fde1799Sdan }else{ 5486fde1799Sdan sqlite3WindowListDelete(pParse->db, R); 5496fde1799Sdan } 55067a9b8edSdan #endif // SQLITE_OMIT_WINDOWFUNC 551abd4c723Sdrh #if SELECTTRACE_ENABLED 552eb9b884cSdrh /* Populate the Select.zSelName[] string that is used to help with 553abd4c723Sdrh ** query planner debugging, to differentiate between multiple Select 554abd4c723Sdrh ** objects in a complex query. 555abd4c723Sdrh ** 556abd4c723Sdrh ** If the SELECT keyword is immediately followed by a C-style comment 557abd4c723Sdrh ** then extract the first few alphanumeric characters from within that 558eb9b884cSdrh ** comment to be the zSelName value. Otherwise, the label is #N where 559abd4c723Sdrh ** is an integer that is incremented with each SELECT statement seen. 560abd4c723Sdrh */ 561abd4c723Sdrh if( A!=0 ){ 56243303de9Sdrh const char *z = s.z+6; 563abd4c723Sdrh int i; 564cfd74700Sdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName,"#%d",++pParse->nSelect); 565abd4c723Sdrh while( z[0]==' ' ) z++; 566abd4c723Sdrh if( z[0]=='/' && z[1]=='*' ){ 567abd4c723Sdrh z += 2; 568abd4c723Sdrh while( z[0]==' ' ) z++; 569abd4c723Sdrh for(i=0; sqlite3Isalnum(z[i]); i++){} 570eb9b884cSdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z); 571abd4c723Sdrh } 572abd4c723Sdrh } 573abd4c723Sdrh #endif /* SELECTRACE_ENABLED */ 5749bb61fe7Sdrh } 5754dd0d3f8Sdrh oneselect(A) ::= values(A). 57675593d96Sdrh 57775593d96Sdrh %type values {Select*} 57875593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);} 57975593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. { 5808c0833fbSdrh A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0); 58175593d96Sdrh } 5824dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. { 5834dd0d3f8Sdrh Select *pRight, *pLeft = A; 5848c0833fbSdrh pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0); 585f3151f0aSdrh if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; 58675593d96Sdrh if( pRight ){ 58775593d96Sdrh pRight->op = TK_ALL; 588772460fdSdrh pRight->pPrior = pLeft; 58975593d96Sdrh A = pRight; 59075593d96Sdrh }else{ 591772460fdSdrh A = pLeft; 59275593d96Sdrh } 59375593d96Sdrh } 5949bb61fe7Sdrh 5959bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 5969bb61fe7Sdrh // present and false (0) if it is not. 5979bb61fe7Sdrh // 5983334d089Sdrh %type distinct {int} 599832ee3d4Sdrh distinct(A) ::= DISTINCT. {A = SF_Distinct;} 6007cea7f95Sdrh distinct(A) ::= ALL. {A = SF_All;} 601efb7251dSdrh distinct(A) ::= . {A = 0;} 602348784efSdrh 6039bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 6047c917d19Sdrh // values of the SELECT statement. The "*" in statements like 6057c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 6061a1d3cd2Sdrh // opcode of TK_ASTERISK. 6079bb61fe7Sdrh // 608348784efSdrh %type selcollist {ExprList*} 609633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 610348784efSdrh %type sclp {ExprList*} 611633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 6124dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA. 613348784efSdrh sclp(A) ::= . {A = 0;} 6141be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y). { 6151be266baSdrh A = sqlite3ExprListAppend(pParse, A, X); 616b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 6171be266baSdrh sqlite3ExprListSetSpan(pParse,A,B,Z); 61801f3f253Sdrh } 619d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. { 6201a1d3cd2Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); 6214dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse, A, p); 6227c917d19Sdrh } 6231be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. { 624abfd35eaSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); 625abfd35eaSdrh Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 626abfd35eaSdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); 6274dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse,A, pDot); 62854473229Sdrh } 62901f3f253Sdrh 63001f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 63101f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 63201f3f253Sdrh // 63301f3f253Sdrh %type as {Token} 6345ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 6354dd0d3f8Sdrh as(X) ::= ids(X). 636986dde70Sdrh as(X) ::= . {X.n = 0; X.z = 0;} 6379bb61fe7Sdrh 638348784efSdrh 639ad3cab52Sdrh %type seltablist {SrcList*} 640633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 641ad3cab52Sdrh %type stl_prefix {SrcList*} 642633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 643ad3cab52Sdrh %type from {SrcList*} 644633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 645348784efSdrh 64601f3f253Sdrh // A complete FROM clause. 64701f3f253Sdrh // 64817435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 64961dfc31dSdrh from(A) ::= FROM seltablist(X). { 65061dfc31dSdrh A = X; 65161dfc31dSdrh sqlite3SrcListShiftJoinType(A); 65261dfc31dSdrh } 65301f3f253Sdrh 65401f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 65501f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 65601f3f253Sdrh // 6574dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y). { 6588a48b9c0Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y; 65901f3f253Sdrh } 660348784efSdrh stl_prefix(A) ::= . {A = 0;} 6614dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I) 662e9240418Sdrh on_opt(N) using_opt(U). { 6634dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U); 664b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 66501f3f253Sdrh } 6664dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) 66701d230ceSdrh on_opt(N) using_opt(U). { 6684dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U); 66901d230ceSdrh sqlite3SrcListFuncArgs(pParse, A, E); 67001d230ceSdrh } 67151522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 6724dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) LP select(S) RP 673b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 6744dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U); 67522f70c32Sdrh } 6764dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP 677fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 6784dd0d3f8Sdrh if( A==0 && Z.n==0 && N==0 && U==0 ){ 679fbdc7f69Sdrh A = F; 680832ee3d4Sdrh }else if( F->nSrc==1 ){ 6814dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U); 682832ee3d4Sdrh if( A ){ 683832ee3d4Sdrh struct SrcList_item *pNew = &A->a[A->nSrc-1]; 684832ee3d4Sdrh struct SrcList_item *pOld = F->a; 685832ee3d4Sdrh pNew->zName = pOld->zName; 686832ee3d4Sdrh pNew->zDatabase = pOld->zDatabase; 6873c449c6bSdrh pNew->pSelect = pOld->pSelect; 688832ee3d4Sdrh pOld->zName = pOld->zDatabase = 0; 6893c449c6bSdrh pOld->pSelect = 0; 690832ee3d4Sdrh } 691832ee3d4Sdrh sqlite3SrcListDelete(pParse->db, F); 692fbdc7f69Sdrh }else{ 693fbdc7f69Sdrh Select *pSubquery; 694fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 6958c0833fbSdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0); 6964dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U); 697fbdc7f69Sdrh } 698fbdc7f69Sdrh } 699154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 700b733d037Sdrh 701113088ecSdrh %type dbnm {Token} 702113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 703113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 704113088ecSdrh 70574ad7fe9Sdrh %type fullname {SrcList*} 706633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 707a5746e03Sdrh fullname(A) ::= nm(X). 708a5746e03Sdrh {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/} 709a5746e03Sdrh fullname(A) ::= nm(X) DOT nm(Y). 710cf82f0d3Sdrh {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/} 71174ad7fe9Sdrh 7125e3a6ebfSdrh %type xfullname {SrcList*} 7135e3a6ebfSdrh %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);} 7145e3a6ebfSdrh xfullname(A) ::= nm(X). 7155e3a6ebfSdrh {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/} 7165e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y). 7175e3a6ebfSdrh {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/} 7185e3a6ebfSdrh xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z). { 7195e3a6ebfSdrh A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/ 7205e3a6ebfSdrh if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); 7215e3a6ebfSdrh } 7225e3a6ebfSdrh xfullname(A) ::= nm(X) AS nm(Z). { 7235e3a6ebfSdrh A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/ 7245e3a6ebfSdrh if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); 7255e3a6ebfSdrh } 7265e3a6ebfSdrh 72701f3f253Sdrh %type joinop {int} 728fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 729cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN. 730cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,0,0); /*X-overwrites-A*/} 731cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN. 732cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/} 7335ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 734cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/} 73501f3f253Sdrh 73626cf56f8Sdrh // There is a parsing abiguity in an upsert statement that uses a 73726cf56f8Sdrh // SELECT on the RHS of a the INSERT: 73826cf56f8Sdrh // 73926cf56f8Sdrh // INSERT INTO tab SELECT * FROM aaa JOIN bbb ON CONFLICT ... 74026cf56f8Sdrh // here ----^^ 74126cf56f8Sdrh // 74226cf56f8Sdrh // When the ON token is encountered, the parser does not know if it is 74326cf56f8Sdrh // the beginning of an ON CONFLICT clause, or the beginning of an ON 74426cf56f8Sdrh // clause associated with the JOIN. The conflict is resolved in favor 74526cf56f8Sdrh // of the JOIN. If an ON CONFLICT clause is intended, insert a dummy 74626cf56f8Sdrh // WHERE clause in between, like this: 74726cf56f8Sdrh // 74826cf56f8Sdrh // INSERT INTO tab SELECT * FROM aaa JOIN bbb WHERE true ON CONFLICT ... 74926cf56f8Sdrh // 75026cf56f8Sdrh // The [AND] and [OR] precedence marks in the rules for on_opt cause the 75126cf56f8Sdrh // ON in this context to always be interpreted as belonging to the JOIN. 75226cf56f8Sdrh // 75301f3f253Sdrh %type on_opt {Expr*} 754633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 7551be266baSdrh on_opt(N) ::= ON expr(E). {N = E;} 75626cf56f8Sdrh on_opt(N) ::= . [OR] {N = 0;} 75701f3f253Sdrh 75885574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 75985574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 76085574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 76185574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 76285574e31Sdanielk1977 // in the token. 76385574e31Sdanielk1977 // 76485574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 765b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 76685574e31Sdanielk1977 // recognizes and interprets this as a special case. 76785574e31Sdanielk1977 // 76885574e31Sdanielk1977 %type indexed_opt {Token} 76985574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 77085574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 77185574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 77285574e31Sdanielk1977 77301f3f253Sdrh %type using_opt {IdList*} 774633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 77581eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP. {U = L;} 77601f3f253Sdrh using_opt(U) ::= . {U = 0;} 77701f3f253Sdrh 77801f3f253Sdrh 779348784efSdrh %type orderby_opt {ExprList*} 780633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 781108aa00aSdrh 782108aa00aSdrh // the sortlist non-terminal stores a list of expression where each 783108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the 784108aa00aSdrh // sort order. 785108aa00aSdrh // 786348784efSdrh %type sortlist {ExprList*} 787633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 788348784efSdrh 789348784efSdrh orderby_opt(A) ::= . {A = 0;} 790348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 7914dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). { 7921be266baSdrh A = sqlite3ExprListAppend(pParse,A,Y); 793bc622bc0Sdrh sqlite3ExprListSetSortOrder(A,Z); 794348784efSdrh } 7958395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). { 7961be266baSdrh A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/ 797bc622bc0Sdrh sqlite3ExprListSetSortOrder(A,Z); 798348784efSdrh } 799348784efSdrh 800348784efSdrh %type sortorder {int} 801348784efSdrh 8028e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 8038e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 804bc622bc0Sdrh sortorder(A) ::= . {A = SQLITE_SO_UNDEFINED;} 805348784efSdrh 8062282792aSdrh %type groupby_opt {ExprList*} 807633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 8082282792aSdrh groupby_opt(A) ::= . {A = 0;} 8099245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 8102282792aSdrh 8112282792aSdrh %type having_opt {Expr*} 812633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 8132282792aSdrh having_opt(A) ::= . {A = 0;} 8141be266baSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 8152282792aSdrh 8168c0833fbSdrh %type limit_opt {Expr*} 81715926590Sdrh 81815926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 81915926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 82015926590Sdrh // rule for SELECT statements. As soon as the rule that create the 82115926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 82215926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 82315926590Sdrh // except as a transient. So there is never anything to destroy. 82415926590Sdrh // 8258c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);} 8268c0833fbSdrh limit_opt(A) ::= . {A = 0;} 8278c0833fbSdrh limit_opt(A) ::= LIMIT expr(X). 8281be266baSdrh {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);} 829a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 8301be266baSdrh {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);} 831a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 8321be266baSdrh {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);} 8339bbca4c1Sdrh 834382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 835382c0247Sdrh // 836273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 8375e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W) 838931577f1Sdrh orderby_opt(O) limit_opt(L). { 839b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 8408c0833fbSdrh sqlite3DeleteFrom(pParse,X,W,O,L); 8414281bd42Sshane } 8424281bd42Sshane %endif 843273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 8445e3a6ebfSdrh cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W). { 8454281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 8468c0833fbSdrh sqlite3DeleteFrom(pParse,X,W,0,0); 8474281bd42Sshane } 8484281bd42Sshane %endif 849348784efSdrh 850348784efSdrh %type where_opt {Expr*} 851633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 852348784efSdrh 853348784efSdrh where_opt(A) ::= . {A = 0;} 8541be266baSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 855348784efSdrh 856382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 857382c0247Sdrh // 858273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 8595e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) 8608b471863Sdrh where_opt(W) orderby_opt(O) limit_opt(L). { 861b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 862b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 863eac9fabbSdrh sqlite3Update(pParse,X,Y,W,R,O,L,0); 8644281bd42Sshane } 8654281bd42Sshane %endif 866273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 8675e3a6ebfSdrh cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) 868e9240418Sdrh where_opt(W). { 8694281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 8704281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 871eac9fabbSdrh sqlite3Update(pParse,X,Y,W,R,0,0,0); 8724281bd42Sshane } 8734281bd42Sshane %endif 874348784efSdrh 875f8db1bc0Sdrh %type setlist {ExprList*} 876633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 877f8db1bc0Sdrh 8784dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). { 8791be266baSdrh A = sqlite3ExprListAppend(pParse, A, Y); 880b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 881b7916a78Sdrh } 882a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). { 8831be266baSdrh A = sqlite3ExprListAppendVector(pParse, A, X, Y); 884a1251bc4Sdrh } 885b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 8861be266baSdrh A = sqlite3ExprListAppend(pParse, 0, Y); 887b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 888b7916a78Sdrh } 889a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). { 8901be266baSdrh A = sqlite3ExprListAppendVector(pParse, 0, X, Y); 891a1251bc4Sdrh } 892348784efSdrh 893382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 894382c0247Sdrh // 8955e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) select(S) 8962c2e844aSdrh upsert(U). { 89746d2e5c3Sdrh sqlite3Insert(pParse, X, S, F, R, U); 8984e9119d9Sdan } 8995e3a6ebfSdrh cmd ::= with insert_cmd(R) INTO xfullname(X) idlist_opt(F) DEFAULT VALUES. 9004e9119d9Sdan { 9012c2e844aSdrh sqlite3Insert(pParse, X, 0, F, R, 0); 9024e9119d9Sdan } 903348784efSdrh 90446d2e5c3Sdrh %type upsert {Upsert*} 90554514c98Sdrh 90654514c98Sdrh // Because upsert only occurs at the tip end of the INSERT rule for cmd, 90754514c98Sdrh // there is never a case where the value of the upsert pointer will not 90854514c98Sdrh // be destroyed by the cmd action. So comment-out the destructor to 90954514c98Sdrh // avoid unreachable code. 91054514c98Sdrh //%destructor upsert {sqlite3UpsertDelete(pParse->db,$$);} 91146d2e5c3Sdrh upsert(A) ::= . { A = 0; } 912e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) 913dab0eb58Sdrh DO UPDATE SET setlist(Z) where_opt(W). 914e9c2e772Sdrh { A = sqlite3UpsertNew(pParse->db,T,TW,Z,W);} 915e9c2e772Sdrh upsert(A) ::= ON CONFLICT LP sortlist(T) RP where_opt(TW) DO NOTHING. 916e9c2e772Sdrh { A = sqlite3UpsertNew(pParse->db,T,TW,0,0); } 917e9c2e772Sdrh upsert(A) ::= ON CONFLICT DO NOTHING. 918e9c2e772Sdrh { A = sqlite3UpsertNew(pParse->db,0,0,0,0); } 91926cf56f8Sdrh 9203334d089Sdrh %type insert_cmd {int} 921fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 922fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 923fa86c412Sdrh 9248981b904Sdrh %type idlist_opt {IdList*} 9258981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);} 92681eba73eSdrh %type idlist {IdList*} 92781eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);} 928348784efSdrh 9298981b904Sdrh idlist_opt(A) ::= . {A = 0;} 9308981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP. {A = X;} 9314dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y). 9324dd0d3f8Sdrh {A = sqlite3IdListAppend(pParse->db,A,&Y);} 93381eba73eSdrh idlist(A) ::= nm(Y). 934cf82f0d3Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/} 935348784efSdrh 936382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 937382c0247Sdrh // 938348784efSdrh 9391be266baSdrh %type expr {Expr*} 9401be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);} 9411be266baSdrh %type term {Expr*} 9421be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);} 943b7916a78Sdrh 944b7916a78Sdrh %include { 945b7916a78Sdrh 946b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 947b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 948b7916a78Sdrh ** that created the expression. 949b7916a78Sdrh */ 9501be266baSdrh static Expr *tokenExpr(Parse *pParse, int op, Token t){ 9510cd874bdSdrh Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); 9520cd874bdSdrh if( p ){ 9530cd874bdSdrh memset(p, 0, sizeof(Expr)); 9540cd874bdSdrh p->op = (u8)op; 9550cd874bdSdrh p->flags = EP_Leaf; 9560cd874bdSdrh p->iAgg = -1; 9570cd874bdSdrh p->u.zToken = (char*)&p[1]; 9580cd874bdSdrh memcpy(p->u.zToken, t.z, t.n); 9590cd874bdSdrh p->u.zToken[t.n] = 0; 9600cd874bdSdrh if( sqlite3Isquote(p->u.zToken[0]) ){ 9610cd874bdSdrh if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; 9620cd874bdSdrh sqlite3Dequote(p->u.zToken); 9630cd874bdSdrh } 9640cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0 9650cd874bdSdrh p->nHeight = 1; 9660cd874bdSdrh #endif 9670cd874bdSdrh } 9681be266baSdrh return p; 969b7916a78Sdrh } 970b7916a78Sdrh } 971348784efSdrh 9724dd0d3f8Sdrh expr(A) ::= term(A). 9731be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;} 9741be266baSdrh expr(A) ::= id(X). {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/} 9751be266baSdrh expr(A) ::= JOIN_KW(X). {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/} 9765ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 977410c301fSdrh Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 978410c301fSdrh Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); 9791be266baSdrh A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); 980e1b6a5b8Sdrh } 981d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 982410c301fSdrh Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 983410c301fSdrh Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); 984410c301fSdrh Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1); 985abfd35eaSdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); 9861be266baSdrh A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); 987d24cc427Sdrh } 9881be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} 9891be266baSdrh term(A) ::= STRING(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} 9900cd874bdSdrh term(A) ::= INTEGER(X). { 9911be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1); 9920cd874bdSdrh } 993f59b12fbSdrh expr(A) ::= VARIABLE(X). { 9948679fbabSdrh if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){ 995de25a88cSdrh u32 n = X.n; 9961be266baSdrh A = tokenExpr(pParse, TK_VARIABLE, X); 9971be266baSdrh sqlite3ExprAssignVarNumber(pParse, A, n); 9988f3b137fSdrh }else{ 999b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 1000b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 1001b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 10028f3b137fSdrh Token t = X; /*A-overwrites-X*/ 10038f3b137fSdrh assert( t.n>=2 ); 1004b7916a78Sdrh if( pParse->nested==0 ){ 100543303de9Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); 10061be266baSdrh A = 0; 1007b7916a78Sdrh }else{ 10081be266baSdrh A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); 10091be266baSdrh if( A ) sqlite3GetInt32(&t.z[1], &A->iTable); 1010b7916a78Sdrh } 1011f59b12fbSdrh } 1012895d7472Sdrh } 101359ff4251Sdan expr(A) ::= expr(A) COLLATE ids(C). { 10141be266baSdrh A = sqlite3ExprAddCollateToken(pParse, A, &C, 1); 10158b4c40d8Sdrh } 1016487e262fSdrh %ifndef SQLITE_OMIT_CAST 10171be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. { 10181be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1); 10191be266baSdrh sqlite3ExprAttachSubtrees(pParse->db, A, E, 0); 1020487e262fSdrh } 1021154d4b24Sdrh %endif SQLITE_OMIT_CAST 102259ff4251Sdan expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP 102367a9b8edSdan %ifndef SQLITE_OMIT_WINDOWFUNC 102467a9b8edSdan over_opt(Z) 102567a9b8edSdan %endif 102667a9b8edSdan . { 1027994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 1028e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 10294e05c83bSdrh } 10301be266baSdrh A = sqlite3ExprFunction(pParse, Y, &X); 10311be266baSdrh if( D==SF_Distinct && A ){ 10321be266baSdrh A->flags |= EP_Distinct; 1033fd357974Sdrh } 1034e33f6e7cSdan sqlite3WindowAttach(pParse, A, Z); 1035e1b6a5b8Sdrh } 103659ff4251Sdan expr(A) ::= id(X) LP STAR RP 103767a9b8edSdan %ifndef SQLITE_OMIT_WINDOWFUNC 103867a9b8edSdan over_opt(Z) 103967a9b8edSdan %endif 104067a9b8edSdan . { 10411be266baSdrh A = sqlite3ExprFunction(pParse, 0, &X); 1042b6e9f7a4Sdan sqlite3WindowAttach(pParse, A, Z); 1043e1b6a5b8Sdrh } 1044b71090fdSdrh term(A) ::= CTIME_KW(OP). { 10451be266baSdrh A = sqlite3ExprFunction(pParse, 0, &OP); 1046b7916a78Sdrh } 1047b7916a78Sdrh 10481be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. { 10491be266baSdrh ExprList *pList = sqlite3ExprListAppend(pParse, X, Y); 10501be266baSdrh A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); 10511be266baSdrh if( A ){ 10521be266baSdrh A->x.pList = pList; 10538bd0d58eSdrh }else{ 10548bd0d58eSdrh sqlite3ExprListDelete(pParse->db, pList); 105571c57db0Sdan } 105671c57db0Sdan } 105771c57db0Sdan 10581be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 10591be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 10604dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y). 10611be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 10621be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 10634dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 10641be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 10654dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y). 10661be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 10674dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y). 10681be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 10691be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 1070410c301fSdrh %type likeop {Token} 10717e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A). 1072410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/} 10734dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y). [LIKE_KW] { 10748aa34ae0Sdrh ExprList *pList; 1075410c301fSdrh int bNot = OP.n & 0x80000000; 1076410c301fSdrh OP.n &= 0x7fffffff; 10771be266baSdrh pList = sqlite3ExprListAppend(pParse,0, Y); 10781be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, A); 10791be266baSdrh A = sqlite3ExprFunction(pParse, pList, &OP); 10801be266baSdrh if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 10811be266baSdrh if( A ) A->flags |= EP_InfixFunc; 10820ac65892Sdrh } 10834dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 10841dca1458Sdrh ExprList *pList; 1085410c301fSdrh int bNot = OP.n & 0x80000000; 1086410c301fSdrh OP.n &= 0x7fffffff; 10871be266baSdrh pList = sqlite3ExprListAppend(pParse,0, Y); 10881be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, A); 10891be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, E); 10901be266baSdrh A = sqlite3ExprFunction(pParse, pList, &OP); 10911be266baSdrh if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 10921be266baSdrh if( A ) A->flags |= EP_InfixFunc; 10931dca1458Sdrh } 10947c6303c0Sdanielk1977 10951be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E). {A = sqlite3PExpr(pParse,@E,A,0);} 10961be266baSdrh expr(A) ::= expr(A) NOT NULL. {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);} 10976a2fe093Sdrh 10986a51741dSdrh %include { 10996a51741dSdrh /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 11006a51741dSdrh ** unary TK_ISNULL or TK_NOTNULL expression. */ 11016a51741dSdrh static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 11026a51741dSdrh sqlite3 *db = pParse->db; 1103895c00e1Sdan if( pA && pY && pY->op==TK_NULL ){ 11045e17e8b7Sshaneh pA->op = (u8)op; 11056a51741dSdrh sqlite3ExprDelete(db, pA->pRight); 11066a51741dSdrh pA->pRight = 0; 11076a51741dSdrh } 11086a51741dSdrh } 11096a51741dSdrh } 11106a51741dSdrh 11116a2fe093Sdrh // expr1 IS expr2 11126a2fe093Sdrh // expr1 IS NOT expr2 11136a2fe093Sdrh // 11146a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2 11156a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT. 11166a2fe093Sdrh // 11174dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y). { 11181be266baSdrh A = sqlite3PExpr(pParse,TK_IS,A,Y); 11191be266baSdrh binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL); 11206a2fe093Sdrh } 11214dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). { 11221be266baSdrh A = sqlite3PExpr(pParse,TK_ISNOT,A,Y); 11231be266baSdrh binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL); 11246a2fe093Sdrh } 1125b7916a78Sdrh 112643303de9Sdrh expr(A) ::= NOT(B) expr(X). 11271be266baSdrh {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/} 112843303de9Sdrh expr(A) ::= BITNOT(B) expr(X). 11291be266baSdrh {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/} 1130ca5aa594Sdrh expr(A) ::= PLUS|MINUS(B) expr(X). [BITNOT] { 1131ca5aa594Sdrh A = sqlite3PExpr(pParse, @B==TK_PLUS ? TK_UPLUS : TK_UMINUS, X, 0); 1132ca5aa594Sdrh /*A-overwrites-B*/ 1133ca5aa594Sdrh } 1134b7916a78Sdrh 11352e3a1f16Sdrh %type between_op {int} 11362e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 11372e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 11384dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 11391be266baSdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X); 11401be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, Y); 11411be266baSdrh A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0); 11421be266baSdrh if( A ){ 11431be266baSdrh A->x.pList = pList; 114453f733c7Sdrh }else{ 1145633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 114653f733c7Sdrh } 11471be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 1148fef5208cSdrh } 11493e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 11502e3a1f16Sdrh %type in_op {int} 11512e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 11522e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 11531be266baSdrh expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] { 1154094430ebSdrh if( Y==0 ){ 1155473c1bf2Sdan /* Expressions of the form 1156473c1bf2Sdan ** 1157473c1bf2Sdan ** expr1 IN () 1158473c1bf2Sdan ** expr1 NOT IN () 1159473c1bf2Sdan ** 1160473c1bf2Sdan ** simplify to constants 0 (false) and 1 (true), respectively, 1161473c1bf2Sdan ** regardless of the value of expr1. 1162473c1bf2Sdan */ 11631be266baSdrh sqlite3ExprDelete(pParse->db, A); 11641be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); 11652b59b3a4Sdrh }else if( Y->nExpr==1 ){ 11662b59b3a4Sdrh /* Expressions of the form: 11672b59b3a4Sdrh ** 11682b59b3a4Sdrh ** expr1 IN (?1) 11692b59b3a4Sdrh ** expr1 NOT IN (?2) 11702b59b3a4Sdrh ** 1171fbb24d10Sdrh ** with exactly one value on the RHS can be simplified to something 1172fbb24d10Sdrh ** like this: 11732b59b3a4Sdrh ** 1174fbb24d10Sdrh ** expr1 == ?1 1175fbb24d10Sdrh ** expr1 <> ?2 1176fbb24d10Sdrh ** 1177fbb24d10Sdrh ** But, the RHS of the == or <> is marked with the EP_Generic flag 1178fbb24d10Sdrh ** so that it may not contribute to the computation of comparison 1179fbb24d10Sdrh ** affinity or the collating sequence to use for comparison. Otherwise, 1180fbb24d10Sdrh ** the semantics would be subtly different from IN or NOT IN. 11812b59b3a4Sdrh */ 1182fbb24d10Sdrh Expr *pRHS = Y->a[0].pExpr; 11832b59b3a4Sdrh Y->a[0].pExpr = 0; 11842b59b3a4Sdrh sqlite3ExprListDelete(pParse->db, Y); 11855b1420e0Sdrh /* pRHS cannot be NULL because a malloc error would have been detected 11865b1420e0Sdrh ** before now and control would have never reached this point */ 11875b1420e0Sdrh if( ALWAYS(pRHS) ){ 1188fbb24d10Sdrh pRHS->flags &= ~EP_Collate; 1189fbb24d10Sdrh pRHS->flags |= EP_Generic; 1190fbb24d10Sdrh } 11911be266baSdrh A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS); 1192094430ebSdrh }else{ 11931be266baSdrh A = sqlite3PExpr(pParse, TK_IN, A, 0); 11941be266baSdrh if( A ){ 11951be266baSdrh A->x.pList = Y; 11961be266baSdrh sqlite3ExprSetHeightAndFlags(pParse, A); 1197d5d56523Sdanielk1977 }else{ 1198633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1199d5d56523Sdanielk1977 } 12001be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 1201094430ebSdrh } 1202fef5208cSdrh } 12031be266baSdrh expr(A) ::= LP select(X) RP. { 12041be266baSdrh A = sqlite3PExpr(pParse, TK_SELECT, 0, 0); 12051be266baSdrh sqlite3PExprAddSelect(pParse, A, X); 120651522cd3Sdrh } 12071be266baSdrh expr(A) ::= expr(A) in_op(N) LP select(Y) RP. [IN] { 12081be266baSdrh A = sqlite3PExpr(pParse, TK_IN, A, 0); 12091be266baSdrh sqlite3PExprAddSelect(pParse, A, Y); 12101be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 1211fef5208cSdrh } 12125fbab882Sdrh expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] { 121317435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 12148c0833fbSdrh Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); 12159de4757cSdrh if( E ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); 12161be266baSdrh A = sqlite3PExpr(pParse, TK_IN, A, 0); 12171be266baSdrh sqlite3PExprAddSelect(pParse, A, pSelect); 12181be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 121923b2db23Sdrh } 12201be266baSdrh expr(A) ::= EXISTS LP select(Y) RP. { 122143303de9Sdrh Expr *p; 12221be266baSdrh p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); 122308de4f79Sdrh sqlite3PExprAddSelect(pParse, p, Y); 122451522cd3Sdrh } 1225154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1226fef5208cSdrh 122717a7f8ddSdrh /* CASE expressions */ 12281be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. { 12291be266baSdrh A = sqlite3PExpr(pParse, TK_CASE, X, 0); 12301be266baSdrh if( A ){ 12311be266baSdrh A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; 12321be266baSdrh sqlite3ExprSetHeightAndFlags(pParse, A); 123353f733c7Sdrh }else{ 1234633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1235c5cd1249Sdrh sqlite3ExprDelete(pParse->db, Z); 123653f733c7Sdrh } 123717a7f8ddSdrh } 123817a7f8ddSdrh %type case_exprlist {ExprList*} 1239633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 12404dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). { 12411be266baSdrh A = sqlite3ExprListAppend(pParse,A, Y); 12421be266baSdrh A = sqlite3ExprListAppend(pParse,A, Z); 124317a7f8ddSdrh } 124417a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 12451be266baSdrh A = sqlite3ExprListAppend(pParse,0, Y); 12461be266baSdrh A = sqlite3ExprListAppend(pParse,A, Z); 124717a7f8ddSdrh } 124817a7f8ddSdrh %type case_else {Expr*} 1249633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 12501be266baSdrh case_else(A) ::= ELSE expr(X). {A = X;} 125117a7f8ddSdrh case_else(A) ::= . {A = 0;} 125217a7f8ddSdrh %type case_operand {Expr*} 1253633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 12541be266baSdrh case_operand(A) ::= expr(X). {A = X; /*A-overwrites-X*/} 125517a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1256348784efSdrh 1257348784efSdrh %type exprlist {ExprList*} 1258633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 12599245c243Sdrh %type nexprlist {ExprList*} 1260633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1261348784efSdrh 12624dd0d3f8Sdrh exprlist(A) ::= nexprlist(A). 12639245c243Sdrh exprlist(A) ::= . {A = 0;} 12644dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y). 12651be266baSdrh {A = sqlite3ExprListAppend(pParse,A,Y);} 126617435752Sdrh nexprlist(A) ::= expr(Y). 12671be266baSdrh {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/} 12689245c243Sdrh 1269a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY 12705fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside 12715fbab882Sdrh ** of parenthesis */ 12725fbab882Sdrh %type paren_exprlist {ExprList*} 12735fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 12745fbab882Sdrh paren_exprlist(A) ::= . {A = 0;} 12755fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP. {A = X;} 1276a522473cSdrh %endif SQLITE_OMIT_SUBQUERY 12775fbab882Sdrh 1278cce7d176Sdrh 1279382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1280382c0247Sdrh // 1281d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 1282108aa00aSdrh ON nm(Y) LP sortlist(Z) RP where_opt(W). { 128317435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 128417435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 128562340f84Sdrh &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF); 12869cfcf5d4Sdrh } 1287717e6402Sdrh 1288717e6402Sdrh %type uniqueflag {int} 12899cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 12909cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1291348784efSdrh 1292348784efSdrh 1293108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList 1294108aa00aSdrh // from a list of identifiers. The identifier names are in ExprList.a[].zName. 1295108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it 1296108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList(). 1297108aa00aSdrh // 1298108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal 1299108aa00aSdrh // used for the arguments to an index. That is just an historical accident. 1300108aa00aSdrh // 1301108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE: Some prior versions of SQLite accepted 1302108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate 1303108aa00aSdrh // places - places that might have been stored in the sqlite_master schema. 1304108aa00aSdrh // Those extra features were ignored. But because they might be in some 1305108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading 1306108aa00aSdrh // historical schemas. 1307108aa00aSdrh // 1308108aa00aSdrh %type eidlist {ExprList*} 1309108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);} 1310108aa00aSdrh %type eidlist_opt {ExprList*} 1311108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1312108aa00aSdrh 1313108aa00aSdrh %include { 1314108aa00aSdrh /* Add a single new term to an ExprList that is used to store a 1315108aa00aSdrh ** list of identifiers. Report an error if the ID list contains 1316108aa00aSdrh ** a COLLATE clause or an ASC or DESC keyword, except ignore the 1317108aa00aSdrh ** error while parsing a legacy schema. 1318108aa00aSdrh */ 1319108aa00aSdrh static ExprList *parserAddExprIdListTerm( 1320108aa00aSdrh Parse *pParse, 1321108aa00aSdrh ExprList *pPrior, 1322108aa00aSdrh Token *pIdToken, 1323108aa00aSdrh int hasCollate, 1324108aa00aSdrh int sortOrder 1325108aa00aSdrh ){ 1326108aa00aSdrh ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); 1327108aa00aSdrh if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) 1328108aa00aSdrh && pParse->db->init.busy==0 1329108aa00aSdrh ){ 1330108aa00aSdrh sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", 1331108aa00aSdrh pIdToken->n, pIdToken->z); 13320202b29eSdanielk1977 } 1333108aa00aSdrh sqlite3ExprListSetName(pParse, p, pIdToken, 1); 1334108aa00aSdrh return p; 1335108aa00aSdrh } 1336108aa00aSdrh } // end %include 1337108aa00aSdrh 1338108aa00aSdrh eidlist_opt(A) ::= . {A = 0;} 1339108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP. {A = X;} 13404dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z). { 13414dd0d3f8Sdrh A = parserAddExprIdListTerm(pParse, A, &Y, C, Z); 1342108aa00aSdrh } 1343108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). { 1344cf82f0d3Sdrh A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/ 13450202b29eSdanielk1977 } 13460202b29eSdanielk1977 1347108aa00aSdrh %type collate {int} 1348108aa00aSdrh collate(C) ::= . {C = 0;} 134959ff4251Sdan collate(C) ::= COLLATE ids. {C = 1;} 1350a34001c9Sdrh 1351348784efSdrh 13528aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1353382c0247Sdrh // 13544d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1355982cef7eSdrh 1356382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1357382c0247Sdrh // 1358154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1359fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 13609ef5e770Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 13619ef5e770Sdrh cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} 1362fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1363154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1364f57b14a6Sdrh 1365382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1366382c0247Sdrh // 136713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 136891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1369ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1370ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1371ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1372ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1373ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1374ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1375ada2ee0dSdrh 1376cf82f0d3Sdrh nmnum(A) ::= plus_num(A). 1377cf82f0d3Sdrh nmnum(A) ::= nm(A). 1378cf82f0d3Sdrh nmnum(A) ::= ON(A). 1379cf82f0d3Sdrh nmnum(A) ::= DELETE(A). 1380cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A). 1381154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 1382f59b12fbSdrh %token_class number INTEGER|FLOAT. 13838395b7b6Sdrh plus_num(A) ::= PLUS number(X). {A = X;} 1384cf82f0d3Sdrh plus_num(A) ::= number(A). 1385f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1386c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1387f0f258b1Sdrh 1388b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1389b7f9164eSdrh 1390d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 13914b59ab5eSdrh Token all; 13924b59ab5eSdrh all.z = A.z; 1393b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 13944adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1395f0f258b1Sdrh } 1396f0f258b1Sdrh 1397fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1398fdd48a76Sdrh trigger_time(C) trigger_event(D) 139960218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 140060218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 1401cf82f0d3Sdrh A = (Z.n==0?B:Z); /*A-overwrites-T*/ 1402c3f9bad2Sdanielk1977 } 1403c3f9bad2Sdanielk1977 1404c3f9bad2Sdanielk1977 %type trigger_time {int} 14056559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X). { A = @X; /*A-overwrites-X*/ } 1406c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1407c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1408c3f9bad2Sdanielk1977 1409ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1410633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1411cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X). {A.a = @X; /*A-overwrites-X*/ A.b = 0;} 1412cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X). {A.a = @X; /*A-overwrites-X*/ A.b = 0;} 141381eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;} 1414c3f9bad2Sdanielk1977 141560218d2aSdrh foreach_clause ::= . 141660218d2aSdrh foreach_clause ::= FOR EACH ROW. 1417c3f9bad2Sdanielk1977 1418c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1419633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1420c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 14211be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; } 1422c3f9bad2Sdanielk1977 1423c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1424633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 14254dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. { 14264dd0d3f8Sdrh assert( A!=0 ); 14274dd0d3f8Sdrh A->pLast->pNext = X; 14284dd0d3f8Sdrh A->pLast = X; 1429a69d9168Sdrh } 14304dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. { 14314dd0d3f8Sdrh assert( A!=0 ); 14324dd0d3f8Sdrh A->pLast = A; 143381238966Sdrh } 1434c3f9bad2Sdanielk1977 1435b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements 1436b1819a0bSdrh // within a trigger. The table to INSERT, UPDATE, or DELETE is always in 1437b1819a0bSdrh // the same database as the table that the trigger fires on. 1438b1819a0bSdrh // 1439b1819a0bSdrh %type trnm {Token} 14404dd0d3f8Sdrh trnm(A) ::= nm(A). 1441b1819a0bSdrh trnm(A) ::= nm DOT nm(X). { 1442b1819a0bSdrh A = X; 1443b1819a0bSdrh sqlite3ErrorMsg(pParse, 1444b1819a0bSdrh "qualified table names are not allowed on INSERT, UPDATE, and DELETE " 1445b1819a0bSdrh "statements within triggers"); 1446b1819a0bSdrh } 1447b1819a0bSdrh 1448b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE 1449b1819a0bSdrh // statements within triggers. We make a specific error message for this 1450b1819a0bSdrh // since it is an exception to the default grammar rules. 1451b1819a0bSdrh // 1452b1819a0bSdrh tridxby ::= . 1453b1819a0bSdrh tridxby ::= INDEXED BY nm. { 1454b1819a0bSdrh sqlite3ErrorMsg(pParse, 1455b1819a0bSdrh "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " 1456b1819a0bSdrh "within triggers"); 1457b1819a0bSdrh } 1458b1819a0bSdrh tridxby ::= NOT INDEXED. { 1459b1819a0bSdrh sqlite3ErrorMsg(pParse, 1460b1819a0bSdrh "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " 1461b1819a0bSdrh "within triggers"); 1462b1819a0bSdrh } 1463b1819a0bSdrh 1464b1819a0bSdrh 1465b1819a0bSdrh 1466c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1467633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1468c3f9bad2Sdanielk1977 // UPDATE 1469b1819a0bSdrh trigger_cmd(A) ::= 1470f259df5fSdrh UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E). 1471f259df5fSdrh {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R, B.z, E);} 1472c3f9bad2Sdanielk1977 1473c3f9bad2Sdanielk1977 // INSERT 1474f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO 14752c2e844aSdrh trnm(X) idlist_opt(F) select(S) upsert(U) scanpt(Z). { 147646d2e5c3Sdrh A = sqlite3TriggerInsertStep(pParse->db,&X,F,S,R,U,B,Z);/*A-overwrites-R*/ 14772c2e844aSdrh } 1478c3f9bad2Sdanielk1977 // DELETE 1479f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E). 1480f259df5fSdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y, B.z, E);} 1481c3f9bad2Sdanielk1977 1482c3f9bad2Sdanielk1977 // SELECT 1483f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E). 1484f259df5fSdrh {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/} 1485c3f9bad2Sdanielk1977 14866f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 14871be266baSdrh expr(A) ::= RAISE LP IGNORE RP. { 14881be266baSdrh A = sqlite3PExpr(pParse, TK_RAISE, 0, 0); 14891be266baSdrh if( A ){ 14901be266baSdrh A->affinity = OE_Ignore; 14914b59ab5eSdrh } 14928aa34ae0Sdrh } 14931be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP. { 14941be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1); 14951be266baSdrh if( A ) { 14961be266baSdrh A->affinity = (char)T; 14974b59ab5eSdrh } 14988aa34ae0Sdrh } 1499154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1500b7f9164eSdrh 150174ad7fe9Sdrh %type raisetype {int} 150274ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 150374ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 150474ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 150574ad7fe9Sdrh 15066f34903eSdanielk1977 1507c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1508b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1509fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1510fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1511c3f9bad2Sdanielk1977 } 1512154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1513113088ecSdrh 1514113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1515fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1516f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 15171be266baSdrh sqlite3Attach(pParse, F, D, K); 15181c2d8414Sdrh } 1519fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 15201be266baSdrh sqlite3Detach(pParse, D); 1521fdbcdee5Sdrh } 1522fdbcdee5Sdrh 1523f744bb56Sdanielk1977 %type key_opt {Expr*} 1524633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1525f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 15261be266baSdrh key_opt(A) ::= KEY expr(X). { A = X; } 1527113088ecSdrh 1528113088ecSdrh database_kw_opt ::= DATABASE. 1529113088ecSdrh database_kw_opt ::= . 1530fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 15314343fea2Sdrh 15324343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 15334343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 15344343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 15354343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1536154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 15379fd2a9a0Sdanielk1977 15389f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 15399f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 15409f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 15419f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 15429f18e8a0Sdrh %endif 15439f18e8a0Sdrh 15449fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 15459fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 15469fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 15479fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 15489fd2a9a0Sdanielk1977 } 1549986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname 1550986dde70Sdrh ADD kwcolumn_opt columnname(Y) carglist. { 1551986dde70Sdrh Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n; 155219a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 155319a8e7e8Sdanielk1977 } 155419a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 15554a642b60Sdrh disableLookaside(pParse); 155619a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 155719a8e7e8Sdanielk1977 } 155819a8e7e8Sdanielk1977 kwcolumn_opt ::= . 155919a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1560154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1561e09daa90Sdrh 1562e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1563e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1564b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1565b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1566b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E) 1567b421b894Sdrh nm(X) dbnm(Y) USING nm(Z). { 1568b421b894Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E); 1569b9bb7c18Sdrh } 1570e09daa90Sdrh vtabarglist ::= vtabarg. 1571e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1572b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1573b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1574b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1575b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1576b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1577b9bb7c18Sdrh anylist ::= . 1578aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1579aaac8b4eSdrh anylist ::= anylist ANY. 1580154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 15818b471863Sdrh 15828b471863Sdrh 15838b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS //////////////////////////// 15847d562dbeSdan %type wqlist {With*} 15854e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);} 15867d562dbeSdan 1587a5746e03Sdrh with ::= . 15888b471863Sdrh %ifndef SQLITE_OMIT_CTE 1589a5746e03Sdrh with ::= WITH wqlist(W). { sqlite3WithPush(pParse, W, 1); } 1590a5746e03Sdrh with ::= WITH RECURSIVE wqlist(W). { sqlite3WithPush(pParse, W, 1); } 15917d562dbeSdan 1592108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. { 1593cf82f0d3Sdrh A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/ 15947d562dbeSdan } 15954dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. { 15964dd0d3f8Sdrh A = sqlite3WithAdd(pParse, A, &X, Y, Z); 15978b471863Sdrh } 15988b471863Sdrh %endif SQLITE_OMIT_CTE 159934a7d790Sdan 160034a7d790Sdan //////////////////////// WINDOW FUNCTION EXPRESSIONS ///////////////////////// 16016e2210e0Sdan // These must be at the end of this file. Specifically, the rules that 16026e2210e0Sdan // introduce tokens WINDOW, OVER and FILTER must appear last. This causes 16036e2210e0Sdan // the integer values assigned to these tokens to be larger than all other 16046e2210e0Sdan // tokens that may be output by the tokenizer except TK_SPACE and TK_ILLEGAL. 160534a7d790Sdan // 160634a7d790Sdan %ifndef SQLITE_OMIT_WINDOWFUNC 160734a7d790Sdan %type windowdefn_list {Window*} 160834a7d790Sdan %destructor windowdefn_list {sqlite3WindowDelete(pParse->db, $$);} 160934a7d790Sdan windowdefn_list(A) ::= windowdefn(Z). { A = Z; } 161034a7d790Sdan windowdefn_list(A) ::= windowdefn_list(Y) COMMA windowdefn(Z). { 161134a7d790Sdan if( Z ) Z->pNextWin = Y; 161234a7d790Sdan A = Z; 161334a7d790Sdan } 161434a7d790Sdan 161534a7d790Sdan %type windowdefn {Window*} 161634a7d790Sdan %destructor windowdefn {sqlite3WindowDelete(pParse->db, $$);} 161734a7d790Sdan windowdefn(A) ::= nm(X) AS window(Y). { 161834a7d790Sdan if( Y ){ 161934a7d790Sdan Y->zName = sqlite3DbStrNDup(pParse->db, X.z, X.n); 162034a7d790Sdan } 162134a7d790Sdan A = Y; 162234a7d790Sdan } 162334a7d790Sdan 162434a7d790Sdan %type window {Window*} 162534a7d790Sdan %destructor window {sqlite3WindowDelete(pParse->db, $$);} 162634a7d790Sdan 162734a7d790Sdan %type frame_opt {Window*} 162834a7d790Sdan %destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);} 162934a7d790Sdan 163034a7d790Sdan %type window_or_nm {Window*} 163134a7d790Sdan %destructor window_or_nm { 163234a7d790Sdan sqlite3WindowDelete(pParse->db, $$);} 163334a7d790Sdan 163434a7d790Sdan %type part_opt {ExprList*} 163534a7d790Sdan %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);} 163634a7d790Sdan 163734a7d790Sdan %type filter_opt {Expr*} 163834a7d790Sdan %destructor filter_opt {sqlite3ExprDelete(pParse->db, $$);} 163934a7d790Sdan 164034a7d790Sdan %type range_or_rows {int} 164134a7d790Sdan 164234a7d790Sdan %type frame_bound {struct FrameBound} 164334a7d790Sdan %destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);} 1644*287fa17bSdan %type frame_bound_s {struct FrameBound} 1645*287fa17bSdan %destructor frame_bound_s {sqlite3ExprDelete(pParse->db, $$.pExpr);} 1646*287fa17bSdan %type frame_bound_e {struct FrameBound} 1647*287fa17bSdan %destructor frame_bound_e {sqlite3ExprDelete(pParse->db, $$.pExpr);} 164834a7d790Sdan 164934a7d790Sdan window_or_nm(A) ::= window(Z). {A = Z;} 165034a7d790Sdan window_or_nm(A) ::= nm(Z). { 165134a7d790Sdan A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); 165234a7d790Sdan if( A ){ 165334a7d790Sdan A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n); 165434a7d790Sdan } 165534a7d790Sdan } 165634a7d790Sdan 165734a7d790Sdan window(A) ::= LP part_opt(X) orderby_opt(Y) frame_opt(Z) RP. { 165834a7d790Sdan A = Z; 165934a7d790Sdan if( A ){ 166034a7d790Sdan A->pPartition = X; 166134a7d790Sdan A->pOrderBy = Y; 166234a7d790Sdan } 166334a7d790Sdan } 166434a7d790Sdan 166534a7d790Sdan part_opt(A) ::= PARTITION BY exprlist(X). { A = X; } 166634a7d790Sdan part_opt(A) ::= . { A = 0; } 166734a7d790Sdan 166834a7d790Sdan frame_opt(A) ::= . { 166934a7d790Sdan A = sqlite3WindowAlloc(pParse, TK_RANGE, TK_UNBOUNDED, 0, TK_CURRENT, 0); 167034a7d790Sdan } 1671*287fa17bSdan frame_opt(A) ::= range_or_rows(X) frame_bound_s(Y). { 167234a7d790Sdan A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0); 167334a7d790Sdan } 1674*287fa17bSdan frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound_s(Y) AND frame_bound_e(Z). { 167534a7d790Sdan A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr); 167634a7d790Sdan } 167734a7d790Sdan 167834a7d790Sdan range_or_rows(A) ::= RANGE. { A = TK_RANGE; } 167934a7d790Sdan range_or_rows(A) ::= ROWS. { A = TK_ROWS; } 168034a7d790Sdan 1681*287fa17bSdan 1682*287fa17bSdan frame_bound_s(A) ::= frame_bound(X). { A = X; } 1683*287fa17bSdan frame_bound_s(A) ::= UNBOUNDED PRECEDING. {A.eType = TK_UNBOUNDED; A.pExpr = 0;} 1684*287fa17bSdan frame_bound_e(A) ::= frame_bound(X). { A = X; } 1685*287fa17bSdan frame_bound_e(A) ::= UNBOUNDED FOLLOWING. {A.eType = TK_UNBOUNDED; A.pExpr = 0;} 1686*287fa17bSdan 168734a7d790Sdan frame_bound(A) ::= expr(X) PRECEDING. { A.eType = TK_PRECEDING; A.pExpr = X; } 168834a7d790Sdan frame_bound(A) ::= CURRENT ROW. { A.eType = TK_CURRENT ; A.pExpr = 0; } 168934a7d790Sdan frame_bound(A) ::= expr(X) FOLLOWING. { A.eType = TK_FOLLOWING; A.pExpr = X; } 169034a7d790Sdan 169134a7d790Sdan %type windowdefn_opt {Window*} 169234a7d790Sdan %destructor windowdefn_opt {sqlite3WindowDelete(pParse->db, $$);} 169334a7d790Sdan windowdefn_opt(A) ::= . { A = 0; } 169434a7d790Sdan windowdefn_opt(A) ::= WINDOW windowdefn_list(B). { A = B; } 16956e2210e0Sdan 16966e2210e0Sdan %type over_opt {Window*} 16976e2210e0Sdan %destructor over_opt {sqlite3WindowDelete(pParse->db, $$);} 16986e2210e0Sdan over_opt(A) ::= . { A = 0; } 16996e2210e0Sdan over_opt(A) ::= filter_opt(W) OVER window_or_nm(Z). { 17006e2210e0Sdan A = Z; 17016e2210e0Sdan if( A ) A->pFilter = W; 17026e2210e0Sdan } 17036e2210e0Sdan 17046e2210e0Sdan filter_opt(A) ::= . { A = 0; } 17056e2210e0Sdan filter_opt(A) ::= FILTER LP WHERE expr(X) RP. { A = X; } 170634a7d790Sdan %endif // SQLITE_OMIT_WINDOWFUNC 170734a7d790Sdan 1708