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 */ 3455176259Sdrh assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ 354adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 36b86ccfb2Sdrh } 378fc3345fSdrh %stack_overflow { 388fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 398fc3345fSdrh } 40487e262fSdrh 41487e262fSdrh // The name of the generated procedure that implements the parser 42487e262fSdrh // is as follows: 434adee20fSdanielk1977 %name sqlite3Parser 44487e262fSdrh 45487e262fSdrh // The following text is included near the beginning of the C source 46487e262fSdrh // code file that implements the parser. 47487e262fSdrh // 48348784efSdrh %include { 49348784efSdrh #include "sqliteInt.h" 509bbca4c1Sdrh 519bbca4c1Sdrh /* 52d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 53d3ec02d3Sdrh ** automaton. 54d3ec02d3Sdrh */ 55d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 56d3ec02d3Sdrh 57d3ec02d3Sdrh /* 588a415d37Sdrh ** Make yytestcase() the same as testcase() 598a415d37Sdrh */ 608a415d37Sdrh #define yytestcase(X) testcase(X) 618a415d37Sdrh 628a415d37Sdrh /* 6382415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null 6482415f2dSdrh ** pointer. 6582415f2dSdrh */ 66644f4c1bSdrh #define YYPARSEFREENEVERNULL 1 6782415f2dSdrh 6882415f2dSdrh /* 6982415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed 7082415f2dSdrh ** into sqlite3ParserAlloc(). The default is size_t. 7182415f2dSdrh */ 7282415f2dSdrh #define YYMALLOCARGTYPE u64 7382415f2dSdrh 7482415f2dSdrh /* 75ad3cab52Sdrh ** An instance of this structure holds information about the 76ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 779bbca4c1Sdrh */ 78ad3cab52Sdrh struct LimitVal { 79a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 80a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 81ad3cab52Sdrh }; 82c3f9bad2Sdanielk1977 83c3f9bad2Sdanielk1977 /* 84ad3cab52Sdrh ** An instance of the following structure describes the event of a 85ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 86ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 87ad3cab52Sdrh ** 88ad3cab52Sdrh ** UPDATE ON (a,b,c) 89ad3cab52Sdrh ** 90ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 91c3f9bad2Sdanielk1977 */ 92ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 93caec2f12Sdrh 9425d6543dSdrh /* 954a642b60Sdrh ** Disable lookaside memory allocation for objects that might be 964a642b60Sdrh ** shared across database connections. 974a642b60Sdrh */ 984a642b60Sdrh static void disableLookaside(Parse *pParse){ 994a642b60Sdrh pParse->disableLookaside++; 1004a642b60Sdrh pParse->db->lookaside.bDisable++; 1014a642b60Sdrh } 1024a642b60Sdrh 103caec2f12Sdrh } // end %include 104348784efSdrh 105826fb5a3Sdrh // Input is a single SQL command 106c4a3c779Sdrh input ::= cmdlist. 107094b2bbfSdrh cmdlist ::= cmdlist ecmd. 108826fb5a3Sdrh cmdlist ::= ecmd. 109b7f9164eSdrh ecmd ::= SEMI. 110b7f9164eSdrh ecmd ::= explain cmdx SEMI. 1118549d55eSdrh explain ::= . 112b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 1138549d55eSdrh explain ::= EXPLAIN. { pParse->explain = 1; } 1148549d55eSdrh explain ::= EXPLAIN QUERY PLAN. { pParse->explain = 2; } 115154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 116200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 117348784efSdrh 118382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 119c4a3c779Sdrh // 120fa86c412Sdrh 121684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 122c4a3c779Sdrh trans_opt ::= . 123c4a3c779Sdrh trans_opt ::= TRANSACTION. 1245ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 125684917c2Sdrh %type transtype {int} 126684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 127cf82f0d3Sdrh transtype(A) ::= DEFERRED(X). {A = @X; /*A-overwrites-X*/} 128cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/} 129cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/} 1304adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1314adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1324adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 133c4a3c779Sdrh 134fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 135fd7f0452Sdanielk1977 savepoint_opt ::= . 136fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 137fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 138fd7f0452Sdanielk1977 } 139fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 140fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 141fd7f0452Sdanielk1977 } 142fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 143fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 144fd7f0452Sdanielk1977 } 145fd7f0452Sdanielk1977 146382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 147348784efSdrh // 148348784efSdrh cmd ::= create_table create_table_args. 149d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 150f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 151969fa7c1Sdrh } 152dabd04c6Sdrh createkw(A) ::= CREATE(A). {disableLookaside(pParse);} 153dabd04c6Sdrh 154faa59554Sdrh %type ifnotexists {int} 155faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 156faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 157f57b3399Sdrh %type temp {int} 15853c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 159d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 160154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 161d24cc427Sdrh temp(A) ::= . {A = 0;} 1625969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). { 1635969da4aSdrh sqlite3EndTable(pParse,&X,&E,F,0); 164969fa7c1Sdrh } 165969fa7c1Sdrh create_table_args ::= AS select(S). { 1665969da4aSdrh sqlite3EndTable(pParse,0,0,0,S); 167633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 168969fa7c1Sdrh } 1693334d089Sdrh %type table_options {int} 1705969da4aSdrh table_options(A) ::= . {A = 0;} 1715969da4aSdrh table_options(A) ::= WITHOUT nm(X). { 1725969da4aSdrh if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){ 173fccda8a1Sdrh A = TF_WithoutRowid | TF_NoVisibleRowid; 1745969da4aSdrh }else{ 1755969da4aSdrh A = 0; 1765969da4aSdrh sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); 1775969da4aSdrh } 1785969da4aSdrh } 179986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist. 180986dde70Sdrh columnlist ::= columnname carglist. 1812881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);} 182c4a3c779Sdrh 183f7b5496eSdrh // Define operator precedence early so that this is the first occurrence 1842d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 1852d3917daSdrh // causes them to be assigned integer values that are close together, 1862d3917daSdrh // which keeps parser tables smaller. 1872d3917daSdrh // 188f2bc013cSdrh // The token values assigned to these symbols is determined by the order 189f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 190f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 191f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 192f2bc013cSdrh // constraint. 193f2bc013cSdrh // 1942d3917daSdrh %left OR. 1952d3917daSdrh %left AND. 1962d3917daSdrh %right NOT. 19703bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 1989a43267bSdrh %left GT LE LT GE. 1997c6303c0Sdanielk1977 %right ESCAPE. 2002d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2012d3917daSdrh %left PLUS MINUS. 2022d3917daSdrh %left STAR SLASH REM. 203a34001c9Sdrh %left CONCAT. 204a34001c9Sdrh %left COLLATE. 2057ba5bc5bSdrh %right BITNOT. 2062d3917daSdrh 2077cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several 2087cc84c2cSdrh // keywords. Any non-standard keyword can also be an identifier. 2097cc84c2cSdrh // 2107cc84c2cSdrh %token_class id ID|INDEXED. 2117cc84c2cSdrh 2127cc84c2cSdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 2137cc84c2cSdrh // fallback to ID if they will not parse as their original value. 2147cc84c2cSdrh // This obviates the need for the "id" nonterminal. 2157cc84c2cSdrh // 2167cc84c2cSdrh %fallback ID 2177cc84c2cSdrh ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 2187cc84c2cSdrh CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 2197cc84c2cSdrh IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 2207cc84c2cSdrh QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW 2217cc84c2cSdrh ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT 2227cc84c2cSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 2237cc84c2cSdrh EXCEPT INTERSECT UNION 2247cc84c2cSdrh %endif SQLITE_OMIT_COMPOUND_SELECT 2257cc84c2cSdrh REINDEX RENAME CTIME_KW IF 2267cc84c2cSdrh . 2277cc84c2cSdrh %wildcard ANY. 2287cc84c2cSdrh 2297cc84c2cSdrh 230c4a3c779Sdrh // And "ids" is an identifer-or-string. 231c4a3c779Sdrh // 232f59b12fbSdrh %token_class ids ID|STRING. 233c4a3c779Sdrh 2345ad1a6c8Sdrh // The name of a column or table can be any of the following: 2355ad1a6c8Sdrh // 2365ad1a6c8Sdrh %type nm {Token} 2374dd0d3f8Sdrh nm(A) ::= id(A). 2384dd0d3f8Sdrh nm(A) ::= STRING(A). 2394dd0d3f8Sdrh nm(A) ::= JOIN_KW(A). 2405ad1a6c8Sdrh 241986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such 242487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 243487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 244487e262fSdrh // 245487e262fSdrh %type typetoken {Token} 246986dde70Sdrh typetoken(A) ::= . {A.n = 0; A.z = 0;} 2474dd0d3f8Sdrh typetoken(A) ::= typename(A). 2484dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). { 2494dd0d3f8Sdrh A.n = (int)(&Y.z[Y.n] - A.z); 250487e262fSdrh } 2514dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). { 2524dd0d3f8Sdrh A.n = (int)(&Y.z[Y.n] - A.z); 253487e262fSdrh } 254382c0247Sdrh %type typename {Token} 2554dd0d3f8Sdrh typename(A) ::= ids(A). 2564dd0d3f8Sdrh typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);} 25760218d2aSdrh signed ::= plus_num. 25860218d2aSdrh signed ::= minus_num. 259487e262fSdrh 260487e262fSdrh // "carglist" is a list of additional constraints that come after the 261487e262fSdrh // column name and column type in a CREATE TABLE statement. 262487e262fSdrh // 2634dc330ddSdrh carglist ::= carglist ccons. 264348784efSdrh carglist ::= . 2654dc330ddSdrh ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 266b7916a78Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 267b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 268b7916a78Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 269f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 270b7916a78Sdrh ExprSpan v; 271*abfd35eaSdrh v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0); 272b7916a78Sdrh v.zStart = A.z; 273b7916a78Sdrh v.zEnd = X.zEnd; 274b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2757977a17fSdanielk1977 } 2762b7acc35Sdrh ccons ::= DEFAULT id(X). { 277b7916a78Sdrh ExprSpan v; 27843303de9Sdrh spanExpr(&v, pParse, TK_STRING, X); 279b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2807977a17fSdanielk1977 } 281348784efSdrh 282382c0247Sdrh // In addition to the type name, we also care about the primary key and 283382c0247Sdrh // UNIQUE constraints. 284348784efSdrh // 2850d316a40Sdrh ccons ::= NULL onconf. 2864adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 287fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 288fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 28962340f84Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0, 29062340f84Sdrh SQLITE_IDXTYPE_UNIQUE);} 291b7916a78Sdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} 292108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R). 2934adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 2944adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 29539002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 29604738cb9Sdrh 297205f48e6Sdrh // The optional AUTOINCREMENT keyword 298205f48e6Sdrh %type autoinc {int} 299205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3002958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 301205f48e6Sdrh 302c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 303c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 304c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 305c2eef3b3Sdrh // check fails. 30604738cb9Sdrh // 307c2eef3b3Sdrh %type refargs {int} 308fcf486c3Sdrh refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */} 3094dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; } 310c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 311c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 312c29c5aa1Sdrh refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; } 313c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 314c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 315c2eef3b3Sdrh %type refact {int} 316fcf486c3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */} 317fcf486c3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */} 318fcf486c3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */} 319fcf486c3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 320fcf486c3Sdrh refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 321c2eef3b3Sdrh %type defer_subclause {int} 3221da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 323c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 324c2eef3b3Sdrh %type init_deferred_pred_opt {int} 325c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 326c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 327c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 328348784efSdrh 32919a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 3304dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist. 331ab35eaedSdrh conslist ::= conslist tconscomma tcons. 332ab35eaedSdrh conslist ::= tcons. 333ab35eaedSdrh tconscomma ::= COMMA. {pParse->constraintName.n = 0;} 334ab35eaedSdrh tconscomma ::= . 335ab35eaedSdrh tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 336108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R). 337fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 338108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R). 33962340f84Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0, 34062340f84Sdrh SQLITE_IDXTYPE_UNIQUE);} 341b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 342b7916a78Sdrh {sqlite3AddCheckConstraint(pParse,E.pExpr);} 343108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP 344108aa00aSdrh REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3454adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3464adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 347c2eef3b3Sdrh } 348c2eef3b3Sdrh %type defer_subclause_opt {int} 349c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 3504dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A). 3519cfcf5d4Sdrh 3529cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3539cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3549cfcf5d4Sdrh // 3559cfcf5d4Sdrh %type onconf {int} 3563334d089Sdrh %type orconf {int} 3571c92853dSdrh %type resolvetype {int} 3581c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3591c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3601c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3613334d089Sdrh orconf(A) ::= OR resolvetype(X). {A = X;} 3624dd0d3f8Sdrh resolvetype(A) ::= raisetype(A). 3631c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3641c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 365348784efSdrh 366382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 367348784efSdrh // 368a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 369a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 370a8858103Sdanielk1977 } 371a073384fSdrh %type ifexists {int} 372a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 373a073384fSdrh ifexists(A) ::= . {A = 0;} 374348784efSdrh 375a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 376a76b5dfcSdrh // 377b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 378108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C) 3798981b904Sdrh AS select(S). { 3808981b904Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E); 381a76b5dfcSdrh } 382a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 383a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 384a76b5dfcSdrh } 385154d4b24Sdrh %endif SQLITE_OMIT_VIEW 386a76b5dfcSdrh 387382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 388348784efSdrh // 3897d562dbeSdan cmd ::= select(X). { 390edf83d1eSdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; 3917d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 392633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 3939bb61fe7Sdrh } 394efb7251dSdrh 3959bb61fe7Sdrh %type select {Select*} 396633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 3977d562dbeSdan %type selectnowith {Select*} 3987d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);} 39982c3d636Sdrh %type oneselect {Select*} 400633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4019bb61fe7Sdrh 402772460fdSdrh %include { 403772460fdSdrh /* 404772460fdSdrh ** For a compound SELECT statement, make sure p->pPrior->pNext==p for 405772460fdSdrh ** all elements in the list. And make sure list length does not exceed 406772460fdSdrh ** SQLITE_LIMIT_COMPOUND_SELECT. 407772460fdSdrh */ 408e318a7f8Sdrh static void parserDoubleLinkSelect(Parse *pParse, Select *p){ 409d227a291Sdrh if( p->pPrior ){ 410772460fdSdrh Select *pNext = 0, *pLoop; 411772460fdSdrh int mxSelect, cnt = 0; 412d227a291Sdrh for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ 413d227a291Sdrh pLoop->pNext = pNext; 414d227a291Sdrh pLoop->selFlags |= SF_Compound; 415d227a291Sdrh } 416772460fdSdrh if( (p->selFlags & SF_MultiValue)==0 && 417772460fdSdrh (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && 418772460fdSdrh cnt>mxSelect 419a0c01768Sdrh ){ 420d227a291Sdrh sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); 421d227a291Sdrh } 422d227a291Sdrh } 423772460fdSdrh } 424772460fdSdrh } 425772460fdSdrh 426772460fdSdrh select(A) ::= with(W) selectnowith(X). { 427772460fdSdrh Select *p = X; 428772460fdSdrh if( p ){ 429772460fdSdrh p->pWith = W; 430772460fdSdrh parserDoubleLinkSelect(pParse, p); 431a9f5c13dSdan }else{ 432a9f5c13dSdan sqlite3WithDelete(pParse->db, W); 433a9f5c13dSdan } 434cf82f0d3Sdrh A = p; /*A-overwrites-W*/ 435a9f5c13dSdan } 4367d562dbeSdan 4374dd0d3f8Sdrh selectnowith(A) ::= oneselect(A). 438b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4394dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z). { 440c0bf493eSdrh Select *pRhs = Z; 4414dd0d3f8Sdrh Select *pLhs = A; 442c0bf493eSdrh if( pRhs && pRhs->pPrior ){ 443c0bf493eSdrh SrcList *pFrom; 444c0bf493eSdrh Token x; 445c0bf493eSdrh x.n = 0; 446772460fdSdrh parserDoubleLinkSelect(pParse, pRhs); 447c0bf493eSdrh pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); 448c0bf493eSdrh pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0); 449c0bf493eSdrh } 450c0bf493eSdrh if( pRhs ){ 451c0bf493eSdrh pRhs->op = (u8)Y; 45200d5ab74Sdrh pRhs->pPrior = pLhs; 45300d5ab74Sdrh if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; 454772460fdSdrh pRhs->selFlags &= ~SF_MultiValue; 455d58d3278Sdrh if( Y!=TK_ALL ) pParse->hasCompound = 1; 45643b78826Sdrh }else{ 45700d5ab74Sdrh sqlite3SelectDelete(pParse->db, pLhs); 458daffd0e5Sdrh } 459c0bf493eSdrh A = pRhs; 46082c3d636Sdrh } 4610a36c57eSdrh %type multiselect_op {int} 462cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP; /*A-overwrites-OP*/} 4630a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 464cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP; /*A-overwrites-OP*/} 465154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 466abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y) 4679bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 46843303de9Sdrh #if SELECTTRACE_ENABLED 46943303de9Sdrh Token s = S; /*A-overwrites-S*/ 47043303de9Sdrh #endif 47117435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 472abd4c723Sdrh #if SELECTTRACE_ENABLED 473eb9b884cSdrh /* Populate the Select.zSelName[] string that is used to help with 474abd4c723Sdrh ** query planner debugging, to differentiate between multiple Select 475abd4c723Sdrh ** objects in a complex query. 476abd4c723Sdrh ** 477abd4c723Sdrh ** If the SELECT keyword is immediately followed by a C-style comment 478abd4c723Sdrh ** then extract the first few alphanumeric characters from within that 479eb9b884cSdrh ** comment to be the zSelName value. Otherwise, the label is #N where 480abd4c723Sdrh ** is an integer that is incremented with each SELECT statement seen. 481abd4c723Sdrh */ 482abd4c723Sdrh if( A!=0 ){ 48343303de9Sdrh const char *z = s.z+6; 484abd4c723Sdrh int i; 485eb9b884cSdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d", 486abd4c723Sdrh ++pParse->nSelect); 487abd4c723Sdrh while( z[0]==' ' ) z++; 488abd4c723Sdrh if( z[0]=='/' && z[1]=='*' ){ 489abd4c723Sdrh z += 2; 490abd4c723Sdrh while( z[0]==' ' ) z++; 491abd4c723Sdrh for(i=0; sqlite3Isalnum(z[i]); i++){} 492eb9b884cSdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z); 493abd4c723Sdrh } 494abd4c723Sdrh } 495abd4c723Sdrh #endif /* SELECTRACE_ENABLED */ 4969bb61fe7Sdrh } 4974dd0d3f8Sdrh oneselect(A) ::= values(A). 49875593d96Sdrh 49975593d96Sdrh %type values {Select*} 50075593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);} 50175593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. { 50275593d96Sdrh A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0,0); 50375593d96Sdrh } 5044dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. { 5054dd0d3f8Sdrh Select *pRight, *pLeft = A; 506772460fdSdrh pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0,0); 507f3151f0aSdrh if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; 50875593d96Sdrh if( pRight ){ 50975593d96Sdrh pRight->op = TK_ALL; 510772460fdSdrh pRight->pPrior = pLeft; 51175593d96Sdrh A = pRight; 51275593d96Sdrh }else{ 513772460fdSdrh A = pLeft; 51475593d96Sdrh } 51575593d96Sdrh } 5169bb61fe7Sdrh 5179bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 5189bb61fe7Sdrh // present and false (0) if it is not. 5199bb61fe7Sdrh // 5203334d089Sdrh %type distinct {int} 521832ee3d4Sdrh distinct(A) ::= DISTINCT. {A = SF_Distinct;} 5227cea7f95Sdrh distinct(A) ::= ALL. {A = SF_All;} 523efb7251dSdrh distinct(A) ::= . {A = 0;} 524348784efSdrh 5259bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 5267c917d19Sdrh // values of the SELECT statement. The "*" in statements like 5277c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 5281a1d3cd2Sdrh // opcode of TK_ASTERISK. 5299bb61fe7Sdrh // 530348784efSdrh %type selcollist {ExprList*} 531633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 532348784efSdrh %type sclp {ExprList*} 533633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 5344dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA. 535348784efSdrh sclp(A) ::= . {A = 0;} 5364dd0d3f8Sdrh selcollist(A) ::= sclp(A) expr(X) as(Y). { 5374dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse, A, X.pExpr); 538b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 539b7916a78Sdrh sqlite3ExprListSetSpan(pParse,A,&X); 54001f3f253Sdrh } 5414dd0d3f8Sdrh selcollist(A) ::= sclp(A) STAR. { 5421a1d3cd2Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); 5434dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse, A, p); 5447c917d19Sdrh } 5450cd874bdSdrh selcollist(A) ::= sclp(A) nm(X) DOT STAR. { 546*abfd35eaSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); 547*abfd35eaSdrh Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 548*abfd35eaSdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); 5494dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse,A, pDot); 55054473229Sdrh } 55101f3f253Sdrh 55201f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 55301f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 55401f3f253Sdrh // 55501f3f253Sdrh %type as {Token} 5565ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 5574dd0d3f8Sdrh as(X) ::= ids(X). 558986dde70Sdrh as(X) ::= . {X.n = 0; X.z = 0;} 5599bb61fe7Sdrh 560348784efSdrh 561ad3cab52Sdrh %type seltablist {SrcList*} 562633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 563ad3cab52Sdrh %type stl_prefix {SrcList*} 564633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 565ad3cab52Sdrh %type from {SrcList*} 566633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 567348784efSdrh 56801f3f253Sdrh // A complete FROM clause. 56901f3f253Sdrh // 57017435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 57161dfc31dSdrh from(A) ::= FROM seltablist(X). { 57261dfc31dSdrh A = X; 57361dfc31dSdrh sqlite3SrcListShiftJoinType(A); 57461dfc31dSdrh } 57501f3f253Sdrh 57601f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 57701f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 57801f3f253Sdrh // 5794dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y). { 5808a48b9c0Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y; 58101f3f253Sdrh } 582348784efSdrh stl_prefix(A) ::= . {A = 0;} 5834dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I) 584e9240418Sdrh on_opt(N) using_opt(U). { 5854dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U); 586b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 58701f3f253Sdrh } 5884dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) 58901d230ceSdrh on_opt(N) using_opt(U). { 5904dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U); 59101d230ceSdrh sqlite3SrcListFuncArgs(pParse, A, E); 59201d230ceSdrh } 59351522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 5944dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) LP select(S) RP 595b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 5964dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U); 59722f70c32Sdrh } 5984dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP 599fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 6004dd0d3f8Sdrh if( A==0 && Z.n==0 && N==0 && U==0 ){ 601fbdc7f69Sdrh A = F; 602832ee3d4Sdrh }else if( F->nSrc==1 ){ 6034dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U); 604832ee3d4Sdrh if( A ){ 605832ee3d4Sdrh struct SrcList_item *pNew = &A->a[A->nSrc-1]; 606832ee3d4Sdrh struct SrcList_item *pOld = F->a; 607832ee3d4Sdrh pNew->zName = pOld->zName; 608832ee3d4Sdrh pNew->zDatabase = pOld->zDatabase; 6093c449c6bSdrh pNew->pSelect = pOld->pSelect; 610832ee3d4Sdrh pOld->zName = pOld->zDatabase = 0; 6113c449c6bSdrh pOld->pSelect = 0; 612832ee3d4Sdrh } 613832ee3d4Sdrh sqlite3SrcListDelete(pParse->db, F); 614fbdc7f69Sdrh }else{ 615fbdc7f69Sdrh Select *pSubquery; 616fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 617832ee3d4Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0,0); 6184dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U); 619fbdc7f69Sdrh } 620fbdc7f69Sdrh } 621154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 622b733d037Sdrh 623113088ecSdrh %type dbnm {Token} 624113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 625113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 626113088ecSdrh 62774ad7fe9Sdrh %type fullname {SrcList*} 628633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 629cf82f0d3Sdrh fullname(A) ::= nm(X) dbnm(Y). 630cf82f0d3Sdrh {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/} 63174ad7fe9Sdrh 63201f3f253Sdrh %type joinop {int} 633fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 634cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN. 635cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,0,0); /*X-overwrites-A*/} 636cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN. 637cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/} 6385ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 639cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/} 64001f3f253Sdrh 64101f3f253Sdrh %type on_opt {Expr*} 642633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 643b7916a78Sdrh on_opt(N) ::= ON expr(E). {N = E.pExpr;} 64401f3f253Sdrh on_opt(N) ::= . {N = 0;} 64501f3f253Sdrh 64685574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 64785574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 64885574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 64985574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 65085574e31Sdanielk1977 // in the token. 65185574e31Sdanielk1977 // 65285574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 653b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 65485574e31Sdanielk1977 // recognizes and interprets this as a special case. 65585574e31Sdanielk1977 // 65685574e31Sdanielk1977 %type indexed_opt {Token} 65785574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 65885574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 65985574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 66085574e31Sdanielk1977 66101f3f253Sdrh %type using_opt {IdList*} 662633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 66381eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP. {U = L;} 66401f3f253Sdrh using_opt(U) ::= . {U = 0;} 66501f3f253Sdrh 66601f3f253Sdrh 667348784efSdrh %type orderby_opt {ExprList*} 668633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 669108aa00aSdrh 670108aa00aSdrh // the sortlist non-terminal stores a list of expression where each 671108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the 672108aa00aSdrh // sort order. 673108aa00aSdrh // 674348784efSdrh %type sortlist {ExprList*} 675633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 676348784efSdrh 677348784efSdrh orderby_opt(A) ::= . {A = 0;} 678348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 6794dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). { 6804dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse,A,Y.pExpr); 681bc622bc0Sdrh sqlite3ExprListSetSortOrder(A,Z); 682348784efSdrh } 6838395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). { 684cf82f0d3Sdrh A = sqlite3ExprListAppend(pParse,0,Y.pExpr); /*A-overwrites-Y*/ 685bc622bc0Sdrh sqlite3ExprListSetSortOrder(A,Z); 686348784efSdrh } 687348784efSdrh 688348784efSdrh %type sortorder {int} 689348784efSdrh 6908e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 6918e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 692bc622bc0Sdrh sortorder(A) ::= . {A = SQLITE_SO_UNDEFINED;} 693348784efSdrh 6942282792aSdrh %type groupby_opt {ExprList*} 695633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 6962282792aSdrh groupby_opt(A) ::= . {A = 0;} 6979245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 6982282792aSdrh 6992282792aSdrh %type having_opt {Expr*} 700633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 7012282792aSdrh having_opt(A) ::= . {A = 0;} 702b7916a78Sdrh having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} 7032282792aSdrh 704ad3cab52Sdrh %type limit_opt {struct LimitVal} 70515926590Sdrh 70615926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 70715926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 70815926590Sdrh // rule for SELECT statements. As soon as the rule that create the 70915926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 71015926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 71115926590Sdrh // except as a transient. So there is never anything to destroy. 71215926590Sdrh // 71315926590Sdrh //%destructor limit_opt { 714633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 715633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 71615926590Sdrh //} 717a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 718b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 719a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 720b7916a78Sdrh {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 721a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 722b7916a78Sdrh {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 7239bbca4c1Sdrh 724382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 725382c0247Sdrh // 726273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7274e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 728931577f1Sdrh orderby_opt(O) limit_opt(L). { 729b290f117Sdan sqlite3WithPush(pParse, C, 1); 730b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 73149ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 7324281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 7334281bd42Sshane } 7344281bd42Sshane %endif 735273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7364e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 737b290f117Sdan sqlite3WithPush(pParse, C, 1); 7384281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 7394281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 7404281bd42Sshane } 7414281bd42Sshane %endif 742348784efSdrh 743348784efSdrh %type where_opt {Expr*} 744633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 745348784efSdrh 746348784efSdrh where_opt(A) ::= . {A = 0;} 747b7916a78Sdrh where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 748348784efSdrh 749382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 750382c0247Sdrh // 751273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 752bfe31e7fSdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) 7538b471863Sdrh where_opt(W) orderby_opt(O) limit_opt(L). { 754b290f117Sdan sqlite3WithPush(pParse, C, 1); 755b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 756b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 75749ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 7584281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 7594281bd42Sshane } 7604281bd42Sshane %endif 761273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7624e9119d9Sdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) 763e9240418Sdrh where_opt(W). { 764b290f117Sdan sqlite3WithPush(pParse, C, 1); 7654281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 7664281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 7674281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 7684281bd42Sshane } 7694281bd42Sshane %endif 770348784efSdrh 771f8db1bc0Sdrh %type setlist {ExprList*} 772633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 773f8db1bc0Sdrh 7744dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). { 7754dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse, A, Y.pExpr); 776b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 777b7916a78Sdrh } 778a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). { 779a1251bc4Sdrh A = sqlite3ExprListAppendVector(pParse, A, X, Y.pExpr); 780a1251bc4Sdrh } 781b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 782b7916a78Sdrh A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 783b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 784b7916a78Sdrh } 785a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). { 786a1251bc4Sdrh A = sqlite3ExprListAppendVector(pParse, 0, X, Y.pExpr); 787a1251bc4Sdrh } 788348784efSdrh 789382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 790382c0247Sdrh // 7918981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). { 792b290f117Sdan sqlite3WithPush(pParse, W, 1); 7934e9119d9Sdan sqlite3Insert(pParse, X, S, F, R); 7944e9119d9Sdan } 7958981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES. 7964e9119d9Sdan { 797b290f117Sdan sqlite3WithPush(pParse, W, 1); 7984e9119d9Sdan sqlite3Insert(pParse, X, 0, F, R); 7994e9119d9Sdan } 800348784efSdrh 8013334d089Sdrh %type insert_cmd {int} 802fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 803fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 804fa86c412Sdrh 8058981b904Sdrh %type idlist_opt {IdList*} 8068981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);} 80781eba73eSdrh %type idlist {IdList*} 80881eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);} 809348784efSdrh 8108981b904Sdrh idlist_opt(A) ::= . {A = 0;} 8118981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP. {A = X;} 8124dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y). 8134dd0d3f8Sdrh {A = sqlite3IdListAppend(pParse->db,A,&Y);} 81481eba73eSdrh idlist(A) ::= nm(Y). 815cf82f0d3Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/} 816348784efSdrh 817382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 818382c0247Sdrh // 819348784efSdrh 820b7916a78Sdrh %type expr {ExprSpan} 821b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 822b7916a78Sdrh %type term {ExprSpan} 823b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 824b7916a78Sdrh 825b7916a78Sdrh %include { 826b7916a78Sdrh /* This is a utility routine used to set the ExprSpan.zStart and 827b7916a78Sdrh ** ExprSpan.zEnd values of pOut so that the span covers the complete 828b7916a78Sdrh ** range of text beginning with pStart and going to the end of pEnd. 829b7916a78Sdrh */ 830b7916a78Sdrh static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ 831b7916a78Sdrh pOut->zStart = pStart->z; 832b7916a78Sdrh pOut->zEnd = &pEnd->z[pEnd->n]; 833b7916a78Sdrh } 834b7916a78Sdrh 835b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 836b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 837b7916a78Sdrh ** that created the expression. 838b7916a78Sdrh */ 83943303de9Sdrh static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token t){ 8400cd874bdSdrh Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); 8410cd874bdSdrh if( p ){ 8420cd874bdSdrh memset(p, 0, sizeof(Expr)); 8430cd874bdSdrh p->op = (u8)op; 8440cd874bdSdrh p->flags = EP_Leaf; 8450cd874bdSdrh p->iAgg = -1; 8460cd874bdSdrh p->u.zToken = (char*)&p[1]; 8470cd874bdSdrh memcpy(p->u.zToken, t.z, t.n); 8480cd874bdSdrh p->u.zToken[t.n] = 0; 8490cd874bdSdrh if( sqlite3Isquote(p->u.zToken[0]) ){ 8500cd874bdSdrh if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; 8510cd874bdSdrh sqlite3Dequote(p->u.zToken); 8520cd874bdSdrh } 8530cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0 8540cd874bdSdrh p->nHeight = 1; 8550cd874bdSdrh #endif 8560cd874bdSdrh } 8570cd874bdSdrh pOut->pExpr = p; 85843303de9Sdrh pOut->zStart = t.z; 85943303de9Sdrh pOut->zEnd = &t.z[t.n]; 860b7916a78Sdrh } 861b7916a78Sdrh } 862348784efSdrh 8634dd0d3f8Sdrh expr(A) ::= term(A). 86443303de9Sdrh expr(A) ::= LP(B) expr(X) RP(E). 86543303de9Sdrh {spanSet(&A,&B,&E); /*A-overwrites-B*/ A.pExpr = X.pExpr;} 86643303de9Sdrh term(A) ::= NULL(X). {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/} 86743303de9Sdrh expr(A) ::= id(X). {spanExpr(&A,pParse,TK_ID,X); /*A-overwrites-X*/} 86843303de9Sdrh expr(A) ::= JOIN_KW(X). {spanExpr(&A,pParse,TK_ID,X); /*A-overwrites-X*/} 8695ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 870410c301fSdrh Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 871410c301fSdrh Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); 872cf82f0d3Sdrh spanSet(&A,&X,&Y); /*A-overwrites-X*/ 873*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); 874e1b6a5b8Sdrh } 875d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 876410c301fSdrh Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 877410c301fSdrh Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); 878410c301fSdrh Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1); 879*abfd35eaSdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); 880cf82f0d3Sdrh spanSet(&A,&X,&Z); /*A-overwrites-X*/ 881*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); 882d24cc427Sdrh } 8830cd874bdSdrh term(A) ::= FLOAT|BLOB(X). {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/} 88443303de9Sdrh term(A) ::= STRING(X). {spanExpr(&A,pParse,@X,X);/*A-overwrites-X*/} 8850cd874bdSdrh term(A) ::= INTEGER(X). { 8860cd874bdSdrh A.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1); 8870cd874bdSdrh A.zStart = X.z; 8880cd874bdSdrh A.zEnd = X.z + X.n; 8890cd874bdSdrh if( A.pExpr ) A.pExpr->flags |= EP_Leaf; 8900cd874bdSdrh } 891f59b12fbSdrh expr(A) ::= VARIABLE(X). { 8928679fbabSdrh if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){ 893de25a88cSdrh u32 n = X.n; 8948f3b137fSdrh spanExpr(&A, pParse, TK_VARIABLE, X); 895de25a88cSdrh sqlite3ExprAssignVarNumber(pParse, A.pExpr, n); 8968f3b137fSdrh }else{ 897b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 898b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 899b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 9008f3b137fSdrh Token t = X; /*A-overwrites-X*/ 9018f3b137fSdrh assert( t.n>=2 ); 90243303de9Sdrh spanSet(&A, &t, &t); 903b7916a78Sdrh if( pParse->nested==0 ){ 90443303de9Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); 905b7916a78Sdrh A.pExpr = 0; 906b7916a78Sdrh }else{ 907*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); 90843303de9Sdrh if( A.pExpr ) sqlite3GetInt32(&t.z[1], &A.pExpr->iTable); 909b7916a78Sdrh } 910f59b12fbSdrh } 911895d7472Sdrh } 9124dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). { 9134dd0d3f8Sdrh A.pExpr = sqlite3ExprAddCollateToken(pParse, A.pExpr, &C, 1); 914b7916a78Sdrh A.zEnd = &C.z[C.n]; 9158b4c40d8Sdrh } 916487e262fSdrh %ifndef SQLITE_OMIT_CAST 917487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 91843303de9Sdrh spanSet(&A,&X,&Y); /*A-overwrites-X*/ 919*abfd35eaSdrh A.pExpr = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1); 920*abfd35eaSdrh sqlite3ExprAttachSubtrees(pParse->db, A.pExpr, E.pExpr, 0); 921487e262fSdrh } 922154d4b24Sdrh %endif SQLITE_OMIT_CAST 923f59b12fbSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). { 924994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 925e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 9264e05c83bSdrh } 927b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 928b7916a78Sdrh spanSet(&A,&X,&E); 9297cea7f95Sdrh if( D==SF_Distinct && A.pExpr ){ 930b7916a78Sdrh A.pExpr->flags |= EP_Distinct; 931fd357974Sdrh } 932e1b6a5b8Sdrh } 933f59b12fbSdrh expr(A) ::= id(X) LP STAR RP(E). { 934b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 935b7916a78Sdrh spanSet(&A,&X,&E); 936e1b6a5b8Sdrh } 937b71090fdSdrh term(A) ::= CTIME_KW(OP). { 938b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &OP); 939b7916a78Sdrh spanSet(&A, &OP, &OP); 940b7916a78Sdrh } 941b7916a78Sdrh 942b7916a78Sdrh %include { 943b7916a78Sdrh /* This routine constructs a binary expression node out of two ExprSpan 944b7916a78Sdrh ** objects and uses the result to populate a new ExprSpan object. 945b7916a78Sdrh */ 946b7916a78Sdrh static void spanBinaryExpr( 947b7916a78Sdrh Parse *pParse, /* The parsing context. Errors accumulate here */ 948b7916a78Sdrh int op, /* The binary operation */ 9494dd0d3f8Sdrh ExprSpan *pLeft, /* The left operand, and output */ 950b7916a78Sdrh ExprSpan *pRight /* The right operand */ 951b7916a78Sdrh ){ 952*abfd35eaSdrh pLeft->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr); 9534dd0d3f8Sdrh pLeft->zEnd = pRight->zEnd; 954417ec638Sdrh } 9559109b7f8Sdrh 9569109b7f8Sdrh /* If doNot is true, then add a TK_NOT Expr-node wrapper around the 9579109b7f8Sdrh ** outside of *ppExpr. 9589109b7f8Sdrh */ 9594dd0d3f8Sdrh static void exprNot(Parse *pParse, int doNot, ExprSpan *pSpan){ 9604dd0d3f8Sdrh if( doNot ){ 961*abfd35eaSdrh pSpan->pExpr = sqlite3PExpr(pParse, TK_NOT, pSpan->pExpr, 0); 9624dd0d3f8Sdrh } 9639109b7f8Sdrh } 964b71090fdSdrh } 965b7916a78Sdrh 96671c57db0Sdan expr(A) ::= LP(L) nexprlist(X) COMMA expr(Y) RP(R). { 9678bd0d58eSdrh ExprList *pList = sqlite3ExprListAppend(pParse, X, Y.pExpr); 968*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); 96971c57db0Sdan if( A.pExpr ){ 9708bd0d58eSdrh A.pExpr->x.pList = pList; 97171c57db0Sdan spanSet(&A, &L, &R); 9728bd0d58eSdrh }else{ 9738bd0d58eSdrh sqlite3ExprListDelete(pParse->db, pList); 97471c57db0Sdan } 97571c57db0Sdan } 97671c57db0Sdan 9774dd0d3f8Sdrh expr(A) ::= expr(A) AND(OP) expr(Y). {spanBinaryExpr(pParse,@OP,&A,&Y);} 9784dd0d3f8Sdrh expr(A) ::= expr(A) OR(OP) expr(Y). {spanBinaryExpr(pParse,@OP,&A,&Y);} 9794dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y). 9804dd0d3f8Sdrh {spanBinaryExpr(pParse,@OP,&A,&Y);} 9814dd0d3f8Sdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y). {spanBinaryExpr(pParse,@OP,&A,&Y);} 9824dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 9834dd0d3f8Sdrh {spanBinaryExpr(pParse,@OP,&A,&Y);} 9844dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y). 9854dd0d3f8Sdrh {spanBinaryExpr(pParse,@OP,&A,&Y);} 9864dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y). 9874dd0d3f8Sdrh {spanBinaryExpr(pParse,@OP,&A,&Y);} 9884dd0d3f8Sdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {spanBinaryExpr(pParse,@OP,&A,&Y);} 989410c301fSdrh %type likeop {Token} 990410c301fSdrh likeop(A) ::= LIKE_KW|MATCH(X). {A=X;/*A-overwrites-X*/} 991410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/} 9924dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y). [LIKE_KW] { 9938aa34ae0Sdrh ExprList *pList; 994410c301fSdrh int bNot = OP.n & 0x80000000; 995410c301fSdrh OP.n &= 0x7fffffff; 996b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 9974dd0d3f8Sdrh pList = sqlite3ExprListAppend(pParse,pList, A.pExpr); 998410c301fSdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP); 999410c301fSdrh exprNot(pParse, bNot, &A); 1000b7916a78Sdrh A.zEnd = Y.zEnd; 1001b7916a78Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 10020ac65892Sdrh } 10034dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 10041dca1458Sdrh ExprList *pList; 1005410c301fSdrh int bNot = OP.n & 0x80000000; 1006410c301fSdrh OP.n &= 0x7fffffff; 10071dca1458Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 10084dd0d3f8Sdrh pList = sqlite3ExprListAppend(pParse,pList, A.pExpr); 10091dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 1010410c301fSdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP); 1011410c301fSdrh exprNot(pParse, bNot, &A); 10121dca1458Sdrh A.zEnd = E.zEnd; 10131dca1458Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 10141dca1458Sdrh } 10157c6303c0Sdanielk1977 1016b7916a78Sdrh %include { 1017b7916a78Sdrh /* Construct an expression node for a unary postfix operator 1018b7916a78Sdrh */ 1019b7916a78Sdrh static void spanUnaryPostfix( 1020b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 1021b7916a78Sdrh int op, /* The operator */ 10224dd0d3f8Sdrh ExprSpan *pOperand, /* The operand, and output */ 1023b7916a78Sdrh Token *pPostOp /* The operand token for setting the span */ 1024b7916a78Sdrh ){ 1025*abfd35eaSdrh pOperand->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0); 10264dd0d3f8Sdrh pOperand->zEnd = &pPostOp->z[pPostOp->n]; 1027e1b6a5b8Sdrh } 102833048c0bSdrh } 1029b7916a78Sdrh 10304dd0d3f8Sdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E). {spanUnaryPostfix(pParse,@E,&A,&E);} 10314dd0d3f8Sdrh expr(A) ::= expr(A) NOT NULL(E). {spanUnaryPostfix(pParse,TK_NOTNULL,&A,&E);} 10326a2fe093Sdrh 10336a51741dSdrh %include { 10346a51741dSdrh /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 10356a51741dSdrh ** unary TK_ISNULL or TK_NOTNULL expression. */ 10366a51741dSdrh static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 10376a51741dSdrh sqlite3 *db = pParse->db; 1038895c00e1Sdan if( pA && pY && pY->op==TK_NULL ){ 10395e17e8b7Sshaneh pA->op = (u8)op; 10406a51741dSdrh sqlite3ExprDelete(db, pA->pRight); 10416a51741dSdrh pA->pRight = 0; 10426a51741dSdrh } 10436a51741dSdrh } 10446a51741dSdrh } 10456a51741dSdrh 10466a2fe093Sdrh // expr1 IS expr2 10476a2fe093Sdrh // expr1 IS NOT expr2 10486a2fe093Sdrh // 10496a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2 10506a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT. 10516a2fe093Sdrh // 10524dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y). { 10534dd0d3f8Sdrh spanBinaryExpr(pParse,TK_IS,&A,&Y); 10546a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL); 10556a2fe093Sdrh } 10564dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). { 10574dd0d3f8Sdrh spanBinaryExpr(pParse,TK_ISNOT,&A,&Y); 10586a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL); 10596a2fe093Sdrh } 1060b7916a78Sdrh 1061b7916a78Sdrh %include { 1062b7916a78Sdrh /* Construct an expression node for a unary prefix operator 1063b7916a78Sdrh */ 1064b7916a78Sdrh static void spanUnaryPrefix( 1065b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 1066b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 1067b7916a78Sdrh int op, /* The operator */ 1068b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 1069b7916a78Sdrh Token *pPreOp /* The operand token for setting the span */ 1070b7916a78Sdrh ){ 1071b7916a78Sdrh pOut->zStart = pPreOp->z; 1072*abfd35eaSdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0); 1073b7916a78Sdrh pOut->zEnd = pOperand->zEnd; 107433048c0bSdrh } 107581a20f21Sdrh } 1076b7916a78Sdrh 1077b7916a78Sdrh 1078b7916a78Sdrh 107943303de9Sdrh expr(A) ::= NOT(B) expr(X). 108043303de9Sdrh {spanUnaryPrefix(&A,pParse,@B,&X,&B);/*A-overwrites-B*/} 108143303de9Sdrh expr(A) ::= BITNOT(B) expr(X). 108243303de9Sdrh {spanUnaryPrefix(&A,pParse,@B,&X,&B);/*A-overwrites-B*/} 10837ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT] 108443303de9Sdrh {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);/*A-overwrites-B*/} 10857ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT] 108643303de9Sdrh {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);/*A-overwrites-B*/} 1087b7916a78Sdrh 10882e3a1f16Sdrh %type between_op {int} 10892e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 10902e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 10914dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 1092b7916a78Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); 1093b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); 1094*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, A.pExpr, 0); 1095b7916a78Sdrh if( A.pExpr ){ 1096b7916a78Sdrh A.pExpr->x.pList = pList; 109753f733c7Sdrh }else{ 1098633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 109953f733c7Sdrh } 11004dd0d3f8Sdrh exprNot(pParse, N, &A); 1101b7916a78Sdrh A.zEnd = Y.zEnd; 1102fef5208cSdrh } 11033e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 11042e3a1f16Sdrh %type in_op {int} 11052e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 11062e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 11074dd0d3f8Sdrh expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP(E). [IN] { 1108094430ebSdrh if( Y==0 ){ 1109473c1bf2Sdan /* Expressions of the form 1110473c1bf2Sdan ** 1111473c1bf2Sdan ** expr1 IN () 1112473c1bf2Sdan ** expr1 NOT IN () 1113473c1bf2Sdan ** 1114473c1bf2Sdan ** simplify to constants 0 (false) and 1 (true), respectively, 1115473c1bf2Sdan ** regardless of the value of expr1. 1116473c1bf2Sdan */ 11174dd0d3f8Sdrh sqlite3ExprDelete(pParse->db, A.pExpr); 1118*abfd35eaSdrh A.pExpr = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); 11192b59b3a4Sdrh }else if( Y->nExpr==1 ){ 11202b59b3a4Sdrh /* Expressions of the form: 11212b59b3a4Sdrh ** 11222b59b3a4Sdrh ** expr1 IN (?1) 11232b59b3a4Sdrh ** expr1 NOT IN (?2) 11242b59b3a4Sdrh ** 1125fbb24d10Sdrh ** with exactly one value on the RHS can be simplified to something 1126fbb24d10Sdrh ** like this: 11272b59b3a4Sdrh ** 1128fbb24d10Sdrh ** expr1 == ?1 1129fbb24d10Sdrh ** expr1 <> ?2 1130fbb24d10Sdrh ** 1131fbb24d10Sdrh ** But, the RHS of the == or <> is marked with the EP_Generic flag 1132fbb24d10Sdrh ** so that it may not contribute to the computation of comparison 1133fbb24d10Sdrh ** affinity or the collating sequence to use for comparison. Otherwise, 1134fbb24d10Sdrh ** the semantics would be subtly different from IN or NOT IN. 11352b59b3a4Sdrh */ 1136fbb24d10Sdrh Expr *pRHS = Y->a[0].pExpr; 11372b59b3a4Sdrh Y->a[0].pExpr = 0; 11382b59b3a4Sdrh sqlite3ExprListDelete(pParse->db, Y); 11395b1420e0Sdrh /* pRHS cannot be NULL because a malloc error would have been detected 11405b1420e0Sdrh ** before now and control would have never reached this point */ 11415b1420e0Sdrh if( ALWAYS(pRHS) ){ 1142fbb24d10Sdrh pRHS->flags &= ~EP_Collate; 1143fbb24d10Sdrh pRHS->flags |= EP_Generic; 1144fbb24d10Sdrh } 1145*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A.pExpr, pRHS); 1146094430ebSdrh }else{ 1147*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0); 1148b7916a78Sdrh if( A.pExpr ){ 1149b7916a78Sdrh A.pExpr->x.pList = Y; 11502308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); 1151d5d56523Sdanielk1977 }else{ 1152633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1153d5d56523Sdanielk1977 } 11544dd0d3f8Sdrh exprNot(pParse, N, &A); 1155094430ebSdrh } 1156b7916a78Sdrh A.zEnd = &E.z[E.n]; 1157fef5208cSdrh } 115851522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 115943303de9Sdrh spanSet(&A,&B,&E); /*A-overwrites-B*/ 1160*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0); 116108de4f79Sdrh sqlite3PExprAddSelect(pParse, A.pExpr, X); 116251522cd3Sdrh } 11634dd0d3f8Sdrh expr(A) ::= expr(A) in_op(N) LP select(Y) RP(E). [IN] { 1164*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0); 116508de4f79Sdrh sqlite3PExprAddSelect(pParse, A.pExpr, Y); 11664dd0d3f8Sdrh exprNot(pParse, N, &A); 1167b7916a78Sdrh A.zEnd = &E.z[E.n]; 1168fef5208cSdrh } 11695fbab882Sdrh expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] { 117017435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 117108de4f79Sdrh Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 11729de4757cSdrh if( E ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); 1173*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, A.pExpr, 0); 117408de4f79Sdrh sqlite3PExprAddSelect(pParse, A.pExpr, pSelect); 11754dd0d3f8Sdrh exprNot(pParse, N, &A); 1176b7916a78Sdrh A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; 117723b2db23Sdrh } 117851522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 117943303de9Sdrh Expr *p; 118043303de9Sdrh spanSet(&A,&B,&E); /*A-overwrites-B*/ 1181*abfd35eaSdrh p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); 118208de4f79Sdrh sqlite3PExprAddSelect(pParse, p, Y); 118351522cd3Sdrh } 1184154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1185fef5208cSdrh 118617a7f8ddSdrh /* CASE expressions */ 118717a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 118843303de9Sdrh spanSet(&A,&C,&E); /*A-overwrites-C*/ 1189*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0); 1190b7916a78Sdrh if( A.pExpr ){ 1191c5cd1249Sdrh A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; 11922308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); 119353f733c7Sdrh }else{ 1194633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1195c5cd1249Sdrh sqlite3ExprDelete(pParse->db, Z); 119653f733c7Sdrh } 119717a7f8ddSdrh } 119817a7f8ddSdrh %type case_exprlist {ExprList*} 1199633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 12004dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). { 12014dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse,A, Y.pExpr); 1202b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 120317a7f8ddSdrh } 120417a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 1205b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, Y.pExpr); 1206b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 120717a7f8ddSdrh } 120817a7f8ddSdrh %type case_else {Expr*} 1209633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 1210b7916a78Sdrh case_else(A) ::= ELSE expr(X). {A = X.pExpr;} 121117a7f8ddSdrh case_else(A) ::= . {A = 0;} 121217a7f8ddSdrh %type case_operand {Expr*} 1213633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 1214cf82f0d3Sdrh case_operand(A) ::= expr(X). {A = X.pExpr; /*A-overwrites-X*/} 121517a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1216348784efSdrh 1217348784efSdrh %type exprlist {ExprList*} 1218633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 12199245c243Sdrh %type nexprlist {ExprList*} 1220633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1221348784efSdrh 12224dd0d3f8Sdrh exprlist(A) ::= nexprlist(A). 12239245c243Sdrh exprlist(A) ::= . {A = 0;} 12244dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y). 12254dd0d3f8Sdrh {A = sqlite3ExprListAppend(pParse,A,Y.pExpr);} 122617435752Sdrh nexprlist(A) ::= expr(Y). 1227cf82f0d3Sdrh {A = sqlite3ExprListAppend(pParse,0,Y.pExpr); /*A-overwrites-Y*/} 12289245c243Sdrh 1229a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY 12305fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside 12315fbab882Sdrh ** of parenthesis */ 12325fbab882Sdrh %type paren_exprlist {ExprList*} 12335fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 12345fbab882Sdrh paren_exprlist(A) ::= . {A = 0;} 12355fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP. {A = X;} 1236a522473cSdrh %endif SQLITE_OMIT_SUBQUERY 12375fbab882Sdrh 1238cce7d176Sdrh 1239382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1240382c0247Sdrh // 1241d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 1242108aa00aSdrh ON nm(Y) LP sortlist(Z) RP where_opt(W). { 124317435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 124417435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 124562340f84Sdrh &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF); 12469cfcf5d4Sdrh } 1247717e6402Sdrh 1248717e6402Sdrh %type uniqueflag {int} 12499cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 12509cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1251348784efSdrh 1252348784efSdrh 1253108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList 1254108aa00aSdrh // from a list of identifiers. The identifier names are in ExprList.a[].zName. 1255108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it 1256108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList(). 1257108aa00aSdrh // 1258108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal 1259108aa00aSdrh // used for the arguments to an index. That is just an historical accident. 1260108aa00aSdrh // 1261108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE: Some prior versions of SQLite accepted 1262108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate 1263108aa00aSdrh // places - places that might have been stored in the sqlite_master schema. 1264108aa00aSdrh // Those extra features were ignored. But because they might be in some 1265108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading 1266108aa00aSdrh // historical schemas. 1267108aa00aSdrh // 1268108aa00aSdrh %type eidlist {ExprList*} 1269108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);} 1270108aa00aSdrh %type eidlist_opt {ExprList*} 1271108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1272108aa00aSdrh 1273108aa00aSdrh %include { 1274108aa00aSdrh /* Add a single new term to an ExprList that is used to store a 1275108aa00aSdrh ** list of identifiers. Report an error if the ID list contains 1276108aa00aSdrh ** a COLLATE clause or an ASC or DESC keyword, except ignore the 1277108aa00aSdrh ** error while parsing a legacy schema. 1278108aa00aSdrh */ 1279108aa00aSdrh static ExprList *parserAddExprIdListTerm( 1280108aa00aSdrh Parse *pParse, 1281108aa00aSdrh ExprList *pPrior, 1282108aa00aSdrh Token *pIdToken, 1283108aa00aSdrh int hasCollate, 1284108aa00aSdrh int sortOrder 1285108aa00aSdrh ){ 1286108aa00aSdrh ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); 1287108aa00aSdrh if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) 1288108aa00aSdrh && pParse->db->init.busy==0 1289108aa00aSdrh ){ 1290108aa00aSdrh sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", 1291108aa00aSdrh pIdToken->n, pIdToken->z); 12920202b29eSdanielk1977 } 1293108aa00aSdrh sqlite3ExprListSetName(pParse, p, pIdToken, 1); 1294108aa00aSdrh return p; 1295108aa00aSdrh } 1296108aa00aSdrh } // end %include 1297108aa00aSdrh 1298108aa00aSdrh eidlist_opt(A) ::= . {A = 0;} 1299108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP. {A = X;} 13004dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z). { 13014dd0d3f8Sdrh A = parserAddExprIdListTerm(pParse, A, &Y, C, Z); 1302108aa00aSdrh } 1303108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). { 1304cf82f0d3Sdrh A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/ 13050202b29eSdanielk1977 } 13060202b29eSdanielk1977 1307108aa00aSdrh %type collate {int} 1308108aa00aSdrh collate(C) ::= . {C = 0;} 1309108aa00aSdrh collate(C) ::= COLLATE ids. {C = 1;} 1310a34001c9Sdrh 1311348784efSdrh 13128aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1313382c0247Sdrh // 13144d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1315982cef7eSdrh 1316382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1317382c0247Sdrh // 1318154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1319fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 13209ef5e770Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 13219ef5e770Sdrh cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} 1322fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1323154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1324f57b14a6Sdrh 1325382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1326382c0247Sdrh // 132713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 132891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1329ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1330ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1331ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1332ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1333ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1334ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1335ada2ee0dSdrh 1336cf82f0d3Sdrh nmnum(A) ::= plus_num(A). 1337cf82f0d3Sdrh nmnum(A) ::= nm(A). 1338cf82f0d3Sdrh nmnum(A) ::= ON(A). 1339cf82f0d3Sdrh nmnum(A) ::= DELETE(A). 1340cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A). 1341154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 1342f59b12fbSdrh %token_class number INTEGER|FLOAT. 13438395b7b6Sdrh plus_num(A) ::= PLUS number(X). {A = X;} 1344cf82f0d3Sdrh plus_num(A) ::= number(A). 1345f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1346c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1347f0f258b1Sdrh 1348b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1349b7f9164eSdrh 1350d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 13514b59ab5eSdrh Token all; 13524b59ab5eSdrh all.z = A.z; 1353b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 13544adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1355f0f258b1Sdrh } 1356f0f258b1Sdrh 1357fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1358fdd48a76Sdrh trigger_time(C) trigger_event(D) 135960218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 136060218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 1361cf82f0d3Sdrh A = (Z.n==0?B:Z); /*A-overwrites-T*/ 1362c3f9bad2Sdanielk1977 } 1363c3f9bad2Sdanielk1977 1364c3f9bad2Sdanielk1977 %type trigger_time {int} 1365c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1366c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1367c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1368c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1369c3f9bad2Sdanielk1977 1370ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1371633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1372cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X). {A.a = @X; /*A-overwrites-X*/ A.b = 0;} 1373cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X). {A.a = @X; /*A-overwrites-X*/ A.b = 0;} 137481eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;} 1375c3f9bad2Sdanielk1977 137660218d2aSdrh foreach_clause ::= . 137760218d2aSdrh foreach_clause ::= FOR EACH ROW. 1378c3f9bad2Sdanielk1977 1379c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1380633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1381c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1382b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1383c3f9bad2Sdanielk1977 1384c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1385633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 13864dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. { 13874dd0d3f8Sdrh assert( A!=0 ); 13884dd0d3f8Sdrh A->pLast->pNext = X; 13894dd0d3f8Sdrh A->pLast = X; 1390a69d9168Sdrh } 13914dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. { 13924dd0d3f8Sdrh assert( A!=0 ); 13934dd0d3f8Sdrh A->pLast = A; 139481238966Sdrh } 1395c3f9bad2Sdanielk1977 1396b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements 1397b1819a0bSdrh // within a trigger. The table to INSERT, UPDATE, or DELETE is always in 1398b1819a0bSdrh // the same database as the table that the trigger fires on. 1399b1819a0bSdrh // 1400b1819a0bSdrh %type trnm {Token} 14014dd0d3f8Sdrh trnm(A) ::= nm(A). 1402b1819a0bSdrh trnm(A) ::= nm DOT nm(X). { 1403b1819a0bSdrh A = X; 1404b1819a0bSdrh sqlite3ErrorMsg(pParse, 1405b1819a0bSdrh "qualified table names are not allowed on INSERT, UPDATE, and DELETE " 1406b1819a0bSdrh "statements within triggers"); 1407b1819a0bSdrh } 1408b1819a0bSdrh 1409b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE 1410b1819a0bSdrh // statements within triggers. We make a specific error message for this 1411b1819a0bSdrh // since it is an exception to the default grammar rules. 1412b1819a0bSdrh // 1413b1819a0bSdrh tridxby ::= . 1414b1819a0bSdrh tridxby ::= INDEXED BY nm. { 1415b1819a0bSdrh sqlite3ErrorMsg(pParse, 1416b1819a0bSdrh "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " 1417b1819a0bSdrh "within triggers"); 1418b1819a0bSdrh } 1419b1819a0bSdrh tridxby ::= NOT INDEXED. { 1420b1819a0bSdrh sqlite3ErrorMsg(pParse, 1421b1819a0bSdrh "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " 1422b1819a0bSdrh "within triggers"); 1423b1819a0bSdrh } 1424b1819a0bSdrh 1425b1819a0bSdrh 1426b1819a0bSdrh 1427c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1428633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1429c3f9bad2Sdanielk1977 // UPDATE 1430b1819a0bSdrh trigger_cmd(A) ::= 1431b1819a0bSdrh UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). 143217435752Sdrh {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R);} 1433c3f9bad2Sdanielk1977 1434c3f9bad2Sdanielk1977 // INSERT 14358981b904Sdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) idlist_opt(F) select(S). 143643303de9Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, S, R);/*A-overwrites-R*/} 1437c3f9bad2Sdanielk1977 1438c3f9bad2Sdanielk1977 // DELETE 1439b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). 144017435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1441c3f9bad2Sdanielk1977 1442c3f9bad2Sdanielk1977 // SELECT 1443cf82f0d3Sdrh trigger_cmd(A) ::= select(X). 1444cf82f0d3Sdrh {A = sqlite3TriggerSelectStep(pParse->db, X); /*A-overwrites-X*/} 1445c3f9bad2Sdanielk1977 14466f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 14474b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1448cf82f0d3Sdrh spanSet(&A,&X,&Y); /*A-overwrites-X*/ 1449*abfd35eaSdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0); 1450b7916a78Sdrh if( A.pExpr ){ 1451b7916a78Sdrh A.pExpr->affinity = OE_Ignore; 14524b59ab5eSdrh } 14538aa34ae0Sdrh } 145474ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 1455cf82f0d3Sdrh spanSet(&A,&X,&Y); /*A-overwrites-X*/ 1456*abfd35eaSdrh A.pExpr = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1); 1457b7916a78Sdrh if( A.pExpr ) { 1458b7916a78Sdrh A.pExpr->affinity = (char)T; 14594b59ab5eSdrh } 14608aa34ae0Sdrh } 1461154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1462b7f9164eSdrh 146374ad7fe9Sdrh %type raisetype {int} 146474ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 146574ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 146674ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 146774ad7fe9Sdrh 14686f34903eSdanielk1977 1469c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1470b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1471fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1472fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1473c3f9bad2Sdanielk1977 } 1474154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1475113088ecSdrh 1476113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1477fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1478f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1479b7916a78Sdrh sqlite3Attach(pParse, F.pExpr, D.pExpr, K); 14801c2d8414Sdrh } 1481fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1482b7916a78Sdrh sqlite3Detach(pParse, D.pExpr); 1483fdbcdee5Sdrh } 1484fdbcdee5Sdrh 1485f744bb56Sdanielk1977 %type key_opt {Expr*} 1486633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1487f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1488b7916a78Sdrh key_opt(A) ::= KEY expr(X). { A = X.pExpr; } 1489113088ecSdrh 1490113088ecSdrh database_kw_opt ::= DATABASE. 1491113088ecSdrh database_kw_opt ::= . 1492fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 14934343fea2Sdrh 14944343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 14954343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 14964343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 14974343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1498154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 14999fd2a9a0Sdanielk1977 15009f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 15019f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 15029f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 15039f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 15049f18e8a0Sdrh %endif 15059f18e8a0Sdrh 15069fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 15079fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 15089fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 15099fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 15109fd2a9a0Sdanielk1977 } 1511986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname 1512986dde70Sdrh ADD kwcolumn_opt columnname(Y) carglist. { 1513986dde70Sdrh Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n; 151419a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 151519a8e7e8Sdanielk1977 } 151619a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 15174a642b60Sdrh disableLookaside(pParse); 151819a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 151919a8e7e8Sdanielk1977 } 152019a8e7e8Sdanielk1977 kwcolumn_opt ::= . 152119a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1522154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1523e09daa90Sdrh 1524e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1525e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1526b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1527b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1528b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E) 1529b421b894Sdrh nm(X) dbnm(Y) USING nm(Z). { 1530b421b894Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E); 1531b9bb7c18Sdrh } 1532e09daa90Sdrh vtabarglist ::= vtabarg. 1533e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1534b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1535b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1536b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1537b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1538b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1539b9bb7c18Sdrh anylist ::= . 1540aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1541aaac8b4eSdrh anylist ::= anylist ANY. 1542154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 15438b471863Sdrh 15448b471863Sdrh 15458b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS //////////////////////////// 15467d562dbeSdan %type with {With*} 15477d562dbeSdan %type wqlist {With*} 15487d562dbeSdan %destructor with {sqlite3WithDelete(pParse->db, $$);} 15494e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);} 15507d562dbeSdan 15517d562dbeSdan with(A) ::= . {A = 0;} 15528b471863Sdrh %ifndef SQLITE_OMIT_CTE 15537d562dbeSdan with(A) ::= WITH wqlist(W). { A = W; } 15547d562dbeSdan with(A) ::= WITH RECURSIVE wqlist(W). { A = W; } 15557d562dbeSdan 1556108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. { 1557cf82f0d3Sdrh A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/ 15587d562dbeSdan } 15594dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. { 15604dd0d3f8Sdrh A = sqlite3WithAdd(pParse, A, &X, Y, Z); 15618b471863Sdrh } 15628b471863Sdrh %endif SQLITE_OMIT_CTE 1563