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); 3686dac2b6Sdrh pParse->parseError = 1; 37b86ccfb2Sdrh } 388fc3345fSdrh %stack_overflow { 39128255fcSdrh UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ 408fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 4186dac2b6Sdrh pParse->parseError = 1; 428fc3345fSdrh } 43487e262fSdrh 44487e262fSdrh // The name of the generated procedure that implements the parser 45487e262fSdrh // is as follows: 464adee20fSdanielk1977 %name sqlite3Parser 47487e262fSdrh 48487e262fSdrh // The following text is included near the beginning of the C source 49487e262fSdrh // code file that implements the parser. 50487e262fSdrh // 51348784efSdrh %include { 52348784efSdrh #include "sqliteInt.h" 539bbca4c1Sdrh 549bbca4c1Sdrh /* 55d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 56d3ec02d3Sdrh ** automaton. 57d3ec02d3Sdrh */ 58d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 59d3ec02d3Sdrh 60d3ec02d3Sdrh /* 618a415d37Sdrh ** Make yytestcase() the same as testcase() 628a415d37Sdrh */ 638a415d37Sdrh #define yytestcase(X) testcase(X) 648a415d37Sdrh 658a415d37Sdrh /* 66ad3cab52Sdrh ** An instance of this structure holds information about the 67ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 689bbca4c1Sdrh */ 69ad3cab52Sdrh struct LimitVal { 70a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 71a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 72ad3cab52Sdrh }; 73c3f9bad2Sdanielk1977 74c3f9bad2Sdanielk1977 /* 752e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 762e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 772e3a1f16Sdrh */ 782e3a1f16Sdrh struct LikeOp { 79b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 802e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 812e3a1f16Sdrh }; 822e3a1f16Sdrh 832e3a1f16Sdrh /* 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 /* 9525d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 9625d6543dSdrh */ 9725d6543dSdrh struct AttachKey { int type; Token key; }; 9825d6543dSdrh 99caec2f12Sdrh } // end %include 100348784efSdrh 101826fb5a3Sdrh // Input is a single SQL command 102c4a3c779Sdrh input ::= cmdlist. 103094b2bbfSdrh cmdlist ::= cmdlist ecmd. 104826fb5a3Sdrh cmdlist ::= ecmd. 105b7f9164eSdrh ecmd ::= SEMI. 106b7f9164eSdrh ecmd ::= explain cmdx SEMI. 1074adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 108b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 109b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 110ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } 111154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 112200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 113348784efSdrh 114382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 115c4a3c779Sdrh // 116fa86c412Sdrh 117684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 118c4a3c779Sdrh trans_opt ::= . 119c4a3c779Sdrh trans_opt ::= TRANSACTION. 1205ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 121684917c2Sdrh %type transtype {int} 122684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 123684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 124684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 125684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1264adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1274adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1284adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 129c4a3c779Sdrh 130fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 131fd7f0452Sdanielk1977 savepoint_opt ::= . 132fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 133fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 134fd7f0452Sdanielk1977 } 135fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 136fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 137fd7f0452Sdanielk1977 } 138fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 139fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 140fd7f0452Sdanielk1977 } 141fd7f0452Sdanielk1977 142382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 143348784efSdrh // 144348784efSdrh cmd ::= create_table create_table_args. 145d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 146f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 147969fa7c1Sdrh } 148d9da78a2Sdrh createkw(A) ::= CREATE(X). { 149d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 150d9da78a2Sdrh A = X; 151d9da78a2Sdrh } 152faa59554Sdrh %type ifnotexists {int} 153faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 154faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 155f57b3399Sdrh %type temp {int} 15653c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 157d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 158154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 159d24cc427Sdrh temp(A) ::= . {A = 0;} 16019a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { 16119a8e7e8Sdanielk1977 sqlite3EndTable(pParse,&X,&Y,0); 162969fa7c1Sdrh } 163969fa7c1Sdrh create_table_args ::= AS select(S). { 16419a8e7e8Sdanielk1977 sqlite3EndTable(pParse,0,0,S); 165633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 166969fa7c1Sdrh } 167348784efSdrh columnlist ::= columnlist COMMA column. 168348784efSdrh columnlist ::= column. 169348784efSdrh 170487e262fSdrh // A "column" is a complete description of a single column in a 171487e262fSdrh // CREATE TABLE statement. This includes the column name, its 172487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 173487e262fSdrh // NOT NULL and so forth. 174348784efSdrh // 17519a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 17619a8e7e8Sdanielk1977 A.z = X.z; 177b27b7f5dSdrh A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 17819a8e7e8Sdanielk1977 } 17919a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 18019a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 18119a8e7e8Sdanielk1977 A = X; 18219a8e7e8Sdanielk1977 } 18319a8e7e8Sdanielk1977 184c4a3c779Sdrh 185c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 186c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 187c4a3c779Sdrh // 188982cef7eSdrh %type id {Token} 189f18543caSdrh id(A) ::= ID(X). {A = X;} 190296a483cSdrh id(A) ::= INDEXED(X). {A = X;} 1910bd1f4eaSdrh 19234e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 19334e33bb8Sdrh // fallback to ID if they will not parse as their original value. 19434e33bb8Sdrh // This obviates the need for the "id" nonterminal. 19534e33bb8Sdrh // 1960bd1f4eaSdrh %fallback ID 1971da40a38Sdan ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 1981da40a38Sdan CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 1991da40a38Sdan IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 200db15bcd5Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK 20178c2e6d8Sdanielk1977 SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL 202b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 203b7f9164eSdrh EXCEPT INTERSECT UNION 204154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 205a073384fSdrh REINDEX RENAME CTIME_KW IF 206b7f9164eSdrh . 207e09daa90Sdrh %wildcard ANY. 208c4a3c779Sdrh 2092d3917daSdrh // Define operator precedence early so that this is the first occurance 2102d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2112d3917daSdrh // causes them to be assigned integer values that are close together, 2122d3917daSdrh // which keeps parser tables smaller. 2132d3917daSdrh // 214f2bc013cSdrh // The token values assigned to these symbols is determined by the order 215f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 216f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 217f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 218f2bc013cSdrh // constraint. 219f2bc013cSdrh // 2202d3917daSdrh %left OR. 2212d3917daSdrh %left AND. 2222d3917daSdrh %right NOT. 22303bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2249a43267bSdrh %left GT LE LT GE. 2257c6303c0Sdanielk1977 %right ESCAPE. 2262d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2272d3917daSdrh %left PLUS MINUS. 2282d3917daSdrh %left STAR SLASH REM. 229a34001c9Sdrh %left CONCAT. 230a34001c9Sdrh %left COLLATE. 2317ba5bc5bSdrh %right BITNOT. 2322d3917daSdrh 233c4a3c779Sdrh // And "ids" is an identifer-or-string. 234c4a3c779Sdrh // 235c4a3c779Sdrh %type ids {Token} 236fd405314Sdrh ids(A) ::= ID|STRING(X). {A = X;} 237c4a3c779Sdrh 2385ad1a6c8Sdrh // The name of a column or table can be any of the following: 2395ad1a6c8Sdrh // 2405ad1a6c8Sdrh %type nm {Token} 241296a483cSdrh nm(A) ::= id(X). {A = X;} 2425ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2435ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2445ad1a6c8Sdrh 245487e262fSdrh // A typetoken is really one or more tokens that form a type name such 246487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 247487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 248487e262fSdrh // 249487e262fSdrh %type typetoken {Token} 250382c0247Sdrh type ::= . 251487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 252487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 253487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 254487e262fSdrh A.z = X.z; 255b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 256487e262fSdrh } 257487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 258487e262fSdrh A.z = X.z; 259b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 260487e262fSdrh } 261382c0247Sdrh %type typename {Token} 262382c0247Sdrh typename(A) ::= ids(X). {A = X;} 263b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 26460218d2aSdrh signed ::= plus_num. 26560218d2aSdrh signed ::= minus_num. 266487e262fSdrh 267487e262fSdrh // "carglist" is a list of additional constraints that come after the 268487e262fSdrh // column name and column type in a CREATE TABLE statement. 269487e262fSdrh // 270348784efSdrh carglist ::= carglist carg. 271348784efSdrh carglist ::= . 2725ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 273348784efSdrh carg ::= ccons. 274b7916a78Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 275b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 276b7916a78Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 277f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 278b7916a78Sdrh ExprSpan v; 279b7916a78Sdrh v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); 280b7916a78Sdrh v.zStart = A.z; 281b7916a78Sdrh v.zEnd = X.zEnd; 282b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2837977a17fSdanielk1977 } 2842b7acc35Sdrh ccons ::= DEFAULT id(X). { 285b7916a78Sdrh ExprSpan v; 286b7916a78Sdrh spanExpr(&v, pParse, TK_STRING, &X); 287b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2887977a17fSdanielk1977 } 289348784efSdrh 290382c0247Sdrh // In addition to the type name, we also care about the primary key and 291382c0247Sdrh // UNIQUE constraints. 292348784efSdrh // 2930d316a40Sdrh ccons ::= NULL onconf. 2944adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 295fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 296fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 2974d91a701Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 298b7916a78Sdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} 299c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 3004adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 3014adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 30239002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 30304738cb9Sdrh 304205f48e6Sdrh // The optional AUTOINCREMENT keyword 305205f48e6Sdrh %type autoinc {int} 306205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3072958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 308205f48e6Sdrh 309c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 310c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 311c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 312c2eef3b3Sdrh // check fails. 31304738cb9Sdrh // 314c2eef3b3Sdrh %type refargs {int} 315fcf486c3Sdrh refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */} 31650af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; } 317c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 318c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 319c29c5aa1Sdrh refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; } 320c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 321c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 322c2eef3b3Sdrh %type refact {int} 323fcf486c3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */} 324fcf486c3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */} 325fcf486c3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */} 326fcf486c3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 327fcf486c3Sdrh refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 328c2eef3b3Sdrh %type defer_subclause {int} 3291da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 330c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 331c2eef3b3Sdrh %type init_deferred_pred_opt {int} 332c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 333c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 334c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 335348784efSdrh 336348784efSdrh // For the time being, the only constraint we care about is the primary 337382c0247Sdrh // key and UNIQUE. Both create indices. 338348784efSdrh // 33919a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 34019a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 341348784efSdrh conslist ::= conslist COMMA tcons. 342a2e1bb5aSdrh conslist ::= conslist tcons. 343348784efSdrh conslist ::= tcons. 3445ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 345f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 346fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3479cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3484d91a701Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 349b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 350b7916a78Sdrh {sqlite3AddCheckConstraint(pParse,E.pExpr);} 351c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 352c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3534adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3544adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 355c2eef3b3Sdrh } 356c2eef3b3Sdrh %type defer_subclause_opt {int} 357c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 358c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3599cfcf5d4Sdrh 3609cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3619cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3629cfcf5d4Sdrh // 3639cfcf5d4Sdrh %type onconf {int} 3645eff7cf0Sshane %type orconf {u8} 3651c92853dSdrh %type resolvetype {int} 3661c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3671c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3681c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3695eff7cf0Sshane orconf(A) ::= OR resolvetype(X). {A = (u8)X;} 37074ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3711c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3721c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 373348784efSdrh 374382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 375348784efSdrh // 376a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 377a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 378a8858103Sdanielk1977 } 379a073384fSdrh %type ifexists {int} 380a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 381a073384fSdrh ifexists(A) ::= . {A = 0;} 382348784efSdrh 383a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 384a76b5dfcSdrh // 385b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 386d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { 387fdd48a76Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 388a76b5dfcSdrh } 389a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 390a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 391a76b5dfcSdrh } 392154d4b24Sdrh %endif SQLITE_OMIT_VIEW 393a76b5dfcSdrh 394382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 395348784efSdrh // 3969bb61fe7Sdrh cmd ::= select(X). { 3977d10d5a6Sdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0}; 3987d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 399633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 4009bb61fe7Sdrh } 401efb7251dSdrh 4029bb61fe7Sdrh %type select {Select*} 403633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 40482c3d636Sdrh %type oneselect {Select*} 405633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4069bb61fe7Sdrh 40782c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 408b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4090a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 410daffd0e5Sdrh if( Z ){ 411b27b7f5dSdrh Z->op = (u8)Y; 41282c3d636Sdrh Z->pPrior = X; 41343b78826Sdrh }else{ 414633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 415daffd0e5Sdrh } 41682c3d636Sdrh A = Z; 41782c3d636Sdrh } 4180a36c57eSdrh %type multiselect_op {int} 41974ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 4200a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 421fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 422154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 42382c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 4249bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 42517435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 4269bb61fe7Sdrh } 4279bb61fe7Sdrh 4289bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 4299bb61fe7Sdrh // present and false (0) if it is not. 4309bb61fe7Sdrh // 431efb7251dSdrh %type distinct {int} 432efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 433fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 434efb7251dSdrh distinct(A) ::= . {A = 0;} 435348784efSdrh 4369bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 4377c917d19Sdrh // values of the SELECT statement. The "*" in statements like 4387c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 4397c917d19Sdrh // opcode of TK_ALL. 4409bb61fe7Sdrh // 441348784efSdrh %type selcollist {ExprList*} 442633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 443348784efSdrh %type sclp {ExprList*} 444633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 445348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 446348784efSdrh sclp(A) ::= . {A = 0;} 44701f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 448b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, X.pExpr); 449b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 450b7916a78Sdrh sqlite3ExprListSetSpan(pParse,A,&X); 45101f3f253Sdrh } 4527c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 453b7916a78Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); 454b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, p); 4557c917d19Sdrh } 456e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { 457e54a62adSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); 45817435752Sdrh Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 45917435752Sdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 460b7916a78Sdrh A = sqlite3ExprListAppend(pParse,P, pDot); 46154473229Sdrh } 46201f3f253Sdrh 46301f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 46401f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 46501f3f253Sdrh // 46601f3f253Sdrh %type as {Token} 4675ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 4685ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 46901f3f253Sdrh as(X) ::= . {X.n = 0;} 4709bb61fe7Sdrh 471348784efSdrh 472ad3cab52Sdrh %type seltablist {SrcList*} 473633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 474ad3cab52Sdrh %type stl_prefix {SrcList*} 475633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 476ad3cab52Sdrh %type from {SrcList*} 477633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 478348784efSdrh 47901f3f253Sdrh // A complete FROM clause. 48001f3f253Sdrh // 48117435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 48261dfc31dSdrh from(A) ::= FROM seltablist(X). { 48361dfc31dSdrh A = X; 48461dfc31dSdrh sqlite3SrcListShiftJoinType(A); 48561dfc31dSdrh } 48601f3f253Sdrh 48701f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 48801f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 48901f3f253Sdrh // 49001f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 49101f3f253Sdrh A = X; 492d3ec02d3Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; 49301f3f253Sdrh } 494348784efSdrh stl_prefix(A) ::= . {A = 0;} 49585574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). { 496b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 497b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 49801f3f253Sdrh } 49951522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 500fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP 501b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 502b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 50322f70c32Sdrh } 504fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 505fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 5069b87d7b9Sdanielk1977 if( X==0 && Z.n==0 && N==0 && U==0 ){ 507fbdc7f69Sdrh A = F; 508fbdc7f69Sdrh }else{ 509fbdc7f69Sdrh Select *pSubquery; 510fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 511fbdc7f69Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 512fbdc7f69Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 513fbdc7f69Sdrh } 514fbdc7f69Sdrh } 515348784efSdrh 516b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 517b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 518b733d037Sdrh // a grouping of table and subqueries. 519b733d037Sdrh // 520fbdc7f69Sdrh // %type seltablist_paren {Select*} 521fbdc7f69Sdrh // %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);} 522fbdc7f69Sdrh // seltablist_paren(A) ::= select(S). {A = S;} 523fbdc7f69Sdrh // seltablist_paren(A) ::= seltablist(F). { 524fbdc7f69Sdrh // sqlite3SrcListShiftJoinType(F); 525fbdc7f69Sdrh // A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 526fbdc7f69Sdrh // } 527154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 528b733d037Sdrh 529113088ecSdrh %type dbnm {Token} 530113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 531113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 532113088ecSdrh 53374ad7fe9Sdrh %type fullname {SrcList*} 534633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 53517435752Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 53674ad7fe9Sdrh 53701f3f253Sdrh %type joinop {int} 53801f3f253Sdrh %type joinop2 {int} 539fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 5404adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 5414adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 5425ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 5434adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 54401f3f253Sdrh 54501f3f253Sdrh %type on_opt {Expr*} 546633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 547b7916a78Sdrh on_opt(N) ::= ON expr(E). {N = E.pExpr;} 54801f3f253Sdrh on_opt(N) ::= . {N = 0;} 54901f3f253Sdrh 55085574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 55185574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 55285574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 55385574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 55485574e31Sdanielk1977 // in the token. 55585574e31Sdanielk1977 // 55685574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 557b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 55885574e31Sdanielk1977 // recognizes and interprets this as a special case. 55985574e31Sdanielk1977 // 56085574e31Sdanielk1977 %type indexed_opt {Token} 56185574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 56285574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 56385574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 56485574e31Sdanielk1977 56501f3f253Sdrh %type using_opt {IdList*} 566633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 5670202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 56801f3f253Sdrh using_opt(U) ::= . {U = 0;} 56901f3f253Sdrh 57001f3f253Sdrh 571348784efSdrh %type orderby_opt {ExprList*} 572633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 573348784efSdrh %type sortlist {ExprList*} 574633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 575348784efSdrh %type sortitem {Expr*} 576633e6d57Sdrh %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);} 577348784efSdrh 578348784efSdrh orderby_opt(A) ::= . {A = 0;} 579348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 5808b4c40d8Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { 581b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X,Y); 582b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 583348784efSdrh } 5848b4c40d8Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). { 585b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0,Y); 586d3ec02d3Sdrh if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; 587348784efSdrh } 588b7916a78Sdrh sortitem(A) ::= expr(X). {A = X.pExpr;} 589348784efSdrh 590348784efSdrh %type sortorder {int} 591348784efSdrh 5928e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 5938e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 5948e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 595348784efSdrh 5962282792aSdrh %type groupby_opt {ExprList*} 597633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 5982282792aSdrh groupby_opt(A) ::= . {A = 0;} 5999245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 6002282792aSdrh 6012282792aSdrh %type having_opt {Expr*} 602633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 6032282792aSdrh having_opt(A) ::= . {A = 0;} 604b7916a78Sdrh having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} 6052282792aSdrh 606ad3cab52Sdrh %type limit_opt {struct LimitVal} 60715926590Sdrh 60815926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 60915926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 61015926590Sdrh // rule for SELECT statements. As soon as the rule that create the 61115926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 61215926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 61315926590Sdrh // except as a transient. So there is never anything to destroy. 61415926590Sdrh // 61515926590Sdrh //%destructor limit_opt { 616633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 617633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 61815926590Sdrh //} 619a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 620b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 621a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 622b7916a78Sdrh {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 623a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 624b7916a78Sdrh {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 6259bbca4c1Sdrh 626382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 627382c0247Sdrh // 628273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 629931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 630931577f1Sdrh orderby_opt(O) limit_opt(L). { 631b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 63249ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 6334281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6344281bd42Sshane } 6354281bd42Sshane %endif 636273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6374281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 6384281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6394281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6404281bd42Sshane } 6414281bd42Sshane %endif 642348784efSdrh 643348784efSdrh %type where_opt {Expr*} 644633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 645348784efSdrh 646348784efSdrh where_opt(A) ::= . {A = 0;} 647b7916a78Sdrh where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 648348784efSdrh 649382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 650382c0247Sdrh // 651273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6524281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L). { 653b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 654b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 65549ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 6564281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6574281bd42Sshane } 6584281bd42Sshane %endif 659273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6604281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W). { 6614281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6624281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 6634281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6644281bd42Sshane } 6654281bd42Sshane %endif 666348784efSdrh 667f8db1bc0Sdrh %type setlist {ExprList*} 668633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 669f8db1bc0Sdrh 670b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). { 671b7916a78Sdrh A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); 672b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 673b7916a78Sdrh } 674b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 675b7916a78Sdrh A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 676b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 677b7916a78Sdrh } 678348784efSdrh 679382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 680382c0247Sdrh // 68174ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 682113088ecSdrh VALUES LP itemlist(Y) RP. 68374ad7fe9Sdrh {sqlite3Insert(pParse, X, Y, 0, F, R);} 68474ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 68574ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 686147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 687147d0cccSdrh {sqlite3Insert(pParse, X, 0, 0, F, R);} 688348784efSdrh 6895eff7cf0Sshane %type insert_cmd {u8} 690fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 691fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 692fa86c412Sdrh 693348784efSdrh 694348784efSdrh %type itemlist {ExprList*} 695633e6d57Sdrh %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);} 696348784efSdrh 69717435752Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y). 698b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 69917435752Sdrh itemlist(A) ::= expr(X). 700b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,X.pExpr);} 701348784efSdrh 702967e8b73Sdrh %type inscollist_opt {IdList*} 703633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 704967e8b73Sdrh %type inscollist {IdList*} 705633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);} 706348784efSdrh 707967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 708967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 70917435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y). 71017435752Sdrh {A = sqlite3IdListAppend(pParse->db,X,&Y);} 71117435752Sdrh inscollist(A) ::= nm(Y). 71217435752Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y);} 713348784efSdrh 714382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 715382c0247Sdrh // 716348784efSdrh 717b7916a78Sdrh %type expr {ExprSpan} 718b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 719b7916a78Sdrh %type term {ExprSpan} 720b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 721b7916a78Sdrh 722b7916a78Sdrh %include { 723b7916a78Sdrh /* This is a utility routine used to set the ExprSpan.zStart and 724b7916a78Sdrh ** ExprSpan.zEnd values of pOut so that the span covers the complete 725b7916a78Sdrh ** range of text beginning with pStart and going to the end of pEnd. 726b7916a78Sdrh */ 727b7916a78Sdrh static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ 728b7916a78Sdrh pOut->zStart = pStart->z; 729b7916a78Sdrh pOut->zEnd = &pEnd->z[pEnd->n]; 730b7916a78Sdrh } 731b7916a78Sdrh 732b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 733b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 734b7916a78Sdrh ** that created the expression. 735b7916a78Sdrh */ 736b7916a78Sdrh static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){ 737b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue); 738b7916a78Sdrh pOut->zStart = pValue->z; 739b7916a78Sdrh pOut->zEnd = &pValue->z[pValue->n]; 740b7916a78Sdrh } 741b7916a78Sdrh } 742348784efSdrh 7437977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 744b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);} 745b7916a78Sdrh term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);} 746b7916a78Sdrh expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);} 747b7916a78Sdrh expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);} 7485ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 74917435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 75017435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 751b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); 752b7916a78Sdrh spanSet(&A,&X,&Y); 753e1b6a5b8Sdrh } 754d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 75517435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 75617435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 75717435752Sdrh Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 75817435752Sdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 759b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 760b7916a78Sdrh spanSet(&A,&X,&Z); 761d24cc427Sdrh } 762b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);} 763b7916a78Sdrh term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);} 764b7916a78Sdrh expr(A) ::= REGISTER(X). { 765b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 766b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 767b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 768b7916a78Sdrh if( pParse->nested==0 ){ 769b7916a78Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); 770b7916a78Sdrh A.pExpr = 0; 771b7916a78Sdrh }else{ 772b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); 773b7916a78Sdrh if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable); 774b7916a78Sdrh } 775b7916a78Sdrh spanSet(&A, &X, &X); 776b7916a78Sdrh } 7777c972decSdrh expr(A) ::= VARIABLE(X). { 778b7916a78Sdrh spanExpr(&A, pParse, TK_VARIABLE, &X); 779b7916a78Sdrh sqlite3ExprAssignVarNumber(pParse, A.pExpr); 780b7916a78Sdrh spanSet(&A, &X, &X); 781895d7472Sdrh } 78239002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). { 783*8342e49fSdrh A.pExpr = sqlite3ExprSetCollByToken(pParse, E.pExpr, &C); 784b7916a78Sdrh A.zStart = E.zStart; 785b7916a78Sdrh A.zEnd = &C.z[C.n]; 7868b4c40d8Sdrh } 787487e262fSdrh %ifndef SQLITE_OMIT_CAST 788487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 789b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); 790b7916a78Sdrh spanSet(&A,&X,&Y); 791487e262fSdrh } 792154d4b24Sdrh %endif SQLITE_OMIT_CAST 793fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 794994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 795e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 7964e05c83bSdrh } 797b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 798b7916a78Sdrh spanSet(&A,&X,&E); 799b7916a78Sdrh if( D && A.pExpr ){ 800b7916a78Sdrh A.pExpr->flags |= EP_Distinct; 801fd357974Sdrh } 802e1b6a5b8Sdrh } 803e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 804b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 805b7916a78Sdrh spanSet(&A,&X,&E); 806e1b6a5b8Sdrh } 807b71090fdSdrh term(A) ::= CTIME_KW(OP). { 808b71090fdSdrh /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 809b71090fdSdrh ** treated as functions that return constants */ 810b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0,&OP); 811b7916a78Sdrh if( A.pExpr ){ 812b7916a78Sdrh A.pExpr->op = TK_CONST_FUNC; 813b7916a78Sdrh } 814b7916a78Sdrh spanSet(&A, &OP, &OP); 815b7916a78Sdrh } 816b7916a78Sdrh 817b7916a78Sdrh %include { 818b7916a78Sdrh /* This routine constructs a binary expression node out of two ExprSpan 819b7916a78Sdrh ** objects and uses the result to populate a new ExprSpan object. 820b7916a78Sdrh */ 821b7916a78Sdrh static void spanBinaryExpr( 822b7916a78Sdrh ExprSpan *pOut, /* Write the result here */ 823b7916a78Sdrh Parse *pParse, /* The parsing context. Errors accumulate here */ 824b7916a78Sdrh int op, /* The binary operation */ 825b7916a78Sdrh ExprSpan *pLeft, /* The left operand */ 826b7916a78Sdrh ExprSpan *pRight /* The right operand */ 827b7916a78Sdrh ){ 828b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); 829b7916a78Sdrh pOut->zStart = pLeft->zStart; 830b7916a78Sdrh pOut->zEnd = pRight->zEnd; 831417ec638Sdrh } 832b71090fdSdrh } 833b7916a78Sdrh 834b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 835b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 83617435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). 837b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 838b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 839fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 840b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 841b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). 842b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 84317435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 844b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 845b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 84674ad7fe9Sdrh %type likeop {struct LikeOp} 847b52076cdSdrh likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} 848b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} 84903bea70cSdrh likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;} 85003bea70cSdrh likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;} 8511dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] { 8528aa34ae0Sdrh ExprList *pList; 853b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 854b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 855b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 856b7916a78Sdrh if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 857b7916a78Sdrh A.zStart = X.zStart; 858b7916a78Sdrh A.zEnd = Y.zEnd; 859b7916a78Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 8600ac65892Sdrh } 8611dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 8621dca1458Sdrh ExprList *pList; 8631dca1458Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 8641dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 8651dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 8661dca1458Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 8671dca1458Sdrh if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 8681dca1458Sdrh A.zStart = X.zStart; 8691dca1458Sdrh A.zEnd = E.zEnd; 8701dca1458Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 8711dca1458Sdrh } 8727c6303c0Sdanielk1977 873b7916a78Sdrh %include { 874b7916a78Sdrh /* Construct an expression node for a unary postfix operator 875b7916a78Sdrh */ 876b7916a78Sdrh static void spanUnaryPostfix( 877b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 878b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 879b7916a78Sdrh int op, /* The operator */ 880b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 881b7916a78Sdrh Token *pPostOp /* The operand token for setting the span */ 882b7916a78Sdrh ){ 883b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 884b7916a78Sdrh pOut->zStart = pOperand->zStart; 885b7916a78Sdrh pOut->zEnd = &pPostOp->z[pPostOp->n]; 886e1b6a5b8Sdrh } 88733048c0bSdrh } 888b7916a78Sdrh 889b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} 890b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 8916a2fe093Sdrh 8926a51741dSdrh %include { 8936a51741dSdrh /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 8946a51741dSdrh ** unary TK_ISNULL or TK_NOTNULL expression. */ 8956a51741dSdrh static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 8966a51741dSdrh sqlite3 *db = pParse->db; 8976a51741dSdrh if( db->mallocFailed==0 && pY->op==TK_NULL ){ 8985e17e8b7Sshaneh pA->op = (u8)op; 8996a51741dSdrh sqlite3ExprDelete(db, pA->pRight); 9006a51741dSdrh pA->pRight = 0; 9016a51741dSdrh } 9026a51741dSdrh } 9036a51741dSdrh } 9046a51741dSdrh 9056a2fe093Sdrh // expr1 IS expr2 9066a2fe093Sdrh // expr1 IS NOT expr2 9076a2fe093Sdrh // 9086a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2 9096a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT. 9106a2fe093Sdrh // 9116a2fe093Sdrh expr(A) ::= expr(X) IS expr(Y). { 9126a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_IS,&X,&Y); 9136a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL); 9146a2fe093Sdrh } 9156a2fe093Sdrh expr(A) ::= expr(X) IS NOT expr(Y). { 9166a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y); 9176a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL); 9186a2fe093Sdrh } 919b7916a78Sdrh 920b7916a78Sdrh %include { 921b7916a78Sdrh /* Construct an expression node for a unary prefix operator 922b7916a78Sdrh */ 923b7916a78Sdrh static void spanUnaryPrefix( 924b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 925b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 926b7916a78Sdrh int op, /* The operator */ 927b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 928b7916a78Sdrh Token *pPreOp /* The operand token for setting the span */ 929b7916a78Sdrh ){ 930b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 931b7916a78Sdrh pOut->zStart = pPreOp->z; 932b7916a78Sdrh pOut->zEnd = pOperand->zEnd; 93333048c0bSdrh } 93481a20f21Sdrh } 935b7916a78Sdrh 936b7916a78Sdrh 937b7916a78Sdrh 938b7916a78Sdrh expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 939b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 9407ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT] 941b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);} 9427ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT] 943b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);} 944b7916a78Sdrh 9452e3a1f16Sdrh %type between_op {int} 9462e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 9472e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 9482e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 949b7916a78Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); 950b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); 951b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); 952b7916a78Sdrh if( A.pExpr ){ 953b7916a78Sdrh A.pExpr->x.pList = pList; 95453f733c7Sdrh }else{ 955633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 95653f733c7Sdrh } 957b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 958b7916a78Sdrh A.zStart = W.zStart; 959b7916a78Sdrh A.zEnd = Y.zEnd; 960fef5208cSdrh } 9613e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 9622e3a1f16Sdrh %type in_op {int} 9632e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 9642e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 9652e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 966094430ebSdrh if( Y==0 ){ 967473c1bf2Sdan /* Expressions of the form 968473c1bf2Sdan ** 969473c1bf2Sdan ** expr1 IN () 970473c1bf2Sdan ** expr1 NOT IN () 971473c1bf2Sdan ** 972473c1bf2Sdan ** simplify to constants 0 (false) and 1 (true), respectively, 973473c1bf2Sdan ** regardless of the value of expr1. 974473c1bf2Sdan */ 975094430ebSdrh A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]); 976094430ebSdrh sqlite3ExprDelete(pParse->db, X.pExpr); 977094430ebSdrh }else{ 978b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 979b7916a78Sdrh if( A.pExpr ){ 980b7916a78Sdrh A.pExpr->x.pList = Y; 981b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 982d5d56523Sdanielk1977 }else{ 983633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 984d5d56523Sdanielk1977 } 985b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 986094430ebSdrh } 987b7916a78Sdrh A.zStart = X.zStart; 988b7916a78Sdrh A.zEnd = &E.z[E.n]; 989fef5208cSdrh } 99051522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 991b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); 992b7916a78Sdrh if( A.pExpr ){ 993b7916a78Sdrh A.pExpr->x.pSelect = X; 994b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 995b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 99653f733c7Sdrh }else{ 997633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 99853f733c7Sdrh } 999b7916a78Sdrh A.zStart = B.z; 1000b7916a78Sdrh A.zEnd = &E.z[E.n]; 100151522cd3Sdrh } 10022e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 1003b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1004b7916a78Sdrh if( A.pExpr ){ 1005b7916a78Sdrh A.pExpr->x.pSelect = Y; 1006b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1007b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 100853f733c7Sdrh }else{ 1009633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 101053f733c7Sdrh } 1011b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1012b7916a78Sdrh A.zStart = X.zStart; 1013b7916a78Sdrh A.zEnd = &E.z[E.n]; 1014fef5208cSdrh } 101574ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 101617435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 1017b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1018b7916a78Sdrh if( A.pExpr ){ 1019b7916a78Sdrh A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 1020b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1021b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 102253f733c7Sdrh }else{ 1023633e6d57Sdrh sqlite3SrcListDelete(pParse->db, pSrc); 102453f733c7Sdrh } 1025b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1026b7916a78Sdrh A.zStart = X.zStart; 1027b7916a78Sdrh A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; 102823b2db23Sdrh } 102951522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 1030b7916a78Sdrh Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); 103151522cd3Sdrh if( p ){ 10326ab3a2ecSdanielk1977 p->x.pSelect = Y; 1033b7916a78Sdrh ExprSetProperty(p, EP_xIsSelect); 1034b7916a78Sdrh sqlite3ExprSetHeight(pParse, p); 103553f733c7Sdrh }else{ 1036633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 103751522cd3Sdrh } 1038b7916a78Sdrh A.zStart = B.z; 1039b7916a78Sdrh A.zEnd = &E.z[E.n]; 104051522cd3Sdrh } 1041154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1042fef5208cSdrh 104317a7f8ddSdrh /* CASE expressions */ 104417a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 1045b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); 1046b7916a78Sdrh if( A.pExpr ){ 1047b7916a78Sdrh A.pExpr->x.pList = Y; 1048b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 104953f733c7Sdrh }else{ 1050633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 105153f733c7Sdrh } 1052b7916a78Sdrh A.zStart = C.z; 1053b7916a78Sdrh A.zEnd = &E.z[E.n]; 105417a7f8ddSdrh } 105517a7f8ddSdrh %type case_exprlist {ExprList*} 1056633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 105717a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 1058b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, Y.pExpr); 1059b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 106017a7f8ddSdrh } 106117a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 1062b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, Y.pExpr); 1063b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 106417a7f8ddSdrh } 106517a7f8ddSdrh %type case_else {Expr*} 1066633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 1067b7916a78Sdrh case_else(A) ::= ELSE expr(X). {A = X.pExpr;} 106817a7f8ddSdrh case_else(A) ::= . {A = 0;} 106917a7f8ddSdrh %type case_operand {Expr*} 1070633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 1071b7916a78Sdrh case_operand(A) ::= expr(X). {A = X.pExpr;} 107217a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1073348784efSdrh 1074348784efSdrh %type exprlist {ExprList*} 1075633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 10769245c243Sdrh %type nexprlist {ExprList*} 1077633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1078348784efSdrh 10799245c243Sdrh exprlist(A) ::= nexprlist(X). {A = X;} 10809245c243Sdrh exprlist(A) ::= . {A = 0;} 108117435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 1082b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 108317435752Sdrh nexprlist(A) ::= expr(Y). 1084b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} 10859245c243Sdrh 1086cce7d176Sdrh 1087382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1088382c0247Sdrh // 1089d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 109077e96d14Sdrh ON nm(Y) LP idxlist(Z) RP(E). { 109117435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 109217435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 10934d91a701Sdrh &S, &E, SQLITE_SO_ASC, NE); 10949cfcf5d4Sdrh } 1095717e6402Sdrh 1096717e6402Sdrh %type uniqueflag {int} 10979cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 10989cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1099348784efSdrh 11000202b29eSdanielk1977 %type idxlist {ExprList*} 1101633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 11020202b29eSdanielk1977 %type idxlist_opt {ExprList*} 1103633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1104348784efSdrh 1105c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 1106c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 1107200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 11080202b29eSdanielk1977 Expr *p = 0; 11090202b29eSdanielk1977 if( C.n>0 ){ 1110b7916a78Sdrh p = sqlite3Expr(pParse->db, TK_COLUMN, 0); 1111*8342e49fSdrh sqlite3ExprSetCollByToken(pParse, p, &C); 11120202b29eSdanielk1977 } 1113b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, p); 1114b7916a78Sdrh sqlite3ExprListSetName(pParse,A,&Y,1); 1115b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1116b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 11170202b29eSdanielk1977 } 1118200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 11190202b29eSdanielk1977 Expr *p = 0; 11200202b29eSdanielk1977 if( C.n>0 ){ 112117435752Sdrh p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); 1122*8342e49fSdrh sqlite3ExprSetCollByToken(pParse, p, &C); 11230202b29eSdanielk1977 } 1124b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, p); 1125b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &Y, 1); 1126b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1127b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 11280202b29eSdanielk1977 } 11290202b29eSdanielk1977 1130a34001c9Sdrh %type collate {Token} 1131a34001c9Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 113239002505Sdanielk1977 collate(C) ::= COLLATE ids(X). {C = X;} 1133a34001c9Sdrh 1134348784efSdrh 11358aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1136382c0247Sdrh // 11374d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1138982cef7eSdrh 1139382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1140382c0247Sdrh // 1141154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1142fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 114374161705Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse);} 114474161705Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} 1145fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1146154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1147f57b14a6Sdrh 1148382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1149382c0247Sdrh // 115013d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 115191cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1152ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1153ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1154ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1155ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1156ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1157ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1158ada2ee0dSdrh 1159a3eb4b44Sdrh nmnum(A) ::= plus_num(X). {A = X;} 1160a3eb4b44Sdrh nmnum(A) ::= nm(X). {A = X;} 1161ada2ee0dSdrh nmnum(A) ::= ON(X). {A = X;} 1162ada2ee0dSdrh nmnum(A) ::= DELETE(X). {A = X;} 11636da861beSdrh nmnum(A) ::= DEFAULT(X). {A = X;} 1164154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 1165f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 1166f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1167fd405314Sdrh number(A) ::= INTEGER|FLOAT(X). {A = X;} 1168f57b14a6Sdrh plus_opt ::= PLUS. 1169f57b14a6Sdrh plus_opt ::= . 1170c3f9bad2Sdanielk1977 1171c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1172f0f258b1Sdrh 1173b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1174b7f9164eSdrh 1175d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 11764b59ab5eSdrh Token all; 11774b59ab5eSdrh all.z = A.z; 1178b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 11794adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1180f0f258b1Sdrh } 1181f0f258b1Sdrh 1182fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1183fdd48a76Sdrh trigger_time(C) trigger_event(D) 118460218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 118560218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 11863df6b257Sdanielk1977 A = (Z.n==0?B:Z); 1187c3f9bad2Sdanielk1977 } 1188c3f9bad2Sdanielk1977 1189c3f9bad2Sdanielk1977 %type trigger_time {int} 1190c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1191c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1192c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1193c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1194c3f9bad2Sdanielk1977 1195ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1196633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1197fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 119874ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 1199c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 1200c3f9bad2Sdanielk1977 120160218d2aSdrh foreach_clause ::= . 120260218d2aSdrh foreach_clause ::= FOR EACH ROW. 1203c3f9bad2Sdanielk1977 1204c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1205633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1206c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1207b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1208c3f9bad2Sdanielk1977 1209c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1210633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 1211187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { 121281238966Sdrh assert( Y!=0 ); 121381238966Sdrh Y->pLast->pNext = X; 1214187e4c6aSdrh Y->pLast = X; 1215187e4c6aSdrh A = Y; 1216a69d9168Sdrh } 121781238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { 121881238966Sdrh assert( X!=0 ); 121981238966Sdrh X->pLast = X; 122081238966Sdrh A = X; 122181238966Sdrh } 1222c3f9bad2Sdanielk1977 1223b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements 1224b1819a0bSdrh // within a trigger. The table to INSERT, UPDATE, or DELETE is always in 1225b1819a0bSdrh // the same database as the table that the trigger fires on. 1226b1819a0bSdrh // 1227b1819a0bSdrh %type trnm {Token} 1228b1819a0bSdrh trnm(A) ::= nm(X). {A = X;} 1229b1819a0bSdrh trnm(A) ::= nm DOT nm(X). { 1230b1819a0bSdrh A = X; 1231b1819a0bSdrh sqlite3ErrorMsg(pParse, 1232b1819a0bSdrh "qualified table names are not allowed on INSERT, UPDATE, and DELETE " 1233b1819a0bSdrh "statements within triggers"); 1234b1819a0bSdrh } 1235b1819a0bSdrh 1236b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE 1237b1819a0bSdrh // statements within triggers. We make a specific error message for this 1238b1819a0bSdrh // since it is an exception to the default grammar rules. 1239b1819a0bSdrh // 1240b1819a0bSdrh tridxby ::= . 1241b1819a0bSdrh tridxby ::= INDEXED BY nm. { 1242b1819a0bSdrh sqlite3ErrorMsg(pParse, 1243b1819a0bSdrh "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " 1244b1819a0bSdrh "within triggers"); 1245b1819a0bSdrh } 1246b1819a0bSdrh tridxby ::= NOT INDEXED. { 1247b1819a0bSdrh sqlite3ErrorMsg(pParse, 1248b1819a0bSdrh "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " 1249b1819a0bSdrh "within triggers"); 1250b1819a0bSdrh } 1251b1819a0bSdrh 1252b1819a0bSdrh 1253b1819a0bSdrh 1254c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1255633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1256c3f9bad2Sdanielk1977 // UPDATE 1257b1819a0bSdrh trigger_cmd(A) ::= 1258b1819a0bSdrh UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). 125917435752Sdrh { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1260c3f9bad2Sdanielk1977 1261c3f9bad2Sdanielk1977 // INSERT 1262b1819a0bSdrh trigger_cmd(A) ::= 1263b1819a0bSdrh insert_cmd(R) INTO trnm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP. 126417435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);} 1265c3f9bad2Sdanielk1977 1266b1819a0bSdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S). 126717435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} 1268c3f9bad2Sdanielk1977 1269c3f9bad2Sdanielk1977 // DELETE 1270b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). 127117435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1272c3f9bad2Sdanielk1977 1273c3f9bad2Sdanielk1977 // SELECT 127417435752Sdrh trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1275c3f9bad2Sdanielk1977 12766f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 12774b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1278b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); 1279b7916a78Sdrh if( A.pExpr ){ 1280b7916a78Sdrh A.pExpr->affinity = OE_Ignore; 12814b59ab5eSdrh } 1282b7916a78Sdrh A.zStart = X.z; 1283b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 12848aa34ae0Sdrh } 128574ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 1286b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); 1287b7916a78Sdrh if( A.pExpr ) { 1288b7916a78Sdrh A.pExpr->affinity = (char)T; 12894b59ab5eSdrh } 1290b7916a78Sdrh A.zStart = X.z; 1291b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 12928aa34ae0Sdrh } 1293154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1294b7f9164eSdrh 129574ad7fe9Sdrh %type raisetype {int} 129674ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 129774ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 129874ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 129974ad7fe9Sdrh 13006f34903eSdanielk1977 1301c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1302b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1303fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1304fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1305c3f9bad2Sdanielk1977 } 1306154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1307113088ecSdrh 1308113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1309fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1310f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1311b7916a78Sdrh sqlite3Attach(pParse, F.pExpr, D.pExpr, K); 13121c2d8414Sdrh } 1313fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1314b7916a78Sdrh sqlite3Detach(pParse, D.pExpr); 1315fdbcdee5Sdrh } 1316fdbcdee5Sdrh 1317f744bb56Sdanielk1977 %type key_opt {Expr*} 1318633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1319f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1320b7916a78Sdrh key_opt(A) ::= KEY expr(X). { A = X.pExpr; } 1321113088ecSdrh 1322113088ecSdrh database_kw_opt ::= DATABASE. 1323113088ecSdrh database_kw_opt ::= . 1324fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 13254343fea2Sdrh 13264343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 13274343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 13284343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 13294343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1330154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 13319fd2a9a0Sdanielk1977 13329f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 13339f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 13349f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 13359f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 13369f18e8a0Sdrh %endif 13379f18e8a0Sdrh 13389fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 13399fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 13409fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 13419fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 13429fd2a9a0Sdanielk1977 } 134319a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 134419a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 134519a8e7e8Sdanielk1977 } 134619a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 1347d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 134819a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 134919a8e7e8Sdanielk1977 } 135019a8e7e8Sdanielk1977 kwcolumn_opt ::= . 135119a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1352154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1353e09daa90Sdrh 1354e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1355e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1356b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1357b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1358d9da78a2Sdrh create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { 1359b9bb7c18Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z); 1360b9bb7c18Sdrh } 1361e09daa90Sdrh vtabarglist ::= vtabarg. 1362e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1363b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1364b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1365b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1366b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1367b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1368b9bb7c18Sdrh anylist ::= . 1369aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1370aaac8b4eSdrh anylist ::= anylist ANY. 1371154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 1372