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*aee18ef8Sdanielk1977 ** @(#) $Id: parse.y,v 1.167 2005/03/09 12:26:51 danielk1977 Exp $ 18348784efSdrh */ 19348784efSdrh %token_prefix TK_ 20348784efSdrh %token_type {Token} 21f57b14a6Sdrh %default_type {Token} 22348784efSdrh %extra_argument {Parse *pParse} 23348784efSdrh %syntax_error { 24b86ccfb2Sdrh if( pParse->zErrMsg==0 ){ 25b86ccfb2Sdrh if( TOKEN.z[0] ){ 264adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 27b86ccfb2Sdrh }else{ 284adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "incomplete SQL statement"); 29b86ccfb2Sdrh } 30b86ccfb2Sdrh } 31348784efSdrh } 324adee20fSdanielk1977 %name sqlite3Parser 33348784efSdrh %include { 34348784efSdrh #include "sqliteInt.h" 35348784efSdrh #include "parse.h" 369bbca4c1Sdrh 379bbca4c1Sdrh /* 38ad3cab52Sdrh ** An instance of this structure holds information about the 39ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 409bbca4c1Sdrh */ 41ad3cab52Sdrh struct LimitVal { 42a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 43a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 44ad3cab52Sdrh }; 45c3f9bad2Sdanielk1977 46c3f9bad2Sdanielk1977 /* 472e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 482e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 492e3a1f16Sdrh */ 502e3a1f16Sdrh struct LikeOp { 512e3a1f16Sdrh int opcode; /* Either TK_GLOB or TK_LIKE */ 522e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 532e3a1f16Sdrh }; 542e3a1f16Sdrh 552e3a1f16Sdrh /* 56ad3cab52Sdrh ** An instance of the following structure describes the event of a 57ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 58ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 59ad3cab52Sdrh ** 60ad3cab52Sdrh ** UPDATE ON (a,b,c) 61ad3cab52Sdrh ** 62ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 63c3f9bad2Sdanielk1977 */ 64ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 65caec2f12Sdrh 6625d6543dSdrh /* 6725d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 6825d6543dSdrh */ 6925d6543dSdrh struct AttachKey { int type; Token key; }; 7025d6543dSdrh 71caec2f12Sdrh } // end %include 72348784efSdrh 73348784efSdrh // These are extra tokens used by the lexer but never seen by the 74348784efSdrh // parser. We put them in a rule so that the parser generator will 756206d50aSdrh // add them to the parse.h output file. 76348784efSdrh // 77c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION 78c4a3c779Sdrh COLUMN AGG_FUNCTION. 79c4a3c779Sdrh 80826fb5a3Sdrh // Input is a single SQL command 81c4a3c779Sdrh input ::= cmdlist. 82094b2bbfSdrh cmdlist ::= cmdlist ecmd. 83826fb5a3Sdrh cmdlist ::= ecmd. 8480242055Sdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 85b7f9164eSdrh ecmd ::= SEMI. 86b7f9164eSdrh ecmd ::= explain cmdx SEMI. 874adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 88b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 89b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 90b7f9164eSdrh %endif 91348784efSdrh 92382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 93c4a3c779Sdrh // 94fa86c412Sdrh 95684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 96c4a3c779Sdrh trans_opt ::= . 97c4a3c779Sdrh trans_opt ::= TRANSACTION. 985ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 99684917c2Sdrh %type transtype {int} 100684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 101684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 102684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 103684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1044adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1054adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1064adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 107c4a3c779Sdrh 108382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 109348784efSdrh // 110348784efSdrh cmd ::= create_table create_table_args. 111cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). { 112cbb18d22Sdanielk1977 sqlite3StartTable(pParse,&X,&Y,&Z,T,0); 113969fa7c1Sdrh } 114f57b3399Sdrh %type temp {int} 115d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 116d24cc427Sdrh temp(A) ::= . {A = 0;} 117969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). { 1184adee20fSdanielk1977 sqlite3EndTable(pParse,&X,0); 119969fa7c1Sdrh } 120969fa7c1Sdrh create_table_args ::= AS select(S). { 1214adee20fSdanielk1977 sqlite3EndTable(pParse,0,S); 1224adee20fSdanielk1977 sqlite3SelectDelete(S); 123969fa7c1Sdrh } 124348784efSdrh columnlist ::= columnlist COMMA column. 125348784efSdrh columnlist ::= column. 126348784efSdrh 127348784efSdrh // About the only information used for a column is the name of the 128348784efSdrh // column. The type is always just "text". But the code will accept 129348784efSdrh // an elaborate typename. Perhaps someday we'll do something with it. 130348784efSdrh // 131348784efSdrh column ::= columnid type carglist. 1324adee20fSdanielk1977 columnid ::= nm(X). {sqlite3AddColumn(pParse,&X);} 133c4a3c779Sdrh 134c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 135c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 136c4a3c779Sdrh // 137982cef7eSdrh %type id {Token} 138f18543caSdrh id(A) ::= ID(X). {A = X;} 1390bd1f4eaSdrh 14034e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 14134e33bb8Sdrh // fallback to ID if they will not parse as their original value. 14234e33bb8Sdrh // This obviates the need for the "id" nonterminal. 14334e33bb8Sdrh // 1440bd1f4eaSdrh %fallback ID 14510e8266bSdrh ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CONFLICT 146684917c2Sdrh DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 147319e4e74Sdrh GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY 1485ad1a6c8Sdrh OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT 149b7f9164eSdrh TEMP TRIGGER VACUUM VIEW 150b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 151b7f9164eSdrh EXCEPT INTERSECT UNION 152b7f9164eSdrh %endif 1532958a4e6Sdrh REINDEX RENAME CDATE CTIME CTIMESTAMP ALTER 154b7f9164eSdrh . 155c4a3c779Sdrh 1562d3917daSdrh // Define operator precedence early so that this is the first occurance 1572d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 1582d3917daSdrh // causes them to be assigned integer values that are close together, 1592d3917daSdrh // which keeps parser tables smaller. 1602d3917daSdrh // 161f2bc013cSdrh // The token values assigned to these symbols is determined by the order 162f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 163f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 164f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 165f2bc013cSdrh // constraint. 166f2bc013cSdrh // 1672d3917daSdrh %left OR. 1682d3917daSdrh %left AND. 1692d3917daSdrh %right NOT. 170f2bc013cSdrh %left IS LIKE GLOB BETWEEN IN ISNULL NOTNULL NE EQ. 1719a43267bSdrh %left GT LE LT GE. 1727c6303c0Sdanielk1977 %right ESCAPE. 1732d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 1742d3917daSdrh %left PLUS MINUS. 1752d3917daSdrh %left STAR SLASH REM. 1762d3917daSdrh %left CONCAT. 1772d3917daSdrh %right UMINUS UPLUS BITNOT. 1782d3917daSdrh 179c4a3c779Sdrh // And "ids" is an identifer-or-string. 180c4a3c779Sdrh // 181c4a3c779Sdrh %type ids {Token} 1825ad1a6c8Sdrh ids(A) ::= ID(X). {A = X;} 183c4a3c779Sdrh ids(A) ::= STRING(X). {A = X;} 184c4a3c779Sdrh 1855ad1a6c8Sdrh // The name of a column or table can be any of the following: 1865ad1a6c8Sdrh // 1875ad1a6c8Sdrh %type nm {Token} 1885ad1a6c8Sdrh nm(A) ::= ID(X). {A = X;} 1895ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 1905ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 1915ad1a6c8Sdrh 192382c0247Sdrh type ::= . 1934adee20fSdanielk1977 type ::= typename(X). {sqlite3AddColumnType(pParse,&X,&X);} 1944adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y). {sqlite3AddColumnType(pParse,&X,&Y);} 195382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y). 1964adee20fSdanielk1977 {sqlite3AddColumnType(pParse,&X,&Y);} 197382c0247Sdrh %type typename {Token} 198382c0247Sdrh typename(A) ::= ids(X). {A = X;} 199596bd235Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);} 200ef0cae50Sdrh %type signed {int} 20174ad7fe9Sdrh signed(A) ::= plus_num(X). { A = atoi(X.z); } 20274ad7fe9Sdrh signed(A) ::= minus_num(X). { A = -atoi(X.z); } 203348784efSdrh carglist ::= carglist carg. 204348784efSdrh carglist ::= . 2055ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 206348784efSdrh carg ::= ccons. 2077977a17fSdanielk1977 carg ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,X);} 2087977a17fSdanielk1977 carg ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,X);} 2097977a17fSdanielk1977 carg ::= DEFAULT MINUS term(X). { 2107977a17fSdanielk1977 Expr *p = sqlite3Expr(TK_UMINUS, X, 0, 0); 2117977a17fSdanielk1977 sqlite3AddDefaultValue(pParse,p); 2127977a17fSdanielk1977 } 2137977a17fSdanielk1977 carg ::= DEFAULT id(X). { 2147977a17fSdanielk1977 Expr *p = sqlite3Expr(TK_STRING, 0, 0, &X); 2157977a17fSdanielk1977 sqlite3AddDefaultValue(pParse,p); 2167977a17fSdanielk1977 } 217348784efSdrh 218382c0247Sdrh // In addition to the type name, we also care about the primary key and 219382c0247Sdrh // UNIQUE constraints. 220348784efSdrh // 2210d316a40Sdrh ccons ::= NULL onconf. 2224adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 223205f48e6Sdrh ccons ::= PRIMARY KEY sortorder onconf(R) autoinc(I). 224205f48e6Sdrh {sqlite3AddPrimaryKey(pParse,0,R,I);} 225cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);} 2269cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf. 227c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 2284adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 2294adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 230d3d39e93Sdrh ccons ::= COLLATE id(C). {sqlite3AddCollateType(pParse, C.z, C.n);} 23104738cb9Sdrh 232205f48e6Sdrh // The optional AUTOINCREMENT keyword 233205f48e6Sdrh %type autoinc {int} 234205f48e6Sdrh autoinc(X) ::= . {X = 0;} 2352958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 236205f48e6Sdrh 237c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 238c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 239c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 240c2eef3b3Sdrh // check fails. 24104738cb9Sdrh // 242c2eef3b3Sdrh %type refargs {int} 243c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 244c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } 245c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 246c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 247c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 248c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 249c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 250c2eef3b3Sdrh %type refact {int} 251c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 252c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 253c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 254c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 255c2eef3b3Sdrh %type defer_subclause {int} 256c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 257c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 258c2eef3b3Sdrh %type init_deferred_pred_opt {int} 259c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 260c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 261c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 262348784efSdrh 263348784efSdrh // For the time being, the only constraint we care about is the primary 264382c0247Sdrh // key and UNIQUE. Both create indices. 265348784efSdrh // 266348784efSdrh conslist_opt ::= . 267348784efSdrh conslist_opt ::= COMMA conslist. 268348784efSdrh conslist ::= conslist COMMA tcons. 269a2e1bb5aSdrh conslist ::= conslist tcons. 270348784efSdrh conslist ::= tcons. 2715ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 272f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 273205f48e6Sdrh {sqlite3AddPrimaryKey(pParse,X,R,I);} 2749cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 275cbb18d22Sdanielk1977 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);} 2769cfcf5d4Sdrh tcons ::= CHECK expr onconf. 277c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 278c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 2794adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 2804adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 281c2eef3b3Sdrh } 282c2eef3b3Sdrh %type defer_subclause_opt {int} 283c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 284c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 2859cfcf5d4Sdrh 2869cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 2879cfcf5d4Sdrh // default behavior when there is a constraint conflict. 2889cfcf5d4Sdrh // 2899cfcf5d4Sdrh %type onconf {int} 2901c92853dSdrh %type orconf {int} 2911c92853dSdrh %type resolvetype {int} 2921c92853dSdrh onconf(A) ::= . {A = OE_Default;} 2931c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 2941c92853dSdrh orconf(A) ::= . {A = OE_Default;} 2951c92853dSdrh orconf(A) ::= OR resolvetype(X). {A = X;} 29674ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 2971c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 2981c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 299348784efSdrh 300382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 301348784efSdrh // 30274ad7fe9Sdrh cmd ::= DROP TABLE fullname(X). { 30374ad7fe9Sdrh sqlite3DropTable(pParse, X, 0); 304a8858103Sdanielk1977 } 305348784efSdrh 306a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 307a76b5dfcSdrh // 308b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 30948dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). { 31048dec7e2Sdanielk1977 sqlite3CreateView(pParse, &X, &Y, &Z, S, T); 311a76b5dfcSdrh } 31274ad7fe9Sdrh cmd ::= DROP VIEW fullname(X). { 31374ad7fe9Sdrh sqlite3DropTable(pParse, X, 1); 314a76b5dfcSdrh } 315b7f9164eSdrh %endif // SQLITE_OMIT_VIEW 316a76b5dfcSdrh 317382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 318348784efSdrh // 3199bb61fe7Sdrh cmd ::= select(X). { 320b3bce662Sdanielk1977 sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); 3214adee20fSdanielk1977 sqlite3SelectDelete(X); 3229bb61fe7Sdrh } 323efb7251dSdrh 3249bb61fe7Sdrh %type select {Select*} 3254adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);} 32682c3d636Sdrh %type oneselect {Select*} 3274adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);} 3289bb61fe7Sdrh 32982c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 330b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 3310a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 332daffd0e5Sdrh if( Z ){ 33382c3d636Sdrh Z->op = Y; 33482c3d636Sdrh Z->pPrior = X; 335daffd0e5Sdrh } 33682c3d636Sdrh A = Z; 33782c3d636Sdrh } 3380a36c57eSdrh %type multiselect_op {int} 33974ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 3400a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 34174ad7fe9Sdrh multiselect_op(A) ::= INTERSECT(OP). {A = @OP;} 34274ad7fe9Sdrh multiselect_op(A) ::= EXCEPT(OP). {A = @OP;} 343b7f9164eSdrh %endif // SQLITE_OMIT_COMPOUND_SELECT 34482c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 3459bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 346a2dc3b1aSdanielk1977 A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 3479bb61fe7Sdrh } 3489bb61fe7Sdrh 3499bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 3509bb61fe7Sdrh // present and false (0) if it is not. 3519bb61fe7Sdrh // 352efb7251dSdrh %type distinct {int} 353efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 354fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 355efb7251dSdrh distinct(A) ::= . {A = 0;} 356348784efSdrh 3579bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 3587c917d19Sdrh // values of the SELECT statement. The "*" in statements like 3597c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 3607c917d19Sdrh // opcode of TK_ALL. 3619bb61fe7Sdrh // 362348784efSdrh %type selcollist {ExprList*} 3634adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);} 364348784efSdrh %type sclp {ExprList*} 3654adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);} 366348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 367348784efSdrh sclp(A) ::= . {A = 0;} 36801f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 3694adee20fSdanielk1977 A = sqlite3ExprListAppend(P,X,Y.n?&Y:0); 37001f3f253Sdrh } 3717c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 3724adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0); 3737c917d19Sdrh } 3745ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. { 3754adee20fSdanielk1977 Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0); 3764adee20fSdanielk1977 Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X); 3774adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0); 37854473229Sdrh } 37901f3f253Sdrh 38001f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 38101f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 38201f3f253Sdrh // 38301f3f253Sdrh %type as {Token} 3845ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 3855ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 38601f3f253Sdrh as(X) ::= . {X.n = 0;} 3879bb61fe7Sdrh 388348784efSdrh 389ad3cab52Sdrh %type seltablist {SrcList*} 3904adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);} 391ad3cab52Sdrh %type stl_prefix {SrcList*} 3924adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);} 393ad3cab52Sdrh %type from {SrcList*} 3944adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);} 395348784efSdrh 39601f3f253Sdrh // A complete FROM clause. 39701f3f253Sdrh // 398bf3a4fa4Sdrh from(A) ::= . {A = sqliteMalloc(sizeof(*A));} 399348784efSdrh from(A) ::= FROM seltablist(X). {A = X;} 40001f3f253Sdrh 40101f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 40201f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 40301f3f253Sdrh // 40401f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 40501f3f253Sdrh A = X; 40601f3f253Sdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; 40701f3f253Sdrh } 408348784efSdrh stl_prefix(A) ::= . {A = 0;} 409113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { 4104adee20fSdanielk1977 A = sqlite3SrcListAppend(X,&Y,&D); 4114adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 41201f3f253Sdrh if( N ){ 41301f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 4144adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 415c4a3c779Sdrh } 41601f3f253Sdrh if( U ){ 41701f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 4184adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 41901f3f253Sdrh } 42001f3f253Sdrh } 42151522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 422b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP 423b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 4244adee20fSdanielk1977 A = sqlite3SrcListAppend(X,0,0); 425ad3cab52Sdrh A->a[A->nSrc-1].pSelect = S; 4264adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 42701f3f253Sdrh if( N ){ 42801f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 4294adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 43022f70c32Sdrh } 43101f3f253Sdrh if( U ){ 43201f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 4334adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 434d5feede1Sdrh } 43522f70c32Sdrh } 436348784efSdrh 437b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 438b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 439b733d037Sdrh // a grouping of table and subqueries. 440b733d037Sdrh // 441b733d037Sdrh %type seltablist_paren {Select*} 4424adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);} 443b733d037Sdrh seltablist_paren(A) ::= select(S). {A = S;} 444b733d037Sdrh seltablist_paren(A) ::= seltablist(F). { 445a2dc3b1aSdanielk1977 A = sqlite3SelectNew(0,F,0,0,0,0,0,0,0); 446b733d037Sdrh } 44751522cd3Sdrh %endif // SQLITE_OMIT_SUBQUERY 448b733d037Sdrh 449113088ecSdrh %type dbnm {Token} 450113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 451113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 452113088ecSdrh 45374ad7fe9Sdrh %type fullname {SrcList*} 45474ad7fe9Sdrh %destructor fullname {sqlite3SrcListDelete($$);} 45574ad7fe9Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(0,&X,&Y);} 45674ad7fe9Sdrh 45701f3f253Sdrh %type joinop {int} 45801f3f253Sdrh %type joinop2 {int} 45901f3f253Sdrh joinop(X) ::= COMMA. { X = JT_INNER; } 46001f3f253Sdrh joinop(X) ::= JOIN. { X = JT_INNER; } 4614adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 4624adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 4635ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 4644adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 46501f3f253Sdrh 46601f3f253Sdrh %type on_opt {Expr*} 4674adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);} 46801f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 46901f3f253Sdrh on_opt(N) ::= . {N = 0;} 47001f3f253Sdrh 47101f3f253Sdrh %type using_opt {IdList*} 4724adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);} 4730202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 47401f3f253Sdrh using_opt(U) ::= . {U = 0;} 47501f3f253Sdrh 47601f3f253Sdrh 477348784efSdrh %type orderby_opt {ExprList*} 4784adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);} 479348784efSdrh %type sortlist {ExprList*} 4804adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);} 481348784efSdrh %type sortitem {Expr*} 4824adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);} 483348784efSdrh 484348784efSdrh orderby_opt(A) ::= . {A = 0;} 485348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 4868e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). { 4871186b0a0Sdrh A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0); 488d3d39e93Sdrh if( A ) A->a[A->nExpr-1].sortOrder = Z; 489348784efSdrh } 49038640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). { 4911186b0a0Sdrh A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0); 49296fb0dd5Sdanielk1977 if( A && A->a ) A->a[0].sortOrder = Z; 493348784efSdrh } 494da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 495348784efSdrh 496348784efSdrh %type sortorder {int} 497d3d39e93Sdrh %type collate {Token} 498348784efSdrh 4998e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 5008e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 5018e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 502d3d39e93Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 503d3d39e93Sdrh collate(C) ::= COLLATE id(X). {C = X;} 504348784efSdrh 5052282792aSdrh %type groupby_opt {ExprList*} 5064adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);} 5072282792aSdrh groupby_opt(A) ::= . {A = 0;} 5082282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;} 5092282792aSdrh 5102282792aSdrh %type having_opt {Expr*} 5114adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);} 5122282792aSdrh having_opt(A) ::= . {A = 0;} 5132282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 5142282792aSdrh 515ad3cab52Sdrh %type limit_opt {struct LimitVal} 516a2dc3b1aSdanielk1977 %destructor limit_opt { 517a2dc3b1aSdanielk1977 sqlite3ExprDelete($$.pLimit); 518a2dc3b1aSdanielk1977 sqlite3ExprDelete($$.pOffset); 519a2dc3b1aSdanielk1977 } 520a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 521a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X; A.pOffset = 0;} 522a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 523a2dc3b1aSdanielk1977 {A.pLimit = X; A.pOffset = Y;} 524a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 525a2dc3b1aSdanielk1977 {A.pOffset = X; A.pLimit = Y;} 5269bbca4c1Sdrh 527382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 528382c0247Sdrh // 52974ad7fe9Sdrh cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);} 530348784efSdrh 531348784efSdrh %type where_opt {Expr*} 5324adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);} 533348784efSdrh 534348784efSdrh where_opt(A) ::= . {A = 0;} 535348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 536348784efSdrh 537348784efSdrh %type setlist {ExprList*} 5384adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);} 539348784efSdrh 540382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 541382c0247Sdrh // 54274ad7fe9Sdrh cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z). 54374ad7fe9Sdrh {sqlite3Update(pParse,X,Y,Z,R);} 544348784efSdrh 5455ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 5464adee20fSdanielk1977 {A = sqlite3ExprListAppend(Z,Y,&X);} 5474adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(0,Y,&X);} 548348784efSdrh 549382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 550382c0247Sdrh // 55174ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 552113088ecSdrh VALUES LP itemlist(Y) RP. 55374ad7fe9Sdrh {sqlite3Insert(pParse, X, Y, 0, F, R);} 55474ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 55574ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 556348784efSdrh 557fa86c412Sdrh %type insert_cmd {int} 558fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 559fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 560fa86c412Sdrh 561348784efSdrh 562348784efSdrh %type itemlist {ExprList*} 5634adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);} 564348784efSdrh 5654adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);} 5664adee20fSdanielk1977 itemlist(A) ::= expr(X). {A = sqlite3ExprListAppend(0,X,0);} 567348784efSdrh 568967e8b73Sdrh %type inscollist_opt {IdList*} 5694adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);} 570967e8b73Sdrh %type inscollist {IdList*} 5714adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);} 572348784efSdrh 573967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 574967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 5754adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqlite3IdListAppend(X,&Y);} 5764adee20fSdanielk1977 inscollist(A) ::= nm(Y). {A = sqlite3IdListAppend(0,&Y);} 577348784efSdrh 578382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 579382c0247Sdrh // 580348784efSdrh 581348784efSdrh %type expr {Expr*} 5824adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);} 5837977a17fSdanielk1977 %type term {Expr*} 5847977a17fSdanielk1977 %destructor term {sqlite3ExprDelete($$);} 585348784efSdrh 5867977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 587752e679aSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } 5887977a17fSdanielk1977 term(A) ::= NULL(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5894adee20fSdanielk1977 expr(A) ::= ID(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5904adee20fSdanielk1977 expr(A) ::= JOIN_KW(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5915ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 5924adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5934adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5944adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp2, 0); 595e1b6a5b8Sdrh } 596d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 5974adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5984adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5994adee20fSdanielk1977 Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z); 6004adee20fSdanielk1977 Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0); 6014adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp4, 0); 602d24cc427Sdrh } 6037977a17fSdanielk1977 term(A) ::= INTEGER(X). {A = sqlite3Expr(@X, 0, 0, &X);} 6047977a17fSdanielk1977 term(A) ::= FLOAT(X). {A = sqlite3Expr(@X, 0, 0, &X);} 6057977a17fSdanielk1977 term(A) ::= STRING(X). {A = sqlite3Expr(@X, 0, 0, &X);} 606*aee18ef8Sdanielk1977 term(A) ::= BLOB(X). {A = sqlite3Expr(@X, 0, 0, &X);} 6074e0cff60Sdrh expr(A) ::= REGISTER(X). {A = sqlite3RegisterExpr(pParse, &X);} 6087c972decSdrh expr(A) ::= VARIABLE(X). { 609895d7472Sdrh Token *pToken = &X; 610895d7472Sdrh Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken); 611fa6bc000Sdrh sqlite3ExprAssignVarNumber(pParse, pExpr); 612895d7472Sdrh } 613b3bce662Sdanielk1977 expr(A) ::= ID(X) LP exprlist(Y) RP(E). { 6144adee20fSdanielk1977 A = sqlite3ExprFunction(Y, &X); 6154adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 616e1b6a5b8Sdrh } 617e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 6184adee20fSdanielk1977 A = sqlite3ExprFunction(0, &X); 6194adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 620e1b6a5b8Sdrh } 6217977a17fSdanielk1977 term(A) ::= CTIME(OP). {A = sqlite3Expr(@OP,0,0,0);} 6227977a17fSdanielk1977 term(A) ::= CDATE(OP). {A = sqlite3Expr(@OP,0,0,0);} 6237977a17fSdanielk1977 term(A) ::= CTIMESTAMP(OP). {A = sqlite3Expr(@OP,0,0,0);} 6247ac25c75Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6257ac25c75Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6267ac25c75Sdrh expr(A) ::= expr(X) LT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6277ac25c75Sdrh expr(A) ::= expr(X) GT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6287ac25c75Sdrh expr(A) ::= expr(X) LE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6297ac25c75Sdrh expr(A) ::= expr(X) GE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6307ac25c75Sdrh expr(A) ::= expr(X) NE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6317ac25c75Sdrh expr(A) ::= expr(X) EQ(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6327ac25c75Sdrh expr(A) ::= expr(X) BITAND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6337ac25c75Sdrh expr(A) ::= expr(X) BITOR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6347ac25c75Sdrh expr(A) ::= expr(X) LSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6357ac25c75Sdrh expr(A) ::= expr(X) RSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 63674ad7fe9Sdrh expr(A) ::= expr(X) PLUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 63774ad7fe9Sdrh expr(A) ::= expr(X) MINUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 63874ad7fe9Sdrh expr(A) ::= expr(X) STAR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 63974ad7fe9Sdrh expr(A) ::= expr(X) SLASH(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 64074ad7fe9Sdrh expr(A) ::= expr(X) REM(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 64174ad7fe9Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 64274ad7fe9Sdrh %type likeop {struct LikeOp} 64374ad7fe9Sdrh likeop(A) ::= LIKE. {A.opcode = TK_LIKE; A.not = 0;} 64474ad7fe9Sdrh likeop(A) ::= GLOB. {A.opcode = TK_GLOB; A.not = 0;} 64574ad7fe9Sdrh likeop(A) ::= NOT LIKE. {A.opcode = TK_LIKE; A.not = 1;} 64674ad7fe9Sdrh likeop(A) ::= NOT GLOB. {A.opcode = TK_GLOB; A.not = 1;} 6477c6303c0Sdanielk1977 %type escape {Expr*} 6487c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;} 6497c6303c0Sdanielk1977 escape(X) ::= . [ESCAPE] {X = 0;} 6507c6303c0Sdanielk1977 expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE] { 6514adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 6524adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 6537c6303c0Sdanielk1977 if( E ){ 6547c6303c0Sdanielk1977 pList = sqlite3ExprListAppend(pList, E, 0); 6557c6303c0Sdanielk1977 } 6564adee20fSdanielk1977 A = sqlite3ExprFunction(pList, 0); 6572e3a1f16Sdrh if( A ) A->op = OP.opcode; 6582e3a1f16Sdrh if( OP.not ) A = sqlite3Expr(TK_NOT, A, 0, 0); 6594adee20fSdanielk1977 sqlite3ExprSpan(A, &X->span, &Y->span); 6600ac65892Sdrh } 6617c6303c0Sdanielk1977 662e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). { 6634adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6644adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 665e1b6a5b8Sdrh } 66633048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 6674adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6684adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 66933048c0bSdrh } 67033048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). { 6714adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6724adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 67333048c0bSdrh } 674e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). { 6754adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6764adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 677e1b6a5b8Sdrh } 67881a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 6794adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6804adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 68181a20f21Sdrh } 682e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). { 6837ac25c75Sdrh A = sqlite3Expr(@B, X, 0, 0); 6844adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 685e1b6a5b8Sdrh } 68681a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). { 6877ac25c75Sdrh A = sqlite3Expr(@B, X, 0, 0); 6884adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 68981a20f21Sdrh } 690e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 6914adee20fSdanielk1977 A = sqlite3Expr(TK_UMINUS, X, 0, 0); 6924adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 693e1b6a5b8Sdrh } 6944b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 6954adee20fSdanielk1977 A = sqlite3Expr(TK_UPLUS, X, 0, 0); 6964adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 697e1b6a5b8Sdrh } 6982e3a1f16Sdrh %type between_op {int} 6992e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 7002e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 7012e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 7024adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 7034adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 7044adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 705daffd0e5Sdrh if( A ) A->pList = pList; 7062e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 7074adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 708fef5208cSdrh } 7093e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 7102e3a1f16Sdrh %type in_op {int} 7112e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 7122e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 7132e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 7144adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 715daffd0e5Sdrh if( A ) A->pList = Y; 7162e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 7174adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 718fef5208cSdrh } 71951522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 72051522cd3Sdrh A = sqlite3Expr(TK_SELECT, 0, 0, 0); 72151522cd3Sdrh if( A ) A->pSelect = X; 72251522cd3Sdrh sqlite3ExprSpan(A,&B,&E); 72351522cd3Sdrh } 7242e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 7254adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 726daffd0e5Sdrh if( A ) A->pSelect = Y; 7272e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 7284adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 729fef5208cSdrh } 73074ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 73174ad7fe9Sdrh SrcList *pSrc = sqlite3SrcListAppend(0,&Y,&Z); 7324adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 733a2dc3b1aSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,0,0); 7342e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 73574ad7fe9Sdrh sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y); 73623b2db23Sdrh } 73751522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 73851522cd3Sdrh Expr *p = A = sqlite3Expr(TK_EXISTS, 0, 0, 0); 73951522cd3Sdrh if( p ){ 74051522cd3Sdrh p->pSelect = Y; 74151522cd3Sdrh sqlite3ExprSpan(p,&B,&E); 74251522cd3Sdrh } 74351522cd3Sdrh } 74451522cd3Sdrh %endif // SQLITE_OMIT_SUBQUERY 745fef5208cSdrh 74617a7f8ddSdrh /* CASE expressions */ 74717a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 7484adee20fSdanielk1977 A = sqlite3Expr(TK_CASE, X, Z, 0); 74917a7f8ddSdrh if( A ) A->pList = Y; 7504adee20fSdanielk1977 sqlite3ExprSpan(A, &C, &E); 75117a7f8ddSdrh } 75217a7f8ddSdrh %type case_exprlist {ExprList*} 7534adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);} 75417a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 7554adee20fSdanielk1977 A = sqlite3ExprListAppend(X, Y, 0); 7564adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 75717a7f8ddSdrh } 75817a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 7594adee20fSdanielk1977 A = sqlite3ExprListAppend(0, Y, 0); 7604adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 76117a7f8ddSdrh } 76217a7f8ddSdrh %type case_else {Expr*} 76317a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 76417a7f8ddSdrh case_else(A) ::= . {A = 0;} 76517a7f8ddSdrh %type case_operand {Expr*} 76617a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 76717a7f8ddSdrh case_operand(A) ::= . {A = 0;} 768348784efSdrh 769348784efSdrh %type exprlist {ExprList*} 7704adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);} 771348784efSdrh %type expritem {Expr*} 7724adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);} 773348784efSdrh 774348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y). 7754adee20fSdanielk1977 {A = sqlite3ExprListAppend(X,Y,0);} 7764adee20fSdanielk1977 exprlist(A) ::= expritem(X). {A = sqlite3ExprListAppend(0,X,0);} 777348784efSdrh expritem(A) ::= expr(X). {A = X;} 778348784efSdrh expritem(A) ::= . {A = 0;} 779cce7d176Sdrh 780382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 781382c0247Sdrh // 782cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D) 7832b6d46b9Sdanielk1977 ON nm(Y) LP idxlist(Z) RP(E) onconf(R). { 7849cfcf5d4Sdrh if( U!=OE_None ) U = R; 7859cfcf5d4Sdrh if( U==OE_Default) U = OE_Abort; 7862b6d46b9Sdanielk1977 sqlite3CreateIndex(pParse, &X, &D, sqlite3SrcListAppend(0,&Y,0),Z,U, &S, &E); 7879cfcf5d4Sdrh } 788717e6402Sdrh 789717e6402Sdrh %type uniqueflag {int} 7909cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 7919cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 792348784efSdrh 7930202b29eSdanielk1977 %type idxlist {ExprList*} 7940202b29eSdanielk1977 %destructor idxlist {sqlite3ExprListDelete($$);} 7950202b29eSdanielk1977 %type idxlist_opt {ExprList*} 7960202b29eSdanielk1977 %destructor idxlist_opt {sqlite3ExprListDelete($$);} 797348784efSdrh %type idxitem {Token} 798348784efSdrh 799c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 800c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 8010202b29eSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder. { 8020202b29eSdanielk1977 Expr *p = 0; 8030202b29eSdanielk1977 if( C.n>0 ){ 8040202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 8050202b29eSdanielk1977 if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n); 8060202b29eSdanielk1977 } 8070202b29eSdanielk1977 A = sqlite3ExprListAppend(X, p, &Y); 8080202b29eSdanielk1977 } 8090202b29eSdanielk1977 idxlist(A) ::= idxitem(Y) collate(C) sortorder. { 8100202b29eSdanielk1977 Expr *p = 0; 8110202b29eSdanielk1977 if( C.n>0 ){ 8120202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 8130202b29eSdanielk1977 if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n); 8140202b29eSdanielk1977 } 8150202b29eSdanielk1977 A = sqlite3ExprListAppend(0, p, &Y); 8160202b29eSdanielk1977 } 8170202b29eSdanielk1977 idxitem(A) ::= nm(X). {A = X;} 8180202b29eSdanielk1977 819348784efSdrh 8208aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 821382c0247Sdrh // 82274ad7fe9Sdrh cmd ::= DROP INDEX fullname(X). {sqlite3DropIndex(pParse, X);} 823982cef7eSdrh 824382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 825382c0247Sdrh // 8264adee20fSdanielk1977 cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 82774ad7fe9Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse,0);} 828f57b14a6Sdrh 829382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 830382c0247Sdrh // 83113d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 83291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ nm(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 83391cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 83491cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 83591cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). { 83691cf71b0Sdanielk1977 sqlite3Pragma(pParse,&X,&Z,&Y,1); 83791cf71b0Sdanielk1977 } 83891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 83991cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 84013d7042aSdrh %endif // SQLITE_OMIT_PRAGMA 841f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 842f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 843f57b14a6Sdrh number(A) ::= INTEGER(X). {A = X;} 844f57b14a6Sdrh number(A) ::= FLOAT(X). {A = X;} 845f57b14a6Sdrh plus_opt ::= PLUS. 846f57b14a6Sdrh plus_opt ::= . 847c3f9bad2Sdanielk1977 848c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 849f0f258b1Sdrh 850b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 851b7f9164eSdrh 8523df6b257Sdanielk1977 cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 8534b59ab5eSdrh Token all; 8544b59ab5eSdrh all.z = A.z; 8554b59ab5eSdrh all.n = (Z.z - A.z) + Z.n; 8564adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 857f0f258b1Sdrh } 858f0f258b1Sdrh 85974ad7fe9Sdrh trigger_decl(A) ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C) 86074ad7fe9Sdrh trigger_event(D) 86174ad7fe9Sdrh ON fullname(E) foreach_clause(F) when_clause(G). { 86274ad7fe9Sdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, F, G, T); 8633df6b257Sdanielk1977 A = (Z.n==0?B:Z); 864c3f9bad2Sdanielk1977 } 865c3f9bad2Sdanielk1977 866c3f9bad2Sdanielk1977 %type trigger_time {int} 867c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 868c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 869c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 870c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 871c3f9bad2Sdanielk1977 872ad3cab52Sdrh %type trigger_event {struct TrigEvent} 8734adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);} 87474ad7fe9Sdrh trigger_event(A) ::= DELETE(OP). {A.a = @OP; A.b = 0;} 87574ad7fe9Sdrh trigger_event(A) ::= INSERT(OP). {A.a = @OP; A.b = 0;} 87674ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 877c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 878c3f9bad2Sdanielk1977 879c3f9bad2Sdanielk1977 %type foreach_clause {int} 880c3f9bad2Sdanielk1977 foreach_clause(A) ::= . { A = TK_ROW; } 881c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } 882c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } 883c3f9bad2Sdanielk1977 884c3f9bad2Sdanielk1977 %type when_clause {Expr*} 885c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 886c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 887c3f9bad2Sdanielk1977 888c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 8894adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} 890c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { 891a69d9168Sdrh X->pNext = Y; 892a69d9168Sdrh A = X; 893a69d9168Sdrh } 894c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; } 895c3f9bad2Sdanielk1977 896c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 8974adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} 898c3f9bad2Sdanielk1977 // UPDATE 8995ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 9004adee20fSdanielk1977 { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); } 901c3f9bad2Sdanielk1977 902c3f9bad2Sdanielk1977 // INSERT 9033054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 904c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 9054adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);} 906c3f9bad2Sdanielk1977 9073054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 9084adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);} 909c3f9bad2Sdanielk1977 910c3f9bad2Sdanielk1977 // DELETE 9115ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 9124adee20fSdanielk1977 {A = sqlite3TriggerDeleteStep(&X, Y);} 913c3f9bad2Sdanielk1977 914c3f9bad2Sdanielk1977 // SELECT 9154adee20fSdanielk1977 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(X); } 916c3f9bad2Sdanielk1977 9176f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 9184b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 9194adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, 0); 9204b59ab5eSdrh A->iColumn = OE_Ignore; 9214adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 9224b59ab5eSdrh } 92374ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 9244adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 92574ad7fe9Sdrh A->iColumn = T; 9264adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 9274b59ab5eSdrh } 928b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER 929b7f9164eSdrh 93074ad7fe9Sdrh %type raisetype {int} 93174ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 93274ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 93374ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 93474ad7fe9Sdrh 9356f34903eSdanielk1977 936c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 937b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 93874ad7fe9Sdrh cmd ::= DROP TRIGGER fullname(X). { 93974ad7fe9Sdrh sqlite3DropTrigger(pParse,X); 940c3f9bad2Sdanielk1977 } 941b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER 942113088ecSdrh 943113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 9444d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). { 94525d6543dSdrh sqlite3Attach(pParse, &F, &D, K.type, &K.key); 9461c2d8414Sdrh } 94725d6543dSdrh %type key_opt {struct AttachKey} 94825d6543dSdrh key_opt(A) ::= . { A.type = 0; } 94925d6543dSdrh key_opt(A) ::= KEY ids(X). { A.type=1; A.key = X; } 950feac5f8dSdrh key_opt(A) ::= KEY BLOB(X). { A.type=2; A.key = X; } 951113088ecSdrh 952113088ecSdrh database_kw_opt ::= DATABASE. 953113088ecSdrh database_kw_opt ::= . 954113088ecSdrh 955113088ecSdrh //////////////////////// DETACH DATABASE name ///////////////////////////////// 9561c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). { 9574adee20fSdanielk1977 sqlite3Detach(pParse, &D); 9581c2d8414Sdrh } 9594343fea2Sdrh 9604343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 9614343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 9624343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 9634343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 9644343fea2Sdrh %endif 9659fd2a9a0Sdanielk1977 9669fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 9679fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 9689fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 9699fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 9709fd2a9a0Sdanielk1977 } 9719fd2a9a0Sdanielk1977 %endif 972