1348784efSdrh /* 2b19a2bc6Sdrh ** 2001 September 15 3348784efSdrh ** 4b19a2bc6Sdrh ** The author disclaims copyright to this source code. In place of 5b19a2bc6Sdrh ** a legal notice, here is a blessing: 6348784efSdrh ** 7b19a2bc6Sdrh ** May you do good and not evil. 8b19a2bc6Sdrh ** May you find forgiveness for yourself and forgive others. 9b19a2bc6Sdrh ** May you share freely, never taking more than you give. 10348784efSdrh ** 11348784efSdrh ************************************************************************* 12348784efSdrh ** This file contains SQLite's grammar for SQL. Process this file 13348784efSdrh ** using the lemon parser generator to generate C code that runs 14348784efSdrh ** the parser. Lemon will also generate a header file containing 15348784efSdrh ** numeric codes for all of the tokens. 16348784efSdrh ** 17*b52076cdSdrh ** @(#) $Id: parse.y,v 1.193 2006/01/23 13:22:09 drh Exp $ 18348784efSdrh */ 19487e262fSdrh 20487e262fSdrh // All token codes are small integers with #defines that begin with "TK_" 21348784efSdrh %token_prefix TK_ 22487e262fSdrh 23487e262fSdrh // The type of the data attached to each token is Token. This is also the 24487e262fSdrh // default type for non-terminals. 25487e262fSdrh // 26348784efSdrh %token_type {Token} 27f57b14a6Sdrh %default_type {Token} 28487e262fSdrh 29487e262fSdrh // The generated parser function takes a 4th argument as follows: 30348784efSdrh %extra_argument {Parse *pParse} 31487e262fSdrh 32487e262fSdrh // This code runs whenever there is a syntax error 33487e262fSdrh // 34348784efSdrh %syntax_error { 35b86ccfb2Sdrh if( pParse->zErrMsg==0 ){ 36b86ccfb2Sdrh if( TOKEN.z[0] ){ 374adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 38b86ccfb2Sdrh }else{ 394adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "incomplete SQL statement"); 40b86ccfb2Sdrh } 41b86ccfb2Sdrh } 42348784efSdrh } 43487e262fSdrh 44487e262fSdrh // The name of the generated procedure that implements the parser 45487e262fSdrh // is as follows: 464adee20fSdanielk1977 %name sqlite3Parser 47487e262fSdrh 48487e262fSdrh // The following text is included near the beginning of the C source 49487e262fSdrh // code file that implements the parser. 50487e262fSdrh // 51348784efSdrh %include { 52348784efSdrh #include "sqliteInt.h" 53348784efSdrh #include "parse.h" 549bbca4c1Sdrh 559bbca4c1Sdrh /* 56ad3cab52Sdrh ** An instance of this structure holds information about the 57ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 589bbca4c1Sdrh */ 59ad3cab52Sdrh struct LimitVal { 60a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 61a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 62ad3cab52Sdrh }; 63c3f9bad2Sdanielk1977 64c3f9bad2Sdanielk1977 /* 652e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 662e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 672e3a1f16Sdrh */ 682e3a1f16Sdrh struct LikeOp { 69*b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 702e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 712e3a1f16Sdrh }; 722e3a1f16Sdrh 732e3a1f16Sdrh /* 74ad3cab52Sdrh ** An instance of the following structure describes the event of a 75ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 76ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 77ad3cab52Sdrh ** 78ad3cab52Sdrh ** UPDATE ON (a,b,c) 79ad3cab52Sdrh ** 80ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 81c3f9bad2Sdanielk1977 */ 82ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 83caec2f12Sdrh 8425d6543dSdrh /* 8525d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 8625d6543dSdrh */ 8725d6543dSdrh struct AttachKey { int type; Token key; }; 8825d6543dSdrh 89caec2f12Sdrh } // end %include 90348784efSdrh 91826fb5a3Sdrh // Input is a single SQL command 92c4a3c779Sdrh input ::= cmdlist. 93094b2bbfSdrh cmdlist ::= cmdlist ecmd. 94826fb5a3Sdrh cmdlist ::= ecmd. 9580242055Sdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 96b7f9164eSdrh ecmd ::= SEMI. 97b7f9164eSdrh ecmd ::= explain cmdx SEMI. 984adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 99b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 100b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 101ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } 102b7f9164eSdrh %endif 103348784efSdrh 104382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 105c4a3c779Sdrh // 106fa86c412Sdrh 107684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 108c4a3c779Sdrh trans_opt ::= . 109c4a3c779Sdrh trans_opt ::= TRANSACTION. 1105ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 111684917c2Sdrh %type transtype {int} 112684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 113684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 114684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 115684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1164adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1174adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1184adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 119c4a3c779Sdrh 120382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 121348784efSdrh // 122348784efSdrh cmd ::= create_table create_table_args. 123faa59554Sdrh create_table ::= CREATE(X) temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 124faa59554Sdrh sqlite3StartTable(pParse,&X,&Y,&Z,T,0,E); 125969fa7c1Sdrh } 126faa59554Sdrh %type ifnotexists {int} 127faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 128faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 129f57b3399Sdrh %type temp {int} 13053c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 131d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 13253c0f748Sdanielk1977 %endif 133d24cc427Sdrh temp(A) ::= . {A = 0;} 13419a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { 13519a8e7e8Sdanielk1977 sqlite3EndTable(pParse,&X,&Y,0); 136969fa7c1Sdrh } 137969fa7c1Sdrh create_table_args ::= AS select(S). { 13819a8e7e8Sdanielk1977 sqlite3EndTable(pParse,0,0,S); 1394adee20fSdanielk1977 sqlite3SelectDelete(S); 140969fa7c1Sdrh } 141348784efSdrh columnlist ::= columnlist COMMA column. 142348784efSdrh columnlist ::= column. 143348784efSdrh 144487e262fSdrh // A "column" is a complete description of a single column in a 145487e262fSdrh // CREATE TABLE statement. This includes the column name, its 146487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 147487e262fSdrh // NOT NULL and so forth. 148348784efSdrh // 14919a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 15019a8e7e8Sdanielk1977 A.z = X.z; 15119a8e7e8Sdanielk1977 A.n = (pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 15219a8e7e8Sdanielk1977 } 15319a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 15419a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 15519a8e7e8Sdanielk1977 A = X; 15619a8e7e8Sdanielk1977 } 15719a8e7e8Sdanielk1977 158c4a3c779Sdrh 159c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 160c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 161c4a3c779Sdrh // 162982cef7eSdrh %type id {Token} 163f18543caSdrh id(A) ::= ID(X). {A = X;} 1640bd1f4eaSdrh 16534e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 16634e33bb8Sdrh // fallback to ID if they will not parse as their original value. 16734e33bb8Sdrh // This obviates the need for the "id" nonterminal. 16834e33bb8Sdrh // 1690bd1f4eaSdrh %fallback ID 1709f18e8a0Sdrh ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN CASCADE CAST CONFLICT 171684917c2Sdrh DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 172ecc9242fSdrh IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN QUERY KEY 1735ad1a6c8Sdrh OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT 174b7f9164eSdrh TEMP TRIGGER VACUUM VIEW 175b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 176b7f9164eSdrh EXCEPT INTERSECT UNION 177b7f9164eSdrh %endif 178a073384fSdrh REINDEX RENAME CTIME_KW IF 179b7f9164eSdrh . 180c4a3c779Sdrh 1812d3917daSdrh // Define operator precedence early so that this is the first occurance 1822d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 1832d3917daSdrh // causes them to be assigned integer values that are close together, 1842d3917daSdrh // which keeps parser tables smaller. 1852d3917daSdrh // 186f2bc013cSdrh // The token values assigned to these symbols is determined by the order 187f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 188f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 189f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 190f2bc013cSdrh // constraint. 191f2bc013cSdrh // 1922d3917daSdrh %left OR. 1932d3917daSdrh %left AND. 1942d3917daSdrh %right NOT. 195b71090fdSdrh %left IS LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 1969a43267bSdrh %left GT LE LT GE. 1977c6303c0Sdanielk1977 %right ESCAPE. 1982d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 1992d3917daSdrh %left PLUS MINUS. 2002d3917daSdrh %left STAR SLASH REM. 2012d3917daSdrh %left CONCAT. 2022d3917daSdrh %right UMINUS UPLUS BITNOT. 2032d3917daSdrh 204c4a3c779Sdrh // And "ids" is an identifer-or-string. 205c4a3c779Sdrh // 206c4a3c779Sdrh %type ids {Token} 207fd405314Sdrh ids(A) ::= ID|STRING(X). {A = X;} 208c4a3c779Sdrh 2095ad1a6c8Sdrh // The name of a column or table can be any of the following: 2105ad1a6c8Sdrh // 2115ad1a6c8Sdrh %type nm {Token} 2125ad1a6c8Sdrh nm(A) ::= ID(X). {A = X;} 2135ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2145ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2155ad1a6c8Sdrh 216487e262fSdrh // A typetoken is really one or more tokens that form a type name such 217487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 218487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 219487e262fSdrh // 220487e262fSdrh %type typetoken {Token} 221382c0247Sdrh type ::= . 222487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 223487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 224487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 225487e262fSdrh A.z = X.z; 226487e262fSdrh A.n = &Y.z[Y.n] - X.z; 227487e262fSdrh } 228487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 229487e262fSdrh A.z = X.z; 230487e262fSdrh A.n = &Y.z[Y.n] - X.z; 231487e262fSdrh } 232382c0247Sdrh %type typename {Token} 233382c0247Sdrh typename(A) ::= ids(X). {A = X;} 234596bd235Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);} 235ef0cae50Sdrh %type signed {int} 2362646da7eSdrh signed(A) ::= plus_num(X). { A = atoi((char*)X.z); } 2372646da7eSdrh signed(A) ::= minus_num(X). { A = -atoi((char*)X.z); } 238487e262fSdrh 239487e262fSdrh // "carglist" is a list of additional constraints that come after the 240487e262fSdrh // column name and column type in a CREATE TABLE statement. 241487e262fSdrh // 242348784efSdrh carglist ::= carglist carg. 243348784efSdrh carglist ::= . 2445ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 245348784efSdrh carg ::= ccons. 2467977a17fSdanielk1977 carg ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,X);} 247eb55bd2fSdrh carg ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,X);} 2487977a17fSdanielk1977 carg ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,X);} 2497977a17fSdanielk1977 carg ::= DEFAULT MINUS term(X). { 2507977a17fSdanielk1977 Expr *p = sqlite3Expr(TK_UMINUS, X, 0, 0); 2517977a17fSdanielk1977 sqlite3AddDefaultValue(pParse,p); 2527977a17fSdanielk1977 } 2537977a17fSdanielk1977 carg ::= DEFAULT id(X). { 2547977a17fSdanielk1977 Expr *p = sqlite3Expr(TK_STRING, 0, 0, &X); 2557977a17fSdanielk1977 sqlite3AddDefaultValue(pParse,p); 2567977a17fSdanielk1977 } 257348784efSdrh 258382c0247Sdrh // In addition to the type name, we also care about the primary key and 259382c0247Sdrh // UNIQUE constraints. 260348784efSdrh // 2610d316a40Sdrh ccons ::= NULL onconf. 2624adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 263fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 264fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 2654d91a701Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 266ffe07b2dSdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X);} 267c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 2684adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 2694adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 2702646da7eSdrh ccons ::= COLLATE id(C). {sqlite3AddCollateType(pParse, (char*)C.z, C.n);} 27104738cb9Sdrh 272205f48e6Sdrh // The optional AUTOINCREMENT keyword 273205f48e6Sdrh %type autoinc {int} 274205f48e6Sdrh autoinc(X) ::= . {X = 0;} 2752958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 276205f48e6Sdrh 277c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 278c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 279c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 280c2eef3b3Sdrh // check fails. 28104738cb9Sdrh // 282c2eef3b3Sdrh %type refargs {int} 283c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 284c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } 285c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 286c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 287c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 288c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 289c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 290c2eef3b3Sdrh %type refact {int} 291c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 292c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 293c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 294c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 295c2eef3b3Sdrh %type defer_subclause {int} 296c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 297c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 298c2eef3b3Sdrh %type init_deferred_pred_opt {int} 299c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 300c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 301c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 302348784efSdrh 303348784efSdrh // For the time being, the only constraint we care about is the primary 304382c0247Sdrh // key and UNIQUE. Both create indices. 305348784efSdrh // 30619a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 30719a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 308348784efSdrh conslist ::= conslist COMMA tcons. 309a2e1bb5aSdrh conslist ::= conslist tcons. 310348784efSdrh conslist ::= tcons. 3115ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 312f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 313fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3149cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3154d91a701Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 31606f6541eSdrh tcons ::= CHECK LP expr(E) RP onconf. {sqlite3AddCheckConstraint(pParse,E);} 317c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 318c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3194adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3204adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 321c2eef3b3Sdrh } 322c2eef3b3Sdrh %type defer_subclause_opt {int} 323c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 324c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3259cfcf5d4Sdrh 3269cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3279cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3289cfcf5d4Sdrh // 3299cfcf5d4Sdrh %type onconf {int} 3301c92853dSdrh %type orconf {int} 3311c92853dSdrh %type resolvetype {int} 3321c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3331c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3341c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3351c92853dSdrh orconf(A) ::= OR resolvetype(X). {A = X;} 33674ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3371c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3381c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 339348784efSdrh 340382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 341348784efSdrh // 342a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 343a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 344a8858103Sdanielk1977 } 345a073384fSdrh %type ifexists {int} 346a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 347a073384fSdrh ifexists(A) ::= . {A = 0;} 348348784efSdrh 349a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 350a76b5dfcSdrh // 351b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 35248dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). { 35348dec7e2Sdanielk1977 sqlite3CreateView(pParse, &X, &Y, &Z, S, T); 354a76b5dfcSdrh } 355a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 356a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 357a76b5dfcSdrh } 358b7f9164eSdrh %endif // SQLITE_OMIT_VIEW 359a76b5dfcSdrh 360382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 361348784efSdrh // 3629bb61fe7Sdrh cmd ::= select(X). { 363b3bce662Sdanielk1977 sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); 3644adee20fSdanielk1977 sqlite3SelectDelete(X); 3659bb61fe7Sdrh } 366efb7251dSdrh 3679bb61fe7Sdrh %type select {Select*} 3684adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);} 36982c3d636Sdrh %type oneselect {Select*} 3704adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);} 3719bb61fe7Sdrh 37282c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 373b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 3740a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 375daffd0e5Sdrh if( Z ){ 37682c3d636Sdrh Z->op = Y; 37782c3d636Sdrh Z->pPrior = X; 378daffd0e5Sdrh } 37982c3d636Sdrh A = Z; 38082c3d636Sdrh } 3810a36c57eSdrh %type multiselect_op {int} 38274ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 3830a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 384fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 385b7f9164eSdrh %endif // SQLITE_OMIT_COMPOUND_SELECT 38682c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 3879bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 388a2dc3b1aSdanielk1977 A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 3899bb61fe7Sdrh } 3909bb61fe7Sdrh 3919bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 3929bb61fe7Sdrh // present and false (0) if it is not. 3939bb61fe7Sdrh // 394efb7251dSdrh %type distinct {int} 395efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 396fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 397efb7251dSdrh distinct(A) ::= . {A = 0;} 398348784efSdrh 3999bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 4007c917d19Sdrh // values of the SELECT statement. The "*" in statements like 4017c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 4027c917d19Sdrh // opcode of TK_ALL. 4039bb61fe7Sdrh // 404348784efSdrh %type selcollist {ExprList*} 4054adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);} 406348784efSdrh %type sclp {ExprList*} 4074adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);} 408348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 409348784efSdrh sclp(A) ::= . {A = 0;} 41001f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 4114adee20fSdanielk1977 A = sqlite3ExprListAppend(P,X,Y.n?&Y:0); 41201f3f253Sdrh } 4137c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 4144adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0); 4157c917d19Sdrh } 4165ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. { 4174adee20fSdanielk1977 Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0); 4184adee20fSdanielk1977 Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X); 4194adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0); 42054473229Sdrh } 42101f3f253Sdrh 42201f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 42301f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 42401f3f253Sdrh // 42501f3f253Sdrh %type as {Token} 4265ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 4275ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 42801f3f253Sdrh as(X) ::= . {X.n = 0;} 4299bb61fe7Sdrh 430348784efSdrh 431ad3cab52Sdrh %type seltablist {SrcList*} 4324adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);} 433ad3cab52Sdrh %type stl_prefix {SrcList*} 4344adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);} 435ad3cab52Sdrh %type from {SrcList*} 4364adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);} 437348784efSdrh 43801f3f253Sdrh // A complete FROM clause. 43901f3f253Sdrh // 440bf3a4fa4Sdrh from(A) ::= . {A = sqliteMalloc(sizeof(*A));} 441348784efSdrh from(A) ::= FROM seltablist(X). {A = X;} 44201f3f253Sdrh 44301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 44401f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 44501f3f253Sdrh // 44601f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 44701f3f253Sdrh A = X; 44801f3f253Sdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; 44901f3f253Sdrh } 450348784efSdrh stl_prefix(A) ::= . {A = 0;} 451113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { 4524adee20fSdanielk1977 A = sqlite3SrcListAppend(X,&Y,&D); 4534adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 45401f3f253Sdrh if( N ){ 45501f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 4564adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 457c4a3c779Sdrh } 45801f3f253Sdrh if( U ){ 45901f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 4604adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 46101f3f253Sdrh } 46201f3f253Sdrh } 46351522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 464b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP 465b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 4664adee20fSdanielk1977 A = sqlite3SrcListAppend(X,0,0); 467ad3cab52Sdrh A->a[A->nSrc-1].pSelect = S; 4684adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 46901f3f253Sdrh if( N ){ 47001f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 4714adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 47222f70c32Sdrh } 47301f3f253Sdrh if( U ){ 47401f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 4754adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 476d5feede1Sdrh } 47722f70c32Sdrh } 478348784efSdrh 479b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 480b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 481b733d037Sdrh // a grouping of table and subqueries. 482b733d037Sdrh // 483b733d037Sdrh %type seltablist_paren {Select*} 4844adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);} 485b733d037Sdrh seltablist_paren(A) ::= select(S). {A = S;} 486b733d037Sdrh seltablist_paren(A) ::= seltablist(F). { 487a2dc3b1aSdanielk1977 A = sqlite3SelectNew(0,F,0,0,0,0,0,0,0); 488b733d037Sdrh } 48951522cd3Sdrh %endif // SQLITE_OMIT_SUBQUERY 490b733d037Sdrh 491113088ecSdrh %type dbnm {Token} 492113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 493113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 494113088ecSdrh 49574ad7fe9Sdrh %type fullname {SrcList*} 49674ad7fe9Sdrh %destructor fullname {sqlite3SrcListDelete($$);} 49774ad7fe9Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(0,&X,&Y);} 49874ad7fe9Sdrh 49901f3f253Sdrh %type joinop {int} 50001f3f253Sdrh %type joinop2 {int} 501fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 5024adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 5034adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 5045ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 5054adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 50601f3f253Sdrh 50701f3f253Sdrh %type on_opt {Expr*} 5084adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);} 50901f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 51001f3f253Sdrh on_opt(N) ::= . {N = 0;} 51101f3f253Sdrh 51201f3f253Sdrh %type using_opt {IdList*} 5134adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);} 5140202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 51501f3f253Sdrh using_opt(U) ::= . {U = 0;} 51601f3f253Sdrh 51701f3f253Sdrh 518348784efSdrh %type orderby_opt {ExprList*} 5194adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);} 520348784efSdrh %type sortlist {ExprList*} 5214adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);} 522348784efSdrh %type sortitem {Expr*} 5234adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);} 524348784efSdrh 525348784efSdrh orderby_opt(A) ::= . {A = 0;} 526348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 5278e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). { 5281186b0a0Sdrh A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0); 529d3d39e93Sdrh if( A ) A->a[A->nExpr-1].sortOrder = Z; 530348784efSdrh } 53138640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). { 5321186b0a0Sdrh A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0); 53396fb0dd5Sdanielk1977 if( A && A->a ) A->a[0].sortOrder = Z; 534348784efSdrh } 535da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 536348784efSdrh 537348784efSdrh %type sortorder {int} 538d3d39e93Sdrh %type collate {Token} 539348784efSdrh 5408e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 5418e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 5428e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 543d3d39e93Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 544d3d39e93Sdrh collate(C) ::= COLLATE id(X). {C = X;} 545348784efSdrh 5462282792aSdrh %type groupby_opt {ExprList*} 5474adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);} 5482282792aSdrh groupby_opt(A) ::= . {A = 0;} 5492282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;} 5502282792aSdrh 5512282792aSdrh %type having_opt {Expr*} 5524adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);} 5532282792aSdrh having_opt(A) ::= . {A = 0;} 5542282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 5552282792aSdrh 556ad3cab52Sdrh %type limit_opt {struct LimitVal} 557a2dc3b1aSdanielk1977 %destructor limit_opt { 558a2dc3b1aSdanielk1977 sqlite3ExprDelete($$.pLimit); 559a2dc3b1aSdanielk1977 sqlite3ExprDelete($$.pOffset); 560a2dc3b1aSdanielk1977 } 561a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 562a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X; A.pOffset = 0;} 563a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 564a2dc3b1aSdanielk1977 {A.pLimit = X; A.pOffset = Y;} 565a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 566a2dc3b1aSdanielk1977 {A.pOffset = X; A.pLimit = Y;} 5679bbca4c1Sdrh 568382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 569382c0247Sdrh // 57074ad7fe9Sdrh cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);} 571348784efSdrh 572348784efSdrh %type where_opt {Expr*} 5734adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);} 574348784efSdrh 575348784efSdrh where_opt(A) ::= . {A = 0;} 576348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 577348784efSdrh 578382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 579382c0247Sdrh // 58074ad7fe9Sdrh cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z). 58174ad7fe9Sdrh {sqlite3Update(pParse,X,Y,Z,R);} 582348784efSdrh 583f8db1bc0Sdrh %type setlist {ExprList*} 584f8db1bc0Sdrh %destructor setlist {sqlite3ExprListDelete($$);} 585f8db1bc0Sdrh 5865ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 5874adee20fSdanielk1977 {A = sqlite3ExprListAppend(Z,Y,&X);} 5884adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(0,Y,&X);} 589348784efSdrh 590382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 591382c0247Sdrh // 59274ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 593113088ecSdrh VALUES LP itemlist(Y) RP. 59474ad7fe9Sdrh {sqlite3Insert(pParse, X, Y, 0, F, R);} 59574ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 59674ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 597348784efSdrh 598fa86c412Sdrh %type insert_cmd {int} 599fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 600fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 601fa86c412Sdrh 602348784efSdrh 603348784efSdrh %type itemlist {ExprList*} 6044adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);} 605348784efSdrh 6064adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);} 6074adee20fSdanielk1977 itemlist(A) ::= expr(X). {A = sqlite3ExprListAppend(0,X,0);} 608348784efSdrh 609967e8b73Sdrh %type inscollist_opt {IdList*} 6104adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);} 611967e8b73Sdrh %type inscollist {IdList*} 6124adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);} 613348784efSdrh 614967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 615967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 6164adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqlite3IdListAppend(X,&Y);} 6174adee20fSdanielk1977 inscollist(A) ::= nm(Y). {A = sqlite3IdListAppend(0,&Y);} 618348784efSdrh 619382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 620382c0247Sdrh // 621348784efSdrh 622348784efSdrh %type expr {Expr*} 6234adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);} 6247977a17fSdanielk1977 %type term {Expr*} 6257977a17fSdanielk1977 %destructor term {sqlite3ExprDelete($$);} 626348784efSdrh 6277977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 628752e679aSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } 6297977a17fSdanielk1977 term(A) ::= NULL(X). {A = sqlite3Expr(@X, 0, 0, &X);} 6304adee20fSdanielk1977 expr(A) ::= ID(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 6314adee20fSdanielk1977 expr(A) ::= JOIN_KW(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 6325ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 6334adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 6344adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 6354adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp2, 0); 636e1b6a5b8Sdrh } 637d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 6384adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 6394adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 6404adee20fSdanielk1977 Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z); 6414adee20fSdanielk1977 Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0); 6424adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp4, 0); 643d24cc427Sdrh } 644fd405314Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {A = sqlite3Expr(@X, 0, 0, &X);} 6457977a17fSdanielk1977 term(A) ::= STRING(X). {A = sqlite3Expr(@X, 0, 0, &X);} 6464e0cff60Sdrh expr(A) ::= REGISTER(X). {A = sqlite3RegisterExpr(pParse, &X);} 6477c972decSdrh expr(A) ::= VARIABLE(X). { 648895d7472Sdrh Token *pToken = &X; 649895d7472Sdrh Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken); 650fa6bc000Sdrh sqlite3ExprAssignVarNumber(pParse, pExpr); 651895d7472Sdrh } 652487e262fSdrh %ifndef SQLITE_OMIT_CAST 653487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 654487e262fSdrh A = sqlite3Expr(TK_CAST, E, 0, &T); 655487e262fSdrh sqlite3ExprSpan(A,&X,&Y); 656487e262fSdrh } 657487e262fSdrh %endif // SQLITE_OMIT_CAST 658fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 6594adee20fSdanielk1977 A = sqlite3ExprFunction(Y, &X); 6604adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 661fd357974Sdrh if( D ){ 662fd357974Sdrh A->flags |= EP_Distinct; 663fd357974Sdrh } 664e1b6a5b8Sdrh } 665e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 6664adee20fSdanielk1977 A = sqlite3ExprFunction(0, &X); 6674adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 668e1b6a5b8Sdrh } 669b71090fdSdrh term(A) ::= CTIME_KW(OP). { 670b71090fdSdrh /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 671b71090fdSdrh ** treated as functions that return constants */ 672b71090fdSdrh A = sqlite3ExprFunction(0,&OP); 673b71090fdSdrh if( A ) A->op = TK_CONST_FUNC; 674b71090fdSdrh } 6757ac25c75Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6767ac25c75Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 677fd405314Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 678fd405314Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 679fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 680fd405314Sdrh {A = sqlite3Expr(@OP, X, Y, 0);} 681fd405314Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 682fd405314Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 68374ad7fe9Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 68474ad7fe9Sdrh %type likeop {struct LikeOp} 685*b52076cdSdrh likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} 686*b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} 6877c6303c0Sdanielk1977 %type escape {Expr*} 688dba99bccSdanielk1977 %destructor escape {sqlite3ExprDelete($$);} 6897c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;} 6907c6303c0Sdanielk1977 escape(X) ::= . [ESCAPE] {X = 0;} 691b71090fdSdrh expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { 6924adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 6934adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 6947c6303c0Sdanielk1977 if( E ){ 6957c6303c0Sdanielk1977 pList = sqlite3ExprListAppend(pList, E, 0); 6967c6303c0Sdanielk1977 } 697*b52076cdSdrh A = sqlite3ExprFunction(pList, &OP.eOperator); 6982e3a1f16Sdrh if( OP.not ) A = sqlite3Expr(TK_NOT, A, 0, 0); 6994adee20fSdanielk1977 sqlite3ExprSpan(A, &X->span, &Y->span); 7000ac65892Sdrh } 7017c6303c0Sdanielk1977 702fd405314Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). { 703fd405314Sdrh A = sqlite3Expr(@E, X, 0, 0); 7044adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 705e1b6a5b8Sdrh } 70633048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 7074adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 7084adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 70933048c0bSdrh } 71033048c0bSdrh expr(A) ::= expr(X) NOT NULL(E). { 7114adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 7124adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 71333048c0bSdrh } 71481a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 7154adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 7164adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 71781a20f21Sdrh } 718fd405314Sdrh expr(A) ::= NOT|BITNOT(B) expr(X). { 7197ac25c75Sdrh A = sqlite3Expr(@B, X, 0, 0); 7204adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 72181a20f21Sdrh } 722e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 7234adee20fSdanielk1977 A = sqlite3Expr(TK_UMINUS, X, 0, 0); 7244adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 725e1b6a5b8Sdrh } 7264b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 7274adee20fSdanielk1977 A = sqlite3Expr(TK_UPLUS, X, 0, 0); 7284adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 729e1b6a5b8Sdrh } 7302e3a1f16Sdrh %type between_op {int} 7312e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 7322e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 7332e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 7344adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 7354adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 7364adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 73753f733c7Sdrh if( A ){ 73853f733c7Sdrh A->pList = pList; 73953f733c7Sdrh }else{ 74053f733c7Sdrh sqlite3ExprListDelete(pList); 74153f733c7Sdrh } 7422e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 7434adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 744fef5208cSdrh } 7453e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 7462e3a1f16Sdrh %type in_op {int} 7472e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 7482e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 7492e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 7504adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 751d5d56523Sdanielk1977 if( A ){ 752d5d56523Sdanielk1977 A->pList = Y; 753d5d56523Sdanielk1977 }else{ 754d5d56523Sdanielk1977 sqlite3ExprListDelete(Y); 755d5d56523Sdanielk1977 } 7562e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 7574adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 758fef5208cSdrh } 75951522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 76051522cd3Sdrh A = sqlite3Expr(TK_SELECT, 0, 0, 0); 76153f733c7Sdrh if( A ){ 76253f733c7Sdrh A->pSelect = X; 76353f733c7Sdrh }else{ 76453f733c7Sdrh sqlite3SelectDelete(X); 76553f733c7Sdrh } 76651522cd3Sdrh sqlite3ExprSpan(A,&B,&E); 76751522cd3Sdrh } 7682e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 7694adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 77053f733c7Sdrh if( A ){ 77153f733c7Sdrh A->pSelect = Y; 77253f733c7Sdrh }else{ 77353f733c7Sdrh sqlite3SelectDelete(Y); 77453f733c7Sdrh } 7752e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 7764adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 777fef5208cSdrh } 77874ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 77974ad7fe9Sdrh SrcList *pSrc = sqlite3SrcListAppend(0,&Y,&Z); 7804adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 78153f733c7Sdrh if( A ){ 78253f733c7Sdrh A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,0,0); 78353f733c7Sdrh }else{ 78453f733c7Sdrh sqlite3SrcListDelete(pSrc); 78553f733c7Sdrh } 7862e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 78774ad7fe9Sdrh sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y); 78823b2db23Sdrh } 78951522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 79051522cd3Sdrh Expr *p = A = sqlite3Expr(TK_EXISTS, 0, 0, 0); 79151522cd3Sdrh if( p ){ 79251522cd3Sdrh p->pSelect = Y; 79351522cd3Sdrh sqlite3ExprSpan(p,&B,&E); 79453f733c7Sdrh }else{ 79553f733c7Sdrh sqlite3SelectDelete(Y); 79651522cd3Sdrh } 79751522cd3Sdrh } 79851522cd3Sdrh %endif // SQLITE_OMIT_SUBQUERY 799fef5208cSdrh 80017a7f8ddSdrh /* CASE expressions */ 80117a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 8024adee20fSdanielk1977 A = sqlite3Expr(TK_CASE, X, Z, 0); 80353f733c7Sdrh if( A ){ 80453f733c7Sdrh A->pList = Y; 80553f733c7Sdrh }else{ 80653f733c7Sdrh sqlite3ExprListDelete(Y); 80753f733c7Sdrh } 8084adee20fSdanielk1977 sqlite3ExprSpan(A, &C, &E); 80917a7f8ddSdrh } 81017a7f8ddSdrh %type case_exprlist {ExprList*} 8114adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);} 81217a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 8134adee20fSdanielk1977 A = sqlite3ExprListAppend(X, Y, 0); 8144adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 81517a7f8ddSdrh } 81617a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 8174adee20fSdanielk1977 A = sqlite3ExprListAppend(0, Y, 0); 8184adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 81917a7f8ddSdrh } 82017a7f8ddSdrh %type case_else {Expr*} 821dba99bccSdanielk1977 %destructor case_else {sqlite3ExprDelete($$);} 82217a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 82317a7f8ddSdrh case_else(A) ::= . {A = 0;} 82417a7f8ddSdrh %type case_operand {Expr*} 825dba99bccSdanielk1977 %destructor case_operand {sqlite3ExprDelete($$);} 82617a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 82717a7f8ddSdrh case_operand(A) ::= . {A = 0;} 828348784efSdrh 829348784efSdrh %type exprlist {ExprList*} 8304adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);} 831348784efSdrh %type expritem {Expr*} 8324adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);} 833348784efSdrh 834348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y). 8354adee20fSdanielk1977 {A = sqlite3ExprListAppend(X,Y,0);} 8364adee20fSdanielk1977 exprlist(A) ::= expritem(X). {A = sqlite3ExprListAppend(0,X,0);} 837348784efSdrh expritem(A) ::= expr(X). {A = X;} 838348784efSdrh expritem(A) ::= . {A = 0;} 839cce7d176Sdrh 840382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 841382c0247Sdrh // 8424d91a701Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 8432b6d46b9Sdanielk1977 ON nm(Y) LP idxlist(Z) RP(E) onconf(R). { 8449cfcf5d4Sdrh if( U!=OE_None ) U = R; 8459cfcf5d4Sdrh if( U==OE_Default) U = OE_Abort; 846fdd6e85aSdrh sqlite3CreateIndex(pParse, &X, &D, sqlite3SrcListAppend(0,&Y,0), Z, U, 8474d91a701Sdrh &S, &E, SQLITE_SO_ASC, NE); 8489cfcf5d4Sdrh } 849717e6402Sdrh 850717e6402Sdrh %type uniqueflag {int} 8519cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 8529cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 853348784efSdrh 8540202b29eSdanielk1977 %type idxlist {ExprList*} 8550202b29eSdanielk1977 %destructor idxlist {sqlite3ExprListDelete($$);} 8560202b29eSdanielk1977 %type idxlist_opt {ExprList*} 8570202b29eSdanielk1977 %destructor idxlist_opt {sqlite3ExprListDelete($$);} 858348784efSdrh %type idxitem {Token} 859348784efSdrh 860c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 861c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 862fdd6e85aSdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder(Z). { 8630202b29eSdanielk1977 Expr *p = 0; 8640202b29eSdanielk1977 if( C.n>0 ){ 8650202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 8662646da7eSdrh if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); 8670202b29eSdanielk1977 } 8680202b29eSdanielk1977 A = sqlite3ExprListAppend(X, p, &Y); 869fdd6e85aSdrh if( A ) A->a[A->nExpr-1].sortOrder = Z; 8700202b29eSdanielk1977 } 871fdd6e85aSdrh idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). { 8720202b29eSdanielk1977 Expr *p = 0; 8730202b29eSdanielk1977 if( C.n>0 ){ 8740202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 8752646da7eSdrh if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); 8760202b29eSdanielk1977 } 8770202b29eSdanielk1977 A = sqlite3ExprListAppend(0, p, &Y); 878fdd6e85aSdrh if( A ) A->a[A->nExpr-1].sortOrder = Z; 8790202b29eSdanielk1977 } 8800202b29eSdanielk1977 idxitem(A) ::= nm(X). {A = X;} 8810202b29eSdanielk1977 882348784efSdrh 8838aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 884382c0247Sdrh // 8854d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 886982cef7eSdrh 887382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 888382c0247Sdrh // 8894adee20fSdanielk1977 cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 89074ad7fe9Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse,0);} 891f57b14a6Sdrh 892382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 893382c0247Sdrh // 89413d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 89591cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ nm(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 89691cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 89791cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 89891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). { 89991cf71b0Sdanielk1977 sqlite3Pragma(pParse,&X,&Z,&Y,1); 90091cf71b0Sdanielk1977 } 90191cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 90291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 90313d7042aSdrh %endif // SQLITE_OMIT_PRAGMA 904f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 905f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 906fd405314Sdrh number(A) ::= INTEGER|FLOAT(X). {A = X;} 907f57b14a6Sdrh plus_opt ::= PLUS. 908f57b14a6Sdrh plus_opt ::= . 909c3f9bad2Sdanielk1977 910c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 911f0f258b1Sdrh 912b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 913b7f9164eSdrh 9143df6b257Sdanielk1977 cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 9154b59ab5eSdrh Token all; 9164b59ab5eSdrh all.z = A.z; 9174b59ab5eSdrh all.n = (Z.z - A.z) + Z.n; 9184adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 919f0f258b1Sdrh } 920f0f258b1Sdrh 92174ad7fe9Sdrh trigger_decl(A) ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C) 92274ad7fe9Sdrh trigger_event(D) 92374ad7fe9Sdrh ON fullname(E) foreach_clause(F) when_clause(G). { 92474ad7fe9Sdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, F, G, T); 9253df6b257Sdanielk1977 A = (Z.n==0?B:Z); 926c3f9bad2Sdanielk1977 } 927c3f9bad2Sdanielk1977 928c3f9bad2Sdanielk1977 %type trigger_time {int} 929c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 930c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 931c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 932c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 933c3f9bad2Sdanielk1977 934ad3cab52Sdrh %type trigger_event {struct TrigEvent} 9354adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);} 936fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 93774ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 938c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 939c3f9bad2Sdanielk1977 940c3f9bad2Sdanielk1977 %type foreach_clause {int} 941c3f9bad2Sdanielk1977 foreach_clause(A) ::= . { A = TK_ROW; } 942c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } 943c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } 944c3f9bad2Sdanielk1977 945c3f9bad2Sdanielk1977 %type when_clause {Expr*} 946dba99bccSdanielk1977 %destructor when_clause {sqlite3ExprDelete($$);} 947c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 948c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 949c3f9bad2Sdanielk1977 950c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 9514adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} 952c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { 953a69d9168Sdrh X->pNext = Y; 954a69d9168Sdrh A = X; 955a69d9168Sdrh } 956c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; } 957c3f9bad2Sdanielk1977 958c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 9594adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} 960c3f9bad2Sdanielk1977 // UPDATE 9615ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 9624adee20fSdanielk1977 { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); } 963c3f9bad2Sdanielk1977 964c3f9bad2Sdanielk1977 // INSERT 9653054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 966c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 9674adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);} 968c3f9bad2Sdanielk1977 9693054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 9704adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);} 971c3f9bad2Sdanielk1977 972c3f9bad2Sdanielk1977 // DELETE 9735ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 9744adee20fSdanielk1977 {A = sqlite3TriggerDeleteStep(&X, Y);} 975c3f9bad2Sdanielk1977 976c3f9bad2Sdanielk1977 // SELECT 9774adee20fSdanielk1977 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(X); } 978c3f9bad2Sdanielk1977 9796f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 9804b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 9814adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, 0); 9824b59ab5eSdrh A->iColumn = OE_Ignore; 9834adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 9844b59ab5eSdrh } 98574ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 9864adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 98774ad7fe9Sdrh A->iColumn = T; 9884adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 9894b59ab5eSdrh } 990b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER 991b7f9164eSdrh 99274ad7fe9Sdrh %type raisetype {int} 99374ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 99474ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 99574ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 99674ad7fe9Sdrh 9976f34903eSdanielk1977 998c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 999b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 100074ad7fe9Sdrh cmd ::= DROP TRIGGER fullname(X). { 100174ad7fe9Sdrh sqlite3DropTrigger(pParse,X); 1002c3f9bad2Sdanielk1977 } 1003b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER 1004113088ecSdrh 1005113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1006f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1007f744bb56Sdanielk1977 sqlite3Attach(pParse, F, D, K); 10081c2d8414Sdrh } 1009f744bb56Sdanielk1977 %type key_opt {Expr *} 1010dba99bccSdanielk1977 %destructor key_opt {sqlite3ExprDelete($$);} 1011f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1012f744bb56Sdanielk1977 key_opt(A) ::= KEY expr(X). { A = X; } 1013113088ecSdrh 1014113088ecSdrh database_kw_opt ::= DATABASE. 1015113088ecSdrh database_kw_opt ::= . 1016113088ecSdrh 1017113088ecSdrh //////////////////////// DETACH DATABASE name ///////////////////////////////// 1018f744bb56Sdanielk1977 cmd ::= DETACH database_kw_opt expr(D). { 1019f744bb56Sdanielk1977 sqlite3Detach(pParse, D); 10201c2d8414Sdrh } 10214343fea2Sdrh 10224343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 10234343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 10244343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 10254343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 10264343fea2Sdrh %endif 10279fd2a9a0Sdanielk1977 10289f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 10299f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 10309f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 10319f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 10329f18e8a0Sdrh %endif 10339f18e8a0Sdrh 10349fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 10359fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 10369fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 10379fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 10389fd2a9a0Sdanielk1977 } 103919a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 104019a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 104119a8e7e8Sdanielk1977 } 104219a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 104319a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 104419a8e7e8Sdanielk1977 } 104519a8e7e8Sdanielk1977 kwcolumn_opt ::= . 104619a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 10479fd2a9a0Sdanielk1977 %endif 1048