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 { 38128255fcSdrh UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ 398fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 408fc3345fSdrh } 41487e262fSdrh 42487e262fSdrh // The name of the generated procedure that implements the parser 43487e262fSdrh // is as follows: 444adee20fSdanielk1977 %name sqlite3Parser 45487e262fSdrh 46487e262fSdrh // The following text is included near the beginning of the C source 47487e262fSdrh // code file that implements the parser. 48487e262fSdrh // 49348784efSdrh %include { 50348784efSdrh #include "sqliteInt.h" 519bbca4c1Sdrh 529bbca4c1Sdrh /* 53d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 54d3ec02d3Sdrh ** automaton. 55d3ec02d3Sdrh */ 56d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 57d3ec02d3Sdrh 58d3ec02d3Sdrh /* 598a415d37Sdrh ** Make yytestcase() the same as testcase() 608a415d37Sdrh */ 618a415d37Sdrh #define yytestcase(X) testcase(X) 628a415d37Sdrh 638a415d37Sdrh /* 64ad3cab52Sdrh ** An instance of this structure holds information about the 65ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 669bbca4c1Sdrh */ 67ad3cab52Sdrh struct LimitVal { 68a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 69a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 70ad3cab52Sdrh }; 71c3f9bad2Sdanielk1977 72c3f9bad2Sdanielk1977 /* 732e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 742e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 752e3a1f16Sdrh */ 762e3a1f16Sdrh struct LikeOp { 77b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 78f9df4498Sdrh int bNot; /* True if the NOT keyword is present */ 792e3a1f16Sdrh }; 802e3a1f16Sdrh 812e3a1f16Sdrh /* 82ad3cab52Sdrh ** An instance of the following structure describes the event of a 83ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 84ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 85ad3cab52Sdrh ** 86ad3cab52Sdrh ** UPDATE ON (a,b,c) 87ad3cab52Sdrh ** 88ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 89c3f9bad2Sdanielk1977 */ 90ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 91caec2f12Sdrh 9225d6543dSdrh /* 9325d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 9425d6543dSdrh */ 9525d6543dSdrh struct AttachKey { int type; Token key; }; 9625d6543dSdrh 97caec2f12Sdrh } // end %include 98348784efSdrh 99826fb5a3Sdrh // Input is a single SQL command 100c4a3c779Sdrh input ::= cmdlist. 101094b2bbfSdrh cmdlist ::= cmdlist ecmd. 102826fb5a3Sdrh cmdlist ::= ecmd. 103b7f9164eSdrh ecmd ::= SEMI. 104b7f9164eSdrh ecmd ::= explain cmdx SEMI. 1054adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 106b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 107b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 108ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } 109154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 110200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 111348784efSdrh 112382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 113c4a3c779Sdrh // 114fa86c412Sdrh 115684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 116c4a3c779Sdrh trans_opt ::= . 117c4a3c779Sdrh trans_opt ::= TRANSACTION. 1185ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 119684917c2Sdrh %type transtype {int} 120684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 121684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 122684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 123684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1244adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1254adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1264adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 127c4a3c779Sdrh 128fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 129fd7f0452Sdanielk1977 savepoint_opt ::= . 130fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 131fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 132fd7f0452Sdanielk1977 } 133fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 134fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 135fd7f0452Sdanielk1977 } 136fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 137fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 138fd7f0452Sdanielk1977 } 139fd7f0452Sdanielk1977 140382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 141348784efSdrh // 142348784efSdrh cmd ::= create_table create_table_args. 143d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 144f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 145969fa7c1Sdrh } 146d9da78a2Sdrh createkw(A) ::= CREATE(X). { 147d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 148d9da78a2Sdrh A = X; 149d9da78a2Sdrh } 150faa59554Sdrh %type ifnotexists {int} 151faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 152faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 153f57b3399Sdrh %type temp {int} 15453c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 155d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 156154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 157d24cc427Sdrh temp(A) ::= . {A = 0;} 1585969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). { 1595969da4aSdrh sqlite3EndTable(pParse,&X,&E,F,0); 160969fa7c1Sdrh } 161969fa7c1Sdrh create_table_args ::= AS select(S). { 1625969da4aSdrh sqlite3EndTable(pParse,0,0,0,S); 163633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 164969fa7c1Sdrh } 1655969da4aSdrh %type table_options {u8} 1665969da4aSdrh table_options(A) ::= . {A = 0;} 1675969da4aSdrh table_options(A) ::= WITHOUT nm(X). { 1685969da4aSdrh if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){ 169*fccda8a1Sdrh A = TF_WithoutRowid | TF_NoVisibleRowid; 1705969da4aSdrh }else{ 1715969da4aSdrh A = 0; 1725969da4aSdrh sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); 1735969da4aSdrh } 1745969da4aSdrh } 175348784efSdrh columnlist ::= columnlist COMMA column. 176348784efSdrh columnlist ::= column. 177348784efSdrh 178487e262fSdrh // A "column" is a complete description of a single column in a 179487e262fSdrh // CREATE TABLE statement. This includes the column name, its 180487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 181487e262fSdrh // NOT NULL and so forth. 182348784efSdrh // 18319a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 18419a8e7e8Sdanielk1977 A.z = X.z; 185b27b7f5dSdrh A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 18619a8e7e8Sdanielk1977 } 18719a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 18819a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 18919a8e7e8Sdanielk1977 A = X; 1904dc330ddSdrh pParse->constraintName.n = 0; 19119a8e7e8Sdanielk1977 } 19219a8e7e8Sdanielk1977 193c4a3c779Sdrh 194c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 195c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 196c4a3c779Sdrh // 197f59b12fbSdrh %token_class id ID|INDEXED. 1980bd1f4eaSdrh 19934e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 20034e33bb8Sdrh // fallback to ID if they will not parse as their original value. 20134e33bb8Sdrh // This obviates the need for the "id" nonterminal. 20234e33bb8Sdrh // 2030bd1f4eaSdrh %fallback ID 2041da40a38Sdan ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 2051da40a38Sdan CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 2061da40a38Sdan IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 2078b471863Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW 2088b471863Sdrh ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT 209b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 210b7f9164eSdrh EXCEPT INTERSECT UNION 211154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 212a073384fSdrh REINDEX RENAME CTIME_KW IF 213b7f9164eSdrh . 214e09daa90Sdrh %wildcard ANY. 215c4a3c779Sdrh 216f7b5496eSdrh // Define operator precedence early so that this is the first occurrence 2172d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2182d3917daSdrh // causes them to be assigned integer values that are close together, 2192d3917daSdrh // which keeps parser tables smaller. 2202d3917daSdrh // 221f2bc013cSdrh // The token values assigned to these symbols is determined by the order 222f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 223f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 224f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 225f2bc013cSdrh // constraint. 226f2bc013cSdrh // 2272d3917daSdrh %left OR. 2282d3917daSdrh %left AND. 2292d3917daSdrh %right NOT. 23003bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2319a43267bSdrh %left GT LE LT GE. 2327c6303c0Sdanielk1977 %right ESCAPE. 2332d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2342d3917daSdrh %left PLUS MINUS. 2352d3917daSdrh %left STAR SLASH REM. 236a34001c9Sdrh %left CONCAT. 237a34001c9Sdrh %left COLLATE. 2387ba5bc5bSdrh %right BITNOT. 2392d3917daSdrh 240c4a3c779Sdrh // And "ids" is an identifer-or-string. 241c4a3c779Sdrh // 242f59b12fbSdrh %token_class ids ID|STRING. 243c4a3c779Sdrh 2445ad1a6c8Sdrh // The name of a column or table can be any of the following: 2455ad1a6c8Sdrh // 2465ad1a6c8Sdrh %type nm {Token} 247296a483cSdrh nm(A) ::= id(X). {A = X;} 2485ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2495ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2505ad1a6c8Sdrh 251487e262fSdrh // A typetoken is really one or more tokens that form a type name such 252487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 253487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 254487e262fSdrh // 255487e262fSdrh %type typetoken {Token} 256382c0247Sdrh type ::= . 257487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 258487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 259487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 260487e262fSdrh A.z = X.z; 261b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 262487e262fSdrh } 263487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 264487e262fSdrh A.z = X.z; 265b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 266487e262fSdrh } 267382c0247Sdrh %type typename {Token} 268382c0247Sdrh typename(A) ::= ids(X). {A = X;} 269b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 27060218d2aSdrh signed ::= plus_num. 27160218d2aSdrh signed ::= minus_num. 272487e262fSdrh 273487e262fSdrh // "carglist" is a list of additional constraints that come after the 274487e262fSdrh // column name and column type in a CREATE TABLE statement. 275487e262fSdrh // 2764dc330ddSdrh carglist ::= carglist ccons. 277348784efSdrh carglist ::= . 2784dc330ddSdrh ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 279b7916a78Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 280b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 281b7916a78Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 282f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 283b7916a78Sdrh ExprSpan v; 284b7916a78Sdrh v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); 285b7916a78Sdrh v.zStart = A.z; 286b7916a78Sdrh v.zEnd = X.zEnd; 287b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2887977a17fSdanielk1977 } 2892b7acc35Sdrh ccons ::= DEFAULT id(X). { 290b7916a78Sdrh ExprSpan v; 291b7916a78Sdrh spanExpr(&v, pParse, TK_STRING, &X); 292b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2937977a17fSdanielk1977 } 294348784efSdrh 295382c0247Sdrh // In addition to the type name, we also care about the primary key and 296382c0247Sdrh // UNIQUE constraints. 297348784efSdrh // 2980d316a40Sdrh ccons ::= NULL onconf. 2994adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 300fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 301fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 3028a9789b6Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 303b7916a78Sdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} 304c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 3054adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 3064adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 30739002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 30804738cb9Sdrh 309205f48e6Sdrh // The optional AUTOINCREMENT keyword 310205f48e6Sdrh %type autoinc {int} 311205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3122958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 313205f48e6Sdrh 314c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 315c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 316c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 317c2eef3b3Sdrh // check fails. 31804738cb9Sdrh // 319c2eef3b3Sdrh %type refargs {int} 320fcf486c3Sdrh refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */} 32150af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; } 322c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 323c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 324c29c5aa1Sdrh refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; } 325c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 326c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 327c2eef3b3Sdrh %type refact {int} 328fcf486c3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */} 329fcf486c3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */} 330fcf486c3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */} 331fcf486c3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 332fcf486c3Sdrh refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 333c2eef3b3Sdrh %type defer_subclause {int} 3341da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 335c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 336c2eef3b3Sdrh %type init_deferred_pred_opt {int} 337c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 338c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 339c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 340348784efSdrh 34119a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 342ab35eaedSdrh conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 343ab35eaedSdrh conslist ::= conslist tconscomma tcons. 344ab35eaedSdrh conslist ::= tcons. 345ab35eaedSdrh tconscomma ::= COMMA. {pParse->constraintName.n = 0;} 346ab35eaedSdrh tconscomma ::= . 347ab35eaedSdrh tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 348f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 349fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3509cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3518a9789b6Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 352b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 353b7916a78Sdrh {sqlite3AddCheckConstraint(pParse,E.pExpr);} 354c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 355c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3564adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3574adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 358c2eef3b3Sdrh } 359c2eef3b3Sdrh %type defer_subclause_opt {int} 360c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 361c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3629cfcf5d4Sdrh 3639cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3649cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3659cfcf5d4Sdrh // 3669cfcf5d4Sdrh %type onconf {int} 3675eff7cf0Sshane %type orconf {u8} 3681c92853dSdrh %type resolvetype {int} 3691c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3701c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3711c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3725eff7cf0Sshane orconf(A) ::= OR resolvetype(X). {A = (u8)X;} 37374ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3741c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3751c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 376348784efSdrh 377382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 378348784efSdrh // 379a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 380a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 381a8858103Sdanielk1977 } 382a073384fSdrh %type ifexists {int} 383a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 384a073384fSdrh ifexists(A) ::= . {A = 0;} 385348784efSdrh 386a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 387a76b5dfcSdrh // 388b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 389d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { 390fdd48a76Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 391a76b5dfcSdrh } 392a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 393a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 394a76b5dfcSdrh } 395154d4b24Sdrh %endif SQLITE_OMIT_VIEW 396a76b5dfcSdrh 397382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 398348784efSdrh // 3997d562dbeSdan cmd ::= select(X). { 400edf83d1eSdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; 4017d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 402633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 4039bb61fe7Sdrh } 404efb7251dSdrh 4059bb61fe7Sdrh %type select {Select*} 406633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 4077d562dbeSdan %type selectnowith {Select*} 4087d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);} 40982c3d636Sdrh %type oneselect {Select*} 410633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4119bb61fe7Sdrh 412772460fdSdrh %include { 413772460fdSdrh /* 414772460fdSdrh ** For a compound SELECT statement, make sure p->pPrior->pNext==p for 415772460fdSdrh ** all elements in the list. And make sure list length does not exceed 416772460fdSdrh ** SQLITE_LIMIT_COMPOUND_SELECT. 417772460fdSdrh */ 418e318a7f8Sdrh static void parserDoubleLinkSelect(Parse *pParse, Select *p){ 419d227a291Sdrh if( p->pPrior ){ 420772460fdSdrh Select *pNext = 0, *pLoop; 421772460fdSdrh int mxSelect, cnt = 0; 422d227a291Sdrh for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ 423d227a291Sdrh pLoop->pNext = pNext; 424d227a291Sdrh pLoop->selFlags |= SF_Compound; 425d227a291Sdrh } 426772460fdSdrh if( (p->selFlags & SF_MultiValue)==0 && 427772460fdSdrh (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && 428772460fdSdrh cnt>mxSelect 429a0c01768Sdrh ){ 430d227a291Sdrh sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); 431d227a291Sdrh } 432d227a291Sdrh } 433772460fdSdrh } 434772460fdSdrh } 435772460fdSdrh 436772460fdSdrh select(A) ::= with(W) selectnowith(X). { 437772460fdSdrh Select *p = X; 438772460fdSdrh if( p ){ 439772460fdSdrh p->pWith = W; 440772460fdSdrh parserDoubleLinkSelect(pParse, p); 441a9f5c13dSdan }else{ 442a9f5c13dSdan sqlite3WithDelete(pParse->db, W); 443a9f5c13dSdan } 444d227a291Sdrh A = p; 445a9f5c13dSdan } 4467d562dbeSdan 4477d562dbeSdan selectnowith(A) ::= oneselect(X). {A = X;} 448b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4497d562dbeSdan selectnowith(A) ::= selectnowith(X) multiselect_op(Y) oneselect(Z). { 450c0bf493eSdrh Select *pRhs = Z; 45100d5ab74Sdrh Select *pLhs = X; 452c0bf493eSdrh if( pRhs && pRhs->pPrior ){ 453c0bf493eSdrh SrcList *pFrom; 454c0bf493eSdrh Token x; 455c0bf493eSdrh x.n = 0; 456772460fdSdrh parserDoubleLinkSelect(pParse, pRhs); 457c0bf493eSdrh pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); 458c0bf493eSdrh pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0); 459c0bf493eSdrh } 460c0bf493eSdrh if( pRhs ){ 461c0bf493eSdrh pRhs->op = (u8)Y; 46200d5ab74Sdrh pRhs->pPrior = pLhs; 46300d5ab74Sdrh if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; 464772460fdSdrh pRhs->selFlags &= ~SF_MultiValue; 465d58d3278Sdrh if( Y!=TK_ALL ) pParse->hasCompound = 1; 46643b78826Sdrh }else{ 46700d5ab74Sdrh sqlite3SelectDelete(pParse->db, pLhs); 468daffd0e5Sdrh } 469c0bf493eSdrh A = pRhs; 47082c3d636Sdrh } 4710a36c57eSdrh %type multiselect_op {int} 47274ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 4730a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 474fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 475154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 476abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y) 4779bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 47817435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 479abd4c723Sdrh #if SELECTTRACE_ENABLED 480eb9b884cSdrh /* Populate the Select.zSelName[] string that is used to help with 481abd4c723Sdrh ** query planner debugging, to differentiate between multiple Select 482abd4c723Sdrh ** objects in a complex query. 483abd4c723Sdrh ** 484abd4c723Sdrh ** If the SELECT keyword is immediately followed by a C-style comment 485abd4c723Sdrh ** then extract the first few alphanumeric characters from within that 486eb9b884cSdrh ** comment to be the zSelName value. Otherwise, the label is #N where 487abd4c723Sdrh ** is an integer that is incremented with each SELECT statement seen. 488abd4c723Sdrh */ 489abd4c723Sdrh if( A!=0 ){ 490abd4c723Sdrh const char *z = S.z+6; 491abd4c723Sdrh int i; 492eb9b884cSdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d", 493abd4c723Sdrh ++pParse->nSelect); 494abd4c723Sdrh while( z[0]==' ' ) z++; 495abd4c723Sdrh if( z[0]=='/' && z[1]=='*' ){ 496abd4c723Sdrh z += 2; 497abd4c723Sdrh while( z[0]==' ' ) z++; 498abd4c723Sdrh for(i=0; sqlite3Isalnum(z[i]); i++){} 499eb9b884cSdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z); 500abd4c723Sdrh } 501abd4c723Sdrh } 502abd4c723Sdrh #endif /* SELECTRACE_ENABLED */ 5039bb61fe7Sdrh } 50475593d96Sdrh oneselect(A) ::= values(X). {A = X;} 50575593d96Sdrh 50675593d96Sdrh %type values {Select*} 50775593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);} 50875593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. { 50975593d96Sdrh A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0,0); 51075593d96Sdrh } 51175593d96Sdrh values(A) ::= values(X) COMMA LP exprlist(Y) RP. { 512772460fdSdrh Select *pRight, *pLeft = X; 513772460fdSdrh pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0,0); 514f3151f0aSdrh if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; 51575593d96Sdrh if( pRight ){ 51675593d96Sdrh pRight->op = TK_ALL; 517772460fdSdrh pLeft = X; 518772460fdSdrh pRight->pPrior = pLeft; 51975593d96Sdrh A = pRight; 52075593d96Sdrh }else{ 521772460fdSdrh A = pLeft; 52275593d96Sdrh } 52375593d96Sdrh } 5249bb61fe7Sdrh 5259bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 5269bb61fe7Sdrh // present and false (0) if it is not. 5279bb61fe7Sdrh // 528832ee3d4Sdrh %type distinct {u16} 529832ee3d4Sdrh distinct(A) ::= DISTINCT. {A = SF_Distinct;} 530fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 531efb7251dSdrh distinct(A) ::= . {A = 0;} 532348784efSdrh 5339bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 5347c917d19Sdrh // values of the SELECT statement. The "*" in statements like 5357c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 5367c917d19Sdrh // opcode of TK_ALL. 5379bb61fe7Sdrh // 538348784efSdrh %type selcollist {ExprList*} 539633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 540348784efSdrh %type sclp {ExprList*} 541633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 542348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 543348784efSdrh sclp(A) ::= . {A = 0;} 54401f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 545b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, X.pExpr); 546b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 547b7916a78Sdrh sqlite3ExprListSetSpan(pParse,A,&X); 54801f3f253Sdrh } 5497c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 550b7916a78Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); 551b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, p); 5527c917d19Sdrh } 553e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { 554e54a62adSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); 55517435752Sdrh Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 55617435752Sdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 557b7916a78Sdrh A = sqlite3ExprListAppend(pParse,P, pDot); 55854473229Sdrh } 55901f3f253Sdrh 56001f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 56101f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 56201f3f253Sdrh // 56301f3f253Sdrh %type as {Token} 5645ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 5655ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 56601f3f253Sdrh as(X) ::= . {X.n = 0;} 5679bb61fe7Sdrh 568348784efSdrh 569ad3cab52Sdrh %type seltablist {SrcList*} 570633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 571ad3cab52Sdrh %type stl_prefix {SrcList*} 572633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 573ad3cab52Sdrh %type from {SrcList*} 574633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 575348784efSdrh 57601f3f253Sdrh // A complete FROM clause. 57701f3f253Sdrh // 57817435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 57961dfc31dSdrh from(A) ::= FROM seltablist(X). { 58061dfc31dSdrh A = X; 58161dfc31dSdrh sqlite3SrcListShiftJoinType(A); 58261dfc31dSdrh } 58301f3f253Sdrh 58401f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 58501f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 58601f3f253Sdrh // 58701f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 58801f3f253Sdrh A = X; 589d3ec02d3Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; 59001f3f253Sdrh } 591348784efSdrh stl_prefix(A) ::= . {A = 0;} 592e9240418Sdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) 593e9240418Sdrh on_opt(N) using_opt(U). { 594b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 595b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 59601f3f253Sdrh } 59751522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 598fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP 599b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 600b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 60122f70c32Sdrh } 602fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 603fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 6049b87d7b9Sdanielk1977 if( X==0 && Z.n==0 && N==0 && U==0 ){ 605fbdc7f69Sdrh A = F; 606832ee3d4Sdrh }else if( F->nSrc==1 ){ 607832ee3d4Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,0,N,U); 608832ee3d4Sdrh if( A ){ 609832ee3d4Sdrh struct SrcList_item *pNew = &A->a[A->nSrc-1]; 610832ee3d4Sdrh struct SrcList_item *pOld = F->a; 611832ee3d4Sdrh pNew->zName = pOld->zName; 612832ee3d4Sdrh pNew->zDatabase = pOld->zDatabase; 6133c449c6bSdrh pNew->pSelect = pOld->pSelect; 614832ee3d4Sdrh pOld->zName = pOld->zDatabase = 0; 6153c449c6bSdrh pOld->pSelect = 0; 616832ee3d4Sdrh } 617832ee3d4Sdrh sqlite3SrcListDelete(pParse->db, F); 618fbdc7f69Sdrh }else{ 619fbdc7f69Sdrh Select *pSubquery; 620fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 621832ee3d4Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0,0); 622fbdc7f69Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 623fbdc7f69Sdrh } 624fbdc7f69Sdrh } 625154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 626b733d037Sdrh 627113088ecSdrh %type dbnm {Token} 628113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 629113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 630113088ecSdrh 63174ad7fe9Sdrh %type fullname {SrcList*} 632633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 63317435752Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 63474ad7fe9Sdrh 63501f3f253Sdrh %type joinop {int} 63601f3f253Sdrh %type joinop2 {int} 637fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 6384adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 6394adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 6405ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 6414adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 64201f3f253Sdrh 64301f3f253Sdrh %type on_opt {Expr*} 644633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 645b7916a78Sdrh on_opt(N) ::= ON expr(E). {N = E.pExpr;} 64601f3f253Sdrh on_opt(N) ::= . {N = 0;} 64701f3f253Sdrh 64885574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 64985574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 65085574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 65185574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 65285574e31Sdanielk1977 // in the token. 65385574e31Sdanielk1977 // 65485574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 655b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 65685574e31Sdanielk1977 // recognizes and interprets this as a special case. 65785574e31Sdanielk1977 // 65885574e31Sdanielk1977 %type indexed_opt {Token} 65985574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 66085574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 66185574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 66285574e31Sdanielk1977 66301f3f253Sdrh %type using_opt {IdList*} 664633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 66581eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP. {U = L;} 66601f3f253Sdrh using_opt(U) ::= . {U = 0;} 66701f3f253Sdrh 66801f3f253Sdrh 669348784efSdrh %type orderby_opt {ExprList*} 670633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 671348784efSdrh %type sortlist {ExprList*} 672633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 673348784efSdrh 674348784efSdrh orderby_opt(A) ::= . {A = 0;} 675348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 6768395b7b6Sdrh sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). { 6778395b7b6Sdrh A = sqlite3ExprListAppend(pParse,X,Y.pExpr); 678b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 679348784efSdrh } 6808395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). { 6818395b7b6Sdrh A = sqlite3ExprListAppend(pParse,0,Y.pExpr); 682d3ec02d3Sdrh if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; 683348784efSdrh } 684348784efSdrh 685348784efSdrh %type sortorder {int} 686348784efSdrh 6878e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 6888e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 6898e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 690348784efSdrh 6912282792aSdrh %type groupby_opt {ExprList*} 692633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 6932282792aSdrh groupby_opt(A) ::= . {A = 0;} 6949245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 6952282792aSdrh 6962282792aSdrh %type having_opt {Expr*} 697633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 6982282792aSdrh having_opt(A) ::= . {A = 0;} 699b7916a78Sdrh having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} 7002282792aSdrh 701ad3cab52Sdrh %type limit_opt {struct LimitVal} 70215926590Sdrh 70315926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 70415926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 70515926590Sdrh // rule for SELECT statements. As soon as the rule that create the 70615926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 70715926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 70815926590Sdrh // except as a transient. So there is never anything to destroy. 70915926590Sdrh // 71015926590Sdrh //%destructor limit_opt { 711633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 712633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 71315926590Sdrh //} 714a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 715b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 716a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 717b7916a78Sdrh {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 718a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 719b7916a78Sdrh {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 7209bbca4c1Sdrh 721382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 722382c0247Sdrh // 723273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7244e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 725931577f1Sdrh orderby_opt(O) limit_opt(L). { 726b290f117Sdan sqlite3WithPush(pParse, C, 1); 727b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 72849ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 7294281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 7304281bd42Sshane } 7314281bd42Sshane %endif 732273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7334e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 734b290f117Sdan sqlite3WithPush(pParse, C, 1); 7354281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 7364281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 7374281bd42Sshane } 7384281bd42Sshane %endif 739348784efSdrh 740348784efSdrh %type where_opt {Expr*} 741633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 742348784efSdrh 743348784efSdrh where_opt(A) ::= . {A = 0;} 744b7916a78Sdrh where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 745348784efSdrh 746382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 747382c0247Sdrh // 748273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 749bfe31e7fSdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) 7508b471863Sdrh where_opt(W) orderby_opt(O) limit_opt(L). { 751b290f117Sdan sqlite3WithPush(pParse, C, 1); 752b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 753b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 75449ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 7554281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 7564281bd42Sshane } 7574281bd42Sshane %endif 758273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7594e9119d9Sdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) 760e9240418Sdrh where_opt(W). { 761b290f117Sdan sqlite3WithPush(pParse, C, 1); 7624281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 7634281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 7644281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 7654281bd42Sshane } 7664281bd42Sshane %endif 767348784efSdrh 768f8db1bc0Sdrh %type setlist {ExprList*} 769633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 770f8db1bc0Sdrh 771b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). { 772b7916a78Sdrh A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); 773b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 774b7916a78Sdrh } 775b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 776b7916a78Sdrh A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 777b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 778b7916a78Sdrh } 779348784efSdrh 780382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 781382c0247Sdrh // 7824e9119d9Sdan cmd ::= with(W) insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). { 783b290f117Sdan sqlite3WithPush(pParse, W, 1); 7844e9119d9Sdan sqlite3Insert(pParse, X, S, F, R); 7854e9119d9Sdan } 7864e9119d9Sdan cmd ::= with(W) insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 7874e9119d9Sdan { 788b290f117Sdan sqlite3WithPush(pParse, W, 1); 7894e9119d9Sdan sqlite3Insert(pParse, X, 0, F, R); 7904e9119d9Sdan } 791348784efSdrh 7925eff7cf0Sshane %type insert_cmd {u8} 793fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 794fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 795fa86c412Sdrh 796967e8b73Sdrh %type inscollist_opt {IdList*} 797633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 79881eba73eSdrh %type idlist {IdList*} 79981eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);} 800348784efSdrh 801967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 80281eba73eSdrh inscollist_opt(A) ::= LP idlist(X) RP. {A = X;} 80381eba73eSdrh idlist(A) ::= idlist(X) COMMA nm(Y). 80417435752Sdrh {A = sqlite3IdListAppend(pParse->db,X,&Y);} 80581eba73eSdrh idlist(A) ::= nm(Y). 80617435752Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y);} 807348784efSdrh 808382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 809382c0247Sdrh // 810348784efSdrh 811b7916a78Sdrh %type expr {ExprSpan} 812b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 813b7916a78Sdrh %type term {ExprSpan} 814b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 815b7916a78Sdrh 816b7916a78Sdrh %include { 817b7916a78Sdrh /* This is a utility routine used to set the ExprSpan.zStart and 818b7916a78Sdrh ** ExprSpan.zEnd values of pOut so that the span covers the complete 819b7916a78Sdrh ** range of text beginning with pStart and going to the end of pEnd. 820b7916a78Sdrh */ 821b7916a78Sdrh static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ 822b7916a78Sdrh pOut->zStart = pStart->z; 823b7916a78Sdrh pOut->zEnd = &pEnd->z[pEnd->n]; 824b7916a78Sdrh } 825b7916a78Sdrh 826b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 827b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 828b7916a78Sdrh ** that created the expression. 829b7916a78Sdrh */ 830b7916a78Sdrh static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){ 831b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue); 832b7916a78Sdrh pOut->zStart = pValue->z; 833b7916a78Sdrh pOut->zEnd = &pValue->z[pValue->n]; 834b7916a78Sdrh } 835b7916a78Sdrh } 836348784efSdrh 8377977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 838b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);} 839b7916a78Sdrh term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);} 840b7916a78Sdrh expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);} 841b7916a78Sdrh expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);} 8425ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 84317435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 84417435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 845b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); 846b7916a78Sdrh spanSet(&A,&X,&Y); 847e1b6a5b8Sdrh } 848d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 84917435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 85017435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 85117435752Sdrh Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 85217435752Sdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 853b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 854b7916a78Sdrh spanSet(&A,&X,&Z); 855d24cc427Sdrh } 856b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);} 857b7916a78Sdrh term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);} 858f59b12fbSdrh expr(A) ::= VARIABLE(X). { 859f59b12fbSdrh if( X.n>=2 && X.z[0]=='#' && sqlite3Isdigit(X.z[1]) ){ 860b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 861b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 862b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 863b7916a78Sdrh if( pParse->nested==0 ){ 864b7916a78Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); 865b7916a78Sdrh A.pExpr = 0; 866b7916a78Sdrh }else{ 867b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); 868b7916a78Sdrh if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable); 869b7916a78Sdrh } 870f59b12fbSdrh }else{ 871b7916a78Sdrh spanExpr(&A, pParse, TK_VARIABLE, &X); 872b7916a78Sdrh sqlite3ExprAssignVarNumber(pParse, A.pExpr); 873f59b12fbSdrh } 874b7916a78Sdrh spanSet(&A, &X, &X); 875895d7472Sdrh } 87639002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). { 87780103fc6Sdan A.pExpr = sqlite3ExprAddCollateToken(pParse, E.pExpr, &C, 1); 878b7916a78Sdrh A.zStart = E.zStart; 879b7916a78Sdrh A.zEnd = &C.z[C.n]; 8808b4c40d8Sdrh } 881487e262fSdrh %ifndef SQLITE_OMIT_CAST 882487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 883b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); 884b7916a78Sdrh spanSet(&A,&X,&Y); 885487e262fSdrh } 886154d4b24Sdrh %endif SQLITE_OMIT_CAST 887f59b12fbSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). { 888994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 889e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 8904e05c83bSdrh } 891b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 892b7916a78Sdrh spanSet(&A,&X,&E); 893b7916a78Sdrh if( D && A.pExpr ){ 894b7916a78Sdrh A.pExpr->flags |= EP_Distinct; 895fd357974Sdrh } 896e1b6a5b8Sdrh } 897f59b12fbSdrh expr(A) ::= id(X) LP STAR RP(E). { 898b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 899b7916a78Sdrh spanSet(&A,&X,&E); 900e1b6a5b8Sdrh } 901b71090fdSdrh term(A) ::= CTIME_KW(OP). { 902b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &OP); 903b7916a78Sdrh spanSet(&A, &OP, &OP); 904b7916a78Sdrh } 905b7916a78Sdrh 906b7916a78Sdrh %include { 907b7916a78Sdrh /* This routine constructs a binary expression node out of two ExprSpan 908b7916a78Sdrh ** objects and uses the result to populate a new ExprSpan object. 909b7916a78Sdrh */ 910b7916a78Sdrh static void spanBinaryExpr( 911b7916a78Sdrh ExprSpan *pOut, /* Write the result here */ 912b7916a78Sdrh Parse *pParse, /* The parsing context. Errors accumulate here */ 913b7916a78Sdrh int op, /* The binary operation */ 914b7916a78Sdrh ExprSpan *pLeft, /* The left operand */ 915b7916a78Sdrh ExprSpan *pRight /* The right operand */ 916b7916a78Sdrh ){ 917b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); 918b7916a78Sdrh pOut->zStart = pLeft->zStart; 919b7916a78Sdrh pOut->zEnd = pRight->zEnd; 920417ec638Sdrh } 921b71090fdSdrh } 922b7916a78Sdrh 923b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 924b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 92517435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). 926b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 927b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 928fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 929b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 930b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). 931b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 93217435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 933b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 934b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 93574ad7fe9Sdrh %type likeop {struct LikeOp} 9368b471863Sdrh likeop(A) ::= LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 0;} 9378b471863Sdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 1;} 9381dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] { 9398aa34ae0Sdrh ExprList *pList; 940b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 941b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 942b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 943f9df4498Sdrh if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 944b7916a78Sdrh A.zStart = X.zStart; 945b7916a78Sdrh A.zEnd = Y.zEnd; 946b7916a78Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 9470ac65892Sdrh } 9481dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 9491dca1458Sdrh ExprList *pList; 9501dca1458Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 9511dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 9521dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 9531dca1458Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 954f9df4498Sdrh if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 9551dca1458Sdrh A.zStart = X.zStart; 9561dca1458Sdrh A.zEnd = E.zEnd; 9571dca1458Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 9581dca1458Sdrh } 9597c6303c0Sdanielk1977 960b7916a78Sdrh %include { 961b7916a78Sdrh /* Construct an expression node for a unary postfix operator 962b7916a78Sdrh */ 963b7916a78Sdrh static void spanUnaryPostfix( 964b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 965b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 966b7916a78Sdrh int op, /* The operator */ 967b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 968b7916a78Sdrh Token *pPostOp /* The operand token for setting the span */ 969b7916a78Sdrh ){ 970b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 971b7916a78Sdrh pOut->zStart = pOperand->zStart; 972b7916a78Sdrh pOut->zEnd = &pPostOp->z[pPostOp->n]; 973e1b6a5b8Sdrh } 97433048c0bSdrh } 975b7916a78Sdrh 976b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} 977b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 9786a2fe093Sdrh 9796a51741dSdrh %include { 9806a51741dSdrh /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 9816a51741dSdrh ** unary TK_ISNULL or TK_NOTNULL expression. */ 9826a51741dSdrh static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 9836a51741dSdrh sqlite3 *db = pParse->db; 9842a3d1d17Sdrh if( pY && pA && pY->op==TK_NULL ){ 9855e17e8b7Sshaneh pA->op = (u8)op; 9866a51741dSdrh sqlite3ExprDelete(db, pA->pRight); 9876a51741dSdrh pA->pRight = 0; 9886a51741dSdrh } 9896a51741dSdrh } 9906a51741dSdrh } 9916a51741dSdrh 9926a2fe093Sdrh // expr1 IS expr2 9936a2fe093Sdrh // expr1 IS NOT expr2 9946a2fe093Sdrh // 9956a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2 9966a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT. 9976a2fe093Sdrh // 9986a2fe093Sdrh expr(A) ::= expr(X) IS expr(Y). { 9996a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_IS,&X,&Y); 10006a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL); 10016a2fe093Sdrh } 10026a2fe093Sdrh expr(A) ::= expr(X) IS NOT expr(Y). { 10036a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y); 10046a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL); 10056a2fe093Sdrh } 1006b7916a78Sdrh 1007b7916a78Sdrh %include { 1008b7916a78Sdrh /* Construct an expression node for a unary prefix operator 1009b7916a78Sdrh */ 1010b7916a78Sdrh static void spanUnaryPrefix( 1011b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 1012b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 1013b7916a78Sdrh int op, /* The operator */ 1014b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 1015b7916a78Sdrh Token *pPreOp /* The operand token for setting the span */ 1016b7916a78Sdrh ){ 1017b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 1018b7916a78Sdrh pOut->zStart = pPreOp->z; 1019b7916a78Sdrh pOut->zEnd = pOperand->zEnd; 102033048c0bSdrh } 102181a20f21Sdrh } 1022b7916a78Sdrh 1023b7916a78Sdrh 1024b7916a78Sdrh 1025b7916a78Sdrh expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 1026b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 10277ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT] 1028b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);} 10297ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT] 1030b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);} 1031b7916a78Sdrh 10322e3a1f16Sdrh %type between_op {int} 10332e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 10342e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 10352e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 1036b7916a78Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); 1037b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); 1038b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); 1039b7916a78Sdrh if( A.pExpr ){ 1040b7916a78Sdrh A.pExpr->x.pList = pList; 104153f733c7Sdrh }else{ 1042633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 104353f733c7Sdrh } 1044b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1045b7916a78Sdrh A.zStart = W.zStart; 1046b7916a78Sdrh A.zEnd = Y.zEnd; 1047fef5208cSdrh } 10483e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 10492e3a1f16Sdrh %type in_op {int} 10502e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 10512e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 10522e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 1053094430ebSdrh if( Y==0 ){ 1054473c1bf2Sdan /* Expressions of the form 1055473c1bf2Sdan ** 1056473c1bf2Sdan ** expr1 IN () 1057473c1bf2Sdan ** expr1 NOT IN () 1058473c1bf2Sdan ** 1059473c1bf2Sdan ** simplify to constants 0 (false) and 1 (true), respectively, 1060473c1bf2Sdan ** regardless of the value of expr1. 1061473c1bf2Sdan */ 1062094430ebSdrh A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]); 1063094430ebSdrh sqlite3ExprDelete(pParse->db, X.pExpr); 10642b59b3a4Sdrh }else if( Y->nExpr==1 ){ 10652b59b3a4Sdrh /* Expressions of the form: 10662b59b3a4Sdrh ** 10672b59b3a4Sdrh ** expr1 IN (?1) 10682b59b3a4Sdrh ** expr1 NOT IN (?2) 10692b59b3a4Sdrh ** 1070fbb24d10Sdrh ** with exactly one value on the RHS can be simplified to something 1071fbb24d10Sdrh ** like this: 10722b59b3a4Sdrh ** 1073fbb24d10Sdrh ** expr1 == ?1 1074fbb24d10Sdrh ** expr1 <> ?2 1075fbb24d10Sdrh ** 1076fbb24d10Sdrh ** But, the RHS of the == or <> is marked with the EP_Generic flag 1077fbb24d10Sdrh ** so that it may not contribute to the computation of comparison 1078fbb24d10Sdrh ** affinity or the collating sequence to use for comparison. Otherwise, 1079fbb24d10Sdrh ** the semantics would be subtly different from IN or NOT IN. 10802b59b3a4Sdrh */ 1081fbb24d10Sdrh Expr *pRHS = Y->a[0].pExpr; 10822b59b3a4Sdrh Y->a[0].pExpr = 0; 10832b59b3a4Sdrh sqlite3ExprListDelete(pParse->db, Y); 10845b1420e0Sdrh /* pRHS cannot be NULL because a malloc error would have been detected 10855b1420e0Sdrh ** before now and control would have never reached this point */ 10865b1420e0Sdrh if( ALWAYS(pRHS) ){ 1087fbb24d10Sdrh pRHS->flags &= ~EP_Collate; 1088fbb24d10Sdrh pRHS->flags |= EP_Generic; 1089fbb24d10Sdrh } 10902b59b3a4Sdrh A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, X.pExpr, pRHS, 0); 1091094430ebSdrh }else{ 1092b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1093b7916a78Sdrh if( A.pExpr ){ 1094b7916a78Sdrh A.pExpr->x.pList = Y; 10952308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); 1096d5d56523Sdanielk1977 }else{ 1097633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1098d5d56523Sdanielk1977 } 1099b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1100094430ebSdrh } 1101b7916a78Sdrh A.zStart = X.zStart; 1102b7916a78Sdrh A.zEnd = &E.z[E.n]; 1103fef5208cSdrh } 110451522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 1105b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); 1106b7916a78Sdrh if( A.pExpr ){ 1107b7916a78Sdrh A.pExpr->x.pSelect = X; 1108885a5b03Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery); 11092308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); 111053f733c7Sdrh }else{ 1111633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 111253f733c7Sdrh } 1113b7916a78Sdrh A.zStart = B.z; 1114b7916a78Sdrh A.zEnd = &E.z[E.n]; 111551522cd3Sdrh } 11162e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 1117b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1118b7916a78Sdrh if( A.pExpr ){ 1119b7916a78Sdrh A.pExpr->x.pSelect = Y; 1120885a5b03Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery); 11212308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); 112253f733c7Sdrh }else{ 1123633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 112453f733c7Sdrh } 1125b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1126b7916a78Sdrh A.zStart = X.zStart; 1127b7916a78Sdrh A.zEnd = &E.z[E.n]; 1128fef5208cSdrh } 112974ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 113017435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 1131b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1132b7916a78Sdrh if( A.pExpr ){ 1133b7916a78Sdrh A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 1134885a5b03Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery); 11352308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); 113653f733c7Sdrh }else{ 1137633e6d57Sdrh sqlite3SrcListDelete(pParse->db, pSrc); 113853f733c7Sdrh } 1139b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1140b7916a78Sdrh A.zStart = X.zStart; 1141b7916a78Sdrh A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; 114223b2db23Sdrh } 114351522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 1144b7916a78Sdrh Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); 114551522cd3Sdrh if( p ){ 11466ab3a2ecSdanielk1977 p->x.pSelect = Y; 1147885a5b03Sdrh ExprSetProperty(p, EP_xIsSelect|EP_Subquery); 11482308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, p); 114953f733c7Sdrh }else{ 1150633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 115151522cd3Sdrh } 1152b7916a78Sdrh A.zStart = B.z; 1153b7916a78Sdrh A.zEnd = &E.z[E.n]; 115451522cd3Sdrh } 1155154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1156fef5208cSdrh 115717a7f8ddSdrh /* CASE expressions */ 115817a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 1159c5cd1249Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0, 0); 1160b7916a78Sdrh if( A.pExpr ){ 1161c5cd1249Sdrh A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; 11622308ed38Sdrh sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); 116353f733c7Sdrh }else{ 1164633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1165c5cd1249Sdrh sqlite3ExprDelete(pParse->db, Z); 116653f733c7Sdrh } 1167b7916a78Sdrh A.zStart = C.z; 1168b7916a78Sdrh A.zEnd = &E.z[E.n]; 116917a7f8ddSdrh } 117017a7f8ddSdrh %type case_exprlist {ExprList*} 1171633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 117217a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 1173b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, Y.pExpr); 1174b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 117517a7f8ddSdrh } 117617a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 1177b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, Y.pExpr); 1178b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 117917a7f8ddSdrh } 118017a7f8ddSdrh %type case_else {Expr*} 1181633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 1182b7916a78Sdrh case_else(A) ::= ELSE expr(X). {A = X.pExpr;} 118317a7f8ddSdrh case_else(A) ::= . {A = 0;} 118417a7f8ddSdrh %type case_operand {Expr*} 1185633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 1186b7916a78Sdrh case_operand(A) ::= expr(X). {A = X.pExpr;} 118717a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1188348784efSdrh 1189348784efSdrh %type exprlist {ExprList*} 1190633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 11919245c243Sdrh %type nexprlist {ExprList*} 1192633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1193348784efSdrh 11949245c243Sdrh exprlist(A) ::= nexprlist(X). {A = X;} 11959245c243Sdrh exprlist(A) ::= . {A = 0;} 119617435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 1197b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 119817435752Sdrh nexprlist(A) ::= expr(Y). 1199b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} 12009245c243Sdrh 1201cce7d176Sdrh 1202382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1203382c0247Sdrh // 1204d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 12058a9789b6Sdrh ON nm(Y) LP idxlist(Z) RP where_opt(W). { 120617435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 120717435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 12088a9789b6Sdrh &S, W, SQLITE_SO_ASC, NE); 12099cfcf5d4Sdrh } 1210717e6402Sdrh 1211717e6402Sdrh %type uniqueflag {int} 12129cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 12139cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1214348784efSdrh 12150202b29eSdanielk1977 %type idxlist {ExprList*} 1216633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 12170202b29eSdanielk1977 %type idxlist_opt {ExprList*} 1218633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1219348784efSdrh 1220c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 1221c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 1222200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 122380103fc6Sdan Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C, 1); 1224b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, p); 1225b7916a78Sdrh sqlite3ExprListSetName(pParse,A,&Y,1); 1226b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1227b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 12280202b29eSdanielk1977 } 1229200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 123080103fc6Sdan Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C, 1); 1231b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, p); 1232b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &Y, 1); 1233b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1234b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 12350202b29eSdanielk1977 } 12360202b29eSdanielk1977 1237a34001c9Sdrh %type collate {Token} 1238a34001c9Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 123939002505Sdanielk1977 collate(C) ::= COLLATE ids(X). {C = X;} 1240a34001c9Sdrh 1241348784efSdrh 12428aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1243382c0247Sdrh // 12444d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1245982cef7eSdrh 1246382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1247382c0247Sdrh // 1248154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1249fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 125074161705Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse);} 125174161705Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} 1252fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1253154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1254f57b14a6Sdrh 1255382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1256382c0247Sdrh // 125713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 125891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1259ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1260ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1261ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1262ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1263ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1264ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1265ada2ee0dSdrh 1266a3eb4b44Sdrh nmnum(A) ::= plus_num(X). {A = X;} 1267a3eb4b44Sdrh nmnum(A) ::= nm(X). {A = X;} 1268ada2ee0dSdrh nmnum(A) ::= ON(X). {A = X;} 1269ada2ee0dSdrh nmnum(A) ::= DELETE(X). {A = X;} 12706da861beSdrh nmnum(A) ::= DEFAULT(X). {A = X;} 1271154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 1272f59b12fbSdrh %token_class number INTEGER|FLOAT. 12738395b7b6Sdrh plus_num(A) ::= PLUS number(X). {A = X;} 12748395b7b6Sdrh plus_num(A) ::= number(X). {A = X;} 1275f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1276c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1277f0f258b1Sdrh 1278b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1279b7f9164eSdrh 1280d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 12814b59ab5eSdrh Token all; 12824b59ab5eSdrh all.z = A.z; 1283b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 12844adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1285f0f258b1Sdrh } 1286f0f258b1Sdrh 1287fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1288fdd48a76Sdrh trigger_time(C) trigger_event(D) 128960218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 129060218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 12913df6b257Sdanielk1977 A = (Z.n==0?B:Z); 1292c3f9bad2Sdanielk1977 } 1293c3f9bad2Sdanielk1977 1294c3f9bad2Sdanielk1977 %type trigger_time {int} 1295c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1296c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1297c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1298c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1299c3f9bad2Sdanielk1977 1300ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1301633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1302fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 130374ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 130481eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X). {A.a = TK_UPDATE; A.b = X;} 1305c3f9bad2Sdanielk1977 130660218d2aSdrh foreach_clause ::= . 130760218d2aSdrh foreach_clause ::= FOR EACH ROW. 1308c3f9bad2Sdanielk1977 1309c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1310633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1311c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1312b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1313c3f9bad2Sdanielk1977 1314c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1315633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 1316187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { 131781238966Sdrh assert( Y!=0 ); 131881238966Sdrh Y->pLast->pNext = X; 1319187e4c6aSdrh Y->pLast = X; 1320187e4c6aSdrh A = Y; 1321a69d9168Sdrh } 132281238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { 132381238966Sdrh assert( X!=0 ); 132481238966Sdrh X->pLast = X; 132581238966Sdrh A = X; 132681238966Sdrh } 1327c3f9bad2Sdanielk1977 1328b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements 1329b1819a0bSdrh // within a trigger. The table to INSERT, UPDATE, or DELETE is always in 1330b1819a0bSdrh // the same database as the table that the trigger fires on. 1331b1819a0bSdrh // 1332b1819a0bSdrh %type trnm {Token} 1333b1819a0bSdrh trnm(A) ::= nm(X). {A = X;} 1334b1819a0bSdrh trnm(A) ::= nm DOT nm(X). { 1335b1819a0bSdrh A = X; 1336b1819a0bSdrh sqlite3ErrorMsg(pParse, 1337b1819a0bSdrh "qualified table names are not allowed on INSERT, UPDATE, and DELETE " 1338b1819a0bSdrh "statements within triggers"); 1339b1819a0bSdrh } 1340b1819a0bSdrh 1341b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE 1342b1819a0bSdrh // statements within triggers. We make a specific error message for this 1343b1819a0bSdrh // since it is an exception to the default grammar rules. 1344b1819a0bSdrh // 1345b1819a0bSdrh tridxby ::= . 1346b1819a0bSdrh tridxby ::= INDEXED BY nm. { 1347b1819a0bSdrh sqlite3ErrorMsg(pParse, 1348b1819a0bSdrh "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " 1349b1819a0bSdrh "within triggers"); 1350b1819a0bSdrh } 1351b1819a0bSdrh tridxby ::= NOT INDEXED. { 1352b1819a0bSdrh sqlite3ErrorMsg(pParse, 1353b1819a0bSdrh "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " 1354b1819a0bSdrh "within triggers"); 1355b1819a0bSdrh } 1356b1819a0bSdrh 1357b1819a0bSdrh 1358b1819a0bSdrh 1359c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1360633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1361c3f9bad2Sdanielk1977 // UPDATE 1362b1819a0bSdrh trigger_cmd(A) ::= 1363b1819a0bSdrh UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). 136417435752Sdrh { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1365c3f9bad2Sdanielk1977 1366c3f9bad2Sdanielk1977 // INSERT 1367b1819a0bSdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S). 136875593d96Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, S, R);} 1369c3f9bad2Sdanielk1977 1370c3f9bad2Sdanielk1977 // DELETE 1371b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). 137217435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1373c3f9bad2Sdanielk1977 1374c3f9bad2Sdanielk1977 // SELECT 137517435752Sdrh trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1376c3f9bad2Sdanielk1977 13776f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 13784b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1379b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); 1380b7916a78Sdrh if( A.pExpr ){ 1381b7916a78Sdrh A.pExpr->affinity = OE_Ignore; 13824b59ab5eSdrh } 1383b7916a78Sdrh A.zStart = X.z; 1384b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 13858aa34ae0Sdrh } 138674ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 1387b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); 1388b7916a78Sdrh if( A.pExpr ) { 1389b7916a78Sdrh A.pExpr->affinity = (char)T; 13904b59ab5eSdrh } 1391b7916a78Sdrh A.zStart = X.z; 1392b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 13938aa34ae0Sdrh } 1394154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1395b7f9164eSdrh 139674ad7fe9Sdrh %type raisetype {int} 139774ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 139874ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 139974ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 140074ad7fe9Sdrh 14016f34903eSdanielk1977 1402c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1403b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1404fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1405fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1406c3f9bad2Sdanielk1977 } 1407154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1408113088ecSdrh 1409113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1410fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1411f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1412b7916a78Sdrh sqlite3Attach(pParse, F.pExpr, D.pExpr, K); 14131c2d8414Sdrh } 1414fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1415b7916a78Sdrh sqlite3Detach(pParse, D.pExpr); 1416fdbcdee5Sdrh } 1417fdbcdee5Sdrh 1418f744bb56Sdanielk1977 %type key_opt {Expr*} 1419633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1420f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1421b7916a78Sdrh key_opt(A) ::= KEY expr(X). { A = X.pExpr; } 1422113088ecSdrh 1423113088ecSdrh database_kw_opt ::= DATABASE. 1424113088ecSdrh database_kw_opt ::= . 1425fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 14264343fea2Sdrh 14274343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 14284343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 14294343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 14304343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1431154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 14329fd2a9a0Sdanielk1977 14339f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 14349f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 14359f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 14369f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 14379f18e8a0Sdrh %endif 14389f18e8a0Sdrh 14399fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 14409fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 14419fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 14429fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 14439fd2a9a0Sdanielk1977 } 144419a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 144519a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 144619a8e7e8Sdanielk1977 } 144719a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 1448d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 144919a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 145019a8e7e8Sdanielk1977 } 145119a8e7e8Sdanielk1977 kwcolumn_opt ::= . 145219a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1453154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1454e09daa90Sdrh 1455e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1456e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1457b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1458b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1459b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E) 1460b421b894Sdrh nm(X) dbnm(Y) USING nm(Z). { 1461b421b894Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E); 1462b9bb7c18Sdrh } 1463e09daa90Sdrh vtabarglist ::= vtabarg. 1464e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1465b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1466b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1467b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1468b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1469b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1470b9bb7c18Sdrh anylist ::= . 1471aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1472aaac8b4eSdrh anylist ::= anylist ANY. 1473154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 14748b471863Sdrh 14758b471863Sdrh 14768b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS //////////////////////////// 14777d562dbeSdan %type with {With*} 14787d562dbeSdan %type wqlist {With*} 14797d562dbeSdan %destructor with {sqlite3WithDelete(pParse->db, $$);} 14804e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);} 14817d562dbeSdan 14827d562dbeSdan with(A) ::= . {A = 0;} 14838b471863Sdrh %ifndef SQLITE_OMIT_CTE 14847d562dbeSdan with(A) ::= WITH wqlist(W). { A = W; } 14857d562dbeSdan with(A) ::= WITH RECURSIVE wqlist(W). { A = W; } 14867d562dbeSdan 14874e9119d9Sdan wqlist(A) ::= nm(X) idxlist_opt(Y) AS LP select(Z) RP. { 14887d562dbeSdan A = sqlite3WithAdd(pParse, 0, &X, Y, Z); 14897d562dbeSdan } 14904e9119d9Sdan wqlist(A) ::= wqlist(W) COMMA nm(X) idxlist_opt(Y) AS LP select(Z) RP. { 14917d562dbeSdan A = sqlite3WithAdd(pParse, W, &X, Y, Z); 14928b471863Sdrh } 14938b471863Sdrh %endif SQLITE_OMIT_CTE 1494