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 ** 17*13d32d19Sdrh ** @(#) $Id: parse.y,v 1.280 2009/06/12 03:47:37 drh Exp $ 18348784efSdrh */ 19487e262fSdrh 20487e262fSdrh // All token codes are small integers with #defines that begin with "TK_" 21348784efSdrh %token_prefix TK_ 22487e262fSdrh 23487e262fSdrh // The type of the data attached to each token is Token. This is also the 24487e262fSdrh // default type for non-terminals. 25487e262fSdrh // 26348784efSdrh %token_type {Token} 27f57b14a6Sdrh %default_type {Token} 28487e262fSdrh 29487e262fSdrh // The generated parser function takes a 4th argument as follows: 30348784efSdrh %extra_argument {Parse *pParse} 31487e262fSdrh 32487e262fSdrh // This code runs whenever there is a syntax error 33487e262fSdrh // 34348784efSdrh %syntax_error { 35128255fcSdrh UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ 3655176259Sdrh assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ 374adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 3886dac2b6Sdrh pParse->parseError = 1; 39b86ccfb2Sdrh } 408fc3345fSdrh %stack_overflow { 41128255fcSdrh UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ 428fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 4386dac2b6Sdrh pParse->parseError = 1; 448fc3345fSdrh } 45487e262fSdrh 46487e262fSdrh // The name of the generated procedure that implements the parser 47487e262fSdrh // is as follows: 484adee20fSdanielk1977 %name sqlite3Parser 49487e262fSdrh 50487e262fSdrh // The following text is included near the beginning of the C source 51487e262fSdrh // code file that implements the parser. 52487e262fSdrh // 53348784efSdrh %include { 54348784efSdrh #include "sqliteInt.h" 559bbca4c1Sdrh 569bbca4c1Sdrh /* 57d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 58d3ec02d3Sdrh ** automaton. 59d3ec02d3Sdrh */ 60d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 61d3ec02d3Sdrh 62d3ec02d3Sdrh /* 63ad3cab52Sdrh ** An instance of this structure holds information about the 64ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 659bbca4c1Sdrh */ 66ad3cab52Sdrh struct LimitVal { 67a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 68a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 69ad3cab52Sdrh }; 70c3f9bad2Sdanielk1977 71c3f9bad2Sdanielk1977 /* 722e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 732e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 742e3a1f16Sdrh */ 752e3a1f16Sdrh struct LikeOp { 76b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 772e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 782e3a1f16Sdrh }; 792e3a1f16Sdrh 802e3a1f16Sdrh /* 81ad3cab52Sdrh ** An instance of the following structure describes the event of a 82ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 83ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 84ad3cab52Sdrh ** 85ad3cab52Sdrh ** UPDATE ON (a,b,c) 86ad3cab52Sdrh ** 87ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 88c3f9bad2Sdanielk1977 */ 89ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 90caec2f12Sdrh 9125d6543dSdrh /* 9225d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 9325d6543dSdrh */ 9425d6543dSdrh struct AttachKey { int type; Token key; }; 9525d6543dSdrh 96caec2f12Sdrh } // end %include 97348784efSdrh 98826fb5a3Sdrh // Input is a single SQL command 99c4a3c779Sdrh input ::= cmdlist. 100094b2bbfSdrh cmdlist ::= cmdlist ecmd. 101826fb5a3Sdrh cmdlist ::= ecmd. 102b7f9164eSdrh ecmd ::= SEMI. 103b7f9164eSdrh ecmd ::= explain cmdx SEMI. 1044adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 105b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 106b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 107ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } 108154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 109200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 110348784efSdrh 111382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 112c4a3c779Sdrh // 113fa86c412Sdrh 114684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 115c4a3c779Sdrh trans_opt ::= . 116c4a3c779Sdrh trans_opt ::= TRANSACTION. 1175ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 118684917c2Sdrh %type transtype {int} 119684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 120684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 121684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 122684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1234adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1244adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1254adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 126c4a3c779Sdrh 127fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 128fd7f0452Sdanielk1977 savepoint_opt ::= . 129fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 130fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 131fd7f0452Sdanielk1977 } 132fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 133fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 134fd7f0452Sdanielk1977 } 135fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 136fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 137fd7f0452Sdanielk1977 } 138fd7f0452Sdanielk1977 139382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 140348784efSdrh // 141348784efSdrh cmd ::= create_table create_table_args. 142d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 143f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 144969fa7c1Sdrh } 145d9da78a2Sdrh createkw(A) ::= CREATE(X). { 146d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 147d9da78a2Sdrh A = X; 148d9da78a2Sdrh } 149faa59554Sdrh %type ifnotexists {int} 150faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 151faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 152f57b3399Sdrh %type temp {int} 15353c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 154d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 155154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 156d24cc427Sdrh temp(A) ::= . {A = 0;} 15719a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { 15819a8e7e8Sdanielk1977 sqlite3EndTable(pParse,&X,&Y,0); 159969fa7c1Sdrh } 160969fa7c1Sdrh create_table_args ::= AS select(S). { 16119a8e7e8Sdanielk1977 sqlite3EndTable(pParse,0,0,S); 162633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 163969fa7c1Sdrh } 164348784efSdrh columnlist ::= columnlist COMMA column. 165348784efSdrh columnlist ::= column. 166348784efSdrh 167487e262fSdrh // A "column" is a complete description of a single column in a 168487e262fSdrh // CREATE TABLE statement. This includes the column name, its 169487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 170487e262fSdrh // NOT NULL and so forth. 171348784efSdrh // 17219a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 17319a8e7e8Sdanielk1977 A.z = X.z; 174b27b7f5dSdrh A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 17519a8e7e8Sdanielk1977 } 17619a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 17719a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 17819a8e7e8Sdanielk1977 A = X; 17919a8e7e8Sdanielk1977 } 18019a8e7e8Sdanielk1977 181c4a3c779Sdrh 182c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 183c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 184c4a3c779Sdrh // 185982cef7eSdrh %type id {Token} 186f18543caSdrh id(A) ::= ID(X). {A = X;} 187296a483cSdrh id(A) ::= INDEXED(X). {A = X;} 1880bd1f4eaSdrh 18934e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 19034e33bb8Sdrh // fallback to ID if they will not parse as their original value. 19134e33bb8Sdrh // This obviates the need for the "id" nonterminal. 19234e33bb8Sdrh // 1930bd1f4eaSdrh %fallback ID 194db15bcd5Sdrh ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW CONFLICT 195684917c2Sdrh DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 196ca5557f9Sdrh IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN 197db15bcd5Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK 19878c2e6d8Sdanielk1977 SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL 199b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 200b7f9164eSdrh EXCEPT INTERSECT UNION 201154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 202a073384fSdrh REINDEX RENAME CTIME_KW IF 203b7f9164eSdrh . 204e09daa90Sdrh %wildcard ANY. 205c4a3c779Sdrh 2062d3917daSdrh // Define operator precedence early so that this is the first occurance 2072d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2082d3917daSdrh // causes them to be assigned integer values that are close together, 2092d3917daSdrh // which keeps parser tables smaller. 2102d3917daSdrh // 211f2bc013cSdrh // The token values assigned to these symbols is determined by the order 212f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 213f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 214f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 215f2bc013cSdrh // constraint. 216f2bc013cSdrh // 2172d3917daSdrh %left OR. 2182d3917daSdrh %left AND. 2192d3917daSdrh %right NOT. 22003bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2219a43267bSdrh %left GT LE LT GE. 2227c6303c0Sdanielk1977 %right ESCAPE. 2232d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2242d3917daSdrh %left PLUS MINUS. 2252d3917daSdrh %left STAR SLASH REM. 226a34001c9Sdrh %left CONCAT. 227a34001c9Sdrh %left COLLATE. 2282d3917daSdrh %right UMINUS UPLUS BITNOT. 2292d3917daSdrh 230c4a3c779Sdrh // And "ids" is an identifer-or-string. 231c4a3c779Sdrh // 232c4a3c779Sdrh %type ids {Token} 233fd405314Sdrh ids(A) ::= ID|STRING(X). {A = X;} 234c4a3c779Sdrh 2355ad1a6c8Sdrh // The name of a column or table can be any of the following: 2365ad1a6c8Sdrh // 2375ad1a6c8Sdrh %type nm {Token} 238296a483cSdrh nm(A) ::= id(X). {A = X;} 2395ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2405ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2415ad1a6c8Sdrh 242487e262fSdrh // A typetoken is really one or more tokens that form a type name such 243487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 244487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 245487e262fSdrh // 246487e262fSdrh %type typetoken {Token} 247382c0247Sdrh type ::= . 248487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 249487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 250487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 251487e262fSdrh A.z = X.z; 252b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 253487e262fSdrh } 254487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 255487e262fSdrh A.z = X.z; 256b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 257487e262fSdrh } 258382c0247Sdrh %type typename {Token} 259382c0247Sdrh typename(A) ::= ids(X). {A = X;} 260b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 26160218d2aSdrh signed ::= plus_num. 26260218d2aSdrh signed ::= minus_num. 263487e262fSdrh 264487e262fSdrh // "carglist" is a list of additional constraints that come after the 265487e262fSdrh // column name and column type in a CREATE TABLE statement. 266487e262fSdrh // 267348784efSdrh carglist ::= carglist carg. 268348784efSdrh carglist ::= . 2695ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 270348784efSdrh carg ::= ccons. 271b7916a78Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 272b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 273b7916a78Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 274f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 275b7916a78Sdrh ExprSpan v; 276b7916a78Sdrh v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); 277b7916a78Sdrh v.zStart = A.z; 278b7916a78Sdrh v.zEnd = X.zEnd; 279b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2807977a17fSdanielk1977 } 2812b7acc35Sdrh ccons ::= DEFAULT id(X). { 282b7916a78Sdrh ExprSpan v; 283b7916a78Sdrh spanExpr(&v, pParse, TK_STRING, &X); 284b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2857977a17fSdanielk1977 } 286348784efSdrh 287382c0247Sdrh // In addition to the type name, we also care about the primary key and 288382c0247Sdrh // UNIQUE constraints. 289348784efSdrh // 2900d316a40Sdrh ccons ::= NULL onconf. 2914adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 292fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 293fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 2944d91a701Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 295b7916a78Sdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} 296c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 2974adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 2984adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 29939002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 30004738cb9Sdrh 301205f48e6Sdrh // The optional AUTOINCREMENT keyword 302205f48e6Sdrh %type autoinc {int} 303205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3042958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 305205f48e6Sdrh 306c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 307c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 308c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 309c2eef3b3Sdrh // check fails. 31004738cb9Sdrh // 311c2eef3b3Sdrh %type refargs {int} 312c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 31350af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; } 314c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 315c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 316c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 317c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 318c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 319c2eef3b3Sdrh %type refact {int} 320c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 321c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 322c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 323c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 324c2eef3b3Sdrh %type defer_subclause {int} 325c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 326c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 327c2eef3b3Sdrh %type init_deferred_pred_opt {int} 328c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 329c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 330c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 331348784efSdrh 332348784efSdrh // For the time being, the only constraint we care about is the primary 333382c0247Sdrh // key and UNIQUE. Both create indices. 334348784efSdrh // 33519a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 33619a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 337348784efSdrh conslist ::= conslist COMMA tcons. 338a2e1bb5aSdrh conslist ::= conslist tcons. 339348784efSdrh conslist ::= tcons. 3405ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 341f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 342fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3439cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3444d91a701Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 345b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 346b7916a78Sdrh {sqlite3AddCheckConstraint(pParse,E.pExpr);} 347c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 348c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3494adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3504adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 351c2eef3b3Sdrh } 352c2eef3b3Sdrh %type defer_subclause_opt {int} 353c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 354c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3559cfcf5d4Sdrh 3569cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3579cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3589cfcf5d4Sdrh // 3599cfcf5d4Sdrh %type onconf {int} 3601c92853dSdrh %type orconf {int} 3611c92853dSdrh %type resolvetype {int} 3621c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3631c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3641c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3651c92853dSdrh orconf(A) ::= OR resolvetype(X). {A = X;} 36674ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3671c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3681c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 369348784efSdrh 370382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 371348784efSdrh // 372a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 373a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 374a8858103Sdanielk1977 } 375a073384fSdrh %type ifexists {int} 376a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 377a073384fSdrh ifexists(A) ::= . {A = 0;} 378348784efSdrh 379a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 380a76b5dfcSdrh // 381b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 382d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { 383fdd48a76Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 384a76b5dfcSdrh } 385a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 386a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 387a76b5dfcSdrh } 388154d4b24Sdrh %endif SQLITE_OMIT_VIEW 389a76b5dfcSdrh 390382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 391348784efSdrh // 3929bb61fe7Sdrh cmd ::= select(X). { 3937d10d5a6Sdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0}; 3947d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 395633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 3969bb61fe7Sdrh } 397efb7251dSdrh 3989bb61fe7Sdrh %type select {Select*} 399633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 40082c3d636Sdrh %type oneselect {Select*} 401633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4029bb61fe7Sdrh 40382c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 404b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4050a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 406daffd0e5Sdrh if( Z ){ 407b27b7f5dSdrh Z->op = (u8)Y; 40882c3d636Sdrh Z->pPrior = X; 40943b78826Sdrh }else{ 410633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 411daffd0e5Sdrh } 41282c3d636Sdrh A = Z; 41382c3d636Sdrh } 4140a36c57eSdrh %type multiselect_op {int} 41574ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 4160a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 417fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 418154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 41982c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 4209bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 42117435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 4229bb61fe7Sdrh } 4239bb61fe7Sdrh 4249bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 4259bb61fe7Sdrh // present and false (0) if it is not. 4269bb61fe7Sdrh // 427efb7251dSdrh %type distinct {int} 428efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 429fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 430efb7251dSdrh distinct(A) ::= . {A = 0;} 431348784efSdrh 4329bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 4337c917d19Sdrh // values of the SELECT statement. The "*" in statements like 4347c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 4357c917d19Sdrh // opcode of TK_ALL. 4369bb61fe7Sdrh // 437348784efSdrh %type selcollist {ExprList*} 438633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 439348784efSdrh %type sclp {ExprList*} 440633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 441348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 442348784efSdrh sclp(A) ::= . {A = 0;} 44301f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 444b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, X.pExpr); 445b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 446b7916a78Sdrh sqlite3ExprListSetSpan(pParse,A,&X); 44701f3f253Sdrh } 4487c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 449b7916a78Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); 450b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, p); 4517c917d19Sdrh } 452e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { 453e54a62adSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); 45417435752Sdrh Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 45517435752Sdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 456b7916a78Sdrh A = sqlite3ExprListAppend(pParse,P, pDot); 45754473229Sdrh } 45801f3f253Sdrh 45901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 46001f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 46101f3f253Sdrh // 46201f3f253Sdrh %type as {Token} 4635ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 4645ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 46501f3f253Sdrh as(X) ::= . {X.n = 0;} 4669bb61fe7Sdrh 467348784efSdrh 468ad3cab52Sdrh %type seltablist {SrcList*} 469633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 470ad3cab52Sdrh %type stl_prefix {SrcList*} 471633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 472ad3cab52Sdrh %type from {SrcList*} 473633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 474348784efSdrh 47501f3f253Sdrh // A complete FROM clause. 47601f3f253Sdrh // 47717435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 47861dfc31dSdrh from(A) ::= FROM seltablist(X). { 47961dfc31dSdrh A = X; 48061dfc31dSdrh sqlite3SrcListShiftJoinType(A); 48161dfc31dSdrh } 48201f3f253Sdrh 48301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 48401f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 48501f3f253Sdrh // 48601f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 48701f3f253Sdrh A = X; 488d3ec02d3Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; 48901f3f253Sdrh } 490348784efSdrh stl_prefix(A) ::= . {A = 0;} 49185574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). { 492b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 493b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 49401f3f253Sdrh } 49551522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 496fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP 497b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 498b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 49922f70c32Sdrh } 500fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 501fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 502*13d32d19Sdrh if( X==0 ){ 503*13d32d19Sdrh sqlite3ExprDelete(pParse->db, N); 504*13d32d19Sdrh sqlite3IdListDelete(pParse->db, U); 505fbdc7f69Sdrh A = F; 506fbdc7f69Sdrh }else{ 507fbdc7f69Sdrh Select *pSubquery; 508fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 509fbdc7f69Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 510fbdc7f69Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 511fbdc7f69Sdrh } 512fbdc7f69Sdrh } 513348784efSdrh 514b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 515b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 516b733d037Sdrh // a grouping of table and subqueries. 517b733d037Sdrh // 518fbdc7f69Sdrh // %type seltablist_paren {Select*} 519fbdc7f69Sdrh // %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);} 520fbdc7f69Sdrh // seltablist_paren(A) ::= select(S). {A = S;} 521fbdc7f69Sdrh // seltablist_paren(A) ::= seltablist(F). { 522fbdc7f69Sdrh // sqlite3SrcListShiftJoinType(F); 523fbdc7f69Sdrh // A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 524fbdc7f69Sdrh // } 525154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 526b733d037Sdrh 527113088ecSdrh %type dbnm {Token} 528113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 529113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 530113088ecSdrh 53174ad7fe9Sdrh %type fullname {SrcList*} 532633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 53317435752Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 53474ad7fe9Sdrh 53501f3f253Sdrh %type joinop {int} 53601f3f253Sdrh %type joinop2 {int} 537fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 5384adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 5394adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 5405ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 5414adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 54201f3f253Sdrh 54301f3f253Sdrh %type on_opt {Expr*} 544633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 545b7916a78Sdrh on_opt(N) ::= ON expr(E). {N = E.pExpr;} 54601f3f253Sdrh on_opt(N) ::= . {N = 0;} 54701f3f253Sdrh 54885574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 54985574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 55085574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 55185574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 55285574e31Sdanielk1977 // in the token. 55385574e31Sdanielk1977 // 55485574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 555b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 55685574e31Sdanielk1977 // recognizes and interprets this as a special case. 55785574e31Sdanielk1977 // 55885574e31Sdanielk1977 %type indexed_opt {Token} 55985574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 56085574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 56185574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 56285574e31Sdanielk1977 56301f3f253Sdrh %type using_opt {IdList*} 564633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 5650202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 56601f3f253Sdrh using_opt(U) ::= . {U = 0;} 56701f3f253Sdrh 56801f3f253Sdrh 569348784efSdrh %type orderby_opt {ExprList*} 570633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 571348784efSdrh %type sortlist {ExprList*} 572633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 573348784efSdrh %type sortitem {Expr*} 574633e6d57Sdrh %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);} 575348784efSdrh 576348784efSdrh orderby_opt(A) ::= . {A = 0;} 577348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 5788b4c40d8Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { 579b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X,Y); 580b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 581348784efSdrh } 5828b4c40d8Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). { 583b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0,Y); 584d3ec02d3Sdrh if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; 585348784efSdrh } 586b7916a78Sdrh sortitem(A) ::= expr(X). {A = X.pExpr;} 587348784efSdrh 588348784efSdrh %type sortorder {int} 589348784efSdrh 5908e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 5918e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 5928e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 593348784efSdrh 5942282792aSdrh %type groupby_opt {ExprList*} 595633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 5962282792aSdrh groupby_opt(A) ::= . {A = 0;} 5979245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 5982282792aSdrh 5992282792aSdrh %type having_opt {Expr*} 600633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 6012282792aSdrh having_opt(A) ::= . {A = 0;} 602b7916a78Sdrh having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} 6032282792aSdrh 604ad3cab52Sdrh %type limit_opt {struct LimitVal} 60515926590Sdrh 60615926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 60715926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 60815926590Sdrh // rule for SELECT statements. As soon as the rule that create the 60915926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 61015926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 61115926590Sdrh // except as a transient. So there is never anything to destroy. 61215926590Sdrh // 61315926590Sdrh //%destructor limit_opt { 614633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 615633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 61615926590Sdrh //} 617a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 618b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 619a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 620b7916a78Sdrh {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 621a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 622b7916a78Sdrh {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 6239bbca4c1Sdrh 624382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 625382c0247Sdrh // 626273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 627931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 628931577f1Sdrh orderby_opt(O) limit_opt(L). { 629b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 63049ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 6314281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6324281bd42Sshane } 6334281bd42Sshane %endif 634273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6354281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 6364281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6374281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6384281bd42Sshane } 6394281bd42Sshane %endif 640348784efSdrh 641348784efSdrh %type where_opt {Expr*} 642633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 643348784efSdrh 644348784efSdrh where_opt(A) ::= . {A = 0;} 645b7916a78Sdrh where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 646348784efSdrh 647382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 648382c0247Sdrh // 649273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6504281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L). { 651b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 652b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 65349ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 6544281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6554281bd42Sshane } 6564281bd42Sshane %endif 657273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6584281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W). { 6594281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6604281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 6614281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6624281bd42Sshane } 6634281bd42Sshane %endif 664348784efSdrh 665f8db1bc0Sdrh %type setlist {ExprList*} 666633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 667f8db1bc0Sdrh 668b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). { 669b7916a78Sdrh A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); 670b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 671b7916a78Sdrh } 672b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 673b7916a78Sdrh A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 674b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 675b7916a78Sdrh } 676348784efSdrh 677382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 678382c0247Sdrh // 67974ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 680113088ecSdrh VALUES LP itemlist(Y) RP. 68174ad7fe9Sdrh {sqlite3Insert(pParse, X, Y, 0, F, R);} 68274ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 68374ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 684147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 685147d0cccSdrh {sqlite3Insert(pParse, X, 0, 0, F, R);} 686348784efSdrh 687fa86c412Sdrh %type insert_cmd {int} 688fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 689fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 690fa86c412Sdrh 691348784efSdrh 692348784efSdrh %type itemlist {ExprList*} 693633e6d57Sdrh %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);} 694348784efSdrh 69517435752Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y). 696b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 69717435752Sdrh itemlist(A) ::= expr(X). 698b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,X.pExpr);} 699348784efSdrh 700967e8b73Sdrh %type inscollist_opt {IdList*} 701633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 702967e8b73Sdrh %type inscollist {IdList*} 703633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);} 704348784efSdrh 705967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 706967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 70717435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y). 70817435752Sdrh {A = sqlite3IdListAppend(pParse->db,X,&Y);} 70917435752Sdrh inscollist(A) ::= nm(Y). 71017435752Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y);} 711348784efSdrh 712382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 713382c0247Sdrh // 714348784efSdrh 715b7916a78Sdrh %type expr {ExprSpan} 716b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 717b7916a78Sdrh %type term {ExprSpan} 718b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 719b7916a78Sdrh 720b7916a78Sdrh %include { 721b7916a78Sdrh /* This is a utility routine used to set the ExprSpan.zStart and 722b7916a78Sdrh ** ExprSpan.zEnd values of pOut so that the span covers the complete 723b7916a78Sdrh ** range of text beginning with pStart and going to the end of pEnd. 724b7916a78Sdrh */ 725b7916a78Sdrh static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ 726b7916a78Sdrh pOut->zStart = pStart->z; 727b7916a78Sdrh pOut->zEnd = &pEnd->z[pEnd->n]; 728b7916a78Sdrh } 729b7916a78Sdrh 730b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 731b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 732b7916a78Sdrh ** that created the expression. 733b7916a78Sdrh */ 734b7916a78Sdrh static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){ 735b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue); 736b7916a78Sdrh pOut->zStart = pValue->z; 737b7916a78Sdrh pOut->zEnd = &pValue->z[pValue->n]; 738b7916a78Sdrh } 739b7916a78Sdrh } 740348784efSdrh 7417977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 742b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);} 743b7916a78Sdrh term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);} 744b7916a78Sdrh expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);} 745b7916a78Sdrh expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);} 7465ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 74717435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 74817435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 749b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); 750b7916a78Sdrh spanSet(&A,&X,&Y); 751e1b6a5b8Sdrh } 752d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 75317435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 75417435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 75517435752Sdrh Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 75617435752Sdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 757b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 758b7916a78Sdrh spanSet(&A,&X,&Z); 759d24cc427Sdrh } 760b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);} 761b7916a78Sdrh term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);} 762b7916a78Sdrh expr(A) ::= REGISTER(X). { 763b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 764b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 765b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 766b7916a78Sdrh if( pParse->nested==0 ){ 767b7916a78Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); 768b7916a78Sdrh A.pExpr = 0; 769b7916a78Sdrh }else{ 770b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); 771b7916a78Sdrh if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable); 772b7916a78Sdrh } 773b7916a78Sdrh spanSet(&A, &X, &X); 774b7916a78Sdrh } 7757c972decSdrh expr(A) ::= VARIABLE(X). { 776b7916a78Sdrh spanExpr(&A, pParse, TK_VARIABLE, &X); 777b7916a78Sdrh sqlite3ExprAssignVarNumber(pParse, A.pExpr); 778b7916a78Sdrh spanSet(&A, &X, &X); 779895d7472Sdrh } 78039002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). { 781b7916a78Sdrh A.pExpr = sqlite3ExprSetColl(pParse, E.pExpr, &C); 782b7916a78Sdrh A.zStart = E.zStart; 783b7916a78Sdrh A.zEnd = &C.z[C.n]; 7848b4c40d8Sdrh } 785487e262fSdrh %ifndef SQLITE_OMIT_CAST 786487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 787b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); 788b7916a78Sdrh spanSet(&A,&X,&Y); 789487e262fSdrh } 790154d4b24Sdrh %endif SQLITE_OMIT_CAST 791fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 792c9cf901dSdanielk1977 if( Y && Y->nExpr>SQLITE_MAX_FUNCTION_ARG ){ 793e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 7944e05c83bSdrh } 795b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 796b7916a78Sdrh spanSet(&A,&X,&E); 797b7916a78Sdrh if( D && A.pExpr ){ 798b7916a78Sdrh A.pExpr->flags |= EP_Distinct; 799fd357974Sdrh } 800e1b6a5b8Sdrh } 801e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 802b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 803b7916a78Sdrh spanSet(&A,&X,&E); 804e1b6a5b8Sdrh } 805b71090fdSdrh term(A) ::= CTIME_KW(OP). { 806b71090fdSdrh /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 807b71090fdSdrh ** treated as functions that return constants */ 808b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0,&OP); 809b7916a78Sdrh if( A.pExpr ){ 810b7916a78Sdrh A.pExpr->op = TK_CONST_FUNC; 811b7916a78Sdrh } 812b7916a78Sdrh spanSet(&A, &OP, &OP); 813b7916a78Sdrh } 814b7916a78Sdrh 815b7916a78Sdrh %include { 816b7916a78Sdrh /* This routine constructs a binary expression node out of two ExprSpan 817b7916a78Sdrh ** objects and uses the result to populate a new ExprSpan object. 818b7916a78Sdrh */ 819b7916a78Sdrh static void spanBinaryExpr( 820b7916a78Sdrh ExprSpan *pOut, /* Write the result here */ 821b7916a78Sdrh Parse *pParse, /* The parsing context. Errors accumulate here */ 822b7916a78Sdrh int op, /* The binary operation */ 823b7916a78Sdrh ExprSpan *pLeft, /* The left operand */ 824b7916a78Sdrh ExprSpan *pRight /* The right operand */ 825b7916a78Sdrh ){ 826b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); 827b7916a78Sdrh pOut->zStart = pLeft->zStart; 828b7916a78Sdrh pOut->zEnd = pRight->zEnd; 829417ec638Sdrh } 830b71090fdSdrh } 831b7916a78Sdrh 832b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 833b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 83417435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). 835b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 836b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 837fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 838b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 839b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). 840b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 84117435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 842b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 843b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 84474ad7fe9Sdrh %type likeop {struct LikeOp} 845b52076cdSdrh likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} 846b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} 84703bea70cSdrh likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;} 84803bea70cSdrh likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;} 849b7916a78Sdrh %type escape {ExprSpan} 850b7916a78Sdrh %destructor escape {sqlite3ExprDelete(pParse->db, $$.pExpr);} 8517c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;} 852b7916a78Sdrh escape(X) ::= . [ESCAPE] {memset(&X,0,sizeof(X));} 853b71090fdSdrh expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { 8548aa34ae0Sdrh ExprList *pList; 855b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 856b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 857b7916a78Sdrh if( E.pExpr ){ 858b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 8597c6303c0Sdanielk1977 } 860b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 861b7916a78Sdrh if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 862b7916a78Sdrh A.zStart = X.zStart; 863b7916a78Sdrh A.zEnd = Y.zEnd; 864b7916a78Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 8650ac65892Sdrh } 8667c6303c0Sdanielk1977 867b7916a78Sdrh %include { 868b7916a78Sdrh /* Construct an expression node for a unary postfix operator 869b7916a78Sdrh */ 870b7916a78Sdrh static void spanUnaryPostfix( 871b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 872b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 873b7916a78Sdrh int op, /* The operator */ 874b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 875b7916a78Sdrh Token *pPostOp /* The operand token for setting the span */ 876b7916a78Sdrh ){ 877b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 878b7916a78Sdrh pOut->zStart = pOperand->zStart; 879b7916a78Sdrh pOut->zEnd = &pPostOp->z[pPostOp->n]; 880e1b6a5b8Sdrh } 88133048c0bSdrh } 882b7916a78Sdrh 883b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} 884b7916a78Sdrh expr(A) ::= expr(X) IS NULL(E). {spanUnaryPostfix(&A,pParse,TK_ISNULL,&X,&E);} 885b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 886b7916a78Sdrh expr(A) ::= expr(X) IS NOT NULL(E). 887b7916a78Sdrh {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 888b7916a78Sdrh 889b7916a78Sdrh %include { 890b7916a78Sdrh /* Construct an expression node for a unary prefix operator 891b7916a78Sdrh */ 892b7916a78Sdrh static void spanUnaryPrefix( 893b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 894b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 895b7916a78Sdrh int op, /* The operator */ 896b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 897b7916a78Sdrh Token *pPreOp /* The operand token for setting the span */ 898b7916a78Sdrh ){ 899b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 900b7916a78Sdrh pOut->zStart = pPreOp->z; 901b7916a78Sdrh pOut->zEnd = pOperand->zEnd; 90233048c0bSdrh } 90381a20f21Sdrh } 904b7916a78Sdrh 905b7916a78Sdrh 906b7916a78Sdrh 907b7916a78Sdrh expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 908b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 909b7916a78Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] 910b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);} 911b7916a78Sdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] 912b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);} 913b7916a78Sdrh 9142e3a1f16Sdrh %type between_op {int} 9152e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 9162e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 9172e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 918b7916a78Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); 919b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); 920b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); 921b7916a78Sdrh if( A.pExpr ){ 922b7916a78Sdrh A.pExpr->x.pList = pList; 92353f733c7Sdrh }else{ 924633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 92553f733c7Sdrh } 926b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 927b7916a78Sdrh A.zStart = W.zStart; 928b7916a78Sdrh A.zEnd = Y.zEnd; 929fef5208cSdrh } 9303e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 9312e3a1f16Sdrh %type in_op {int} 9322e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 9332e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 9342e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 935b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 936b7916a78Sdrh if( A.pExpr ){ 937b7916a78Sdrh A.pExpr->x.pList = Y; 938b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 939d5d56523Sdanielk1977 }else{ 940633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 941d5d56523Sdanielk1977 } 942b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 943b7916a78Sdrh A.zStart = X.zStart; 944b7916a78Sdrh A.zEnd = &E.z[E.n]; 945fef5208cSdrh } 94651522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 947b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); 948b7916a78Sdrh if( A.pExpr ){ 949b7916a78Sdrh A.pExpr->x.pSelect = X; 950b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 951b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 95253f733c7Sdrh }else{ 953633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 95453f733c7Sdrh } 955b7916a78Sdrh A.zStart = B.z; 956b7916a78Sdrh A.zEnd = &E.z[E.n]; 95751522cd3Sdrh } 9582e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 959b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 960b7916a78Sdrh if( A.pExpr ){ 961b7916a78Sdrh A.pExpr->x.pSelect = Y; 962b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 963b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 96453f733c7Sdrh }else{ 965633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 96653f733c7Sdrh } 967b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 968b7916a78Sdrh A.zStart = X.zStart; 969b7916a78Sdrh A.zEnd = &E.z[E.n]; 970fef5208cSdrh } 97174ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 97217435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 973b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 974b7916a78Sdrh if( A.pExpr ){ 975b7916a78Sdrh A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 976b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 977b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 97853f733c7Sdrh }else{ 979633e6d57Sdrh sqlite3SrcListDelete(pParse->db, pSrc); 98053f733c7Sdrh } 981b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 982b7916a78Sdrh A.zStart = X.zStart; 983b7916a78Sdrh A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; 98423b2db23Sdrh } 98551522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 986b7916a78Sdrh Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); 98751522cd3Sdrh if( p ){ 9886ab3a2ecSdanielk1977 p->x.pSelect = Y; 989b7916a78Sdrh ExprSetProperty(p, EP_xIsSelect); 990b7916a78Sdrh sqlite3ExprSetHeight(pParse, p); 99153f733c7Sdrh }else{ 992633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 99351522cd3Sdrh } 994b7916a78Sdrh A.zStart = B.z; 995b7916a78Sdrh A.zEnd = &E.z[E.n]; 99651522cd3Sdrh } 997154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 998fef5208cSdrh 99917a7f8ddSdrh /* CASE expressions */ 100017a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 1001b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); 1002b7916a78Sdrh if( A.pExpr ){ 1003b7916a78Sdrh A.pExpr->x.pList = Y; 1004b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 100553f733c7Sdrh }else{ 1006633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 100753f733c7Sdrh } 1008b7916a78Sdrh A.zStart = C.z; 1009b7916a78Sdrh A.zEnd = &E.z[E.n]; 101017a7f8ddSdrh } 101117a7f8ddSdrh %type case_exprlist {ExprList*} 1012633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 101317a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 1014b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, Y.pExpr); 1015b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 101617a7f8ddSdrh } 101717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 1018b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, Y.pExpr); 1019b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 102017a7f8ddSdrh } 102117a7f8ddSdrh %type case_else {Expr*} 1022633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 1023b7916a78Sdrh case_else(A) ::= ELSE expr(X). {A = X.pExpr;} 102417a7f8ddSdrh case_else(A) ::= . {A = 0;} 102517a7f8ddSdrh %type case_operand {Expr*} 1026633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 1027b7916a78Sdrh case_operand(A) ::= expr(X). {A = X.pExpr;} 102817a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1029348784efSdrh 1030348784efSdrh %type exprlist {ExprList*} 1031633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 10329245c243Sdrh %type nexprlist {ExprList*} 1033633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1034348784efSdrh 10359245c243Sdrh exprlist(A) ::= nexprlist(X). {A = X;} 10369245c243Sdrh exprlist(A) ::= . {A = 0;} 103717435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 1038b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 103917435752Sdrh nexprlist(A) ::= expr(Y). 1040b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} 10419245c243Sdrh 1042cce7d176Sdrh 1043382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1044382c0247Sdrh // 1045d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 104677e96d14Sdrh ON nm(Y) LP idxlist(Z) RP(E). { 104717435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 104817435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 10494d91a701Sdrh &S, &E, SQLITE_SO_ASC, NE); 10509cfcf5d4Sdrh } 1051717e6402Sdrh 1052717e6402Sdrh %type uniqueflag {int} 10539cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 10549cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1055348784efSdrh 10560202b29eSdanielk1977 %type idxlist {ExprList*} 1057633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 10580202b29eSdanielk1977 %type idxlist_opt {ExprList*} 1059633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1060348784efSdrh 1061c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 1062c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 1063200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 10640202b29eSdanielk1977 Expr *p = 0; 10650202b29eSdanielk1977 if( C.n>0 ){ 1066b7916a78Sdrh p = sqlite3Expr(pParse->db, TK_COLUMN, 0); 106739002505Sdanielk1977 sqlite3ExprSetColl(pParse, p, &C); 10680202b29eSdanielk1977 } 1069b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, p); 1070b7916a78Sdrh sqlite3ExprListSetName(pParse,A,&Y,1); 1071b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1072b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 10730202b29eSdanielk1977 } 1074200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 10750202b29eSdanielk1977 Expr *p = 0; 10760202b29eSdanielk1977 if( C.n>0 ){ 107717435752Sdrh p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); 107839002505Sdanielk1977 sqlite3ExprSetColl(pParse, p, &C); 10790202b29eSdanielk1977 } 1080b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, p); 1081b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &Y, 1); 1082b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1083b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 10840202b29eSdanielk1977 } 10850202b29eSdanielk1977 1086a34001c9Sdrh %type collate {Token} 1087a34001c9Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 108839002505Sdanielk1977 collate(C) ::= COLLATE ids(X). {C = X;} 1089a34001c9Sdrh 1090348784efSdrh 10918aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1092382c0247Sdrh // 10934d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1094982cef7eSdrh 1095382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1096382c0247Sdrh // 1097154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1098fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 109974161705Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse);} 110074161705Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} 1101fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1102154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1103f57b14a6Sdrh 1104382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1105382c0247Sdrh // 110604e86f4dSshane %ifndef SQLITE_OMIT_PARSER 110713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 110891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1109ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1110ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1111ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1112ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1113ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1114ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1115ada2ee0dSdrh 1116a3eb4b44Sdrh nmnum(A) ::= plus_num(X). {A = X;} 1117a3eb4b44Sdrh nmnum(A) ::= nm(X). {A = X;} 1118ada2ee0dSdrh nmnum(A) ::= ON(X). {A = X;} 1119ada2ee0dSdrh nmnum(A) ::= DELETE(X). {A = X;} 11206da861beSdrh nmnum(A) ::= DEFAULT(X). {A = X;} 1121154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 112204e86f4dSshane %endif SQLITE_OMIT_PARSER 1123f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 1124f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1125fd405314Sdrh number(A) ::= INTEGER|FLOAT(X). {A = X;} 1126f57b14a6Sdrh plus_opt ::= PLUS. 1127f57b14a6Sdrh plus_opt ::= . 1128c3f9bad2Sdanielk1977 1129c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1130f0f258b1Sdrh 1131b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1132b7f9164eSdrh 1133d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 11344b59ab5eSdrh Token all; 11354b59ab5eSdrh all.z = A.z; 1136b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 11374adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1138f0f258b1Sdrh } 1139f0f258b1Sdrh 1140fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1141fdd48a76Sdrh trigger_time(C) trigger_event(D) 114260218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 114360218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 11443df6b257Sdanielk1977 A = (Z.n==0?B:Z); 1145c3f9bad2Sdanielk1977 } 1146c3f9bad2Sdanielk1977 1147c3f9bad2Sdanielk1977 %type trigger_time {int} 1148c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1149c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1150c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1151c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1152c3f9bad2Sdanielk1977 1153ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1154633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1155fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 115674ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 1157c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 1158c3f9bad2Sdanielk1977 115960218d2aSdrh foreach_clause ::= . 116060218d2aSdrh foreach_clause ::= FOR EACH ROW. 1161c3f9bad2Sdanielk1977 1162c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1163633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1164c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1165b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1166c3f9bad2Sdanielk1977 1167c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1168633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 1169187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { 117081238966Sdrh assert( Y!=0 ); 117181238966Sdrh Y->pLast->pNext = X; 1172187e4c6aSdrh Y->pLast = X; 1173187e4c6aSdrh A = Y; 1174a69d9168Sdrh } 117581238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { 117681238966Sdrh assert( X!=0 ); 117781238966Sdrh X->pLast = X; 117881238966Sdrh A = X; 117981238966Sdrh } 1180c3f9bad2Sdanielk1977 1181c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1182633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1183c3f9bad2Sdanielk1977 // UPDATE 11845ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 118517435752Sdrh { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1186c3f9bad2Sdanielk1977 1187c3f9bad2Sdanielk1977 // INSERT 11883054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 1189c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 119017435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);} 1191c3f9bad2Sdanielk1977 11923054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 119317435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} 1194c3f9bad2Sdanielk1977 1195c3f9bad2Sdanielk1977 // DELETE 11965ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 119717435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1198c3f9bad2Sdanielk1977 1199c3f9bad2Sdanielk1977 // SELECT 120017435752Sdrh trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1201c3f9bad2Sdanielk1977 12026f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 12034b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1204b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); 1205b7916a78Sdrh if( A.pExpr ){ 1206b7916a78Sdrh A.pExpr->affinity = OE_Ignore; 12074b59ab5eSdrh } 1208b7916a78Sdrh A.zStart = X.z; 1209b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 12108aa34ae0Sdrh } 121174ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 1212b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); 1213b7916a78Sdrh if( A.pExpr ) { 1214b7916a78Sdrh A.pExpr->affinity = (char)T; 12154b59ab5eSdrh } 1216b7916a78Sdrh A.zStart = X.z; 1217b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 12188aa34ae0Sdrh } 1219154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1220b7f9164eSdrh 122174ad7fe9Sdrh %type raisetype {int} 122274ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 122374ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 122474ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 122574ad7fe9Sdrh 12266f34903eSdanielk1977 1227c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1228b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1229fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1230fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1231c3f9bad2Sdanielk1977 } 1232154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1233113088ecSdrh 1234113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1235fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1236f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1237b7916a78Sdrh sqlite3Attach(pParse, F.pExpr, D.pExpr, K); 12381c2d8414Sdrh } 1239fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1240b7916a78Sdrh sqlite3Detach(pParse, D.pExpr); 1241fdbcdee5Sdrh } 1242fdbcdee5Sdrh 1243f744bb56Sdanielk1977 %type key_opt {Expr*} 1244633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1245f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1246b7916a78Sdrh key_opt(A) ::= KEY expr(X). { A = X.pExpr; } 1247113088ecSdrh 1248113088ecSdrh database_kw_opt ::= DATABASE. 1249113088ecSdrh database_kw_opt ::= . 1250fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 12514343fea2Sdrh 12524343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 12534343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 12544343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 12554343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1256154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 12579fd2a9a0Sdanielk1977 12589f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 12599f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 12609f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 12619f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 12629f18e8a0Sdrh %endif 12639f18e8a0Sdrh 12649fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 12659fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 12669fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 12679fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 12689fd2a9a0Sdanielk1977 } 126919a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 127019a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 127119a8e7e8Sdanielk1977 } 127219a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 1273d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 127419a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 127519a8e7e8Sdanielk1977 } 127619a8e7e8Sdanielk1977 kwcolumn_opt ::= . 127719a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1278154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1279e09daa90Sdrh 1280e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1281e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1282b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1283b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1284d9da78a2Sdrh create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { 1285b9bb7c18Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z); 1286b9bb7c18Sdrh } 1287e09daa90Sdrh vtabarglist ::= vtabarg. 1288e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1289b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1290b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1291b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1292b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1293b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1294b9bb7c18Sdrh anylist ::= . 1295aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1296aaac8b4eSdrh anylist ::= anylist ANY. 1297154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 1298