1348784efSdrh /* 2b19a2bc6Sdrh ** 2001 September 15 3348784efSdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 6348784efSdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 10348784efSdrh ** 11348784efSdrh ************************************************************************* 12348784efSdrh ** This file contains SQLite's grammar for SQL. Process this file 13348784efSdrh ** using the lemon parser generator to generate C code that runs 14348784efSdrh ** the parser. Lemon will also generate a header file containing 15348784efSdrh ** numeric codes for all of the tokens. 16348784efSdrh */ 17487e262fSdrh 18487e262fSdrh // All token codes are small integers with #defines that begin with "TK_" 19348784efSdrh %token_prefix TK_ 20487e262fSdrh 21487e262fSdrh // The type of the data attached to each token is Token. This is also the 22487e262fSdrh // default type for non-terminals. 23487e262fSdrh // 24348784efSdrh %token_type {Token} 25f57b14a6Sdrh %default_type {Token} 26487e262fSdrh 27487e262fSdrh // The generated parser function takes a 4th argument as follows: 28348784efSdrh %extra_argument {Parse *pParse} 29487e262fSdrh 30487e262fSdrh // This code runs whenever there is a syntax error 31487e262fSdrh // 32348784efSdrh %syntax_error { 33128255fcSdrh UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ 3455176259Sdrh assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ 354adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 36b86ccfb2Sdrh } 378fc3345fSdrh %stack_overflow { 38128255fcSdrh UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ 398fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 408fc3345fSdrh } 41487e262fSdrh 42487e262fSdrh // The name of the generated procedure that implements the parser 43487e262fSdrh // is as follows: 444adee20fSdanielk1977 %name sqlite3Parser 45487e262fSdrh 46487e262fSdrh // The following text is included near the beginning of the C source 47487e262fSdrh // code file that implements the parser. 48487e262fSdrh // 49348784efSdrh %include { 50348784efSdrh #include "sqliteInt.h" 519bbca4c1Sdrh 529bbca4c1Sdrh /* 53d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 54d3ec02d3Sdrh ** automaton. 55d3ec02d3Sdrh */ 56d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 57d3ec02d3Sdrh 58d3ec02d3Sdrh /* 598a415d37Sdrh ** Make yytestcase() the same as testcase() 608a415d37Sdrh */ 618a415d37Sdrh #define yytestcase(X) testcase(X) 628a415d37Sdrh 638a415d37Sdrh /* 64ad3cab52Sdrh ** An instance of this structure holds information about the 65ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 669bbca4c1Sdrh */ 67ad3cab52Sdrh struct LimitVal { 68a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 69a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 70ad3cab52Sdrh }; 71c3f9bad2Sdanielk1977 72c3f9bad2Sdanielk1977 /* 732e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 742e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 752e3a1f16Sdrh */ 762e3a1f16Sdrh struct LikeOp { 77b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 782e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 792e3a1f16Sdrh }; 802e3a1f16Sdrh 812e3a1f16Sdrh /* 82ad3cab52Sdrh ** An instance of the following structure describes the event of a 83ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 84ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 85ad3cab52Sdrh ** 86ad3cab52Sdrh ** UPDATE ON (a,b,c) 87ad3cab52Sdrh ** 88ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 89c3f9bad2Sdanielk1977 */ 90ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 91caec2f12Sdrh 9225d6543dSdrh /* 9325d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 9425d6543dSdrh */ 9525d6543dSdrh struct AttachKey { int type; Token key; }; 9625d6543dSdrh 977b113babSdrh /* 987b113babSdrh ** One or more VALUES claues 997b113babSdrh */ 1007b113babSdrh struct ValueList { 1017b113babSdrh ExprList *pList; 1027b113babSdrh Select *pSelect; 1037b113babSdrh }; 1047b113babSdrh 105caec2f12Sdrh } // end %include 106348784efSdrh 107826fb5a3Sdrh // Input is a single SQL command 108c4a3c779Sdrh input ::= cmdlist. 109094b2bbfSdrh cmdlist ::= cmdlist ecmd. 110826fb5a3Sdrh cmdlist ::= ecmd. 111b7f9164eSdrh ecmd ::= SEMI. 112b7f9164eSdrh ecmd ::= explain cmdx SEMI. 1134adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 114b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 115b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 116ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } 117154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 118200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 119348784efSdrh 120382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 121c4a3c779Sdrh // 122fa86c412Sdrh 123684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 124c4a3c779Sdrh trans_opt ::= . 125c4a3c779Sdrh trans_opt ::= TRANSACTION. 1265ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 127684917c2Sdrh %type transtype {int} 128684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 129684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 130684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 131684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1324adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1334adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1344adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 135c4a3c779Sdrh 136fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 137fd7f0452Sdanielk1977 savepoint_opt ::= . 138fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 139fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 140fd7f0452Sdanielk1977 } 141fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 142fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 143fd7f0452Sdanielk1977 } 144fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 145fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 146fd7f0452Sdanielk1977 } 147fd7f0452Sdanielk1977 148382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 149348784efSdrh // 150348784efSdrh cmd ::= create_table create_table_args. 151d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 152f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 153969fa7c1Sdrh } 154d9da78a2Sdrh createkw(A) ::= CREATE(X). { 155d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 156d9da78a2Sdrh A = X; 157d9da78a2Sdrh } 158faa59554Sdrh %type ifnotexists {int} 159faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 160faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 161f57b3399Sdrh %type temp {int} 16253c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 163d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 164154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 165d24cc427Sdrh temp(A) ::= . {A = 0;} 16619a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { 16719a8e7e8Sdanielk1977 sqlite3EndTable(pParse,&X,&Y,0); 168969fa7c1Sdrh } 169969fa7c1Sdrh create_table_args ::= AS select(S). { 17019a8e7e8Sdanielk1977 sqlite3EndTable(pParse,0,0,S); 171633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 172969fa7c1Sdrh } 173348784efSdrh columnlist ::= columnlist COMMA column. 174348784efSdrh columnlist ::= column. 175348784efSdrh 176487e262fSdrh // A "column" is a complete description of a single column in a 177487e262fSdrh // CREATE TABLE statement. This includes the column name, its 178487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 179487e262fSdrh // NOT NULL and so forth. 180348784efSdrh // 18119a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 18219a8e7e8Sdanielk1977 A.z = X.z; 183b27b7f5dSdrh A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 18419a8e7e8Sdanielk1977 } 18519a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 18619a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 18719a8e7e8Sdanielk1977 A = X; 18819a8e7e8Sdanielk1977 } 18919a8e7e8Sdanielk1977 190c4a3c779Sdrh 191c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 192c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 193c4a3c779Sdrh // 194982cef7eSdrh %type id {Token} 195f18543caSdrh id(A) ::= ID(X). {A = X;} 196296a483cSdrh id(A) ::= INDEXED(X). {A = X;} 1970bd1f4eaSdrh 19834e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 19934e33bb8Sdrh // fallback to ID if they will not parse as their original value. 20034e33bb8Sdrh // This obviates the need for the "id" nonterminal. 20134e33bb8Sdrh // 2020bd1f4eaSdrh %fallback ID 2031da40a38Sdan ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 2041da40a38Sdan CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 2051da40a38Sdan IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 206db15bcd5Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK 20778c2e6d8Sdanielk1977 SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL 208b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 209b7f9164eSdrh EXCEPT INTERSECT UNION 210154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 211a073384fSdrh REINDEX RENAME CTIME_KW IF 212b7f9164eSdrh . 213e09daa90Sdrh %wildcard ANY. 214c4a3c779Sdrh 2152d3917daSdrh // Define operator precedence early so that this is the first occurance 2162d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2172d3917daSdrh // causes them to be assigned integer values that are close together, 2182d3917daSdrh // which keeps parser tables smaller. 2192d3917daSdrh // 220f2bc013cSdrh // The token values assigned to these symbols is determined by the order 221f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 222f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 223f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 224f2bc013cSdrh // constraint. 225f2bc013cSdrh // 2262d3917daSdrh %left OR. 2272d3917daSdrh %left AND. 2282d3917daSdrh %right NOT. 22903bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2309a43267bSdrh %left GT LE LT GE. 2317c6303c0Sdanielk1977 %right ESCAPE. 2322d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2332d3917daSdrh %left PLUS MINUS. 2342d3917daSdrh %left STAR SLASH REM. 235a34001c9Sdrh %left CONCAT. 236a34001c9Sdrh %left COLLATE. 2377ba5bc5bSdrh %right BITNOT. 2382d3917daSdrh 239c4a3c779Sdrh // And "ids" is an identifer-or-string. 240c4a3c779Sdrh // 241c4a3c779Sdrh %type ids {Token} 242fd405314Sdrh ids(A) ::= ID|STRING(X). {A = X;} 243c4a3c779Sdrh 2445ad1a6c8Sdrh // The name of a column or table can be any of the following: 2455ad1a6c8Sdrh // 2465ad1a6c8Sdrh %type nm {Token} 247296a483cSdrh nm(A) ::= id(X). {A = X;} 2485ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2495ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2505ad1a6c8Sdrh 251487e262fSdrh // A typetoken is really one or more tokens that form a type name such 252487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 253487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 254487e262fSdrh // 255487e262fSdrh %type typetoken {Token} 256382c0247Sdrh type ::= . 257487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 258487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 259487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 260487e262fSdrh A.z = X.z; 261b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 262487e262fSdrh } 263487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 264487e262fSdrh A.z = X.z; 265b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 266487e262fSdrh } 267382c0247Sdrh %type typename {Token} 268382c0247Sdrh typename(A) ::= ids(X). {A = X;} 269b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 27060218d2aSdrh signed ::= plus_num. 27160218d2aSdrh signed ::= minus_num. 272487e262fSdrh 273487e262fSdrh // "carglist" is a list of additional constraints that come after the 274487e262fSdrh // column name and column type in a CREATE TABLE statement. 275487e262fSdrh // 276348784efSdrh carglist ::= carglist carg. 277348784efSdrh carglist ::= . 2785ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 279348784efSdrh carg ::= ccons. 280b7916a78Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 281b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 282b7916a78Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 283f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 284b7916a78Sdrh ExprSpan v; 285b7916a78Sdrh v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); 286b7916a78Sdrh v.zStart = A.z; 287b7916a78Sdrh v.zEnd = X.zEnd; 288b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2897977a17fSdanielk1977 } 2902b7acc35Sdrh ccons ::= DEFAULT id(X). { 291b7916a78Sdrh ExprSpan v; 292b7916a78Sdrh spanExpr(&v, pParse, TK_STRING, &X); 293b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2947977a17fSdanielk1977 } 295348784efSdrh 296382c0247Sdrh // In addition to the type name, we also care about the primary key and 297382c0247Sdrh // UNIQUE constraints. 298348784efSdrh // 2990d316a40Sdrh ccons ::= NULL onconf. 3004adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 301fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 302fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 3034d91a701Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 304b7916a78Sdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} 305c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 3064adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 3074adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 30839002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 30904738cb9Sdrh 310205f48e6Sdrh // The optional AUTOINCREMENT keyword 311205f48e6Sdrh %type autoinc {int} 312205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3132958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 314205f48e6Sdrh 315c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 316c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 317c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 318c2eef3b3Sdrh // check fails. 31904738cb9Sdrh // 320c2eef3b3Sdrh %type refargs {int} 321fcf486c3Sdrh refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */} 32250af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; } 323c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 324c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 325c29c5aa1Sdrh refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; } 326c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 327c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 328c2eef3b3Sdrh %type refact {int} 329fcf486c3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */} 330fcf486c3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */} 331fcf486c3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */} 332fcf486c3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 333fcf486c3Sdrh refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 334c2eef3b3Sdrh %type defer_subclause {int} 3351da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 336c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 337c2eef3b3Sdrh %type init_deferred_pred_opt {int} 338c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 339c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 340c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 341348784efSdrh 342348784efSdrh // For the time being, the only constraint we care about is the primary 343382c0247Sdrh // key and UNIQUE. Both create indices. 344348784efSdrh // 34519a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 34619a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 347348784efSdrh conslist ::= conslist COMMA tcons. 348a2e1bb5aSdrh conslist ::= conslist tcons. 349348784efSdrh conslist ::= tcons. 3505ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 351f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 352fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3539cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3544d91a701Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 355b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 356b7916a78Sdrh {sqlite3AddCheckConstraint(pParse,E.pExpr);} 357c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 358c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3594adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3604adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 361c2eef3b3Sdrh } 362c2eef3b3Sdrh %type defer_subclause_opt {int} 363c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 364c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3659cfcf5d4Sdrh 3669cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3679cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3689cfcf5d4Sdrh // 3699cfcf5d4Sdrh %type onconf {int} 3705eff7cf0Sshane %type orconf {u8} 3711c92853dSdrh %type resolvetype {int} 3721c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3731c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3741c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3755eff7cf0Sshane orconf(A) ::= OR resolvetype(X). {A = (u8)X;} 37674ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3771c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3781c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 379348784efSdrh 380382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 381348784efSdrh // 382a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 383a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 384a8858103Sdanielk1977 } 385a073384fSdrh %type ifexists {int} 386a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 387a073384fSdrh ifexists(A) ::= . {A = 0;} 388348784efSdrh 389a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 390a76b5dfcSdrh // 391b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 392d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { 393fdd48a76Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 394a76b5dfcSdrh } 395a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 396a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 397a76b5dfcSdrh } 398154d4b24Sdrh %endif SQLITE_OMIT_VIEW 399a76b5dfcSdrh 400382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 401348784efSdrh // 4029bb61fe7Sdrh cmd ::= select(X). { 4037d10d5a6Sdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0}; 4047d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 4057e02e5e6Sdrh sqlite3ExplainBegin(pParse->pVdbe); 4067e02e5e6Sdrh sqlite3ExplainSelect(pParse->pVdbe, X); 4077e02e5e6Sdrh sqlite3ExplainFinish(pParse->pVdbe); 408633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 4099bb61fe7Sdrh } 410efb7251dSdrh 4119bb61fe7Sdrh %type select {Select*} 412633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 41382c3d636Sdrh %type oneselect {Select*} 414633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4159bb61fe7Sdrh 41682c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 417b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4180a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 419daffd0e5Sdrh if( Z ){ 420b27b7f5dSdrh Z->op = (u8)Y; 42182c3d636Sdrh Z->pPrior = X; 42243b78826Sdrh }else{ 423633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 424daffd0e5Sdrh } 42582c3d636Sdrh A = Z; 42682c3d636Sdrh } 4270a36c57eSdrh %type multiselect_op {int} 42874ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 4290a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 430fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 431154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 43282c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 4339bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 43417435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 4359bb61fe7Sdrh } 4369bb61fe7Sdrh 4379bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 4389bb61fe7Sdrh // present and false (0) if it is not. 4399bb61fe7Sdrh // 440efb7251dSdrh %type distinct {int} 441efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 442fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 443efb7251dSdrh distinct(A) ::= . {A = 0;} 444348784efSdrh 4459bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 4467c917d19Sdrh // values of the SELECT statement. The "*" in statements like 4477c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 4487c917d19Sdrh // opcode of TK_ALL. 4499bb61fe7Sdrh // 450348784efSdrh %type selcollist {ExprList*} 451633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 452348784efSdrh %type sclp {ExprList*} 453633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 454348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 455348784efSdrh sclp(A) ::= . {A = 0;} 45601f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 457b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, X.pExpr); 458b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 459b7916a78Sdrh sqlite3ExprListSetSpan(pParse,A,&X); 46001f3f253Sdrh } 4617c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 462b7916a78Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); 463b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, p); 4647c917d19Sdrh } 465e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { 466e54a62adSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); 46717435752Sdrh Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 46817435752Sdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 469b7916a78Sdrh A = sqlite3ExprListAppend(pParse,P, pDot); 47054473229Sdrh } 47101f3f253Sdrh 47201f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 47301f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 47401f3f253Sdrh // 47501f3f253Sdrh %type as {Token} 4765ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 4775ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 47801f3f253Sdrh as(X) ::= . {X.n = 0;} 4799bb61fe7Sdrh 480348784efSdrh 481ad3cab52Sdrh %type seltablist {SrcList*} 482633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 483ad3cab52Sdrh %type stl_prefix {SrcList*} 484633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 485ad3cab52Sdrh %type from {SrcList*} 486633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 487348784efSdrh 48801f3f253Sdrh // A complete FROM clause. 48901f3f253Sdrh // 49017435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 49161dfc31dSdrh from(A) ::= FROM seltablist(X). { 49261dfc31dSdrh A = X; 49361dfc31dSdrh sqlite3SrcListShiftJoinType(A); 49461dfc31dSdrh } 49501f3f253Sdrh 49601f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 49701f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 49801f3f253Sdrh // 49901f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 50001f3f253Sdrh A = X; 501d3ec02d3Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; 50201f3f253Sdrh } 503348784efSdrh stl_prefix(A) ::= . {A = 0;} 50485574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). { 505b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 506b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 50701f3f253Sdrh } 50851522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 509fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP 510b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 511b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 51222f70c32Sdrh } 513fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 514fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 5159b87d7b9Sdanielk1977 if( X==0 && Z.n==0 && N==0 && U==0 ){ 516fbdc7f69Sdrh A = F; 517fbdc7f69Sdrh }else{ 518fbdc7f69Sdrh Select *pSubquery; 519fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 520fbdc7f69Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 521fbdc7f69Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 522fbdc7f69Sdrh } 523fbdc7f69Sdrh } 524348784efSdrh 525b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 526b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 527b733d037Sdrh // a grouping of table and subqueries. 528b733d037Sdrh // 529fbdc7f69Sdrh // %type seltablist_paren {Select*} 530fbdc7f69Sdrh // %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);} 531fbdc7f69Sdrh // seltablist_paren(A) ::= select(S). {A = S;} 532fbdc7f69Sdrh // seltablist_paren(A) ::= seltablist(F). { 533fbdc7f69Sdrh // sqlite3SrcListShiftJoinType(F); 534fbdc7f69Sdrh // A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 535fbdc7f69Sdrh // } 536154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 537b733d037Sdrh 538113088ecSdrh %type dbnm {Token} 539113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 540113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 541113088ecSdrh 54274ad7fe9Sdrh %type fullname {SrcList*} 543633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 54417435752Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 54574ad7fe9Sdrh 54601f3f253Sdrh %type joinop {int} 54701f3f253Sdrh %type joinop2 {int} 548fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 5494adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 5504adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 5515ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 5524adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 55301f3f253Sdrh 55401f3f253Sdrh %type on_opt {Expr*} 555633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 556b7916a78Sdrh on_opt(N) ::= ON expr(E). {N = E.pExpr;} 55701f3f253Sdrh on_opt(N) ::= . {N = 0;} 55801f3f253Sdrh 55985574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 56085574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 56185574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 56285574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 56385574e31Sdanielk1977 // in the token. 56485574e31Sdanielk1977 // 56585574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 566b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 56785574e31Sdanielk1977 // recognizes and interprets this as a special case. 56885574e31Sdanielk1977 // 56985574e31Sdanielk1977 %type indexed_opt {Token} 57085574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 57185574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 57285574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 57385574e31Sdanielk1977 57401f3f253Sdrh %type using_opt {IdList*} 575633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 5760202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 57701f3f253Sdrh using_opt(U) ::= . {U = 0;} 57801f3f253Sdrh 57901f3f253Sdrh 580348784efSdrh %type orderby_opt {ExprList*} 581633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 582348784efSdrh %type sortlist {ExprList*} 583633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 584348784efSdrh 585348784efSdrh orderby_opt(A) ::= . {A = 0;} 586348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 5878395b7b6Sdrh sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). { 5888395b7b6Sdrh A = sqlite3ExprListAppend(pParse,X,Y.pExpr); 589b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 590348784efSdrh } 5918395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). { 5928395b7b6Sdrh A = sqlite3ExprListAppend(pParse,0,Y.pExpr); 593d3ec02d3Sdrh if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; 594348784efSdrh } 595348784efSdrh 596348784efSdrh %type sortorder {int} 597348784efSdrh 5988e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 5998e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 6008e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 601348784efSdrh 6022282792aSdrh %type groupby_opt {ExprList*} 603633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 6042282792aSdrh groupby_opt(A) ::= . {A = 0;} 6059245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 6062282792aSdrh 6072282792aSdrh %type having_opt {Expr*} 608633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 6092282792aSdrh having_opt(A) ::= . {A = 0;} 610b7916a78Sdrh having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} 6112282792aSdrh 612ad3cab52Sdrh %type limit_opt {struct LimitVal} 61315926590Sdrh 61415926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 61515926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 61615926590Sdrh // rule for SELECT statements. As soon as the rule that create the 61715926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 61815926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 61915926590Sdrh // except as a transient. So there is never anything to destroy. 62015926590Sdrh // 62115926590Sdrh //%destructor limit_opt { 622633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 623633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 62415926590Sdrh //} 625a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 626b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 627a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 628b7916a78Sdrh {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 629a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 630b7916a78Sdrh {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 6319bbca4c1Sdrh 632382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 633382c0247Sdrh // 634273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 635931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 636931577f1Sdrh orderby_opt(O) limit_opt(L). { 637b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 63849ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 6394281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6404281bd42Sshane } 6414281bd42Sshane %endif 642273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6434281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 6444281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6454281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6464281bd42Sshane } 6474281bd42Sshane %endif 648348784efSdrh 649348784efSdrh %type where_opt {Expr*} 650633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 651348784efSdrh 652348784efSdrh where_opt(A) ::= . {A = 0;} 653b7916a78Sdrh where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 654348784efSdrh 655382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 656382c0247Sdrh // 657273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6584281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L). { 659b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 660b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 66149ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 6624281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6634281bd42Sshane } 6644281bd42Sshane %endif 665273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6664281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W). { 6674281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6684281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 6694281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6704281bd42Sshane } 6714281bd42Sshane %endif 672348784efSdrh 673f8db1bc0Sdrh %type setlist {ExprList*} 674633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 675f8db1bc0Sdrh 676b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). { 677b7916a78Sdrh A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); 678b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 679b7916a78Sdrh } 680b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 681b7916a78Sdrh A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 682b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 683b7916a78Sdrh } 684348784efSdrh 685382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 686382c0247Sdrh // 6877b113babSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) valuelist(Y). 6887b113babSdrh {sqlite3Insert(pParse, X, Y.pList, Y.pSelect, F, R);} 68974ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 69074ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 691147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 692147d0cccSdrh {sqlite3Insert(pParse, X, 0, 0, F, R);} 693348784efSdrh 6945eff7cf0Sshane %type insert_cmd {u8} 695fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 696fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 697fa86c412Sdrh 6987b113babSdrh // A ValueList is either a single VALUES clause or a comma-separated list 6997b113babSdrh // of VALUES clauses. If it is a single VALUES clause then the 7007b113babSdrh // ValueList.pList field points to the expression list of that clause. 7017b113babSdrh // If it is a list of VALUES clauses, then those clauses are transformed 7027b113babSdrh // into a set of SELECT statements without FROM clauses and connected by 7037b113babSdrh // UNION ALL and the ValueList.pSelect points to the right-most SELECT in 7047b113babSdrh // that compound. 7057b113babSdrh %type valuelist {struct ValueList} 7067b113babSdrh %destructor valuelist { 7077b113babSdrh sqlite3ExprListDelete(pParse->db, $$.pList); 7087b113babSdrh sqlite3SelectDelete(pParse->db, $$.pSelect); 7097b113babSdrh } 7107b113babSdrh valuelist(A) ::= VALUES LP nexprlist(X) RP. { 7117b113babSdrh A.pList = X; 7127b113babSdrh A.pSelect = 0; 7137b113babSdrh } 714*76aad0d1Sdrh 715*76aad0d1Sdrh // Since a list of VALUEs is inplemented as a compound SELECT, we have 716*76aad0d1Sdrh // to disable the value list option if compound SELECTs are disabled. 717*76aad0d1Sdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 7187b113babSdrh valuelist(A) ::= valuelist(X) COMMA LP exprlist(Y) RP. { 7197b113babSdrh Select *pRight = sqlite3SelectNew(pParse, Y, 0, 0, 0, 0, 0, 0, 0, 0); 7207b113babSdrh if( X.pList ){ 7217b113babSdrh X.pSelect = sqlite3SelectNew(pParse, X.pList, 0, 0, 0, 0, 0, 0, 0, 0); 7227b113babSdrh X.pList = 0; 7237b113babSdrh } 7247b113babSdrh A.pList = 0; 7257b113babSdrh if( X.pSelect==0 || pRight==0 ){ 7267b113babSdrh sqlite3SelectDelete(pParse->db, pRight); 7277b113babSdrh sqlite3SelectDelete(pParse->db, X.pSelect); 7287b113babSdrh A.pSelect = 0; 7297b113babSdrh }else{ 7307b113babSdrh pRight->op = TK_ALL; 7317b113babSdrh pRight->pPrior = X.pSelect; 7327b113babSdrh pRight->selFlags |= SF_Values; 7337b113babSdrh pRight->pPrior->selFlags |= SF_Values; 7347b113babSdrh A.pSelect = pRight; 7357b113babSdrh } 7367b113babSdrh } 737*76aad0d1Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 738348784efSdrh 739967e8b73Sdrh %type inscollist_opt {IdList*} 740633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 741967e8b73Sdrh %type inscollist {IdList*} 742633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);} 743348784efSdrh 744967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 745967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 74617435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y). 74717435752Sdrh {A = sqlite3IdListAppend(pParse->db,X,&Y);} 74817435752Sdrh inscollist(A) ::= nm(Y). 74917435752Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y);} 750348784efSdrh 751382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 752382c0247Sdrh // 753348784efSdrh 754b7916a78Sdrh %type expr {ExprSpan} 755b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 756b7916a78Sdrh %type term {ExprSpan} 757b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 758b7916a78Sdrh 759b7916a78Sdrh %include { 760b7916a78Sdrh /* This is a utility routine used to set the ExprSpan.zStart and 761b7916a78Sdrh ** ExprSpan.zEnd values of pOut so that the span covers the complete 762b7916a78Sdrh ** range of text beginning with pStart and going to the end of pEnd. 763b7916a78Sdrh */ 764b7916a78Sdrh static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ 765b7916a78Sdrh pOut->zStart = pStart->z; 766b7916a78Sdrh pOut->zEnd = &pEnd->z[pEnd->n]; 767b7916a78Sdrh } 768b7916a78Sdrh 769b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 770b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 771b7916a78Sdrh ** that created the expression. 772b7916a78Sdrh */ 773b7916a78Sdrh static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){ 774b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue); 775b7916a78Sdrh pOut->zStart = pValue->z; 776b7916a78Sdrh pOut->zEnd = &pValue->z[pValue->n]; 777b7916a78Sdrh } 778b7916a78Sdrh } 779348784efSdrh 7807977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 781b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);} 782b7916a78Sdrh term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);} 783b7916a78Sdrh expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);} 784b7916a78Sdrh expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);} 7855ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 78617435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 78717435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 788b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); 789b7916a78Sdrh spanSet(&A,&X,&Y); 790e1b6a5b8Sdrh } 791d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 79217435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 79317435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 79417435752Sdrh Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 79517435752Sdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 796b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 797b7916a78Sdrh spanSet(&A,&X,&Z); 798d24cc427Sdrh } 799b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);} 800b7916a78Sdrh term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);} 801b7916a78Sdrh expr(A) ::= REGISTER(X). { 802b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 803b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 804b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 805b7916a78Sdrh if( pParse->nested==0 ){ 806b7916a78Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); 807b7916a78Sdrh A.pExpr = 0; 808b7916a78Sdrh }else{ 809b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); 810b7916a78Sdrh if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable); 811b7916a78Sdrh } 812b7916a78Sdrh spanSet(&A, &X, &X); 813b7916a78Sdrh } 8147c972decSdrh expr(A) ::= VARIABLE(X). { 815b7916a78Sdrh spanExpr(&A, pParse, TK_VARIABLE, &X); 816b7916a78Sdrh sqlite3ExprAssignVarNumber(pParse, A.pExpr); 817b7916a78Sdrh spanSet(&A, &X, &X); 818895d7472Sdrh } 81939002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). { 8208342e49fSdrh A.pExpr = sqlite3ExprSetCollByToken(pParse, E.pExpr, &C); 821b7916a78Sdrh A.zStart = E.zStart; 822b7916a78Sdrh A.zEnd = &C.z[C.n]; 8238b4c40d8Sdrh } 824487e262fSdrh %ifndef SQLITE_OMIT_CAST 825487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 826b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); 827b7916a78Sdrh spanSet(&A,&X,&Y); 828487e262fSdrh } 829154d4b24Sdrh %endif SQLITE_OMIT_CAST 830fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 831994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 832e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 8334e05c83bSdrh } 834b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 835b7916a78Sdrh spanSet(&A,&X,&E); 836b7916a78Sdrh if( D && A.pExpr ){ 837b7916a78Sdrh A.pExpr->flags |= EP_Distinct; 838fd357974Sdrh } 839e1b6a5b8Sdrh } 840e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 841b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 842b7916a78Sdrh spanSet(&A,&X,&E); 843e1b6a5b8Sdrh } 844b71090fdSdrh term(A) ::= CTIME_KW(OP). { 845b71090fdSdrh /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 846b71090fdSdrh ** treated as functions that return constants */ 847b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0,&OP); 848b7916a78Sdrh if( A.pExpr ){ 849b7916a78Sdrh A.pExpr->op = TK_CONST_FUNC; 850b7916a78Sdrh } 851b7916a78Sdrh spanSet(&A, &OP, &OP); 852b7916a78Sdrh } 853b7916a78Sdrh 854b7916a78Sdrh %include { 855b7916a78Sdrh /* This routine constructs a binary expression node out of two ExprSpan 856b7916a78Sdrh ** objects and uses the result to populate a new ExprSpan object. 857b7916a78Sdrh */ 858b7916a78Sdrh static void spanBinaryExpr( 859b7916a78Sdrh ExprSpan *pOut, /* Write the result here */ 860b7916a78Sdrh Parse *pParse, /* The parsing context. Errors accumulate here */ 861b7916a78Sdrh int op, /* The binary operation */ 862b7916a78Sdrh ExprSpan *pLeft, /* The left operand */ 863b7916a78Sdrh ExprSpan *pRight /* The right operand */ 864b7916a78Sdrh ){ 865b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); 866b7916a78Sdrh pOut->zStart = pLeft->zStart; 867b7916a78Sdrh pOut->zEnd = pRight->zEnd; 868417ec638Sdrh } 869b71090fdSdrh } 870b7916a78Sdrh 871b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 872b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 87317435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). 874b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 875b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 876fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 877b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 878b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). 879b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 88017435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 881b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 882b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 88374ad7fe9Sdrh %type likeop {struct LikeOp} 884b52076cdSdrh likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} 885b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} 88603bea70cSdrh likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;} 88703bea70cSdrh likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;} 8881dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] { 8898aa34ae0Sdrh ExprList *pList; 890b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 891b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 892b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 893b7916a78Sdrh if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 894b7916a78Sdrh A.zStart = X.zStart; 895b7916a78Sdrh A.zEnd = Y.zEnd; 896b7916a78Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 8970ac65892Sdrh } 8981dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 8991dca1458Sdrh ExprList *pList; 9001dca1458Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 9011dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 9021dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 9031dca1458Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 9041dca1458Sdrh if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 9051dca1458Sdrh A.zStart = X.zStart; 9061dca1458Sdrh A.zEnd = E.zEnd; 9071dca1458Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 9081dca1458Sdrh } 9097c6303c0Sdanielk1977 910b7916a78Sdrh %include { 911b7916a78Sdrh /* Construct an expression node for a unary postfix operator 912b7916a78Sdrh */ 913b7916a78Sdrh static void spanUnaryPostfix( 914b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 915b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 916b7916a78Sdrh int op, /* The operator */ 917b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 918b7916a78Sdrh Token *pPostOp /* The operand token for setting the span */ 919b7916a78Sdrh ){ 920b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 921b7916a78Sdrh pOut->zStart = pOperand->zStart; 922b7916a78Sdrh pOut->zEnd = &pPostOp->z[pPostOp->n]; 923e1b6a5b8Sdrh } 92433048c0bSdrh } 925b7916a78Sdrh 926b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} 927b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 9286a2fe093Sdrh 9296a51741dSdrh %include { 9306a51741dSdrh /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 9316a51741dSdrh ** unary TK_ISNULL or TK_NOTNULL expression. */ 9326a51741dSdrh static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 9336a51741dSdrh sqlite3 *db = pParse->db; 9346a51741dSdrh if( db->mallocFailed==0 && pY->op==TK_NULL ){ 9355e17e8b7Sshaneh pA->op = (u8)op; 9366a51741dSdrh sqlite3ExprDelete(db, pA->pRight); 9376a51741dSdrh pA->pRight = 0; 9386a51741dSdrh } 9396a51741dSdrh } 9406a51741dSdrh } 9416a51741dSdrh 9426a2fe093Sdrh // expr1 IS expr2 9436a2fe093Sdrh // expr1 IS NOT expr2 9446a2fe093Sdrh // 9456a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2 9466a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT. 9476a2fe093Sdrh // 9486a2fe093Sdrh expr(A) ::= expr(X) IS expr(Y). { 9496a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_IS,&X,&Y); 9506a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL); 9516a2fe093Sdrh } 9526a2fe093Sdrh expr(A) ::= expr(X) IS NOT expr(Y). { 9536a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y); 9546a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL); 9556a2fe093Sdrh } 956b7916a78Sdrh 957b7916a78Sdrh %include { 958b7916a78Sdrh /* Construct an expression node for a unary prefix operator 959b7916a78Sdrh */ 960b7916a78Sdrh static void spanUnaryPrefix( 961b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 962b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 963b7916a78Sdrh int op, /* The operator */ 964b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 965b7916a78Sdrh Token *pPreOp /* The operand token for setting the span */ 966b7916a78Sdrh ){ 967b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 968b7916a78Sdrh pOut->zStart = pPreOp->z; 969b7916a78Sdrh pOut->zEnd = pOperand->zEnd; 97033048c0bSdrh } 97181a20f21Sdrh } 972b7916a78Sdrh 973b7916a78Sdrh 974b7916a78Sdrh 975b7916a78Sdrh expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 976b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 9777ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT] 978b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);} 9797ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT] 980b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);} 981b7916a78Sdrh 9822e3a1f16Sdrh %type between_op {int} 9832e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 9842e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 9852e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 986b7916a78Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); 987b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); 988b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); 989b7916a78Sdrh if( A.pExpr ){ 990b7916a78Sdrh A.pExpr->x.pList = pList; 99153f733c7Sdrh }else{ 992633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 99353f733c7Sdrh } 994b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 995b7916a78Sdrh A.zStart = W.zStart; 996b7916a78Sdrh A.zEnd = Y.zEnd; 997fef5208cSdrh } 9983e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 9992e3a1f16Sdrh %type in_op {int} 10002e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 10012e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 10022e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 1003094430ebSdrh if( Y==0 ){ 1004473c1bf2Sdan /* Expressions of the form 1005473c1bf2Sdan ** 1006473c1bf2Sdan ** expr1 IN () 1007473c1bf2Sdan ** expr1 NOT IN () 1008473c1bf2Sdan ** 1009473c1bf2Sdan ** simplify to constants 0 (false) and 1 (true), respectively, 1010473c1bf2Sdan ** regardless of the value of expr1. 1011473c1bf2Sdan */ 1012094430ebSdrh A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]); 1013094430ebSdrh sqlite3ExprDelete(pParse->db, X.pExpr); 1014094430ebSdrh }else{ 1015b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1016b7916a78Sdrh if( A.pExpr ){ 1017b7916a78Sdrh A.pExpr->x.pList = Y; 1018b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 1019d5d56523Sdanielk1977 }else{ 1020633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1021d5d56523Sdanielk1977 } 1022b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1023094430ebSdrh } 1024b7916a78Sdrh A.zStart = X.zStart; 1025b7916a78Sdrh A.zEnd = &E.z[E.n]; 1026fef5208cSdrh } 102751522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 1028b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); 1029b7916a78Sdrh if( A.pExpr ){ 1030b7916a78Sdrh A.pExpr->x.pSelect = X; 1031b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1032b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 103353f733c7Sdrh }else{ 1034633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 103553f733c7Sdrh } 1036b7916a78Sdrh A.zStart = B.z; 1037b7916a78Sdrh A.zEnd = &E.z[E.n]; 103851522cd3Sdrh } 10392e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 1040b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1041b7916a78Sdrh if( A.pExpr ){ 1042b7916a78Sdrh A.pExpr->x.pSelect = Y; 1043b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1044b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 104553f733c7Sdrh }else{ 1046633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 104753f733c7Sdrh } 1048b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1049b7916a78Sdrh A.zStart = X.zStart; 1050b7916a78Sdrh A.zEnd = &E.z[E.n]; 1051fef5208cSdrh } 105274ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 105317435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 1054b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1055b7916a78Sdrh if( A.pExpr ){ 1056b7916a78Sdrh A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 1057b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1058b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 105953f733c7Sdrh }else{ 1060633e6d57Sdrh sqlite3SrcListDelete(pParse->db, pSrc); 106153f733c7Sdrh } 1062b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1063b7916a78Sdrh A.zStart = X.zStart; 1064b7916a78Sdrh A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; 106523b2db23Sdrh } 106651522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 1067b7916a78Sdrh Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); 106851522cd3Sdrh if( p ){ 10696ab3a2ecSdanielk1977 p->x.pSelect = Y; 1070b7916a78Sdrh ExprSetProperty(p, EP_xIsSelect); 1071b7916a78Sdrh sqlite3ExprSetHeight(pParse, p); 107253f733c7Sdrh }else{ 1073633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 107451522cd3Sdrh } 1075b7916a78Sdrh A.zStart = B.z; 1076b7916a78Sdrh A.zEnd = &E.z[E.n]; 107751522cd3Sdrh } 1078154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1079fef5208cSdrh 108017a7f8ddSdrh /* CASE expressions */ 108117a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 1082b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); 1083b7916a78Sdrh if( A.pExpr ){ 1084b7916a78Sdrh A.pExpr->x.pList = Y; 1085b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 108653f733c7Sdrh }else{ 1087633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 108853f733c7Sdrh } 1089b7916a78Sdrh A.zStart = C.z; 1090b7916a78Sdrh A.zEnd = &E.z[E.n]; 109117a7f8ddSdrh } 109217a7f8ddSdrh %type case_exprlist {ExprList*} 1093633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 109417a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 1095b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, Y.pExpr); 1096b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 109717a7f8ddSdrh } 109817a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 1099b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, Y.pExpr); 1100b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 110117a7f8ddSdrh } 110217a7f8ddSdrh %type case_else {Expr*} 1103633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 1104b7916a78Sdrh case_else(A) ::= ELSE expr(X). {A = X.pExpr;} 110517a7f8ddSdrh case_else(A) ::= . {A = 0;} 110617a7f8ddSdrh %type case_operand {Expr*} 1107633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 1108b7916a78Sdrh case_operand(A) ::= expr(X). {A = X.pExpr;} 110917a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1110348784efSdrh 1111348784efSdrh %type exprlist {ExprList*} 1112633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 11139245c243Sdrh %type nexprlist {ExprList*} 1114633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1115348784efSdrh 11169245c243Sdrh exprlist(A) ::= nexprlist(X). {A = X;} 11179245c243Sdrh exprlist(A) ::= . {A = 0;} 111817435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 1119b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 112017435752Sdrh nexprlist(A) ::= expr(Y). 1121b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} 11229245c243Sdrh 1123cce7d176Sdrh 1124382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1125382c0247Sdrh // 1126d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 112777e96d14Sdrh ON nm(Y) LP idxlist(Z) RP(E). { 112817435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 112917435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 11304d91a701Sdrh &S, &E, SQLITE_SO_ASC, NE); 11319cfcf5d4Sdrh } 1132717e6402Sdrh 1133717e6402Sdrh %type uniqueflag {int} 11349cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 11359cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1136348784efSdrh 11370202b29eSdanielk1977 %type idxlist {ExprList*} 1138633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 11390202b29eSdanielk1977 %type idxlist_opt {ExprList*} 1140633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1141348784efSdrh 1142c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 1143c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 1144200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 11450202b29eSdanielk1977 Expr *p = 0; 11460202b29eSdanielk1977 if( C.n>0 ){ 1147b7916a78Sdrh p = sqlite3Expr(pParse->db, TK_COLUMN, 0); 11488342e49fSdrh sqlite3ExprSetCollByToken(pParse, p, &C); 11490202b29eSdanielk1977 } 1150b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, p); 1151b7916a78Sdrh sqlite3ExprListSetName(pParse,A,&Y,1); 1152b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1153b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 11540202b29eSdanielk1977 } 1155200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 11560202b29eSdanielk1977 Expr *p = 0; 11570202b29eSdanielk1977 if( C.n>0 ){ 115817435752Sdrh p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); 11598342e49fSdrh sqlite3ExprSetCollByToken(pParse, p, &C); 11600202b29eSdanielk1977 } 1161b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, p); 1162b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &Y, 1); 1163b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1164b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 11650202b29eSdanielk1977 } 11660202b29eSdanielk1977 1167a34001c9Sdrh %type collate {Token} 1168a34001c9Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 116939002505Sdanielk1977 collate(C) ::= COLLATE ids(X). {C = X;} 1170a34001c9Sdrh 1171348784efSdrh 11728aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1173382c0247Sdrh // 11744d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1175982cef7eSdrh 1176382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1177382c0247Sdrh // 1178154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1179fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 118074161705Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse);} 118174161705Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} 1182fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1183154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1184f57b14a6Sdrh 1185382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1186382c0247Sdrh // 118713d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 118891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1189ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1190ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1191ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1192ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1193ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1194ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1195ada2ee0dSdrh 1196a3eb4b44Sdrh nmnum(A) ::= plus_num(X). {A = X;} 1197a3eb4b44Sdrh nmnum(A) ::= nm(X). {A = X;} 1198ada2ee0dSdrh nmnum(A) ::= ON(X). {A = X;} 1199ada2ee0dSdrh nmnum(A) ::= DELETE(X). {A = X;} 12006da861beSdrh nmnum(A) ::= DEFAULT(X). {A = X;} 1201154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 12028395b7b6Sdrh plus_num(A) ::= PLUS number(X). {A = X;} 12038395b7b6Sdrh plus_num(A) ::= number(X). {A = X;} 1204f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1205fd405314Sdrh number(A) ::= INTEGER|FLOAT(X). {A = X;} 1206c3f9bad2Sdanielk1977 1207c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1208f0f258b1Sdrh 1209b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1210b7f9164eSdrh 1211d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 12124b59ab5eSdrh Token all; 12134b59ab5eSdrh all.z = A.z; 1214b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 12154adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1216f0f258b1Sdrh } 1217f0f258b1Sdrh 1218fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1219fdd48a76Sdrh trigger_time(C) trigger_event(D) 122060218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 122160218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 12223df6b257Sdanielk1977 A = (Z.n==0?B:Z); 1223c3f9bad2Sdanielk1977 } 1224c3f9bad2Sdanielk1977 1225c3f9bad2Sdanielk1977 %type trigger_time {int} 1226c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1227c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1228c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1229c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1230c3f9bad2Sdanielk1977 1231ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1232633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1233fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 123474ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 1235c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 1236c3f9bad2Sdanielk1977 123760218d2aSdrh foreach_clause ::= . 123860218d2aSdrh foreach_clause ::= FOR EACH ROW. 1239c3f9bad2Sdanielk1977 1240c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1241633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1242c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1243b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1244c3f9bad2Sdanielk1977 1245c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1246633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 1247187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { 124881238966Sdrh assert( Y!=0 ); 124981238966Sdrh Y->pLast->pNext = X; 1250187e4c6aSdrh Y->pLast = X; 1251187e4c6aSdrh A = Y; 1252a69d9168Sdrh } 125381238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { 125481238966Sdrh assert( X!=0 ); 125581238966Sdrh X->pLast = X; 125681238966Sdrh A = X; 125781238966Sdrh } 1258c3f9bad2Sdanielk1977 1259b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements 1260b1819a0bSdrh // within a trigger. The table to INSERT, UPDATE, or DELETE is always in 1261b1819a0bSdrh // the same database as the table that the trigger fires on. 1262b1819a0bSdrh // 1263b1819a0bSdrh %type trnm {Token} 1264b1819a0bSdrh trnm(A) ::= nm(X). {A = X;} 1265b1819a0bSdrh trnm(A) ::= nm DOT nm(X). { 1266b1819a0bSdrh A = X; 1267b1819a0bSdrh sqlite3ErrorMsg(pParse, 1268b1819a0bSdrh "qualified table names are not allowed on INSERT, UPDATE, and DELETE " 1269b1819a0bSdrh "statements within triggers"); 1270b1819a0bSdrh } 1271b1819a0bSdrh 1272b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE 1273b1819a0bSdrh // statements within triggers. We make a specific error message for this 1274b1819a0bSdrh // since it is an exception to the default grammar rules. 1275b1819a0bSdrh // 1276b1819a0bSdrh tridxby ::= . 1277b1819a0bSdrh tridxby ::= INDEXED BY nm. { 1278b1819a0bSdrh sqlite3ErrorMsg(pParse, 1279b1819a0bSdrh "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " 1280b1819a0bSdrh "within triggers"); 1281b1819a0bSdrh } 1282b1819a0bSdrh tridxby ::= NOT INDEXED. { 1283b1819a0bSdrh sqlite3ErrorMsg(pParse, 1284b1819a0bSdrh "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " 1285b1819a0bSdrh "within triggers"); 1286b1819a0bSdrh } 1287b1819a0bSdrh 1288b1819a0bSdrh 1289b1819a0bSdrh 1290c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1291633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1292c3f9bad2Sdanielk1977 // UPDATE 1293b1819a0bSdrh trigger_cmd(A) ::= 1294b1819a0bSdrh UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). 129517435752Sdrh { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1296c3f9bad2Sdanielk1977 1297c3f9bad2Sdanielk1977 // INSERT 1298b1819a0bSdrh trigger_cmd(A) ::= 12997b113babSdrh insert_cmd(R) INTO trnm(X) inscollist_opt(F) valuelist(Y). 13007b113babSdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y.pList, Y.pSelect, R);} 1301c3f9bad2Sdanielk1977 1302b1819a0bSdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S). 130317435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} 1304c3f9bad2Sdanielk1977 1305c3f9bad2Sdanielk1977 // DELETE 1306b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). 130717435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1308c3f9bad2Sdanielk1977 1309c3f9bad2Sdanielk1977 // SELECT 131017435752Sdrh trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1311c3f9bad2Sdanielk1977 13126f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 13134b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1314b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); 1315b7916a78Sdrh if( A.pExpr ){ 1316b7916a78Sdrh A.pExpr->affinity = OE_Ignore; 13174b59ab5eSdrh } 1318b7916a78Sdrh A.zStart = X.z; 1319b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 13208aa34ae0Sdrh } 132174ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 1322b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); 1323b7916a78Sdrh if( A.pExpr ) { 1324b7916a78Sdrh A.pExpr->affinity = (char)T; 13254b59ab5eSdrh } 1326b7916a78Sdrh A.zStart = X.z; 1327b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 13288aa34ae0Sdrh } 1329154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1330b7f9164eSdrh 133174ad7fe9Sdrh %type raisetype {int} 133274ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 133374ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 133474ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 133574ad7fe9Sdrh 13366f34903eSdanielk1977 1337c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1338b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1339fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1340fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1341c3f9bad2Sdanielk1977 } 1342154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1343113088ecSdrh 1344113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1345fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1346f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1347b7916a78Sdrh sqlite3Attach(pParse, F.pExpr, D.pExpr, K); 13481c2d8414Sdrh } 1349fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1350b7916a78Sdrh sqlite3Detach(pParse, D.pExpr); 1351fdbcdee5Sdrh } 1352fdbcdee5Sdrh 1353f744bb56Sdanielk1977 %type key_opt {Expr*} 1354633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1355f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1356b7916a78Sdrh key_opt(A) ::= KEY expr(X). { A = X.pExpr; } 1357113088ecSdrh 1358113088ecSdrh database_kw_opt ::= DATABASE. 1359113088ecSdrh database_kw_opt ::= . 1360fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 13614343fea2Sdrh 13624343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 13634343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 13644343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 13654343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1366154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 13679fd2a9a0Sdanielk1977 13689f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 13699f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 13709f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 13719f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 13729f18e8a0Sdrh %endif 13739f18e8a0Sdrh 13749fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 13759fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 13769fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 13779fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 13789fd2a9a0Sdanielk1977 } 137919a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 138019a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 138119a8e7e8Sdanielk1977 } 138219a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 1383d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 138419a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 138519a8e7e8Sdanielk1977 } 138619a8e7e8Sdanielk1977 kwcolumn_opt ::= . 138719a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1388154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1389e09daa90Sdrh 1390e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1391e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1392b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1393b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1394b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E) 1395b421b894Sdrh nm(X) dbnm(Y) USING nm(Z). { 1396b421b894Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E); 1397b9bb7c18Sdrh } 1398e09daa90Sdrh vtabarglist ::= vtabarg. 1399e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1400b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1401b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1402b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1403b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1404b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1405b9bb7c18Sdrh anylist ::= . 1406aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1407aaac8b4eSdrh anylist ::= anylist ANY. 1408154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 1409