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*caec2f12Sdrh ** @(#) $Id: parse.y,v 1.86 2003/01/07 02:47:48 drh Exp $ 18348784efSdrh */ 19348784efSdrh %token_prefix TK_ 20348784efSdrh %token_type {Token} 21f57b14a6Sdrh %default_type {Token} 22348784efSdrh %extra_argument {Parse *pParse} 23348784efSdrh %syntax_error { 24c837e709Sdrh sqliteSetString(&pParse->zErrMsg,"syntax error",0); 25348784efSdrh pParse->sErrToken = TOKEN; 26348784efSdrh } 27348784efSdrh %name sqliteParser 28348784efSdrh %include { 29348784efSdrh #include "sqliteInt.h" 30348784efSdrh #include "parse.h" 319bbca4c1Sdrh 329bbca4c1Sdrh /* 33ad3cab52Sdrh ** An instance of this structure holds information about the 34ad3cab52Sdrh ** LIMIT clause of a SELECT statement. 359bbca4c1Sdrh */ 36ad3cab52Sdrh struct LimitVal { 37ad3cab52Sdrh int limit; /* The LIMIT value. -1 if there is no limit */ 38ad3cab52Sdrh int offset; /* The OFFSET. 0 if there is none */ 39ad3cab52Sdrh }; 40c3f9bad2Sdanielk1977 41c3f9bad2Sdanielk1977 /* 42ad3cab52Sdrh ** An instance of the following structure describes the event of a 43ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 44ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 45ad3cab52Sdrh ** 46ad3cab52Sdrh ** UPDATE ON (a,b,c) 47ad3cab52Sdrh ** 48ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 49c3f9bad2Sdanielk1977 */ 50ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 51*caec2f12Sdrh 52*caec2f12Sdrh } // end %include 53348784efSdrh 54348784efSdrh // These are extra tokens used by the lexer but never seen by the 55348784efSdrh // parser. We put them in a rule so that the parser generator will 566206d50aSdrh // add them to the parse.h output file. 57348784efSdrh // 58c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION 59c4a3c779Sdrh COLUMN AGG_FUNCTION. 60c4a3c779Sdrh 61c4a3c779Sdrh // Input is zero or more commands. 62c4a3c779Sdrh input ::= cmdlist. 63348784efSdrh 64348784efSdrh // A list of commands is zero or more commands 65348784efSdrh // 66348784efSdrh cmdlist ::= ecmd. 67094b2bbfSdrh cmdlist ::= cmdlist ecmd. 68094b2bbfSdrh ecmd ::= explain cmd SEMI. {sqliteExec(pParse);} 69094b2bbfSdrh ecmd ::= SEMI. 70e0bc4048Sdrh explain ::= EXPLAIN. { sqliteBeginParse(pParse, 1); } 71e0bc4048Sdrh explain ::= . { sqliteBeginParse(pParse, 0); } 72348784efSdrh 73382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 74c4a3c779Sdrh // 75fa86c412Sdrh 760d65dc0eSdrh cmd ::= BEGIN trans_opt onconf(R). {sqliteBeginTransaction(pParse,R);} 77c4a3c779Sdrh trans_opt ::= . 78c4a3c779Sdrh trans_opt ::= TRANSACTION. 795ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 80c4a3c779Sdrh cmd ::= COMMIT trans_opt. {sqliteCommitTransaction(pParse);} 81c4a3c779Sdrh cmd ::= END trans_opt. {sqliteCommitTransaction(pParse);} 82c4a3c779Sdrh cmd ::= ROLLBACK trans_opt. {sqliteRollbackTransaction(pParse);} 83c4a3c779Sdrh 84382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 85348784efSdrh // 86348784efSdrh cmd ::= create_table create_table_args. 875ad1a6c8Sdrh create_table ::= CREATE(X) temp(T) TABLE nm(Y). { 88969fa7c1Sdrh sqliteStartTable(pParse,&X,&Y,T); 89969fa7c1Sdrh } 90f57b3399Sdrh %type temp {int} 91e0bc4048Sdrh temp(A) ::= TEMP. {A = pParse->isTemp || !pParse->initFlag;} 92e0bc4048Sdrh temp(A) ::= . {A = pParse->isTemp;} 93969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). { 94969fa7c1Sdrh sqliteEndTable(pParse,&X,0); 95969fa7c1Sdrh } 96969fa7c1Sdrh create_table_args ::= AS select(S). { 97969fa7c1Sdrh sqliteEndTable(pParse,0,S); 98969fa7c1Sdrh sqliteSelectDelete(S); 99969fa7c1Sdrh } 100348784efSdrh columnlist ::= columnlist COMMA column. 101348784efSdrh columnlist ::= column. 102348784efSdrh 103348784efSdrh // About the only information used for a column is the name of the 104348784efSdrh // column. The type is always just "text". But the code will accept 105348784efSdrh // an elaborate typename. Perhaps someday we'll do something with it. 106348784efSdrh // 107348784efSdrh column ::= columnid type carglist. 1085ad1a6c8Sdrh columnid ::= nm(X). {sqliteAddColumn(pParse,&X);} 109c4a3c779Sdrh 110c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several 111c4a3c779Sdrh // keywords. Any non-standard keyword can also be an identifier. 112c4a3c779Sdrh // 113982cef7eSdrh %type id {Token} 114f18543caSdrh id(A) ::= ID(X). {A = X;} 1150bd1f4eaSdrh 11634e33bb8Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 11734e33bb8Sdrh // fallback to ID if they will not parse as their original value. 11834e33bb8Sdrh // This obviates the need for the "id" nonterminal. 11934e33bb8Sdrh // 1200bd1f4eaSdrh %fallback ID 121f04d5081Sdrh ABORT AFTER ASC BEFORE BEGIN CASCADE CLUSTER CONFLICT 1220bd1f4eaSdrh COPY DEFERRED DELIMITERS DESC EACH END EXPLAIN FAIL FOR 1235ad1a6c8Sdrh IGNORE IMMEDIATE INITIALLY INSTEAD MATCH KEY 1245ad1a6c8Sdrh OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT 1250bd1f4eaSdrh TEMP TRIGGER VACUUM VIEW. 126c4a3c779Sdrh 127c4a3c779Sdrh // And "ids" is an identifer-or-string. 128c4a3c779Sdrh // 129c4a3c779Sdrh %type ids {Token} 1305ad1a6c8Sdrh ids(A) ::= ID(X). {A = X;} 131c4a3c779Sdrh ids(A) ::= STRING(X). {A = X;} 132c4a3c779Sdrh 1335ad1a6c8Sdrh // The name of a column or table can be any of the following: 1345ad1a6c8Sdrh // 1355ad1a6c8Sdrh %type nm {Token} 1365ad1a6c8Sdrh nm(A) ::= ID(X). {A = X;} 1375ad1a6c8Sdrh nm(A) ::= STRING(X). {A = X;} 1385ad1a6c8Sdrh nm(A) ::= JOIN_KW(X). {A = X;} 1395ad1a6c8Sdrh 140382c0247Sdrh type ::= . 141382c0247Sdrh type ::= typename(X). {sqliteAddColumnType(pParse,&X,&X);} 142382c0247Sdrh type ::= typename(X) LP signed RP(Y). {sqliteAddColumnType(pParse,&X,&Y);} 143382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y). 144382c0247Sdrh {sqliteAddColumnType(pParse,&X,&Y);} 145382c0247Sdrh %type typename {Token} 146382c0247Sdrh typename(A) ::= ids(X). {A = X;} 147382c0247Sdrh typename(A) ::= typename(X) ids. {A = X;} 148348784efSdrh signed ::= INTEGER. 149348784efSdrh signed ::= PLUS INTEGER. 150348784efSdrh signed ::= MINUS INTEGER. 151348784efSdrh carglist ::= carglist carg. 152348784efSdrh carglist ::= . 1535ad1a6c8Sdrh carg ::= CONSTRAINT nm ccons. 154348784efSdrh carg ::= ccons. 1557020f651Sdrh carg ::= DEFAULT STRING(X). {sqliteAddDefaultValue(pParse,&X,0);} 1567020f651Sdrh carg ::= DEFAULT ID(X). {sqliteAddDefaultValue(pParse,&X,0);} 1577020f651Sdrh carg ::= DEFAULT INTEGER(X). {sqliteAddDefaultValue(pParse,&X,0);} 1587020f651Sdrh carg ::= DEFAULT PLUS INTEGER(X). {sqliteAddDefaultValue(pParse,&X,0);} 1597020f651Sdrh carg ::= DEFAULT MINUS INTEGER(X). {sqliteAddDefaultValue(pParse,&X,1);} 1607020f651Sdrh carg ::= DEFAULT FLOAT(X). {sqliteAddDefaultValue(pParse,&X,0);} 1617020f651Sdrh carg ::= DEFAULT PLUS FLOAT(X). {sqliteAddDefaultValue(pParse,&X,0);} 1627020f651Sdrh carg ::= DEFAULT MINUS FLOAT(X). {sqliteAddDefaultValue(pParse,&X,1);} 1637020f651Sdrh carg ::= DEFAULT NULL. 164348784efSdrh 165382c0247Sdrh // In addition to the type name, we also care about the primary key and 166382c0247Sdrh // UNIQUE constraints. 167348784efSdrh // 1680d316a40Sdrh ccons ::= NULL onconf. 1699cfcf5d4Sdrh ccons ::= NOT NULL onconf(R). {sqliteAddNotNull(pParse, R);} 1709cfcf5d4Sdrh ccons ::= PRIMARY KEY sortorder onconf(R). {sqliteAddPrimaryKey(pParse,0,R);} 1719cfcf5d4Sdrh ccons ::= UNIQUE onconf(R). {sqliteCreateIndex(pParse,0,0,0,R,0,0);} 1729cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf. 173c2eef3b3Sdrh ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). 174c2eef3b3Sdrh {sqliteCreateForeignKey(pParse,0,&T,TA,R);} 175c2eef3b3Sdrh ccons ::= defer_subclause(D). {sqliteDeferForeignKey(pParse,D);} 1768e2ca029Sdrh ccons ::= COLLATE id(C). { 1778e2ca029Sdrh sqliteAddCollateType(pParse, sqliteCollateType(pParse, &C)); 1788e2ca029Sdrh } 17904738cb9Sdrh 180c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 181c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 182c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 183c2eef3b3Sdrh // check fails. 18404738cb9Sdrh // 185c2eef3b3Sdrh %type refargs {int} 186c2eef3b3Sdrh refargs(A) ::= . { A = OE_Restrict * 0x010101; } 187c2eef3b3Sdrh refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; } 188c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 189c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 190c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 191c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 192c2eef3b3Sdrh refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; } 193c2eef3b3Sdrh %type refact {int} 194c2eef3b3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; } 195c2eef3b3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; } 196c2eef3b3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; } 197c2eef3b3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; } 198c2eef3b3Sdrh %type defer_subclause {int} 199c2eef3b3Sdrh defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X). {A = X;} 200c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 201c2eef3b3Sdrh %type init_deferred_pred_opt {int} 202c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 203c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 204c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 205348784efSdrh 206348784efSdrh // For the time being, the only constraint we care about is the primary 207382c0247Sdrh // key and UNIQUE. Both create indices. 208348784efSdrh // 209348784efSdrh conslist_opt ::= . 210348784efSdrh conslist_opt ::= COMMA conslist. 211348784efSdrh conslist ::= conslist COMMA tcons. 212a2e1bb5aSdrh conslist ::= conslist tcons. 213348784efSdrh conslist ::= tcons. 2145ad1a6c8Sdrh tcons ::= CONSTRAINT nm. 2159cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R). 2169cfcf5d4Sdrh {sqliteAddPrimaryKey(pParse,X,R);} 2179cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R). 2189cfcf5d4Sdrh {sqliteCreateIndex(pParse,0,0,X,R,0,0);} 2199cfcf5d4Sdrh tcons ::= CHECK expr onconf. 220c2eef3b3Sdrh tcons ::= FOREIGN KEY LP idxlist(FA) RP 221c2eef3b3Sdrh REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { 222c2eef3b3Sdrh sqliteCreateForeignKey(pParse, FA, &T, TA, R); 223c2eef3b3Sdrh sqliteDeferForeignKey(pParse, D); 224c2eef3b3Sdrh } 225c2eef3b3Sdrh %type defer_subclause_opt {int} 226c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 227c2eef3b3Sdrh defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} 2289cfcf5d4Sdrh 2299cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 2309cfcf5d4Sdrh // default behavior when there is a constraint conflict. 2319cfcf5d4Sdrh // 2329cfcf5d4Sdrh %type onconf {int} 2331c92853dSdrh %type orconf {int} 2341c92853dSdrh %type resolvetype {int} 2351c92853dSdrh onconf(A) ::= . { A = OE_Default; } 2361c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). { A = X; } 2371c92853dSdrh orconf(A) ::= . { A = OE_Default; } 2381c92853dSdrh orconf(A) ::= OR resolvetype(X). { A = X; } 2391c92853dSdrh resolvetype(A) ::= ROLLBACK. { A = OE_Rollback; } 2401c92853dSdrh resolvetype(A) ::= ABORT. { A = OE_Abort; } 2411c92853dSdrh resolvetype(A) ::= FAIL. { A = OE_Fail; } 2421c92853dSdrh resolvetype(A) ::= IGNORE. { A = OE_Ignore; } 2431c92853dSdrh resolvetype(A) ::= REPLACE. { A = OE_Replace; } 244348784efSdrh 245382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 246348784efSdrh // 2475ad1a6c8Sdrh cmd ::= DROP TABLE nm(X). {sqliteDropTable(pParse,&X,0);} 248348784efSdrh 249a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 250a76b5dfcSdrh // 2516276c1cbSdrh cmd ::= CREATE(X) temp(T) VIEW nm(Y) AS select(S). { 2526276c1cbSdrh sqliteCreateView(pParse, &X, &Y, S, T); 253a76b5dfcSdrh } 2545ad1a6c8Sdrh cmd ::= DROP VIEW nm(X). { 2554ff6dfa7Sdrh sqliteDropTable(pParse, &X, 1); 256a76b5dfcSdrh } 257a76b5dfcSdrh 258382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 259348784efSdrh // 2609bb61fe7Sdrh cmd ::= select(X). { 261832508b7Sdrh sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0); 2629bb61fe7Sdrh sqliteSelectDelete(X); 2639bb61fe7Sdrh } 264efb7251dSdrh 2659bb61fe7Sdrh %type select {Select*} 2669bb61fe7Sdrh %destructor select {sqliteSelectDelete($$);} 26782c3d636Sdrh %type oneselect {Select*} 26882c3d636Sdrh %destructor oneselect {sqliteSelectDelete($$);} 2699bb61fe7Sdrh 27082c3d636Sdrh select(A) ::= oneselect(X). {A = X;} 2710a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z). { 272daffd0e5Sdrh if( Z ){ 27382c3d636Sdrh Z->op = Y; 27482c3d636Sdrh Z->pPrior = X; 275daffd0e5Sdrh } 27682c3d636Sdrh A = Z; 27782c3d636Sdrh } 2780a36c57eSdrh %type multiselect_op {int} 2790a36c57eSdrh multiselect_op(A) ::= UNION. {A = TK_UNION;} 2800a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 2810a36c57eSdrh multiselect_op(A) ::= INTERSECT. {A = TK_INTERSECT;} 2820a36c57eSdrh multiselect_op(A) ::= EXCEPT. {A = TK_EXCEPT;} 28382c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) 2849bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 285ad3cab52Sdrh A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset); 2869bb61fe7Sdrh } 2879bb61fe7Sdrh 2889bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 2899bb61fe7Sdrh // present and false (0) if it is not. 2909bb61fe7Sdrh // 291efb7251dSdrh %type distinct {int} 292efb7251dSdrh distinct(A) ::= DISTINCT. {A = 1;} 293fef5208cSdrh distinct(A) ::= ALL. {A = 0;} 294efb7251dSdrh distinct(A) ::= . {A = 0;} 295348784efSdrh 2969bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 2977c917d19Sdrh // values of the SELECT statement. The "*" in statements like 2987c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 2997c917d19Sdrh // opcode of TK_ALL. 3009bb61fe7Sdrh // 301348784efSdrh %type selcollist {ExprList*} 302348784efSdrh %destructor selcollist {sqliteExprListDelete($$);} 303348784efSdrh %type sclp {ExprList*} 304348784efSdrh %destructor sclp {sqliteExprListDelete($$);} 305348784efSdrh sclp(A) ::= selcollist(X) COMMA. {A = X;} 306348784efSdrh sclp(A) ::= . {A = 0;} 30701f3f253Sdrh selcollist(A) ::= sclp(P) expr(X) as(Y). { 30801f3f253Sdrh A = sqliteExprListAppend(P,X,Y.n?&Y:0); 30901f3f253Sdrh } 3107c917d19Sdrh selcollist(A) ::= sclp(P) STAR. { 3117c917d19Sdrh A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0); 3127c917d19Sdrh } 3135ad1a6c8Sdrh selcollist(A) ::= sclp(P) nm(X) DOT STAR. { 31454473229Sdrh Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0); 31554473229Sdrh Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X); 31654473229Sdrh A = sqliteExprListAppend(P, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0); 31754473229Sdrh } 31801f3f253Sdrh 31901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 32001f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 32101f3f253Sdrh // 32201f3f253Sdrh %type as {Token} 3235ad1a6c8Sdrh as(X) ::= AS nm(Y). { X = Y; } 3245ad1a6c8Sdrh as(X) ::= ids(Y). { X = Y; } 32501f3f253Sdrh as(X) ::= . { X.n = 0; } 3269bb61fe7Sdrh 327348784efSdrh 328ad3cab52Sdrh %type seltablist {SrcList*} 329ad3cab52Sdrh %destructor seltablist {sqliteSrcListDelete($$);} 330ad3cab52Sdrh %type stl_prefix {SrcList*} 331ad3cab52Sdrh %destructor stl_prefix {sqliteSrcListDelete($$);} 332ad3cab52Sdrh %type from {SrcList*} 333ad3cab52Sdrh %destructor from {sqliteSrcListDelete($$);} 334348784efSdrh 33501f3f253Sdrh // A complete FROM clause. 33601f3f253Sdrh // 337bf3a4fa4Sdrh from(A) ::= . {A = sqliteMalloc(sizeof(*A));} 338348784efSdrh from(A) ::= FROM seltablist(X). {A = X;} 33901f3f253Sdrh 34001f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 34101f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 34201f3f253Sdrh // 34301f3f253Sdrh stl_prefix(A) ::= seltablist(X) joinop(Y). { 34401f3f253Sdrh A = X; 34501f3f253Sdrh if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y; 34601f3f253Sdrh } 347348784efSdrh stl_prefix(A) ::= . {A = 0;} 3485ad1a6c8Sdrh seltablist(A) ::= stl_prefix(X) nm(Y) as(Z) on_opt(N) using_opt(U). { 349ad3cab52Sdrh A = sqliteSrcListAppend(X,&Y); 35001f3f253Sdrh if( Z.n ) sqliteSrcListAddAlias(A,&Z); 35101f3f253Sdrh if( N ){ 35201f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 35301f3f253Sdrh else { sqliteExprDelete(N); } 354c4a3c779Sdrh } 35501f3f253Sdrh if( U ){ 35601f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 35701f3f253Sdrh else { sqliteIdListDelete(U); } 35801f3f253Sdrh } 35901f3f253Sdrh } 36001f3f253Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP as(Z) on_opt(N) using_opt(U). { 361ad3cab52Sdrh A = sqliteSrcListAppend(X,0); 362ad3cab52Sdrh A->a[A->nSrc-1].pSelect = S; 36301f3f253Sdrh if( Z.n ) sqliteSrcListAddAlias(A,&Z); 36401f3f253Sdrh if( N ){ 36501f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; } 36601f3f253Sdrh else { sqliteExprDelete(N); } 36722f70c32Sdrh } 36801f3f253Sdrh if( U ){ 36901f3f253Sdrh if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; } 37001f3f253Sdrh else { sqliteIdListDelete(U); } 371d5feede1Sdrh } 37222f70c32Sdrh } 373348784efSdrh 37401f3f253Sdrh %type joinop {int} 37501f3f253Sdrh %type joinop2 {int} 37601f3f253Sdrh joinop(X) ::= COMMA. { X = JT_INNER; } 37701f3f253Sdrh joinop(X) ::= JOIN. { X = JT_INNER; } 3785ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) JOIN. { X = sqliteJoinType(pParse,&A,0,0); } 3795ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqliteJoinType(pParse,&A,&B,0); } 3805ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 3815ad1a6c8Sdrh { X = sqliteJoinType(pParse,&A,&B,&C); } 38201f3f253Sdrh 38301f3f253Sdrh %type on_opt {Expr*} 38401f3f253Sdrh %destructor on_opt {sqliteExprDelete($$);} 38501f3f253Sdrh on_opt(N) ::= ON expr(E). {N = E;} 38601f3f253Sdrh on_opt(N) ::= . {N = 0;} 38701f3f253Sdrh 38801f3f253Sdrh %type using_opt {IdList*} 38901f3f253Sdrh %destructor using_opt {sqliteIdListDelete($$);} 39001f3f253Sdrh using_opt(U) ::= USING LP idxlist(L) RP. {U = L;} 39101f3f253Sdrh using_opt(U) ::= . {U = 0;} 39201f3f253Sdrh 39301f3f253Sdrh 394348784efSdrh %type orderby_opt {ExprList*} 395348784efSdrh %destructor orderby_opt {sqliteExprListDelete($$);} 396348784efSdrh %type sortlist {ExprList*} 397348784efSdrh %destructor sortlist {sqliteExprListDelete($$);} 398348784efSdrh %type sortitem {Expr*} 399348784efSdrh %destructor sortitem {sqliteExprDelete($$);} 400348784efSdrh 401348784efSdrh orderby_opt(A) ::= . {A = 0;} 402348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 4038e2ca029Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). { 404348784efSdrh A = sqliteExprListAppend(X,Y,0); 4058e2ca029Sdrh if( A ) A->a[A->nExpr-1].sortOrder = C+Z; 406348784efSdrh } 40738640e15Sdrh sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). { 408348784efSdrh A = sqliteExprListAppend(0,Y,0); 40938640e15Sdrh if( A ) A->a[0].sortOrder = C+Z; 410348784efSdrh } 411da9d6c45Sdrh sortitem(A) ::= expr(X). {A = X;} 412348784efSdrh 413348784efSdrh %type sortorder {int} 4148e2ca029Sdrh %type collate {int} 415348784efSdrh 4168e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 4178e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 4188e2ca029Sdrh sortorder(A) ::= . {A = SQLITE_SO_ASC;} 4198e2ca029Sdrh collate(C) ::= . {C = SQLITE_SO_UNK;} 4208e2ca029Sdrh collate(C) ::= COLLATE id(X). {C = sqliteCollateType(pParse, &X);} 421348784efSdrh 4222282792aSdrh %type groupby_opt {ExprList*} 4232282792aSdrh %destructor groupby_opt {sqliteExprListDelete($$);} 4242282792aSdrh groupby_opt(A) ::= . {A = 0;} 4252282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X). {A = X;} 4262282792aSdrh 4272282792aSdrh %type having_opt {Expr*} 4282282792aSdrh %destructor having_opt {sqliteExprDelete($$);} 4292282792aSdrh having_opt(A) ::= . {A = 0;} 4302282792aSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 4312282792aSdrh 432ad3cab52Sdrh %type limit_opt {struct LimitVal} 433ad3cab52Sdrh limit_opt(A) ::= . {A.limit = -1; A.offset = 0;} 434ad3cab52Sdrh limit_opt(A) ::= LIMIT INTEGER(X). {A.limit = atoi(X.z); A.offset = 0;} 4359bbca4c1Sdrh limit_opt(A) ::= LIMIT INTEGER(X) limit_sep INTEGER(Y). 436ad3cab52Sdrh {A.limit = atoi(X.z); A.offset = atoi(Y.z);} 4379bbca4c1Sdrh limit_sep ::= OFFSET. 4389bbca4c1Sdrh limit_sep ::= COMMA. 4399bbca4c1Sdrh 440382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 441382c0247Sdrh // 4425ad1a6c8Sdrh cmd ::= DELETE FROM nm(X) where_opt(Y). 443348784efSdrh {sqliteDeleteFrom(pParse, &X, Y);} 444348784efSdrh 445348784efSdrh %type where_opt {Expr*} 446348784efSdrh %destructor where_opt {sqliteExprDelete($$);} 447348784efSdrh 448348784efSdrh where_opt(A) ::= . {A = 0;} 449348784efSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 450348784efSdrh 451348784efSdrh %type setlist {ExprList*} 452348784efSdrh %destructor setlist {sqliteExprListDelete($$);} 453348784efSdrh 454382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 455382c0247Sdrh // 4565ad1a6c8Sdrh cmd ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 4579cfcf5d4Sdrh {sqliteUpdate(pParse,&X,Y,Z,R);} 458348784efSdrh 4595ad1a6c8Sdrh setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). 460348784efSdrh {A = sqliteExprListAppend(Z,Y,&X);} 4615ad1a6c8Sdrh setlist(A) ::= nm(X) EQ expr(Y). {A = sqliteExprListAppend(0,Y,&X);} 462348784efSdrh 463382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 464382c0247Sdrh // 4655ad1a6c8Sdrh cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP. 4669cfcf5d4Sdrh {sqliteInsert(pParse, &X, Y, 0, F, R);} 4675ad1a6c8Sdrh cmd ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). 4689cfcf5d4Sdrh {sqliteInsert(pParse, &X, 0, S, F, R);} 469348784efSdrh 470fa86c412Sdrh %type insert_cmd {int} 471fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 472fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 473fa86c412Sdrh 474348784efSdrh 475348784efSdrh %type itemlist {ExprList*} 476348784efSdrh %destructor itemlist {sqliteExprListDelete($$);} 477348784efSdrh 478e64e7b20Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqliteExprListAppend(X,Y,0);} 479e64e7b20Sdrh itemlist(A) ::= expr(X). {A = sqliteExprListAppend(0,X,0);} 480348784efSdrh 481967e8b73Sdrh %type inscollist_opt {IdList*} 482967e8b73Sdrh %destructor inscollist_opt {sqliteIdListDelete($$);} 483967e8b73Sdrh %type inscollist {IdList*} 484967e8b73Sdrh %destructor inscollist {sqliteIdListDelete($$);} 485348784efSdrh 486967e8b73Sdrh inscollist_opt(A) ::= . {A = 0;} 487967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;} 4885ad1a6c8Sdrh inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqliteIdListAppend(X,&Y);} 4895ad1a6c8Sdrh inscollist(A) ::= nm(Y). {A = sqliteIdListAppend(0,&Y);} 490348784efSdrh 491382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 492382c0247Sdrh // 493348784efSdrh %left OR. 494348784efSdrh %left AND. 4958be51133Sdrh %right NOT. 496fef5208cSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN. 497348784efSdrh %left GT GE LT LE. 49881a20f21Sdrh %left BITAND BITOR LSHIFT RSHIFT. 499348784efSdrh %left PLUS MINUS. 500bf4133cbSdrh %left STAR SLASH REM. 5010040077dSdrh %left CONCAT. 5024b59ab5eSdrh %right UMINUS UPLUS BITNOT. 5031f16230bSdrh %right ORACLE_OUTER_JOIN. 504348784efSdrh 505348784efSdrh %type expr {Expr*} 506348784efSdrh %destructor expr {sqliteExprDelete($$);} 507348784efSdrh 508e1b6a5b8Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E); } 509e1b6a5b8Sdrh expr(A) ::= NULL(X). {A = sqliteExpr(TK_NULL, 0, 0, &X);} 5105ad1a6c8Sdrh expr(A) ::= ID(X). {A = sqliteExpr(TK_ID, 0, 0, &X);} 5115ad1a6c8Sdrh expr(A) ::= JOIN_KW(X). {A = sqliteExpr(TK_ID, 0, 0, &X);} 5125ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 513e1b6a5b8Sdrh Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X); 514348784efSdrh Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y); 515e1b6a5b8Sdrh A = sqliteExpr(TK_DOT, temp1, temp2, 0); 516e1b6a5b8Sdrh } 5171f16230bSdrh expr(A) ::= expr(B) ORACLE_OUTER_JOIN. 5181f16230bSdrh {A = B; ExprSetProperty(A,EP_Oracle8Join);} 519348784efSdrh expr(A) ::= INTEGER(X). {A = sqliteExpr(TK_INTEGER, 0, 0, &X);} 520348784efSdrh expr(A) ::= FLOAT(X). {A = sqliteExpr(TK_FLOAT, 0, 0, &X);} 521348784efSdrh expr(A) ::= STRING(X). {A = sqliteExpr(TK_STRING, 0, 0, &X);} 522e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). { 523e1b6a5b8Sdrh A = sqliteExprFunction(Y, &X); 524e1b6a5b8Sdrh sqliteExprSpan(A,&X,&E); 525e1b6a5b8Sdrh } 526e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). { 527e1b6a5b8Sdrh A = sqliteExprFunction(0, &X); 528e1b6a5b8Sdrh sqliteExprSpan(A,&X,&E); 529e1b6a5b8Sdrh } 530348784efSdrh expr(A) ::= expr(X) AND expr(Y). {A = sqliteExpr(TK_AND, X, Y, 0);} 531348784efSdrh expr(A) ::= expr(X) OR expr(Y). {A = sqliteExpr(TK_OR, X, Y, 0);} 532348784efSdrh expr(A) ::= expr(X) LT expr(Y). {A = sqliteExpr(TK_LT, X, Y, 0);} 533348784efSdrh expr(A) ::= expr(X) GT expr(Y). {A = sqliteExpr(TK_GT, X, Y, 0);} 534348784efSdrh expr(A) ::= expr(X) LE expr(Y). {A = sqliteExpr(TK_LE, X, Y, 0);} 535348784efSdrh expr(A) ::= expr(X) GE expr(Y). {A = sqliteExpr(TK_GE, X, Y, 0);} 536348784efSdrh expr(A) ::= expr(X) NE expr(Y). {A = sqliteExpr(TK_NE, X, Y, 0);} 537348784efSdrh expr(A) ::= expr(X) EQ expr(Y). {A = sqliteExpr(TK_EQ, X, Y, 0);} 53881a20f21Sdrh expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);} 53981a20f21Sdrh expr(A) ::= expr(X) BITOR expr(Y). {A = sqliteExpr(TK_BITOR, X, Y, 0);} 54081a20f21Sdrh expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);} 54181a20f21Sdrh expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);} 5420ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE] { 5430ac65892Sdrh ExprList *pList = sqliteExprListAppend(0, Y, 0); 5440ac65892Sdrh pList = sqliteExprListAppend(pList, X, 0); 5454b59ab5eSdrh A = sqliteExprFunction(pList, 0); 5464b59ab5eSdrh if( A ) A->op = OP; 5476977fea8Sdrh sqliteExprSpan(A, &X->span, &Y->span); 5480ac65892Sdrh } 5490ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] { 5500ac65892Sdrh ExprList *pList = sqliteExprListAppend(0, Y, 0); 5510ac65892Sdrh pList = sqliteExprListAppend(pList, X, 0); 5524b59ab5eSdrh A = sqliteExprFunction(pList, 0); 5534b59ab5eSdrh if( A ) A->op = OP; 5544794b980Sdrh A = sqliteExpr(TK_NOT, A, 0, 0); 5556977fea8Sdrh sqliteExprSpan(A,&X->span,&Y->span); 5564794b980Sdrh } 5574b59ab5eSdrh %type likeop {int} 5584b59ab5eSdrh likeop(A) ::= LIKE. {A = TK_LIKE;} 5594b59ab5eSdrh likeop(A) ::= GLOB. {A = TK_GLOB;} 560348784efSdrh expr(A) ::= expr(X) PLUS expr(Y). {A = sqliteExpr(TK_PLUS, X, Y, 0);} 561348784efSdrh expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);} 562348784efSdrh expr(A) ::= expr(X) STAR expr(Y). {A = sqliteExpr(TK_STAR, X, Y, 0);} 563348784efSdrh expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);} 564bf4133cbSdrh expr(A) ::= expr(X) REM expr(Y). {A = sqliteExpr(TK_REM, X, Y, 0);} 5650040077dSdrh expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);} 566e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). { 567e1b6a5b8Sdrh A = sqliteExpr(TK_ISNULL, X, 0, 0); 5686977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 569e1b6a5b8Sdrh } 57033048c0bSdrh expr(A) ::= expr(X) IS NULL(E). { 57133048c0bSdrh A = sqliteExpr(TK_ISNULL, X, 0, 0); 5726977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 57333048c0bSdrh } 57433048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). { 57533048c0bSdrh A = sqliteExpr(TK_NOTNULL, X, 0, 0); 5766977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 57733048c0bSdrh } 578e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). { 579e1b6a5b8Sdrh A = sqliteExpr(TK_NOTNULL, X, 0, 0); 5806977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 581e1b6a5b8Sdrh } 58281a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). { 58381a20f21Sdrh A = sqliteExpr(TK_NOTNULL, X, 0, 0); 5846977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 58581a20f21Sdrh } 586e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). { 587e1b6a5b8Sdrh A = sqliteExpr(TK_NOT, X, 0, 0); 5886977fea8Sdrh sqliteExprSpan(A,&B,&X->span); 589e1b6a5b8Sdrh } 59081a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). { 59181a20f21Sdrh A = sqliteExpr(TK_BITNOT, X, 0, 0); 5926977fea8Sdrh sqliteExprSpan(A,&B,&X->span); 59381a20f21Sdrh } 594e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] { 595e1b6a5b8Sdrh A = sqliteExpr(TK_UMINUS, X, 0, 0); 5966977fea8Sdrh sqliteExprSpan(A,&B,&X->span); 597e1b6a5b8Sdrh } 5984b59ab5eSdrh expr(A) ::= PLUS(B) expr(X). [UPLUS] { 5994b59ab5eSdrh A = sqliteExpr(TK_UPLUS, X, 0, 0); 6006977fea8Sdrh sqliteExprSpan(A,&B,&X->span); 601e1b6a5b8Sdrh } 602e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). { 60319a775c2Sdrh A = sqliteExpr(TK_SELECT, 0, 0, 0); 604daffd0e5Sdrh if( A ) A->pSelect = X; 605e1b6a5b8Sdrh sqliteExprSpan(A,&B,&E); 60619a775c2Sdrh } 607fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). { 608fef5208cSdrh ExprList *pList = sqliteExprListAppend(0, X, 0); 609fef5208cSdrh pList = sqliteExprListAppend(pList, Y, 0); 610fef5208cSdrh A = sqliteExpr(TK_BETWEEN, W, 0, 0); 611daffd0e5Sdrh if( A ) A->pList = pList; 6126977fea8Sdrh sqliteExprSpan(A,&W->span,&Y->span); 613fef5208cSdrh } 6144794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). { 6154794b980Sdrh ExprList *pList = sqliteExprListAppend(0, X, 0); 6164794b980Sdrh pList = sqliteExprListAppend(pList, Y, 0); 6174794b980Sdrh A = sqliteExpr(TK_BETWEEN, W, 0, 0); 618daffd0e5Sdrh if( A ) A->pList = pList; 6194794b980Sdrh A = sqliteExpr(TK_NOT, A, 0, 0); 6206977fea8Sdrh sqliteExprSpan(A,&W->span,&Y->span); 6214794b980Sdrh } 622e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E). { 623fef5208cSdrh A = sqliteExpr(TK_IN, X, 0, 0); 624daffd0e5Sdrh if( A ) A->pList = Y; 6256977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 626fef5208cSdrh } 627e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E). { 628fef5208cSdrh A = sqliteExpr(TK_IN, X, 0, 0); 629daffd0e5Sdrh if( A ) A->pSelect = Y; 6306977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 631fef5208cSdrh } 632e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E). { 6334794b980Sdrh A = sqliteExpr(TK_IN, X, 0, 0); 634daffd0e5Sdrh if( A ) A->pList = Y; 6354794b980Sdrh A = sqliteExpr(TK_NOT, A, 0, 0); 6366977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 6374794b980Sdrh } 638e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E). { 6394794b980Sdrh A = sqliteExpr(TK_IN, X, 0, 0); 640daffd0e5Sdrh if( A ) A->pSelect = Y; 6414794b980Sdrh A = sqliteExpr(TK_NOT, A, 0, 0); 6426977fea8Sdrh sqliteExprSpan(A,&X->span,&E); 6434794b980Sdrh } 644fef5208cSdrh 64517a7f8ddSdrh /* CASE expressions */ 64617a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { 64717a7f8ddSdrh A = sqliteExpr(TK_CASE, X, Z, 0); 64817a7f8ddSdrh if( A ) A->pList = Y; 64917a7f8ddSdrh sqliteExprSpan(A, &C, &E); 65017a7f8ddSdrh } 65117a7f8ddSdrh %type case_exprlist {ExprList*} 65217a7f8ddSdrh %destructor case_exprlist {sqliteExprListDelete($$);} 65317a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { 65417a7f8ddSdrh A = sqliteExprListAppend(X, Y, 0); 65517a7f8ddSdrh A = sqliteExprListAppend(A, Z, 0); 65617a7f8ddSdrh } 65717a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 65817a7f8ddSdrh A = sqliteExprListAppend(0, Y, 0); 65917a7f8ddSdrh A = sqliteExprListAppend(A, Z, 0); 66017a7f8ddSdrh } 66117a7f8ddSdrh %type case_else {Expr*} 66217a7f8ddSdrh case_else(A) ::= ELSE expr(X). {A = X;} 66317a7f8ddSdrh case_else(A) ::= . {A = 0;} 66417a7f8ddSdrh %type case_operand {Expr*} 66517a7f8ddSdrh case_operand(A) ::= expr(X). {A = X;} 66617a7f8ddSdrh case_operand(A) ::= . {A = 0;} 667348784efSdrh 668348784efSdrh %type exprlist {ExprList*} 669348784efSdrh %destructor exprlist {sqliteExprListDelete($$);} 670348784efSdrh %type expritem {Expr*} 671348784efSdrh %destructor expritem {sqliteExprDelete($$);} 672348784efSdrh 673348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y). 674348784efSdrh {A = sqliteExprListAppend(X,Y,0);} 675348784efSdrh exprlist(A) ::= expritem(X). {A = sqliteExprListAppend(0,X,0);} 676348784efSdrh expritem(A) ::= expr(X). {A = X;} 677348784efSdrh expritem(A) ::= . {A = 0;} 678cce7d176Sdrh 679382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 680382c0247Sdrh // 6815ad1a6c8Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) 6825ad1a6c8Sdrh ON nm(Y) LP idxlist(Z) RP(E) onconf(R). { 6839cfcf5d4Sdrh if( U!=OE_None ) U = R; 6849cfcf5d4Sdrh if( U==OE_Default) U = OE_Abort; 6859cfcf5d4Sdrh sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E); 6869cfcf5d4Sdrh } 687717e6402Sdrh 688717e6402Sdrh %type uniqueflag {int} 6899cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. { A = OE_Abort; } 6909cfcf5d4Sdrh uniqueflag(A) ::= . { A = OE_None; } 691348784efSdrh 692348784efSdrh %type idxlist {IdList*} 693348784efSdrh %destructor idxlist {sqliteIdListDelete($$);} 694c2eef3b3Sdrh %type idxlist_opt {IdList*} 695c2eef3b3Sdrh %destructor idxlist_opt {sqliteIdListDelete($$);} 696348784efSdrh %type idxitem {Token} 697348784efSdrh 698c2eef3b3Sdrh idxlist_opt(A) ::= . {A = 0;} 699c2eef3b3Sdrh idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} 700c2eef3b3Sdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y). {A = sqliteIdListAppend(X,&Y);} 701c2eef3b3Sdrh idxlist(A) ::= idxitem(Y). {A = sqliteIdListAppend(0,&Y);} 7025ad1a6c8Sdrh idxitem(A) ::= nm(X). {A = X;} 703348784efSdrh 7048aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 705382c0247Sdrh // 706382c0247Sdrh 7075ad1a6c8Sdrh cmd ::= DROP INDEX nm(X). {sqliteDropIndex(pParse, &X);} 708982cef7eSdrh 709382c0247Sdrh 7108aff1015Sdrh ///////////////////////////// The COPY command /////////////////////////////// 711382c0247Sdrh // 7125ad1a6c8Sdrh cmd ::= COPY orconf(R) nm(X) FROM nm(Y) USING DELIMITERS STRING(Z). 713b419a926Sdrh {sqliteCopy(pParse,&X,&Y,&Z,R);} 7145ad1a6c8Sdrh cmd ::= COPY orconf(R) nm(X) FROM nm(Y). 715b419a926Sdrh {sqliteCopy(pParse,&X,&Y,0,R);} 716dce2cbe6Sdrh 717382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 718382c0247Sdrh // 719dce2cbe6Sdrh cmd ::= VACUUM. {sqliteVacuum(pParse,0);} 7205ad1a6c8Sdrh cmd ::= VACUUM nm(X). {sqliteVacuum(pParse,&X);} 721f57b14a6Sdrh 722382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 723382c0247Sdrh // 7245ad1a6c8Sdrh cmd ::= PRAGMA ids(X) EQ nm(Y). {sqlitePragma(pParse,&X,&Y,0);} 725f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ON(Y). {sqlitePragma(pParse,&X,&Y,0);} 726f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ plus_num(Y). {sqlitePragma(pParse,&X,&Y,0);} 727f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ minus_num(Y). {sqlitePragma(pParse,&X,&Y,1);} 7285ad1a6c8Sdrh cmd ::= PRAGMA ids(X) LP nm(Y) RP. {sqlitePragma(pParse,&X,&Y,0);} 729603240cfSdrh cmd ::= PRAGMA ids(X). {sqlitePragma(pParse,&X,&X,0);} 730f57b14a6Sdrh plus_num(A) ::= plus_opt number(X). {A = X;} 731f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 732f57b14a6Sdrh number(A) ::= INTEGER(X). {A = X;} 733f57b14a6Sdrh number(A) ::= FLOAT(X). {A = X;} 734f57b14a6Sdrh plus_opt ::= PLUS. 735f57b14a6Sdrh plus_opt ::= . 736c3f9bad2Sdanielk1977 737c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 7385ad1a6c8Sdrh cmd ::= CREATE(A) TRIGGER nm(B) trigger_time(C) trigger_event(D) ON nm(E) 739c3f9bad2Sdanielk1977 foreach_clause(F) when_clause(G) 740c3f9bad2Sdanielk1977 BEGIN trigger_cmd_list(S) END(Z). { 7414b59ab5eSdrh Token all; 7424b59ab5eSdrh all.z = A.z; 7434b59ab5eSdrh all.n = (Z.z - A.z) + Z.n; 7444b59ab5eSdrh sqliteCreateTrigger(pParse, &B, C, D.a, D.b, &E, F, G, S, &all); 745c3f9bad2Sdanielk1977 } 746c3f9bad2Sdanielk1977 747c3f9bad2Sdanielk1977 %type trigger_time {int} 748c3f9bad2Sdanielk1977 trigger_time(A) ::= BEFORE. { A = TK_BEFORE; } 749c3f9bad2Sdanielk1977 trigger_time(A) ::= AFTER. { A = TK_AFTER; } 750c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 751c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 752c3f9bad2Sdanielk1977 753ad3cab52Sdrh %type trigger_event {struct TrigEvent} 754ad3cab52Sdrh %destructor trigger_event {sqliteIdListDelete($$.b);} 755c3f9bad2Sdanielk1977 trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; } 756c3f9bad2Sdanielk1977 trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; } 757c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;} 758c3f9bad2Sdanielk1977 trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; } 759c3f9bad2Sdanielk1977 760c3f9bad2Sdanielk1977 %type foreach_clause {int} 761c3f9bad2Sdanielk1977 foreach_clause(A) ::= . { A = TK_ROW; } 762c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; } 763c3f9bad2Sdanielk1977 foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; } 764c3f9bad2Sdanielk1977 765c3f9bad2Sdanielk1977 %type when_clause {Expr *} 766c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 767c3f9bad2Sdanielk1977 when_clause(A) ::= WHEN expr(X). { A = X; } 768c3f9bad2Sdanielk1977 769c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep *} 770c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { 771c3f9bad2Sdanielk1977 X->pNext = Y ; A = X; } 772c3f9bad2Sdanielk1977 trigger_cmd_list(A) ::= . { A = 0; } 773c3f9bad2Sdanielk1977 774c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep *} 775c3f9bad2Sdanielk1977 // UPDATE 7765ad1a6c8Sdrh trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). 777c3f9bad2Sdanielk1977 { A = sqliteTriggerUpdateStep(&X, Y, Z, R); } 778c3f9bad2Sdanielk1977 779c3f9bad2Sdanielk1977 // INSERT 7805ad1a6c8Sdrh trigger_cmd(A) ::= INSERT orconf(R) INTO nm(X) inscollist_opt(F) 781c3f9bad2Sdanielk1977 VALUES LP itemlist(Y) RP. 782c3f9bad2Sdanielk1977 {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);} 783c3f9bad2Sdanielk1977 7845ad1a6c8Sdrh trigger_cmd(A) ::= INSERT orconf(R) INTO nm(X) inscollist_opt(F) select(S). 785c3f9bad2Sdanielk1977 {A = sqliteTriggerInsertStep(&X, F, 0, S, R);} 786c3f9bad2Sdanielk1977 787c3f9bad2Sdanielk1977 // DELETE 7885ad1a6c8Sdrh trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). 789c3f9bad2Sdanielk1977 {A = sqliteTriggerDeleteStep(&X, Y);} 790c3f9bad2Sdanielk1977 791c3f9bad2Sdanielk1977 // SELECT 792c3f9bad2Sdanielk1977 trigger_cmd(A) ::= select(X). {A = sqliteTriggerSelectStep(X); } 793c3f9bad2Sdanielk1977 7946f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 7954b59ab5eSdrh expr(A) ::= RAISE(X) LP IGNORE RP(Y). { 7964b59ab5eSdrh A = sqliteExpr(TK_RAISE, 0, 0, 0); 7974b59ab5eSdrh A->iColumn = OE_Ignore; 7986977fea8Sdrh sqliteExprSpan(A, &X, &Y); 7994b59ab5eSdrh } 8004b59ab5eSdrh expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y). { 8014b59ab5eSdrh A = sqliteExpr(TK_RAISE, 0, 0, &Z); 8024b59ab5eSdrh A->iColumn = OE_Rollback; 8036977fea8Sdrh sqliteExprSpan(A, &X, &Y); 8044b59ab5eSdrh } 8054b59ab5eSdrh expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y). { 8064b59ab5eSdrh A = sqliteExpr(TK_RAISE, 0, 0, &Z); 8074b59ab5eSdrh A->iColumn = OE_Abort; 8086977fea8Sdrh sqliteExprSpan(A, &X, &Y); 8094b59ab5eSdrh } 8104b59ab5eSdrh expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y). { 8114b59ab5eSdrh A = sqliteExpr(TK_RAISE, 0, 0, &Z); 8124b59ab5eSdrh A->iColumn = OE_Fail; 8136977fea8Sdrh sqliteExprSpan(A, &X, &Y); 8144b59ab5eSdrh } 8156f34903eSdanielk1977 816c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 8175ad1a6c8Sdrh cmd ::= DROP TRIGGER nm(X). { 818c3f9bad2Sdanielk1977 sqliteDropTrigger(pParse,&X,0); 819c3f9bad2Sdanielk1977 } 820