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*52fb6d71Sdrh ** @(#) $Id: parse.y,v 1.146 2004/11/03 03:59:57 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 /* 472e3a1f16Sdrh ** An instance of this structure is used to store the LIKE, 482e3a1f16Sdrh ** GLOB, NOT LIKE, and NOT GLOB operators. 492e3a1f16Sdrh */ 502e3a1f16Sdrh struct LikeOp { 512e3a1f16Sdrh int opcode; /* Either TK_GLOB or TK_LIKE */ 522e3a1f16Sdrh int not; /* True if the NOT keyword is present */ 532e3a1f16Sdrh }; 542e3a1f16Sdrh 552e3a1f16Sdrh /* 56ad3cab52Sdrh ** An instance of the following structure describes the event of a 57ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 58ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 59ad3cab52Sdrh ** 60ad3cab52Sdrh ** UPDATE ON (a,b,c) 61ad3cab52Sdrh ** 62ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 63c3f9bad2Sdanielk1977 */ 64ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 65caec2f12Sdrh 6625d6543dSdrh /* 6725d6543dSdrh ** An instance of this structure holds the ATTACH key and the key type. 6825d6543dSdrh */ 6925d6543dSdrh struct AttachKey { int type; Token key; }; 7025d6543dSdrh 71caec2f12Sdrh } // end %include 72348784efSdrh 73348784efSdrh // These are extra tokens used by the lexer but never seen by the 74348784efSdrh // parser. We put them in a rule so that the parser generator will 756206d50aSdrh // add them to the parse.h output file. 76348784efSdrh // 77c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION 78c4a3c779Sdrh COLUMN AGG_FUNCTION. 79c4a3c779Sdrh 80826fb5a3Sdrh // Input is a single SQL command 81c4a3c779Sdrh input ::= cmdlist. 82094b2bbfSdrh cmdlist ::= cmdlist ecmd. 83826fb5a3Sdrh cmdlist ::= ecmd. 8480242055Sdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 85b7f9164eSdrh ecmd ::= SEMI. 86b7f9164eSdrh ecmd ::= explain cmdx SEMI. 874adee20fSdanielk1977 explain ::= . { sqlite3BeginParse(pParse, 0); } 88b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 89b7f9164eSdrh explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); } 90b7f9164eSdrh %endif 91348784efSdrh 92382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 93c4a3c779Sdrh // 94fa86c412Sdrh 95684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 96c4a3c779Sdrh trans_opt ::= . 97c4a3c779Sdrh trans_opt ::= TRANSACTION. 985ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 99684917c2Sdrh %type transtype {int} 100684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 101684917c2Sdrh transtype(A) ::= DEFERRED(X). {A = @X;} 102684917c2Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X;} 103684917c2Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X;} 1044adee20fSdanielk1977 cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);} 1054adee20fSdanielk1977 cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);} 1064adee20fSdanielk1977 cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);} 107c4a3c779Sdrh 108382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 109348784efSdrh // 110348784efSdrh cmd ::= create_table create_table_args. 111cbb18d22Sdanielk1977 create_table ::= CREATE(X) temp(T) TABLE nm(Y) dbnm(Z). { 112cbb18d22Sdanielk1977 sqlite3StartTable(pParse,&X,&Y,&Z,T,0); 113969fa7c1Sdrh } 114f57b3399Sdrh %type temp {int} 115d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 116d24cc427Sdrh temp(A) ::= . {A = 0;} 117969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). { 1184adee20fSdanielk1977 sqlite3EndTable(pParse,&X,0); 119969fa7c1Sdrh } 120969fa7c1Sdrh create_table_args ::= AS select(S). { 1214adee20fSdanielk1977 sqlite3EndTable(pParse,0,S); 1224adee20fSdanielk1977 sqlite3SelectDelete(S); 123969fa7c1Sdrh } 124348784efSdrh columnlist ::= columnlist COMMA column. 125348784efSdrh columnlist ::= column. 126348784efSdrh 127348784efSdrh // About the only information used for a column is the name of the 128348784efSdrh // column. The type is always just "text". But the code will accept 129348784efSdrh // an elaborate typename. Perhaps someday we'll do something with it. 130348784efSdrh // 131348784efSdrh column ::= columnid type carglist. 1324adee20fSdanielk1977 columnid ::= nm(X). {sqlite3AddColumn(pParse,&X);} 133c4a3c779Sdrh 134c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 135c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 136c4a3c779Sdrh // 137982cef7eSdrh %type id {Token} 138f18543caSdrh id(A) ::= ID(X). {A = X;} 1390bd1f4eaSdrh 14034e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 14134e33bb8Sdrh // fallback to ID if they will not parse as their original value. 14234e33bb8Sdrh // This obviates the need for the "id" nonterminal. 14334e33bb8Sdrh // 1440bd1f4eaSdrh %fallback ID 14510e8266bSdrh ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CONFLICT 146684917c2Sdrh DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 147319e4e74Sdrh GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY 1485ad1a6c8Sdrh OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT 149b7f9164eSdrh TEMP TRIGGER VACUUM VIEW 150b7f9164eSdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 151b7f9164eSdrh EXCEPT INTERSECT UNION 152b7f9164eSdrh %endif 153*52fb6d71Sdrh REINDEX RENAME AUTOINCR CDATE CTIME CTIMESTAMP ALTER 154b7f9164eSdrh . 155c4a3c779Sdrh 1562d3917daSdrh // Define operator precedence early so that this is the first occurance 1572d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 1582d3917daSdrh // causes them to be assigned integer values that are close together, 1592d3917daSdrh // which keeps parser tables smaller. 1602d3917daSdrh // 161f2bc013cSdrh // The token values assigned to these symbols is determined by the order 162f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 163f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 164f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 165f2bc013cSdrh // constraint. 166f2bc013cSdrh // 1672d3917daSdrh %left OR. 1682d3917daSdrh %left AND. 1692d3917daSdrh %right NOT. 170f2bc013cSdrh %left IS LIKE GLOB BETWEEN IN ISNULL NOTNULL NE EQ. 1719a43267bSdrh %left GT LE LT GE. 1722d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 1732d3917daSdrh %left PLUS MINUS. 1742d3917daSdrh %left STAR SLASH REM. 1752d3917daSdrh %left CONCAT. 1762d3917daSdrh %right UMINUS UPLUS BITNOT. 1772d3917daSdrh 178c4a3c779Sdrh // And "ids" is an identifer-or-string. 179c4a3c779Sdrh // 180c4a3c779Sdrh %type ids {Token} 1815ad1a6c8Sdrh ids(A) ::= ID(X). {A = X;} 182c4a3c779Sdrh ids(A) ::= STRING(X). {A = X;} 183c4a3c779Sdrh 1845ad1a6c8Sdrh // The name of a column or table can be any of the following: 1855ad1a6c8Sdrh // 1865ad1a6c8Sdrh %type nm {Token} 1875ad1a6c8Sdrh nm(A) ::= ID(X). {A = X;} 1885ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 1895ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 1905ad1a6c8Sdrh 191382c0247Sdrh type ::= . 1924adee20fSdanielk1977 type ::= typename(X). {sqlite3AddColumnType(pParse,&X,&X);} 1934adee20fSdanielk1977 type ::= typename(X) LP signed RP(Y). {sqlite3AddColumnType(pParse,&X,&Y);} 194382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y). 1954adee20fSdanielk1977 {sqlite3AddColumnType(pParse,&X,&Y);} 196382c0247Sdrh %type typename {Token} 197382c0247Sdrh typename(A) ::= ids(X). {A = X;} 198596bd235Sdrh typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(Y.z-X.z);} 199ef0cae50Sdrh %type signed {int} 20074ad7fe9Sdrh signed(A) ::= plus_num(X). { A = atoi(X.z); } 20174ad7fe9Sdrh signed(A) ::= minus_num(X). { A = -atoi(X.z); } 202348784efSdrh carglist ::= carglist carg. 203348784efSdrh carglist ::= . 2045ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 205348784efSdrh carg ::= ccons. 20674ad7fe9Sdrh carg ::= DEFAULT ids(X). {sqlite3AddDefaultValue(pParse,&X,0);} 20774ad7fe9Sdrh carg ::= DEFAULT plus_num(X). {sqlite3AddDefaultValue(pParse,&X,0);} 20874ad7fe9Sdrh carg ::= DEFAULT minus_num(X). {sqlite3AddDefaultValue(pParse,&X,1);} 2097020f651Sdrh carg ::= DEFAULT NULL. 210348784efSdrh 211382c0247Sdrh // In addition to the type name, we also care about the primary key and 212382c0247Sdrh // UNIQUE constraints. 213348784efSdrh // 2140d316a40Sdrh ccons ::= NULL onconf. 2154adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 2164adee20fSdanielk1977 ccons ::= PRIMARY KEY sortorder onconf(R). {sqlite3AddPrimaryKey(pParse,0,R);} 217cbb18d22Sdanielk1977 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0);} 2189cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf. 219c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 2204adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 2214adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 222d3d39e93Sdrh ccons ::= COLLATE id(C). {sqlite3AddCollateType(pParse, C.z, C.n);} 22304738cb9Sdrh 224c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 225c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 226c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 227c2eef3b3Sdrh // check fails. 22804738cb9Sdrh // 229c2eef3b3Sdrh %type refargs {int} 230c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 231c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } 232c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 233c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 234c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 235c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 236c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 237c2eef3b3Sdrh %type refact {int} 238c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 239c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 240c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 241c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 242c2eef3b3Sdrh %type defer_subclause {int} 243c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 244c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 245c2eef3b3Sdrh %type init_deferred_pred_opt {int} 246c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 247c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 248c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 249348784efSdrh 250348784efSdrh // For the time being, the only constraint we care about is the primary 251382c0247Sdrh // key and UNIQUE. Both create indices. 252348784efSdrh // 253348784efSdrh conslist_opt ::= . 254348784efSdrh conslist_opt ::= COMMA conslist. 255348784efSdrh conslist ::= conslist COMMA tcons. 256a2e1bb5aSdrh conslist ::= conslist tcons. 257348784efSdrh conslist ::= tcons. 2585ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 2599cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R). 2604adee20fSdanielk1977 {sqlite3AddPrimaryKey(pParse,X,R);} 2619cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 262cbb18d22Sdanielk1977 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0);} 2639cfcf5d4Sdrh tcons ::= CHECK expr onconf. 264c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 265c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 2664adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 2674adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 268c2eef3b3Sdrh } 269c2eef3b3Sdrh %type defer_subclause_opt {int} 270c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 271c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 2729cfcf5d4Sdrh 2739cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 2749cfcf5d4Sdrh // default behavior when there is a constraint conflict. 2759cfcf5d4Sdrh // 2769cfcf5d4Sdrh %type onconf {int} 2771c92853dSdrh %type orconf {int} 2781c92853dSdrh %type resolvetype {int} 2791c92853dSdrh onconf(A) ::= . {A = OE_Default;} 2801c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 2811c92853dSdrh orconf(A) ::= . {A = OE_Default;} 2821c92853dSdrh orconf(A) ::= OR resolvetype(X). {A = X;} 28374ad7fe9Sdrh resolvetype(A) ::= raisetype(X). {A = X;} 2841c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 2851c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 286348784efSdrh 287382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 288348784efSdrh // 28974ad7fe9Sdrh cmd ::= DROP TABLE fullname(X). { 29074ad7fe9Sdrh sqlite3DropTable(pParse, X, 0); 291a8858103Sdanielk1977 } 292348784efSdrh 293a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 294a76b5dfcSdrh // 295b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 29648dec7e2Sdanielk1977 cmd ::= CREATE(X) temp(T) VIEW nm(Y) dbnm(Z) AS select(S). { 29748dec7e2Sdanielk1977 sqlite3CreateView(pParse, &X, &Y, &Z, S, T); 298a76b5dfcSdrh } 29974ad7fe9Sdrh cmd ::= DROP VIEW fullname(X). { 30074ad7fe9Sdrh sqlite3DropTable(pParse, X, 1); 301a76b5dfcSdrh } 302b7f9164eSdrh %endif // SQLITE_OMIT_VIEW 303a76b5dfcSdrh 304382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 305348784efSdrh // 3069bb61fe7Sdrh cmd ::= select(X). { 307bf3b721fSdanielk1977 sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); 3084adee20fSdanielk1977 sqlite3SelectDelete(X); 3099bb61fe7Sdrh } 310efb7251dSdrh 3119bb61fe7Sdrh %type select {Select*} 3124adee20fSdanielk1977 %destructor select {sqlite3SelectDelete($$);} 31382c3d636Sdrh %type oneselect {Select*} 3144adee20fSdanielk1977 %destructor oneselect {sqlite3SelectDelete($$);} 3159bb61fe7Sdrh 31682c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 317b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 3180a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 319daffd0e5Sdrh if( Z ){ 32082c3d636Sdrh Z->op = Y; 32182c3d636Sdrh Z->pPrior = X; 322daffd0e5Sdrh } 32382c3d636Sdrh A = Z; 32482c3d636Sdrh } 3250a36c57eSdrh %type multiselect_op {int} 32674ad7fe9Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP;} 3270a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 32874ad7fe9Sdrh multiselect_op(A) ::= INTERSECT(OP). {A = @OP;} 32974ad7fe9Sdrh multiselect_op(A) ::= EXCEPT(OP). {A = @OP;} 330b7f9164eSdrh %endif // SQLITE_OMIT_COMPOUND_SELECT 33182c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 3329bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 3334adee20fSdanielk1977 A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset); 3349bb61fe7Sdrh } 3359bb61fe7Sdrh 3369bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 3379bb61fe7Sdrh // present and false (0) if it is not. 3389bb61fe7Sdrh // 339efb7251dSdrh %type distinct {int} 340efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 341fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 342efb7251dSdrh distinct(A) ::= . {A = 0;} 343348784efSdrh 3449bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 3457c917d19Sdrh // values of the SELECT statement. The "*" in statements like 3467c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 3477c917d19Sdrh // opcode of TK_ALL. 3489bb61fe7Sdrh // 349348784efSdrh %type selcollist {ExprList*} 3504adee20fSdanielk1977 %destructor selcollist {sqlite3ExprListDelete($$);} 351348784efSdrh %type sclp {ExprList*} 3524adee20fSdanielk1977 %destructor sclp {sqlite3ExprListDelete($$);} 353348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 354348784efSdrh sclp(A) ::= . {A = 0;} 35501f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 3564adee20fSdanielk1977 A = sqlite3ExprListAppend(P,X,Y.n?&Y:0); 35701f3f253Sdrh } 3587c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 3594adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0); 3607c917d19Sdrh } 3615ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. { 3624adee20fSdanielk1977 Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0); 3634adee20fSdanielk1977 Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X); 3644adee20fSdanielk1977 A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0); 36554473229Sdrh } 36601f3f253Sdrh 36701f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 36801f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 36901f3f253Sdrh // 37001f3f253Sdrh %type as {Token} 3715ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 3725ad1a6c8Sdrh as(X) ::= ids(Y). {X = Y;} 37301f3f253Sdrh as(X) ::= . {X.n = 0;} 3749bb61fe7Sdrh 375348784efSdrh 376ad3cab52Sdrh %type seltablist {SrcList*} 3774adee20fSdanielk1977 %destructor seltablist {sqlite3SrcListDelete($$);} 378ad3cab52Sdrh %type stl_prefix {SrcList*} 3794adee20fSdanielk1977 %destructor stl_prefix {sqlite3SrcListDelete($$);} 380ad3cab52Sdrh %type from {SrcList*} 3814adee20fSdanielk1977 %destructor from {sqlite3SrcListDelete($$);} 382348784efSdrh 38301f3f253Sdrh // A complete FROM clause. 38401f3f253Sdrh // 385bf3a4fa4Sdrh from(A) ::= . {A = sqliteMalloc(sizeof(*A));} 386348784efSdrh from(A) ::= FROM seltablist(X). {A = X;} 38701f3f253Sdrh 38801f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 38901f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 39001f3f253Sdrh // 39101f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 39201f3f253Sdrh A = X; 39301f3f253Sdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; 39401f3f253Sdrh } 395348784efSdrh stl_prefix(A) ::= . {A = 0;} 396113088ecSdrh seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { 3974adee20fSdanielk1977 A = sqlite3SrcListAppend(X,&Y,&D); 3984adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 39901f3f253Sdrh if( N ){ 40001f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 4014adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 402c4a3c779Sdrh } 40301f3f253Sdrh if( U ){ 40401f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 4054adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 40601f3f253Sdrh } 40701f3f253Sdrh } 408b733d037Sdrh seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP 409b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 4104adee20fSdanielk1977 A = sqlite3SrcListAppend(X,0,0); 411ad3cab52Sdrh A->a[A->nSrc-1].pSelect = S; 4124adee20fSdanielk1977 if( Z.n ) sqlite3SrcListAddAlias(A,&Z); 41301f3f253Sdrh if( N ){ 41401f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 4154adee20fSdanielk1977 else { sqlite3ExprDelete(N); } 41622f70c32Sdrh } 41701f3f253Sdrh if( U ){ 41801f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 4194adee20fSdanielk1977 else { sqlite3IdListDelete(U); } 420d5feede1Sdrh } 42122f70c32Sdrh } 422348784efSdrh 423b733d037Sdrh // A seltablist_paren nonterminal represents anything in a FROM that 424b733d037Sdrh // is contained inside parentheses. This can be either a subquery or 425b733d037Sdrh // a grouping of table and subqueries. 426b733d037Sdrh // 427b733d037Sdrh %type seltablist_paren {Select*} 4284adee20fSdanielk1977 %destructor seltablist_paren {sqlite3SelectDelete($$);} 429b733d037Sdrh seltablist_paren(A) ::= select(S). {A = S;} 430b733d037Sdrh seltablist_paren(A) ::= seltablist(F). { 4314adee20fSdanielk1977 A = sqlite3SelectNew(0,F,0,0,0,0,0,-1,0); 432b733d037Sdrh } 433b733d037Sdrh 434113088ecSdrh %type dbnm {Token} 435113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 436113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 437113088ecSdrh 43874ad7fe9Sdrh %type fullname {SrcList*} 43974ad7fe9Sdrh %destructor fullname {sqlite3SrcListDelete($$);} 44074ad7fe9Sdrh fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(0,&X,&Y);} 44174ad7fe9Sdrh 44201f3f253Sdrh %type joinop {int} 44301f3f253Sdrh %type joinop2 {int} 44401f3f253Sdrh joinop(X) ::= COMMA. { X = JT_INNER; } 44501f3f253Sdrh joinop(X) ::= JOIN. { X = JT_INNER; } 4464adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } 4474adee20fSdanielk1977 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } 4485ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 4494adee20fSdanielk1977 { X = sqlite3JoinType(pParse,&A,&B,&C); } 45001f3f253Sdrh 45101f3f253Sdrh %type on_opt {Expr*} 4524adee20fSdanielk1977 %destructor on_opt {sqlite3ExprDelete($$);} 45301f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 45401f3f253Sdrh on_opt(N) ::= . {N = 0;} 45501f3f253Sdrh 45601f3f253Sdrh %type using_opt {IdList*} 4574adee20fSdanielk1977 %destructor using_opt {sqlite3IdListDelete($$);} 4580202b29eSdanielk1977 using_opt(U) ::= USING LP inscollist(L) RP. {U = L;} 45901f3f253Sdrh using_opt(U) ::= . {U = 0;} 46001f3f253Sdrh 46101f3f253Sdrh 462348784efSdrh %type orderby_opt {ExprList*} 4634adee20fSdanielk1977 %destructor orderby_opt {sqlite3ExprListDelete($$);} 464348784efSdrh %type sortlist {ExprList*} 4654adee20fSdanielk1977 %destructor sortlist {sqlite3ExprListDelete($$);} 466348784efSdrh %type sortitem {Expr*} 4674adee20fSdanielk1977 %destructor sortitem {sqlite3ExprDelete($$);} 468348784efSdrh 469348784efSdrh orderby_opt(A) ::= . {A = 0;} 470348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 4718e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). { 4721186b0a0Sdrh A = sqlite3ExprListAppend(X,Y,C.n>0?&C:0); 473d3d39e93Sdrh if( A ) A->a[A->nExpr-1].sortOrder = Z; 474348784efSdrh } 47538640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). { 4761186b0a0Sdrh A = sqlite3ExprListAppend(0,Y,C.n>0?&C:0); 47796fb0dd5Sdanielk1977 if( A && A->a ) A->a[0].sortOrder = Z; 478348784efSdrh } 479da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 480348784efSdrh 481348784efSdrh %type sortorder {int} 482d3d39e93Sdrh %type collate {Token} 483348784efSdrh 4848e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 4858e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 4868e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 487d3d39e93Sdrh collate(C) ::= . {C.z = 0; C.n = 0;} 488d3d39e93Sdrh collate(C) ::= COLLATE id(X). {C = X;} 489348784efSdrh 4902282792aSdrh %type groupby_opt {ExprList*} 4914adee20fSdanielk1977 %destructor groupby_opt {sqlite3ExprListDelete($$);} 4922282792aSdrh groupby_opt(A) ::= . {A = 0;} 4932282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;} 4942282792aSdrh 4952282792aSdrh %type having_opt {Expr*} 4964adee20fSdanielk1977 %destructor having_opt {sqlite3ExprDelete($$);} 4972282792aSdrh having_opt(A) ::= . {A = 0;} 4982282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 4992282792aSdrh 500ad3cab52Sdrh %type limit_opt {struct LimitVal} 501ad3cab52Sdrh limit_opt(A) ::= . {A.limit = -1; A.offset = 0;} 502ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X). {A.limit = X; A.offset = 0;} 503ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y). 504ef0cae50Sdrh {A.limit = X; A.offset = Y;} 505ef0cae50Sdrh limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y). 506ef0cae50Sdrh {A.limit = Y; A.offset = X;} 5079bbca4c1Sdrh 508382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 509382c0247Sdrh // 51074ad7fe9Sdrh cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);} 511348784efSdrh 512348784efSdrh %type where_opt {Expr*} 5134adee20fSdanielk1977 %destructor where_opt {sqlite3ExprDelete($$);} 514348784efSdrh 515348784efSdrh where_opt(A) ::= . {A = 0;} 516348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 517348784efSdrh 518348784efSdrh %type setlist {ExprList*} 5194adee20fSdanielk1977 %destructor setlist {sqlite3ExprListDelete($$);} 520348784efSdrh 521382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 522382c0247Sdrh // 52374ad7fe9Sdrh cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z). 52474ad7fe9Sdrh {sqlite3Update(pParse,X,Y,Z,R);} 525348784efSdrh 5265ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 5274adee20fSdanielk1977 {A = sqlite3ExprListAppend(Z,Y,&X);} 5284adee20fSdanielk1977 setlist(A) ::= nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(0,Y,&X);} 529348784efSdrh 530382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 531382c0247Sdrh // 53274ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) 533113088ecSdrh VALUES LP itemlist(Y) RP. 53474ad7fe9Sdrh {sqlite3Insert(pParse, X, Y, 0, F, R);} 53574ad7fe9Sdrh cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). 53674ad7fe9Sdrh {sqlite3Insert(pParse, X, 0, S, F, R);} 537348784efSdrh 538fa86c412Sdrh %type insert_cmd {int} 539fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 540fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 541fa86c412Sdrh 542348784efSdrh 543348784efSdrh %type itemlist {ExprList*} 5444adee20fSdanielk1977 %destructor itemlist {sqlite3ExprListDelete($$);} 545348784efSdrh 5464adee20fSdanielk1977 itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);} 5474adee20fSdanielk1977 itemlist(A) ::= expr(X). {A = sqlite3ExprListAppend(0,X,0);} 548348784efSdrh 549967e8b73Sdrh %type inscollist_opt {IdList*} 5504adee20fSdanielk1977 %destructor inscollist_opt {sqlite3IdListDelete($$);} 551967e8b73Sdrh %type inscollist {IdList*} 5524adee20fSdanielk1977 %destructor inscollist {sqlite3IdListDelete($$);} 553348784efSdrh 554967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 555967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 5564adee20fSdanielk1977 inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqlite3IdListAppend(X,&Y);} 5574adee20fSdanielk1977 inscollist(A) ::= nm(Y). {A = sqlite3IdListAppend(0,&Y);} 558348784efSdrh 559382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 560382c0247Sdrh // 561348784efSdrh 562348784efSdrh %type expr {Expr*} 5634adee20fSdanielk1977 %destructor expr {sqlite3ExprDelete($$);} 564348784efSdrh 5654adee20fSdanielk1977 expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); } 5667ac25c75Sdrh expr(A) ::= NULL(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5674adee20fSdanielk1977 expr(A) ::= ID(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5684adee20fSdanielk1977 expr(A) ::= JOIN_KW(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);} 5695ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 5704adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5714adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5724adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp2, 0); 573e1b6a5b8Sdrh } 574d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 5754adee20fSdanielk1977 Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); 5764adee20fSdanielk1977 Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); 5774adee20fSdanielk1977 Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z); 5784adee20fSdanielk1977 Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0); 5794adee20fSdanielk1977 A = sqlite3Expr(TK_DOT, temp1, temp4, 0); 580d24cc427Sdrh } 5817ac25c75Sdrh expr(A) ::= INTEGER(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5827ac25c75Sdrh expr(A) ::= FLOAT(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5837ac25c75Sdrh expr(A) ::= STRING(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5847ac25c75Sdrh expr(A) ::= BLOB(X). {A = sqlite3Expr(@X, 0, 0, &X);} 5857c972decSdrh expr(A) ::= VARIABLE(X). { 586895d7472Sdrh Token *pToken = &X; 587895d7472Sdrh Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken); 588fa6bc000Sdrh sqlite3ExprAssignVarNumber(pParse, pExpr); 589895d7472Sdrh } 590e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). { 5914adee20fSdanielk1977 A = sqlite3ExprFunction(Y, &X); 5924adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 593e1b6a5b8Sdrh } 594e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 5954adee20fSdanielk1977 A = sqlite3ExprFunction(0, &X); 5964adee20fSdanielk1977 sqlite3ExprSpan(A,&X,&E); 597e1b6a5b8Sdrh } 5987ac25c75Sdrh expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 5997ac25c75Sdrh expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6007ac25c75Sdrh expr(A) ::= expr(X) LT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6017ac25c75Sdrh expr(A) ::= expr(X) GT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6027ac25c75Sdrh expr(A) ::= expr(X) LE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6037ac25c75Sdrh expr(A) ::= expr(X) GE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6047ac25c75Sdrh expr(A) ::= expr(X) NE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6057ac25c75Sdrh expr(A) ::= expr(X) EQ(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6067ac25c75Sdrh expr(A) ::= expr(X) BITAND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6077ac25c75Sdrh expr(A) ::= expr(X) BITOR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6087ac25c75Sdrh expr(A) ::= expr(X) LSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 6097ac25c75Sdrh expr(A) ::= expr(X) RSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 61074ad7fe9Sdrh expr(A) ::= expr(X) PLUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 61174ad7fe9Sdrh expr(A) ::= expr(X) MINUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 61274ad7fe9Sdrh expr(A) ::= expr(X) STAR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 61374ad7fe9Sdrh expr(A) ::= expr(X) SLASH(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 61474ad7fe9Sdrh expr(A) ::= expr(X) REM(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 61574ad7fe9Sdrh expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} 61674ad7fe9Sdrh %type likeop {struct LikeOp} 61774ad7fe9Sdrh likeop(A) ::= LIKE. {A.opcode = TK_LIKE; A.not = 0;} 61874ad7fe9Sdrh likeop(A) ::= GLOB. {A.opcode = TK_GLOB; A.not = 0;} 61974ad7fe9Sdrh likeop(A) ::= NOT LIKE. {A.opcode = TK_LIKE; A.not = 1;} 62074ad7fe9Sdrh likeop(A) ::= NOT GLOB. {A.opcode = TK_GLOB; A.not = 1;} 6210ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE] { 6224adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, Y, 0); 6234adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, X, 0); 6244adee20fSdanielk1977 A = sqlite3ExprFunction(pList, 0); 6252e3a1f16Sdrh if( A ) A->op = OP.opcode; 6262e3a1f16Sdrh if( OP.not ) A = sqlite3Expr(TK_NOT, A, 0, 0); 6274adee20fSdanielk1977 sqlite3ExprSpan(A, &X->span, &Y->span); 6280ac65892Sdrh } 629e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). { 6304adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6314adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 632e1b6a5b8Sdrh } 63333048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 6344adee20fSdanielk1977 A = sqlite3Expr(TK_ISNULL, X, 0, 0); 6354adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 63633048c0bSdrh } 63733048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). { 6384adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6394adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 64033048c0bSdrh } 641e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). { 6424adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6434adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 644e1b6a5b8Sdrh } 64581a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 6464adee20fSdanielk1977 A = sqlite3Expr(TK_NOTNULL, X, 0, 0); 6474adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 64881a20f21Sdrh } 649e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). { 6507ac25c75Sdrh A = sqlite3Expr(@B, X, 0, 0); 6514adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 652e1b6a5b8Sdrh } 65381a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). { 6547ac25c75Sdrh A = sqlite3Expr(@B, X, 0, 0); 6554adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 65681a20f21Sdrh } 657e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 6584adee20fSdanielk1977 A = sqlite3Expr(TK_UMINUS, X, 0, 0); 6594adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 660e1b6a5b8Sdrh } 6614b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 6624adee20fSdanielk1977 A = sqlite3Expr(TK_UPLUS, X, 0, 0); 6634adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&X->span); 664e1b6a5b8Sdrh } 665e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). { 6664adee20fSdanielk1977 A = sqlite3Expr(TK_SELECT, 0, 0, 0); 667daffd0e5Sdrh if( A ) A->pSelect = X; 6684adee20fSdanielk1977 sqlite3ExprSpan(A,&B,&E); 66919a775c2Sdrh } 6702e3a1f16Sdrh %type between_op {int} 6712e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 6722e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 6732e3a1f16Sdrh expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 6744adee20fSdanielk1977 ExprList *pList = sqlite3ExprListAppend(0, X, 0); 6754adee20fSdanielk1977 pList = sqlite3ExprListAppend(pList, Y, 0); 6764adee20fSdanielk1977 A = sqlite3Expr(TK_BETWEEN, W, 0, 0); 677daffd0e5Sdrh if( A ) A->pList = pList; 6782e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 6794adee20fSdanielk1977 sqlite3ExprSpan(A,&W->span,&Y->span); 680fef5208cSdrh } 6812e3a1f16Sdrh %type in_op {int} 6822e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 6832e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 6842e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { 6854adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 686daffd0e5Sdrh if( A ) A->pList = Y; 6872e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 6884adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 689fef5208cSdrh } 6902e3a1f16Sdrh expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { 6914adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 692daffd0e5Sdrh if( A ) A->pSelect = Y; 6932e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 6944adee20fSdanielk1977 sqlite3ExprSpan(A,&X->span,&E); 695fef5208cSdrh } 69674ad7fe9Sdrh expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { 69774ad7fe9Sdrh SrcList *pSrc = sqlite3SrcListAppend(0,&Y,&Z); 6984adee20fSdanielk1977 A = sqlite3Expr(TK_IN, X, 0, 0); 6994adee20fSdanielk1977 if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); 7002e3a1f16Sdrh if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); 70174ad7fe9Sdrh sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y); 70223b2db23Sdrh } 70323b2db23Sdrh 704fef5208cSdrh 70517a7f8ddSdrh /* CASE expressions */ 70617a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 7074adee20fSdanielk1977 A = sqlite3Expr(TK_CASE, X, Z, 0); 70817a7f8ddSdrh if( A ) A->pList = Y; 7094adee20fSdanielk1977 sqlite3ExprSpan(A, &C, &E); 71017a7f8ddSdrh } 71117a7f8ddSdrh %type case_exprlist {ExprList*} 7124adee20fSdanielk1977 %destructor case_exprlist {sqlite3ExprListDelete($$);} 71317a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 7144adee20fSdanielk1977 A = sqlite3ExprListAppend(X, Y, 0); 7154adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 71617a7f8ddSdrh } 71717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 7184adee20fSdanielk1977 A = sqlite3ExprListAppend(0, Y, 0); 7194adee20fSdanielk1977 A = sqlite3ExprListAppend(A, Z, 0); 72017a7f8ddSdrh } 72117a7f8ddSdrh %type case_else {Expr*} 72217a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 72317a7f8ddSdrh case_else(A) ::= . {A = 0;} 72417a7f8ddSdrh %type case_operand {Expr*} 72517a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 72617a7f8ddSdrh case_operand(A) ::= . {A = 0;} 727348784efSdrh 728348784efSdrh %type exprlist {ExprList*} 7294adee20fSdanielk1977 %destructor exprlist {sqlite3ExprListDelete($$);} 730348784efSdrh %type expritem {Expr*} 7314adee20fSdanielk1977 %destructor expritem {sqlite3ExprDelete($$);} 732348784efSdrh 733348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y). 7344adee20fSdanielk1977 {A = sqlite3ExprListAppend(X,Y,0);} 7354adee20fSdanielk1977 exprlist(A) ::= expritem(X). {A = sqlite3ExprListAppend(0,X,0);} 736348784efSdrh expritem(A) ::= expr(X). {A = X;} 737348784efSdrh expritem(A) ::= . {A = 0;} 738cce7d176Sdrh 739382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 740382c0247Sdrh // 741cbb18d22Sdanielk1977 cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) dbnm(D) 74274ad7fe9Sdrh ON fullname(Y) LP idxlist(Z) RP(E) onconf(R). { 7439cfcf5d4Sdrh if( U!=OE_None ) U = R; 7449cfcf5d4Sdrh if( U==OE_Default) U = OE_Abort; 74574ad7fe9Sdrh sqlite3CreateIndex(pParse, &X, &D, Y, Z, U, &S, &E); 7469cfcf5d4Sdrh } 747717e6402Sdrh 748717e6402Sdrh %type uniqueflag {int} 7499cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 7509cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 751348784efSdrh 7520202b29eSdanielk1977 %type idxlist {ExprList*} 7530202b29eSdanielk1977 %destructor idxlist {sqlite3ExprListDelete($$);} 7540202b29eSdanielk1977 %type idxlist_opt {ExprList*} 7550202b29eSdanielk1977 %destructor idxlist_opt {sqlite3ExprListDelete($$);} 756348784efSdrh %type idxitem {Token} 757348784efSdrh 758c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 759c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 7600202b29eSdanielk1977 idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder. { 7610202b29eSdanielk1977 Expr *p = 0; 7620202b29eSdanielk1977 if( C.n>0 ){ 7630202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 7640202b29eSdanielk1977 if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n); 7650202b29eSdanielk1977 } 7660202b29eSdanielk1977 A = sqlite3ExprListAppend(X, p, &Y); 7670202b29eSdanielk1977 } 7680202b29eSdanielk1977 idxlist(A) ::= idxitem(Y) collate(C) sortorder. { 7690202b29eSdanielk1977 Expr *p = 0; 7700202b29eSdanielk1977 if( C.n>0 ){ 7710202b29eSdanielk1977 p = sqlite3Expr(TK_COLUMN, 0, 0, 0); 7720202b29eSdanielk1977 if( p ) p->pColl = sqlite3LocateCollSeq(pParse, C.z, C.n); 7730202b29eSdanielk1977 } 7740202b29eSdanielk1977 A = sqlite3ExprListAppend(0, p, &Y); 7750202b29eSdanielk1977 } 7760202b29eSdanielk1977 idxitem(A) ::= nm(X). {A = X;} 7770202b29eSdanielk1977 778348784efSdrh 7798aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 780382c0247Sdrh // 78174ad7fe9Sdrh cmd ::= DROP INDEX fullname(X). {sqlite3DropIndex(pParse, X);} 782982cef7eSdrh 783382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 784382c0247Sdrh // 7854adee20fSdanielk1977 cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 78674ad7fe9Sdrh cmd ::= VACUUM nm. {sqlite3Vacuum(pParse,0);} 787f57b14a6Sdrh 788382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 789382c0247Sdrh // 79091cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ nm(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79191cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ plus_num(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79391cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). { 79491cf71b0Sdanielk1977 sqlite3Pragma(pParse,&X,&Z,&Y,1); 79591cf71b0Sdanielk1977 } 79691cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z) LP nm(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 79791cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 798f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 799f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 800f57b14a6Sdrh number(A) ::= INTEGER(X). {A = X;} 801f57b14a6Sdrh number(A) ::= FLOAT(X). {A = X;} 802f57b14a6Sdrh plus_opt ::= PLUS. 803f57b14a6Sdrh plus_opt ::= . 804c3f9bad2Sdanielk1977 805c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 806f0f258b1Sdrh 807b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 808b7f9164eSdrh 8093df6b257Sdanielk1977 cmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 8104b59ab5eSdrh Token all; 8114b59ab5eSdrh all.z = A.z; 8124b59ab5eSdrh all.n = (Z.z - A.z) + Z.n; 8134adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 814f0f258b1Sdrh } 815f0f258b1Sdrh 81674ad7fe9Sdrh trigger_decl(A) ::= temp(T) TRIGGER nm(B) dbnm(Z) trigger_time(C) 81774ad7fe9Sdrh trigger_event(D) 81874ad7fe9Sdrh ON fullname(E) foreach_clause(F) when_clause(G). { 81974ad7fe9Sdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, F, G, T); 8203df6b257Sdanielk1977 A = (Z.n==0?B:Z); 821c3f9bad2Sdanielk1977 } 822c3f9bad2Sdanielk1977 823c3f9bad2Sdanielk1977 %type trigger_time {int} 824c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 825c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 826c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 827c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 828c3f9bad2Sdanielk1977 829ad3cab52Sdrh %type trigger_event {struct TrigEvent} 8304adee20fSdanielk1977 %destructor trigger_event {sqlite3IdListDelete($$.b);} 83174ad7fe9Sdrh trigger_event(A) ::= DELETE(OP). {A.a = @OP; A.b = 0;} 83274ad7fe9Sdrh trigger_event(A) ::= INSERT(OP). {A.a = @OP; A.b = 0;} 83374ad7fe9Sdrh trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;} 834c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;} 835c3f9bad2Sdanielk1977 836c3f9bad2Sdanielk1977 %type foreach_clause {int} 837c3f9bad2Sdanielk1977 foreach_clause(A) ::= . { A = TK_ROW; } 838c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } 839c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } 840c3f9bad2Sdanielk1977 841c3f9bad2Sdanielk1977 %type when_clause {Expr*} 842c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 843c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 844c3f9bad2Sdanielk1977 845c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 8464adee20fSdanielk1977 %destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);} 847c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { 848a69d9168Sdrh X->pNext = Y; 849a69d9168Sdrh A = X; 850a69d9168Sdrh } 851c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; } 852c3f9bad2Sdanielk1977 853c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 8544adee20fSdanielk1977 %destructor trigger_cmd {sqlite3DeleteTriggerStep($$);} 855c3f9bad2Sdanielk1977 // UPDATE 8565ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 8574adee20fSdanielk1977 { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); } 858c3f9bad2Sdanielk1977 859c3f9bad2Sdanielk1977 // INSERT 8603054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 861c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 8624adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);} 863c3f9bad2Sdanielk1977 8643054efeeSdrh trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 8654adee20fSdanielk1977 {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);} 866c3f9bad2Sdanielk1977 867c3f9bad2Sdanielk1977 // DELETE 8685ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 8694adee20fSdanielk1977 {A = sqlite3TriggerDeleteStep(&X, Y);} 870c3f9bad2Sdanielk1977 871c3f9bad2Sdanielk1977 // SELECT 8724adee20fSdanielk1977 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(X); } 873c3f9bad2Sdanielk1977 8746f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 8754b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 8764adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, 0); 8774b59ab5eSdrh A->iColumn = OE_Ignore; 8784adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8794b59ab5eSdrh } 88074ad7fe9Sdrh expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { 8814adee20fSdanielk1977 A = sqlite3Expr(TK_RAISE, 0, 0, &Z); 88274ad7fe9Sdrh A->iColumn = T; 8834adee20fSdanielk1977 sqlite3ExprSpan(A, &X, &Y); 8844b59ab5eSdrh } 885b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER 886b7f9164eSdrh 88774ad7fe9Sdrh %type raisetype {int} 88874ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 88974ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 89074ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 89174ad7fe9Sdrh 8926f34903eSdanielk1977 893c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 894b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 89574ad7fe9Sdrh cmd ::= DROP TRIGGER fullname(X). { 89674ad7fe9Sdrh sqlite3DropTrigger(pParse,X); 897c3f9bad2Sdanielk1977 } 898b7f9164eSdrh %endif // !SQLITE_OMIT_TRIGGER 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