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*596bd235Sdrh ** @(#) $Id: parse.y,v 1.139 2004/09/30 14:22:47 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 5725d6543dSdrh /* 5825d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 5925d6543dSdrh */ 6025d6543dSdrh struct AttachKey { int type; Token key; }; 6125d6543dSdrh 62caec2f12Sdrh } // end %include 63348784efSdrh 64348784efSdrh // These are extra tokens used by the lexer but never seen by the 65348784efSdrh // parser. We put them in a rule so that the parser generator will 666206d50aSdrh // add them to the parse.h output file. 67348784efSdrh // 68c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION 69c4a3c779Sdrh COLUMN AGG_FUNCTION. 70c4a3c779Sdrh 71826fb5a3Sdrh // Input is a single SQL command 72c4a3c779Sdrh input ::= cmdlist. 73094b2bbfSdrh cmdlist ::= cmdlist ecmd. 74826fb5a3Sdrh cmdlist ::= ecmd. 75483750baSdrh ecmd ::= explain cmdx SEMI. 76094b2bbfSdrh ecmd ::= SEMI. 7780242055Sdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 784adee20fSdanielk1977 explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 794adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 80348784efSdrh 81382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 82c4a3c779Sdrh // 83fa86c412Sdrh 8433752f8aSdanielk1977 cmd ::= BEGIN trans_opt. {sqlite3BeginTransaction(pParse);} 85c4a3c779Sdrh trans_opt ::= . 86c4a3c779Sdrh trans_opt ::= TRANSACTION. 875ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 884adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 894adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 904adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 91c4a3c779Sdrh 92382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 93348784efSdrh // 94348784efSdrh cmd ::= create_table create_table_args. 95cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). { 96cbb18d22Sdanielk1977 sqlite3StartTable(pParse,&X,&Y,&Z,T,0); 97969fa7c1Sdrh } 98f57b3399Sdrh %type temp {int} 99d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 100d24cc427Sdrh temp(A) ::= . {A = 0;} 101969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). { 1024adee20fSdanielk1977 sqlite3EndTable(pParse,&X,0); 103969fa7c1Sdrh } 104969fa7c1Sdrh create_table_args ::= AS select(S). { 1054adee20fSdanielk1977 sqlite3EndTable(pParse,0,S); 1064adee20fSdanielk1977 sqlite3SelectDelete(S); 107969fa7c1Sdrh } 108348784efSdrh columnlist ::= columnlist COMMA column. 109348784efSdrh columnlist ::= column. 110348784efSdrh 111348784efSdrh // About the only information used for a column is the name of the 112348784efSdrh // column. The type is always just "text". But the code will accept 113348784efSdrh // an elaborate typename. Perhaps someday we'll do something with it. 114348784efSdrh // 115348784efSdrh column ::= columnid type carglist. 1164adee20fSdanielk1977 columnid ::= nm(X). {sqlite3AddColumn(pParse,&X);} 117c4a3c779Sdrh 118c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 119c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 120c4a3c779Sdrh // 121982cef7eSdrh %type id {Token} 122f18543caSdrh id(A) ::= ID(X). {A = X;} 1230bd1f4eaSdrh 12434e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 12534e33bb8Sdrh // fallback to ID if they will not parse as their original value. 12634e33bb8Sdrh // This obviates the need for the "id" nonterminal. 12734e33bb8Sdrh // 1280bd1f4eaSdrh %fallback ID 12910e8266bSdrh ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CONFLICT 1305f3b4ab5Sdrh DATABASE DEFERRED DESC DETACH EACH END EXPLAIN FAIL FOR 131319e4e74Sdrh GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY 1325ad1a6c8Sdrh OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT 1330bd1f4eaSdrh TEMP TRIGGER VACUUM VIEW. 134c4a3c779Sdrh 1352d3917daSdrh // Define operator precedence early so that this is the first occurance 1362d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 1372d3917daSdrh // causes them to be assigned integer values that are close together, 1382d3917daSdrh // which keeps parser tables smaller. 1392d3917daSdrh // 1402d3917daSdrh %left OR. 1412d3917daSdrh %left AND. 1422d3917daSdrh %right NOT. 14394a11211Sdrh %left ISNULL NOTNULL IS LIKE GLOB BETWEEN IN NE EQ. 1442d3917daSdrh %left GT GE LT LE. 1452d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 1462d3917daSdrh %left PLUS MINUS. 1472d3917daSdrh %left STAR SLASH REM. 1482d3917daSdrh %left CONCAT. 1492d3917daSdrh %right UMINUS UPLUS BITNOT. 1502d3917daSdrh 151c4a3c779Sdrh // And "ids" is an identifer-or-string. 152c4a3c779Sdrh // 153c4a3c779Sdrh %type ids {Token} 1545ad1a6c8Sdrh ids(A) ::= ID(X). {A = X;} 155c4a3c779Sdrh ids(A) ::= STRING(X). {A = X;} 156c4a3c779Sdrh 1575ad1a6c8Sdrh // The name of a column or table can be any of the following: 1585ad1a6c8Sdrh // 1595ad1a6c8Sdrh %type nm {Token} 1605ad1a6c8Sdrh nm(A) ::= ID(X). {A = X;} 1615ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 1625ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 1635ad1a6c8Sdrh 164382c0247Sdrh type ::= . 1654adee20fSdanielk1977 type ::= typename(X). {sqlite3AddColumnType(pParse,&X,&X);} 1664adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y). {sqlite3AddColumnType(pParse,&X,&Y);} 167382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y). 1684adee20fSdanielk1977 {sqlite3AddColumnType(pParse,&X,&Y);} 169382c0247Sdrh %type typename {Token} 170382c0247Sdrh typename(A) ::= ids(X). {A = X;} 171*596bd235Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);} 172ef0cae50Sdrh %type signed {int} 173ef0cae50Sdrh signed(A) ::= INTEGER(X). { A = atoi(X.z); } 174ef0cae50Sdrh signed(A) ::= PLUS INTEGER(X). { A = atoi(X.z); } 175ef0cae50Sdrh signed(A) ::= MINUS INTEGER(X). { A = -atoi(X.z); } 176348784efSdrh carglist ::= carglist carg. 177348784efSdrh carglist ::= . 1785ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 179348784efSdrh carg ::= ccons. 1804adee20fSdanielk1977 carg ::= DEFAULT STRING(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1814adee20fSdanielk1977 carg ::= DEFAULT ID(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1824adee20fSdanielk1977 carg ::= DEFAULT INTEGER(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1834adee20fSdanielk1977 carg ::= DEFAULT PLUS INTEGER(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1844adee20fSdanielk1977 carg ::= DEFAULT MINUS INTEGER(X). {sqlite3AddDefaultValue(pParse,&X,1);} 1854adee20fSdanielk1977 carg ::= DEFAULT FLOAT(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1864adee20fSdanielk1977 carg ::= DEFAULT PLUS FLOAT(X). {sqlite3AddDefaultValue(pParse,&X,0);} 1874adee20fSdanielk1977 carg ::= DEFAULT MINUS FLOAT(X). {sqlite3AddDefaultValue(pParse,&X,1);} 1887020f651Sdrh carg ::= DEFAULT NULL. 189348784efSdrh 190382c0247Sdrh // In addition to the type name, we also care about the primary key and 191382c0247Sdrh // UNIQUE constraints. 192348784efSdrh // 1930d316a40Sdrh ccons ::= NULL onconf. 1944adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 1954adee20fSdanielk1977 ccons ::= PRIMARY KEY sortorder onconf(R). {sqlite3AddPrimaryKey(pParse,0,R);} 196cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);} 1979cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf. 198c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 1994adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 2004adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 201d3d39e93Sdrh ccons ::= COLLATE id(C). {sqlite3AddCollateType(pParse, C.z, C.n);} 20204738cb9Sdrh 203c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 204c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 205c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 206c2eef3b3Sdrh // check fails. 20704738cb9Sdrh // 208c2eef3b3Sdrh %type refargs {int} 209c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 210c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } 211c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 212c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 213c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 214c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 215c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 216c2eef3b3Sdrh %type refact {int} 217c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 218c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 219c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 220c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 221c2eef3b3Sdrh %type defer_subclause {int} 222c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 223c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 224c2eef3b3Sdrh %type init_deferred_pred_opt {int} 225c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 226c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 227c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 228348784efSdrh 229348784efSdrh // For the time being, the only constraint we care about is the primary 230382c0247Sdrh // key and UNIQUE. Both create indices. 231348784efSdrh // 232348784efSdrh conslist_opt ::= . 233348784efSdrh conslist_opt ::= COMMA conslist. 234348784efSdrh conslist ::= conslist COMMA tcons. 235a2e1bb5aSdrh conslist ::= conslist tcons. 236348784efSdrh conslist ::= tcons. 2375ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 2389cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R). 2394adee20fSdanielk1977 {sqlite3AddPrimaryKey(pParse,X,R);} 2409cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 241cbb18d22Sdanielk1977 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);} 2429cfcf5d4Sdrh tcons ::= CHECK expr onconf. 243c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 244c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 2454adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 2464adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 247c2eef3b3Sdrh } 248c2eef3b3Sdrh %type defer_subclause_opt {int} 249c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 250c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 2519cfcf5d4Sdrh 2529cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 2539cfcf5d4Sdrh // default behavior when there is a constraint conflict. 2549cfcf5d4Sdrh // 2559cfcf5d4Sdrh %type onconf {int} 2561c92853dSdrh %type orconf {int} 2571c92853dSdrh %type resolvetype {int} 2581c92853dSdrh onconf(A) ::= . { A = OE_Default; } 2591c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). { A = X; } 2601c92853dSdrh orconf(A) ::= . { A = OE_Default; } 2611c92853dSdrh orconf(A) ::= OR resolvetype(X). { A = X; } 2621c92853dSdrh resolvetype(A) ::= ROLLBACK. { A = OE_Rollback; } 2631c92853dSdrh resolvetype(A) ::= ABORT. { A = OE_Abort; } 2641c92853dSdrh resolvetype(A) ::= FAIL. { A = OE_Fail; } 2651c92853dSdrh resolvetype(A) ::= IGNORE. { A = OE_Ignore; } 2661c92853dSdrh resolvetype(A) ::= REPLACE. { A = OE_Replace; } 267348784efSdrh 268382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 269348784efSdrh // 270a8858103Sdanielk1977 cmd ::= DROP TABLE nm(X) dbnm(Y). { 271a8858103Sdanielk1977 sqlite3DropTable(pParse, sqlite3SrcListAppend(0,&X,&Y), 0); 272a8858103Sdanielk1977 } 273348784efSdrh 274a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 275a76b5dfcSdrh // 27648dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). { 27748dec7e2Sdanielk1977 sqlite3CreateView(pParse, &X, &Y, &Z, S, T); 278a76b5dfcSdrh } 27948dec7e2Sdanielk1977 cmd ::= DROP VIEW nm(X) dbnm(Y). { 28048dec7e2Sdanielk1977 sqlite3DropTable(pParse, sqlite3SrcListAppend(0,&X,&Y), 1); 281a76b5dfcSdrh } 282a76b5dfcSdrh 283382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 284348784efSdrh // 2859bb61fe7Sdrh cmd ::= select(X). { 286bf3b721fSdanielk1977 sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); 2874adee20fSdanielk1977 sqlite3SelectDelete(X); 2889bb61fe7Sdrh } 289efb7251dSdrh 2909bb61fe7Sdrh %type select {Select*} 2914adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);} 29282c3d636Sdrh %type oneselect {Select*} 2934adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);} 2949bb61fe7Sdrh 29582c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 2960a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 297daffd0e5Sdrh if( Z ){ 29882c3d636Sdrh Z->op = Y; 29982c3d636Sdrh Z->pPrior = X; 300daffd0e5Sdrh } 30182c3d636Sdrh A = Z; 30282c3d636Sdrh } 3030a36c57eSdrh %type multiselect_op {int} 3040a36c57eSdrh multiselect_op(A) ::= UNION. {A = TK_UNION;} 3050a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 3060a36c57eSdrh multiselect_op(A) ::= INTERSECT. {A = TK_INTERSECT;} 3070a36c57eSdrh multiselect_op(A) ::= EXCEPT. {A = TK_EXCEPT;} 30882c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 3099bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 3104adee20fSdanielk1977 A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset); 3119bb61fe7Sdrh } 3129bb61fe7Sdrh 3139bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 3149bb61fe7Sdrh // present and false (0) if it is not. 3159bb61fe7Sdrh // 316efb7251dSdrh %type distinct {int} 317efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 318fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 319efb7251dSdrh distinct(A) ::= . {A = 0;} 320348784efSdrh 3219bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 3227c917d19Sdrh // values of the SELECT statement. The "*" in statements like 3237c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 3247c917d19Sdrh // opcode of TK_ALL. 3259bb61fe7Sdrh // 326348784efSdrh %type selcollist {ExprList*} 3274adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);} 328348784efSdrh %type sclp {ExprList*} 3294adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);} 330348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 331348784efSdrh sclp(A) ::= . {A = 0;} 33201f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 3334adee20fSdanielk1977 A = sqlite3ExprListAppend(P,X,Y.n?&Y:0); 33401f3f253Sdrh } 3357c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 3364adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0); 3377c917d19Sdrh } 3385ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. { 3394adee20fSdanielk1977 Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0); 3404adee20fSdanielk1977 Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X); 3414adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0); 34254473229Sdrh } 34301f3f253Sdrh 34401f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 34501f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 34601f3f253Sdrh // 34701f3f253Sdrh %type as {Token} 3485ad1a6c8Sdrh as(X) ::= AS nm(Y). { X = Y; } 3495ad1a6c8Sdrh as(X) ::= ids(Y). { X = Y; } 35001f3f253Sdrh as(X) ::= . { X.n = 0; } 3519bb61fe7Sdrh 352348784efSdrh 353ad3cab52Sdrh %type seltablist {SrcList*} 3544adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);} 355ad3cab52Sdrh %type stl_prefix {SrcList*} 3564adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);} 357ad3cab52Sdrh %type from {SrcList*} 3584adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);} 359348784efSdrh 36001f3f253Sdrh // A complete FROM clause. 36101f3f253Sdrh // 362bf3a4fa4Sdrh from(A) ::= . {A = sqliteMalloc(sizeof(*A));} 363348784efSdrh from(A) ::= FROM seltablist(X). {A = X;} 36401f3f253Sdrh 36501f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 36601f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 36701f3f253Sdrh // 36801f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 36901f3f253Sdrh A = X; 37001f3f253Sdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; 37101f3f253Sdrh } 372348784efSdrh stl_prefix(A) ::= . {A = 0;} 373113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { 3744adee20fSdanielk1977 A = sqlite3SrcListAppend(X,&Y,&D); 3754adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 37601f3f253Sdrh if( N ){ 37701f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 3784adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 379c4a3c779Sdrh } 38001f3f253Sdrh if( U ){ 38101f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 3824adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 38301f3f253Sdrh } 38401f3f253Sdrh } 385b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP 386b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 3874adee20fSdanielk1977 A = sqlite3SrcListAppend(X,0,0); 388ad3cab52Sdrh A->a[A->nSrc-1].pSelect = S; 3894adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 39001f3f253Sdrh if( N ){ 39101f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 3924adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 39322f70c32Sdrh } 39401f3f253Sdrh if( U ){ 39501f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 3964adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 397d5feede1Sdrh } 39822f70c32Sdrh } 399348784efSdrh 400b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 401b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 402b733d037Sdrh // a grouping of table and subqueries. 403b733d037Sdrh // 404b733d037Sdrh %type seltablist_paren {Select*} 4054adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);} 406b733d037Sdrh seltablist_paren(A) ::= select(S). {A = S;} 407b733d037Sdrh seltablist_paren(A) ::= seltablist(F). { 4084adee20fSdanielk1977 A = sqlite3SelectNew(0,F,0,0,0,0,0,-1,0); 409b733d037Sdrh } 410b733d037Sdrh 411113088ecSdrh %type dbnm {Token} 412113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 413113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 414113088ecSdrh 41501f3f253Sdrh %type joinop {int} 41601f3f253Sdrh %type joinop2 {int} 41701f3f253Sdrh joinop(X) ::= COMMA. { X = JT_INNER; } 41801f3f253Sdrh joinop(X) ::= JOIN. { X = JT_INNER; } 4194adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 4204adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 4215ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 4224adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 42301f3f253Sdrh 42401f3f253Sdrh %type on_opt {Expr*} 4254adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);} 42601f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 42701f3f253Sdrh on_opt(N) ::= . {N = 0;} 42801f3f253Sdrh 42901f3f253Sdrh %type using_opt {IdList*} 4304adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);} 4310202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 43201f3f253Sdrh using_opt(U) ::= . {U = 0;} 43301f3f253Sdrh 43401f3f253Sdrh 435348784efSdrh %type orderby_opt {ExprList*} 4364adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);} 437348784efSdrh %type sortlist {ExprList*} 4384adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);} 439348784efSdrh %type sortitem {Expr*} 4404adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);} 441348784efSdrh 442348784efSdrh orderby_opt(A) ::= . {A = 0;} 443348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 4448e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). { 4451186b0a0Sdrh A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0); 446d3d39e93Sdrh if( A ) A->a[A->nExpr-1].sortOrder = Z; 447348784efSdrh } 44838640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). { 4491186b0a0Sdrh A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0); 45096fb0dd5Sdanielk1977 if( A && A->a ) A->a[0].sortOrder = Z; 451348784efSdrh } 452da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 453348784efSdrh 454348784efSdrh %type sortorder {int} 455d3d39e93Sdrh %type collate {Token} 456348784efSdrh 4578e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 4588e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 4598e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 460d3d39e93Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 461d3d39e93Sdrh collate(C) ::= COLLATE id(X). {C = X;} 462348784efSdrh 4632282792aSdrh %type groupby_opt {ExprList*} 4644adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);} 4652282792aSdrh groupby_opt(A) ::= . {A = 0;} 4662282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;} 4672282792aSdrh 4682282792aSdrh %type having_opt {Expr*} 4694adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);} 4702282792aSdrh having_opt(A) ::= . {A = 0;} 4712282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 4722282792aSdrh 473ad3cab52Sdrh %type limit_opt {struct LimitVal} 474ad3cab52Sdrh limit_opt(A) ::= . {A.limit = -1; A.offset = 0;} 475ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X). {A.limit = X; A.offset = 0;} 476ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y). 477ef0cae50Sdrh {A.limit = X; A.offset = Y;} 478ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y). 479ef0cae50Sdrh {A.limit = Y; A.offset = X;} 4809bbca4c1Sdrh 481382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 482382c0247Sdrh // 483113088ecSdrh cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). { 4844adee20fSdanielk1977 sqlite3DeleteFrom(pParse, sqlite3SrcListAppend(0,&X,&D), Y); 485113088ecSdrh } 486348784efSdrh 487348784efSdrh %type where_opt {Expr*} 4884adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);} 489348784efSdrh 490348784efSdrh where_opt(A) ::= . {A = 0;} 491348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 492348784efSdrh 493348784efSdrh %type setlist {ExprList*} 4944adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);} 495348784efSdrh 496382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 497382c0247Sdrh // 498113088ecSdrh cmd ::= UPDATE orconf(R) nm(X) dbnm(D) SET setlist(Y) where_opt(Z). 4994adee20fSdanielk1977 {sqlite3Update(pParse,sqlite3SrcListAppend(0,&X,&D),Y,Z,R);} 500348784efSdrh 5015ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 5024adee20fSdanielk1977 {A = sqlite3ExprListAppend(Z,Y,&X);} 5034adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(0,Y,&X);} 504348784efSdrh 505382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 506382c0247Sdrh // 507113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) 508113088ecSdrh VALUES LP itemlist(Y) RP. 5094adee20fSdanielk1977 {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), Y, 0, F, R);} 510113088ecSdrh cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) select(S). 5114adee20fSdanielk1977 {sqlite3Insert(pParse, sqlite3SrcListAppend(0,&X,&D), 0, S, F, R);} 512348784efSdrh 513fa86c412Sdrh %type insert_cmd {int} 514fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 515fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 516fa86c412Sdrh 517348784efSdrh 518348784efSdrh %type itemlist {ExprList*} 5194adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);} 520348784efSdrh 5214adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);} 5224adee20fSdanielk1977 itemlist(A) ::= expr(X). {A = sqlite3ExprListAppend(0,X,0);} 523348784efSdrh 524967e8b73Sdrh %type inscollist_opt {IdList*} 5254adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);} 526967e8b73Sdrh %type inscollist {IdList*} 5274adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);} 528348784efSdrh 529967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 530967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 5314adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqlite3IdListAppend(X,&Y);} 5324adee20fSdanielk1977 inscollist(A) ::= nm(Y). {A = sqlite3IdListAppend(0,&Y);} 533348784efSdrh 534382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 535382c0247Sdrh // 536348784efSdrh 537348784efSdrh %type expr {Expr*} 5384adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);} 539348784efSdrh 5404adee20fSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } 5417ac25c75Sdrh expr(A) ::= NULL(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5424adee20fSdanielk1977 expr(A) ::= ID(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5434adee20fSdanielk1977 expr(A) ::= JOIN_KW(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5445ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 5454adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5464adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5474adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp2, 0); 548e1b6a5b8Sdrh } 549d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 5504adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5514adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5524adee20fSdanielk1977 Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z); 5534adee20fSdanielk1977 Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0); 5544adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp4, 0); 555d24cc427Sdrh } 5567ac25c75Sdrh expr(A) ::= INTEGER(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5577ac25c75Sdrh expr(A) ::= FLOAT(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5587ac25c75Sdrh expr(A) ::= STRING(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5597ac25c75Sdrh expr(A) ::= BLOB(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5607c972decSdrh expr(A) ::= VARIABLE(X). { 561895d7472Sdrh Token *pToken = &X; 562895d7472Sdrh Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken); 563fa6bc000Sdrh sqlite3ExprAssignVarNumber(pParse, pExpr); 564895d7472Sdrh } 565e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). { 5664adee20fSdanielk1977 A = sqlite3ExprFunction(Y, &X); 5674adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 568e1b6a5b8Sdrh } 569e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 5704adee20fSdanielk1977 A = sqlite3ExprFunction(0, &X); 5714adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 572e1b6a5b8Sdrh } 5737ac25c75Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5747ac25c75Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5757ac25c75Sdrh expr(A) ::= expr(X) LT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5767ac25c75Sdrh expr(A) ::= expr(X) GT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5777ac25c75Sdrh expr(A) ::= expr(X) LE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5787ac25c75Sdrh expr(A) ::= expr(X) GE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5797ac25c75Sdrh expr(A) ::= expr(X) NE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5807ac25c75Sdrh expr(A) ::= expr(X) EQ(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5817ac25c75Sdrh expr(A) ::= expr(X) BITAND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5827ac25c75Sdrh expr(A) ::= expr(X) BITOR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5837ac25c75Sdrh expr(A) ::= expr(X) LSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5847ac25c75Sdrh expr(A) ::= expr(X) RSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5850ac65892Sdrh expr(A) ::= expr(X) 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 sqlite3ExprSpan(A, &X->span, &Y->span); 5910ac65892Sdrh } 5920ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] { 5934adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 5944adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 5954adee20fSdanielk1977 A = sqlite3ExprFunction(pList, 0); 5964b59ab5eSdrh if( A ) A->op = OP; 5974adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 5984adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&Y->span); 5994794b980Sdrh } 6004b59ab5eSdrh %type likeop {int} 6014b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;} 6024b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;} 6037ac25c75Sdrh expr(A) ::= expr(X) PLUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6047ac25c75Sdrh expr(A) ::= expr(X) MINUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6057ac25c75Sdrh expr(A) ::= expr(X) STAR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6067ac25c75Sdrh expr(A) ::= expr(X) SLASH(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6077ac25c75Sdrh expr(A) ::= expr(X) REM(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6087ac25c75Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 609e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). { 6104adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6114adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 612e1b6a5b8Sdrh } 61333048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 6144adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6154adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 61633048c0bSdrh } 61733048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). { 6184adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6194adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 62033048c0bSdrh } 621e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). { 6224adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6234adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 624e1b6a5b8Sdrh } 62581a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 6264adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6274adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 62881a20f21Sdrh } 629e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). { 6307ac25c75Sdrh A = sqlite3Expr(@B, X, 0, 0); 6314adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 632e1b6a5b8Sdrh } 63381a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). { 6347ac25c75Sdrh A = sqlite3Expr(@B, X, 0, 0); 6354adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 63681a20f21Sdrh } 637e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 6384adee20fSdanielk1977 A = sqlite3Expr(TK_UMINUS, X, 0, 0); 6394adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 640e1b6a5b8Sdrh } 6414b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 6424adee20fSdanielk1977 A = sqlite3Expr(TK_UPLUS, X, 0, 0); 6434adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 644e1b6a5b8Sdrh } 645e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). { 6464adee20fSdanielk1977 A = sqlite3Expr(TK_SELECT, 0, 0, 0); 647daffd0e5Sdrh if( A ) A->pSelect = X; 6484adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&E); 64919a775c2Sdrh } 650fef5208cSdrh expr(A) ::= expr(W) 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 sqlite3ExprSpan(A,&W->span,&Y->span); 656fef5208cSdrh } 6574794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). { 6584adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 6594adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 6604adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 661daffd0e5Sdrh if( A ) A->pList = pList; 6624adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6634adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 6644794b980Sdrh } 665e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E). { 6664adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 667daffd0e5Sdrh if( A ) A->pList = Y; 6684adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 669fef5208cSdrh } 670e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E). { 6714adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 672daffd0e5Sdrh if( A ) A->pSelect = Y; 6734adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 674fef5208cSdrh } 675e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E). { 6764adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 677daffd0e5Sdrh if( A ) A->pList = Y; 6784adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6794adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 6804794b980Sdrh } 681e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E). { 6824adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 683daffd0e5Sdrh if( A ) A->pSelect = Y; 6844adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6854adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 6864794b980Sdrh } 68723b2db23Sdrh expr(A) ::= expr(X) IN nm(Y) dbnm(D). { 6884adee20fSdanielk1977 SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); 6894adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 6904adee20fSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); 6914adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); 69223b2db23Sdrh } 69323b2db23Sdrh expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). { 6944adee20fSdanielk1977 SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); 6954adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 6964adee20fSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); 6974adee20fSdanielk1977 A = sqlite3Expr(TK_NOT, A, 0, 0); 6984adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); 69923b2db23Sdrh } 70023b2db23Sdrh 701fef5208cSdrh 70217a7f8ddSdrh /* CASE expressions */ 70317a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 7044adee20fSdanielk1977 A = sqlite3Expr(TK_CASE, X, Z, 0); 70517a7f8ddSdrh if( A ) A->pList = Y; 7064adee20fSdanielk1977 sqlite3ExprSpan(A, &C, &E); 70717a7f8ddSdrh } 70817a7f8ddSdrh %type case_exprlist {ExprList*} 7094adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);} 71017a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 7114adee20fSdanielk1977 A = sqlite3ExprListAppend(X, Y, 0); 7124adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 71317a7f8ddSdrh } 71417a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 7154adee20fSdanielk1977 A = sqlite3ExprListAppend(0, Y, 0); 7164adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 71717a7f8ddSdrh } 71817a7f8ddSdrh %type case_else {Expr*} 71917a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 72017a7f8ddSdrh case_else(A) ::= . {A = 0;} 72117a7f8ddSdrh %type case_operand {Expr*} 72217a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 72317a7f8ddSdrh case_operand(A) ::= . {A = 0;} 724348784efSdrh 725348784efSdrh %type exprlist {ExprList*} 7264adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);} 727348784efSdrh %type expritem {Expr*} 7284adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);} 729348784efSdrh 730348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y). 7314adee20fSdanielk1977 {A = sqlite3ExprListAppend(X,Y,0);} 7324adee20fSdanielk1977 exprlist(A) ::= expritem(X). {A = sqlite3ExprListAppend(0,X,0);} 733348784efSdrh expritem(A) ::= expr(X). {A = X;} 734348784efSdrh expritem(A) ::= . {A = 0;} 735cce7d176Sdrh 736382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 737382c0247Sdrh // 738cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D) 739ef2cb63eSdanielk1977 ON nm(Y) dbnm(C) LP idxlist(Z) RP(E) onconf(R). { 7409cfcf5d4Sdrh if( U!=OE_None ) U = R; 7419cfcf5d4Sdrh if( U==OE_Default) U = OE_Abort; 742ef2cb63eSdanielk1977 sqlite3CreateIndex(pParse, &X, &D, sqlite3SrcListAppend(0,&Y,&C), 743ef2cb63eSdanielk1977 Z, U, &S, &E); 7449cfcf5d4Sdrh } 745717e6402Sdrh 746717e6402Sdrh %type uniqueflag {int} 7479cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. { A = OE_Abort; } 7489cfcf5d4Sdrh uniqueflag(A) ::= . { A = OE_None; } 749348784efSdrh 7500202b29eSdanielk1977 %type idxlist {ExprList*} 7510202b29eSdanielk1977 %destructor idxlist {sqlite3ExprListDelete($$);} 7520202b29eSdanielk1977 %type idxlist_opt {ExprList*} 7530202b29eSdanielk1977 %destructor idxlist_opt {sqlite3ExprListDelete($$);} 754348784efSdrh %type idxitem {Token} 755348784efSdrh 756c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 757c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 7580202b29eSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder. { 7590202b29eSdanielk1977 Expr *p = 0; 7600202b29eSdanielk1977 if( C.n>0 ){ 7610202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 7620202b29eSdanielk1977 if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n); 7630202b29eSdanielk1977 } 7640202b29eSdanielk1977 A = sqlite3ExprListAppend(X, p, &Y); 7650202b29eSdanielk1977 } 7660202b29eSdanielk1977 idxlist(A) ::= idxitem(Y) collate(C) sortorder. { 7670202b29eSdanielk1977 Expr *p = 0; 7680202b29eSdanielk1977 if( C.n>0 ){ 7690202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 7700202b29eSdanielk1977 if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n); 7710202b29eSdanielk1977 } 7720202b29eSdanielk1977 A = sqlite3ExprListAppend(0, p, &Y); 7730202b29eSdanielk1977 } 7740202b29eSdanielk1977 idxitem(A) ::= nm(X). {A = X;} 7750202b29eSdanielk1977 776348784efSdrh 7778aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 778382c0247Sdrh // 779382c0247Sdrh 780d24cc427Sdrh cmd ::= DROP INDEX nm(X) dbnm(Y). { 7814adee20fSdanielk1977 sqlite3DropIndex(pParse, sqlite3SrcListAppend(0,&X,&Y)); 782d24cc427Sdrh } 783982cef7eSdrh 784382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 785382c0247Sdrh // 7864adee20fSdanielk1977 cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 7874adee20fSdanielk1977 cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} 788f57b14a6Sdrh 789382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 790382c0247Sdrh // 79191cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ nm(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79391cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79491cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). { 79591cf71b0Sdanielk1977 sqlite3Pragma(pParse,&X,&Z,&Y,1); 79691cf71b0Sdanielk1977 } 79791cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79891cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 799f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 800f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 801f57b14a6Sdrh number(A) ::= INTEGER(X). {A = X;} 802f57b14a6Sdrh number(A) ::= FLOAT(X). {A = X;} 803f57b14a6Sdrh plus_opt ::= PLUS. 804f57b14a6Sdrh plus_opt ::= . 805c3f9bad2Sdanielk1977 806c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 807f0f258b1Sdrh 8083df6b257Sdanielk1977 cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 8094b59ab5eSdrh Token all; 8104b59ab5eSdrh all.z = A.z; 8114b59ab5eSdrh all.n = (Z.z - A.z) + Z.n; 8124adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 813f0f258b1Sdrh } 814f0f258b1Sdrh 8153df6b257Sdanielk1977 trigger_decl(A) ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C) trigger_event(D) 816f0f258b1Sdrh ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). { 8174adee20fSdanielk1977 SrcList *pTab = sqlite3SrcListAppend(0, &E, &DB); 818ef2cb63eSdanielk1977 sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, pTab, F, G, T); 8193df6b257Sdanielk1977 A = (Z.n==0?B:Z); 820c3f9bad2Sdanielk1977 } 821c3f9bad2Sdanielk1977 822c3f9bad2Sdanielk1977 %type trigger_time {int} 823c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 824c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 825c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 826c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 827c3f9bad2Sdanielk1977 828ad3cab52Sdrh %type trigger_event {struct TrigEvent} 8294adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);} 830c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; } 831c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; } 832c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;} 833c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; } 834c3f9bad2Sdanielk1977 835c3f9bad2Sdanielk1977 %type foreach_clause {int} 836c3f9bad2Sdanielk1977 foreach_clause(A) ::= . { A = TK_ROW; } 837c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } 838c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } 839c3f9bad2Sdanielk1977 840c3f9bad2Sdanielk1977 %type when_clause {Expr*} 841c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 842c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 843c3f9bad2Sdanielk1977 844c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 8454adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} 846c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { 847a69d9168Sdrh X->pNext = Y; 848a69d9168Sdrh A = X; 849a69d9168Sdrh } 850c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; } 851c3f9bad2Sdanielk1977 852c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 8534adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} 854c3f9bad2Sdanielk1977 // UPDATE 8555ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 8564adee20fSdanielk1977 { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); } 857c3f9bad2Sdanielk1977 858c3f9bad2Sdanielk1977 // INSERT 8593054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 860c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 8614adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);} 862c3f9bad2Sdanielk1977 8633054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 8644adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);} 865c3f9bad2Sdanielk1977 866c3f9bad2Sdanielk1977 // DELETE 8675ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 8684adee20fSdanielk1977 {A = sqlite3TriggerDeleteStep(&X, Y);} 869c3f9bad2Sdanielk1977 870c3f9bad2Sdanielk1977 // SELECT 8714adee20fSdanielk1977 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(X); } 872c3f9bad2Sdanielk1977 8736f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 8744b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 8754adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, 0); 8764b59ab5eSdrh A->iColumn = OE_Ignore; 8774adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8784b59ab5eSdrh } 8794b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y). { 8804adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8814b59ab5eSdrh A->iColumn = OE_Rollback; 8824adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8834b59ab5eSdrh } 8844b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y). { 8854adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8864b59ab5eSdrh A->iColumn = OE_Abort; 8874adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8884b59ab5eSdrh } 8894b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y). { 8904adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 8914b59ab5eSdrh A->iColumn = OE_Fail; 8924adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8934b59ab5eSdrh } 8946f34903eSdanielk1977 895c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 896d24cc427Sdrh cmd ::= DROP TRIGGER nm(X) dbnm(D). { 8974adee20fSdanielk1977 sqlite3DropTrigger(pParse,sqlite3SrcListAppend(0,&X,&D)); 898c3f9bad2Sdanielk1977 } 899113088ecSdrh 900113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 9014d189ca4Sdrh cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). { 90225d6543dSdrh sqlite3Attach(pParse, &F, &D, K.type, &K.key); 9031c2d8414Sdrh } 90425d6543dSdrh %type key_opt {struct AttachKey} 90525d6543dSdrh key_opt(A) ::= . { A.type = 0; } 90625d6543dSdrh key_opt(A) ::= KEY ids(X). { A.type=1; A.key = X; } 907feac5f8dSdrh key_opt(A) ::= KEY BLOB(X). { A.type=2; A.key = X; } 908113088ecSdrh 909113088ecSdrh database_kw_opt ::= DATABASE. 910113088ecSdrh database_kw_opt ::= . 911113088ecSdrh 912113088ecSdrh //////////////////////// DETACH DATABASE name ///////////////////////////////// 9131c2d8414Sdrh cmd ::= DETACH database_kw_opt nm(D). { 9144adee20fSdanielk1977 sqlite3Detach(pParse, &D); 9151c2d8414Sdrh } 916