1348784efSdrh /* 2b19a2bc6Sdrh ** 2001 September 15 3348784efSdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 6348784efSdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 10348784efSdrh ** 11348784efSdrh ************************************************************************* 12348784efSdrh ** This file contains SQLite's grammar for SQL. Process this file 13348784efSdrh ** using the lemon parser generator to generate C code that runs 14348784efSdrh ** the parser. Lemon will also generate a header file containing 15348784efSdrh ** numeric codes for all of the tokens. 16348784efSdrh */ 17487e262fSdrh 18487e262fSdrh // All token codes are small integers with #defines that begin with "TK_" 19348784efSdrh %token_prefix TK_ 20487e262fSdrh 21487e262fSdrh // The type of the data attached to each token is Token. This is also the 22487e262fSdrh // default type for non-terminals. 23487e262fSdrh // 24348784efSdrh %token_type {Token} 25f57b14a6Sdrh %default_type {Token} 26487e262fSdrh 27487e262fSdrh // The generated parser function takes a 4th argument as follows: 28348784efSdrh %extra_argument {Parse *pParse} 29487e262fSdrh 30487e262fSdrh // This code runs whenever there is a syntax error 31487e262fSdrh // 32348784efSdrh %syntax_error { 33128255fcSdrh UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ 3455176259Sdrh assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ 354adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 36b86ccfb2Sdrh } 378fc3345fSdrh %stack_overflow { 38128255fcSdrh UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ 398fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 408fc3345fSdrh } 41487e262fSdrh 42487e262fSdrh // The name of the generated procedure that implements the parser 43487e262fSdrh // is as follows: 444adee20fSdanielk1977 %name sqlite3Parser 45487e262fSdrh 46487e262fSdrh // The following text is included near the beginning of the C source 47487e262fSdrh // code file that implements the parser. 48487e262fSdrh // 49348784efSdrh %include { 50348784efSdrh #include "sqliteInt.h" 519bbca4c1Sdrh 529bbca4c1Sdrh /* 53d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 54d3ec02d3Sdrh ** automaton. 55d3ec02d3Sdrh */ 56d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 57d3ec02d3Sdrh 58d3ec02d3Sdrh /* 598a415d37Sdrh ** Make yytestcase() the same as testcase() 608a415d37Sdrh */ 618a415d37Sdrh #define yytestcase(X) testcase(X) 628a415d37Sdrh 638a415d37Sdrh /* 64ad3cab52Sdrh ** An instance of this structure holds information about the 65ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 669bbca4c1Sdrh */ 67ad3cab52Sdrh struct LimitVal { 68a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 69a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 70ad3cab52Sdrh }; 71c3f9bad2Sdanielk1977 72c3f9bad2Sdanielk1977 /* 732e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 742e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 752e3a1f16Sdrh */ 762e3a1f16Sdrh struct LikeOp { 77b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 78f9df4498Sdrh int bNot; /* True if the NOT keyword is present */ 792e3a1f16Sdrh }; 802e3a1f16Sdrh 812e3a1f16Sdrh /* 82ad3cab52Sdrh ** An instance of the following structure describes the event of a 83ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 84ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 85ad3cab52Sdrh ** 86ad3cab52Sdrh ** UPDATE ON (a,b,c) 87ad3cab52Sdrh ** 88ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 89c3f9bad2Sdanielk1977 */ 90ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 91caec2f12Sdrh 9225d6543dSdrh /* 9325d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 9425d6543dSdrh */ 9525d6543dSdrh struct AttachKey { int type; Token key; }; 9625d6543dSdrh 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;} 166*81eba73eSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E1). { 167*81eba73eSdrh sqlite3EndTable(pParse,&X,&E1,&E1,0,0); 168*81eba73eSdrh } 169*81eba73eSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E1) 170*81eba73eSdrh WITH LP idlist(Z) RP(E2). { 171*81eba73eSdrh sqlite3EndTable(pParse,&X,&E1,&E2,Z,0); 172969fa7c1Sdrh } 173969fa7c1Sdrh create_table_args ::= AS select(S). { 174*81eba73eSdrh sqlite3EndTable(pParse,0,0,0,0,S); 175633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 176969fa7c1Sdrh } 177348784efSdrh columnlist ::= columnlist COMMA column. 178348784efSdrh columnlist ::= column. 179348784efSdrh 180487e262fSdrh // A "column" is a complete description of a single column in a 181487e262fSdrh // CREATE TABLE statement. This includes the column name, its 182487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 183487e262fSdrh // NOT NULL and so forth. 184348784efSdrh // 18519a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 18619a8e7e8Sdanielk1977 A.z = X.z; 187b27b7f5dSdrh A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 18819a8e7e8Sdanielk1977 } 18919a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 19019a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 19119a8e7e8Sdanielk1977 A = X; 1924dc330ddSdrh pParse->constraintName.n = 0; 19319a8e7e8Sdanielk1977 } 19419a8e7e8Sdanielk1977 195c4a3c779Sdrh 196c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 197c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 198c4a3c779Sdrh // 199982cef7eSdrh %type id {Token} 200f18543caSdrh id(A) ::= ID(X). {A = X;} 201296a483cSdrh id(A) ::= INDEXED(X). {A = X;} 2020bd1f4eaSdrh 20334e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 20434e33bb8Sdrh // fallback to ID if they will not parse as their original value. 20534e33bb8Sdrh // This obviates the need for the "id" nonterminal. 20634e33bb8Sdrh // 2070bd1f4eaSdrh %fallback ID 2081da40a38Sdan ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 2091da40a38Sdan CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 2101da40a38Sdan IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 211db15bcd5Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK 212*81eba73eSdrh SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH 213b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 214b7f9164eSdrh EXCEPT INTERSECT UNION 215154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 216a073384fSdrh REINDEX RENAME CTIME_KW IF 217b7f9164eSdrh . 218e09daa90Sdrh %wildcard ANY. 219c4a3c779Sdrh 220f7b5496eSdrh // Define operator precedence early so that this is the first occurrence 2212d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2222d3917daSdrh // causes them to be assigned integer values that are close together, 2232d3917daSdrh // which keeps parser tables smaller. 2242d3917daSdrh // 225f2bc013cSdrh // The token values assigned to these symbols is determined by the order 226f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 227f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 228f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 229f2bc013cSdrh // constraint. 230f2bc013cSdrh // 2312d3917daSdrh %left OR. 2322d3917daSdrh %left AND. 2332d3917daSdrh %right NOT. 23403bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2359a43267bSdrh %left GT LE LT GE. 2367c6303c0Sdanielk1977 %right ESCAPE. 2372d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2382d3917daSdrh %left PLUS MINUS. 2392d3917daSdrh %left STAR SLASH REM. 240a34001c9Sdrh %left CONCAT. 241a34001c9Sdrh %left COLLATE. 2427ba5bc5bSdrh %right BITNOT. 2432d3917daSdrh 244c4a3c779Sdrh // And "ids" is an identifer-or-string. 245c4a3c779Sdrh // 246c4a3c779Sdrh %type ids {Token} 247fd405314Sdrh ids(A) ::= ID|STRING(X). {A = X;} 248c4a3c779Sdrh 2495ad1a6c8Sdrh // The name of a column or table can be any of the following: 2505ad1a6c8Sdrh // 2515ad1a6c8Sdrh %type nm {Token} 252296a483cSdrh nm(A) ::= id(X). {A = X;} 2535ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2545ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2555ad1a6c8Sdrh 256487e262fSdrh // A typetoken is really one or more tokens that form a type name such 257487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 258487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 259487e262fSdrh // 260487e262fSdrh %type typetoken {Token} 261382c0247Sdrh type ::= . 262487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 263487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 264487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 265487e262fSdrh A.z = X.z; 266b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 267487e262fSdrh } 268487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 269487e262fSdrh A.z = X.z; 270b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 271487e262fSdrh } 272382c0247Sdrh %type typename {Token} 273382c0247Sdrh typename(A) ::= ids(X). {A = X;} 274b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 27560218d2aSdrh signed ::= plus_num. 27660218d2aSdrh signed ::= minus_num. 277487e262fSdrh 278487e262fSdrh // "carglist" is a list of additional constraints that come after the 279487e262fSdrh // column name and column type in a CREATE TABLE statement. 280487e262fSdrh // 2814dc330ddSdrh carglist ::= carglist ccons. 282348784efSdrh carglist ::= . 2834dc330ddSdrh ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 284b7916a78Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 285b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 286b7916a78Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 287f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 288b7916a78Sdrh ExprSpan v; 289b7916a78Sdrh v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); 290b7916a78Sdrh v.zStart = A.z; 291b7916a78Sdrh v.zEnd = X.zEnd; 292b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2937977a17fSdanielk1977 } 2942b7acc35Sdrh ccons ::= DEFAULT id(X). { 295b7916a78Sdrh ExprSpan v; 296b7916a78Sdrh spanExpr(&v, pParse, TK_STRING, &X); 297b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2987977a17fSdanielk1977 } 299348784efSdrh 300382c0247Sdrh // In addition to the type name, we also care about the primary key and 301382c0247Sdrh // UNIQUE constraints. 302348784efSdrh // 3030d316a40Sdrh ccons ::= NULL onconf. 3044adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 305fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 306fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 3078a9789b6Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 308b7916a78Sdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} 309c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 3104adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 3114adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 31239002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 31304738cb9Sdrh 314205f48e6Sdrh // The optional AUTOINCREMENT keyword 315205f48e6Sdrh %type autoinc {int} 316205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3172958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 318205f48e6Sdrh 319c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 320c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 321c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 322c2eef3b3Sdrh // check fails. 32304738cb9Sdrh // 324c2eef3b3Sdrh %type refargs {int} 325fcf486c3Sdrh refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */} 32650af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; } 327c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 328c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 329c29c5aa1Sdrh refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; } 330c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 331c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 332c2eef3b3Sdrh %type refact {int} 333fcf486c3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */} 334fcf486c3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */} 335fcf486c3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */} 336fcf486c3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 337fcf486c3Sdrh refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 338c2eef3b3Sdrh %type defer_subclause {int} 3391da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 340c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 341c2eef3b3Sdrh %type init_deferred_pred_opt {int} 342c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 343c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 344c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 345348784efSdrh 34619a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 347ab35eaedSdrh conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 348ab35eaedSdrh conslist ::= conslist tconscomma tcons. 349ab35eaedSdrh conslist ::= tcons. 350ab35eaedSdrh tconscomma ::= COMMA. {pParse->constraintName.n = 0;} 351ab35eaedSdrh tconscomma ::= . 352ab35eaedSdrh tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 353f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 354fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3559cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3568a9789b6Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 357b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 358b7916a78Sdrh {sqlite3AddCheckConstraint(pParse,E.pExpr);} 359c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 360c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3614adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3624adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 363c2eef3b3Sdrh } 364c2eef3b3Sdrh %type defer_subclause_opt {int} 365c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 366c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3679cfcf5d4Sdrh 3689cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3699cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3709cfcf5d4Sdrh // 3719cfcf5d4Sdrh %type onconf {int} 3725eff7cf0Sshane %type orconf {u8} 3731c92853dSdrh %type resolvetype {int} 3741c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3751c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3761c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3775eff7cf0Sshane orconf(A) ::= OR resolvetype(X). {A = (u8)X;} 37874ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3791c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3801c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 381348784efSdrh 382382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 383348784efSdrh // 384a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 385a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 386a8858103Sdanielk1977 } 387a073384fSdrh %type ifexists {int} 388a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 389a073384fSdrh ifexists(A) ::= . {A = 0;} 390348784efSdrh 391a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 392a76b5dfcSdrh // 393b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 394d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { 395fdd48a76Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 396a76b5dfcSdrh } 397a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 398a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 399a76b5dfcSdrh } 400154d4b24Sdrh %endif SQLITE_OMIT_VIEW 401a76b5dfcSdrh 402382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 403348784efSdrh // 4049bb61fe7Sdrh cmd ::= select(X). { 4057d10d5a6Sdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0}; 4067d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 4077e02e5e6Sdrh sqlite3ExplainBegin(pParse->pVdbe); 4087e02e5e6Sdrh sqlite3ExplainSelect(pParse->pVdbe, X); 4097e02e5e6Sdrh sqlite3ExplainFinish(pParse->pVdbe); 410633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 4119bb61fe7Sdrh } 412efb7251dSdrh 4139bb61fe7Sdrh %type select {Select*} 414633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 41582c3d636Sdrh %type oneselect {Select*} 416633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4179bb61fe7Sdrh 41882c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 419b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4200a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 421daffd0e5Sdrh if( Z ){ 422b27b7f5dSdrh Z->op = (u8)Y; 42382c3d636Sdrh Z->pPrior = X; 424d58d3278Sdrh if( Y!=TK_ALL ) pParse->hasCompound = 1; 42543b78826Sdrh }else{ 426633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 427daffd0e5Sdrh } 42882c3d636Sdrh A = Z; 42982c3d636Sdrh } 4300a36c57eSdrh %type multiselect_op {int} 43174ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 4320a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 433fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 434154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 43582c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 4369bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 43717435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 4389bb61fe7Sdrh } 4399bb61fe7Sdrh 4409bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 4419bb61fe7Sdrh // present and false (0) if it is not. 4429bb61fe7Sdrh // 443832ee3d4Sdrh %type distinct {u16} 444832ee3d4Sdrh distinct(A) ::= DISTINCT. {A = SF_Distinct;} 445fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 446efb7251dSdrh distinct(A) ::= . {A = 0;} 447348784efSdrh 4489bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 4497c917d19Sdrh // values of the SELECT statement. The "*" in statements like 4507c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 4517c917d19Sdrh // opcode of TK_ALL. 4529bb61fe7Sdrh // 453348784efSdrh %type selcollist {ExprList*} 454633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 455348784efSdrh %type sclp {ExprList*} 456633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 457348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 458348784efSdrh sclp(A) ::= . {A = 0;} 45901f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 460b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, X.pExpr); 461b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 462b7916a78Sdrh sqlite3ExprListSetSpan(pParse,A,&X); 46301f3f253Sdrh } 4647c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 465b7916a78Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); 466b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, p); 4677c917d19Sdrh } 468e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { 469e54a62adSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); 47017435752Sdrh Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 47117435752Sdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 472b7916a78Sdrh A = sqlite3ExprListAppend(pParse,P, pDot); 47354473229Sdrh } 47401f3f253Sdrh 47501f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 47601f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 47701f3f253Sdrh // 47801f3f253Sdrh %type as {Token} 4795ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 4805ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 48101f3f253Sdrh as(X) ::= . {X.n = 0;} 4829bb61fe7Sdrh 483348784efSdrh 484ad3cab52Sdrh %type seltablist {SrcList*} 485633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 486ad3cab52Sdrh %type stl_prefix {SrcList*} 487633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 488ad3cab52Sdrh %type from {SrcList*} 489633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 490348784efSdrh 49101f3f253Sdrh // A complete FROM clause. 49201f3f253Sdrh // 49317435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 49461dfc31dSdrh from(A) ::= FROM seltablist(X). { 49561dfc31dSdrh A = X; 49661dfc31dSdrh sqlite3SrcListShiftJoinType(A); 49761dfc31dSdrh } 49801f3f253Sdrh 49901f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 50001f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 50101f3f253Sdrh // 50201f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 50301f3f253Sdrh A = X; 504d3ec02d3Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; 50501f3f253Sdrh } 506348784efSdrh stl_prefix(A) ::= . {A = 0;} 507e9240418Sdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) 508e9240418Sdrh on_opt(N) using_opt(U). { 509b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 510b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 51101f3f253Sdrh } 51251522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 513fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP 514b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 515b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 51622f70c32Sdrh } 517fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 518fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 5199b87d7b9Sdanielk1977 if( X==0 && Z.n==0 && N==0 && U==0 ){ 520fbdc7f69Sdrh A = F; 521832ee3d4Sdrh }else if( F->nSrc==1 ){ 522832ee3d4Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,0,N,U); 523832ee3d4Sdrh if( A ){ 524832ee3d4Sdrh struct SrcList_item *pNew = &A->a[A->nSrc-1]; 525832ee3d4Sdrh struct SrcList_item *pOld = F->a; 526832ee3d4Sdrh pNew->zName = pOld->zName; 527832ee3d4Sdrh pNew->zDatabase = pOld->zDatabase; 5283c449c6bSdrh pNew->pSelect = pOld->pSelect; 529832ee3d4Sdrh pOld->zName = pOld->zDatabase = 0; 5303c449c6bSdrh pOld->pSelect = 0; 531832ee3d4Sdrh } 532832ee3d4Sdrh sqlite3SrcListDelete(pParse->db, F); 533fbdc7f69Sdrh }else{ 534fbdc7f69Sdrh Select *pSubquery; 535fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 536832ee3d4Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0,0); 537fbdc7f69Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 538fbdc7f69Sdrh } 539fbdc7f69Sdrh } 540154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 541b733d037Sdrh 542113088ecSdrh %type dbnm {Token} 543113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 544113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 545113088ecSdrh 54674ad7fe9Sdrh %type fullname {SrcList*} 547633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 54817435752Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 54974ad7fe9Sdrh 55001f3f253Sdrh %type joinop {int} 55101f3f253Sdrh %type joinop2 {int} 552fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 5534adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 5544adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 5555ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 5564adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 55701f3f253Sdrh 55801f3f253Sdrh %type on_opt {Expr*} 559633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 560b7916a78Sdrh on_opt(N) ::= ON expr(E). {N = E.pExpr;} 56101f3f253Sdrh on_opt(N) ::= . {N = 0;} 56201f3f253Sdrh 56385574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 56485574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 56585574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 56685574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 56785574e31Sdanielk1977 // in the token. 56885574e31Sdanielk1977 // 56985574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 570b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 57185574e31Sdanielk1977 // recognizes and interprets this as a special case. 57285574e31Sdanielk1977 // 57385574e31Sdanielk1977 %type indexed_opt {Token} 57485574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 57585574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 57685574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 57785574e31Sdanielk1977 57801f3f253Sdrh %type using_opt {IdList*} 579633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 580*81eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP. {U = L;} 58101f3f253Sdrh using_opt(U) ::= . {U = 0;} 58201f3f253Sdrh 58301f3f253Sdrh 584348784efSdrh %type orderby_opt {ExprList*} 585633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 586348784efSdrh %type sortlist {ExprList*} 587633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 588348784efSdrh 589348784efSdrh orderby_opt(A) ::= . {A = 0;} 590348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 5918395b7b6Sdrh sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). { 5928395b7b6Sdrh A = sqlite3ExprListAppend(pParse,X,Y.pExpr); 593b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 594348784efSdrh } 5958395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). { 5968395b7b6Sdrh A = sqlite3ExprListAppend(pParse,0,Y.pExpr); 597d3ec02d3Sdrh if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; 598348784efSdrh } 599348784efSdrh 600348784efSdrh %type sortorder {int} 601348784efSdrh 6028e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 6038e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 6048e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 605348784efSdrh 6062282792aSdrh %type groupby_opt {ExprList*} 607633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 6082282792aSdrh groupby_opt(A) ::= . {A = 0;} 6099245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 6102282792aSdrh 6112282792aSdrh %type having_opt {Expr*} 612633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 6132282792aSdrh having_opt(A) ::= . {A = 0;} 614b7916a78Sdrh having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} 6152282792aSdrh 616ad3cab52Sdrh %type limit_opt {struct LimitVal} 61715926590Sdrh 61815926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 61915926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 62015926590Sdrh // rule for SELECT statements. As soon as the rule that create the 62115926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 62215926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 62315926590Sdrh // except as a transient. So there is never anything to destroy. 62415926590Sdrh // 62515926590Sdrh //%destructor limit_opt { 626633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 627633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 62815926590Sdrh //} 629a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 630b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 631a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 632b7916a78Sdrh {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 633a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 634b7916a78Sdrh {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 6359bbca4c1Sdrh 636382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 637382c0247Sdrh // 638273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 639931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 640931577f1Sdrh orderby_opt(O) limit_opt(L). { 641b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 64249ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 6434281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6444281bd42Sshane } 6454281bd42Sshane %endif 646273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6474281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 6484281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6494281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6504281bd42Sshane } 6514281bd42Sshane %endif 652348784efSdrh 653348784efSdrh %type where_opt {Expr*} 654633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 655348784efSdrh 656348784efSdrh where_opt(A) ::= . {A = 0;} 657b7916a78Sdrh where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 658348784efSdrh 659382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 660382c0247Sdrh // 661273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 662e9240418Sdrh cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) 663e9240418Sdrh orderby_opt(O) limit_opt(L). { 664b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 665b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 66649ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 6674281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6684281bd42Sshane } 6694281bd42Sshane %endif 670273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 671e9240418Sdrh cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) 672e9240418Sdrh where_opt(W). { 6734281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6744281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 6754281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6764281bd42Sshane } 6774281bd42Sshane %endif 678348784efSdrh 679f8db1bc0Sdrh %type setlist {ExprList*} 680633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 681f8db1bc0Sdrh 682b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). { 683b7916a78Sdrh A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); 684b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 685b7916a78Sdrh } 686b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 687b7916a78Sdrh A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 688b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 689b7916a78Sdrh } 690348784efSdrh 691382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 692382c0247Sdrh // 6937b113babSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) valuelist(Y). 6947b113babSdrh {sqlite3Insert(pParse, X, Y.pList, Y.pSelect, F, R);} 69574ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 69674ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 697147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 698147d0cccSdrh {sqlite3Insert(pParse, X, 0, 0, F, R);} 699348784efSdrh 7005eff7cf0Sshane %type insert_cmd {u8} 701fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 702fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 703fa86c412Sdrh 7047b113babSdrh // A ValueList is either a single VALUES clause or a comma-separated list 7057b113babSdrh // of VALUES clauses. If it is a single VALUES clause then the 7067b113babSdrh // ValueList.pList field points to the expression list of that clause. 7077b113babSdrh // If it is a list of VALUES clauses, then those clauses are transformed 7087b113babSdrh // into a set of SELECT statements without FROM clauses and connected by 7097b113babSdrh // UNION ALL and the ValueList.pSelect points to the right-most SELECT in 7107b113babSdrh // that compound. 7117b113babSdrh %type valuelist {struct ValueList} 7127b113babSdrh %destructor valuelist { 7137b113babSdrh sqlite3ExprListDelete(pParse->db, $$.pList); 7147b113babSdrh sqlite3SelectDelete(pParse->db, $$.pSelect); 7157b113babSdrh } 7167b113babSdrh valuelist(A) ::= VALUES LP nexprlist(X) RP. { 7177b113babSdrh A.pList = X; 7187b113babSdrh A.pSelect = 0; 7197b113babSdrh } 72076aad0d1Sdrh 72176aad0d1Sdrh // Since a list of VALUEs is inplemented as a compound SELECT, we have 72276aad0d1Sdrh // to disable the value list option if compound SELECTs are disabled. 72376aad0d1Sdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 7247b113babSdrh valuelist(A) ::= valuelist(X) COMMA LP exprlist(Y) RP. { 7257b113babSdrh Select *pRight = sqlite3SelectNew(pParse, Y, 0, 0, 0, 0, 0, 0, 0, 0); 7267b113babSdrh if( X.pList ){ 7277b113babSdrh X.pSelect = sqlite3SelectNew(pParse, X.pList, 0, 0, 0, 0, 0, 0, 0, 0); 7287b113babSdrh X.pList = 0; 7297b113babSdrh } 7307b113babSdrh A.pList = 0; 7317b113babSdrh if( X.pSelect==0 || pRight==0 ){ 7327b113babSdrh sqlite3SelectDelete(pParse->db, pRight); 7337b113babSdrh sqlite3SelectDelete(pParse->db, X.pSelect); 7347b113babSdrh A.pSelect = 0; 7357b113babSdrh }else{ 7367b113babSdrh pRight->op = TK_ALL; 7377b113babSdrh pRight->pPrior = X.pSelect; 7387b113babSdrh pRight->selFlags |= SF_Values; 7397b113babSdrh pRight->pPrior->selFlags |= SF_Values; 7407b113babSdrh A.pSelect = pRight; 7417b113babSdrh } 7427b113babSdrh } 74376aad0d1Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 744348784efSdrh 745967e8b73Sdrh %type inscollist_opt {IdList*} 746633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 747*81eba73eSdrh %type idlist {IdList*} 748*81eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);} 749348784efSdrh 750967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 751*81eba73eSdrh inscollist_opt(A) ::= LP idlist(X) RP. {A = X;} 752*81eba73eSdrh idlist(A) ::= idlist(X) COMMA nm(Y). 75317435752Sdrh {A = sqlite3IdListAppend(pParse->db,X,&Y);} 754*81eba73eSdrh idlist(A) ::= nm(Y). 75517435752Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y);} 756348784efSdrh 757382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 758382c0247Sdrh // 759348784efSdrh 760b7916a78Sdrh %type expr {ExprSpan} 761b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 762b7916a78Sdrh %type term {ExprSpan} 763b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 764b7916a78Sdrh 765b7916a78Sdrh %include { 766b7916a78Sdrh /* This is a utility routine used to set the ExprSpan.zStart and 767b7916a78Sdrh ** ExprSpan.zEnd values of pOut so that the span covers the complete 768b7916a78Sdrh ** range of text beginning with pStart and going to the end of pEnd. 769b7916a78Sdrh */ 770b7916a78Sdrh static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ 771b7916a78Sdrh pOut->zStart = pStart->z; 772b7916a78Sdrh pOut->zEnd = &pEnd->z[pEnd->n]; 773b7916a78Sdrh } 774b7916a78Sdrh 775b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 776b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 777b7916a78Sdrh ** that created the expression. 778b7916a78Sdrh */ 779b7916a78Sdrh static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){ 780b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue); 781b7916a78Sdrh pOut->zStart = pValue->z; 782b7916a78Sdrh pOut->zEnd = &pValue->z[pValue->n]; 783b7916a78Sdrh } 784b7916a78Sdrh } 785348784efSdrh 7867977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 787b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);} 788b7916a78Sdrh term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);} 789b7916a78Sdrh expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);} 790b7916a78Sdrh expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);} 7915ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 79217435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 79317435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 794b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); 795b7916a78Sdrh spanSet(&A,&X,&Y); 796e1b6a5b8Sdrh } 797d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 79817435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 79917435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 80017435752Sdrh Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 80117435752Sdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 802b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 803b7916a78Sdrh spanSet(&A,&X,&Z); 804d24cc427Sdrh } 805b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);} 806b7916a78Sdrh term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);} 807b7916a78Sdrh expr(A) ::= REGISTER(X). { 808b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 809b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 810b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 811b7916a78Sdrh if( pParse->nested==0 ){ 812b7916a78Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); 813b7916a78Sdrh A.pExpr = 0; 814b7916a78Sdrh }else{ 815b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); 816b7916a78Sdrh if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable); 817b7916a78Sdrh } 818b7916a78Sdrh spanSet(&A, &X, &X); 819b7916a78Sdrh } 8207c972decSdrh expr(A) ::= VARIABLE(X). { 821b7916a78Sdrh spanExpr(&A, pParse, TK_VARIABLE, &X); 822b7916a78Sdrh sqlite3ExprAssignVarNumber(pParse, A.pExpr); 823b7916a78Sdrh spanSet(&A, &X, &X); 824895d7472Sdrh } 82539002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). { 8260a8a406eSdrh A.pExpr = sqlite3ExprAddCollateToken(pParse, E.pExpr, &C); 827b7916a78Sdrh A.zStart = E.zStart; 828b7916a78Sdrh A.zEnd = &C.z[C.n]; 8298b4c40d8Sdrh } 830487e262fSdrh %ifndef SQLITE_OMIT_CAST 831487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 832b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); 833b7916a78Sdrh spanSet(&A,&X,&Y); 834487e262fSdrh } 835154d4b24Sdrh %endif SQLITE_OMIT_CAST 836fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 837994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 838e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 8394e05c83bSdrh } 840b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 841b7916a78Sdrh spanSet(&A,&X,&E); 842b7916a78Sdrh if( D && A.pExpr ){ 843b7916a78Sdrh A.pExpr->flags |= EP_Distinct; 844fd357974Sdrh } 845e1b6a5b8Sdrh } 846e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 847b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 848b7916a78Sdrh spanSet(&A,&X,&E); 849e1b6a5b8Sdrh } 850b71090fdSdrh term(A) ::= CTIME_KW(OP). { 851b71090fdSdrh /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 852b71090fdSdrh ** treated as functions that return constants */ 853b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0,&OP); 854b7916a78Sdrh if( A.pExpr ){ 855b7916a78Sdrh A.pExpr->op = TK_CONST_FUNC; 856b7916a78Sdrh } 857b7916a78Sdrh spanSet(&A, &OP, &OP); 858b7916a78Sdrh } 859b7916a78Sdrh 860b7916a78Sdrh %include { 861b7916a78Sdrh /* This routine constructs a binary expression node out of two ExprSpan 862b7916a78Sdrh ** objects and uses the result to populate a new ExprSpan object. 863b7916a78Sdrh */ 864b7916a78Sdrh static void spanBinaryExpr( 865b7916a78Sdrh ExprSpan *pOut, /* Write the result here */ 866b7916a78Sdrh Parse *pParse, /* The parsing context. Errors accumulate here */ 867b7916a78Sdrh int op, /* The binary operation */ 868b7916a78Sdrh ExprSpan *pLeft, /* The left operand */ 869b7916a78Sdrh ExprSpan *pRight /* The right operand */ 870b7916a78Sdrh ){ 871b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); 872b7916a78Sdrh pOut->zStart = pLeft->zStart; 873b7916a78Sdrh pOut->zEnd = pRight->zEnd; 874417ec638Sdrh } 875b71090fdSdrh } 876b7916a78Sdrh 877b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 878b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 87917435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). 880b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 881b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 882fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 883b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 884b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). 885b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 88617435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 887b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 888b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 88974ad7fe9Sdrh %type likeop {struct LikeOp} 890f9df4498Sdrh likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.bNot = 0;} 891f9df4498Sdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.bNot = 1;} 892f9df4498Sdrh likeop(A) ::= MATCH(X). {A.eOperator = X; A.bNot = 0;} 893f9df4498Sdrh likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.bNot = 1;} 8941dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] { 8958aa34ae0Sdrh ExprList *pList; 896b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 897b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 898b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 899f9df4498Sdrh if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 900b7916a78Sdrh A.zStart = X.zStart; 901b7916a78Sdrh A.zEnd = Y.zEnd; 902b7916a78Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 9030ac65892Sdrh } 9041dca1458Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 9051dca1458Sdrh ExprList *pList; 9061dca1458Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 9071dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 9081dca1458Sdrh pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 9091dca1458Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 910f9df4498Sdrh if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 9111dca1458Sdrh A.zStart = X.zStart; 9121dca1458Sdrh A.zEnd = E.zEnd; 9131dca1458Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 9141dca1458Sdrh } 9157c6303c0Sdanielk1977 916b7916a78Sdrh %include { 917b7916a78Sdrh /* Construct an expression node for a unary postfix operator 918b7916a78Sdrh */ 919b7916a78Sdrh static void spanUnaryPostfix( 920b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 921b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 922b7916a78Sdrh int op, /* The operator */ 923b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 924b7916a78Sdrh Token *pPostOp /* The operand token for setting the span */ 925b7916a78Sdrh ){ 926b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 927b7916a78Sdrh pOut->zStart = pOperand->zStart; 928b7916a78Sdrh pOut->zEnd = &pPostOp->z[pPostOp->n]; 929e1b6a5b8Sdrh } 93033048c0bSdrh } 931b7916a78Sdrh 932b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} 933b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 9346a2fe093Sdrh 9356a51741dSdrh %include { 9366a51741dSdrh /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 9376a51741dSdrh ** unary TK_ISNULL or TK_NOTNULL expression. */ 9386a51741dSdrh static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 9396a51741dSdrh sqlite3 *db = pParse->db; 9406a51741dSdrh if( db->mallocFailed==0 && pY->op==TK_NULL ){ 9415e17e8b7Sshaneh pA->op = (u8)op; 9426a51741dSdrh sqlite3ExprDelete(db, pA->pRight); 9436a51741dSdrh pA->pRight = 0; 9446a51741dSdrh } 9456a51741dSdrh } 9466a51741dSdrh } 9476a51741dSdrh 9486a2fe093Sdrh // expr1 IS expr2 9496a2fe093Sdrh // expr1 IS NOT expr2 9506a2fe093Sdrh // 9516a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2 9526a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT. 9536a2fe093Sdrh // 9546a2fe093Sdrh expr(A) ::= expr(X) IS expr(Y). { 9556a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_IS,&X,&Y); 9566a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL); 9576a2fe093Sdrh } 9586a2fe093Sdrh expr(A) ::= expr(X) IS NOT expr(Y). { 9596a2fe093Sdrh spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y); 9606a51741dSdrh binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL); 9616a2fe093Sdrh } 962b7916a78Sdrh 963b7916a78Sdrh %include { 964b7916a78Sdrh /* Construct an expression node for a unary prefix operator 965b7916a78Sdrh */ 966b7916a78Sdrh static void spanUnaryPrefix( 967b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 968b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 969b7916a78Sdrh int op, /* The operator */ 970b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 971b7916a78Sdrh Token *pPreOp /* The operand token for setting the span */ 972b7916a78Sdrh ){ 973b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 974b7916a78Sdrh pOut->zStart = pPreOp->z; 975b7916a78Sdrh pOut->zEnd = pOperand->zEnd; 97633048c0bSdrh } 97781a20f21Sdrh } 978b7916a78Sdrh 979b7916a78Sdrh 980b7916a78Sdrh 981b7916a78Sdrh expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 982b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 9837ba5bc5bSdrh expr(A) ::= MINUS(B) expr(X). [BITNOT] 984b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);} 9857ba5bc5bSdrh expr(A) ::= PLUS(B) expr(X). [BITNOT] 986b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);} 987b7916a78Sdrh 9882e3a1f16Sdrh %type between_op {int} 9892e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 9902e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 9912e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 992b7916a78Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); 993b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); 994b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); 995b7916a78Sdrh if( A.pExpr ){ 996b7916a78Sdrh A.pExpr->x.pList = pList; 99753f733c7Sdrh }else{ 998633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 99953f733c7Sdrh } 1000b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1001b7916a78Sdrh A.zStart = W.zStart; 1002b7916a78Sdrh A.zEnd = Y.zEnd; 1003fef5208cSdrh } 10043e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 10052e3a1f16Sdrh %type in_op {int} 10062e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 10072e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 10082e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 1009094430ebSdrh if( Y==0 ){ 1010473c1bf2Sdan /* Expressions of the form 1011473c1bf2Sdan ** 1012473c1bf2Sdan ** expr1 IN () 1013473c1bf2Sdan ** expr1 NOT IN () 1014473c1bf2Sdan ** 1015473c1bf2Sdan ** simplify to constants 0 (false) and 1 (true), respectively, 1016473c1bf2Sdan ** regardless of the value of expr1. 1017473c1bf2Sdan */ 1018094430ebSdrh A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]); 1019094430ebSdrh sqlite3ExprDelete(pParse->db, X.pExpr); 1020094430ebSdrh }else{ 1021b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1022b7916a78Sdrh if( A.pExpr ){ 1023b7916a78Sdrh A.pExpr->x.pList = Y; 1024b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 1025d5d56523Sdanielk1977 }else{ 1026633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1027d5d56523Sdanielk1977 } 1028b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1029094430ebSdrh } 1030b7916a78Sdrh A.zStart = X.zStart; 1031b7916a78Sdrh A.zEnd = &E.z[E.n]; 1032fef5208cSdrh } 103351522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 1034b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); 1035b7916a78Sdrh if( A.pExpr ){ 1036b7916a78Sdrh A.pExpr->x.pSelect = X; 1037b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1038b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 103953f733c7Sdrh }else{ 1040633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 104153f733c7Sdrh } 1042b7916a78Sdrh A.zStart = B.z; 1043b7916a78Sdrh A.zEnd = &E.z[E.n]; 104451522cd3Sdrh } 10452e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 1046b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1047b7916a78Sdrh if( A.pExpr ){ 1048b7916a78Sdrh A.pExpr->x.pSelect = Y; 1049b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1050b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 105153f733c7Sdrh }else{ 1052633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 105353f733c7Sdrh } 1054b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1055b7916a78Sdrh A.zStart = X.zStart; 1056b7916a78Sdrh A.zEnd = &E.z[E.n]; 1057fef5208cSdrh } 105874ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 105917435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 1060b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 1061b7916a78Sdrh if( A.pExpr ){ 1062b7916a78Sdrh A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 1063b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 1064b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 106553f733c7Sdrh }else{ 1066633e6d57Sdrh sqlite3SrcListDelete(pParse->db, pSrc); 106753f733c7Sdrh } 1068b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 1069b7916a78Sdrh A.zStart = X.zStart; 1070b7916a78Sdrh A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; 107123b2db23Sdrh } 107251522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 1073b7916a78Sdrh Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); 107451522cd3Sdrh if( p ){ 10756ab3a2ecSdanielk1977 p->x.pSelect = Y; 1076b7916a78Sdrh ExprSetProperty(p, EP_xIsSelect); 1077b7916a78Sdrh sqlite3ExprSetHeight(pParse, p); 107853f733c7Sdrh }else{ 1079633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 108051522cd3Sdrh } 1081b7916a78Sdrh A.zStart = B.z; 1082b7916a78Sdrh A.zEnd = &E.z[E.n]; 108351522cd3Sdrh } 1084154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1085fef5208cSdrh 108617a7f8ddSdrh /* CASE expressions */ 108717a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 1088c5cd1249Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0, 0); 1089b7916a78Sdrh if( A.pExpr ){ 1090c5cd1249Sdrh A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; 1091b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 109253f733c7Sdrh }else{ 1093633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1094c5cd1249Sdrh sqlite3ExprDelete(pParse->db, Z); 109553f733c7Sdrh } 1096b7916a78Sdrh A.zStart = C.z; 1097b7916a78Sdrh A.zEnd = &E.z[E.n]; 109817a7f8ddSdrh } 109917a7f8ddSdrh %type case_exprlist {ExprList*} 1100633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 110117a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 1102b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, Y.pExpr); 1103b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 110417a7f8ddSdrh } 110517a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 1106b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, Y.pExpr); 1107b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 110817a7f8ddSdrh } 110917a7f8ddSdrh %type case_else {Expr*} 1110633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 1111b7916a78Sdrh case_else(A) ::= ELSE expr(X). {A = X.pExpr;} 111217a7f8ddSdrh case_else(A) ::= . {A = 0;} 111317a7f8ddSdrh %type case_operand {Expr*} 1114633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 1115b7916a78Sdrh case_operand(A) ::= expr(X). {A = X.pExpr;} 111617a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1117348784efSdrh 1118348784efSdrh %type exprlist {ExprList*} 1119633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 11209245c243Sdrh %type nexprlist {ExprList*} 1121633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1122348784efSdrh 11239245c243Sdrh exprlist(A) ::= nexprlist(X). {A = X;} 11249245c243Sdrh exprlist(A) ::= . {A = 0;} 112517435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 1126b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 112717435752Sdrh nexprlist(A) ::= expr(Y). 1128b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} 11299245c243Sdrh 1130cce7d176Sdrh 1131382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1132382c0247Sdrh // 1133d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 11348a9789b6Sdrh ON nm(Y) LP idxlist(Z) RP where_opt(W). { 113517435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 113617435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 11378a9789b6Sdrh &S, W, SQLITE_SO_ASC, NE); 11389cfcf5d4Sdrh } 1139717e6402Sdrh 1140717e6402Sdrh %type uniqueflag {int} 11419cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 11429cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1143348784efSdrh 11440202b29eSdanielk1977 %type idxlist {ExprList*} 1145633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 11460202b29eSdanielk1977 %type idxlist_opt {ExprList*} 1147633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1148348784efSdrh 1149c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 1150c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 1151200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 11520a8a406eSdrh Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C); 1153b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, p); 1154b7916a78Sdrh sqlite3ExprListSetName(pParse,A,&Y,1); 1155b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1156b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 11570202b29eSdanielk1977 } 1158200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 11590a8a406eSdrh Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C); 1160b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, p); 1161b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &Y, 1); 1162b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1163b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 11640202b29eSdanielk1977 } 11650202b29eSdanielk1977 1166a34001c9Sdrh %type collate {Token} 1167a34001c9Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 116839002505Sdanielk1977 collate(C) ::= COLLATE ids(X). {C = X;} 1169a34001c9Sdrh 1170348784efSdrh 11718aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1172382c0247Sdrh // 11734d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1174982cef7eSdrh 1175382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1176382c0247Sdrh // 1177154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1178fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 117974161705Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse);} 118074161705Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} 1181fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1182154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1183f57b14a6Sdrh 1184382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1185382c0247Sdrh // 118613d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 118791cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1188ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1189ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1190ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1191ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1192ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1193ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1194ada2ee0dSdrh 1195a3eb4b44Sdrh nmnum(A) ::= plus_num(X). {A = X;} 1196a3eb4b44Sdrh nmnum(A) ::= nm(X). {A = X;} 1197ada2ee0dSdrh nmnum(A) ::= ON(X). {A = X;} 1198ada2ee0dSdrh nmnum(A) ::= DELETE(X). {A = X;} 11996da861beSdrh nmnum(A) ::= DEFAULT(X). {A = X;} 1200154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 12018395b7b6Sdrh plus_num(A) ::= PLUS number(X). {A = X;} 12028395b7b6Sdrh plus_num(A) ::= number(X). {A = X;} 1203f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1204fd405314Sdrh number(A) ::= INTEGER|FLOAT(X). {A = X;} 1205c3f9bad2Sdanielk1977 1206c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1207f0f258b1Sdrh 1208b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1209b7f9164eSdrh 1210d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 12114b59ab5eSdrh Token all; 12124b59ab5eSdrh all.z = A.z; 1213b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 12144adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1215f0f258b1Sdrh } 1216f0f258b1Sdrh 1217fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1218fdd48a76Sdrh trigger_time(C) trigger_event(D) 121960218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 122060218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 12213df6b257Sdanielk1977 A = (Z.n==0?B:Z); 1222c3f9bad2Sdanielk1977 } 1223c3f9bad2Sdanielk1977 1224c3f9bad2Sdanielk1977 %type trigger_time {int} 1225c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1226c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1227c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1228c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1229c3f9bad2Sdanielk1977 1230ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1231633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1232fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 123374ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 1234*81eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X). {A.a = TK_UPDATE; A.b = X;} 1235c3f9bad2Sdanielk1977 123660218d2aSdrh foreach_clause ::= . 123760218d2aSdrh foreach_clause ::= FOR EACH ROW. 1238c3f9bad2Sdanielk1977 1239c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1240633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1241c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1242b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1243c3f9bad2Sdanielk1977 1244c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1245633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 1246187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { 124781238966Sdrh assert( Y!=0 ); 124881238966Sdrh Y->pLast->pNext = X; 1249187e4c6aSdrh Y->pLast = X; 1250187e4c6aSdrh A = Y; 1251a69d9168Sdrh } 125281238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { 125381238966Sdrh assert( X!=0 ); 125481238966Sdrh X->pLast = X; 125581238966Sdrh A = X; 125681238966Sdrh } 1257c3f9bad2Sdanielk1977 1258b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements 1259b1819a0bSdrh // within a trigger. The table to INSERT, UPDATE, or DELETE is always in 1260b1819a0bSdrh // the same database as the table that the trigger fires on. 1261b1819a0bSdrh // 1262b1819a0bSdrh %type trnm {Token} 1263b1819a0bSdrh trnm(A) ::= nm(X). {A = X;} 1264b1819a0bSdrh trnm(A) ::= nm DOT nm(X). { 1265b1819a0bSdrh A = X; 1266b1819a0bSdrh sqlite3ErrorMsg(pParse, 1267b1819a0bSdrh "qualified table names are not allowed on INSERT, UPDATE, and DELETE " 1268b1819a0bSdrh "statements within triggers"); 1269b1819a0bSdrh } 1270b1819a0bSdrh 1271b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE 1272b1819a0bSdrh // statements within triggers. We make a specific error message for this 1273b1819a0bSdrh // since it is an exception to the default grammar rules. 1274b1819a0bSdrh // 1275b1819a0bSdrh tridxby ::= . 1276b1819a0bSdrh tridxby ::= INDEXED BY nm. { 1277b1819a0bSdrh sqlite3ErrorMsg(pParse, 1278b1819a0bSdrh "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " 1279b1819a0bSdrh "within triggers"); 1280b1819a0bSdrh } 1281b1819a0bSdrh tridxby ::= NOT INDEXED. { 1282b1819a0bSdrh sqlite3ErrorMsg(pParse, 1283b1819a0bSdrh "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " 1284b1819a0bSdrh "within triggers"); 1285b1819a0bSdrh } 1286b1819a0bSdrh 1287b1819a0bSdrh 1288b1819a0bSdrh 1289c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1290633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1291c3f9bad2Sdanielk1977 // UPDATE 1292b1819a0bSdrh trigger_cmd(A) ::= 1293b1819a0bSdrh UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). 129417435752Sdrh { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1295c3f9bad2Sdanielk1977 1296c3f9bad2Sdanielk1977 // INSERT 1297b1819a0bSdrh trigger_cmd(A) ::= 12987b113babSdrh insert_cmd(R) INTO trnm(X) inscollist_opt(F) valuelist(Y). 12997b113babSdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y.pList, Y.pSelect, R);} 1300c3f9bad2Sdanielk1977 1301b1819a0bSdrh trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S). 130217435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} 1303c3f9bad2Sdanielk1977 1304c3f9bad2Sdanielk1977 // DELETE 1305b1819a0bSdrh trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). 130617435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1307c3f9bad2Sdanielk1977 1308c3f9bad2Sdanielk1977 // SELECT 130917435752Sdrh trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1310c3f9bad2Sdanielk1977 13116f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 13124b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1313b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); 1314b7916a78Sdrh if( A.pExpr ){ 1315b7916a78Sdrh A.pExpr->affinity = OE_Ignore; 13164b59ab5eSdrh } 1317b7916a78Sdrh A.zStart = X.z; 1318b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 13198aa34ae0Sdrh } 132074ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 1321b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); 1322b7916a78Sdrh if( A.pExpr ) { 1323b7916a78Sdrh A.pExpr->affinity = (char)T; 13244b59ab5eSdrh } 1325b7916a78Sdrh A.zStart = X.z; 1326b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 13278aa34ae0Sdrh } 1328154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1329b7f9164eSdrh 133074ad7fe9Sdrh %type raisetype {int} 133174ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 133274ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 133374ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 133474ad7fe9Sdrh 13356f34903eSdanielk1977 1336c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1337b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1338fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1339fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1340c3f9bad2Sdanielk1977 } 1341154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1342113088ecSdrh 1343113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1344fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1345f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1346b7916a78Sdrh sqlite3Attach(pParse, F.pExpr, D.pExpr, K); 13471c2d8414Sdrh } 1348fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1349b7916a78Sdrh sqlite3Detach(pParse, D.pExpr); 1350fdbcdee5Sdrh } 1351fdbcdee5Sdrh 1352f744bb56Sdanielk1977 %type key_opt {Expr*} 1353633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1354f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1355b7916a78Sdrh key_opt(A) ::= KEY expr(X). { A = X.pExpr; } 1356113088ecSdrh 1357113088ecSdrh database_kw_opt ::= DATABASE. 1358113088ecSdrh database_kw_opt ::= . 1359fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 13604343fea2Sdrh 13614343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 13624343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 13634343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 13644343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1365154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 13669fd2a9a0Sdanielk1977 13679f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 13689f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 13699f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 13709f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 13719f18e8a0Sdrh %endif 13729f18e8a0Sdrh 13739fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 13749fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 13759fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 13769fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 13779fd2a9a0Sdanielk1977 } 137819a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 137919a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 138019a8e7e8Sdanielk1977 } 138119a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 1382d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 138319a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 138419a8e7e8Sdanielk1977 } 138519a8e7e8Sdanielk1977 kwcolumn_opt ::= . 138619a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1387154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1388e09daa90Sdrh 1389e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1390e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1391b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1392b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1393b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E) 1394b421b894Sdrh nm(X) dbnm(Y) USING nm(Z). { 1395b421b894Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E); 1396b9bb7c18Sdrh } 1397e09daa90Sdrh vtabarglist ::= vtabarg. 1398e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1399b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1400b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1401b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1402b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1403b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1404b9bb7c18Sdrh anylist ::= . 1405aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1406aaac8b4eSdrh anylist ::= anylist ANY. 1407154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 1408