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 */ 17487e262fSdrh 18487e262fSdrh // All token codes are small integers with #defines that begin with "TK_" 19348784efSdrh %token_prefix TK_ 20487e262fSdrh 21487e262fSdrh // The type of the data attached to each token is Token. This is also the 22487e262fSdrh // default type for non-terminals. 23487e262fSdrh // 24348784efSdrh %token_type {Token} 25f57b14a6Sdrh %default_type {Token} 26487e262fSdrh 27487e262fSdrh // The generated parser function takes a 4th argument as follows: 28348784efSdrh %extra_argument {Parse *pParse} 29487e262fSdrh 30487e262fSdrh // This code runs whenever there is a syntax error 31487e262fSdrh // 32348784efSdrh %syntax_error { 33128255fcSdrh UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ 34*6116ee4eSdrh if( TOKEN.z[0] ){ 354adee20fSdanielk1977 sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); 36*6116ee4eSdrh }else{ 37*6116ee4eSdrh sqlite3ErrorMsg(pParse, "incomplete input"); 38*6116ee4eSdrh } 39b86ccfb2Sdrh } 408fc3345fSdrh %stack_overflow { 418fc3345fSdrh sqlite3ErrorMsg(pParse, "parser stack overflow"); 428fc3345fSdrh } 43487e262fSdrh 44487e262fSdrh // The name of the generated procedure that implements the parser 45487e262fSdrh // is as follows: 464adee20fSdanielk1977 %name sqlite3Parser 47487e262fSdrh 48487e262fSdrh // The following text is included near the beginning of the C source 49487e262fSdrh // code file that implements the parser. 50487e262fSdrh // 51348784efSdrh %include { 52348784efSdrh #include "sqliteInt.h" 539bbca4c1Sdrh 549bbca4c1Sdrh /* 55d3ec02d3Sdrh ** Disable all error recovery processing in the parser push-down 56d3ec02d3Sdrh ** automaton. 57d3ec02d3Sdrh */ 58d3ec02d3Sdrh #define YYNOERRORRECOVERY 1 59d3ec02d3Sdrh 60d3ec02d3Sdrh /* 618a415d37Sdrh ** Make yytestcase() the same as testcase() 628a415d37Sdrh */ 638a415d37Sdrh #define yytestcase(X) testcase(X) 648a415d37Sdrh 658a415d37Sdrh /* 6682415f2dSdrh ** Indicate that sqlite3ParserFree() will never be called with a null 6782415f2dSdrh ** pointer. 6882415f2dSdrh */ 69644f4c1bSdrh #define YYPARSEFREENEVERNULL 1 7082415f2dSdrh 7182415f2dSdrh /* 72d26cc541Sdrh ** In the amalgamation, the parse.c file generated by lemon and the 73d26cc541Sdrh ** tokenize.c file are concatenated. In that case, sqlite3RunParser() 74d26cc541Sdrh ** has access to the the size of the yyParser object and so the parser 75d26cc541Sdrh ** engine can be allocated from stack. In that case, only the 76d26cc541Sdrh ** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked 77d26cc541Sdrh ** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be 78d26cc541Sdrh ** omitted. 79d26cc541Sdrh */ 80d26cc541Sdrh #ifdef SQLITE_AMALGAMATION 81d26cc541Sdrh # define sqlite3Parser_ENGINEALWAYSONSTACK 1 82d26cc541Sdrh #endif 83d26cc541Sdrh 84d26cc541Sdrh /* 8582415f2dSdrh ** Alternative datatype for the argument to the malloc() routine passed 8682415f2dSdrh ** into sqlite3ParserAlloc(). The default is size_t. 8782415f2dSdrh */ 8882415f2dSdrh #define YYMALLOCARGTYPE u64 8982415f2dSdrh 9082415f2dSdrh /* 91ad3cab52Sdrh ** An instance of the following structure describes the event of a 92ad3cab52Sdrh ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, 93ad3cab52Sdrh ** TK_DELETE, or TK_INSTEAD. If the event is of the form 94ad3cab52Sdrh ** 95ad3cab52Sdrh ** UPDATE ON (a,b,c) 96ad3cab52Sdrh ** 97ad3cab52Sdrh ** Then the "b" IdList records the list "a,b,c". 98c3f9bad2Sdanielk1977 */ 99ad3cab52Sdrh struct TrigEvent { int a; IdList * b; }; 100caec2f12Sdrh 10125d6543dSdrh /* 1024a642b60Sdrh ** Disable lookaside memory allocation for objects that might be 1034a642b60Sdrh ** shared across database connections. 1044a642b60Sdrh */ 1054a642b60Sdrh static void disableLookaside(Parse *pParse){ 1064a642b60Sdrh pParse->disableLookaside++; 1074a642b60Sdrh pParse->db->lookaside.bDisable++; 1084a642b60Sdrh } 1094a642b60Sdrh 110caec2f12Sdrh } // end %include 111348784efSdrh 112826fb5a3Sdrh // Input is a single SQL command 113c4a3c779Sdrh input ::= cmdlist. 114094b2bbfSdrh cmdlist ::= cmdlist ecmd. 115826fb5a3Sdrh cmdlist ::= ecmd. 116b7f9164eSdrh ecmd ::= SEMI. 117b7f9164eSdrh ecmd ::= explain cmdx SEMI. 1188549d55eSdrh explain ::= . 119b7f9164eSdrh %ifndef SQLITE_OMIT_EXPLAIN 1208549d55eSdrh explain ::= EXPLAIN. { pParse->explain = 1; } 1218549d55eSdrh explain ::= EXPLAIN QUERY PLAN. { pParse->explain = 2; } 122154d4b24Sdrh %endif SQLITE_OMIT_EXPLAIN 123200a81dcSdrh cmdx ::= cmd. { sqlite3FinishCoding(pParse); } 124348784efSdrh 125382c0247Sdrh ///////////////////// Begin and end transactions. //////////////////////////// 126c4a3c779Sdrh // 127fa86c412Sdrh 128684917c2Sdrh cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);} 129c4a3c779Sdrh trans_opt ::= . 130c4a3c779Sdrh trans_opt ::= TRANSACTION. 1315ad1a6c8Sdrh trans_opt ::= TRANSACTION nm. 132684917c2Sdrh %type transtype {int} 133684917c2Sdrh transtype(A) ::= . {A = TK_DEFERRED;} 134cf82f0d3Sdrh transtype(A) ::= DEFERRED(X). {A = @X; /*A-overwrites-X*/} 135cf82f0d3Sdrh transtype(A) ::= IMMEDIATE(X). {A = @X; /*A-overwrites-X*/} 136cf82f0d3Sdrh transtype(A) ::= EXCLUSIVE(X). {A = @X; /*A-overwrites-X*/} 13707a3b11aSdrh cmd ::= COMMIT|END(X) trans_opt. {sqlite3EndTransaction(pParse,@X);} 13807a3b11aSdrh cmd ::= ROLLBACK(X) trans_opt. {sqlite3EndTransaction(pParse,@X);} 139c4a3c779Sdrh 140fd7f0452Sdanielk1977 savepoint_opt ::= SAVEPOINT. 141fd7f0452Sdanielk1977 savepoint_opt ::= . 142fd7f0452Sdanielk1977 cmd ::= SAVEPOINT nm(X). { 143fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X); 144fd7f0452Sdanielk1977 } 145fd7f0452Sdanielk1977 cmd ::= RELEASE savepoint_opt nm(X). { 146fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X); 147fd7f0452Sdanielk1977 } 148fd7f0452Sdanielk1977 cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). { 149fd7f0452Sdanielk1977 sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X); 150fd7f0452Sdanielk1977 } 151fd7f0452Sdanielk1977 152382c0247Sdrh ///////////////////// The CREATE TABLE statement //////////////////////////// 153348784efSdrh // 154348784efSdrh cmd ::= create_table create_table_args. 155d9da78a2Sdrh create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { 156f1a381e7Sdanielk1977 sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); 157969fa7c1Sdrh } 158dabd04c6Sdrh createkw(A) ::= CREATE(A). {disableLookaside(pParse);} 159dabd04c6Sdrh 160faa59554Sdrh %type ifnotexists {int} 161faa59554Sdrh ifnotexists(A) ::= . {A = 0;} 162faa59554Sdrh ifnotexists(A) ::= IF NOT EXISTS. {A = 1;} 163f57b3399Sdrh %type temp {int} 16453c0f748Sdanielk1977 %ifndef SQLITE_OMIT_TEMPDB 165d24cc427Sdrh temp(A) ::= TEMP. {A = 1;} 166154d4b24Sdrh %endif SQLITE_OMIT_TEMPDB 167d24cc427Sdrh temp(A) ::= . {A = 0;} 1685969da4aSdrh create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). { 1695969da4aSdrh sqlite3EndTable(pParse,&X,&E,F,0); 170969fa7c1Sdrh } 171969fa7c1Sdrh create_table_args ::= AS select(S). { 1725969da4aSdrh sqlite3EndTable(pParse,0,0,0,S); 173633e6d57Sdrh sqlite3SelectDelete(pParse->db, S); 174969fa7c1Sdrh } 1753334d089Sdrh %type table_options {int} 1765969da4aSdrh table_options(A) ::= . {A = 0;} 1775969da4aSdrh table_options(A) ::= WITHOUT nm(X). { 1785969da4aSdrh if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){ 179fccda8a1Sdrh A = TF_WithoutRowid | TF_NoVisibleRowid; 1805969da4aSdrh }else{ 1815969da4aSdrh A = 0; 1825969da4aSdrh sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); 1835969da4aSdrh } 1845969da4aSdrh } 185986dde70Sdrh columnlist ::= columnlist COMMA columnname carglist. 186986dde70Sdrh columnlist ::= columnname carglist. 1872881ab62Sdrh columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);} 188c4a3c779Sdrh 1896a8700b9Sdrh // Declare some tokens early in order to influence their values, to 1906a8700b9Sdrh // improve performance and reduce the executable size. The goal here is 1916a8700b9Sdrh // to get the "jump" operations in ISNULL through ESCAPE to have numeric 1926a8700b9Sdrh // values that are early enough so that all jump operations are clustered 1936a8700b9Sdrh // at the beginning, but also so that the comparison tokens NE through GE 1946a8700b9Sdrh // are as large as possible so that they are near to FUNCTION, which is a 1956a8700b9Sdrh // token synthesized by addopcodes.tcl. 1966a8700b9Sdrh // 1976a8700b9Sdrh %token ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST. 1986a8700b9Sdrh %token CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL. 1996a8700b9Sdrh %token OR AND NOT IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2006a8700b9Sdrh %token GT LE LT GE ESCAPE. 2016a8700b9Sdrh 20231d6fd55Sdrh // The following directive causes tokens ABORT, AFTER, ASC, etc. to 20331d6fd55Sdrh // fallback to ID if they will not parse as their original value. 20431d6fd55Sdrh // This obviates the need for the "id" nonterminal. 20531d6fd55Sdrh // 20631d6fd55Sdrh %fallback ID 20731d6fd55Sdrh ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW 20831d6fd55Sdrh CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR 20931d6fd55Sdrh IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN 21031d6fd55Sdrh QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW 21131d6fd55Sdrh ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT 21231d6fd55Sdrh %ifdef SQLITE_OMIT_COMPOUND_SELECT 21331d6fd55Sdrh EXCEPT INTERSECT UNION 21431d6fd55Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 21531d6fd55Sdrh REINDEX RENAME CTIME_KW IF 21631d6fd55Sdrh . 21731d6fd55Sdrh %wildcard ANY. 21831d6fd55Sdrh 219f7b5496eSdrh // Define operator precedence early so that this is the first occurrence 2202d3917daSdrh // of the operator tokens in the grammer. Keeping the operators together 2212d3917daSdrh // causes them to be assigned integer values that are close together, 2222d3917daSdrh // which keeps parser tables smaller. 2232d3917daSdrh // 224f2bc013cSdrh // The token values assigned to these symbols is determined by the order 225f2bc013cSdrh // in which lemon first sees them. It must be the case that ISNULL/NOTNULL, 226f2bc013cSdrh // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See 227f2bc013cSdrh // the sqlite3ExprIfFalse() routine for additional information on this 228f2bc013cSdrh // constraint. 229f2bc013cSdrh // 2302d3917daSdrh %left OR. 2312d3917daSdrh %left AND. 2322d3917daSdrh %right NOT. 23303bea70cSdrh %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ. 2349a43267bSdrh %left GT LE LT GE. 2357c6303c0Sdanielk1977 %right ESCAPE. 2362d3917daSdrh %left BITAND BITOR LSHIFT RSHIFT. 2372d3917daSdrh %left PLUS MINUS. 2382d3917daSdrh %left STAR SLASH REM. 239a34001c9Sdrh %left CONCAT. 240a34001c9Sdrh %left COLLATE. 2417ba5bc5bSdrh %right BITNOT. 2422d3917daSdrh 2437cc84c2cSdrh // An IDENTIFIER can be a generic identifier, or one of several 2447cc84c2cSdrh // keywords. Any non-standard keyword can also be an identifier. 2457cc84c2cSdrh // 2467cc84c2cSdrh %token_class id ID|INDEXED. 2477cc84c2cSdrh 2487cc84c2cSdrh 249c4a3c779Sdrh // And "ids" is an identifer-or-string. 250c4a3c779Sdrh // 251f59b12fbSdrh %token_class ids ID|STRING. 252c4a3c779Sdrh 2535ad1a6c8Sdrh // The name of a column or table can be any of the following: 2545ad1a6c8Sdrh // 2555ad1a6c8Sdrh %type nm {Token} 2564dd0d3f8Sdrh nm(A) ::= id(A). 2574dd0d3f8Sdrh nm(A) ::= STRING(A). 2584dd0d3f8Sdrh nm(A) ::= JOIN_KW(A). 2595ad1a6c8Sdrh 260986dde70Sdrh // A typetoken is really zero or more tokens that form a type name such 261487e262fSdrh // as can be found after the column name in a CREATE TABLE statement. 262487e262fSdrh // Multiple tokens are concatenated to form the value of the typetoken. 263487e262fSdrh // 264487e262fSdrh %type typetoken {Token} 265986dde70Sdrh typetoken(A) ::= . {A.n = 0; A.z = 0;} 2664dd0d3f8Sdrh typetoken(A) ::= typename(A). 2674dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed RP(Y). { 2684dd0d3f8Sdrh A.n = (int)(&Y.z[Y.n] - A.z); 269487e262fSdrh } 2704dd0d3f8Sdrh typetoken(A) ::= typename(A) LP signed COMMA signed RP(Y). { 2714dd0d3f8Sdrh A.n = (int)(&Y.z[Y.n] - A.z); 272487e262fSdrh } 273382c0247Sdrh %type typename {Token} 2744dd0d3f8Sdrh typename(A) ::= ids(A). 2754dd0d3f8Sdrh typename(A) ::= typename(A) ids(Y). {A.n=Y.n+(int)(Y.z-A.z);} 27660218d2aSdrh signed ::= plus_num. 27760218d2aSdrh signed ::= minus_num. 278487e262fSdrh 2791be266baSdrh // The scanpt non-terminal takes a value which is a pointer to the 2801be266baSdrh // input text just past the last token that has been shifted into 2811be266baSdrh // the parser. By surrounding some phrase in the grammar with two 2821be266baSdrh // scanpt non-terminals, we can capture the input text for that phrase. 2831be266baSdrh // For example: 2841be266baSdrh // 2851be266baSdrh // something ::= .... scanpt(A) phrase scanpt(Z). 2861be266baSdrh // 2871be266baSdrh // The text that is parsed as "phrase" is a string starting at A 2881be266baSdrh // and containing (int)(Z-A) characters. There might be some extra 2891be266baSdrh // whitespace on either end of the text, but that can be removed in 2901be266baSdrh // post-processing, if needed. 2911be266baSdrh // 2921be266baSdrh %type scanpt {const char*} 2931be266baSdrh scanpt(A) ::= . { 294f259df5fSdrh assert( yyLookahead!=YYNOCODE ); 2951be266baSdrh A = yyLookaheadToken.z; 2961be266baSdrh } 2971be266baSdrh 298487e262fSdrh // "carglist" is a list of additional constraints that come after the 299487e262fSdrh // column name and column type in a CREATE TABLE statement. 300487e262fSdrh // 3014dc330ddSdrh carglist ::= carglist ccons. 302348784efSdrh carglist ::= . 3034dc330ddSdrh ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 3041be266baSdrh ccons ::= DEFAULT scanpt(A) term(X) scanpt(Z). 3051be266baSdrh {sqlite3AddDefaultValue(pParse,X,A,Z);} 3061be266baSdrh ccons ::= DEFAULT LP(A) expr(X) RP(Z). 3071be266baSdrh {sqlite3AddDefaultValue(pParse,X,A.z+1,Z.z);} 3081be266baSdrh ccons ::= DEFAULT PLUS(A) term(X) scanpt(Z). 3091be266baSdrh {sqlite3AddDefaultValue(pParse,X,A.z,Z);} 3101be266baSdrh ccons ::= DEFAULT MINUS(A) term(X) scanpt(Z). { 3111be266baSdrh Expr *p = sqlite3PExpr(pParse, TK_UMINUS, X, 0); 3121be266baSdrh sqlite3AddDefaultValue(pParse,p,A.z,Z); 3137977a17fSdanielk1977 } 3141be266baSdrh ccons ::= DEFAULT scanpt id(X). { 3151be266baSdrh Expr *p = tokenExpr(pParse, TK_STRING, X); 3161be266baSdrh sqlite3AddDefaultValue(pParse,p,X.z,X.z+X.n); 3177977a17fSdanielk1977 } 318348784efSdrh 319382c0247Sdrh // In addition to the type name, we also care about the primary key and 320382c0247Sdrh // UNIQUE constraints. 321348784efSdrh // 3220d316a40Sdrh ccons ::= NULL onconf. 3234adee20fSdanielk1977 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} 324fdd6e85aSdrh ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). 325fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} 32662340f84Sdrh ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0, 32762340f84Sdrh SQLITE_IDXTYPE_UNIQUE);} 3281be266baSdrh ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X);} 329108aa00aSdrh ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R). 3304adee20fSdanielk1977 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} 3314adee20fSdanielk1977 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} 33239002505Sdanielk1977 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} 33304738cb9Sdrh 334205f48e6Sdrh // The optional AUTOINCREMENT keyword 335205f48e6Sdrh %type autoinc {int} 336205f48e6Sdrh autoinc(X) ::= . {X = 0;} 3372958a4e6Sdrh autoinc(X) ::= AUTOINCR. {X = 1;} 338205f48e6Sdrh 339c2eef3b3Sdrh // The next group of rules parses the arguments to a REFERENCES clause 340c2eef3b3Sdrh // that determine if the referential integrity checking is deferred or 341c2eef3b3Sdrh // or immediate and which determine what action to take if a ref-integ 342c2eef3b3Sdrh // check fails. 34304738cb9Sdrh // 344c2eef3b3Sdrh %type refargs {int} 345fcf486c3Sdrh refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */} 3464dd0d3f8Sdrh refargs(A) ::= refargs(A) refarg(Y). { A = (A & ~Y.mask) | Y.value; } 347c2eef3b3Sdrh %type refarg {struct {int value; int mask;}} 348c2eef3b3Sdrh refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; } 349c29c5aa1Sdrh refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; } 350c2eef3b3Sdrh refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; } 351c2eef3b3Sdrh refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; } 352c2eef3b3Sdrh %type refact {int} 353fcf486c3Sdrh refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */} 354fcf486c3Sdrh refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */} 355fcf486c3Sdrh refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */} 356fcf486c3Sdrh refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */} 357fcf486c3Sdrh refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */} 358c2eef3b3Sdrh %type defer_subclause {int} 3591da40a38Sdan defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;} 360c2eef3b3Sdrh defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;} 361c2eef3b3Sdrh %type init_deferred_pred_opt {int} 362c2eef3b3Sdrh init_deferred_pred_opt(A) ::= . {A = 0;} 363c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} 364c2eef3b3Sdrh init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} 365348784efSdrh 36619a8e7e8Sdanielk1977 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} 3674dd0d3f8Sdrh conslist_opt(A) ::= COMMA(A) conslist. 368ab35eaedSdrh conslist ::= conslist tconscomma tcons. 369ab35eaedSdrh conslist ::= tcons. 370ab35eaedSdrh tconscomma ::= COMMA. {pParse->constraintName.n = 0;} 371ab35eaedSdrh tconscomma ::= . 372ab35eaedSdrh tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} 373108aa00aSdrh tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R). 374fdd6e85aSdrh {sqlite3AddPrimaryKey(pParse,X,R,I,0);} 375108aa00aSdrh tcons ::= UNIQUE LP sortlist(X) RP onconf(R). 37662340f84Sdrh {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0, 37762340f84Sdrh SQLITE_IDXTYPE_UNIQUE);} 378b7916a78Sdrh tcons ::= CHECK LP expr(E) RP onconf. 3791be266baSdrh {sqlite3AddCheckConstraint(pParse,E);} 380108aa00aSdrh tcons ::= FOREIGN KEY LP eidlist(FA) RP 381108aa00aSdrh REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). { 3824adee20fSdanielk1977 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); 3834adee20fSdanielk1977 sqlite3DeferForeignKey(pParse, D); 384c2eef3b3Sdrh } 385c2eef3b3Sdrh %type defer_subclause_opt {int} 386c2eef3b3Sdrh defer_subclause_opt(A) ::= . {A = 0;} 3874dd0d3f8Sdrh defer_subclause_opt(A) ::= defer_subclause(A). 3889cfcf5d4Sdrh 3899cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the 3909cfcf5d4Sdrh // default behavior when there is a constraint conflict. 3919cfcf5d4Sdrh // 3929cfcf5d4Sdrh %type onconf {int} 3933334d089Sdrh %type orconf {int} 3941c92853dSdrh %type resolvetype {int} 3951c92853dSdrh onconf(A) ::= . {A = OE_Default;} 3961c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} 3971c92853dSdrh orconf(A) ::= . {A = OE_Default;} 3983334d089Sdrh orconf(A) ::= OR resolvetype(X). {A = X;} 3994dd0d3f8Sdrh resolvetype(A) ::= raisetype(A). 4001c92853dSdrh resolvetype(A) ::= IGNORE. {A = OE_Ignore;} 4011c92853dSdrh resolvetype(A) ::= REPLACE. {A = OE_Replace;} 402348784efSdrh 403382c0247Sdrh ////////////////////////// The DROP TABLE ///////////////////////////////////// 404348784efSdrh // 405a073384fSdrh cmd ::= DROP TABLE ifexists(E) fullname(X). { 406a073384fSdrh sqlite3DropTable(pParse, X, 0, E); 407a8858103Sdanielk1977 } 408a073384fSdrh %type ifexists {int} 409a073384fSdrh ifexists(A) ::= IF EXISTS. {A = 1;} 410a073384fSdrh ifexists(A) ::= . {A = 0;} 411348784efSdrh 412a76b5dfcSdrh ///////////////////// The CREATE VIEW statement ///////////////////////////// 413a76b5dfcSdrh // 414b7f9164eSdrh %ifndef SQLITE_OMIT_VIEW 415108aa00aSdrh cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C) 4168981b904Sdrh AS select(S). { 4178981b904Sdrh sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E); 418a76b5dfcSdrh } 419a073384fSdrh cmd ::= DROP VIEW ifexists(E) fullname(X). { 420a073384fSdrh sqlite3DropTable(pParse, X, 1, E); 421a76b5dfcSdrh } 422154d4b24Sdrh %endif SQLITE_OMIT_VIEW 423a76b5dfcSdrh 424382c0247Sdrh //////////////////////// The SELECT statement ///////////////////////////////// 425348784efSdrh // 4267d562dbeSdan cmd ::= select(X). { 427edf83d1eSdrh SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; 4287d10d5a6Sdrh sqlite3Select(pParse, X, &dest); 429633e6d57Sdrh sqlite3SelectDelete(pParse->db, X); 4309bb61fe7Sdrh } 431efb7251dSdrh 4329bb61fe7Sdrh %type select {Select*} 433633e6d57Sdrh %destructor select {sqlite3SelectDelete(pParse->db, $$);} 4347d562dbeSdan %type selectnowith {Select*} 4357d562dbeSdan %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);} 43682c3d636Sdrh %type oneselect {Select*} 437633e6d57Sdrh %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} 4389bb61fe7Sdrh 439772460fdSdrh %include { 440772460fdSdrh /* 441772460fdSdrh ** For a compound SELECT statement, make sure p->pPrior->pNext==p for 442772460fdSdrh ** all elements in the list. And make sure list length does not exceed 443772460fdSdrh ** SQLITE_LIMIT_COMPOUND_SELECT. 444772460fdSdrh */ 445e318a7f8Sdrh static void parserDoubleLinkSelect(Parse *pParse, Select *p){ 446d227a291Sdrh if( p->pPrior ){ 447772460fdSdrh Select *pNext = 0, *pLoop; 448772460fdSdrh int mxSelect, cnt = 0; 449d227a291Sdrh for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ 450d227a291Sdrh pLoop->pNext = pNext; 451d227a291Sdrh pLoop->selFlags |= SF_Compound; 452d227a291Sdrh } 453772460fdSdrh if( (p->selFlags & SF_MultiValue)==0 && 454772460fdSdrh (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && 455772460fdSdrh cnt>mxSelect 456a0c01768Sdrh ){ 457d227a291Sdrh sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); 458d227a291Sdrh } 459d227a291Sdrh } 460772460fdSdrh } 461772460fdSdrh } 462772460fdSdrh 463772460fdSdrh select(A) ::= with(W) selectnowith(X). { 464772460fdSdrh Select *p = X; 465772460fdSdrh if( p ){ 466772460fdSdrh p->pWith = W; 467772460fdSdrh parserDoubleLinkSelect(pParse, p); 468a9f5c13dSdan }else{ 469a9f5c13dSdan sqlite3WithDelete(pParse->db, W); 470a9f5c13dSdan } 471cf82f0d3Sdrh A = p; /*A-overwrites-W*/ 472a9f5c13dSdan } 4737d562dbeSdan 4744dd0d3f8Sdrh selectnowith(A) ::= oneselect(A). 475b7f9164eSdrh %ifndef SQLITE_OMIT_COMPOUND_SELECT 4764dd0d3f8Sdrh selectnowith(A) ::= selectnowith(A) multiselect_op(Y) oneselect(Z). { 477c0bf493eSdrh Select *pRhs = Z; 4784dd0d3f8Sdrh Select *pLhs = A; 479c0bf493eSdrh if( pRhs && pRhs->pPrior ){ 480c0bf493eSdrh SrcList *pFrom; 481c0bf493eSdrh Token x; 482c0bf493eSdrh x.n = 0; 483772460fdSdrh parserDoubleLinkSelect(pParse, pRhs); 484c0bf493eSdrh pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); 4858c0833fbSdrh pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); 486c0bf493eSdrh } 487c0bf493eSdrh if( pRhs ){ 488c0bf493eSdrh pRhs->op = (u8)Y; 48900d5ab74Sdrh pRhs->pPrior = pLhs; 49000d5ab74Sdrh if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; 491772460fdSdrh pRhs->selFlags &= ~SF_MultiValue; 492d58d3278Sdrh if( Y!=TK_ALL ) pParse->hasCompound = 1; 49343b78826Sdrh }else{ 49400d5ab74Sdrh sqlite3SelectDelete(pParse->db, pLhs); 495daffd0e5Sdrh } 496c0bf493eSdrh A = pRhs; 49782c3d636Sdrh } 4980a36c57eSdrh %type multiselect_op {int} 499cf82f0d3Sdrh multiselect_op(A) ::= UNION(OP). {A = @OP; /*A-overwrites-OP*/} 5000a36c57eSdrh multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} 501cf82f0d3Sdrh multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP; /*A-overwrites-OP*/} 502154d4b24Sdrh %endif SQLITE_OMIT_COMPOUND_SELECT 503abd4c723Sdrh oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y) 5049bbca4c1Sdrh groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { 50543303de9Sdrh #if SELECTTRACE_ENABLED 50643303de9Sdrh Token s = S; /*A-overwrites-S*/ 50743303de9Sdrh #endif 5088c0833fbSdrh A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L); 509abd4c723Sdrh #if SELECTTRACE_ENABLED 510eb9b884cSdrh /* Populate the Select.zSelName[] string that is used to help with 511abd4c723Sdrh ** query planner debugging, to differentiate between multiple Select 512abd4c723Sdrh ** objects in a complex query. 513abd4c723Sdrh ** 514abd4c723Sdrh ** If the SELECT keyword is immediately followed by a C-style comment 515abd4c723Sdrh ** then extract the first few alphanumeric characters from within that 516eb9b884cSdrh ** comment to be the zSelName value. Otherwise, the label is #N where 517abd4c723Sdrh ** is an integer that is incremented with each SELECT statement seen. 518abd4c723Sdrh */ 519abd4c723Sdrh if( A!=0 ){ 52043303de9Sdrh const char *z = s.z+6; 521abd4c723Sdrh int i; 522eb9b884cSdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "#%d", 523abd4c723Sdrh ++pParse->nSelect); 524abd4c723Sdrh while( z[0]==' ' ) z++; 525abd4c723Sdrh if( z[0]=='/' && z[1]=='*' ){ 526abd4c723Sdrh z += 2; 527abd4c723Sdrh while( z[0]==' ' ) z++; 528abd4c723Sdrh for(i=0; sqlite3Isalnum(z[i]); i++){} 529eb9b884cSdrh sqlite3_snprintf(sizeof(A->zSelName), A->zSelName, "%.*s", i, z); 530abd4c723Sdrh } 531abd4c723Sdrh } 532abd4c723Sdrh #endif /* SELECTRACE_ENABLED */ 5339bb61fe7Sdrh } 5344dd0d3f8Sdrh oneselect(A) ::= values(A). 53575593d96Sdrh 53675593d96Sdrh %type values {Select*} 53775593d96Sdrh %destructor values {sqlite3SelectDelete(pParse->db, $$);} 53875593d96Sdrh values(A) ::= VALUES LP nexprlist(X) RP. { 5398c0833fbSdrh A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0); 54075593d96Sdrh } 5414dd0d3f8Sdrh values(A) ::= values(A) COMMA LP exprlist(Y) RP. { 5424dd0d3f8Sdrh Select *pRight, *pLeft = A; 5438c0833fbSdrh pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0); 544f3151f0aSdrh if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; 54575593d96Sdrh if( pRight ){ 54675593d96Sdrh pRight->op = TK_ALL; 547772460fdSdrh pRight->pPrior = pLeft; 54875593d96Sdrh A = pRight; 54975593d96Sdrh }else{ 550772460fdSdrh A = pLeft; 55175593d96Sdrh } 55275593d96Sdrh } 5539bb61fe7Sdrh 5549bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is 5559bb61fe7Sdrh // present and false (0) if it is not. 5569bb61fe7Sdrh // 5573334d089Sdrh %type distinct {int} 558832ee3d4Sdrh distinct(A) ::= DISTINCT. {A = SF_Distinct;} 5597cea7f95Sdrh distinct(A) ::= ALL. {A = SF_All;} 560efb7251dSdrh distinct(A) ::= . {A = 0;} 561348784efSdrh 5629bb61fe7Sdrh // selcollist is a list of expressions that are to become the return 5637c917d19Sdrh // values of the SELECT statement. The "*" in statements like 5647c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an 5651a1d3cd2Sdrh // opcode of TK_ASTERISK. 5669bb61fe7Sdrh // 567348784efSdrh %type selcollist {ExprList*} 568633e6d57Sdrh %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} 569348784efSdrh %type sclp {ExprList*} 570633e6d57Sdrh %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} 5714dd0d3f8Sdrh sclp(A) ::= selcollist(A) COMMA. 572348784efSdrh sclp(A) ::= . {A = 0;} 5731be266baSdrh selcollist(A) ::= sclp(A) scanpt(B) expr(X) scanpt(Z) as(Y). { 5741be266baSdrh A = sqlite3ExprListAppend(pParse, A, X); 575b7916a78Sdrh if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); 5761be266baSdrh sqlite3ExprListSetSpan(pParse,A,B,Z); 57701f3f253Sdrh } 578d3f5d611Sdrh selcollist(A) ::= sclp(A) scanpt STAR. { 5791a1d3cd2Sdrh Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); 5804dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse, A, p); 5817c917d19Sdrh } 5821be266baSdrh selcollist(A) ::= sclp(A) scanpt nm(X) DOT STAR. { 583abfd35eaSdrh Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); 584abfd35eaSdrh Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 585abfd35eaSdrh Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); 5864dd0d3f8Sdrh A = sqlite3ExprListAppend(pParse,A, pDot); 58754473229Sdrh } 58801f3f253Sdrh 58901f3f253Sdrh // An option "AS <id>" phrase that can follow one of the expressions that 59001f3f253Sdrh // define the result set, or one of the tables in the FROM clause. 59101f3f253Sdrh // 59201f3f253Sdrh %type as {Token} 5935ad1a6c8Sdrh as(X) ::= AS nm(Y). {X = Y;} 5944dd0d3f8Sdrh as(X) ::= ids(X). 595986dde70Sdrh as(X) ::= . {X.n = 0; X.z = 0;} 5969bb61fe7Sdrh 597348784efSdrh 598ad3cab52Sdrh %type seltablist {SrcList*} 599633e6d57Sdrh %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);} 600ad3cab52Sdrh %type stl_prefix {SrcList*} 601633e6d57Sdrh %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);} 602ad3cab52Sdrh %type from {SrcList*} 603633e6d57Sdrh %destructor from {sqlite3SrcListDelete(pParse->db, $$);} 604348784efSdrh 60501f3f253Sdrh // A complete FROM clause. 60601f3f253Sdrh // 60717435752Sdrh from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} 60861dfc31dSdrh from(A) ::= FROM seltablist(X). { 60961dfc31dSdrh A = X; 61061dfc31dSdrh sqlite3SrcListShiftJoinType(A); 61161dfc31dSdrh } 61201f3f253Sdrh 61301f3f253Sdrh // "seltablist" is a "Select Table List" - the content of the FROM clause 61401f3f253Sdrh // in a SELECT statement. "stl_prefix" is a prefix of this list. 61501f3f253Sdrh // 6164dd0d3f8Sdrh stl_prefix(A) ::= seltablist(A) joinop(Y). { 6178a48b9c0Sdrh if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y; 61801f3f253Sdrh } 619348784efSdrh stl_prefix(A) ::= . {A = 0;} 6204dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) as(Z) indexed_opt(I) 621e9240418Sdrh on_opt(N) using_opt(U). { 6224dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U); 623b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, A, &I); 62401f3f253Sdrh } 6254dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) 62601d230ceSdrh on_opt(N) using_opt(U). { 6274dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,&Y,&D,&Z,0,N,U); 62801d230ceSdrh sqlite3SrcListFuncArgs(pParse, A, E); 62901d230ceSdrh } 63051522cd3Sdrh %ifndef SQLITE_OMIT_SUBQUERY 6314dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) LP select(S) RP 632b733d037Sdrh as(Z) on_opt(N) using_opt(U). { 6334dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,N,U); 63422f70c32Sdrh } 6354dd0d3f8Sdrh seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP 636fbdc7f69Sdrh as(Z) on_opt(N) using_opt(U). { 6374dd0d3f8Sdrh if( A==0 && Z.n==0 && N==0 && U==0 ){ 638fbdc7f69Sdrh A = F; 639832ee3d4Sdrh }else if( F->nSrc==1 ){ 6404dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,0,N,U); 641832ee3d4Sdrh if( A ){ 642832ee3d4Sdrh struct SrcList_item *pNew = &A->a[A->nSrc-1]; 643832ee3d4Sdrh struct SrcList_item *pOld = F->a; 644832ee3d4Sdrh pNew->zName = pOld->zName; 645832ee3d4Sdrh pNew->zDatabase = pOld->zDatabase; 6463c449c6bSdrh pNew->pSelect = pOld->pSelect; 647832ee3d4Sdrh pOld->zName = pOld->zDatabase = 0; 6483c449c6bSdrh pOld->pSelect = 0; 649832ee3d4Sdrh } 650832ee3d4Sdrh sqlite3SrcListDelete(pParse->db, F); 651fbdc7f69Sdrh }else{ 652fbdc7f69Sdrh Select *pSubquery; 653fbdc7f69Sdrh sqlite3SrcListShiftJoinType(F); 6548c0833fbSdrh pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0); 6554dd0d3f8Sdrh A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,N,U); 656fbdc7f69Sdrh } 657fbdc7f69Sdrh } 658154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 659b733d037Sdrh 660113088ecSdrh %type dbnm {Token} 661113088ecSdrh dbnm(A) ::= . {A.z=0; A.n=0;} 662113088ecSdrh dbnm(A) ::= DOT nm(X). {A = X;} 663113088ecSdrh 66474ad7fe9Sdrh %type fullname {SrcList*} 665633e6d57Sdrh %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} 666cf82f0d3Sdrh fullname(A) ::= nm(X) dbnm(Y). 667cf82f0d3Sdrh {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/} 66874ad7fe9Sdrh 66901f3f253Sdrh %type joinop {int} 670fd405314Sdrh joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } 671cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) JOIN. 672cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,0,0); /*X-overwrites-A*/} 673cf82f0d3Sdrh joinop(X) ::= JOIN_KW(A) nm(B) JOIN. 674cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,&B,0); /*X-overwrites-A*/} 6755ad1a6c8Sdrh joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. 676cf82f0d3Sdrh {X = sqlite3JoinType(pParse,&A,&B,&C);/*X-overwrites-A*/} 67701f3f253Sdrh 67801f3f253Sdrh %type on_opt {Expr*} 679633e6d57Sdrh %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} 6801be266baSdrh on_opt(N) ::= ON expr(E). {N = E;} 68101f3f253Sdrh on_opt(N) ::= . {N = 0;} 68201f3f253Sdrh 68385574e31Sdanielk1977 // Note that this block abuses the Token type just a little. If there is 68485574e31Sdanielk1977 // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If 68585574e31Sdanielk1977 // there is an INDEXED BY clause, then the token is populated as per normal, 68685574e31Sdanielk1977 // with z pointing to the token data and n containing the number of bytes 68785574e31Sdanielk1977 // in the token. 68885574e31Sdanielk1977 // 68985574e31Sdanielk1977 // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is 690b1c685b0Sdanielk1977 // normally illegal. The sqlite3SrcListIndexedBy() function 69185574e31Sdanielk1977 // recognizes and interprets this as a special case. 69285574e31Sdanielk1977 // 69385574e31Sdanielk1977 %type indexed_opt {Token} 69485574e31Sdanielk1977 indexed_opt(A) ::= . {A.z=0; A.n=0;} 69585574e31Sdanielk1977 indexed_opt(A) ::= INDEXED BY nm(X). {A = X;} 69685574e31Sdanielk1977 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} 69785574e31Sdanielk1977 69801f3f253Sdrh %type using_opt {IdList*} 699633e6d57Sdrh %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} 70081eba73eSdrh using_opt(U) ::= USING LP idlist(L) RP. {U = L;} 70101f3f253Sdrh using_opt(U) ::= . {U = 0;} 70201f3f253Sdrh 70301f3f253Sdrh 704348784efSdrh %type orderby_opt {ExprList*} 705633e6d57Sdrh %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} 706108aa00aSdrh 707108aa00aSdrh // the sortlist non-terminal stores a list of expression where each 708108aa00aSdrh // expression is optionally followed by ASC or DESC to indicate the 709108aa00aSdrh // sort order. 710108aa00aSdrh // 711348784efSdrh %type sortlist {ExprList*} 712633e6d57Sdrh %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} 713348784efSdrh 714348784efSdrh orderby_opt(A) ::= . {A = 0;} 715348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} 7164dd0d3f8Sdrh sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). { 7171be266baSdrh A = sqlite3ExprListAppend(pParse,A,Y); 718bc622bc0Sdrh sqlite3ExprListSetSortOrder(A,Z); 719348784efSdrh } 7208395b7b6Sdrh sortlist(A) ::= expr(Y) sortorder(Z). { 7211be266baSdrh A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/ 722bc622bc0Sdrh sqlite3ExprListSetSortOrder(A,Z); 723348784efSdrh } 724348784efSdrh 725348784efSdrh %type sortorder {int} 726348784efSdrh 7278e2ca029Sdrh sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} 7288e2ca029Sdrh sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} 729bc622bc0Sdrh sortorder(A) ::= . {A = SQLITE_SO_UNDEFINED;} 730348784efSdrh 7312282792aSdrh %type groupby_opt {ExprList*} 732633e6d57Sdrh %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} 7332282792aSdrh groupby_opt(A) ::= . {A = 0;} 7349245c243Sdrh groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} 7352282792aSdrh 7362282792aSdrh %type having_opt {Expr*} 737633e6d57Sdrh %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} 7382282792aSdrh having_opt(A) ::= . {A = 0;} 7391be266baSdrh having_opt(A) ::= HAVING expr(X). {A = X;} 7402282792aSdrh 7418c0833fbSdrh %type limit_opt {Expr*} 74215926590Sdrh 74315926590Sdrh // The destructor for limit_opt will never fire in the current grammar. 74415926590Sdrh // The limit_opt non-terminal only occurs at the end of a single production 74515926590Sdrh // rule for SELECT statements. As soon as the rule that create the 74615926590Sdrh // limit_opt non-terminal reduces, the SELECT statement rule will also 74715926590Sdrh // reduce. So there is never a limit_opt non-terminal on the stack 74815926590Sdrh // except as a transient. So there is never anything to destroy. 74915926590Sdrh // 7508c0833fbSdrh //%destructor limit_opt {sqlite3ExprDelete(pParse->db, $$);} 7518c0833fbSdrh limit_opt(A) ::= . {A = 0;} 7528c0833fbSdrh limit_opt(A) ::= LIMIT expr(X). 7531be266baSdrh {A = sqlite3PExpr(pParse,TK_LIMIT,X,0);} 754a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). 7551be266baSdrh {A = sqlite3PExpr(pParse,TK_LIMIT,X,Y);} 756a2dc3b1aSdanielk1977 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 7571be266baSdrh {A = sqlite3PExpr(pParse,TK_LIMIT,Y,X);} 7589bbca4c1Sdrh 759382c0247Sdrh /////////////////////////// The DELETE statement ///////////////////////////// 760382c0247Sdrh // 761273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7624e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W) 763931577f1Sdrh orderby_opt(O) limit_opt(L). { 764b290f117Sdan sqlite3WithPush(pParse, C, 1); 765b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 7668c0833fbSdrh sqlite3DeleteFrom(pParse,X,W,O,L); 7674281bd42Sshane } 7684281bd42Sshane %endif 769273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7704e9119d9Sdan cmd ::= with(C) DELETE FROM fullname(X) indexed_opt(I) where_opt(W). { 771b290f117Sdan sqlite3WithPush(pParse, C, 1); 7724281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 7738c0833fbSdrh sqlite3DeleteFrom(pParse,X,W,0,0); 7744281bd42Sshane } 7754281bd42Sshane %endif 776348784efSdrh 777348784efSdrh %type where_opt {Expr*} 778633e6d57Sdrh %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);} 779348784efSdrh 780348784efSdrh where_opt(A) ::= . {A = 0;} 7811be266baSdrh where_opt(A) ::= WHERE expr(X). {A = X;} 782348784efSdrh 783382c0247Sdrh ////////////////////////// The UPDATE command //////////////////////////////// 784382c0247Sdrh // 785273f619bSshane %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 786bfe31e7fSdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) 7878b471863Sdrh where_opt(W) orderby_opt(O) limit_opt(L). { 788b290f117Sdan sqlite3WithPush(pParse, C, 1); 789b1c685b0Sdanielk1977 sqlite3SrcListIndexedBy(pParse, X, &I); 790b1a6c3c1Sdrh sqlite3ExprListCheckLength(pParse,Y,"set list"); 7918c0833fbSdrh sqlite3Update(pParse,X,Y,W,R,O,L); 7924281bd42Sshane } 7934281bd42Sshane %endif 794273f619bSshane %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT 7954e9119d9Sdan cmd ::= with(C) UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) 796e9240418Sdrh where_opt(W). { 797b290f117Sdan sqlite3WithPush(pParse, C, 1); 7984281bd42Sshane sqlite3SrcListIndexedBy(pParse, X, &I); 7994281bd42Sshane sqlite3ExprListCheckLength(pParse,Y,"set list"); 8008c0833fbSdrh sqlite3Update(pParse,X,Y,W,R,0,0); 8014281bd42Sshane } 8024281bd42Sshane %endif 803348784efSdrh 804f8db1bc0Sdrh %type setlist {ExprList*} 805633e6d57Sdrh %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);} 806f8db1bc0Sdrh 8074dd0d3f8Sdrh setlist(A) ::= setlist(A) COMMA nm(X) EQ expr(Y). { 8081be266baSdrh A = sqlite3ExprListAppend(pParse, A, Y); 809b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 810b7916a78Sdrh } 811a1251bc4Sdrh setlist(A) ::= setlist(A) COMMA LP idlist(X) RP EQ expr(Y). { 8121be266baSdrh A = sqlite3ExprListAppendVector(pParse, A, X, Y); 813a1251bc4Sdrh } 814b7916a78Sdrh setlist(A) ::= nm(X) EQ expr(Y). { 8151be266baSdrh A = sqlite3ExprListAppend(pParse, 0, Y); 816b7916a78Sdrh sqlite3ExprListSetName(pParse, A, &X, 1); 817b7916a78Sdrh } 818a1251bc4Sdrh setlist(A) ::= LP idlist(X) RP EQ expr(Y). { 8191be266baSdrh A = sqlite3ExprListAppendVector(pParse, 0, X, Y); 820a1251bc4Sdrh } 821348784efSdrh 822382c0247Sdrh ////////////////////////// The INSERT command ///////////////////////////////// 823382c0247Sdrh // 8248981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). { 825b290f117Sdan sqlite3WithPush(pParse, W, 1); 8264e9119d9Sdan sqlite3Insert(pParse, X, S, F, R); 8274e9119d9Sdan } 8288981b904Sdrh cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES. 8294e9119d9Sdan { 830b290f117Sdan sqlite3WithPush(pParse, W, 1); 8314e9119d9Sdan sqlite3Insert(pParse, X, 0, F, R); 8324e9119d9Sdan } 833348784efSdrh 8343334d089Sdrh %type insert_cmd {int} 835fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R). {A = R;} 836fa86c412Sdrh insert_cmd(A) ::= REPLACE. {A = OE_Replace;} 837fa86c412Sdrh 8388981b904Sdrh %type idlist_opt {IdList*} 8398981b904Sdrh %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);} 84081eba73eSdrh %type idlist {IdList*} 84181eba73eSdrh %destructor idlist {sqlite3IdListDelete(pParse->db, $$);} 842348784efSdrh 8438981b904Sdrh idlist_opt(A) ::= . {A = 0;} 8448981b904Sdrh idlist_opt(A) ::= LP idlist(X) RP. {A = X;} 8454dd0d3f8Sdrh idlist(A) ::= idlist(A) COMMA nm(Y). 8464dd0d3f8Sdrh {A = sqlite3IdListAppend(pParse->db,A,&Y);} 84781eba73eSdrh idlist(A) ::= nm(Y). 848cf82f0d3Sdrh {A = sqlite3IdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/} 849348784efSdrh 850382c0247Sdrh /////////////////////////// Expression Processing ///////////////////////////// 851382c0247Sdrh // 852348784efSdrh 8531be266baSdrh %type expr {Expr*} 8541be266baSdrh %destructor expr {sqlite3ExprDelete(pParse->db, $$);} 8551be266baSdrh %type term {Expr*} 8561be266baSdrh %destructor term {sqlite3ExprDelete(pParse->db, $$);} 857b7916a78Sdrh 858b7916a78Sdrh %include { 859b7916a78Sdrh 860b7916a78Sdrh /* Construct a new Expr object from a single identifier. Use the 861b7916a78Sdrh ** new Expr to populate pOut. Set the span of pOut to be the identifier 862b7916a78Sdrh ** that created the expression. 863b7916a78Sdrh */ 8641be266baSdrh static Expr *tokenExpr(Parse *pParse, int op, Token t){ 8650cd874bdSdrh Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); 8660cd874bdSdrh if( p ){ 8670cd874bdSdrh memset(p, 0, sizeof(Expr)); 8680cd874bdSdrh p->op = (u8)op; 8690cd874bdSdrh p->flags = EP_Leaf; 8700cd874bdSdrh p->iAgg = -1; 8710cd874bdSdrh p->u.zToken = (char*)&p[1]; 8720cd874bdSdrh memcpy(p->u.zToken, t.z, t.n); 8730cd874bdSdrh p->u.zToken[t.n] = 0; 8740cd874bdSdrh if( sqlite3Isquote(p->u.zToken[0]) ){ 8750cd874bdSdrh if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; 8760cd874bdSdrh sqlite3Dequote(p->u.zToken); 8770cd874bdSdrh } 8780cd874bdSdrh #if SQLITE_MAX_EXPR_DEPTH>0 8790cd874bdSdrh p->nHeight = 1; 8800cd874bdSdrh #endif 8810cd874bdSdrh } 8821be266baSdrh return p; 883b7916a78Sdrh } 884b7916a78Sdrh } 885348784efSdrh 8864dd0d3f8Sdrh expr(A) ::= term(A). 8871be266baSdrh expr(A) ::= LP expr(X) RP. {A = X;} 8881be266baSdrh expr(A) ::= id(X). {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/} 8891be266baSdrh expr(A) ::= JOIN_KW(X). {A=tokenExpr(pParse,TK_ID,X); /*A-overwrites-X*/} 8905ad1a6c8Sdrh expr(A) ::= nm(X) DOT nm(Y). { 891410c301fSdrh Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 892410c301fSdrh Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); 8931be266baSdrh A = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); 894e1b6a5b8Sdrh } 895d24cc427Sdrh expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { 896410c301fSdrh Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &X, 1); 897410c301fSdrh Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &Y, 1); 898410c301fSdrh Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &Z, 1); 899abfd35eaSdrh Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); 9001be266baSdrh A = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); 901d24cc427Sdrh } 9021be266baSdrh term(A) ::= NULL|FLOAT|BLOB(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} 9031be266baSdrh term(A) ::= STRING(X). {A=tokenExpr(pParse,@X,X); /*A-overwrites-X*/} 9040cd874bdSdrh term(A) ::= INTEGER(X). { 9051be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &X, 1); 9060cd874bdSdrh } 907f59b12fbSdrh expr(A) ::= VARIABLE(X). { 9088679fbabSdrh if( !(X.z[0]=='#' && sqlite3Isdigit(X.z[1])) ){ 909de25a88cSdrh u32 n = X.n; 9101be266baSdrh A = tokenExpr(pParse, TK_VARIABLE, X); 9111be266baSdrh sqlite3ExprAssignVarNumber(pParse, A, n); 9128f3b137fSdrh }else{ 913b7916a78Sdrh /* When doing a nested parse, one can include terms in an expression 914b7916a78Sdrh ** that look like this: #1 #2 ... These terms refer to registers 915b7916a78Sdrh ** in the virtual machine. #N is the N-th register. */ 9168f3b137fSdrh Token t = X; /*A-overwrites-X*/ 9178f3b137fSdrh assert( t.n>=2 ); 918b7916a78Sdrh if( pParse->nested==0 ){ 91943303de9Sdrh sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); 9201be266baSdrh A = 0; 921b7916a78Sdrh }else{ 9221be266baSdrh A = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); 9231be266baSdrh if( A ) sqlite3GetInt32(&t.z[1], &A->iTable); 924b7916a78Sdrh } 925f59b12fbSdrh } 926895d7472Sdrh } 9274dd0d3f8Sdrh expr(A) ::= expr(A) COLLATE ids(C). { 9281be266baSdrh A = sqlite3ExprAddCollateToken(pParse, A, &C, 1); 9298b4c40d8Sdrh } 930487e262fSdrh %ifndef SQLITE_OMIT_CAST 9311be266baSdrh expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. { 9321be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_CAST, &T, 1); 9331be266baSdrh sqlite3ExprAttachSubtrees(pParse->db, A, E, 0); 934487e262fSdrh } 935154d4b24Sdrh %endif SQLITE_OMIT_CAST 9361be266baSdrh expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. { 937994704d1Sdrh if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ 938e5c941b8Sdrh sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); 9394e05c83bSdrh } 9401be266baSdrh A = sqlite3ExprFunction(pParse, Y, &X); 9411be266baSdrh if( D==SF_Distinct && A ){ 9421be266baSdrh A->flags |= EP_Distinct; 943fd357974Sdrh } 944e1b6a5b8Sdrh } 9451be266baSdrh expr(A) ::= id(X) LP STAR RP. { 9461be266baSdrh A = sqlite3ExprFunction(pParse, 0, &X); 947e1b6a5b8Sdrh } 948b71090fdSdrh term(A) ::= CTIME_KW(OP). { 9491be266baSdrh A = sqlite3ExprFunction(pParse, 0, &OP); 950b7916a78Sdrh } 951b7916a78Sdrh 9521be266baSdrh expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. { 9531be266baSdrh ExprList *pList = sqlite3ExprListAppend(pParse, X, Y); 9541be266baSdrh A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); 9551be266baSdrh if( A ){ 9561be266baSdrh A->x.pList = pList; 9578bd0d58eSdrh }else{ 9588bd0d58eSdrh sqlite3ExprListDelete(pParse->db, pList); 95971c57db0Sdan } 96071c57db0Sdan } 96171c57db0Sdan 9621be266baSdrh expr(A) ::= expr(A) AND(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 9631be266baSdrh expr(A) ::= expr(A) OR(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 9644dd0d3f8Sdrh expr(A) ::= expr(A) LT|GT|GE|LE(OP) expr(Y). 9651be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 9661be266baSdrh expr(A) ::= expr(A) EQ|NE(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 9674dd0d3f8Sdrh expr(A) ::= expr(A) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). 9681be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 9694dd0d3f8Sdrh expr(A) ::= expr(A) PLUS|MINUS(OP) expr(Y). 9701be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 9714dd0d3f8Sdrh expr(A) ::= expr(A) STAR|SLASH|REM(OP) expr(Y). 9721be266baSdrh {A=sqlite3PExpr(pParse,@OP,A,Y);} 9731be266baSdrh expr(A) ::= expr(A) CONCAT(OP) expr(Y). {A=sqlite3PExpr(pParse,@OP,A,Y);} 974410c301fSdrh %type likeop {Token} 9757e84b377Sdrh likeop(A) ::= LIKE_KW|MATCH(A). 976410c301fSdrh likeop(A) ::= NOT LIKE_KW|MATCH(X). {A=X; A.n|=0x80000000; /*A-overwrite-X*/} 9774dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y). [LIKE_KW] { 9788aa34ae0Sdrh ExprList *pList; 979410c301fSdrh int bNot = OP.n & 0x80000000; 980410c301fSdrh OP.n &= 0x7fffffff; 9811be266baSdrh pList = sqlite3ExprListAppend(pParse,0, Y); 9821be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, A); 9831be266baSdrh A = sqlite3ExprFunction(pParse, pList, &OP); 9841be266baSdrh if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 9851be266baSdrh if( A ) A->flags |= EP_InfixFunc; 9860ac65892Sdrh } 9874dd0d3f8Sdrh expr(A) ::= expr(A) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { 9881dca1458Sdrh ExprList *pList; 989410c301fSdrh int bNot = OP.n & 0x80000000; 990410c301fSdrh OP.n &= 0x7fffffff; 9911be266baSdrh pList = sqlite3ExprListAppend(pParse,0, Y); 9921be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, A); 9931be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, E); 9941be266baSdrh A = sqlite3ExprFunction(pParse, pList, &OP); 9951be266baSdrh if( bNot ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 9961be266baSdrh if( A ) A->flags |= EP_InfixFunc; 9971dca1458Sdrh } 9987c6303c0Sdanielk1977 9991be266baSdrh expr(A) ::= expr(A) ISNULL|NOTNULL(E). {A = sqlite3PExpr(pParse,@E,A,0);} 10001be266baSdrh expr(A) ::= expr(A) NOT NULL. {A = sqlite3PExpr(pParse,TK_NOTNULL,A,0);} 10016a2fe093Sdrh 10026a51741dSdrh %include { 10036a51741dSdrh /* A routine to convert a binary TK_IS or TK_ISNOT expression into a 10046a51741dSdrh ** unary TK_ISNULL or TK_NOTNULL expression. */ 10056a51741dSdrh static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ 10066a51741dSdrh sqlite3 *db = pParse->db; 1007895c00e1Sdan if( pA && pY && pY->op==TK_NULL ){ 10085e17e8b7Sshaneh pA->op = (u8)op; 10096a51741dSdrh sqlite3ExprDelete(db, pA->pRight); 10106a51741dSdrh pA->pRight = 0; 10116a51741dSdrh } 10126a51741dSdrh } 10136a51741dSdrh } 10146a51741dSdrh 10156a2fe093Sdrh // expr1 IS expr2 10166a2fe093Sdrh // expr1 IS NOT expr2 10176a2fe093Sdrh // 10186a2fe093Sdrh // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2 10196a2fe093Sdrh // is any other expression, code as TK_IS or TK_ISNOT. 10206a2fe093Sdrh // 10214dd0d3f8Sdrh expr(A) ::= expr(A) IS expr(Y). { 10221be266baSdrh A = sqlite3PExpr(pParse,TK_IS,A,Y); 10231be266baSdrh binaryToUnaryIfNull(pParse, Y, A, TK_ISNULL); 10246a2fe093Sdrh } 10254dd0d3f8Sdrh expr(A) ::= expr(A) IS NOT expr(Y). { 10261be266baSdrh A = sqlite3PExpr(pParse,TK_ISNOT,A,Y); 10271be266baSdrh binaryToUnaryIfNull(pParse, Y, A, TK_NOTNULL); 10286a2fe093Sdrh } 1029b7916a78Sdrh 103043303de9Sdrh expr(A) ::= NOT(B) expr(X). 10311be266baSdrh {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/} 103243303de9Sdrh expr(A) ::= BITNOT(B) expr(X). 10331be266baSdrh {A = sqlite3PExpr(pParse, @B, X, 0);/*A-overwrites-B*/} 10341be266baSdrh expr(A) ::= MINUS expr(X). [BITNOT] 10351be266baSdrh {A = sqlite3PExpr(pParse, TK_UMINUS, X, 0);} 10361be266baSdrh expr(A) ::= PLUS expr(X). [BITNOT] 10371be266baSdrh {A = sqlite3PExpr(pParse, TK_UPLUS, X, 0);} 1038b7916a78Sdrh 10392e3a1f16Sdrh %type between_op {int} 10402e3a1f16Sdrh between_op(A) ::= BETWEEN. {A = 0;} 10412e3a1f16Sdrh between_op(A) ::= NOT BETWEEN. {A = 1;} 10424dd0d3f8Sdrh expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { 10431be266baSdrh ExprList *pList = sqlite3ExprListAppend(pParse,0, X); 10441be266baSdrh pList = sqlite3ExprListAppend(pParse,pList, Y); 10451be266baSdrh A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0); 10461be266baSdrh if( A ){ 10471be266baSdrh A->x.pList = pList; 104853f733c7Sdrh }else{ 1049633e6d57Sdrh sqlite3ExprListDelete(pParse->db, pList); 105053f733c7Sdrh } 10511be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 1052fef5208cSdrh } 10533e8c37e7Sdanielk1977 %ifndef SQLITE_OMIT_SUBQUERY 10542e3a1f16Sdrh %type in_op {int} 10552e3a1f16Sdrh in_op(A) ::= IN. {A = 0;} 10562e3a1f16Sdrh in_op(A) ::= NOT IN. {A = 1;} 10571be266baSdrh expr(A) ::= expr(A) in_op(N) LP exprlist(Y) RP. [IN] { 1058094430ebSdrh if( Y==0 ){ 1059473c1bf2Sdan /* Expressions of the form 1060473c1bf2Sdan ** 1061473c1bf2Sdan ** expr1 IN () 1062473c1bf2Sdan ** expr1 NOT IN () 1063473c1bf2Sdan ** 1064473c1bf2Sdan ** simplify to constants 0 (false) and 1 (true), respectively, 1065473c1bf2Sdan ** regardless of the value of expr1. 1066473c1bf2Sdan */ 10671be266baSdrh sqlite3ExprDelete(pParse->db, A); 10681be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); 10692b59b3a4Sdrh }else if( Y->nExpr==1 ){ 10702b59b3a4Sdrh /* Expressions of the form: 10712b59b3a4Sdrh ** 10722b59b3a4Sdrh ** expr1 IN (?1) 10732b59b3a4Sdrh ** expr1 NOT IN (?2) 10742b59b3a4Sdrh ** 1075fbb24d10Sdrh ** with exactly one value on the RHS can be simplified to something 1076fbb24d10Sdrh ** like this: 10772b59b3a4Sdrh ** 1078fbb24d10Sdrh ** expr1 == ?1 1079fbb24d10Sdrh ** expr1 <> ?2 1080fbb24d10Sdrh ** 1081fbb24d10Sdrh ** But, the RHS of the == or <> is marked with the EP_Generic flag 1082fbb24d10Sdrh ** so that it may not contribute to the computation of comparison 1083fbb24d10Sdrh ** affinity or the collating sequence to use for comparison. Otherwise, 1084fbb24d10Sdrh ** the semantics would be subtly different from IN or NOT IN. 10852b59b3a4Sdrh */ 1086fbb24d10Sdrh Expr *pRHS = Y->a[0].pExpr; 10872b59b3a4Sdrh Y->a[0].pExpr = 0; 10882b59b3a4Sdrh sqlite3ExprListDelete(pParse->db, Y); 10895b1420e0Sdrh /* pRHS cannot be NULL because a malloc error would have been detected 10905b1420e0Sdrh ** before now and control would have never reached this point */ 10915b1420e0Sdrh if( ALWAYS(pRHS) ){ 1092fbb24d10Sdrh pRHS->flags &= ~EP_Collate; 1093fbb24d10Sdrh pRHS->flags |= EP_Generic; 1094fbb24d10Sdrh } 10951be266baSdrh A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS); 1096094430ebSdrh }else{ 10971be266baSdrh A = sqlite3PExpr(pParse, TK_IN, A, 0); 10981be266baSdrh if( A ){ 10991be266baSdrh A->x.pList = Y; 11001be266baSdrh sqlite3ExprSetHeightAndFlags(pParse, A); 1101d5d56523Sdanielk1977 }else{ 1102633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1103d5d56523Sdanielk1977 } 11041be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 1105094430ebSdrh } 1106fef5208cSdrh } 11071be266baSdrh expr(A) ::= LP select(X) RP. { 11081be266baSdrh A = sqlite3PExpr(pParse, TK_SELECT, 0, 0); 11091be266baSdrh sqlite3PExprAddSelect(pParse, A, X); 111051522cd3Sdrh } 11111be266baSdrh expr(A) ::= expr(A) in_op(N) LP select(Y) RP. [IN] { 11121be266baSdrh A = sqlite3PExpr(pParse, TK_IN, A, 0); 11131be266baSdrh sqlite3PExprAddSelect(pParse, A, Y); 11141be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 1115fef5208cSdrh } 11165fbab882Sdrh expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] { 111717435752Sdrh SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); 11188c0833fbSdrh Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); 11199de4757cSdrh if( E ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); 11201be266baSdrh A = sqlite3PExpr(pParse, TK_IN, A, 0); 11211be266baSdrh sqlite3PExprAddSelect(pParse, A, pSelect); 11221be266baSdrh if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); 112323b2db23Sdrh } 11241be266baSdrh expr(A) ::= EXISTS LP select(Y) RP. { 112543303de9Sdrh Expr *p; 11261be266baSdrh p = A = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); 112708de4f79Sdrh sqlite3PExprAddSelect(pParse, p, Y); 112851522cd3Sdrh } 1129154d4b24Sdrh %endif SQLITE_OMIT_SUBQUERY 1130fef5208cSdrh 113117a7f8ddSdrh /* CASE expressions */ 11321be266baSdrh expr(A) ::= CASE case_operand(X) case_exprlist(Y) case_else(Z) END. { 11331be266baSdrh A = sqlite3PExpr(pParse, TK_CASE, X, 0); 11341be266baSdrh if( A ){ 11351be266baSdrh A->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; 11361be266baSdrh sqlite3ExprSetHeightAndFlags(pParse, A); 113753f733c7Sdrh }else{ 1138633e6d57Sdrh sqlite3ExprListDelete(pParse->db, Y); 1139c5cd1249Sdrh sqlite3ExprDelete(pParse->db, Z); 114053f733c7Sdrh } 114117a7f8ddSdrh } 114217a7f8ddSdrh %type case_exprlist {ExprList*} 1143633e6d57Sdrh %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 11444dd0d3f8Sdrh case_exprlist(A) ::= case_exprlist(A) WHEN expr(Y) THEN expr(Z). { 11451be266baSdrh A = sqlite3ExprListAppend(pParse,A, Y); 11461be266baSdrh A = sqlite3ExprListAppend(pParse,A, Z); 114717a7f8ddSdrh } 114817a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { 11491be266baSdrh A = sqlite3ExprListAppend(pParse,0, Y); 11501be266baSdrh A = sqlite3ExprListAppend(pParse,A, Z); 115117a7f8ddSdrh } 115217a7f8ddSdrh %type case_else {Expr*} 1153633e6d57Sdrh %destructor case_else {sqlite3ExprDelete(pParse->db, $$);} 11541be266baSdrh case_else(A) ::= ELSE expr(X). {A = X;} 115517a7f8ddSdrh case_else(A) ::= . {A = 0;} 115617a7f8ddSdrh %type case_operand {Expr*} 1157633e6d57Sdrh %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);} 11581be266baSdrh case_operand(A) ::= expr(X). {A = X; /*A-overwrites-X*/} 115917a7f8ddSdrh case_operand(A) ::= . {A = 0;} 1160348784efSdrh 1161348784efSdrh %type exprlist {ExprList*} 1162633e6d57Sdrh %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);} 11639245c243Sdrh %type nexprlist {ExprList*} 1164633e6d57Sdrh %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);} 1165348784efSdrh 11664dd0d3f8Sdrh exprlist(A) ::= nexprlist(A). 11679245c243Sdrh exprlist(A) ::= . {A = 0;} 11684dd0d3f8Sdrh nexprlist(A) ::= nexprlist(A) COMMA expr(Y). 11691be266baSdrh {A = sqlite3ExprListAppend(pParse,A,Y);} 117017435752Sdrh nexprlist(A) ::= expr(Y). 11711be266baSdrh {A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/} 11729245c243Sdrh 1173a522473cSdrh %ifndef SQLITE_OMIT_SUBQUERY 11745fbab882Sdrh /* A paren_exprlist is an optional expression list contained inside 11755fbab882Sdrh ** of parenthesis */ 11765fbab882Sdrh %type paren_exprlist {ExprList*} 11775fbab882Sdrh %destructor paren_exprlist {sqlite3ExprListDelete(pParse->db, $$);} 11785fbab882Sdrh paren_exprlist(A) ::= . {A = 0;} 11795fbab882Sdrh paren_exprlist(A) ::= LP exprlist(X) RP. {A = X;} 1180a522473cSdrh %endif SQLITE_OMIT_SUBQUERY 11815fbab882Sdrh 1182cce7d176Sdrh 1183382c0247Sdrh ///////////////////////////// The CREATE INDEX command /////////////////////// 1184382c0247Sdrh // 1185d9da78a2Sdrh cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) 1186108aa00aSdrh ON nm(Y) LP sortlist(Z) RP where_opt(W). { 118717435752Sdrh sqlite3CreateIndex(pParse, &X, &D, 118817435752Sdrh sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, 118962340f84Sdrh &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF); 11909cfcf5d4Sdrh } 1191717e6402Sdrh 1192717e6402Sdrh %type uniqueflag {int} 11939cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} 11949cfcf5d4Sdrh uniqueflag(A) ::= . {A = OE_None;} 1195348784efSdrh 1196348784efSdrh 1197108aa00aSdrh // The eidlist non-terminal (Expression Id List) generates an ExprList 1198108aa00aSdrh // from a list of identifiers. The identifier names are in ExprList.a[].zName. 1199108aa00aSdrh // This list is stored in an ExprList rather than an IdList so that it 1200108aa00aSdrh // can be easily sent to sqlite3ColumnsExprList(). 1201108aa00aSdrh // 1202108aa00aSdrh // eidlist is grouped with CREATE INDEX because it used to be the non-terminal 1203108aa00aSdrh // used for the arguments to an index. That is just an historical accident. 1204108aa00aSdrh // 1205108aa00aSdrh // IMPORTANT COMPATIBILITY NOTE: Some prior versions of SQLite accepted 1206108aa00aSdrh // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate 1207108aa00aSdrh // places - places that might have been stored in the sqlite_master schema. 1208108aa00aSdrh // Those extra features were ignored. But because they might be in some 1209108aa00aSdrh // (busted) old databases, we need to continue parsing them when loading 1210108aa00aSdrh // historical schemas. 1211108aa00aSdrh // 1212108aa00aSdrh %type eidlist {ExprList*} 1213108aa00aSdrh %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);} 1214108aa00aSdrh %type eidlist_opt {ExprList*} 1215108aa00aSdrh %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);} 1216108aa00aSdrh 1217108aa00aSdrh %include { 1218108aa00aSdrh /* Add a single new term to an ExprList that is used to store a 1219108aa00aSdrh ** list of identifiers. Report an error if the ID list contains 1220108aa00aSdrh ** a COLLATE clause or an ASC or DESC keyword, except ignore the 1221108aa00aSdrh ** error while parsing a legacy schema. 1222108aa00aSdrh */ 1223108aa00aSdrh static ExprList *parserAddExprIdListTerm( 1224108aa00aSdrh Parse *pParse, 1225108aa00aSdrh ExprList *pPrior, 1226108aa00aSdrh Token *pIdToken, 1227108aa00aSdrh int hasCollate, 1228108aa00aSdrh int sortOrder 1229108aa00aSdrh ){ 1230108aa00aSdrh ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); 1231108aa00aSdrh if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) 1232108aa00aSdrh && pParse->db->init.busy==0 1233108aa00aSdrh ){ 1234108aa00aSdrh sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", 1235108aa00aSdrh pIdToken->n, pIdToken->z); 12360202b29eSdanielk1977 } 1237108aa00aSdrh sqlite3ExprListSetName(pParse, p, pIdToken, 1); 1238108aa00aSdrh return p; 1239108aa00aSdrh } 1240108aa00aSdrh } // end %include 1241108aa00aSdrh 1242108aa00aSdrh eidlist_opt(A) ::= . {A = 0;} 1243108aa00aSdrh eidlist_opt(A) ::= LP eidlist(X) RP. {A = X;} 12444dd0d3f8Sdrh eidlist(A) ::= eidlist(A) COMMA nm(Y) collate(C) sortorder(Z). { 12454dd0d3f8Sdrh A = parserAddExprIdListTerm(pParse, A, &Y, C, Z); 1246108aa00aSdrh } 1247108aa00aSdrh eidlist(A) ::= nm(Y) collate(C) sortorder(Z). { 1248cf82f0d3Sdrh A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); /*A-overwrites-Y*/ 12490202b29eSdanielk1977 } 12500202b29eSdanielk1977 1251108aa00aSdrh %type collate {int} 1252108aa00aSdrh collate(C) ::= . {C = 0;} 1253108aa00aSdrh collate(C) ::= COLLATE ids. {C = 1;} 1254a34001c9Sdrh 1255348784efSdrh 12568aff1015Sdrh ///////////////////////////// The DROP INDEX command ///////////////////////// 1257382c0247Sdrh // 12584d91a701Sdrh cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} 1259982cef7eSdrh 1260382c0247Sdrh ///////////////////////////// The VACUUM command ///////////////////////////// 1261382c0247Sdrh // 1262154d4b24Sdrh %ifndef SQLITE_OMIT_VACUUM 1263fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 12649ef5e770Sdrh cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} 12659ef5e770Sdrh cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} 1266fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 1267154d4b24Sdrh %endif SQLITE_OMIT_VACUUM 1268f57b14a6Sdrh 1269382c0247Sdrh ///////////////////////////// The PRAGMA command ///////////////////////////// 1270382c0247Sdrh // 127113d7042aSdrh %ifndef SQLITE_OMIT_PRAGMA 127291cf71b0Sdanielk1977 cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);} 1273ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1274ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);} 1275ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). 1276ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1277ada2ee0dSdrh cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP. 1278ada2ee0dSdrh {sqlite3Pragma(pParse,&X,&Z,&Y,1);} 1279ada2ee0dSdrh 1280cf82f0d3Sdrh nmnum(A) ::= plus_num(A). 1281cf82f0d3Sdrh nmnum(A) ::= nm(A). 1282cf82f0d3Sdrh nmnum(A) ::= ON(A). 1283cf82f0d3Sdrh nmnum(A) ::= DELETE(A). 1284cf82f0d3Sdrh nmnum(A) ::= DEFAULT(A). 1285154d4b24Sdrh %endif SQLITE_OMIT_PRAGMA 1286f59b12fbSdrh %token_class number INTEGER|FLOAT. 12878395b7b6Sdrh plus_num(A) ::= PLUS number(X). {A = X;} 1288cf82f0d3Sdrh plus_num(A) ::= number(A). 1289f57b14a6Sdrh minus_num(A) ::= MINUS number(X). {A = X;} 1290c3f9bad2Sdanielk1977 //////////////////////////// The CREATE TRIGGER command ///////////////////// 1291f0f258b1Sdrh 1292b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1293b7f9164eSdrh 1294d9da78a2Sdrh cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { 12954b59ab5eSdrh Token all; 12964b59ab5eSdrh all.z = A.z; 1297b27b7f5dSdrh all.n = (int)(Z.z - A.z) + Z.n; 12984adee20fSdanielk1977 sqlite3FinishTrigger(pParse, S, &all); 1299f0f258b1Sdrh } 1300f0f258b1Sdrh 1301fdd48a76Sdrh trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) 1302fdd48a76Sdrh trigger_time(C) trigger_event(D) 130360218d2aSdrh ON fullname(E) foreach_clause when_clause(G). { 130460218d2aSdrh sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); 1305cf82f0d3Sdrh A = (Z.n==0?B:Z); /*A-overwrites-T*/ 1306c3f9bad2Sdanielk1977 } 1307c3f9bad2Sdanielk1977 1308c3f9bad2Sdanielk1977 %type trigger_time {int} 13096559e2ceSdrh trigger_time(A) ::= BEFORE|AFTER(X). { A = @X; /*A-overwrites-X*/ } 1310c3f9bad2Sdanielk1977 trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;} 1311c3f9bad2Sdanielk1977 trigger_time(A) ::= . { A = TK_BEFORE; } 1312c3f9bad2Sdanielk1977 1313ad3cab52Sdrh %type trigger_event {struct TrigEvent} 1314633e6d57Sdrh %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);} 1315cf82f0d3Sdrh trigger_event(A) ::= DELETE|INSERT(X). {A.a = @X; /*A-overwrites-X*/ A.b = 0;} 1316cf82f0d3Sdrh trigger_event(A) ::= UPDATE(X). {A.a = @X; /*A-overwrites-X*/ A.b = 0;} 131781eba73eSdrh trigger_event(A) ::= UPDATE OF idlist(X).{A.a = TK_UPDATE; A.b = X;} 1318c3f9bad2Sdanielk1977 131960218d2aSdrh foreach_clause ::= . 132060218d2aSdrh foreach_clause ::= FOR EACH ROW. 1321c3f9bad2Sdanielk1977 1322c3f9bad2Sdanielk1977 %type when_clause {Expr*} 1323633e6d57Sdrh %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);} 1324c3f9bad2Sdanielk1977 when_clause(A) ::= . { A = 0; } 13251be266baSdrh when_clause(A) ::= WHEN expr(X). { A = X; } 1326c3f9bad2Sdanielk1977 1327c3f9bad2Sdanielk1977 %type trigger_cmd_list {TriggerStep*} 1328633e6d57Sdrh %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);} 13294dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd_list(A) trigger_cmd(X) SEMI. { 13304dd0d3f8Sdrh assert( A!=0 ); 13314dd0d3f8Sdrh A->pLast->pNext = X; 13324dd0d3f8Sdrh A->pLast = X; 1333a69d9168Sdrh } 13344dd0d3f8Sdrh trigger_cmd_list(A) ::= trigger_cmd(A) SEMI. { 13354dd0d3f8Sdrh assert( A!=0 ); 13364dd0d3f8Sdrh A->pLast = A; 133781238966Sdrh } 1338c3f9bad2Sdanielk1977 1339b1819a0bSdrh // Disallow qualified table names on INSERT, UPDATE, and DELETE statements 1340b1819a0bSdrh // within a trigger. The table to INSERT, UPDATE, or DELETE is always in 1341b1819a0bSdrh // the same database as the table that the trigger fires on. 1342b1819a0bSdrh // 1343b1819a0bSdrh %type trnm {Token} 13444dd0d3f8Sdrh trnm(A) ::= nm(A). 1345b1819a0bSdrh trnm(A) ::= nm DOT nm(X). { 1346b1819a0bSdrh A = X; 1347b1819a0bSdrh sqlite3ErrorMsg(pParse, 1348b1819a0bSdrh "qualified table names are not allowed on INSERT, UPDATE, and DELETE " 1349b1819a0bSdrh "statements within triggers"); 1350b1819a0bSdrh } 1351b1819a0bSdrh 1352b1819a0bSdrh // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE 1353b1819a0bSdrh // statements within triggers. We make a specific error message for this 1354b1819a0bSdrh // since it is an exception to the default grammar rules. 1355b1819a0bSdrh // 1356b1819a0bSdrh tridxby ::= . 1357b1819a0bSdrh tridxby ::= INDEXED BY nm. { 1358b1819a0bSdrh sqlite3ErrorMsg(pParse, 1359b1819a0bSdrh "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " 1360b1819a0bSdrh "within triggers"); 1361b1819a0bSdrh } 1362b1819a0bSdrh tridxby ::= NOT INDEXED. { 1363b1819a0bSdrh sqlite3ErrorMsg(pParse, 1364b1819a0bSdrh "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " 1365b1819a0bSdrh "within triggers"); 1366b1819a0bSdrh } 1367b1819a0bSdrh 1368b1819a0bSdrh 1369b1819a0bSdrh 1370c3f9bad2Sdanielk1977 %type trigger_cmd {TriggerStep*} 1371633e6d57Sdrh %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} 1372c3f9bad2Sdanielk1977 // UPDATE 1373b1819a0bSdrh trigger_cmd(A) ::= 1374f259df5fSdrh UPDATE(B) orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z) scanpt(E). 1375f259df5fSdrh {A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R, B.z, E);} 1376c3f9bad2Sdanielk1977 1377c3f9bad2Sdanielk1977 // INSERT 1378f259df5fSdrh trigger_cmd(A) ::= scanpt(B) insert_cmd(R) INTO 1379f259df5fSdrh trnm(X) idlist_opt(F) select(S) scanpt(Z). 1380f259df5fSdrh {A = sqlite3TriggerInsertStep(pParse->db,&X,F,S,R,B,Z);/*A-overwrites-R*/} 1381c3f9bad2Sdanielk1977 1382c3f9bad2Sdanielk1977 // DELETE 1383f259df5fSdrh trigger_cmd(A) ::= DELETE(B) FROM trnm(X) tridxby where_opt(Y) scanpt(E). 1384f259df5fSdrh {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y, B.z, E);} 1385c3f9bad2Sdanielk1977 1386c3f9bad2Sdanielk1977 // SELECT 1387f259df5fSdrh trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E). 1388f259df5fSdrh {A = sqlite3TriggerSelectStep(pParse->db, X, B, E); /*A-overwrites-X*/} 1389c3f9bad2Sdanielk1977 13906f34903eSdanielk1977 // The special RAISE expression that may occur in trigger programs 13911be266baSdrh expr(A) ::= RAISE LP IGNORE RP. { 13921be266baSdrh A = sqlite3PExpr(pParse, TK_RAISE, 0, 0); 13931be266baSdrh if( A ){ 13941be266baSdrh A->affinity = OE_Ignore; 13954b59ab5eSdrh } 13968aa34ae0Sdrh } 13971be266baSdrh expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP. { 13981be266baSdrh A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1); 13991be266baSdrh if( A ) { 14001be266baSdrh A->affinity = (char)T; 14014b59ab5eSdrh } 14028aa34ae0Sdrh } 1403154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1404b7f9164eSdrh 140574ad7fe9Sdrh %type raisetype {int} 140674ad7fe9Sdrh raisetype(A) ::= ROLLBACK. {A = OE_Rollback;} 140774ad7fe9Sdrh raisetype(A) ::= ABORT. {A = OE_Abort;} 140874ad7fe9Sdrh raisetype(A) ::= FAIL. {A = OE_Fail;} 140974ad7fe9Sdrh 14106f34903eSdanielk1977 1411c3f9bad2Sdanielk1977 //////////////////////// DROP TRIGGER statement ////////////////////////////// 1412b7f9164eSdrh %ifndef SQLITE_OMIT_TRIGGER 1413fdd48a76Sdrh cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { 1414fdd48a76Sdrh sqlite3DropTrigger(pParse,X,NOERR); 1415c3f9bad2Sdanielk1977 } 1416154d4b24Sdrh %endif !SQLITE_OMIT_TRIGGER 1417113088ecSdrh 1418113088ecSdrh //////////////////////// ATTACH DATABASE file AS name ///////////////////////// 1419fdbcdee5Sdrh %ifndef SQLITE_OMIT_ATTACH 1420f744bb56Sdanielk1977 cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { 14211be266baSdrh sqlite3Attach(pParse, F, D, K); 14221c2d8414Sdrh } 1423fdbcdee5Sdrh cmd ::= DETACH database_kw_opt expr(D). { 14241be266baSdrh sqlite3Detach(pParse, D); 1425fdbcdee5Sdrh } 1426fdbcdee5Sdrh 1427f744bb56Sdanielk1977 %type key_opt {Expr*} 1428633e6d57Sdrh %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);} 1429f744bb56Sdanielk1977 key_opt(A) ::= . { A = 0; } 14301be266baSdrh key_opt(A) ::= KEY expr(X). { A = X; } 1431113088ecSdrh 1432113088ecSdrh database_kw_opt ::= DATABASE. 1433113088ecSdrh database_kw_opt ::= . 1434fdbcdee5Sdrh %endif SQLITE_OMIT_ATTACH 14354343fea2Sdrh 14364343fea2Sdrh ////////////////////////// REINDEX collation ////////////////////////////////// 14374343fea2Sdrh %ifndef SQLITE_OMIT_REINDEX 14384343fea2Sdrh cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);} 14394343fea2Sdrh cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);} 1440154d4b24Sdrh %endif SQLITE_OMIT_REINDEX 14419fd2a9a0Sdanielk1977 14429f18e8a0Sdrh /////////////////////////////////// ANALYZE /////////////////////////////////// 14439f18e8a0Sdrh %ifndef SQLITE_OMIT_ANALYZE 14449f18e8a0Sdrh cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);} 14459f18e8a0Sdrh cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);} 14469f18e8a0Sdrh %endif 14479f18e8a0Sdrh 14489fd2a9a0Sdanielk1977 //////////////////////// ALTER TABLE table ... //////////////////////////////// 14499fd2a9a0Sdanielk1977 %ifndef SQLITE_OMIT_ALTERTABLE 14509fd2a9a0Sdanielk1977 cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { 14519fd2a9a0Sdanielk1977 sqlite3AlterRenameTable(pParse,X,&Z); 14529fd2a9a0Sdanielk1977 } 1453986dde70Sdrh cmd ::= ALTER TABLE add_column_fullname 1454986dde70Sdrh ADD kwcolumn_opt columnname(Y) carglist. { 1455986dde70Sdrh Y.n = (int)(pParse->sLastToken.z-Y.z) + pParse->sLastToken.n; 145619a8e7e8Sdanielk1977 sqlite3AlterFinishAddColumn(pParse, &Y); 145719a8e7e8Sdanielk1977 } 145819a8e7e8Sdanielk1977 add_column_fullname ::= fullname(X). { 14594a642b60Sdrh disableLookaside(pParse); 146019a8e7e8Sdanielk1977 sqlite3AlterBeginAddColumn(pParse, X); 146119a8e7e8Sdanielk1977 } 146219a8e7e8Sdanielk1977 kwcolumn_opt ::= . 146319a8e7e8Sdanielk1977 kwcolumn_opt ::= COLUMNKW. 1464154d4b24Sdrh %endif SQLITE_OMIT_ALTERTABLE 1465e09daa90Sdrh 1466e09daa90Sdrh //////////////////////// CREATE VIRTUAL TABLE ... ///////////////////////////// 1467e09daa90Sdrh %ifndef SQLITE_OMIT_VIRTUALTABLE 1468b9bb7c18Sdrh cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);} 1469b9bb7c18Sdrh cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);} 1470b421b894Sdrh create_vtab ::= createkw VIRTUAL TABLE ifnotexists(E) 1471b421b894Sdrh nm(X) dbnm(Y) USING nm(Z). { 1472b421b894Sdrh sqlite3VtabBeginParse(pParse, &X, &Y, &Z, E); 1473b9bb7c18Sdrh } 1474e09daa90Sdrh vtabarglist ::= vtabarg. 1475e09daa90Sdrh vtabarglist ::= vtabarglist COMMA vtabarg. 1476b9bb7c18Sdrh vtabarg ::= . {sqlite3VtabArgInit(pParse);} 1477b9bb7c18Sdrh vtabarg ::= vtabarg vtabargtoken. 1478b9bb7c18Sdrh vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);} 1479b9bb7c18Sdrh vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);} 1480b9bb7c18Sdrh lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);} 1481b9bb7c18Sdrh anylist ::= . 1482aaac8b4eSdrh anylist ::= anylist LP anylist RP. 1483aaac8b4eSdrh anylist ::= anylist ANY. 1484154d4b24Sdrh %endif SQLITE_OMIT_VIRTUALTABLE 14858b471863Sdrh 14868b471863Sdrh 14878b471863Sdrh //////////////////////// COMMON TABLE EXPRESSIONS //////////////////////////// 14887d562dbeSdan %type with {With*} 14897d562dbeSdan %type wqlist {With*} 14907d562dbeSdan %destructor with {sqlite3WithDelete(pParse->db, $$);} 14914e9119d9Sdan %destructor wqlist {sqlite3WithDelete(pParse->db, $$);} 14927d562dbeSdan 14937d562dbeSdan with(A) ::= . {A = 0;} 14948b471863Sdrh %ifndef SQLITE_OMIT_CTE 14957d562dbeSdan with(A) ::= WITH wqlist(W). { A = W; } 14967d562dbeSdan with(A) ::= WITH RECURSIVE wqlist(W). { A = W; } 14977d562dbeSdan 1498108aa00aSdrh wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. { 1499cf82f0d3Sdrh A = sqlite3WithAdd(pParse, 0, &X, Y, Z); /*A-overwrites-X*/ 15007d562dbeSdan } 15014dd0d3f8Sdrh wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. { 15024dd0d3f8Sdrh A = sqlite3WithAdd(pParse, A, &X, Y, Z); 15038b471863Sdrh } 15048b471863Sdrh %endif SQLITE_OMIT_CTE 1505