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*e2ea40d3Sdrh ** @(#) $Id: parse.y,v 1.115 2004/05/20 12:41:20 drh 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. 905ad1a6c8Sdrh create_table ::= CREATE(X) temp(T) TABLE nm(Y). { 914adee20fSdanielk1977 sqlite3StartTable(pParse,&X,&Y,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 125113088ecSdrh COPY DATABASE DEFERRED DELIMITERS 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;} 166*e2ea40d3Sdrh 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);} 1914adee20fSdanielk1977 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,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);} 1968e2ca029Sdrh ccons ::= COLLATE id(C). { 1974adee20fSdanielk1977 sqlite3AddCollateType(pParse, sqlite3CollateType(C.z, C.n)); 1988e2ca029Sdrh } 19904738cb9Sdrh 200c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 201c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 202c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 203c2eef3b3Sdrh // check fails. 20404738cb9Sdrh // 205c2eef3b3Sdrh %type refargs {int} 206c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 207c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } 208c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 209c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 210c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 211c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 212c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 213c2eef3b3Sdrh %type refact {int} 214c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 215c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 216c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 217c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 218c2eef3b3Sdrh %type defer_subclause {int} 219c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 220c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 221c2eef3b3Sdrh %type init_deferred_pred_opt {int} 222c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 223c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 224c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 225348784efSdrh 226348784efSdrh // For the time being, the only constraint we care about is the primary 227382c0247Sdrh // key and UNIQUE. Both create indices. 228348784efSdrh // 229348784efSdrh conslist_opt ::= . 230348784efSdrh conslist_opt ::= COMMA conslist. 231348784efSdrh conslist ::= conslist COMMA tcons. 232a2e1bb5aSdrh conslist ::= conslist tcons. 233348784efSdrh conslist ::= tcons. 2345ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 2359cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R). 2364adee20fSdanielk1977 {sqlite3AddPrimaryKey(pParse,X,R);} 2379cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 2384adee20fSdanielk1977 {sqlite3CreateIndex(pParse,0,0,X,R,0,0);} 2399cfcf5d4Sdrh tcons ::= CHECK expr onconf. 240c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 241c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 2424adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 2434adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 244c2eef3b3Sdrh } 245c2eef3b3Sdrh %type defer_subclause_opt {int} 246c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 247c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 2489cfcf5d4Sdrh 2499cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 2509cfcf5d4Sdrh // default behavior when there is a constraint conflict. 2519cfcf5d4Sdrh // 2529cfcf5d4Sdrh %type onconf {int} 2531c92853dSdrh %type orconf {int} 2541c92853dSdrh %type resolvetype {int} 2551c92853dSdrh onconf(A) ::= . { A = OE_Default; } 2561c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). { A = X; } 2571c92853dSdrh orconf(A) ::= . { A = OE_Default; } 2581c92853dSdrh orconf(A) ::= OR resolvetype(X). { A = X; } 2591c92853dSdrh resolvetype(A) ::= ROLLBACK. { A = OE_Rollback; } 2601c92853dSdrh resolvetype(A) ::= ABORT. { A = OE_Abort; } 2611c92853dSdrh resolvetype(A) ::= FAIL. { A = OE_Fail; } 2621c92853dSdrh resolvetype(A) ::= IGNORE. { A = OE_Ignore; } 2631c92853dSdrh resolvetype(A) ::= REPLACE. { A = OE_Replace; } 264348784efSdrh 265382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 266348784efSdrh // 2674adee20fSdanielk1977 cmd ::= DROP TABLE nm(X). {sqlite3DropTable(pParse,&X,0);} 268348784efSdrh 269a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 270a76b5dfcSdrh // 2716276c1cbSdrh cmd ::= CREATE(X) temp(T) VIEW nm(Y) AS select(S). { 2724adee20fSdanielk1977 sqlite3CreateView(pParse, &X, &Y, S, T); 273a76b5dfcSdrh } 2745ad1a6c8Sdrh cmd ::= DROP VIEW nm(X). { 2754adee20fSdanielk1977 sqlite3DropTable(pParse, &X, 1); 276a76b5dfcSdrh } 277a76b5dfcSdrh 278382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 279348784efSdrh // 2809bb61fe7Sdrh cmd ::= select(X). { 281bf3b721fSdanielk1977 sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); 2824adee20fSdanielk1977 sqlite3SelectDelete(X); 2839bb61fe7Sdrh } 284efb7251dSdrh 2859bb61fe7Sdrh %type select {Select*} 2864adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);} 28782c3d636Sdrh %type oneselect {Select*} 2884adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);} 2899bb61fe7Sdrh 29082c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 2910a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 292daffd0e5Sdrh if( Z ){ 29382c3d636Sdrh Z->op = Y; 29482c3d636Sdrh Z->pPrior = X; 295daffd0e5Sdrh } 29682c3d636Sdrh A = Z; 29782c3d636Sdrh } 2980a36c57eSdrh %type multiselect_op {int} 2990a36c57eSdrh multiselect_op(A) ::= UNION. {A = TK_UNION;} 3000a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 3010a36c57eSdrh multiselect_op(A) ::= INTERSECT. {A = TK_INTERSECT;} 3020a36c57eSdrh multiselect_op(A) ::= EXCEPT. {A = TK_EXCEPT;} 30382c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 3049bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 3054adee20fSdanielk1977 A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset); 3069bb61fe7Sdrh } 3079bb61fe7Sdrh 3089bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 3099bb61fe7Sdrh // present and false (0) if it is not. 3109bb61fe7Sdrh // 311efb7251dSdrh %type distinct {int} 312efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 313fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 314efb7251dSdrh distinct(A) ::= . {A = 0;} 315348784efSdrh 3169bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 3177c917d19Sdrh // values of the SELECT statement. The "*" in statements like 3187c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 3197c917d19Sdrh // opcode of TK_ALL. 3209bb61fe7Sdrh // 321348784efSdrh %type selcollist {ExprList*} 3224adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);} 323348784efSdrh %type sclp {ExprList*} 3244adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);} 325348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 326348784efSdrh sclp(A) ::= . {A = 0;} 32701f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 3284adee20fSdanielk1977 A = sqlite3ExprListAppend(P,X,Y.n?&Y:0); 32901f3f253Sdrh } 3307c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 3314adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0); 3327c917d19Sdrh } 3335ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. { 3344adee20fSdanielk1977 Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0); 3354adee20fSdanielk1977 Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X); 3364adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0); 33754473229Sdrh } 33801f3f253Sdrh 33901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 34001f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 34101f3f253Sdrh // 34201f3f253Sdrh %type as {Token} 3435ad1a6c8Sdrh as(X) ::= AS nm(Y). { X = Y; } 3445ad1a6c8Sdrh as(X) ::= ids(Y). { X = Y; } 34501f3f253Sdrh as(X) ::= . { X.n = 0; } 3469bb61fe7Sdrh 347348784efSdrh 348ad3cab52Sdrh %type seltablist {SrcList*} 3494adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);} 350ad3cab52Sdrh %type stl_prefix {SrcList*} 3514adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);} 352ad3cab52Sdrh %type from {SrcList*} 3534adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);} 354348784efSdrh 35501f3f253Sdrh // A complete FROM clause. 35601f3f253Sdrh // 357bf3a4fa4Sdrh from(A) ::= . {A = sqliteMalloc(sizeof(*A));} 358348784efSdrh from(A) ::= FROM seltablist(X). {A = X;} 35901f3f253Sdrh 36001f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 36101f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 36201f3f253Sdrh // 36301f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 36401f3f253Sdrh A = X; 36501f3f253Sdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; 36601f3f253Sdrh } 367348784efSdrh stl_prefix(A) ::= . {A = 0;} 368113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { 3694adee20fSdanielk1977 A = sqlite3SrcListAppend(X,&Y,&D); 3704adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 37101f3f253Sdrh if( N ){ 37201f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 3734adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 374c4a3c779Sdrh } 37501f3f253Sdrh if( U ){ 37601f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 3774adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 37801f3f253Sdrh } 37901f3f253Sdrh } 380b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP 381b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 3824adee20fSdanielk1977 A = sqlite3SrcListAppend(X,0,0); 383ad3cab52Sdrh A->a[A->nSrc-1].pSelect = S; 3844adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 38501f3f253Sdrh if( N ){ 38601f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 3874adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 38822f70c32Sdrh } 38901f3f253Sdrh if( U ){ 39001f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 3914adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 392d5feede1Sdrh } 39322f70c32Sdrh } 394348784efSdrh 395b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 396b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 397b733d037Sdrh // a grouping of table and subqueries. 398b733d037Sdrh // 399b733d037Sdrh %type seltablist_paren {Select*} 4004adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);} 401b733d037Sdrh seltablist_paren(A) ::= select(S). {A = S;} 402b733d037Sdrh seltablist_paren(A) ::= seltablist(F). { 4034adee20fSdanielk1977 A = sqlite3SelectNew(0,F,0,0,0,0,0,-1,0); 404b733d037Sdrh } 405b733d037Sdrh 406113088ecSdrh %type dbnm {Token} 407113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 408113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 409113088ecSdrh 41001f3f253Sdrh %type joinop {int} 41101f3f253Sdrh %type joinop2 {int} 41201f3f253Sdrh joinop(X) ::= COMMA. { X = JT_INNER; } 41301f3f253Sdrh joinop(X) ::= JOIN. { X = JT_INNER; } 4144adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 4154adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 4165ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 4174adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 41801f3f253Sdrh 41901f3f253Sdrh %type on_opt {Expr*} 4204adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);} 42101f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 42201f3f253Sdrh on_opt(N) ::= . {N = 0;} 42301f3f253Sdrh 42401f3f253Sdrh %type using_opt {IdList*} 4254adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);} 42601f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP. {U = L;} 42701f3f253Sdrh using_opt(U) ::= . {U = 0;} 42801f3f253Sdrh 42901f3f253Sdrh 430348784efSdrh %type orderby_opt {ExprList*} 4314adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);} 432348784efSdrh %type sortlist {ExprList*} 4334adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);} 434348784efSdrh %type sortitem {Expr*} 4354adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);} 436348784efSdrh 437348784efSdrh orderby_opt(A) ::= . {A = 0;} 438348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 4398e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). { 4404adee20fSdanielk1977 A = sqlite3ExprListAppend(X,Y,0); 4418e2ca029Sdrh if( A ) A->a[A->nExpr-1].sortOrder = C+Z; 442348784efSdrh } 44338640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). { 4444adee20fSdanielk1977 A = sqlite3ExprListAppend(0,Y,0); 44538640e15Sdrh if( A ) A->a[0].sortOrder = C+Z; 446348784efSdrh } 447da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 448348784efSdrh 449348784efSdrh %type sortorder {int} 4508e2ca029Sdrh %type collate {int} 451348784efSdrh 4528e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 4538e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 4548e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 4558e2ca029Sdrh collate(C) ::= . {C = SQLITE_SO_UNK;} 4564adee20fSdanielk1977 collate(C) ::= COLLATE id(X). {C = sqlite3CollateType(X.z, X.n);} 457348784efSdrh 4582282792aSdrh %type groupby_opt {ExprList*} 4594adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);} 4602282792aSdrh groupby_opt(A) ::= . {A = 0;} 4612282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;} 4622282792aSdrh 4632282792aSdrh %type having_opt {Expr*} 4644adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);} 4652282792aSdrh having_opt(A) ::= . {A = 0;} 4662282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 4672282792aSdrh 468ad3cab52Sdrh %type limit_opt {struct LimitVal} 469ad3cab52Sdrh limit_opt(A) ::= . {A.limit = -1; A.offset = 0;} 470ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X). {A.limit = X; A.offset = 0;} 471ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y). 472ef0cae50Sdrh {A.limit = X; A.offset = Y;} 473ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y). 474ef0cae50Sdrh {A.limit = Y; A.offset = X;} 4759bbca4c1Sdrh 476382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 477382c0247Sdrh // 478113088ecSdrh cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). { 4794adee20fSdanielk1977 sqlite3DeleteFrom(pParse, sqlite3SrcListAppend(0,&X,&D), Y); 480113088ecSdrh } 481348784efSdrh 482348784efSdrh %type where_opt {Expr*} 4834adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);} 484348784efSdrh 485348784efSdrh where_opt(A) ::= . {A = 0;} 486348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 487348784efSdrh 488348784efSdrh %type setlist {ExprList*} 4894adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);} 490348784efSdrh 491382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 492382c0247Sdrh // 493113088ecSdrh cmd ::= UPDATE orconf(R) nm(X) dbnm(D) SET setlist(Y) where_opt(Z). 4944adee20fSdanielk1977 {sqlite3Update(pParse,sqlite3SrcListAppend(0,&X,&D),Y,Z,R);} 495348784efSdrh 4965ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 4974adee20fSdanielk1977 {A = sqlite3ExprListAppend(Z,Y,&X);} 4984adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(0,Y,&X);} 499348784efSdrh 500382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 501382c0247Sdrh // 502113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) 503113088ecSdrh VALUES LP itemlist(Y) RP. 5044adee20fSdanielk1977 {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), Y, 0, F, R);} 505113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) select(S). 5064adee20fSdanielk1977 {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), 0, S, F, R);} 507348784efSdrh 508fa86c412Sdrh %type insert_cmd {int} 509fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 510fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 511fa86c412Sdrh 512348784efSdrh 513348784efSdrh %type itemlist {ExprList*} 5144adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);} 515348784efSdrh 5164adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);} 5174adee20fSdanielk1977 itemlist(A) ::= expr(X). {A = sqlite3ExprListAppend(0,X,0);} 518348784efSdrh 519967e8b73Sdrh %type inscollist_opt {IdList*} 5204adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);} 521967e8b73Sdrh %type inscollist {IdList*} 5224adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);} 523348784efSdrh 524967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 525967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 5264adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqlite3IdListAppend(X,&Y);} 5274adee20fSdanielk1977 inscollist(A) ::= nm(Y). {A = sqlite3IdListAppend(0,&Y);} 528348784efSdrh 529382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 530382c0247Sdrh // 531348784efSdrh 532348784efSdrh %type expr {Expr*} 5334adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);} 534348784efSdrh 5354adee20fSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } 5364adee20fSdanielk1977 expr(A) ::= NULL(X). {A = sqlite3Expr(TK_NULL, 0, 0, &X);} 5374adee20fSdanielk1977 expr(A) ::= ID(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5384adee20fSdanielk1977 expr(A) ::= JOIN_KW(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5395ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 5404adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5414adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5424adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp2, 0); 543e1b6a5b8Sdrh } 544d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 5454adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5464adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5474adee20fSdanielk1977 Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z); 5484adee20fSdanielk1977 Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0); 5494adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp4, 0); 550d24cc427Sdrh } 5514adee20fSdanielk1977 expr(A) ::= INTEGER(X). {A = sqlite3Expr(TK_INTEGER, 0, 0, &X);} 5524adee20fSdanielk1977 expr(A) ::= FLOAT(X). {A = sqlite3Expr(TK_FLOAT, 0, 0, &X);} 5534adee20fSdanielk1977 expr(A) ::= STRING(X). {A = sqlite3Expr(TK_STRING, 0, 0, &X);} 5547c972decSdrh expr(A) ::= VARIABLE(X). { 5554adee20fSdanielk1977 A = sqlite3Expr(TK_VARIABLE, 0, 0, &X); 5567c972decSdrh if( A ) A->iTable = ++pParse->nVar; 5577c972decSdrh } 558e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). { 5594adee20fSdanielk1977 A = sqlite3ExprFunction(Y, &X); 5604adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 561e1b6a5b8Sdrh } 562e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 5634adee20fSdanielk1977 A = sqlite3ExprFunction(0, &X); 5644adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 565e1b6a5b8Sdrh } 5664adee20fSdanielk1977 expr(A) ::= expr(X) AND expr(Y). {A = sqlite3Expr(TK_AND, X, Y, 0);} 5674adee20fSdanielk1977 expr(A) ::= expr(X) OR expr(Y). {A = sqlite3Expr(TK_OR, X, Y, 0);} 5684adee20fSdanielk1977 expr(A) ::= expr(X) LT expr(Y). {A = sqlite3Expr(TK_LT, X, Y, 0);} 5694adee20fSdanielk1977 expr(A) ::= expr(X) GT expr(Y). {A = sqlite3Expr(TK_GT, X, Y, 0);} 5704adee20fSdanielk1977 expr(A) ::= expr(X) LE expr(Y). {A = sqlite3Expr(TK_LE, X, Y, 0);} 5714adee20fSdanielk1977 expr(A) ::= expr(X) GE expr(Y). {A = sqlite3Expr(TK_GE, X, Y, 0);} 5724adee20fSdanielk1977 expr(A) ::= expr(X) NE expr(Y). {A = sqlite3Expr(TK_NE, X, Y, 0);} 5734adee20fSdanielk1977 expr(A) ::= expr(X) EQ expr(Y). {A = sqlite3Expr(TK_EQ, X, Y, 0);} 5744adee20fSdanielk1977 expr(A) ::= expr(X) BITAND expr(Y). {A = sqlite3Expr(TK_BITAND, X, Y, 0);} 5754adee20fSdanielk1977 expr(A) ::= expr(X) BITOR expr(Y). {A = sqlite3Expr(TK_BITOR, X, Y, 0);} 5764adee20fSdanielk1977 expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqlite3Expr(TK_LSHIFT, X, Y, 0);} 5774adee20fSdanielk1977 expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqlite3Expr(TK_RSHIFT, X, Y, 0);} 5780ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE] { 5794adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 5804adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 5814adee20fSdanielk1977 A = sqlite3ExprFunction(pList, 0); 5824b59ab5eSdrh if( A ) A->op = OP; 5834adee20fSdanielk1977 sqlite3ExprSpan(A, &X->span, &Y->span); 5840ac65892Sdrh } 5850ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] { 5864adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 5874adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 5884adee20fSdanielk1977 A = sqlite3ExprFunction(pList, 0); 5894b59ab5eSdrh if( A ) A->op = OP; 5904adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 5914adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&Y->span); 5924794b980Sdrh } 5934b59ab5eSdrh %type likeop {int} 5944b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;} 5954b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;} 5964adee20fSdanielk1977 expr(A) ::= expr(X) PLUS expr(Y). {A = sqlite3Expr(TK_PLUS, X, Y, 0);} 5974adee20fSdanielk1977 expr(A) ::= expr(X) MINUS expr(Y). {A = sqlite3Expr(TK_MINUS, X, Y, 0);} 5984adee20fSdanielk1977 expr(A) ::= expr(X) STAR expr(Y). {A = sqlite3Expr(TK_STAR, X, Y, 0);} 5994adee20fSdanielk1977 expr(A) ::= expr(X) SLASH expr(Y). {A = sqlite3Expr(TK_SLASH, X, Y, 0);} 6004adee20fSdanielk1977 expr(A) ::= expr(X) REM expr(Y). {A = sqlite3Expr(TK_REM, X, Y, 0);} 6014adee20fSdanielk1977 expr(A) ::= expr(X) CONCAT expr(Y). {A = sqlite3Expr(TK_CONCAT, X, Y, 0);} 602e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). { 6034adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6044adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 605e1b6a5b8Sdrh } 60633048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 6074adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6084adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 60933048c0bSdrh } 61033048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). { 6114adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6124adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 61333048c0bSdrh } 614e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). { 6154adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6164adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 617e1b6a5b8Sdrh } 61881a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 6194adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6204adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 62181a20f21Sdrh } 622e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). { 6234adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, X, 0, 0); 6244adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 625e1b6a5b8Sdrh } 62681a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). { 6274adee20fSdanielk1977 A = sqlite3Expr(TK_BITNOT, X, 0, 0); 6284adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 62981a20f21Sdrh } 630e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 6314adee20fSdanielk1977 A = sqlite3Expr(TK_UMINUS, X, 0, 0); 6324adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 633e1b6a5b8Sdrh } 6344b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 6354adee20fSdanielk1977 A = sqlite3Expr(TK_UPLUS, X, 0, 0); 6364adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 637e1b6a5b8Sdrh } 638e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). { 6394adee20fSdanielk1977 A = sqlite3Expr(TK_SELECT, 0, 0, 0); 640daffd0e5Sdrh if( A ) A->pSelect = X; 6414adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&E); 64219a775c2Sdrh } 643fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). { 6444adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 6454adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 6464adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 647daffd0e5Sdrh if( A ) A->pList = pList; 6484adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 649fef5208cSdrh } 6504794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). { 6514adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 6524adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 6534adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 654daffd0e5Sdrh if( A ) A->pList = pList; 6554adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6564adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 6574794b980Sdrh } 658e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E). { 6594adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 660daffd0e5Sdrh if( A ) A->pList = Y; 6614adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 662fef5208cSdrh } 663e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E). { 6644adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 665daffd0e5Sdrh if( A ) A->pSelect = Y; 6664adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 667fef5208cSdrh } 668e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E). { 6694adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 670daffd0e5Sdrh if( A ) A->pList = Y; 6714adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6724adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 6734794b980Sdrh } 674e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E). { 6754adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 676daffd0e5Sdrh if( A ) A->pSelect = Y; 6774adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6784adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 6794794b980Sdrh } 68023b2db23Sdrh expr(A) ::= expr(X) IN nm(Y) dbnm(D). { 6814adee20fSdanielk1977 SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); 6824adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 6834adee20fSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); 6844adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); 68523b2db23Sdrh } 68623b2db23Sdrh expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). { 6874adee20fSdanielk1977 SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); 6884adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 6894adee20fSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); 6904adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6914adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); 69223b2db23Sdrh } 69323b2db23Sdrh 694fef5208cSdrh 69517a7f8ddSdrh /* CASE expressions */ 69617a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 6974adee20fSdanielk1977 A = sqlite3Expr(TK_CASE, X, Z, 0); 69817a7f8ddSdrh if( A ) A->pList = Y; 6994adee20fSdanielk1977 sqlite3ExprSpan(A, &C, &E); 70017a7f8ddSdrh } 70117a7f8ddSdrh %type case_exprlist {ExprList*} 7024adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);} 70317a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 7044adee20fSdanielk1977 A = sqlite3ExprListAppend(X, Y, 0); 7054adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 70617a7f8ddSdrh } 70717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 7084adee20fSdanielk1977 A = sqlite3ExprListAppend(0, Y, 0); 7094adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 71017a7f8ddSdrh } 71117a7f8ddSdrh %type case_else {Expr*} 71217a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 71317a7f8ddSdrh case_else(A) ::= . {A = 0;} 71417a7f8ddSdrh %type case_operand {Expr*} 71517a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 71617a7f8ddSdrh case_operand(A) ::= . {A = 0;} 717348784efSdrh 718348784efSdrh %type exprlist {ExprList*} 7194adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);} 720348784efSdrh %type expritem {Expr*} 7214adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);} 722348784efSdrh 723348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y). 7244adee20fSdanielk1977 {A = sqlite3ExprListAppend(X,Y,0);} 7254adee20fSdanielk1977 exprlist(A) ::= expritem(X). {A = sqlite3ExprListAppend(0,X,0);} 726348784efSdrh expritem(A) ::= expr(X). {A = X;} 727348784efSdrh expritem(A) ::= . {A = 0;} 728cce7d176Sdrh 729382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 730382c0247Sdrh // 7314925ca00Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) 732d24cc427Sdrh ON nm(Y) dbnm(D) LP idxlist(Z) RP(E) onconf(R). { 7334adee20fSdanielk1977 SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); 7349cfcf5d4Sdrh if( U!=OE_None ) U = R; 7359cfcf5d4Sdrh if( U==OE_Default) U = OE_Abort; 7364adee20fSdanielk1977 sqlite3CreateIndex(pParse, &X, pSrc, Z, U, &S, &E); 7379cfcf5d4Sdrh } 738717e6402Sdrh 739717e6402Sdrh %type uniqueflag {int} 7409cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. { A = OE_Abort; } 7419cfcf5d4Sdrh uniqueflag(A) ::= . { A = OE_None; } 742348784efSdrh 743348784efSdrh %type idxlist {IdList*} 7444adee20fSdanielk1977 %destructor idxlist {sqlite3IdListDelete($$);} 745c2eef3b3Sdrh %type idxlist_opt {IdList*} 7464adee20fSdanielk1977 %destructor idxlist_opt {sqlite3IdListDelete($$);} 747348784efSdrh %type idxitem {Token} 748348784efSdrh 749c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 750c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 7514adee20fSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y). {A = sqlite3IdListAppend(X,&Y);} 7524adee20fSdanielk1977 idxlist(A) ::= idxitem(Y). {A = sqlite3IdListAppend(0,&Y);} 75386e5cc05Sdrh idxitem(A) ::= nm(X) sortorder. {A = X;} 754348784efSdrh 7558aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 756382c0247Sdrh // 757382c0247Sdrh 758d24cc427Sdrh cmd ::= DROP INDEX nm(X) dbnm(Y). { 7594adee20fSdanielk1977 sqlite3DropIndex(pParse, sqlite3SrcListAppend(0,&X,&Y)); 760d24cc427Sdrh } 761982cef7eSdrh 762382c0247Sdrh 7638aff1015Sdrh ///////////////////////////// The COPY command /////////////////////////////// 764382c0247Sdrh // 765d24cc427Sdrh cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y) USING DELIMITERS STRING(Z). 7664adee20fSdanielk1977 {sqlite3Copy(pParse,sqlite3SrcListAppend(0,&X,&D),&Y,&Z,R);} 767d24cc427Sdrh cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y). 7684adee20fSdanielk1977 {sqlite3Copy(pParse,sqlite3SrcListAppend(0,&X,&D),&Y,0,R);} 769dce2cbe6Sdrh 770382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 771382c0247Sdrh // 7724adee20fSdanielk1977 cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 7734adee20fSdanielk1977 cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} 774f57b14a6Sdrh 775382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 776382c0247Sdrh // 7774adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ nm(Y). {sqlite3Pragma(pParse,&X,&Y,0);} 7784adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Y,0);} 7794adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Y,0);} 7804adee20fSdanielk1977 cmd ::= PRAGMA ids(X) EQ minus_num(Y). {sqlite3Pragma(pParse,&X,&Y,1);} 7814adee20fSdanielk1977 cmd ::= PRAGMA ids(X) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Y,0);} 7824adee20fSdanielk1977 cmd ::= PRAGMA ids(X). {sqlite3Pragma(pParse,&X,&X,0);} 783f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 784f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 785f57b14a6Sdrh number(A) ::= INTEGER(X). {A = X;} 786f57b14a6Sdrh number(A) ::= FLOAT(X). {A = X;} 787f57b14a6Sdrh plus_opt ::= PLUS. 788f57b14a6Sdrh plus_opt ::= . 789c3f9bad2Sdanielk1977 790c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 791f0f258b1Sdrh 792f0f258b1Sdrh cmd ::= CREATE(A) trigger_decl BEGIN trigger_cmd_list(S) END(Z). { 7934b59ab5eSdrh Token all; 7944b59ab5eSdrh all.z = A.z; 7954b59ab5eSdrh all.n = (Z.z - A.z) + Z.n; 7964adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 797f0f258b1Sdrh } 798f0f258b1Sdrh 799f0f258b1Sdrh trigger_decl ::= temp(T) TRIGGER nm(B) trigger_time(C) trigger_event(D) 800f0f258b1Sdrh ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). { 8014adee20fSdanielk1977 SrcList *pTab = sqlite3SrcListAppend(0, &E, &DB); 8024adee20fSdanielk1977 sqlite3BeginTrigger(pParse, &B, C, D.a, D.b, pTab, F, G, T); 803c3f9bad2Sdanielk1977 } 804c3f9bad2Sdanielk1977 805c3f9bad2Sdanielk1977 %type trigger_time {int} 806c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 807c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 808c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 809c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 810c3f9bad2Sdanielk1977 811ad3cab52Sdrh %type trigger_event {struct TrigEvent} 8124adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);} 813c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; } 814c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; } 815c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;} 816c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; } 817c3f9bad2Sdanielk1977 818c3f9bad2Sdanielk1977 %type foreach_clause {int} 819c3f9bad2Sdanielk1977 foreach_clause(A) ::= . { A = TK_ROW; } 820c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } 821c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } 822c3f9bad2Sdanielk1977 823c3f9bad2Sdanielk1977 %type when_clause {Expr *} 824c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 825c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 826c3f9bad2Sdanielk1977 827c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *} 8284adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} 829c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { 830a69d9168Sdrh X->pNext = Y; 831a69d9168Sdrh A = X; 832a69d9168Sdrh } 833c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; } 834c3f9bad2Sdanielk1977 835c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *} 8364adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} 837c3f9bad2Sdanielk1977 // UPDATE 8385ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 8394adee20fSdanielk1977 { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); } 840c3f9bad2Sdanielk1977 841c3f9bad2Sdanielk1977 // INSERT 8423054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 843c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 8444adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);} 845c3f9bad2Sdanielk1977 8463054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 8474adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);} 848c3f9bad2Sdanielk1977 849c3f9bad2Sdanielk1977 // DELETE 8505ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 8514adee20fSdanielk1977 {A = sqlite3TriggerDeleteStep(&X, Y);} 852c3f9bad2Sdanielk1977 853c3f9bad2Sdanielk1977 // SELECT 8544adee20fSdanielk1977 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(X); } 855c3f9bad2Sdanielk1977 8566f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 8574b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 8584adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, 0); 8594b59ab5eSdrh A->iColumn = OE_Ignore; 8604adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8614b59ab5eSdrh } 8624b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y). { 8634adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8644b59ab5eSdrh A->iColumn = OE_Rollback; 8654adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8664b59ab5eSdrh } 8674b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y). { 8684adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8694b59ab5eSdrh A->iColumn = OE_Abort; 8704adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8714b59ab5eSdrh } 8724b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y). { 8734adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8744b59ab5eSdrh A->iColumn = OE_Fail; 8754adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8764b59ab5eSdrh } 8776f34903eSdanielk1977 878c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 879d24cc427Sdrh cmd ::= DROP TRIGGER nm(X) dbnm(D). { 8804adee20fSdanielk1977 sqlite3DropTrigger(pParse,sqlite3SrcListAppend(0,&X,&D)); 881c3f9bad2Sdanielk1977 } 882113088ecSdrh 883113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 8844d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). { 8854adee20fSdanielk1977 sqlite3Attach(pParse, &F, &D, &K); 8861c2d8414Sdrh } 8874d189ca4Sdrh %type key_opt {Token} 8884d189ca4Sdrh key_opt(A) ::= USING ids(X). { A = X; } 8894d189ca4Sdrh key_opt(A) ::= . { A.z = 0; A.n = 0; } 890113088ecSdrh 891113088ecSdrh database_kw_opt ::= DATABASE. 892113088ecSdrh database_kw_opt ::= . 893113088ecSdrh 894113088ecSdrh //////////////////////// DETACH DATABASE name ///////////////////////////////// 8951c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). { 8964adee20fSdanielk1977 sqlite3Detach(pParse, &D); 8971c2d8414Sdrh } 898