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*aaac8b4eSdrh ** @(#) $Id: parse.y,v 1.276 2009/05/11 18:22:31 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 /* 57ad3cab52Sdrh ** An instance of this structure holds information about the 58ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 599bbca4c1Sdrh */ 60ad3cab52Sdrh struct LimitVal { 61a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 62a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 63ad3cab52Sdrh }; 64c3f9bad2Sdanielk1977 65c3f9bad2Sdanielk1977 /* 662e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 672e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 682e3a1f16Sdrh */ 692e3a1f16Sdrh struct LikeOp { 70b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 712e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 722e3a1f16Sdrh }; 732e3a1f16Sdrh 742e3a1f16Sdrh /* 75ad3cab52Sdrh ** An instance of the following structure describes the event of a 76ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 77ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 78ad3cab52Sdrh ** 79ad3cab52Sdrh ** UPDATE ON (a,b,c) 80ad3cab52Sdrh ** 81ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 82c3f9bad2Sdanielk1977 */ 83ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 84caec2f12Sdrh 8525d6543dSdrh /* 8625d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 8725d6543dSdrh */ 8825d6543dSdrh struct AttachKey { int type; Token key; }; 8925d6543dSdrh 90caec2f12Sdrh } // end %include 91348784efSdrh 92826fb5a3Sdrh // Input is a single SQL command 93c4a3c779Sdrh input ::= cmdlist. 94094b2bbfSdrh cmdlist ::= cmdlist ecmd. 95826fb5a3Sdrh cmdlist ::= ecmd. 96b7f9164eSdrh ecmd ::= SEMI. 97b7f9164eSdrh ecmd ::= explain cmdx SEMI. 984adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 99b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 100b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 101ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } 102154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 103200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 104348784efSdrh 105382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 106c4a3c779Sdrh // 107fa86c412Sdrh 108684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 109c4a3c779Sdrh trans_opt ::= . 110c4a3c779Sdrh trans_opt ::= TRANSACTION. 1115ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 112684917c2Sdrh %type transtype {int} 113684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 114684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 115684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 116684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1174adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1184adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1194adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 120c4a3c779Sdrh 121fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 122fd7f0452Sdanielk1977 savepoint_opt ::= . 123fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 124fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 125fd7f0452Sdanielk1977 } 126fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 127fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 128fd7f0452Sdanielk1977 } 129fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 130fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 131fd7f0452Sdanielk1977 } 132fd7f0452Sdanielk1977 133382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 134348784efSdrh // 135348784efSdrh cmd ::= create_table create_table_args. 136d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 137f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 138969fa7c1Sdrh } 139d9da78a2Sdrh createkw(A) ::= CREATE(X). { 140d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 141d9da78a2Sdrh A = X; 142d9da78a2Sdrh } 143faa59554Sdrh %type ifnotexists {int} 144faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 145faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 146f57b3399Sdrh %type temp {int} 14753c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 148d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 149154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 150d24cc427Sdrh temp(A) ::= . {A = 0;} 15119a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { 15219a8e7e8Sdanielk1977 sqlite3EndTable(pParse,&X,&Y,0); 153969fa7c1Sdrh } 154969fa7c1Sdrh create_table_args ::= AS select(S). { 15519a8e7e8Sdanielk1977 sqlite3EndTable(pParse,0,0,S); 156633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 157969fa7c1Sdrh } 158348784efSdrh columnlist ::= columnlist COMMA column. 159348784efSdrh columnlist ::= column. 160348784efSdrh 161487e262fSdrh // A "column" is a complete description of a single column in a 162487e262fSdrh // CREATE TABLE statement. This includes the column name, its 163487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 164487e262fSdrh // NOT NULL and so forth. 165348784efSdrh // 16619a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 16719a8e7e8Sdanielk1977 A.z = X.z; 168b27b7f5dSdrh A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 16924fb627aSdrh A.quoted = 0; 17024fb627aSdrh A.dyn = 0; 17119a8e7e8Sdanielk1977 } 17219a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 17319a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 17419a8e7e8Sdanielk1977 A = X; 17519a8e7e8Sdanielk1977 } 17619a8e7e8Sdanielk1977 177c4a3c779Sdrh 178c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 179c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 180c4a3c779Sdrh // 181982cef7eSdrh %type id {Token} 182f18543caSdrh id(A) ::= ID(X). {A = X;} 183296a483cSdrh id(A) ::= INDEXED(X). {A = X;} 1840bd1f4eaSdrh 18534e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 18634e33bb8Sdrh // fallback to ID if they will not parse as their original value. 18734e33bb8Sdrh // This obviates the need for the "id" nonterminal. 18834e33bb8Sdrh // 1890bd1f4eaSdrh %fallback ID 190db15bcd5Sdrh ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW CONFLICT 191684917c2Sdrh DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 192ca5557f9Sdrh IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN 193db15bcd5Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK 19478c2e6d8Sdanielk1977 SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL 195b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 196b7f9164eSdrh EXCEPT INTERSECT UNION 197154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 198a073384fSdrh REINDEX RENAME CTIME_KW IF 199b7f9164eSdrh . 200e09daa90Sdrh %wildcard ANY. 201c4a3c779Sdrh 2022d3917daSdrh // Define operator precedence early so that this is the first occurance 2032d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2042d3917daSdrh // causes them to be assigned integer values that are close together, 2052d3917daSdrh // which keeps parser tables smaller. 2062d3917daSdrh // 207f2bc013cSdrh // The token values assigned to these symbols is determined by the order 208f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 209f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 210f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 211f2bc013cSdrh // constraint. 212f2bc013cSdrh // 2132d3917daSdrh %left OR. 2142d3917daSdrh %left AND. 2152d3917daSdrh %right NOT. 21603bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2179a43267bSdrh %left GT LE LT GE. 2187c6303c0Sdanielk1977 %right ESCAPE. 2192d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2202d3917daSdrh %left PLUS MINUS. 2212d3917daSdrh %left STAR SLASH REM. 222a34001c9Sdrh %left CONCAT. 223a34001c9Sdrh %left COLLATE. 2242d3917daSdrh %right UMINUS UPLUS BITNOT. 2252d3917daSdrh 226c4a3c779Sdrh // And "ids" is an identifer-or-string. 227c4a3c779Sdrh // 228c4a3c779Sdrh %type ids {Token} 229fd405314Sdrh ids(A) ::= ID|STRING(X). {A = X;} 230c4a3c779Sdrh 2315ad1a6c8Sdrh // The name of a column or table can be any of the following: 2325ad1a6c8Sdrh // 2335ad1a6c8Sdrh %type nm {Token} 234296a483cSdrh nm(A) ::= id(X). {A = X;} 2355ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2365ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2375ad1a6c8Sdrh 238487e262fSdrh // A typetoken is really one or more tokens that form a type name such 239487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 240487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 241487e262fSdrh // 242487e262fSdrh %type typetoken {Token} 243382c0247Sdrh type ::= . 244487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 245487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 246487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 247487e262fSdrh A.z = X.z; 248b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 249487e262fSdrh } 250487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 251487e262fSdrh A.z = X.z; 252b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 253487e262fSdrh } 254382c0247Sdrh %type typename {Token} 255382c0247Sdrh typename(A) ::= ids(X). {A = X;} 256b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 25760218d2aSdrh signed ::= plus_num. 25860218d2aSdrh signed ::= minus_num. 259487e262fSdrh 260487e262fSdrh // "carglist" is a list of additional constraints that come after the 261487e262fSdrh // column name and column type in a CREATE TABLE statement. 262487e262fSdrh // 263348784efSdrh carglist ::= carglist carg. 264348784efSdrh carglist ::= . 2655ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 266348784efSdrh carg ::= ccons. 2672b7acc35Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,X);} 2682b7acc35Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,X);} 2692b7acc35Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,X);} 270f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 27117435752Sdrh Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0); 272f96a3778Sdanielk1977 sqlite3ExprSpan(p,&A,&X->span); 2737977a17fSdanielk1977 sqlite3AddDefaultValue(pParse,p); 2747977a17fSdanielk1977 } 2752b7acc35Sdrh ccons ::= DEFAULT id(X). { 27617435752Sdrh Expr *p = sqlite3PExpr(pParse, TK_STRING, 0, 0, &X); 2777977a17fSdanielk1977 sqlite3AddDefaultValue(pParse,p); 2787977a17fSdanielk1977 } 279348784efSdrh 280382c0247Sdrh // In addition to the type name, we also care about the primary key and 281382c0247Sdrh // UNIQUE constraints. 282348784efSdrh // 2830d316a40Sdrh ccons ::= NULL onconf. 2844adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 285fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 286fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 2874d91a701Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 288ffe07b2dSdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X);} 289c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 2904adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 2914adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 29239002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 29304738cb9Sdrh 294205f48e6Sdrh // The optional AUTOINCREMENT keyword 295205f48e6Sdrh %type autoinc {int} 296205f48e6Sdrh autoinc(X) ::= . {X = 0;} 2972958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 298205f48e6Sdrh 299c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 300c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 301c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 302c2eef3b3Sdrh // check fails. 30304738cb9Sdrh // 304c2eef3b3Sdrh %type refargs {int} 305c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 30650af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; } 307c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 308c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 309c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 310c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 311c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 312c2eef3b3Sdrh %type refact {int} 313c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 314c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 315c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 316c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 317c2eef3b3Sdrh %type defer_subclause {int} 318c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 319c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 320c2eef3b3Sdrh %type init_deferred_pred_opt {int} 321c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 322c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 323c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 324348784efSdrh 325348784efSdrh // For the time being, the only constraint we care about is the primary 326382c0247Sdrh // key and UNIQUE. Both create indices. 327348784efSdrh // 32819a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 32919a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 330348784efSdrh conslist ::= conslist COMMA tcons. 331a2e1bb5aSdrh conslist ::= conslist tcons. 332348784efSdrh conslist ::= tcons. 3335ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 334f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 335fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3369cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3374d91a701Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 338e72e728bSdrh tcons ::= CHECK LP expr(E) RP onconf. {sqlite3AddCheckConstraint(pParse,E);} 339c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 340c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3414adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3424adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 343c2eef3b3Sdrh } 344c2eef3b3Sdrh %type defer_subclause_opt {int} 345c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 346c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3479cfcf5d4Sdrh 3489cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3499cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3509cfcf5d4Sdrh // 3519cfcf5d4Sdrh %type onconf {int} 3521c92853dSdrh %type orconf {int} 3531c92853dSdrh %type resolvetype {int} 3541c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3551c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3561c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3571c92853dSdrh orconf(A) ::= OR resolvetype(X). {A = X;} 35874ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3591c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3601c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 361348784efSdrh 362382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 363348784efSdrh // 364a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 365a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 366a8858103Sdanielk1977 } 367a073384fSdrh %type ifexists {int} 368a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 369a073384fSdrh ifexists(A) ::= . {A = 0;} 370348784efSdrh 371a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 372a76b5dfcSdrh // 373b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 374d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { 375fdd48a76Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 376a76b5dfcSdrh } 377a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 378a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 379a76b5dfcSdrh } 380154d4b24Sdrh %endif SQLITE_OMIT_VIEW 381a76b5dfcSdrh 382382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 383348784efSdrh // 3849bb61fe7Sdrh cmd ::= select(X). { 3857d10d5a6Sdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0}; 3867d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 387633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 3889bb61fe7Sdrh } 389efb7251dSdrh 3909bb61fe7Sdrh %type select {Select*} 391633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 39282c3d636Sdrh %type oneselect {Select*} 393633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 3949bb61fe7Sdrh 39582c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 396b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 3970a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 398daffd0e5Sdrh if( Z ){ 399b27b7f5dSdrh Z->op = (u8)Y; 40082c3d636Sdrh Z->pPrior = X; 40143b78826Sdrh }else{ 402633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 403daffd0e5Sdrh } 40482c3d636Sdrh A = Z; 40582c3d636Sdrh } 4060a36c57eSdrh %type multiselect_op {int} 40774ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 4080a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 409fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 410154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 41182c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 4129bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 41317435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 4149bb61fe7Sdrh } 4159bb61fe7Sdrh 4169bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 4179bb61fe7Sdrh // present and false (0) if it is not. 4189bb61fe7Sdrh // 419efb7251dSdrh %type distinct {int} 420efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 421fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 422efb7251dSdrh distinct(A) ::= . {A = 0;} 423348784efSdrh 4249bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 4257c917d19Sdrh // values of the SELECT statement. The "*" in statements like 4267c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 4277c917d19Sdrh // opcode of TK_ALL. 4289bb61fe7Sdrh // 429348784efSdrh %type selcollist {ExprList*} 430633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 431348784efSdrh %type sclp {ExprList*} 432633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 433348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 434348784efSdrh sclp(A) ::= . {A = 0;} 43501f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 43617435752Sdrh A = sqlite3ExprListAppend(pParse,P,X,Y.n?&Y:0); 43701f3f253Sdrh } 4387c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 4391e536953Sdanielk1977 Expr *p = sqlite3PExpr(pParse, TK_ALL, 0, 0, 0); 44017435752Sdrh A = sqlite3ExprListAppend(pParse, P, p, 0); 4417c917d19Sdrh } 442e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { 443e54a62adSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); 44417435752Sdrh Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 44517435752Sdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 44617435752Sdrh A = sqlite3ExprListAppend(pParse,P, pDot, 0); 44754473229Sdrh } 44801f3f253Sdrh 44901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 45001f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 45101f3f253Sdrh // 45201f3f253Sdrh %type as {Token} 4535ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 4545ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 45501f3f253Sdrh as(X) ::= . {X.n = 0;} 4569bb61fe7Sdrh 457348784efSdrh 458ad3cab52Sdrh %type seltablist {SrcList*} 459633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 460ad3cab52Sdrh %type stl_prefix {SrcList*} 461633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 462ad3cab52Sdrh %type from {SrcList*} 463633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 464348784efSdrh 46501f3f253Sdrh // A complete FROM clause. 46601f3f253Sdrh // 46717435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 46861dfc31dSdrh from(A) ::= FROM seltablist(X). { 46961dfc31dSdrh A = X; 47061dfc31dSdrh sqlite3SrcListShiftJoinType(A); 47161dfc31dSdrh } 47201f3f253Sdrh 47301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 47401f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 47501f3f253Sdrh // 47601f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 47701f3f253Sdrh A = X; 478b27b7f5dSdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = (u8)Y; 47901f3f253Sdrh } 480348784efSdrh stl_prefix(A) ::= . {A = 0;} 48185574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). { 482b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 483b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 48401f3f253Sdrh } 48551522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 486fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP 487b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 488b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 48922f70c32Sdrh } 490fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 491fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 492fbdc7f69Sdrh if( X==0 && Z.n==0 && N==0 && U==0 ){ 493fbdc7f69Sdrh A = F; 494fbdc7f69Sdrh }else{ 495fbdc7f69Sdrh Select *pSubquery; 496fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 497fbdc7f69Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 498fbdc7f69Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 499fbdc7f69Sdrh } 500fbdc7f69Sdrh } 501348784efSdrh 502b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 503b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 504b733d037Sdrh // a grouping of table and subqueries. 505b733d037Sdrh // 506fbdc7f69Sdrh // %type seltablist_paren {Select*} 507fbdc7f69Sdrh // %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);} 508fbdc7f69Sdrh // seltablist_paren(A) ::= select(S). {A = S;} 509fbdc7f69Sdrh // seltablist_paren(A) ::= seltablist(F). { 510fbdc7f69Sdrh // sqlite3SrcListShiftJoinType(F); 511fbdc7f69Sdrh // A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 512fbdc7f69Sdrh // } 513154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 514b733d037Sdrh 515113088ecSdrh %type dbnm {Token} 516113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 517113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 518113088ecSdrh 51974ad7fe9Sdrh %type fullname {SrcList*} 520633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 52117435752Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 52274ad7fe9Sdrh 52301f3f253Sdrh %type joinop {int} 52401f3f253Sdrh %type joinop2 {int} 525fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 5264adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 5274adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 5285ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 5294adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 53001f3f253Sdrh 53101f3f253Sdrh %type on_opt {Expr*} 532633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 53301f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 53401f3f253Sdrh on_opt(N) ::= . {N = 0;} 53501f3f253Sdrh 53685574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 53785574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 53885574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 53985574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 54085574e31Sdanielk1977 // in the token. 54185574e31Sdanielk1977 // 54285574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 543b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 54485574e31Sdanielk1977 // recognizes and interprets this as a special case. 54585574e31Sdanielk1977 // 54685574e31Sdanielk1977 %type indexed_opt {Token} 54785574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 54885574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 54985574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 55085574e31Sdanielk1977 55101f3f253Sdrh %type using_opt {IdList*} 552633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 5530202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 55401f3f253Sdrh using_opt(U) ::= . {U = 0;} 55501f3f253Sdrh 55601f3f253Sdrh 557348784efSdrh %type orderby_opt {ExprList*} 558633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 559348784efSdrh %type sortlist {ExprList*} 560633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 561348784efSdrh %type sortitem {Expr*} 562633e6d57Sdrh %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);} 563348784efSdrh 564348784efSdrh orderby_opt(A) ::= . {A = 0;} 565348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 5668b4c40d8Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { 56717435752Sdrh A = sqlite3ExprListAppend(pParse,X,Y,0); 568b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 569348784efSdrh } 5708b4c40d8Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). { 57117435752Sdrh A = sqlite3ExprListAppend(pParse,0,Y,0); 572b27b7f5dSdrh if( A && A->a ) A->a[0].sortOrder = (u8)Z; 573348784efSdrh } 574da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 575348784efSdrh 576348784efSdrh %type sortorder {int} 577348784efSdrh 5788e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 5798e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 5808e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 581348784efSdrh 5822282792aSdrh %type groupby_opt {ExprList*} 583633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 5842282792aSdrh groupby_opt(A) ::= . {A = 0;} 5859245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 5862282792aSdrh 5872282792aSdrh %type having_opt {Expr*} 588633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 5892282792aSdrh having_opt(A) ::= . {A = 0;} 5902282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 5912282792aSdrh 592ad3cab52Sdrh %type limit_opt {struct LimitVal} 59315926590Sdrh 59415926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 59515926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 59615926590Sdrh // rule for SELECT statements. As soon as the rule that create the 59715926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 59815926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 59915926590Sdrh // except as a transient. So there is never anything to destroy. 60015926590Sdrh // 60115926590Sdrh //%destructor limit_opt { 602633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 603633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 60415926590Sdrh //} 605a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 606a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X; A.pOffset = 0;} 607a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 608a2dc3b1aSdanielk1977 {A.pLimit = X; A.pOffset = Y;} 609a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 610a2dc3b1aSdanielk1977 {A.pOffset = X; A.pLimit = Y;} 6119bbca4c1Sdrh 612382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 613382c0247Sdrh // 614273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 615931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 616931577f1Sdrh orderby_opt(O) limit_opt(L). { 617b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 61849ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 6194281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6204281bd42Sshane } 6214281bd42Sshane %endif 622273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6234281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 6244281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6254281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6264281bd42Sshane } 6274281bd42Sshane %endif 628348784efSdrh 629348784efSdrh %type where_opt {Expr*} 630633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 631348784efSdrh 632348784efSdrh where_opt(A) ::= . {A = 0;} 633348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 634348784efSdrh 635382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 636382c0247Sdrh // 637273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6384281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L). { 639b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 640b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 64149ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 6424281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6434281bd42Sshane } 6444281bd42Sshane %endif 645273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6464281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W). { 6474281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6484281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 6494281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6504281bd42Sshane } 6514281bd42Sshane %endif 652348784efSdrh 653f8db1bc0Sdrh %type setlist {ExprList*} 654633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 655f8db1bc0Sdrh 6565ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 65717435752Sdrh {A = sqlite3ExprListAppend(pParse,Z,Y,&X);} 65817435752Sdrh setlist(A) ::= nm(X) EQ expr(Y). 65917435752Sdrh {A = sqlite3ExprListAppend(pParse,0,Y,&X);} 660348784efSdrh 661382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 662382c0247Sdrh // 66374ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 664113088ecSdrh VALUES LP itemlist(Y) RP. 66574ad7fe9Sdrh {sqlite3Insert(pParse, X, Y, 0, F, R);} 66674ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 66774ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 668147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 669147d0cccSdrh {sqlite3Insert(pParse, X, 0, 0, F, R);} 670348784efSdrh 671fa86c412Sdrh %type insert_cmd {int} 672fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 673fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 674fa86c412Sdrh 675348784efSdrh 676348784efSdrh %type itemlist {ExprList*} 677633e6d57Sdrh %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);} 678348784efSdrh 67917435752Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y). 68017435752Sdrh {A = sqlite3ExprListAppend(pParse,X,Y,0);} 68117435752Sdrh itemlist(A) ::= expr(X). 68217435752Sdrh {A = sqlite3ExprListAppend(pParse,0,X,0);} 683348784efSdrh 684967e8b73Sdrh %type inscollist_opt {IdList*} 685633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 686967e8b73Sdrh %type inscollist {IdList*} 687633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);} 688348784efSdrh 689967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 690967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 69117435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y). 69217435752Sdrh {A = sqlite3IdListAppend(pParse->db,X,&Y);} 69317435752Sdrh inscollist(A) ::= nm(Y). 69417435752Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y);} 695348784efSdrh 696382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 697382c0247Sdrh // 698348784efSdrh 699348784efSdrh %type expr {Expr*} 700633e6d57Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);} 7017977a17fSdanielk1977 %type term {Expr*} 702633e6d57Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);} 703348784efSdrh 7047977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 705752e679aSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } 70617435752Sdrh term(A) ::= NULL(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} 707296a483cSdrh expr(A) ::= id(X). {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);} 70817435752Sdrh expr(A) ::= JOIN_KW(X). {A = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);} 7095ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 71017435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 71117435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 71217435752Sdrh A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); 713e1b6a5b8Sdrh } 714d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 71517435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 71617435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 71717435752Sdrh Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 71817435752Sdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 71917435752Sdrh A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 720d24cc427Sdrh } 72117435752Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} 72217435752Sdrh term(A) ::= STRING(X). {A = sqlite3PExpr(pParse, @X, 0, 0, &X);} 7234e0cff60Sdrh expr(A) ::= REGISTER(X). {A = sqlite3RegisterExpr(pParse, &X);} 7247c972decSdrh expr(A) ::= VARIABLE(X). { 725895d7472Sdrh Token *pToken = &X; 72617435752Sdrh Expr *pExpr = A = sqlite3PExpr(pParse, TK_VARIABLE, 0, 0, pToken); 727fa6bc000Sdrh sqlite3ExprAssignVarNumber(pParse, pExpr); 728895d7472Sdrh } 72939002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). { 7308b4c40d8Sdrh A = sqlite3ExprSetColl(pParse, E, &C); 7318b4c40d8Sdrh } 732487e262fSdrh %ifndef SQLITE_OMIT_CAST 733487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 73417435752Sdrh A = sqlite3PExpr(pParse, TK_CAST, E, 0, &T); 735487e262fSdrh sqlite3ExprSpan(A,&X,&Y); 736487e262fSdrh } 737154d4b24Sdrh %endif SQLITE_OMIT_CAST 738fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 739c9cf901dSdanielk1977 if( Y && Y->nExpr>SQLITE_MAX_FUNCTION_ARG ){ 740e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 7414e05c83bSdrh } 74217435752Sdrh A = sqlite3ExprFunction(pParse, Y, &X); 7434adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 7448aa34ae0Sdrh if( D && A ){ 745fd357974Sdrh A->flags |= EP_Distinct; 746fd357974Sdrh } 747e1b6a5b8Sdrh } 748e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 74917435752Sdrh A = sqlite3ExprFunction(pParse, 0, &X); 7504adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 751e1b6a5b8Sdrh } 752b71090fdSdrh term(A) ::= CTIME_KW(OP). { 753b71090fdSdrh /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 754b71090fdSdrh ** treated as functions that return constants */ 75517435752Sdrh A = sqlite3ExprFunction(pParse, 0,&OP); 756417ec638Sdrh if( A ){ 757417ec638Sdrh A->op = TK_CONST_FUNC; 758417ec638Sdrh A->span = OP; 759417ec638Sdrh } 760b71090fdSdrh } 76117435752Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} 76217435752Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} 76317435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). 76417435752Sdrh {A = sqlite3PExpr(pParse,@OP,X,Y,0);} 76517435752Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} 766fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 76717435752Sdrh {A = sqlite3PExpr(pParse,@OP,X,Y,0);} 76817435752Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).{A = sqlite3PExpr(pParse,@OP,X,Y,0);} 76917435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 77017435752Sdrh {A = sqlite3PExpr(pParse,@OP,X,Y,0);} 77117435752Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3PExpr(pParse,@OP,X,Y,0);} 77274ad7fe9Sdrh %type likeop {struct LikeOp} 773b52076cdSdrh likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} 774b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} 77503bea70cSdrh likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;} 77603bea70cSdrh likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;} 7777c6303c0Sdanielk1977 %type escape {Expr*} 778633e6d57Sdrh %destructor escape {sqlite3ExprDelete(pParse->db, $$);} 7797c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;} 7807c6303c0Sdanielk1977 escape(X) ::= . [ESCAPE] {X = 0;} 781b71090fdSdrh expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { 7828aa34ae0Sdrh ExprList *pList; 78317435752Sdrh pList = sqlite3ExprListAppend(pParse,0, Y, 0); 78417435752Sdrh pList = sqlite3ExprListAppend(pParse,pList, X, 0); 7857c6303c0Sdanielk1977 if( E ){ 78617435752Sdrh pList = sqlite3ExprListAppend(pParse,pList, E, 0); 7877c6303c0Sdanielk1977 } 78817435752Sdrh A = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 78917435752Sdrh if( OP.not ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); 7904adee20fSdanielk1977 sqlite3ExprSpan(A, &X->span, &Y->span); 7916a03a1c5Sdrh if( A ) A->flags |= EP_InfixFunc; 7920ac65892Sdrh } 7937c6303c0Sdanielk1977 794fd405314Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). { 79517435752Sdrh A = sqlite3PExpr(pParse, @E, X, 0, 0); 7964adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 797e1b6a5b8Sdrh } 79833048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 79917435752Sdrh A = sqlite3PExpr(pParse, TK_ISNULL, X, 0, 0); 8004adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 80133048c0bSdrh } 80233048c0bSdrh expr(A) ::= expr(X) NOT NULL(E). { 80317435752Sdrh A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0); 8044adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 80533048c0bSdrh } 80681a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 80717435752Sdrh A = sqlite3PExpr(pParse, TK_NOTNULL, X, 0, 0); 8084adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 80981a20f21Sdrh } 810e9cf59e3Sdrh expr(A) ::= NOT(B) expr(X). { 811e9cf59e3Sdrh A = sqlite3PExpr(pParse, @B, X, 0, 0); 812e9cf59e3Sdrh sqlite3ExprSpan(A,&B,&X->span); 813e9cf59e3Sdrh } 814e9cf59e3Sdrh expr(A) ::= BITNOT(B) expr(X). { 81517435752Sdrh A = sqlite3PExpr(pParse, @B, X, 0, 0); 8164adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 81781a20f21Sdrh } 818e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 81917435752Sdrh A = sqlite3PExpr(pParse, TK_UMINUS, X, 0, 0); 8204adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 821e1b6a5b8Sdrh } 8224b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 82317435752Sdrh A = sqlite3PExpr(pParse, TK_UPLUS, X, 0, 0); 8244adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 825e1b6a5b8Sdrh } 8262e3a1f16Sdrh %type between_op {int} 8272e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 8282e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 8292e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 83017435752Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X, 0); 83117435752Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y, 0); 83217435752Sdrh A = sqlite3PExpr(pParse, TK_BETWEEN, W, 0, 0); 83353f733c7Sdrh if( A ){ 8346ab3a2ecSdanielk1977 A->x.pList = pList; 83553f733c7Sdrh }else{ 836633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 83753f733c7Sdrh } 83817435752Sdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); 8394adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 840fef5208cSdrh } 8413e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 8422e3a1f16Sdrh %type in_op {int} 8432e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 8442e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 8452e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 84617435752Sdrh A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); 847d5d56523Sdanielk1977 if( A ){ 8486ab3a2ecSdanielk1977 A->x.pList = Y; 8494b5255acSdanielk1977 sqlite3ExprSetHeight(pParse, A); 850d5d56523Sdanielk1977 }else{ 851633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 852d5d56523Sdanielk1977 } 85317435752Sdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); 8544adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 855fef5208cSdrh } 85651522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 85717435752Sdrh A = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); 85853f733c7Sdrh if( A ){ 8596ab3a2ecSdanielk1977 A->x.pSelect = X; 8606ab3a2ecSdanielk1977 ExprSetProperty(A, EP_xIsSelect); 8614b5255acSdanielk1977 sqlite3ExprSetHeight(pParse, A); 86253f733c7Sdrh }else{ 863633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 86453f733c7Sdrh } 86551522cd3Sdrh sqlite3ExprSpan(A,&B,&E); 86651522cd3Sdrh } 8672e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 86817435752Sdrh A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); 86953f733c7Sdrh if( A ){ 8706ab3a2ecSdanielk1977 A->x.pSelect = Y; 8716ab3a2ecSdanielk1977 ExprSetProperty(A, EP_xIsSelect); 8724b5255acSdanielk1977 sqlite3ExprSetHeight(pParse, A); 87353f733c7Sdrh }else{ 874633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 87553f733c7Sdrh } 87617435752Sdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); 8774adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 878fef5208cSdrh } 87974ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 88017435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 88117435752Sdrh A = sqlite3PExpr(pParse, TK_IN, X, 0, 0); 88253f733c7Sdrh if( A ){ 8836ab3a2ecSdanielk1977 A->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 8846ab3a2ecSdanielk1977 ExprSetProperty(A, EP_xIsSelect); 8854b5255acSdanielk1977 sqlite3ExprSetHeight(pParse, A); 88653f733c7Sdrh }else{ 887633e6d57Sdrh sqlite3SrcListDelete(pParse->db, pSrc); 88853f733c7Sdrh } 88917435752Sdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0, 0); 89074ad7fe9Sdrh sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y); 89123b2db23Sdrh } 89251522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 89317435752Sdrh Expr *p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); 89451522cd3Sdrh if( p ){ 8956ab3a2ecSdanielk1977 p->x.pSelect = Y; 8966ab3a2ecSdanielk1977 ExprSetProperty(A, EP_xIsSelect); 89751522cd3Sdrh sqlite3ExprSpan(p,&B,&E); 8984b5255acSdanielk1977 sqlite3ExprSetHeight(pParse, A); 89953f733c7Sdrh }else{ 900633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 90151522cd3Sdrh } 90251522cd3Sdrh } 903154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 904fef5208cSdrh 90517a7f8ddSdrh /* CASE expressions */ 90617a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 90717435752Sdrh A = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); 90853f733c7Sdrh if( A ){ 9096ab3a2ecSdanielk1977 A->x.pList = Y; 9104b5255acSdanielk1977 sqlite3ExprSetHeight(pParse, A); 91153f733c7Sdrh }else{ 912633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 91353f733c7Sdrh } 9144adee20fSdanielk1977 sqlite3ExprSpan(A, &C, &E); 91517a7f8ddSdrh } 91617a7f8ddSdrh %type case_exprlist {ExprList*} 917633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 91817a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 91917435752Sdrh A = sqlite3ExprListAppend(pParse,X, Y, 0); 92017435752Sdrh A = sqlite3ExprListAppend(pParse,A, Z, 0); 92117a7f8ddSdrh } 92217a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 92317435752Sdrh A = sqlite3ExprListAppend(pParse,0, Y, 0); 92417435752Sdrh A = sqlite3ExprListAppend(pParse,A, Z, 0); 92517a7f8ddSdrh } 92617a7f8ddSdrh %type case_else {Expr*} 927633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 92817a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 92917a7f8ddSdrh case_else(A) ::= . {A = 0;} 93017a7f8ddSdrh %type case_operand {Expr*} 931633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 93217a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 93317a7f8ddSdrh case_operand(A) ::= . {A = 0;} 934348784efSdrh 935348784efSdrh %type exprlist {ExprList*} 936633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 9379245c243Sdrh %type nexprlist {ExprList*} 938633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 939348784efSdrh 9409245c243Sdrh exprlist(A) ::= nexprlist(X). {A = X;} 9419245c243Sdrh exprlist(A) ::= . {A = 0;} 94217435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 94317435752Sdrh {A = sqlite3ExprListAppend(pParse,X,Y,0);} 94417435752Sdrh nexprlist(A) ::= expr(Y). 94517435752Sdrh {A = sqlite3ExprListAppend(pParse,0,Y,0);} 9469245c243Sdrh 947cce7d176Sdrh 948382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 949382c0247Sdrh // 950d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 95177e96d14Sdrh ON nm(Y) LP idxlist(Z) RP(E). { 95217435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 95317435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 9544d91a701Sdrh &S, &E, SQLITE_SO_ASC, NE); 9559cfcf5d4Sdrh } 956717e6402Sdrh 957717e6402Sdrh %type uniqueflag {int} 9589cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 9599cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 960348784efSdrh 9610202b29eSdanielk1977 %type idxlist {ExprList*} 962633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 9630202b29eSdanielk1977 %type idxlist_opt {ExprList*} 964633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 965348784efSdrh 966c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 967c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 968200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 9690202b29eSdanielk1977 Expr *p = 0; 9700202b29eSdanielk1977 if( C.n>0 ){ 97117435752Sdrh p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); 97239002505Sdanielk1977 sqlite3ExprSetColl(pParse, p, &C); 9730202b29eSdanielk1977 } 97417435752Sdrh A = sqlite3ExprListAppend(pParse,X, p, &Y); 975b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 976b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 9770202b29eSdanielk1977 } 978200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 9790202b29eSdanielk1977 Expr *p = 0; 9800202b29eSdanielk1977 if( C.n>0 ){ 98117435752Sdrh p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); 98239002505Sdanielk1977 sqlite3ExprSetColl(pParse, p, &C); 9830202b29eSdanielk1977 } 98417435752Sdrh A = sqlite3ExprListAppend(pParse,0, p, &Y); 985b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 986b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 9870202b29eSdanielk1977 } 9880202b29eSdanielk1977 989a34001c9Sdrh %type collate {Token} 990a34001c9Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 99139002505Sdanielk1977 collate(C) ::= COLLATE ids(X). {C = X;} 992a34001c9Sdrh 993348784efSdrh 9948aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 995382c0247Sdrh // 9964d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 997982cef7eSdrh 998382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 999382c0247Sdrh // 1000154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1001fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 100274161705Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse);} 100374161705Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} 1004fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1005154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1006f57b14a6Sdrh 1007382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1008382c0247Sdrh // 100904e86f4dSshane %ifndef SQLITE_OMIT_PARSER 101013d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 101191cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1012ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1013ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1014ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1015ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1016ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1017ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1018ada2ee0dSdrh 1019a3eb4b44Sdrh nmnum(A) ::= plus_num(X). {A = X;} 1020a3eb4b44Sdrh nmnum(A) ::= nm(X). {A = X;} 1021ada2ee0dSdrh nmnum(A) ::= ON(X). {A = X;} 1022ada2ee0dSdrh nmnum(A) ::= DELETE(X). {A = X;} 10236da861beSdrh nmnum(A) ::= DEFAULT(X). {A = X;} 1024154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 102504e86f4dSshane %endif SQLITE_OMIT_PARSER 1026f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 1027f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1028fd405314Sdrh number(A) ::= INTEGER|FLOAT(X). {A = X;} 1029f57b14a6Sdrh plus_opt ::= PLUS. 1030f57b14a6Sdrh plus_opt ::= . 1031c3f9bad2Sdanielk1977 1032c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1033f0f258b1Sdrh 1034b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1035b7f9164eSdrh 1036d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 10374b59ab5eSdrh Token all; 10384b59ab5eSdrh all.z = A.z; 1039b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 10404adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1041f0f258b1Sdrh } 1042f0f258b1Sdrh 1043fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1044fdd48a76Sdrh trigger_time(C) trigger_event(D) 104560218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 104660218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 10473df6b257Sdanielk1977 A = (Z.n==0?B:Z); 1048c3f9bad2Sdanielk1977 } 1049c3f9bad2Sdanielk1977 1050c3f9bad2Sdanielk1977 %type trigger_time {int} 1051c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1052c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1053c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1054c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1055c3f9bad2Sdanielk1977 1056ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1057633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1058fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 105974ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 1060c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 1061c3f9bad2Sdanielk1977 106260218d2aSdrh foreach_clause ::= . 106360218d2aSdrh foreach_clause ::= FOR EACH ROW. 1064c3f9bad2Sdanielk1977 1065c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1066633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1067c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1068c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 1069c3f9bad2Sdanielk1977 1070c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1071633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 1072187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { 107381238966Sdrh /* 1074187e4c6aSdrh if( Y ){ 1075187e4c6aSdrh Y->pLast->pNext = X; 1076187e4c6aSdrh }else{ 1077187e4c6aSdrh Y = X; 1078187e4c6aSdrh } 107981238966Sdrh */ 108081238966Sdrh assert( Y!=0 ); 108181238966Sdrh Y->pLast->pNext = X; 1082187e4c6aSdrh Y->pLast = X; 1083187e4c6aSdrh A = Y; 1084a69d9168Sdrh } 108581238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { 108681238966Sdrh /* if( X ) */ 108781238966Sdrh assert( X!=0 ); 108881238966Sdrh X->pLast = X; 108981238966Sdrh A = X; 109081238966Sdrh } 1091c3f9bad2Sdanielk1977 1092c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1093633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1094c3f9bad2Sdanielk1977 // UPDATE 10955ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 109617435752Sdrh { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1097c3f9bad2Sdanielk1977 1098c3f9bad2Sdanielk1977 // INSERT 10993054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 1100c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 110117435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);} 1102c3f9bad2Sdanielk1977 11033054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 110417435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} 1105c3f9bad2Sdanielk1977 1106c3f9bad2Sdanielk1977 // DELETE 11075ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 110817435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1109c3f9bad2Sdanielk1977 1110c3f9bad2Sdanielk1977 // SELECT 111117435752Sdrh trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1112c3f9bad2Sdanielk1977 11136f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 11144b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 111517435752Sdrh A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); 11168aa34ae0Sdrh if( A ){ 11176ab3a2ecSdanielk1977 A->affinity = OE_Ignore; 11184adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 11194b59ab5eSdrh } 11208aa34ae0Sdrh } 112174ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 112217435752Sdrh A = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); 11238aa34ae0Sdrh if( A ) { 1124c0688ea1Sshane A->affinity = (char)T; 11254adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 11264b59ab5eSdrh } 11278aa34ae0Sdrh } 1128154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1129b7f9164eSdrh 113074ad7fe9Sdrh %type raisetype {int} 113174ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 113274ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 113374ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 113474ad7fe9Sdrh 11356f34903eSdanielk1977 1136c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1137b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1138fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1139fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1140c3f9bad2Sdanielk1977 } 1141154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1142113088ecSdrh 1143113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1144fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1145f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1146f744bb56Sdanielk1977 sqlite3Attach(pParse, F, D, K); 11471c2d8414Sdrh } 1148fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1149fdbcdee5Sdrh sqlite3Detach(pParse, D); 1150fdbcdee5Sdrh } 1151fdbcdee5Sdrh 1152f744bb56Sdanielk1977 %type key_opt {Expr*} 1153633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1154f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1155f744bb56Sdanielk1977 key_opt(A) ::= KEY expr(X). { A = X; } 1156113088ecSdrh 1157113088ecSdrh database_kw_opt ::= DATABASE. 1158113088ecSdrh database_kw_opt ::= . 1159fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 11604343fea2Sdrh 11614343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 11624343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 11634343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 11644343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1165154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 11669fd2a9a0Sdanielk1977 11679f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 11689f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 11699f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 11709f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 11719f18e8a0Sdrh %endif 11729f18e8a0Sdrh 11739fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 11749fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 11759fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 11769fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 11779fd2a9a0Sdanielk1977 } 117819a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 117919a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 118019a8e7e8Sdanielk1977 } 118119a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 1182d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 118319a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 118419a8e7e8Sdanielk1977 } 118519a8e7e8Sdanielk1977 kwcolumn_opt ::= . 118619a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1187154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1188e09daa90Sdrh 1189e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1190e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1191b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1192b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1193d9da78a2Sdrh create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { 1194b9bb7c18Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z); 1195b9bb7c18Sdrh } 1196e09daa90Sdrh vtabarglist ::= vtabarg. 1197e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1198b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1199b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1200b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1201b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1202b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1203b9bb7c18Sdrh anylist ::= . 1204*aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1205*aaac8b4eSdrh anylist ::= anylist ANY. 1206154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 1207