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*8a415d37Sdrh ** @(#) $Id: parse.y,v 1.282 2009/06/12 13:53:52 drh Exp $ 18348784efSdrh */ 19487e262fSdrh 20487e262fSdrh // All token codes are small integers with #defines that begin with "TK_" 21348784efSdrh %token_prefix TK_ 22487e262fSdrh 23487e262fSdrh // The type of the data attached to each token is Token. This is also the 24487e262fSdrh // default type for non-terminals. 25487e262fSdrh // 26348784efSdrh %token_type {Token} 27f57b14a6Sdrh %default_type {Token} 28487e262fSdrh 29487e262fSdrh // The generated parser function takes a 4th argument as follows: 30348784efSdrh %extra_argument {Parse *pParse} 31487e262fSdrh 32487e262fSdrh // This code runs whenever there is a syntax error 33487e262fSdrh // 34348784efSdrh %syntax_error { 35128255fcSdrh UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ 3655176259Sdrh assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ 374adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 3886dac2b6Sdrh pParse->parseError = 1; 39b86ccfb2Sdrh } 408fc3345fSdrh %stack_overflow { 41128255fcSdrh UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ 428fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 4386dac2b6Sdrh pParse->parseError = 1; 448fc3345fSdrh } 45487e262fSdrh 46487e262fSdrh // The name of the generated procedure that implements the parser 47487e262fSdrh // is as follows: 484adee20fSdanielk1977 %name sqlite3Parser 49487e262fSdrh 50487e262fSdrh // The following text is included near the beginning of the C source 51487e262fSdrh // code file that implements the parser. 52487e262fSdrh // 53348784efSdrh %include { 54348784efSdrh #include "sqliteInt.h" 559bbca4c1Sdrh 569bbca4c1Sdrh /* 57d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 58d3ec02d3Sdrh ** automaton. 59d3ec02d3Sdrh */ 60d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 61d3ec02d3Sdrh 62d3ec02d3Sdrh /* 63*8a415d37Sdrh ** Make yytestcase() the same as testcase() 64*8a415d37Sdrh */ 65*8a415d37Sdrh #define yytestcase(X) testcase(X) 66*8a415d37Sdrh 67*8a415d37Sdrh /* 68ad3cab52Sdrh ** An instance of this structure holds information about the 69ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 709bbca4c1Sdrh */ 71ad3cab52Sdrh struct LimitVal { 72a2dc3b1aSdanielk1977 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ 73a2dc3b1aSdanielk1977 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ 74ad3cab52Sdrh }; 75c3f9bad2Sdanielk1977 76c3f9bad2Sdanielk1977 /* 772e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 782e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 792e3a1f16Sdrh */ 802e3a1f16Sdrh struct LikeOp { 81b52076cdSdrh Token eOperator; /* "like" or "glob" or "regexp" */ 822e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 832e3a1f16Sdrh }; 842e3a1f16Sdrh 852e3a1f16Sdrh /* 86ad3cab52Sdrh ** An instance of the following structure describes the event of a 87ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 88ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 89ad3cab52Sdrh ** 90ad3cab52Sdrh ** UPDATE ON (a,b,c) 91ad3cab52Sdrh ** 92ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 93c3f9bad2Sdanielk1977 */ 94ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 95caec2f12Sdrh 9625d6543dSdrh /* 9725d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 9825d6543dSdrh */ 9925d6543dSdrh struct AttachKey { int type; Token key; }; 10025d6543dSdrh 101caec2f12Sdrh } // end %include 102348784efSdrh 103826fb5a3Sdrh // Input is a single SQL command 104c4a3c779Sdrh input ::= cmdlist. 105094b2bbfSdrh cmdlist ::= cmdlist ecmd. 106826fb5a3Sdrh cmdlist ::= ecmd. 107b7f9164eSdrh ecmd ::= SEMI. 108b7f9164eSdrh ecmd ::= explain cmdx SEMI. 1094adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 110b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 111b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 112ecc9242fSdrh explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); } 113154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 114200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 115348784efSdrh 116382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 117c4a3c779Sdrh // 118fa86c412Sdrh 119684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 120c4a3c779Sdrh trans_opt ::= . 121c4a3c779Sdrh trans_opt ::= TRANSACTION. 1225ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 123684917c2Sdrh %type transtype {int} 124684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 125684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 126684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 127684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1284adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1294adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1304adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 131c4a3c779Sdrh 132fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 133fd7f0452Sdanielk1977 savepoint_opt ::= . 134fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 135fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 136fd7f0452Sdanielk1977 } 137fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 138fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 139fd7f0452Sdanielk1977 } 140fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 141fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 142fd7f0452Sdanielk1977 } 143fd7f0452Sdanielk1977 144382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 145348784efSdrh // 146348784efSdrh cmd ::= create_table create_table_args. 147d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 148f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 149969fa7c1Sdrh } 150d9da78a2Sdrh createkw(A) ::= CREATE(X). { 151d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 152d9da78a2Sdrh A = X; 153d9da78a2Sdrh } 154faa59554Sdrh %type ifnotexists {int} 155faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 156faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 157f57b3399Sdrh %type temp {int} 15853c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 159d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 160154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 161d24cc427Sdrh temp(A) ::= . {A = 0;} 16219a8e7e8Sdanielk1977 create_table_args ::= LP columnlist conslist_opt(X) RP(Y). { 16319a8e7e8Sdanielk1977 sqlite3EndTable(pParse,&X,&Y,0); 164969fa7c1Sdrh } 165969fa7c1Sdrh create_table_args ::= AS select(S). { 16619a8e7e8Sdanielk1977 sqlite3EndTable(pParse,0,0,S); 167633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 168969fa7c1Sdrh } 169348784efSdrh columnlist ::= columnlist COMMA column. 170348784efSdrh columnlist ::= column. 171348784efSdrh 172487e262fSdrh // A "column" is a complete description of a single column in a 173487e262fSdrh // CREATE TABLE statement. This includes the column name, its 174487e262fSdrh // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES, 175487e262fSdrh // NOT NULL and so forth. 176348784efSdrh // 17719a8e7e8Sdanielk1977 column(A) ::= columnid(X) type carglist. { 17819a8e7e8Sdanielk1977 A.z = X.z; 179b27b7f5dSdrh A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n; 18019a8e7e8Sdanielk1977 } 18119a8e7e8Sdanielk1977 columnid(A) ::= nm(X). { 18219a8e7e8Sdanielk1977 sqlite3AddColumn(pParse,&X); 18319a8e7e8Sdanielk1977 A = X; 18419a8e7e8Sdanielk1977 } 18519a8e7e8Sdanielk1977 186c4a3c779Sdrh 187c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 188c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 189c4a3c779Sdrh // 190982cef7eSdrh %type id {Token} 191f18543caSdrh id(A) ::= ID(X). {A = X;} 192296a483cSdrh id(A) ::= INDEXED(X). {A = X;} 1930bd1f4eaSdrh 19434e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 19534e33bb8Sdrh // fallback to ID if they will not parse as their original value. 19634e33bb8Sdrh // This obviates the need for the "id" nonterminal. 19734e33bb8Sdrh // 1980bd1f4eaSdrh %fallback ID 199db15bcd5Sdrh ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW CONFLICT 200684917c2Sdrh DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 201ca5557f9Sdrh IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH PLAN 202db15bcd5Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK 20378c2e6d8Sdanielk1977 SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL 204b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 205b7f9164eSdrh EXCEPT INTERSECT UNION 206154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 207a073384fSdrh REINDEX RENAME CTIME_KW IF 208b7f9164eSdrh . 209e09daa90Sdrh %wildcard ANY. 210c4a3c779Sdrh 2112d3917daSdrh // Define operator precedence early so that this is the first occurance 2122d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2132d3917daSdrh // causes them to be assigned integer values that are close together, 2142d3917daSdrh // which keeps parser tables smaller. 2152d3917daSdrh // 216f2bc013cSdrh // The token values assigned to these symbols is determined by the order 217f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 218f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 219f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 220f2bc013cSdrh // constraint. 221f2bc013cSdrh // 2222d3917daSdrh %left OR. 2232d3917daSdrh %left AND. 2242d3917daSdrh %right NOT. 22503bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2269a43267bSdrh %left GT LE LT GE. 2277c6303c0Sdanielk1977 %right ESCAPE. 2282d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2292d3917daSdrh %left PLUS MINUS. 2302d3917daSdrh %left STAR SLASH REM. 231a34001c9Sdrh %left CONCAT. 232a34001c9Sdrh %left COLLATE. 2332d3917daSdrh %right UMINUS UPLUS BITNOT. 2342d3917daSdrh 235c4a3c779Sdrh // And "ids" is an identifer-or-string. 236c4a3c779Sdrh // 237c4a3c779Sdrh %type ids {Token} 238fd405314Sdrh ids(A) ::= ID|STRING(X). {A = X;} 239c4a3c779Sdrh 2405ad1a6c8Sdrh // The name of a column or table can be any of the following: 2415ad1a6c8Sdrh // 2425ad1a6c8Sdrh %type nm {Token} 243296a483cSdrh nm(A) ::= id(X). {A = X;} 2445ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 2455ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 2465ad1a6c8Sdrh 247487e262fSdrh // A typetoken is really one or more tokens that form a type name such 248487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 249487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 250487e262fSdrh // 251487e262fSdrh %type typetoken {Token} 252382c0247Sdrh type ::= . 253487e262fSdrh type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);} 254487e262fSdrh typetoken(A) ::= typename(X). {A = X;} 255487e262fSdrh typetoken(A) ::= typename(X) LP signed RP(Y). { 256487e262fSdrh A.z = X.z; 257b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 258487e262fSdrh } 259487e262fSdrh typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). { 260487e262fSdrh A.z = X.z; 261b27b7f5dSdrh A.n = (int)(&Y.z[Y.n] - X.z); 262487e262fSdrh } 263382c0247Sdrh %type typename {Token} 264382c0247Sdrh typename(A) ::= ids(X). {A = X;} 265b27b7f5dSdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);} 26660218d2aSdrh signed ::= plus_num. 26760218d2aSdrh signed ::= minus_num. 268487e262fSdrh 269487e262fSdrh // "carglist" is a list of additional constraints that come after the 270487e262fSdrh // column name and column type in a CREATE TABLE statement. 271487e262fSdrh // 272348784efSdrh carglist ::= carglist carg. 273348784efSdrh carglist ::= . 2745ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 275348784efSdrh carg ::= ccons. 276b7916a78Sdrh ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);} 277b7916a78Sdrh ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);} 278b7916a78Sdrh ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);} 279f96a3778Sdanielk1977 ccons ::= DEFAULT MINUS(A) term(X). { 280b7916a78Sdrh ExprSpan v; 281b7916a78Sdrh v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0); 282b7916a78Sdrh v.zStart = A.z; 283b7916a78Sdrh v.zEnd = X.zEnd; 284b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2857977a17fSdanielk1977 } 2862b7acc35Sdrh ccons ::= DEFAULT id(X). { 287b7916a78Sdrh ExprSpan v; 288b7916a78Sdrh spanExpr(&v, pParse, TK_STRING, &X); 289b7916a78Sdrh sqlite3AddDefaultValue(pParse,&v); 2907977a17fSdanielk1977 } 291348784efSdrh 292382c0247Sdrh // In addition to the type name, we also care about the primary key and 293382c0247Sdrh // UNIQUE constraints. 294348784efSdrh // 2950d316a40Sdrh ccons ::= NULL onconf. 2964adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 297fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 298fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 2994d91a701Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} 300b7916a78Sdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} 301c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 3024adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 3034adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 30439002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 30504738cb9Sdrh 306205f48e6Sdrh // The optional AUTOINCREMENT keyword 307205f48e6Sdrh %type autoinc {int} 308205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3092958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 310205f48e6Sdrh 311c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 312c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 313c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 314c2eef3b3Sdrh // check fails. 31504738cb9Sdrh // 316c2eef3b3Sdrh %type refargs {int} 317c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 31850af3e1dSdanielk1977 refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; } 319c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 320c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 321c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 322c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 323c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 324c2eef3b3Sdrh %type refact {int} 325c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 326c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 327c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 328c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 329c2eef3b3Sdrh %type defer_subclause {int} 330c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 331c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 332c2eef3b3Sdrh %type init_deferred_pred_opt {int} 333c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 334c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 335c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 336348784efSdrh 337348784efSdrh // For the time being, the only constraint we care about is the primary 338382c0247Sdrh // key and UNIQUE. Both create indices. 339348784efSdrh // 34019a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 34119a8e7e8Sdanielk1977 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} 342348784efSdrh conslist ::= conslist COMMA tcons. 343a2e1bb5aSdrh conslist ::= conslist tcons. 344348784efSdrh conslist ::= tcons. 3455ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 346f3388144Sdrh tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). 347fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 3489cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 3494d91a701Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} 350b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 351b7916a78Sdrh {sqlite3AddCheckConstraint(pParse,E.pExpr);} 352c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 353c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3544adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3554adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 356c2eef3b3Sdrh } 357c2eef3b3Sdrh %type defer_subclause_opt {int} 358c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 359c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 3609cfcf5d4Sdrh 3619cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3629cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3639cfcf5d4Sdrh // 3649cfcf5d4Sdrh %type onconf {int} 3651c92853dSdrh %type orconf {int} 3661c92853dSdrh %type resolvetype {int} 3671c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3681c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3691c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3701c92853dSdrh orconf(A) ::= OR resolvetype(X). {A = X;} 37174ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 3721c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 3731c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 374348784efSdrh 375382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 376348784efSdrh // 377a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 378a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 379a8858103Sdanielk1977 } 380a073384fSdrh %type ifexists {int} 381a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 382a073384fSdrh ifexists(A) ::= . {A = 0;} 383348784efSdrh 384a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 385a76b5dfcSdrh // 386b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 387d9da78a2Sdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { 388fdd48a76Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); 389a76b5dfcSdrh } 390a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 391a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 392a76b5dfcSdrh } 393154d4b24Sdrh %endif SQLITE_OMIT_VIEW 394a76b5dfcSdrh 395382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 396348784efSdrh // 3979bb61fe7Sdrh cmd ::= select(X). { 3987d10d5a6Sdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0}; 3997d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 400633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 4019bb61fe7Sdrh } 402efb7251dSdrh 4039bb61fe7Sdrh %type select {Select*} 404633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 40582c3d636Sdrh %type oneselect {Select*} 406633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4079bb61fe7Sdrh 40882c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 409b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4100a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 411daffd0e5Sdrh if( Z ){ 412b27b7f5dSdrh Z->op = (u8)Y; 41382c3d636Sdrh Z->pPrior = X; 41443b78826Sdrh }else{ 415633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 416daffd0e5Sdrh } 41782c3d636Sdrh A = Z; 41882c3d636Sdrh } 4190a36c57eSdrh %type multiselect_op {int} 42074ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 4210a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 422fd405314Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} 423154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 42482c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 4259bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 42617435752Sdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset); 4279bb61fe7Sdrh } 4289bb61fe7Sdrh 4299bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 4309bb61fe7Sdrh // present and false (0) if it is not. 4319bb61fe7Sdrh // 432efb7251dSdrh %type distinct {int} 433efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 434fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 435efb7251dSdrh distinct(A) ::= . {A = 0;} 436348784efSdrh 4379bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 4387c917d19Sdrh // values of the SELECT statement. The "*" in statements like 4397c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 4407c917d19Sdrh // opcode of TK_ALL. 4419bb61fe7Sdrh // 442348784efSdrh %type selcollist {ExprList*} 443633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 444348784efSdrh %type sclp {ExprList*} 445633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 446348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 447348784efSdrh sclp(A) ::= . {A = 0;} 44801f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 449b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, X.pExpr); 450b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 451b7916a78Sdrh sqlite3ExprListSetSpan(pParse,A,&X); 45201f3f253Sdrh } 4537c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 454b7916a78Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); 455b7916a78Sdrh A = sqlite3ExprListAppend(pParse, P, p); 4567c917d19Sdrh } 457e54a62adSdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { 458e54a62adSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); 45917435752Sdrh Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 46017435752Sdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); 461b7916a78Sdrh A = sqlite3ExprListAppend(pParse,P, pDot); 46254473229Sdrh } 46301f3f253Sdrh 46401f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 46501f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 46601f3f253Sdrh // 46701f3f253Sdrh %type as {Token} 4685ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 4695ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 47001f3f253Sdrh as(X) ::= . {X.n = 0;} 4719bb61fe7Sdrh 472348784efSdrh 473ad3cab52Sdrh %type seltablist {SrcList*} 474633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 475ad3cab52Sdrh %type stl_prefix {SrcList*} 476633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 477ad3cab52Sdrh %type from {SrcList*} 478633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 479348784efSdrh 48001f3f253Sdrh // A complete FROM clause. 48101f3f253Sdrh // 48217435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 48361dfc31dSdrh from(A) ::= FROM seltablist(X). { 48461dfc31dSdrh A = X; 48561dfc31dSdrh sqlite3SrcListShiftJoinType(A); 48661dfc31dSdrh } 48701f3f253Sdrh 48801f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 48901f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 49001f3f253Sdrh // 49101f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 49201f3f253Sdrh A = X; 493d3ec02d3Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; 49401f3f253Sdrh } 495348784efSdrh stl_prefix(A) ::= . {A = 0;} 49685574e31Sdanielk1977 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). { 497b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); 498b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 49901f3f253Sdrh } 50051522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 501fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP 502b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 503b1c685b0Sdanielk1977 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); 50422f70c32Sdrh } 505fbdc7f69Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP 506fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 50713d32d19Sdrh if( X==0 ){ 50813d32d19Sdrh sqlite3ExprDelete(pParse->db, N); 50913d32d19Sdrh sqlite3IdListDelete(pParse->db, U); 510fbdc7f69Sdrh A = F; 511fbdc7f69Sdrh }else{ 512fbdc7f69Sdrh Select *pSubquery; 513fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 514fbdc7f69Sdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 515fbdc7f69Sdrh A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U); 516fbdc7f69Sdrh } 517fbdc7f69Sdrh } 518348784efSdrh 519b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 520b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 521b733d037Sdrh // a grouping of table and subqueries. 522b733d037Sdrh // 523fbdc7f69Sdrh // %type seltablist_paren {Select*} 524fbdc7f69Sdrh // %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);} 525fbdc7f69Sdrh // seltablist_paren(A) ::= select(S). {A = S;} 526fbdc7f69Sdrh // seltablist_paren(A) ::= seltablist(F). { 527fbdc7f69Sdrh // sqlite3SrcListShiftJoinType(F); 528fbdc7f69Sdrh // A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0); 529fbdc7f69Sdrh // } 530154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 531b733d037Sdrh 532113088ecSdrh %type dbnm {Token} 533113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 534113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 535113088ecSdrh 53674ad7fe9Sdrh %type fullname {SrcList*} 537633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 53817435752Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} 53974ad7fe9Sdrh 54001f3f253Sdrh %type joinop {int} 54101f3f253Sdrh %type joinop2 {int} 542fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 5434adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 5444adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 5455ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 5464adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 54701f3f253Sdrh 54801f3f253Sdrh %type on_opt {Expr*} 549633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 550b7916a78Sdrh on_opt(N) ::= ON expr(E). {N = E.pExpr;} 55101f3f253Sdrh on_opt(N) ::= . {N = 0;} 55201f3f253Sdrh 55385574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 55485574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 55585574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 55685574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 55785574e31Sdanielk1977 // in the token. 55885574e31Sdanielk1977 // 55985574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 560b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 56185574e31Sdanielk1977 // recognizes and interprets this as a special case. 56285574e31Sdanielk1977 // 56385574e31Sdanielk1977 %type indexed_opt {Token} 56485574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 56585574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 56685574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 56785574e31Sdanielk1977 56801f3f253Sdrh %type using_opt {IdList*} 569633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 5700202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 57101f3f253Sdrh using_opt(U) ::= . {U = 0;} 57201f3f253Sdrh 57301f3f253Sdrh 574348784efSdrh %type orderby_opt {ExprList*} 575633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 576348784efSdrh %type sortlist {ExprList*} 577633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 578348784efSdrh %type sortitem {Expr*} 579633e6d57Sdrh %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);} 580348784efSdrh 581348784efSdrh orderby_opt(A) ::= . {A = 0;} 582348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 5838b4c40d8Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { 584b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X,Y); 585b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 586348784efSdrh } 5878b4c40d8Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). { 588b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0,Y); 589d3ec02d3Sdrh if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; 590348784efSdrh } 591b7916a78Sdrh sortitem(A) ::= expr(X). {A = X.pExpr;} 592348784efSdrh 593348784efSdrh %type sortorder {int} 594348784efSdrh 5958e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 5968e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 5978e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 598348784efSdrh 5992282792aSdrh %type groupby_opt {ExprList*} 600633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 6012282792aSdrh groupby_opt(A) ::= . {A = 0;} 6029245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 6032282792aSdrh 6042282792aSdrh %type having_opt {Expr*} 605633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 6062282792aSdrh having_opt(A) ::= . {A = 0;} 607b7916a78Sdrh having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} 6082282792aSdrh 609ad3cab52Sdrh %type limit_opt {struct LimitVal} 61015926590Sdrh 61115926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 61215926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 61315926590Sdrh // rule for SELECT statements. As soon as the rule that create the 61415926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 61515926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 61615926590Sdrh // except as a transient. So there is never anything to destroy. 61715926590Sdrh // 61815926590Sdrh //%destructor limit_opt { 619633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pLimit); 620633e6d57Sdrh // sqlite3ExprDelete(pParse->db, $$.pOffset); 62115926590Sdrh //} 622a2dc3b1aSdanielk1977 limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;} 623b7916a78Sdrh limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;} 624a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 625b7916a78Sdrh {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;} 626a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 627b7916a78Sdrh {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;} 6289bbca4c1Sdrh 629382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 630382c0247Sdrh // 631273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 632931577f1Sdrh cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 633931577f1Sdrh orderby_opt(O) limit_opt(L). { 634b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 63549ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE"); 6364281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6374281bd42Sshane } 6384281bd42Sshane %endif 639273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6404281bd42Sshane cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 6414281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6424281bd42Sshane sqlite3DeleteFrom(pParse,X,W); 6434281bd42Sshane } 6444281bd42Sshane %endif 645348784efSdrh 646348784efSdrh %type where_opt {Expr*} 647633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 648348784efSdrh 649348784efSdrh where_opt(A) ::= . {A = 0;} 650b7916a78Sdrh where_opt(A) ::= WHERE expr(X). {A = X.pExpr;} 651348784efSdrh 652382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 653382c0247Sdrh // 654273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6554281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L). { 656b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 657b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 65849ffdbf4Sshane W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE"); 6594281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6604281bd42Sshane } 6614281bd42Sshane %endif 662273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 6634281bd42Sshane cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W). { 6644281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 6654281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 6664281bd42Sshane sqlite3Update(pParse,X,Y,W,R); 6674281bd42Sshane } 6684281bd42Sshane %endif 669348784efSdrh 670f8db1bc0Sdrh %type setlist {ExprList*} 671633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 672f8db1bc0Sdrh 673b7916a78Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). { 674b7916a78Sdrh A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); 675b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 676b7916a78Sdrh } 677b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 678b7916a78Sdrh A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); 679b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 680b7916a78Sdrh } 681348784efSdrh 682382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 683382c0247Sdrh // 68474ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 685113088ecSdrh VALUES LP itemlist(Y) RP. 68674ad7fe9Sdrh {sqlite3Insert(pParse, X, Y, 0, F, R);} 68774ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 68874ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 689147d0cccSdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. 690147d0cccSdrh {sqlite3Insert(pParse, X, 0, 0, F, R);} 691348784efSdrh 692fa86c412Sdrh %type insert_cmd {int} 693fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 694fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 695fa86c412Sdrh 696348784efSdrh 697348784efSdrh %type itemlist {ExprList*} 698633e6d57Sdrh %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);} 699348784efSdrh 70017435752Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y). 701b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 70217435752Sdrh itemlist(A) ::= expr(X). 703b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,X.pExpr);} 704348784efSdrh 705967e8b73Sdrh %type inscollist_opt {IdList*} 706633e6d57Sdrh %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} 707967e8b73Sdrh %type inscollist {IdList*} 708633e6d57Sdrh %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);} 709348784efSdrh 710967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 711967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 71217435752Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y). 71317435752Sdrh {A = sqlite3IdListAppend(pParse->db,X,&Y);} 71417435752Sdrh inscollist(A) ::= nm(Y). 71517435752Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y);} 716348784efSdrh 717382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 718382c0247Sdrh // 719348784efSdrh 720b7916a78Sdrh %type expr {ExprSpan} 721b7916a78Sdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} 722b7916a78Sdrh %type term {ExprSpan} 723b7916a78Sdrh %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);} 724b7916a78Sdrh 725b7916a78Sdrh %include { 726b7916a78Sdrh /* This is a utility routine used to set the ExprSpan.zStart and 727b7916a78Sdrh ** ExprSpan.zEnd values of pOut so that the span covers the complete 728b7916a78Sdrh ** range of text beginning with pStart and going to the end of pEnd. 729b7916a78Sdrh */ 730b7916a78Sdrh static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ 731b7916a78Sdrh pOut->zStart = pStart->z; 732b7916a78Sdrh pOut->zEnd = &pEnd->z[pEnd->n]; 733b7916a78Sdrh } 734b7916a78Sdrh 735b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 736b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 737b7916a78Sdrh ** that created the expression. 738b7916a78Sdrh */ 739b7916a78Sdrh static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){ 740b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue); 741b7916a78Sdrh pOut->zStart = pValue->z; 742b7916a78Sdrh pOut->zEnd = &pValue->z[pValue->n]; 743b7916a78Sdrh } 744b7916a78Sdrh } 745348784efSdrh 7467977a17fSdanielk1977 expr(A) ::= term(X). {A = X;} 747b7916a78Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);} 748b7916a78Sdrh term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);} 749b7916a78Sdrh expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);} 750b7916a78Sdrh expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);} 7515ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 75217435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 75317435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 754b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); 755b7916a78Sdrh spanSet(&A,&X,&Y); 756e1b6a5b8Sdrh } 757d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 75817435752Sdrh Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); 75917435752Sdrh Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y); 76017435752Sdrh Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z); 76117435752Sdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); 762b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); 763b7916a78Sdrh spanSet(&A,&X,&Z); 764d24cc427Sdrh } 765b7916a78Sdrh term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);} 766b7916a78Sdrh term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);} 767b7916a78Sdrh expr(A) ::= REGISTER(X). { 768b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 769b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 770b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 771b7916a78Sdrh if( pParse->nested==0 ){ 772b7916a78Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X); 773b7916a78Sdrh A.pExpr = 0; 774b7916a78Sdrh }else{ 775b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X); 776b7916a78Sdrh if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable); 777b7916a78Sdrh } 778b7916a78Sdrh spanSet(&A, &X, &X); 779b7916a78Sdrh } 7807c972decSdrh expr(A) ::= VARIABLE(X). { 781b7916a78Sdrh spanExpr(&A, pParse, TK_VARIABLE, &X); 782b7916a78Sdrh sqlite3ExprAssignVarNumber(pParse, A.pExpr); 783b7916a78Sdrh spanSet(&A, &X, &X); 784895d7472Sdrh } 78539002505Sdanielk1977 expr(A) ::= expr(E) COLLATE ids(C). { 786b7916a78Sdrh A.pExpr = sqlite3ExprSetColl(pParse, E.pExpr, &C); 787b7916a78Sdrh A.zStart = E.zStart; 788b7916a78Sdrh A.zEnd = &C.z[C.n]; 7898b4c40d8Sdrh } 790487e262fSdrh %ifndef SQLITE_OMIT_CAST 791487e262fSdrh expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { 792b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); 793b7916a78Sdrh spanSet(&A,&X,&Y); 794487e262fSdrh } 795154d4b24Sdrh %endif SQLITE_OMIT_CAST 796fd357974Sdrh expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { 797994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 798e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 7994e05c83bSdrh } 800b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, Y, &X); 801b7916a78Sdrh spanSet(&A,&X,&E); 802b7916a78Sdrh if( D && A.pExpr ){ 803b7916a78Sdrh A.pExpr->flags |= EP_Distinct; 804fd357974Sdrh } 805e1b6a5b8Sdrh } 806e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 807b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0, &X); 808b7916a78Sdrh spanSet(&A,&X,&E); 809e1b6a5b8Sdrh } 810b71090fdSdrh term(A) ::= CTIME_KW(OP). { 811b71090fdSdrh /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are 812b71090fdSdrh ** treated as functions that return constants */ 813b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, 0,&OP); 814b7916a78Sdrh if( A.pExpr ){ 815b7916a78Sdrh A.pExpr->op = TK_CONST_FUNC; 816b7916a78Sdrh } 817b7916a78Sdrh spanSet(&A, &OP, &OP); 818b7916a78Sdrh } 819b7916a78Sdrh 820b7916a78Sdrh %include { 821b7916a78Sdrh /* This routine constructs a binary expression node out of two ExprSpan 822b7916a78Sdrh ** objects and uses the result to populate a new ExprSpan object. 823b7916a78Sdrh */ 824b7916a78Sdrh static void spanBinaryExpr( 825b7916a78Sdrh ExprSpan *pOut, /* Write the result here */ 826b7916a78Sdrh Parse *pParse, /* The parsing context. Errors accumulate here */ 827b7916a78Sdrh int op, /* The binary operation */ 828b7916a78Sdrh ExprSpan *pLeft, /* The left operand */ 829b7916a78Sdrh ExprSpan *pRight /* The right operand */ 830b7916a78Sdrh ){ 831b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); 832b7916a78Sdrh pOut->zStart = pLeft->zStart; 833b7916a78Sdrh pOut->zEnd = pRight->zEnd; 834417ec638Sdrh } 835b71090fdSdrh } 836b7916a78Sdrh 837b7916a78Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 838b7916a78Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 83917435752Sdrh expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). 840b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 841b7916a78Sdrh expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 842fd405314Sdrh expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 843b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 844b7916a78Sdrh expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). 845b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 84617435752Sdrh expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). 847b7916a78Sdrh {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 848b7916a78Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} 84974ad7fe9Sdrh %type likeop {struct LikeOp} 850b52076cdSdrh likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;} 851b52076cdSdrh likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;} 85203bea70cSdrh likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;} 85303bea70cSdrh likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;} 854b7916a78Sdrh %type escape {ExprSpan} 855b7916a78Sdrh %destructor escape {sqlite3ExprDelete(pParse->db, $$.pExpr);} 8567c6303c0Sdanielk1977 escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;} 857b7916a78Sdrh escape(X) ::= . [ESCAPE] {memset(&X,0,sizeof(X));} 858b71090fdSdrh expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { 8598aa34ae0Sdrh ExprList *pList; 860b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); 861b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); 862b7916a78Sdrh if( E.pExpr ){ 863b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); 8647c6303c0Sdanielk1977 } 865b7916a78Sdrh A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); 866b7916a78Sdrh if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 867b7916a78Sdrh A.zStart = X.zStart; 868b7916a78Sdrh A.zEnd = Y.zEnd; 869b7916a78Sdrh if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; 8700ac65892Sdrh } 8717c6303c0Sdanielk1977 872b7916a78Sdrh %include { 873b7916a78Sdrh /* Construct an expression node for a unary postfix operator 874b7916a78Sdrh */ 875b7916a78Sdrh static void spanUnaryPostfix( 876b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 877b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 878b7916a78Sdrh int op, /* The operator */ 879b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 880b7916a78Sdrh Token *pPostOp /* The operand token for setting the span */ 881b7916a78Sdrh ){ 882b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 883b7916a78Sdrh pOut->zStart = pOperand->zStart; 884b7916a78Sdrh pOut->zEnd = &pPostOp->z[pPostOp->n]; 885e1b6a5b8Sdrh } 88633048c0bSdrh } 887b7916a78Sdrh 888b7916a78Sdrh expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);} 889b7916a78Sdrh expr(A) ::= expr(X) IS NULL(E). {spanUnaryPostfix(&A,pParse,TK_ISNULL,&X,&E);} 890b7916a78Sdrh expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 891b7916a78Sdrh expr(A) ::= expr(X) IS NOT NULL(E). 892b7916a78Sdrh {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);} 893b7916a78Sdrh 894b7916a78Sdrh %include { 895b7916a78Sdrh /* Construct an expression node for a unary prefix operator 896b7916a78Sdrh */ 897b7916a78Sdrh static void spanUnaryPrefix( 898b7916a78Sdrh ExprSpan *pOut, /* Write the new expression node here */ 899b7916a78Sdrh Parse *pParse, /* Parsing context to record errors */ 900b7916a78Sdrh int op, /* The operator */ 901b7916a78Sdrh ExprSpan *pOperand, /* The operand */ 902b7916a78Sdrh Token *pPreOp /* The operand token for setting the span */ 903b7916a78Sdrh ){ 904b7916a78Sdrh pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); 905b7916a78Sdrh pOut->zStart = pPreOp->z; 906b7916a78Sdrh pOut->zEnd = pOperand->zEnd; 90733048c0bSdrh } 90881a20f21Sdrh } 909b7916a78Sdrh 910b7916a78Sdrh 911b7916a78Sdrh 912b7916a78Sdrh expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 913b7916a78Sdrh expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);} 914b7916a78Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] 915b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);} 916b7916a78Sdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] 917b7916a78Sdrh {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);} 918b7916a78Sdrh 9192e3a1f16Sdrh %type between_op {int} 9202e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 9212e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 9222e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 923b7916a78Sdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); 924b7916a78Sdrh pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); 925b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); 926b7916a78Sdrh if( A.pExpr ){ 927b7916a78Sdrh A.pExpr->x.pList = pList; 92853f733c7Sdrh }else{ 929633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 93053f733c7Sdrh } 931b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 932b7916a78Sdrh A.zStart = W.zStart; 933b7916a78Sdrh A.zEnd = Y.zEnd; 934fef5208cSdrh } 9353e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 9362e3a1f16Sdrh %type in_op {int} 9372e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 9382e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 9392e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 940b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 941b7916a78Sdrh if( A.pExpr ){ 942b7916a78Sdrh A.pExpr->x.pList = Y; 943b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 944d5d56523Sdanielk1977 }else{ 945633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 946d5d56523Sdanielk1977 } 947b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 948b7916a78Sdrh A.zStart = X.zStart; 949b7916a78Sdrh A.zEnd = &E.z[E.n]; 950fef5208cSdrh } 95151522cd3Sdrh expr(A) ::= LP(B) select(X) RP(E). { 952b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); 953b7916a78Sdrh if( A.pExpr ){ 954b7916a78Sdrh A.pExpr->x.pSelect = X; 955b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 956b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 95753f733c7Sdrh }else{ 958633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 95953f733c7Sdrh } 960b7916a78Sdrh A.zStart = B.z; 961b7916a78Sdrh A.zEnd = &E.z[E.n]; 96251522cd3Sdrh } 9632e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 964b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 965b7916a78Sdrh if( A.pExpr ){ 966b7916a78Sdrh A.pExpr->x.pSelect = Y; 967b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 968b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 96953f733c7Sdrh }else{ 970633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 97153f733c7Sdrh } 972b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 973b7916a78Sdrh A.zStart = X.zStart; 974b7916a78Sdrh A.zEnd = &E.z[E.n]; 975fef5208cSdrh } 97674ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 97717435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 978b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); 979b7916a78Sdrh if( A.pExpr ){ 980b7916a78Sdrh A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); 981b7916a78Sdrh ExprSetProperty(A.pExpr, EP_xIsSelect); 982b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 98353f733c7Sdrh }else{ 984633e6d57Sdrh sqlite3SrcListDelete(pParse->db, pSrc); 98553f733c7Sdrh } 986b7916a78Sdrh if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); 987b7916a78Sdrh A.zStart = X.zStart; 988b7916a78Sdrh A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; 98923b2db23Sdrh } 99051522cd3Sdrh expr(A) ::= EXISTS(B) LP select(Y) RP(E). { 991b7916a78Sdrh Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); 99251522cd3Sdrh if( p ){ 9936ab3a2ecSdanielk1977 p->x.pSelect = Y; 994b7916a78Sdrh ExprSetProperty(p, EP_xIsSelect); 995b7916a78Sdrh sqlite3ExprSetHeight(pParse, p); 99653f733c7Sdrh }else{ 997633e6d57Sdrh sqlite3SelectDelete(pParse->db, Y); 99851522cd3Sdrh } 999b7916a78Sdrh A.zStart = B.z; 1000b7916a78Sdrh A.zEnd = &E.z[E.n]; 100151522cd3Sdrh } 1002154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1003fef5208cSdrh 100417a7f8ddSdrh /* CASE expressions */ 100517a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 1006b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0); 1007b7916a78Sdrh if( A.pExpr ){ 1008b7916a78Sdrh A.pExpr->x.pList = Y; 1009b7916a78Sdrh sqlite3ExprSetHeight(pParse, A.pExpr); 101053f733c7Sdrh }else{ 1011633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 101253f733c7Sdrh } 1013b7916a78Sdrh A.zStart = C.z; 1014b7916a78Sdrh A.zEnd = &E.z[E.n]; 101517a7f8ddSdrh } 101617a7f8ddSdrh %type case_exprlist {ExprList*} 1017633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 101817a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 1019b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, Y.pExpr); 1020b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 102117a7f8ddSdrh } 102217a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 1023b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, Y.pExpr); 1024b7916a78Sdrh A = sqlite3ExprListAppend(pParse,A, Z.pExpr); 102517a7f8ddSdrh } 102617a7f8ddSdrh %type case_else {Expr*} 1027633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 1028b7916a78Sdrh case_else(A) ::= ELSE expr(X). {A = X.pExpr;} 102917a7f8ddSdrh case_else(A) ::= . {A = 0;} 103017a7f8ddSdrh %type case_operand {Expr*} 1031633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 1032b7916a78Sdrh case_operand(A) ::= expr(X). {A = X.pExpr;} 103317a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1034348784efSdrh 1035348784efSdrh %type exprlist {ExprList*} 1036633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 10379245c243Sdrh %type nexprlist {ExprList*} 1038633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1039348784efSdrh 10409245c243Sdrh exprlist(A) ::= nexprlist(X). {A = X;} 10419245c243Sdrh exprlist(A) ::= . {A = 0;} 104217435752Sdrh nexprlist(A) ::= nexprlist(X) COMMA expr(Y). 1043b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} 104417435752Sdrh nexprlist(A) ::= expr(Y). 1045b7916a78Sdrh {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} 10469245c243Sdrh 1047cce7d176Sdrh 1048382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1049382c0247Sdrh // 1050d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 105177e96d14Sdrh ON nm(Y) LP idxlist(Z) RP(E). { 105217435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 105317435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 10544d91a701Sdrh &S, &E, SQLITE_SO_ASC, NE); 10559cfcf5d4Sdrh } 1056717e6402Sdrh 1057717e6402Sdrh %type uniqueflag {int} 10589cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 10599cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1060348784efSdrh 10610202b29eSdanielk1977 %type idxlist {ExprList*} 1062633e6d57Sdrh %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} 10630202b29eSdanielk1977 %type idxlist_opt {ExprList*} 1064633e6d57Sdrh %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1065348784efSdrh 1066c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 1067c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 1068200a81dcSdrh idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { 10690202b29eSdanielk1977 Expr *p = 0; 10700202b29eSdanielk1977 if( C.n>0 ){ 1071b7916a78Sdrh p = sqlite3Expr(pParse->db, TK_COLUMN, 0); 107239002505Sdanielk1977 sqlite3ExprSetColl(pParse, p, &C); 10730202b29eSdanielk1977 } 1074b7916a78Sdrh A = sqlite3ExprListAppend(pParse,X, p); 1075b7916a78Sdrh sqlite3ExprListSetName(pParse,A,&Y,1); 1076b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1077b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 10780202b29eSdanielk1977 } 1079200a81dcSdrh idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { 10800202b29eSdanielk1977 Expr *p = 0; 10810202b29eSdanielk1977 if( C.n>0 ){ 108217435752Sdrh p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0); 108339002505Sdanielk1977 sqlite3ExprSetColl(pParse, p, &C); 10840202b29eSdanielk1977 } 1085b7916a78Sdrh A = sqlite3ExprListAppend(pParse,0, p); 1086b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &Y, 1); 1087b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse, A, "index"); 1088b27b7f5dSdrh if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; 10890202b29eSdanielk1977 } 10900202b29eSdanielk1977 1091a34001c9Sdrh %type collate {Token} 1092a34001c9Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 109339002505Sdanielk1977 collate(C) ::= COLLATE ids(X). {C = X;} 1094a34001c9Sdrh 1095348784efSdrh 10968aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1097382c0247Sdrh // 10984d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1099982cef7eSdrh 1100382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1101382c0247Sdrh // 1102154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1103fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 110474161705Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse);} 110574161705Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);} 1106fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1107154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1108f57b14a6Sdrh 1109382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1110382c0247Sdrh // 111104e86f4dSshane %ifndef SQLITE_OMIT_PARSER 111213d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 111391cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1114ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1115ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1116ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1117ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1118ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1119ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1120ada2ee0dSdrh 1121a3eb4b44Sdrh nmnum(A) ::= plus_num(X). {A = X;} 1122a3eb4b44Sdrh nmnum(A) ::= nm(X). {A = X;} 1123ada2ee0dSdrh nmnum(A) ::= ON(X). {A = X;} 1124ada2ee0dSdrh nmnum(A) ::= DELETE(X). {A = X;} 11256da861beSdrh nmnum(A) ::= DEFAULT(X). {A = X;} 1126154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 112704e86f4dSshane %endif SQLITE_OMIT_PARSER 1128f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 1129f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1130fd405314Sdrh number(A) ::= INTEGER|FLOAT(X). {A = X;} 1131f57b14a6Sdrh plus_opt ::= PLUS. 1132f57b14a6Sdrh plus_opt ::= . 1133c3f9bad2Sdanielk1977 1134c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1135f0f258b1Sdrh 1136b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1137b7f9164eSdrh 1138d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 11394b59ab5eSdrh Token all; 11404b59ab5eSdrh all.z = A.z; 1141b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 11424adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1143f0f258b1Sdrh } 1144f0f258b1Sdrh 1145fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1146fdd48a76Sdrh trigger_time(C) trigger_event(D) 114760218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 114860218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 11493df6b257Sdanielk1977 A = (Z.n==0?B:Z); 1150c3f9bad2Sdanielk1977 } 1151c3f9bad2Sdanielk1977 1152c3f9bad2Sdanielk1977 %type trigger_time {int} 1153c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 1154c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 1155c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1156c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1157c3f9bad2Sdanielk1977 1158ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1159633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1160fd405314Sdrh trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;} 116174ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 1162c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 1163c3f9bad2Sdanielk1977 116460218d2aSdrh foreach_clause ::= . 116560218d2aSdrh foreach_clause ::= FOR EACH ROW. 1166c3f9bad2Sdanielk1977 1167c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1168633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1169c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 1170b7916a78Sdrh when_clause(A) ::= WHEN expr(X). { A = X.pExpr; } 1171c3f9bad2Sdanielk1977 1172c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1173633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 1174187e4c6aSdrh trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { 117581238966Sdrh assert( Y!=0 ); 117681238966Sdrh Y->pLast->pNext = X; 1177187e4c6aSdrh Y->pLast = X; 1178187e4c6aSdrh A = Y; 1179a69d9168Sdrh } 118081238966Sdrh trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. { 118181238966Sdrh assert( X!=0 ); 118281238966Sdrh X->pLast = X; 118381238966Sdrh A = X; 118481238966Sdrh } 1185c3f9bad2Sdanielk1977 1186c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1187633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1188c3f9bad2Sdanielk1977 // UPDATE 11895ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 119017435752Sdrh { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } 1191c3f9bad2Sdanielk1977 1192c3f9bad2Sdanielk1977 // INSERT 11933054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 1194c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 119517435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);} 1196c3f9bad2Sdanielk1977 11973054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 119817435752Sdrh {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);} 1199c3f9bad2Sdanielk1977 1200c3f9bad2Sdanielk1977 // DELETE 12015ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 120217435752Sdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} 1203c3f9bad2Sdanielk1977 1204c3f9bad2Sdanielk1977 // SELECT 120517435752Sdrh trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } 1206c3f9bad2Sdanielk1977 12076f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 12084b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 1209b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); 1210b7916a78Sdrh if( A.pExpr ){ 1211b7916a78Sdrh A.pExpr->affinity = OE_Ignore; 12124b59ab5eSdrh } 1213b7916a78Sdrh A.zStart = X.z; 1214b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 12158aa34ae0Sdrh } 121674ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 1217b7916a78Sdrh A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z); 1218b7916a78Sdrh if( A.pExpr ) { 1219b7916a78Sdrh A.pExpr->affinity = (char)T; 12204b59ab5eSdrh } 1221b7916a78Sdrh A.zStart = X.z; 1222b7916a78Sdrh A.zEnd = &Y.z[Y.n]; 12238aa34ae0Sdrh } 1224154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1225b7f9164eSdrh 122674ad7fe9Sdrh %type raisetype {int} 122774ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 122874ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 122974ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 123074ad7fe9Sdrh 12316f34903eSdanielk1977 1232c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1233b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1234fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1235fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1236c3f9bad2Sdanielk1977 } 1237154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1238113088ecSdrh 1239113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1240fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1241f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 1242b7916a78Sdrh sqlite3Attach(pParse, F.pExpr, D.pExpr, K); 12431c2d8414Sdrh } 1244fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 1245b7916a78Sdrh sqlite3Detach(pParse, D.pExpr); 1246fdbcdee5Sdrh } 1247fdbcdee5Sdrh 1248f744bb56Sdanielk1977 %type key_opt {Expr*} 1249633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1250f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 1251b7916a78Sdrh key_opt(A) ::= KEY expr(X). { A = X.pExpr; } 1252113088ecSdrh 1253113088ecSdrh database_kw_opt ::= DATABASE. 1254113088ecSdrh database_kw_opt ::= . 1255fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 12564343fea2Sdrh 12574343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 12584343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 12594343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 12604343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1261154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 12629fd2a9a0Sdanielk1977 12639f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 12649f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 12659f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 12669f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 12679f18e8a0Sdrh %endif 12689f18e8a0Sdrh 12699fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 12709fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 12719fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 12729fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 12739fd2a9a0Sdanielk1977 } 127419a8e7e8Sdanielk1977 cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { 127519a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 127619a8e7e8Sdanielk1977 } 127719a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 1278d9da78a2Sdrh pParse->db->lookaside.bEnabled = 0; 127919a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 128019a8e7e8Sdanielk1977 } 128119a8e7e8Sdanielk1977 kwcolumn_opt ::= . 128219a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1283154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1284e09daa90Sdrh 1285e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1286e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1287b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1288b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1289d9da78a2Sdrh create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { 1290b9bb7c18Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z); 1291b9bb7c18Sdrh } 1292e09daa90Sdrh vtabarglist ::= vtabarg. 1293e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1294b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1295b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1296b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1297b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1298b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1299b9bb7c18Sdrh anylist ::= . 1300aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1301aaac8b4eSdrh anylist ::= anylist ANY. 1302154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 1303