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*cbb18d22Sdanielk1977 ** @(#) $Id: parse.y,v 1.120 2004/05/28 11:37:28 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 { 42ad3cab52Sdrh int limit; /* The LIMIT value. -1 if there is no limit */ 43ad3cab52Sdrh int offset; /* The OFFSET. 0 if there is none */ 44ad3cab52Sdrh }; 45c3f9bad2Sdanielk1977 46c3f9bad2Sdanielk1977 /* 47ad3cab52Sdrh ** An instance of the following structure describes the event of a 48ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 49ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 50ad3cab52Sdrh ** 51ad3cab52Sdrh ** UPDATE ON (a,b,c) 52ad3cab52Sdrh ** 53ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 54c3f9bad2Sdanielk1977 */ 55ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 56caec2f12Sdrh 57caec2f12Sdrh } // end %include 58348784efSdrh 59348784efSdrh // These are extra tokens used by the lexer but never seen by the 60348784efSdrh // parser. We put them in a rule so that the parser generator will 616206d50aSdrh // add them to the parse.h output file. 62348784efSdrh // 63c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION 64c4a3c779Sdrh COLUMN AGG_FUNCTION. 65c4a3c779Sdrh 66826fb5a3Sdrh // Input is a single SQL command 67c4a3c779Sdrh input ::= cmdlist. 68094b2bbfSdrh cmdlist ::= cmdlist ecmd. 69826fb5a3Sdrh cmdlist ::= ecmd. 70483750baSdrh ecmd ::= explain cmdx SEMI. 71094b2bbfSdrh ecmd ::= SEMI. 724adee20fSdanielk1977 cmdx ::= cmd. { sqlite3Exec(pParse); } 734adee20fSdanielk1977 explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 744adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 75348784efSdrh 76382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 77c4a3c779Sdrh // 78fa86c412Sdrh 794adee20fSdanielk1977 cmd ::= BEGIN trans_opt onconf(R). {sqlite3BeginTransaction(pParse,R);} 80c4a3c779Sdrh trans_opt ::= . 81c4a3c779Sdrh trans_opt ::= TRANSACTION. 825ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 834adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 844adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 854adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 86c4a3c779Sdrh 87382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 88348784efSdrh // 89348784efSdrh cmd ::= create_table create_table_args. 90*cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). { 91*cbb18d22Sdanielk1977 sqlite3StartTable(pParse,&X,&Y,&Z,T,0); 92969fa7c1Sdrh } 93f57b3399Sdrh %type temp {int} 94d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 95d24cc427Sdrh temp(A) ::= . {A = 0;} 96969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). { 974adee20fSdanielk1977 sqlite3EndTable(pParse,&X,0); 98969fa7c1Sdrh } 99969fa7c1Sdrh create_table_args ::= AS select(S). { 1004adee20fSdanielk1977 sqlite3EndTable(pParse,0,S); 1014adee20fSdanielk1977 sqlite3SelectDelete(S); 102969fa7c1Sdrh } 103348784efSdrh columnlist ::= columnlist COMMA column. 104348784efSdrh columnlist ::= column. 105348784efSdrh 106348784efSdrh // About the only information used for a column is the name of the 107348784efSdrh // column. The type is always just "text". But the code will accept 108348784efSdrh // an elaborate typename. Perhaps someday we'll do something with it. 109348784efSdrh // 110348784efSdrh column ::= columnid type carglist. 1114adee20fSdanielk1977 columnid ::= nm(X). {sqlite3AddColumn(pParse,&X);} 112c4a3c779Sdrh 113c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 114c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 115c4a3c779Sdrh // 116982cef7eSdrh %type id {Token} 117f18543caSdrh id(A) ::= ID(X). {A = X;} 1180bd1f4eaSdrh 11934e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 12034e33bb8Sdrh // fallback to ID if they will not parse as their original value. 12134e33bb8Sdrh // This obviates the need for the "id" nonterminal. 12234e33bb8Sdrh // 1230bd1f4eaSdrh %fallback ID 124113088ecSdrh ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CLUSTER CONFLICT 1255f3b4ab5Sdrh DATABASE DEFERRED DESC DETACH EACH END EXPLAIN FAIL FOR 126319e4e74Sdrh GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY 1275ad1a6c8Sdrh OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT 1280bd1f4eaSdrh TEMP TRIGGER VACUUM VIEW. 129c4a3c779Sdrh 1302d3917daSdrh // Define operator precedence early so that this is the first occurance 1312d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 1322d3917daSdrh // causes them to be assigned integer values that are close together, 1332d3917daSdrh // which keeps parser tables smaller. 1342d3917daSdrh // 1352d3917daSdrh %left OR. 1362d3917daSdrh %left AND. 1372d3917daSdrh %right NOT. 1382d3917daSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN. 1392d3917daSdrh %left GT GE LT LE. 1402d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 1412d3917daSdrh %left PLUS MINUS. 1422d3917daSdrh %left STAR SLASH REM. 1432d3917daSdrh %left CONCAT. 1442d3917daSdrh %right UMINUS UPLUS BITNOT. 1452d3917daSdrh 146c4a3c779Sdrh // And "ids" is an identifer-or-string. 147c4a3c779Sdrh // 148c4a3c779Sdrh %type ids {Token} 1495ad1a6c8Sdrh ids(A) ::= ID(X). {A = X;} 150c4a3c779Sdrh ids(A) ::= STRING(X). {A = X;} 151c4a3c779Sdrh 1525ad1a6c8Sdrh // The name of a column or table can be any of the following: 1535ad1a6c8Sdrh // 1545ad1a6c8Sdrh %type nm {Token} 1555ad1a6c8Sdrh nm(A) ::= ID(X). {A = X;} 1565ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 1575ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 1585ad1a6c8Sdrh 159382c0247Sdrh type ::= . 1604adee20fSdanielk1977 type ::= typename(X). {sqlite3AddColumnType(pParse,&X,&X);} 1614adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y). {sqlite3AddColumnType(pParse,&X,&Y);} 162382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y). 1634adee20fSdanielk1977 {sqlite3AddColumnType(pParse,&X,&Y);} 164382c0247Sdrh %type typename {Token} 165382c0247Sdrh typename(A) ::= ids(X). {A = X;} 166e2ea40d3Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=X.n+Addr(Y.z)-Addr(X.z);} 167ef0cae50Sdrh %type signed {int} 168ef0cae50Sdrh signed(A) ::= INTEGER(X). { A = atoi(X.z); } 169ef0cae50Sdrh signed(A) ::= PLUS INTEGER(X). { A = atoi(X.z); } 170ef0cae50Sdrh signed(A) ::= MINUS INTEGER(X). { A = -atoi(X.z); } 171348784efSdrh carglist ::= carglist carg. 172348784efSdrh carglist ::= . 1735ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 174348784efSdrh carg ::= ccons. 1754adee20fSdanielk1977 carg ::= DEFAULT STRING(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1764adee20fSdanielk1977 carg ::= DEFAULT ID(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1774adee20fSdanielk1977 carg ::= DEFAULT INTEGER(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1784adee20fSdanielk1977 carg ::= DEFAULT PLUS INTEGER(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1794adee20fSdanielk1977 carg ::= DEFAULT MINUS INTEGER(X). {sqlite3AddDefaultValue(pParse,&X,1);} 1804adee20fSdanielk1977 carg ::= DEFAULT FLOAT(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1814adee20fSdanielk1977 carg ::= DEFAULT PLUS FLOAT(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1824adee20fSdanielk1977 carg ::= DEFAULT MINUS FLOAT(X). {sqlite3AddDefaultValue(pParse,&X,1);} 1837020f651Sdrh carg ::= DEFAULT NULL. 184348784efSdrh 185382c0247Sdrh // In addition to the type name, we also care about the primary key and 186382c0247Sdrh // UNIQUE constraints. 187348784efSdrh // 1880d316a40Sdrh ccons ::= NULL onconf. 1894adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 1904adee20fSdanielk1977 ccons ::= PRIMARY KEY sortorder onconf(R). {sqlite3AddPrimaryKey(pParse,0,R);} 191*cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);} 1929cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf. 193c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 1944adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 1954adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 196d3d39e93Sdrh ccons ::= COLLATE id(C). {sqlite3AddCollateType(pParse, C.z, C.n);} 19704738cb9Sdrh 198c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 199c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 200c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 201c2eef3b3Sdrh // check fails. 20204738cb9Sdrh // 203c2eef3b3Sdrh %type refargs {int} 204c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 205c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } 206c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 207c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 208c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 209c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 210c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 211c2eef3b3Sdrh %type refact {int} 212c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 213c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 214c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 215c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 216c2eef3b3Sdrh %type defer_subclause {int} 217c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 218c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 219c2eef3b3Sdrh %type init_deferred_pred_opt {int} 220c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 221c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 222c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 223348784efSdrh 224348784efSdrh // For the time being, the only constraint we care about is the primary 225382c0247Sdrh // key and UNIQUE. Both create indices. 226348784efSdrh // 227348784efSdrh conslist_opt ::= . 228348784efSdrh conslist_opt ::= COMMA conslist. 229348784efSdrh conslist ::= conslist COMMA tcons. 230a2e1bb5aSdrh conslist ::= conslist tcons. 231348784efSdrh conslist ::= tcons. 2325ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 2339cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R). 2344adee20fSdanielk1977 {sqlite3AddPrimaryKey(pParse,X,R);} 2359cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 236*cbb18d22Sdanielk1977 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);} 2379cfcf5d4Sdrh tcons ::= CHECK expr onconf. 238c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 239c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 2404adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 2414adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 242c2eef3b3Sdrh } 243c2eef3b3Sdrh %type defer_subclause_opt {int} 244c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 245c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 2469cfcf5d4Sdrh 2479cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 2489cfcf5d4Sdrh // default behavior when there is a constraint conflict. 2499cfcf5d4Sdrh // 2509cfcf5d4Sdrh %type onconf {int} 2511c92853dSdrh %type orconf {int} 2521c92853dSdrh %type resolvetype {int} 2531c92853dSdrh onconf(A) ::= . { A = OE_Default; } 2541c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). { A = X; } 2551c92853dSdrh orconf(A) ::= . { A = OE_Default; } 2561c92853dSdrh orconf(A) ::= OR resolvetype(X). { A = X; } 2571c92853dSdrh resolvetype(A) ::= ROLLBACK. { A = OE_Rollback; } 2581c92853dSdrh resolvetype(A) ::= ABORT. { A = OE_Abort; } 2591c92853dSdrh resolvetype(A) ::= FAIL. { A = OE_Fail; } 2601c92853dSdrh resolvetype(A) ::= IGNORE. { A = OE_Ignore; } 2611c92853dSdrh resolvetype(A) ::= REPLACE. { A = OE_Replace; } 262348784efSdrh 263382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 264348784efSdrh // 2654adee20fSdanielk1977 cmd ::= DROP TABLE nm(X). {sqlite3DropTable(pParse,&X,0);} 266348784efSdrh 267a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 268a76b5dfcSdrh // 2696276c1cbSdrh cmd ::= CREATE(X) temp(T) VIEW nm(Y) AS select(S). { 2704adee20fSdanielk1977 sqlite3CreateView(pParse, &X, &Y, S, T); 271a76b5dfcSdrh } 2725ad1a6c8Sdrh cmd ::= DROP VIEW nm(X). { 2734adee20fSdanielk1977 sqlite3DropTable(pParse, &X, 1); 274a76b5dfcSdrh } 275a76b5dfcSdrh 276382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 277348784efSdrh // 2789bb61fe7Sdrh cmd ::= select(X). { 279bf3b721fSdanielk1977 sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); 2804adee20fSdanielk1977 sqlite3SelectDelete(X); 2819bb61fe7Sdrh } 282efb7251dSdrh 2839bb61fe7Sdrh %type select {Select*} 2844adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);} 28582c3d636Sdrh %type oneselect {Select*} 2864adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);} 2879bb61fe7Sdrh 28882c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 2890a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 290daffd0e5Sdrh if( Z ){ 29182c3d636Sdrh Z->op = Y; 29282c3d636Sdrh Z->pPrior = X; 293daffd0e5Sdrh } 29482c3d636Sdrh A = Z; 29582c3d636Sdrh } 2960a36c57eSdrh %type multiselect_op {int} 2970a36c57eSdrh multiselect_op(A) ::= UNION. {A = TK_UNION;} 2980a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 2990a36c57eSdrh multiselect_op(A) ::= INTERSECT. {A = TK_INTERSECT;} 3000a36c57eSdrh multiselect_op(A) ::= EXCEPT. {A = TK_EXCEPT;} 30182c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 3029bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 3034adee20fSdanielk1977 A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset); 3049bb61fe7Sdrh } 3059bb61fe7Sdrh 3069bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 3079bb61fe7Sdrh // present and false (0) if it is not. 3089bb61fe7Sdrh // 309efb7251dSdrh %type distinct {int} 310efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 311fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 312efb7251dSdrh distinct(A) ::= . {A = 0;} 313348784efSdrh 3149bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 3157c917d19Sdrh // values of the SELECT statement. The "*" in statements like 3167c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 3177c917d19Sdrh // opcode of TK_ALL. 3189bb61fe7Sdrh // 319348784efSdrh %type selcollist {ExprList*} 3204adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);} 321348784efSdrh %type sclp {ExprList*} 3224adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);} 323348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 324348784efSdrh sclp(A) ::= . {A = 0;} 32501f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 3264adee20fSdanielk1977 A = sqlite3ExprListAppend(P,X,Y.n?&Y:0); 32701f3f253Sdrh } 3287c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 3294adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0); 3307c917d19Sdrh } 3315ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. { 3324adee20fSdanielk1977 Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0); 3334adee20fSdanielk1977 Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X); 3344adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0); 33554473229Sdrh } 33601f3f253Sdrh 33701f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 33801f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 33901f3f253Sdrh // 34001f3f253Sdrh %type as {Token} 3415ad1a6c8Sdrh as(X) ::= AS nm(Y). { X = Y; } 3425ad1a6c8Sdrh as(X) ::= ids(Y). { X = Y; } 34301f3f253Sdrh as(X) ::= . { X.n = 0; } 3449bb61fe7Sdrh 345348784efSdrh 346ad3cab52Sdrh %type seltablist {SrcList*} 3474adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);} 348ad3cab52Sdrh %type stl_prefix {SrcList*} 3494adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);} 350ad3cab52Sdrh %type from {SrcList*} 3514adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);} 352348784efSdrh 35301f3f253Sdrh // A complete FROM clause. 35401f3f253Sdrh // 355bf3a4fa4Sdrh from(A) ::= . {A = sqliteMalloc(sizeof(*A));} 356348784efSdrh from(A) ::= FROM seltablist(X). {A = X;} 35701f3f253Sdrh 35801f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 35901f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 36001f3f253Sdrh // 36101f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 36201f3f253Sdrh A = X; 36301f3f253Sdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; 36401f3f253Sdrh } 365348784efSdrh stl_prefix(A) ::= . {A = 0;} 366113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { 3674adee20fSdanielk1977 A = sqlite3SrcListAppend(X,&Y,&D); 3684adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 36901f3f253Sdrh if( N ){ 37001f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 3714adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 372c4a3c779Sdrh } 37301f3f253Sdrh if( U ){ 37401f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 3754adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 37601f3f253Sdrh } 37701f3f253Sdrh } 378b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP 379b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 3804adee20fSdanielk1977 A = sqlite3SrcListAppend(X,0,0); 381ad3cab52Sdrh A->a[A->nSrc-1].pSelect = S; 3824adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 38301f3f253Sdrh if( N ){ 38401f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 3854adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 38622f70c32Sdrh } 38701f3f253Sdrh if( U ){ 38801f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 3894adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 390d5feede1Sdrh } 39122f70c32Sdrh } 392348784efSdrh 393b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 394b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 395b733d037Sdrh // a grouping of table and subqueries. 396b733d037Sdrh // 397b733d037Sdrh %type seltablist_paren {Select*} 3984adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);} 399b733d037Sdrh seltablist_paren(A) ::= select(S). {A = S;} 400b733d037Sdrh seltablist_paren(A) ::= seltablist(F). { 4014adee20fSdanielk1977 A = sqlite3SelectNew(0,F,0,0,0,0,0,-1,0); 402b733d037Sdrh } 403b733d037Sdrh 404113088ecSdrh %type dbnm {Token} 405113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 406113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 407113088ecSdrh 40801f3f253Sdrh %type joinop {int} 40901f3f253Sdrh %type joinop2 {int} 41001f3f253Sdrh joinop(X) ::= COMMA. { X = JT_INNER; } 41101f3f253Sdrh joinop(X) ::= JOIN. { X = JT_INNER; } 4124adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 4134adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 4145ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 4154adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 41601f3f253Sdrh 41701f3f253Sdrh %type on_opt {Expr*} 4184adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);} 41901f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 42001f3f253Sdrh on_opt(N) ::= . {N = 0;} 42101f3f253Sdrh 42201f3f253Sdrh %type using_opt {IdList*} 4234adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);} 42401f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP. {U = L;} 42501f3f253Sdrh using_opt(U) ::= . {U = 0;} 42601f3f253Sdrh 42701f3f253Sdrh 428348784efSdrh %type orderby_opt {ExprList*} 4294adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);} 430348784efSdrh %type sortlist {ExprList*} 4314adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);} 432348784efSdrh %type sortitem {Expr*} 4334adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);} 434348784efSdrh 435348784efSdrh orderby_opt(A) ::= . {A = 0;} 436348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 4378e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). { 4381186b0a0Sdrh A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0); 439d3d39e93Sdrh if( A ) A->a[A->nExpr-1].sortOrder = Z; 440348784efSdrh } 44138640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). { 4421186b0a0Sdrh A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0); 443d3d39e93Sdrh if( A ) A->a[0].sortOrder = Z; 444348784efSdrh } 445da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 446348784efSdrh 447348784efSdrh %type sortorder {int} 448d3d39e93Sdrh %type collate {Token} 449348784efSdrh 4508e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 4518e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 4528e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 453d3d39e93Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 454d3d39e93Sdrh collate(C) ::= COLLATE id(X). {C = X;} 455348784efSdrh 4562282792aSdrh %type groupby_opt {ExprList*} 4574adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);} 4582282792aSdrh groupby_opt(A) ::= . {A = 0;} 4592282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;} 4602282792aSdrh 4612282792aSdrh %type having_opt {Expr*} 4624adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);} 4632282792aSdrh having_opt(A) ::= . {A = 0;} 4642282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 4652282792aSdrh 466ad3cab52Sdrh %type limit_opt {struct LimitVal} 467ad3cab52Sdrh limit_opt(A) ::= . {A.limit = -1; A.offset = 0;} 468ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X). {A.limit = X; A.offset = 0;} 469ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y). 470ef0cae50Sdrh {A.limit = X; A.offset = Y;} 471ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y). 472ef0cae50Sdrh {A.limit = Y; A.offset = X;} 4739bbca4c1Sdrh 474382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 475382c0247Sdrh // 476113088ecSdrh cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). { 4774adee20fSdanielk1977 sqlite3DeleteFrom(pParse, sqlite3SrcListAppend(0,&X,&D), Y); 478113088ecSdrh } 479348784efSdrh 480348784efSdrh %type where_opt {Expr*} 4814adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);} 482348784efSdrh 483348784efSdrh where_opt(A) ::= . {A = 0;} 484348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 485348784efSdrh 486348784efSdrh %type setlist {ExprList*} 4874adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);} 488348784efSdrh 489382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 490382c0247Sdrh // 491113088ecSdrh cmd ::= UPDATE orconf(R) nm(X) dbnm(D) SET setlist(Y) where_opt(Z). 4924adee20fSdanielk1977 {sqlite3Update(pParse,sqlite3SrcListAppend(0,&X,&D),Y,Z,R);} 493348784efSdrh 4945ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 4954adee20fSdanielk1977 {A = sqlite3ExprListAppend(Z,Y,&X);} 4964adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(0,Y,&X);} 497348784efSdrh 498382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 499382c0247Sdrh // 500113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) 501113088ecSdrh VALUES LP itemlist(Y) RP. 5024adee20fSdanielk1977 {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), Y, 0, F, R);} 503113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) select(S). 5044adee20fSdanielk1977 {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), 0, S, F, R);} 505348784efSdrh 506fa86c412Sdrh %type insert_cmd {int} 507fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 508fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 509fa86c412Sdrh 510348784efSdrh 511348784efSdrh %type itemlist {ExprList*} 5124adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);} 513348784efSdrh 5144adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);} 5154adee20fSdanielk1977 itemlist(A) ::= expr(X). {A = sqlite3ExprListAppend(0,X,0);} 516348784efSdrh 517967e8b73Sdrh %type inscollist_opt {IdList*} 5184adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);} 519967e8b73Sdrh %type inscollist {IdList*} 5204adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);} 521348784efSdrh 522967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 523967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 5244adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqlite3IdListAppend(X,&Y);} 5254adee20fSdanielk1977 inscollist(A) ::= nm(Y). {A = sqlite3IdListAppend(0,&Y);} 526348784efSdrh 527382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 528382c0247Sdrh // 529348784efSdrh 530348784efSdrh %type expr {Expr*} 5314adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);} 532348784efSdrh 5334adee20fSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } 5344adee20fSdanielk1977 expr(A) ::= NULL(X). {A = sqlite3Expr(TK_NULL, 0, 0, &X);} 5354adee20fSdanielk1977 expr(A) ::= ID(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5364adee20fSdanielk1977 expr(A) ::= JOIN_KW(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5375ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 5384adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5394adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5404adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp2, 0); 541e1b6a5b8Sdrh } 542d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 5434adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5444adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5454adee20fSdanielk1977 Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z); 5464adee20fSdanielk1977 Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0); 5474adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp4, 0); 548d24cc427Sdrh } 5494adee20fSdanielk1977 expr(A) ::= INTEGER(X). {A = sqlite3Expr(TK_INTEGER, 0, 0, &X);} 5504adee20fSdanielk1977 expr(A) ::= FLOAT(X). {A = sqlite3Expr(TK_FLOAT, 0, 0, &X);} 5514adee20fSdanielk1977 expr(A) ::= STRING(X). {A = sqlite3Expr(TK_STRING, 0, 0, &X);} 552c572ef7fSdanielk1977 expr(A) ::= BLOB(X). {A = sqlite3Expr(TK_BLOB, 0, 0, &X);} 5537c972decSdrh expr(A) ::= VARIABLE(X). { 5544adee20fSdanielk1977 A = sqlite3Expr(TK_VARIABLE, 0, 0, &X); 5557c972decSdrh if( A ) A->iTable = ++pParse->nVar; 5567c972decSdrh } 557e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). { 5584adee20fSdanielk1977 A = sqlite3ExprFunction(Y, &X); 5594adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 560e1b6a5b8Sdrh } 561e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 5624adee20fSdanielk1977 A = sqlite3ExprFunction(0, &X); 5634adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 564e1b6a5b8Sdrh } 5654adee20fSdanielk1977 expr(A) ::= expr(X) AND expr(Y). {A = sqlite3Expr(TK_AND, X, Y, 0);} 5664adee20fSdanielk1977 expr(A) ::= expr(X) OR expr(Y). {A = sqlite3Expr(TK_OR, X, Y, 0);} 5674adee20fSdanielk1977 expr(A) ::= expr(X) LT expr(Y). {A = sqlite3Expr(TK_LT, X, Y, 0);} 5684adee20fSdanielk1977 expr(A) ::= expr(X) GT expr(Y). {A = sqlite3Expr(TK_GT, X, Y, 0);} 5694adee20fSdanielk1977 expr(A) ::= expr(X) LE expr(Y). {A = sqlite3Expr(TK_LE, X, Y, 0);} 5704adee20fSdanielk1977 expr(A) ::= expr(X) GE expr(Y). {A = sqlite3Expr(TK_GE, X, Y, 0);} 5714adee20fSdanielk1977 expr(A) ::= expr(X) NE expr(Y). {A = sqlite3Expr(TK_NE, X, Y, 0);} 5724adee20fSdanielk1977 expr(A) ::= expr(X) EQ expr(Y). {A = sqlite3Expr(TK_EQ, X, Y, 0);} 5734adee20fSdanielk1977 expr(A) ::= expr(X) BITAND expr(Y). {A = sqlite3Expr(TK_BITAND, X, Y, 0);} 5744adee20fSdanielk1977 expr(A) ::= expr(X) BITOR expr(Y). {A = sqlite3Expr(TK_BITOR, X, Y, 0);} 5754adee20fSdanielk1977 expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqlite3Expr(TK_LSHIFT, X, Y, 0);} 5764adee20fSdanielk1977 expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqlite3Expr(TK_RSHIFT, X, Y, 0);} 5770ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE] { 5784adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 5794adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 5804adee20fSdanielk1977 A = sqlite3ExprFunction(pList, 0); 5814b59ab5eSdrh if( A ) A->op = OP; 5824adee20fSdanielk1977 sqlite3ExprSpan(A, &X->span, &Y->span); 5830ac65892Sdrh } 5840ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] { 5854adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 5864adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 5874adee20fSdanielk1977 A = sqlite3ExprFunction(pList, 0); 5884b59ab5eSdrh if( A ) A->op = OP; 5894adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 5904adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&Y->span); 5914794b980Sdrh } 5924b59ab5eSdrh %type likeop {int} 5934b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;} 5944b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;} 5954adee20fSdanielk1977 expr(A) ::= expr(X) PLUS expr(Y). {A = sqlite3Expr(TK_PLUS, X, Y, 0);} 5964adee20fSdanielk1977 expr(A) ::= expr(X) MINUS expr(Y). {A = sqlite3Expr(TK_MINUS, X, Y, 0);} 5974adee20fSdanielk1977 expr(A) ::= expr(X) STAR expr(Y). {A = sqlite3Expr(TK_STAR, X, Y, 0);} 5984adee20fSdanielk1977 expr(A) ::= expr(X) SLASH expr(Y). {A = sqlite3Expr(TK_SLASH, X, Y, 0);} 5994adee20fSdanielk1977 expr(A) ::= expr(X) REM expr(Y). {A = sqlite3Expr(TK_REM, X, Y, 0);} 6004adee20fSdanielk1977 expr(A) ::= expr(X) CONCAT expr(Y). {A = sqlite3Expr(TK_CONCAT, X, Y, 0);} 601e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). { 6024adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6034adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 604e1b6a5b8Sdrh } 60533048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 6064adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6074adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 60833048c0bSdrh } 60933048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). { 6104adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6114adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 61233048c0bSdrh } 613e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). { 6144adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6154adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 616e1b6a5b8Sdrh } 61781a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 6184adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6194adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 62081a20f21Sdrh } 621e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). { 6224adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, X, 0, 0); 6234adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 624e1b6a5b8Sdrh } 62581a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). { 6264adee20fSdanielk1977 A = sqlite3Expr(TK_BITNOT, X, 0, 0); 6274adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 62881a20f21Sdrh } 629e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 6304adee20fSdanielk1977 A = sqlite3Expr(TK_UMINUS, X, 0, 0); 6314adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 632e1b6a5b8Sdrh } 6334b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 6344adee20fSdanielk1977 A = sqlite3Expr(TK_UPLUS, X, 0, 0); 6354adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 636e1b6a5b8Sdrh } 637e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). { 6384adee20fSdanielk1977 A = sqlite3Expr(TK_SELECT, 0, 0, 0); 639daffd0e5Sdrh if( A ) A->pSelect = X; 6404adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&E); 64119a775c2Sdrh } 642fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). { 6434adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 6444adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 6454adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 646daffd0e5Sdrh if( A ) A->pList = pList; 6474adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 648fef5208cSdrh } 6494794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). { 6504adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 6514adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 6524adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 653daffd0e5Sdrh if( A ) A->pList = pList; 6544adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6554adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 6564794b980Sdrh } 657e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E). { 6584adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 659daffd0e5Sdrh if( A ) A->pList = Y; 6604adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 661fef5208cSdrh } 662e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E). { 6634adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 664daffd0e5Sdrh if( A ) A->pSelect = Y; 6654adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 666fef5208cSdrh } 667e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E). { 6684adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 669daffd0e5Sdrh if( A ) A->pList = Y; 6704adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6714adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 6724794b980Sdrh } 673e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E). { 6744adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 675daffd0e5Sdrh if( A ) A->pSelect = Y; 6764adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6774adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 6784794b980Sdrh } 67923b2db23Sdrh expr(A) ::= expr(X) IN nm(Y) dbnm(D). { 6804adee20fSdanielk1977 SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); 6814adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 6824adee20fSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); 6834adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); 68423b2db23Sdrh } 68523b2db23Sdrh expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). { 6864adee20fSdanielk1977 SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); 6874adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 6884adee20fSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); 6894adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6904adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); 69123b2db23Sdrh } 69223b2db23Sdrh 693fef5208cSdrh 69417a7f8ddSdrh /* CASE expressions */ 69517a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 6964adee20fSdanielk1977 A = sqlite3Expr(TK_CASE, X, Z, 0); 69717a7f8ddSdrh if( A ) A->pList = Y; 6984adee20fSdanielk1977 sqlite3ExprSpan(A, &C, &E); 69917a7f8ddSdrh } 70017a7f8ddSdrh %type case_exprlist {ExprList*} 7014adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);} 70217a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 7034adee20fSdanielk1977 A = sqlite3ExprListAppend(X, Y, 0); 7044adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 70517a7f8ddSdrh } 70617a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 7074adee20fSdanielk1977 A = sqlite3ExprListAppend(0, Y, 0); 7084adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 70917a7f8ddSdrh } 71017a7f8ddSdrh %type case_else {Expr*} 71117a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 71217a7f8ddSdrh case_else(A) ::= . {A = 0;} 71317a7f8ddSdrh %type case_operand {Expr*} 71417a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 71517a7f8ddSdrh case_operand(A) ::= . {A = 0;} 716348784efSdrh 717348784efSdrh %type exprlist {ExprList*} 7184adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);} 719348784efSdrh %type expritem {Expr*} 7204adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);} 721348784efSdrh 722348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y). 7234adee20fSdanielk1977 {A = sqlite3ExprListAppend(X,Y,0);} 7244adee20fSdanielk1977 exprlist(A) ::= expritem(X). {A = sqlite3ExprListAppend(0,X,0);} 725348784efSdrh expritem(A) ::= expr(X). {A = X;} 726348784efSdrh expritem(A) ::= . {A = 0;} 727cce7d176Sdrh 728382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 729382c0247Sdrh // 730*cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D) 731*cbb18d22Sdanielk1977 ON nm(Y) LP idxlist(Z) RP(E) onconf(R). { 7329cfcf5d4Sdrh if( U!=OE_None ) U = R; 7339cfcf5d4Sdrh if( U==OE_Default) U = OE_Abort; 734*cbb18d22Sdanielk1977 sqlite3CreateIndex(pParse, &X, &D, &Y, Z, U, &S, &E); 7359cfcf5d4Sdrh } 736717e6402Sdrh 737717e6402Sdrh %type uniqueflag {int} 7389cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. { A = OE_Abort; } 7399cfcf5d4Sdrh uniqueflag(A) ::= . { A = OE_None; } 740348784efSdrh 741348784efSdrh %type idxlist {IdList*} 7424adee20fSdanielk1977 %destructor idxlist {sqlite3IdListDelete($$);} 743c2eef3b3Sdrh %type idxlist_opt {IdList*} 7444adee20fSdanielk1977 %destructor idxlist_opt {sqlite3IdListDelete($$);} 745348784efSdrh %type idxitem {Token} 746348784efSdrh 747c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 748c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 7494adee20fSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y). {A = sqlite3IdListAppend(X,&Y);} 7504adee20fSdanielk1977 idxlist(A) ::= idxitem(Y). {A = sqlite3IdListAppend(0,&Y);} 75186e5cc05Sdrh idxitem(A) ::= nm(X) sortorder. {A = X;} 752348784efSdrh 7538aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 754382c0247Sdrh // 755382c0247Sdrh 756d24cc427Sdrh cmd ::= DROP INDEX nm(X) dbnm(Y). { 7574adee20fSdanielk1977 sqlite3DropIndex(pParse, sqlite3SrcListAppend(0,&X,&Y)); 758d24cc427Sdrh } 759982cef7eSdrh 760382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 761382c0247Sdrh // 7624adee20fSdanielk1977 cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 7634adee20fSdanielk1977 cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} 764f57b14a6Sdrh 765382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 766382c0247Sdrh // 7674adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ nm(Y). {sqlite3Pragma(pParse,&X,&Y,0);} 7684adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Y,0);} 7694adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Y,0);} 7704adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ minus_num(Y). {sqlite3Pragma(pParse,&X,&Y,1);} 7714adee20fSdanielk1977 cmd ::= PRAGMA ids(X) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Y,0);} 7724adee20fSdanielk1977 cmd ::= PRAGMA ids(X). {sqlite3Pragma(pParse,&X,&X,0);} 773f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 774f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 775f57b14a6Sdrh number(A) ::= INTEGER(X). {A = X;} 776f57b14a6Sdrh number(A) ::= FLOAT(X). {A = X;} 777f57b14a6Sdrh plus_opt ::= PLUS. 778f57b14a6Sdrh plus_opt ::= . 779c3f9bad2Sdanielk1977 780c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 781f0f258b1Sdrh 782f0f258b1Sdrh cmd ::= CREATE(A) trigger_decl BEGIN trigger_cmd_list(S) END(Z). { 7834b59ab5eSdrh Token all; 7844b59ab5eSdrh all.z = A.z; 7854b59ab5eSdrh all.n = (Z.z - A.z) + Z.n; 7864adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 787f0f258b1Sdrh } 788f0f258b1Sdrh 789f0f258b1Sdrh trigger_decl ::= temp(T) TRIGGER nm(B) trigger_time(C) trigger_event(D) 790f0f258b1Sdrh ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). { 7914adee20fSdanielk1977 SrcList *pTab = sqlite3SrcListAppend(0, &E, &DB); 7924adee20fSdanielk1977 sqlite3BeginTrigger(pParse, &B, C, D.a, D.b, pTab, F, G, T); 793c3f9bad2Sdanielk1977 } 794c3f9bad2Sdanielk1977 795c3f9bad2Sdanielk1977 %type trigger_time {int} 796c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 797c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 798c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 799c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 800c3f9bad2Sdanielk1977 801ad3cab52Sdrh %type trigger_event {struct TrigEvent} 8024adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);} 803c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; } 804c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; } 805c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;} 806c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; } 807c3f9bad2Sdanielk1977 808c3f9bad2Sdanielk1977 %type foreach_clause {int} 809c3f9bad2Sdanielk1977 foreach_clause(A) ::= . { A = TK_ROW; } 810c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } 811c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } 812c3f9bad2Sdanielk1977 813c3f9bad2Sdanielk1977 %type when_clause {Expr *} 814c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 815c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 816c3f9bad2Sdanielk1977 817c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *} 8184adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} 819c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { 820a69d9168Sdrh X->pNext = Y; 821a69d9168Sdrh A = X; 822a69d9168Sdrh } 823c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; } 824c3f9bad2Sdanielk1977 825c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *} 8264adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} 827c3f9bad2Sdanielk1977 // UPDATE 8285ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 8294adee20fSdanielk1977 { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); } 830c3f9bad2Sdanielk1977 831c3f9bad2Sdanielk1977 // INSERT 8323054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 833c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 8344adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);} 835c3f9bad2Sdanielk1977 8363054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 8374adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);} 838c3f9bad2Sdanielk1977 839c3f9bad2Sdanielk1977 // DELETE 8405ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 8414adee20fSdanielk1977 {A = sqlite3TriggerDeleteStep(&X, Y);} 842c3f9bad2Sdanielk1977 843c3f9bad2Sdanielk1977 // SELECT 8444adee20fSdanielk1977 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(X); } 845c3f9bad2Sdanielk1977 8466f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 8474b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 8484adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, 0); 8494b59ab5eSdrh A->iColumn = OE_Ignore; 8504adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8514b59ab5eSdrh } 8524b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y). { 8534adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8544b59ab5eSdrh A->iColumn = OE_Rollback; 8554adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8564b59ab5eSdrh } 8574b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y). { 8584adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8594b59ab5eSdrh A->iColumn = OE_Abort; 8604adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8614b59ab5eSdrh } 8624b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y). { 8634adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8644b59ab5eSdrh A->iColumn = OE_Fail; 8654adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8664b59ab5eSdrh } 8676f34903eSdanielk1977 868c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 869d24cc427Sdrh cmd ::= DROP TRIGGER nm(X) dbnm(D). { 8704adee20fSdanielk1977 sqlite3DropTrigger(pParse,sqlite3SrcListAppend(0,&X,&D)); 871c3f9bad2Sdanielk1977 } 872113088ecSdrh 873113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 8744d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). { 8754adee20fSdanielk1977 sqlite3Attach(pParse, &F, &D, &K); 8761c2d8414Sdrh } 8774d189ca4Sdrh %type key_opt {Token} 8784d189ca4Sdrh key_opt(A) ::= USING ids(X). { A = X; } 8794d189ca4Sdrh key_opt(A) ::= . { A.z = 0; A.n = 0; } 880113088ecSdrh 881113088ecSdrh database_kw_opt ::= DATABASE. 882113088ecSdrh database_kw_opt ::= . 883113088ecSdrh 884113088ecSdrh //////////////////////// DETACH DATABASE name ///////////////////////////////// 8851c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). { 8864adee20fSdanielk1977 sqlite3Detach(pParse, &D); 8871c2d8414Sdrh } 888