Annotation of embedaddon/sqlite3/src/parse.y, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2001 September 15
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** May you do good and not evil.
! 8: ** May you find forgiveness for yourself and forgive others.
! 9: ** May you share freely, never taking more than you give.
! 10: **
! 11: *************************************************************************
! 12: ** This file contains SQLite's grammar for SQL. Process this file
! 13: ** using the lemon parser generator to generate C code that runs
! 14: ** the parser. Lemon will also generate a header file containing
! 15: ** numeric codes for all of the tokens.
! 16: */
! 17:
! 18: // All token codes are small integers with #defines that begin with "TK_"
! 19: %token_prefix TK_
! 20:
! 21: // The type of the data attached to each token is Token. This is also the
! 22: // default type for non-terminals.
! 23: //
! 24: %token_type {Token}
! 25: %default_type {Token}
! 26:
! 27: // The generated parser function takes a 4th argument as follows:
! 28: %extra_argument {Parse *pParse}
! 29:
! 30: // This code runs whenever there is a syntax error
! 31: //
! 32: %syntax_error {
! 33: UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */
! 34: assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */
! 35: sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
! 36: }
! 37: %stack_overflow {
! 38: UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */
! 39: sqlite3ErrorMsg(pParse, "parser stack overflow");
! 40: }
! 41:
! 42: // The name of the generated procedure that implements the parser
! 43: // is as follows:
! 44: %name sqlite3Parser
! 45:
! 46: // The following text is included near the beginning of the C source
! 47: // code file that implements the parser.
! 48: //
! 49: %include {
! 50: #include "sqliteInt.h"
! 51:
! 52: /*
! 53: ** Disable all error recovery processing in the parser push-down
! 54: ** automaton.
! 55: */
! 56: #define YYNOERRORRECOVERY 1
! 57:
! 58: /*
! 59: ** Make yytestcase() the same as testcase()
! 60: */
! 61: #define yytestcase(X) testcase(X)
! 62:
! 63: /*
! 64: ** An instance of this structure holds information about the
! 65: ** LIMIT clause of a SELECT statement.
! 66: */
! 67: struct LimitVal {
! 68: Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */
! 69: Expr *pOffset; /* The OFFSET expression. NULL if there is none */
! 70: };
! 71:
! 72: /*
! 73: ** An instance of this structure is used to store the LIKE,
! 74: ** GLOB, NOT LIKE, and NOT GLOB operators.
! 75: */
! 76: struct LikeOp {
! 77: Token eOperator; /* "like" or "glob" or "regexp" */
! 78: int not; /* True if the NOT keyword is present */
! 79: };
! 80:
! 81: /*
! 82: ** An instance of the following structure describes the event of a
! 83: ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT,
! 84: ** TK_DELETE, or TK_INSTEAD. If the event is of the form
! 85: **
! 86: ** UPDATE ON (a,b,c)
! 87: **
! 88: ** Then the "b" IdList records the list "a,b,c".
! 89: */
! 90: struct TrigEvent { int a; IdList * b; };
! 91:
! 92: /*
! 93: ** An instance of this structure holds the ATTACH key and the key type.
! 94: */
! 95: struct AttachKey { int type; Token key; };
! 96:
! 97: } // end %include
! 98:
! 99: // Input is a single SQL command
! 100: input ::= cmdlist.
! 101: cmdlist ::= cmdlist ecmd.
! 102: cmdlist ::= ecmd.
! 103: ecmd ::= SEMI.
! 104: ecmd ::= explain cmdx SEMI.
! 105: explain ::= . { sqlite3BeginParse(pParse, 0); }
! 106: %ifndef SQLITE_OMIT_EXPLAIN
! 107: explain ::= EXPLAIN. { sqlite3BeginParse(pParse, 1); }
! 108: explain ::= EXPLAIN QUERY PLAN. { sqlite3BeginParse(pParse, 2); }
! 109: %endif SQLITE_OMIT_EXPLAIN
! 110: cmdx ::= cmd. { sqlite3FinishCoding(pParse); }
! 111:
! 112: ///////////////////// Begin and end transactions. ////////////////////////////
! 113: //
! 114:
! 115: cmd ::= BEGIN transtype(Y) trans_opt. {sqlite3BeginTransaction(pParse, Y);}
! 116: trans_opt ::= .
! 117: trans_opt ::= TRANSACTION.
! 118: trans_opt ::= TRANSACTION nm.
! 119: %type transtype {int}
! 120: transtype(A) ::= . {A = TK_DEFERRED;}
! 121: transtype(A) ::= DEFERRED(X). {A = @X;}
! 122: transtype(A) ::= IMMEDIATE(X). {A = @X;}
! 123: transtype(A) ::= EXCLUSIVE(X). {A = @X;}
! 124: cmd ::= COMMIT trans_opt. {sqlite3CommitTransaction(pParse);}
! 125: cmd ::= END trans_opt. {sqlite3CommitTransaction(pParse);}
! 126: cmd ::= ROLLBACK trans_opt. {sqlite3RollbackTransaction(pParse);}
! 127:
! 128: savepoint_opt ::= SAVEPOINT.
! 129: savepoint_opt ::= .
! 130: cmd ::= SAVEPOINT nm(X). {
! 131: sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &X);
! 132: }
! 133: cmd ::= RELEASE savepoint_opt nm(X). {
! 134: sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &X);
! 135: }
! 136: cmd ::= ROLLBACK trans_opt TO savepoint_opt nm(X). {
! 137: sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &X);
! 138: }
! 139:
! 140: ///////////////////// The CREATE TABLE statement ////////////////////////////
! 141: //
! 142: cmd ::= create_table create_table_args.
! 143: create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). {
! 144: sqlite3StartTable(pParse,&Y,&Z,T,0,0,E);
! 145: }
! 146: createkw(A) ::= CREATE(X). {
! 147: pParse->db->lookaside.bEnabled = 0;
! 148: A = X;
! 149: }
! 150: %type ifnotexists {int}
! 151: ifnotexists(A) ::= . {A = 0;}
! 152: ifnotexists(A) ::= IF NOT EXISTS. {A = 1;}
! 153: %type temp {int}
! 154: %ifndef SQLITE_OMIT_TEMPDB
! 155: temp(A) ::= TEMP. {A = 1;}
! 156: %endif SQLITE_OMIT_TEMPDB
! 157: temp(A) ::= . {A = 0;}
! 158: create_table_args ::= LP columnlist conslist_opt(X) RP(Y). {
! 159: sqlite3EndTable(pParse,&X,&Y,0);
! 160: }
! 161: create_table_args ::= AS select(S). {
! 162: sqlite3EndTable(pParse,0,0,S);
! 163: sqlite3SelectDelete(pParse->db, S);
! 164: }
! 165: columnlist ::= columnlist COMMA column.
! 166: columnlist ::= column.
! 167:
! 168: // A "column" is a complete description of a single column in a
! 169: // CREATE TABLE statement. This includes the column name, its
! 170: // datatype, and other keywords such as PRIMARY KEY, UNIQUE, REFERENCES,
! 171: // NOT NULL and so forth.
! 172: //
! 173: column(A) ::= columnid(X) type carglist. {
! 174: A.z = X.z;
! 175: A.n = (int)(pParse->sLastToken.z-X.z) + pParse->sLastToken.n;
! 176: }
! 177: columnid(A) ::= nm(X). {
! 178: sqlite3AddColumn(pParse,&X);
! 179: A = X;
! 180: }
! 181:
! 182:
! 183: // An IDENTIFIER can be a generic identifier, or one of several
! 184: // keywords. Any non-standard keyword can also be an identifier.
! 185: //
! 186: %type id {Token}
! 187: id(A) ::= ID(X). {A = X;}
! 188: id(A) ::= INDEXED(X). {A = X;}
! 189:
! 190: // The following directive causes tokens ABORT, AFTER, ASC, etc. to
! 191: // fallback to ID if they will not parse as their original value.
! 192: // This obviates the need for the "id" nonterminal.
! 193: //
! 194: %fallback ID
! 195: ABORT ACTION AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMNKW
! 196: CONFLICT DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR
! 197: IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN
! 198: QUERY KEY OF OFFSET PRAGMA RAISE RELEASE REPLACE RESTRICT ROW ROLLBACK
! 199: SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL
! 200: %ifdef SQLITE_OMIT_COMPOUND_SELECT
! 201: EXCEPT INTERSECT UNION
! 202: %endif SQLITE_OMIT_COMPOUND_SELECT
! 203: REINDEX RENAME CTIME_KW IF
! 204: .
! 205: %wildcard ANY.
! 206:
! 207: // Define operator precedence early so that this is the first occurance
! 208: // of the operator tokens in the grammer. Keeping the operators together
! 209: // causes them to be assigned integer values that are close together,
! 210: // which keeps parser tables smaller.
! 211: //
! 212: // The token values assigned to these symbols is determined by the order
! 213: // in which lemon first sees them. It must be the case that ISNULL/NOTNULL,
! 214: // NE/EQ, GT/LE, and GE/LT are separated by only a single value. See
! 215: // the sqlite3ExprIfFalse() routine for additional information on this
! 216: // constraint.
! 217: //
! 218: %left OR.
! 219: %left AND.
! 220: %right NOT.
! 221: %left IS MATCH LIKE_KW BETWEEN IN ISNULL NOTNULL NE EQ.
! 222: %left GT LE LT GE.
! 223: %right ESCAPE.
! 224: %left BITAND BITOR LSHIFT RSHIFT.
! 225: %left PLUS MINUS.
! 226: %left STAR SLASH REM.
! 227: %left CONCAT.
! 228: %left COLLATE.
! 229: %right BITNOT.
! 230:
! 231: // And "ids" is an identifer-or-string.
! 232: //
! 233: %type ids {Token}
! 234: ids(A) ::= ID|STRING(X). {A = X;}
! 235:
! 236: // The name of a column or table can be any of the following:
! 237: //
! 238: %type nm {Token}
! 239: nm(A) ::= id(X). {A = X;}
! 240: nm(A) ::= STRING(X). {A = X;}
! 241: nm(A) ::= JOIN_KW(X). {A = X;}
! 242:
! 243: // A typetoken is really one or more tokens that form a type name such
! 244: // as can be found after the column name in a CREATE TABLE statement.
! 245: // Multiple tokens are concatenated to form the value of the typetoken.
! 246: //
! 247: %type typetoken {Token}
! 248: type ::= .
! 249: type ::= typetoken(X). {sqlite3AddColumnType(pParse,&X);}
! 250: typetoken(A) ::= typename(X). {A = X;}
! 251: typetoken(A) ::= typename(X) LP signed RP(Y). {
! 252: A.z = X.z;
! 253: A.n = (int)(&Y.z[Y.n] - X.z);
! 254: }
! 255: typetoken(A) ::= typename(X) LP signed COMMA signed RP(Y). {
! 256: A.z = X.z;
! 257: A.n = (int)(&Y.z[Y.n] - X.z);
! 258: }
! 259: %type typename {Token}
! 260: typename(A) ::= ids(X). {A = X;}
! 261: typename(A) ::= typename(X) ids(Y). {A.z=X.z; A.n=Y.n+(int)(Y.z-X.z);}
! 262: signed ::= plus_num.
! 263: signed ::= minus_num.
! 264:
! 265: // "carglist" is a list of additional constraints that come after the
! 266: // column name and column type in a CREATE TABLE statement.
! 267: //
! 268: carglist ::= carglist carg.
! 269: carglist ::= .
! 270: carg ::= CONSTRAINT nm ccons.
! 271: carg ::= ccons.
! 272: ccons ::= DEFAULT term(X). {sqlite3AddDefaultValue(pParse,&X);}
! 273: ccons ::= DEFAULT LP expr(X) RP. {sqlite3AddDefaultValue(pParse,&X);}
! 274: ccons ::= DEFAULT PLUS term(X). {sqlite3AddDefaultValue(pParse,&X);}
! 275: ccons ::= DEFAULT MINUS(A) term(X). {
! 276: ExprSpan v;
! 277: v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, X.pExpr, 0, 0);
! 278: v.zStart = A.z;
! 279: v.zEnd = X.zEnd;
! 280: sqlite3AddDefaultValue(pParse,&v);
! 281: }
! 282: ccons ::= DEFAULT id(X). {
! 283: ExprSpan v;
! 284: spanExpr(&v, pParse, TK_STRING, &X);
! 285: sqlite3AddDefaultValue(pParse,&v);
! 286: }
! 287:
! 288: // In addition to the type name, we also care about the primary key and
! 289: // UNIQUE constraints.
! 290: //
! 291: ccons ::= NULL onconf.
! 292: ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);}
! 293: ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I).
! 294: {sqlite3AddPrimaryKey(pParse,0,R,I,Z);}
! 295: ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);}
! 296: ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);}
! 297: ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
! 298: {sqlite3CreateForeignKey(pParse,0,&T,TA,R);}
! 299: ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);}
! 300: ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);}
! 301:
! 302: // The optional AUTOINCREMENT keyword
! 303: %type autoinc {int}
! 304: autoinc(X) ::= . {X = 0;}
! 305: autoinc(X) ::= AUTOINCR. {X = 1;}
! 306:
! 307: // The next group of rules parses the arguments to a REFERENCES clause
! 308: // that determine if the referential integrity checking is deferred or
! 309: // or immediate and which determine what action to take if a ref-integ
! 310: // check fails.
! 311: //
! 312: %type refargs {int}
! 313: refargs(A) ::= . { A = OE_None*0x0101; /* EV: R-19803-45884 */}
! 314: refargs(A) ::= refargs(X) refarg(Y). { A = (X & ~Y.mask) | Y.value; }
! 315: %type refarg {struct {int value; int mask;}}
! 316: refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; }
! 317: refarg(A) ::= ON INSERT refact. { A.value = 0; A.mask = 0x000000; }
! 318: refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; }
! 319: refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; }
! 320: %type refact {int}
! 321: refact(A) ::= SET NULL. { A = OE_SetNull; /* EV: R-33326-45252 */}
! 322: refact(A) ::= SET DEFAULT. { A = OE_SetDflt; /* EV: R-33326-45252 */}
! 323: refact(A) ::= CASCADE. { A = OE_Cascade; /* EV: R-33326-45252 */}
! 324: refact(A) ::= RESTRICT. { A = OE_Restrict; /* EV: R-33326-45252 */}
! 325: refact(A) ::= NO ACTION. { A = OE_None; /* EV: R-33326-45252 */}
! 326: %type defer_subclause {int}
! 327: defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt. {A = 0;}
! 328: defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X). {A = X;}
! 329: %type init_deferred_pred_opt {int}
! 330: init_deferred_pred_opt(A) ::= . {A = 0;}
! 331: init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;}
! 332: init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;}
! 333:
! 334: // For the time being, the only constraint we care about is the primary
! 335: // key and UNIQUE. Both create indices.
! 336: //
! 337: conslist_opt(A) ::= . {A.n = 0; A.z = 0;}
! 338: conslist_opt(A) ::= COMMA(X) conslist. {A = X;}
! 339: conslist ::= conslist COMMA tcons.
! 340: conslist ::= conslist tcons.
! 341: conslist ::= tcons.
! 342: tcons ::= CONSTRAINT nm.
! 343: tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R).
! 344: {sqlite3AddPrimaryKey(pParse,X,R,I,0);}
! 345: tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
! 346: {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);}
! 347: tcons ::= CHECK LP expr(E) RP onconf.
! 348: {sqlite3AddCheckConstraint(pParse,E.pExpr);}
! 349: tcons ::= FOREIGN KEY LP idxlist(FA) RP
! 350: REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
! 351: sqlite3CreateForeignKey(pParse, FA, &T, TA, R);
! 352: sqlite3DeferForeignKey(pParse, D);
! 353: }
! 354: %type defer_subclause_opt {int}
! 355: defer_subclause_opt(A) ::= . {A = 0;}
! 356: defer_subclause_opt(A) ::= defer_subclause(X). {A = X;}
! 357:
! 358: // The following is a non-standard extension that allows us to declare the
! 359: // default behavior when there is a constraint conflict.
! 360: //
! 361: %type onconf {int}
! 362: %type orconf {u8}
! 363: %type resolvetype {int}
! 364: onconf(A) ::= . {A = OE_Default;}
! 365: onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;}
! 366: orconf(A) ::= . {A = OE_Default;}
! 367: orconf(A) ::= OR resolvetype(X). {A = (u8)X;}
! 368: resolvetype(A) ::= raisetype(X). {A = X;}
! 369: resolvetype(A) ::= IGNORE. {A = OE_Ignore;}
! 370: resolvetype(A) ::= REPLACE. {A = OE_Replace;}
! 371:
! 372: ////////////////////////// The DROP TABLE /////////////////////////////////////
! 373: //
! 374: cmd ::= DROP TABLE ifexists(E) fullname(X). {
! 375: sqlite3DropTable(pParse, X, 0, E);
! 376: }
! 377: %type ifexists {int}
! 378: ifexists(A) ::= IF EXISTS. {A = 1;}
! 379: ifexists(A) ::= . {A = 0;}
! 380:
! 381: ///////////////////// The CREATE VIEW statement /////////////////////////////
! 382: //
! 383: %ifndef SQLITE_OMIT_VIEW
! 384: cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). {
! 385: sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E);
! 386: }
! 387: cmd ::= DROP VIEW ifexists(E) fullname(X). {
! 388: sqlite3DropTable(pParse, X, 1, E);
! 389: }
! 390: %endif SQLITE_OMIT_VIEW
! 391:
! 392: //////////////////////// The SELECT statement /////////////////////////////////
! 393: //
! 394: cmd ::= select(X). {
! 395: SelectDest dest = {SRT_Output, 0, 0, 0, 0};
! 396: sqlite3Select(pParse, X, &dest);
! 397: sqlite3ExplainBegin(pParse->pVdbe);
! 398: sqlite3ExplainSelect(pParse->pVdbe, X);
! 399: sqlite3ExplainFinish(pParse->pVdbe);
! 400: sqlite3SelectDelete(pParse->db, X);
! 401: }
! 402:
! 403: %type select {Select*}
! 404: %destructor select {sqlite3SelectDelete(pParse->db, $$);}
! 405: %type oneselect {Select*}
! 406: %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);}
! 407:
! 408: select(A) ::= oneselect(X). {A = X;}
! 409: %ifndef SQLITE_OMIT_COMPOUND_SELECT
! 410: select(A) ::= select(X) multiselect_op(Y) oneselect(Z). {
! 411: if( Z ){
! 412: Z->op = (u8)Y;
! 413: Z->pPrior = X;
! 414: }else{
! 415: sqlite3SelectDelete(pParse->db, X);
! 416: }
! 417: A = Z;
! 418: }
! 419: %type multiselect_op {int}
! 420: multiselect_op(A) ::= UNION(OP). {A = @OP;}
! 421: multiselect_op(A) ::= UNION ALL. {A = TK_ALL;}
! 422: multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;}
! 423: %endif SQLITE_OMIT_COMPOUND_SELECT
! 424: oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
! 425: groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
! 426: A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
! 427: }
! 428:
! 429: // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
! 430: // present and false (0) if it is not.
! 431: //
! 432: %type distinct {int}
! 433: distinct(A) ::= DISTINCT. {A = 1;}
! 434: distinct(A) ::= ALL. {A = 0;}
! 435: distinct(A) ::= . {A = 0;}
! 436:
! 437: // selcollist is a list of expressions that are to become the return
! 438: // values of the SELECT statement. The "*" in statements like
! 439: // "SELECT * FROM ..." is encoded as a special expression with an
! 440: // opcode of TK_ALL.
! 441: //
! 442: %type selcollist {ExprList*}
! 443: %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);}
! 444: %type sclp {ExprList*}
! 445: %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);}
! 446: sclp(A) ::= selcollist(X) COMMA. {A = X;}
! 447: sclp(A) ::= . {A = 0;}
! 448: selcollist(A) ::= sclp(P) expr(X) as(Y). {
! 449: A = sqlite3ExprListAppend(pParse, P, X.pExpr);
! 450: if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1);
! 451: sqlite3ExprListSetSpan(pParse,A,&X);
! 452: }
! 453: selcollist(A) ::= sclp(P) STAR. {
! 454: Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0);
! 455: A = sqlite3ExprListAppend(pParse, P, p);
! 456: }
! 457: selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). {
! 458: Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y);
! 459: Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
! 460: Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0);
! 461: A = sqlite3ExprListAppend(pParse,P, pDot);
! 462: }
! 463:
! 464: // An option "AS <id>" phrase that can follow one of the expressions that
! 465: // define the result set, or one of the tables in the FROM clause.
! 466: //
! 467: %type as {Token}
! 468: as(X) ::= AS nm(Y). {X = Y;}
! 469: as(X) ::= ids(Y). {X = Y;}
! 470: as(X) ::= . {X.n = 0;}
! 471:
! 472:
! 473: %type seltablist {SrcList*}
! 474: %destructor seltablist {sqlite3SrcListDelete(pParse->db, $$);}
! 475: %type stl_prefix {SrcList*}
! 476: %destructor stl_prefix {sqlite3SrcListDelete(pParse->db, $$);}
! 477: %type from {SrcList*}
! 478: %destructor from {sqlite3SrcListDelete(pParse->db, $$);}
! 479:
! 480: // A complete FROM clause.
! 481: //
! 482: from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));}
! 483: from(A) ::= FROM seltablist(X). {
! 484: A = X;
! 485: sqlite3SrcListShiftJoinType(A);
! 486: }
! 487:
! 488: // "seltablist" is a "Select Table List" - the content of the FROM clause
! 489: // in a SELECT statement. "stl_prefix" is a prefix of this list.
! 490: //
! 491: stl_prefix(A) ::= seltablist(X) joinop(Y). {
! 492: A = X;
! 493: if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y;
! 494: }
! 495: stl_prefix(A) ::= . {A = 0;}
! 496: seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) on_opt(N) using_opt(U). {
! 497: A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U);
! 498: sqlite3SrcListIndexedBy(pParse, A, &I);
! 499: }
! 500: %ifndef SQLITE_OMIT_SUBQUERY
! 501: seltablist(A) ::= stl_prefix(X) LP select(S) RP
! 502: as(Z) on_opt(N) using_opt(U). {
! 503: A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U);
! 504: }
! 505: seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP
! 506: as(Z) on_opt(N) using_opt(U). {
! 507: if( X==0 && Z.n==0 && N==0 && U==0 ){
! 508: A = F;
! 509: }else{
! 510: Select *pSubquery;
! 511: sqlite3SrcListShiftJoinType(F);
! 512: pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
! 513: A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,pSubquery,N,U);
! 514: }
! 515: }
! 516:
! 517: // A seltablist_paren nonterminal represents anything in a FROM that
! 518: // is contained inside parentheses. This can be either a subquery or
! 519: // a grouping of table and subqueries.
! 520: //
! 521: // %type seltablist_paren {Select*}
! 522: // %destructor seltablist_paren {sqlite3SelectDelete(pParse->db, $$);}
! 523: // seltablist_paren(A) ::= select(S). {A = S;}
! 524: // seltablist_paren(A) ::= seltablist(F). {
! 525: // sqlite3SrcListShiftJoinType(F);
! 526: // A = sqlite3SelectNew(pParse,0,F,0,0,0,0,0,0,0);
! 527: // }
! 528: %endif SQLITE_OMIT_SUBQUERY
! 529:
! 530: %type dbnm {Token}
! 531: dbnm(A) ::= . {A.z=0; A.n=0;}
! 532: dbnm(A) ::= DOT nm(X). {A = X;}
! 533:
! 534: %type fullname {SrcList*}
! 535: %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);}
! 536: fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);}
! 537:
! 538: %type joinop {int}
! 539: %type joinop2 {int}
! 540: joinop(X) ::= COMMA|JOIN. { X = JT_INNER; }
! 541: joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); }
! 542: joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); }
! 543: joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
! 544: { X = sqlite3JoinType(pParse,&A,&B,&C); }
! 545:
! 546: %type on_opt {Expr*}
! 547: %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);}
! 548: on_opt(N) ::= ON expr(E). {N = E.pExpr;}
! 549: on_opt(N) ::= . {N = 0;}
! 550:
! 551: // Note that this block abuses the Token type just a little. If there is
! 552: // no "INDEXED BY" clause, the returned token is empty (z==0 && n==0). If
! 553: // there is an INDEXED BY clause, then the token is populated as per normal,
! 554: // with z pointing to the token data and n containing the number of bytes
! 555: // in the token.
! 556: //
! 557: // If there is a "NOT INDEXED" clause, then (z==0 && n==1), which is
! 558: // normally illegal. The sqlite3SrcListIndexedBy() function
! 559: // recognizes and interprets this as a special case.
! 560: //
! 561: %type indexed_opt {Token}
! 562: indexed_opt(A) ::= . {A.z=0; A.n=0;}
! 563: indexed_opt(A) ::= INDEXED BY nm(X). {A = X;}
! 564: indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;}
! 565:
! 566: %type using_opt {IdList*}
! 567: %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);}
! 568: using_opt(U) ::= USING LP inscollist(L) RP. {U = L;}
! 569: using_opt(U) ::= . {U = 0;}
! 570:
! 571:
! 572: %type orderby_opt {ExprList*}
! 573: %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);}
! 574: %type sortlist {ExprList*}
! 575: %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);}
! 576: %type sortitem {Expr*}
! 577: %destructor sortitem {sqlite3ExprDelete(pParse->db, $$);}
! 578:
! 579: orderby_opt(A) ::= . {A = 0;}
! 580: orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;}
! 581: sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). {
! 582: A = sqlite3ExprListAppend(pParse,X,Y);
! 583: if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
! 584: }
! 585: sortlist(A) ::= sortitem(Y) sortorder(Z). {
! 586: A = sqlite3ExprListAppend(pParse,0,Y);
! 587: if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z;
! 588: }
! 589: sortitem(A) ::= expr(X). {A = X.pExpr;}
! 590:
! 591: %type sortorder {int}
! 592:
! 593: sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;}
! 594: sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;}
! 595: sortorder(A) ::= . {A = SQLITE_SO_ASC;}
! 596:
! 597: %type groupby_opt {ExprList*}
! 598: %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);}
! 599: groupby_opt(A) ::= . {A = 0;}
! 600: groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}
! 601:
! 602: %type having_opt {Expr*}
! 603: %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);}
! 604: having_opt(A) ::= . {A = 0;}
! 605: having_opt(A) ::= HAVING expr(X). {A = X.pExpr;}
! 606:
! 607: %type limit_opt {struct LimitVal}
! 608:
! 609: // The destructor for limit_opt will never fire in the current grammar.
! 610: // The limit_opt non-terminal only occurs at the end of a single production
! 611: // rule for SELECT statements. As soon as the rule that create the
! 612: // limit_opt non-terminal reduces, the SELECT statement rule will also
! 613: // reduce. So there is never a limit_opt non-terminal on the stack
! 614: // except as a transient. So there is never anything to destroy.
! 615: //
! 616: //%destructor limit_opt {
! 617: // sqlite3ExprDelete(pParse->db, $$.pLimit);
! 618: // sqlite3ExprDelete(pParse->db, $$.pOffset);
! 619: //}
! 620: limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;}
! 621: limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X.pExpr; A.pOffset = 0;}
! 622: limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
! 623: {A.pLimit = X.pExpr; A.pOffset = Y.pExpr;}
! 624: limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y).
! 625: {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
! 626:
! 627: /////////////////////////// The DELETE statement /////////////////////////////
! 628: //
! 629: %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
! 630: cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W)
! 631: orderby_opt(O) limit_opt(L). {
! 632: sqlite3SrcListIndexedBy(pParse, X, &I);
! 633: W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "DELETE");
! 634: sqlite3DeleteFrom(pParse,X,W);
! 635: }
! 636: %endif
! 637: %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
! 638: cmd ::= DELETE FROM fullname(X) indexed_opt(I) where_opt(W). {
! 639: sqlite3SrcListIndexedBy(pParse, X, &I);
! 640: sqlite3DeleteFrom(pParse,X,W);
! 641: }
! 642: %endif
! 643:
! 644: %type where_opt {Expr*}
! 645: %destructor where_opt {sqlite3ExprDelete(pParse->db, $$);}
! 646:
! 647: where_opt(A) ::= . {A = 0;}
! 648: where_opt(A) ::= WHERE expr(X). {A = X.pExpr;}
! 649:
! 650: ////////////////////////// The UPDATE command ////////////////////////////////
! 651: //
! 652: %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
! 653: cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W) orderby_opt(O) limit_opt(L). {
! 654: sqlite3SrcListIndexedBy(pParse, X, &I);
! 655: sqlite3ExprListCheckLength(pParse,Y,"set list");
! 656: W = sqlite3LimitWhere(pParse, X, W, O, L.pLimit, L.pOffset, "UPDATE");
! 657: sqlite3Update(pParse,X,Y,W,R);
! 658: }
! 659: %endif
! 660: %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
! 661: cmd ::= UPDATE orconf(R) fullname(X) indexed_opt(I) SET setlist(Y) where_opt(W). {
! 662: sqlite3SrcListIndexedBy(pParse, X, &I);
! 663: sqlite3ExprListCheckLength(pParse,Y,"set list");
! 664: sqlite3Update(pParse,X,Y,W,R);
! 665: }
! 666: %endif
! 667:
! 668: %type setlist {ExprList*}
! 669: %destructor setlist {sqlite3ExprListDelete(pParse->db, $$);}
! 670:
! 671: setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {
! 672: A = sqlite3ExprListAppend(pParse, Z, Y.pExpr);
! 673: sqlite3ExprListSetName(pParse, A, &X, 1);
! 674: }
! 675: setlist(A) ::= nm(X) EQ expr(Y). {
! 676: A = sqlite3ExprListAppend(pParse, 0, Y.pExpr);
! 677: sqlite3ExprListSetName(pParse, A, &X, 1);
! 678: }
! 679:
! 680: ////////////////////////// The INSERT command /////////////////////////////////
! 681: //
! 682: cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F)
! 683: VALUES LP itemlist(Y) RP.
! 684: {sqlite3Insert(pParse, X, Y, 0, F, R);}
! 685: cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S).
! 686: {sqlite3Insert(pParse, X, 0, S, F, R);}
! 687: cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES.
! 688: {sqlite3Insert(pParse, X, 0, 0, F, R);}
! 689:
! 690: %type insert_cmd {u8}
! 691: insert_cmd(A) ::= INSERT orconf(R). {A = R;}
! 692: insert_cmd(A) ::= REPLACE. {A = OE_Replace;}
! 693:
! 694:
! 695: %type itemlist {ExprList*}
! 696: %destructor itemlist {sqlite3ExprListDelete(pParse->db, $$);}
! 697:
! 698: itemlist(A) ::= itemlist(X) COMMA expr(Y).
! 699: {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
! 700: itemlist(A) ::= expr(X).
! 701: {A = sqlite3ExprListAppend(pParse,0,X.pExpr);}
! 702:
! 703: %type inscollist_opt {IdList*}
! 704: %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);}
! 705: %type inscollist {IdList*}
! 706: %destructor inscollist {sqlite3IdListDelete(pParse->db, $$);}
! 707:
! 708: inscollist_opt(A) ::= . {A = 0;}
! 709: inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;}
! 710: inscollist(A) ::= inscollist(X) COMMA nm(Y).
! 711: {A = sqlite3IdListAppend(pParse->db,X,&Y);}
! 712: inscollist(A) ::= nm(Y).
! 713: {A = sqlite3IdListAppend(pParse->db,0,&Y);}
! 714:
! 715: /////////////////////////// Expression Processing /////////////////////////////
! 716: //
! 717:
! 718: %type expr {ExprSpan}
! 719: %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);}
! 720: %type term {ExprSpan}
! 721: %destructor term {sqlite3ExprDelete(pParse->db, $$.pExpr);}
! 722:
! 723: %include {
! 724: /* This is a utility routine used to set the ExprSpan.zStart and
! 725: ** ExprSpan.zEnd values of pOut so that the span covers the complete
! 726: ** range of text beginning with pStart and going to the end of pEnd.
! 727: */
! 728: static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){
! 729: pOut->zStart = pStart->z;
! 730: pOut->zEnd = &pEnd->z[pEnd->n];
! 731: }
! 732:
! 733: /* Construct a new Expr object from a single identifier. Use the
! 734: ** new Expr to populate pOut. Set the span of pOut to be the identifier
! 735: ** that created the expression.
! 736: */
! 737: static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){
! 738: pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue);
! 739: pOut->zStart = pValue->z;
! 740: pOut->zEnd = &pValue->z[pValue->n];
! 741: }
! 742: }
! 743:
! 744: expr(A) ::= term(X). {A = X;}
! 745: expr(A) ::= LP(B) expr(X) RP(E). {A.pExpr = X.pExpr; spanSet(&A,&B,&E);}
! 746: term(A) ::= NULL(X). {spanExpr(&A, pParse, @X, &X);}
! 747: expr(A) ::= id(X). {spanExpr(&A, pParse, TK_ID, &X);}
! 748: expr(A) ::= JOIN_KW(X). {spanExpr(&A, pParse, TK_ID, &X);}
! 749: expr(A) ::= nm(X) DOT nm(Y). {
! 750: Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
! 751: Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
! 752: A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0);
! 753: spanSet(&A,&X,&Y);
! 754: }
! 755: expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
! 756: Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &X);
! 757: Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Y);
! 758: Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &Z);
! 759: Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0);
! 760: A.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0);
! 761: spanSet(&A,&X,&Z);
! 762: }
! 763: term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);}
! 764: term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);}
! 765: expr(A) ::= REGISTER(X). {
! 766: /* When doing a nested parse, one can include terms in an expression
! 767: ** that look like this: #1 #2 ... These terms refer to registers
! 768: ** in the virtual machine. #N is the N-th register. */
! 769: if( pParse->nested==0 ){
! 770: sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &X);
! 771: A.pExpr = 0;
! 772: }else{
! 773: A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
! 774: if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
! 775: }
! 776: spanSet(&A, &X, &X);
! 777: }
! 778: expr(A) ::= VARIABLE(X). {
! 779: spanExpr(&A, pParse, TK_VARIABLE, &X);
! 780: sqlite3ExprAssignVarNumber(pParse, A.pExpr);
! 781: spanSet(&A, &X, &X);
! 782: }
! 783: expr(A) ::= expr(E) COLLATE ids(C). {
! 784: A.pExpr = sqlite3ExprSetCollByToken(pParse, E.pExpr, &C);
! 785: A.zStart = E.zStart;
! 786: A.zEnd = &C.z[C.n];
! 787: }
! 788: %ifndef SQLITE_OMIT_CAST
! 789: expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
! 790: A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T);
! 791: spanSet(&A,&X,&Y);
! 792: }
! 793: %endif SQLITE_OMIT_CAST
! 794: expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). {
! 795: if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
! 796: sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
! 797: }
! 798: A.pExpr = sqlite3ExprFunction(pParse, Y, &X);
! 799: spanSet(&A,&X,&E);
! 800: if( D && A.pExpr ){
! 801: A.pExpr->flags |= EP_Distinct;
! 802: }
! 803: }
! 804: expr(A) ::= ID(X) LP STAR RP(E). {
! 805: A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
! 806: spanSet(&A,&X,&E);
! 807: }
! 808: term(A) ::= CTIME_KW(OP). {
! 809: /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are
! 810: ** treated as functions that return constants */
! 811: A.pExpr = sqlite3ExprFunction(pParse, 0,&OP);
! 812: if( A.pExpr ){
! 813: A.pExpr->op = TK_CONST_FUNC;
! 814: }
! 815: spanSet(&A, &OP, &OP);
! 816: }
! 817:
! 818: %include {
! 819: /* This routine constructs a binary expression node out of two ExprSpan
! 820: ** objects and uses the result to populate a new ExprSpan object.
! 821: */
! 822: static void spanBinaryExpr(
! 823: ExprSpan *pOut, /* Write the result here */
! 824: Parse *pParse, /* The parsing context. Errors accumulate here */
! 825: int op, /* The binary operation */
! 826: ExprSpan *pLeft, /* The left operand */
! 827: ExprSpan *pRight /* The right operand */
! 828: ){
! 829: pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0);
! 830: pOut->zStart = pLeft->zStart;
! 831: pOut->zEnd = pRight->zEnd;
! 832: }
! 833: }
! 834:
! 835: expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 836: expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 837: expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y).
! 838: {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 839: expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 840: expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y).
! 841: {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 842: expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y).
! 843: {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 844: expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y).
! 845: {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 846: expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);}
! 847: %type likeop {struct LikeOp}
! 848: likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;}
! 849: likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;}
! 850: likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;}
! 851: likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;}
! 852: expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] {
! 853: ExprList *pList;
! 854: pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
! 855: pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
! 856: A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
! 857: if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
! 858: A.zStart = X.zStart;
! 859: A.zEnd = Y.zEnd;
! 860: if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
! 861: }
! 862: expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] {
! 863: ExprList *pList;
! 864: pList = sqlite3ExprListAppend(pParse,0, Y.pExpr);
! 865: pList = sqlite3ExprListAppend(pParse,pList, X.pExpr);
! 866: pList = sqlite3ExprListAppend(pParse,pList, E.pExpr);
! 867: A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator);
! 868: if( OP.not ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
! 869: A.zStart = X.zStart;
! 870: A.zEnd = E.zEnd;
! 871: if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc;
! 872: }
! 873:
! 874: %include {
! 875: /* Construct an expression node for a unary postfix operator
! 876: */
! 877: static void spanUnaryPostfix(
! 878: ExprSpan *pOut, /* Write the new expression node here */
! 879: Parse *pParse, /* Parsing context to record errors */
! 880: int op, /* The operator */
! 881: ExprSpan *pOperand, /* The operand */
! 882: Token *pPostOp /* The operand token for setting the span */
! 883: ){
! 884: pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
! 885: pOut->zStart = pOperand->zStart;
! 886: pOut->zEnd = &pPostOp->z[pPostOp->n];
! 887: }
! 888: }
! 889:
! 890: expr(A) ::= expr(X) ISNULL|NOTNULL(E). {spanUnaryPostfix(&A,pParse,@E,&X,&E);}
! 891: expr(A) ::= expr(X) NOT NULL(E). {spanUnaryPostfix(&A,pParse,TK_NOTNULL,&X,&E);}
! 892:
! 893: %include {
! 894: /* A routine to convert a binary TK_IS or TK_ISNOT expression into a
! 895: ** unary TK_ISNULL or TK_NOTNULL expression. */
! 896: static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){
! 897: sqlite3 *db = pParse->db;
! 898: if( db->mallocFailed==0 && pY->op==TK_NULL ){
! 899: pA->op = (u8)op;
! 900: sqlite3ExprDelete(db, pA->pRight);
! 901: pA->pRight = 0;
! 902: }
! 903: }
! 904: }
! 905:
! 906: // expr1 IS expr2
! 907: // expr1 IS NOT expr2
! 908: //
! 909: // If expr2 is NULL then code as TK_ISNULL or TK_NOTNULL. If expr2
! 910: // is any other expression, code as TK_IS or TK_ISNOT.
! 911: //
! 912: expr(A) ::= expr(X) IS expr(Y). {
! 913: spanBinaryExpr(&A,pParse,TK_IS,&X,&Y);
! 914: binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_ISNULL);
! 915: }
! 916: expr(A) ::= expr(X) IS NOT expr(Y). {
! 917: spanBinaryExpr(&A,pParse,TK_ISNOT,&X,&Y);
! 918: binaryToUnaryIfNull(pParse, Y.pExpr, A.pExpr, TK_NOTNULL);
! 919: }
! 920:
! 921: %include {
! 922: /* Construct an expression node for a unary prefix operator
! 923: */
! 924: static void spanUnaryPrefix(
! 925: ExprSpan *pOut, /* Write the new expression node here */
! 926: Parse *pParse, /* Parsing context to record errors */
! 927: int op, /* The operator */
! 928: ExprSpan *pOperand, /* The operand */
! 929: Token *pPreOp /* The operand token for setting the span */
! 930: ){
! 931: pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0);
! 932: pOut->zStart = pPreOp->z;
! 933: pOut->zEnd = pOperand->zEnd;
! 934: }
! 935: }
! 936:
! 937:
! 938:
! 939: expr(A) ::= NOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
! 940: expr(A) ::= BITNOT(B) expr(X). {spanUnaryPrefix(&A,pParse,@B,&X,&B);}
! 941: expr(A) ::= MINUS(B) expr(X). [BITNOT]
! 942: {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);}
! 943: expr(A) ::= PLUS(B) expr(X). [BITNOT]
! 944: {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);}
! 945:
! 946: %type between_op {int}
! 947: between_op(A) ::= BETWEEN. {A = 0;}
! 948: between_op(A) ::= NOT BETWEEN. {A = 1;}
! 949: expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
! 950: ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr);
! 951: pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr);
! 952: A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0);
! 953: if( A.pExpr ){
! 954: A.pExpr->x.pList = pList;
! 955: }else{
! 956: sqlite3ExprListDelete(pParse->db, pList);
! 957: }
! 958: if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
! 959: A.zStart = W.zStart;
! 960: A.zEnd = Y.zEnd;
! 961: }
! 962: %ifndef SQLITE_OMIT_SUBQUERY
! 963: %type in_op {int}
! 964: in_op(A) ::= IN. {A = 0;}
! 965: in_op(A) ::= NOT IN. {A = 1;}
! 966: expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] {
! 967: if( Y==0 ){
! 968: /* Expressions of the form
! 969: **
! 970: ** expr1 IN ()
! 971: ** expr1 NOT IN ()
! 972: **
! 973: ** simplify to constants 0 (false) and 1 (true), respectively,
! 974: ** regardless of the value of expr1.
! 975: */
! 976: A.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[N]);
! 977: sqlite3ExprDelete(pParse->db, X.pExpr);
! 978: }else{
! 979: A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
! 980: if( A.pExpr ){
! 981: A.pExpr->x.pList = Y;
! 982: sqlite3ExprSetHeight(pParse, A.pExpr);
! 983: }else{
! 984: sqlite3ExprListDelete(pParse->db, Y);
! 985: }
! 986: if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
! 987: }
! 988: A.zStart = X.zStart;
! 989: A.zEnd = &E.z[E.n];
! 990: }
! 991: expr(A) ::= LP(B) select(X) RP(E). {
! 992: A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0);
! 993: if( A.pExpr ){
! 994: A.pExpr->x.pSelect = X;
! 995: ExprSetProperty(A.pExpr, EP_xIsSelect);
! 996: sqlite3ExprSetHeight(pParse, A.pExpr);
! 997: }else{
! 998: sqlite3SelectDelete(pParse->db, X);
! 999: }
! 1000: A.zStart = B.z;
! 1001: A.zEnd = &E.z[E.n];
! 1002: }
! 1003: expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] {
! 1004: A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
! 1005: if( A.pExpr ){
! 1006: A.pExpr->x.pSelect = Y;
! 1007: ExprSetProperty(A.pExpr, EP_xIsSelect);
! 1008: sqlite3ExprSetHeight(pParse, A.pExpr);
! 1009: }else{
! 1010: sqlite3SelectDelete(pParse->db, Y);
! 1011: }
! 1012: if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
! 1013: A.zStart = X.zStart;
! 1014: A.zEnd = &E.z[E.n];
! 1015: }
! 1016: expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] {
! 1017: SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z);
! 1018: A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0);
! 1019: if( A.pExpr ){
! 1020: A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0);
! 1021: ExprSetProperty(A.pExpr, EP_xIsSelect);
! 1022: sqlite3ExprSetHeight(pParse, A.pExpr);
! 1023: }else{
! 1024: sqlite3SrcListDelete(pParse->db, pSrc);
! 1025: }
! 1026: if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0);
! 1027: A.zStart = X.zStart;
! 1028: A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n];
! 1029: }
! 1030: expr(A) ::= EXISTS(B) LP select(Y) RP(E). {
! 1031: Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0);
! 1032: if( p ){
! 1033: p->x.pSelect = Y;
! 1034: ExprSetProperty(p, EP_xIsSelect);
! 1035: sqlite3ExprSetHeight(pParse, p);
! 1036: }else{
! 1037: sqlite3SelectDelete(pParse->db, Y);
! 1038: }
! 1039: A.zStart = B.z;
! 1040: A.zEnd = &E.z[E.n];
! 1041: }
! 1042: %endif SQLITE_OMIT_SUBQUERY
! 1043:
! 1044: /* CASE expressions */
! 1045: expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
! 1046: A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, Z, 0);
! 1047: if( A.pExpr ){
! 1048: A.pExpr->x.pList = Y;
! 1049: sqlite3ExprSetHeight(pParse, A.pExpr);
! 1050: }else{
! 1051: sqlite3ExprListDelete(pParse->db, Y);
! 1052: }
! 1053: A.zStart = C.z;
! 1054: A.zEnd = &E.z[E.n];
! 1055: }
! 1056: %type case_exprlist {ExprList*}
! 1057: %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);}
! 1058: case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
! 1059: A = sqlite3ExprListAppend(pParse,X, Y.pExpr);
! 1060: A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
! 1061: }
! 1062: case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
! 1063: A = sqlite3ExprListAppend(pParse,0, Y.pExpr);
! 1064: A = sqlite3ExprListAppend(pParse,A, Z.pExpr);
! 1065: }
! 1066: %type case_else {Expr*}
! 1067: %destructor case_else {sqlite3ExprDelete(pParse->db, $$);}
! 1068: case_else(A) ::= ELSE expr(X). {A = X.pExpr;}
! 1069: case_else(A) ::= . {A = 0;}
! 1070: %type case_operand {Expr*}
! 1071: %destructor case_operand {sqlite3ExprDelete(pParse->db, $$);}
! 1072: case_operand(A) ::= expr(X). {A = X.pExpr;}
! 1073: case_operand(A) ::= . {A = 0;}
! 1074:
! 1075: %type exprlist {ExprList*}
! 1076: %destructor exprlist {sqlite3ExprListDelete(pParse->db, $$);}
! 1077: %type nexprlist {ExprList*}
! 1078: %destructor nexprlist {sqlite3ExprListDelete(pParse->db, $$);}
! 1079:
! 1080: exprlist(A) ::= nexprlist(X). {A = X;}
! 1081: exprlist(A) ::= . {A = 0;}
! 1082: nexprlist(A) ::= nexprlist(X) COMMA expr(Y).
! 1083: {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);}
! 1084: nexprlist(A) ::= expr(Y).
! 1085: {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);}
! 1086:
! 1087:
! 1088: ///////////////////////////// The CREATE INDEX command ///////////////////////
! 1089: //
! 1090: cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D)
! 1091: ON nm(Y) LP idxlist(Z) RP(E). {
! 1092: sqlite3CreateIndex(pParse, &X, &D,
! 1093: sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U,
! 1094: &S, &E, SQLITE_SO_ASC, NE);
! 1095: }
! 1096:
! 1097: %type uniqueflag {int}
! 1098: uniqueflag(A) ::= UNIQUE. {A = OE_Abort;}
! 1099: uniqueflag(A) ::= . {A = OE_None;}
! 1100:
! 1101: %type idxlist {ExprList*}
! 1102: %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);}
! 1103: %type idxlist_opt {ExprList*}
! 1104: %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);}
! 1105:
! 1106: idxlist_opt(A) ::= . {A = 0;}
! 1107: idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;}
! 1108: idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). {
! 1109: Expr *p = 0;
! 1110: if( C.n>0 ){
! 1111: p = sqlite3Expr(pParse->db, TK_COLUMN, 0);
! 1112: sqlite3ExprSetCollByToken(pParse, p, &C);
! 1113: }
! 1114: A = sqlite3ExprListAppend(pParse,X, p);
! 1115: sqlite3ExprListSetName(pParse,A,&Y,1);
! 1116: sqlite3ExprListCheckLength(pParse, A, "index");
! 1117: if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
! 1118: }
! 1119: idxlist(A) ::= nm(Y) collate(C) sortorder(Z). {
! 1120: Expr *p = 0;
! 1121: if( C.n>0 ){
! 1122: p = sqlite3PExpr(pParse, TK_COLUMN, 0, 0, 0);
! 1123: sqlite3ExprSetCollByToken(pParse, p, &C);
! 1124: }
! 1125: A = sqlite3ExprListAppend(pParse,0, p);
! 1126: sqlite3ExprListSetName(pParse, A, &Y, 1);
! 1127: sqlite3ExprListCheckLength(pParse, A, "index");
! 1128: if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z;
! 1129: }
! 1130:
! 1131: %type collate {Token}
! 1132: collate(C) ::= . {C.z = 0; C.n = 0;}
! 1133: collate(C) ::= COLLATE ids(X). {C = X;}
! 1134:
! 1135:
! 1136: ///////////////////////////// The DROP INDEX command /////////////////////////
! 1137: //
! 1138: cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);}
! 1139:
! 1140: ///////////////////////////// The VACUUM command /////////////////////////////
! 1141: //
! 1142: %ifndef SQLITE_OMIT_VACUUM
! 1143: %ifndef SQLITE_OMIT_ATTACH
! 1144: cmd ::= VACUUM. {sqlite3Vacuum(pParse);}
! 1145: cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);}
! 1146: %endif SQLITE_OMIT_ATTACH
! 1147: %endif SQLITE_OMIT_VACUUM
! 1148:
! 1149: ///////////////////////////// The PRAGMA command /////////////////////////////
! 1150: //
! 1151: %ifndef SQLITE_OMIT_PRAGMA
! 1152: cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);}
! 1153: cmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
! 1154: cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}
! 1155: cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y).
! 1156: {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
! 1157: cmd ::= PRAGMA nm(X) dbnm(Z) LP minus_num(Y) RP.
! 1158: {sqlite3Pragma(pParse,&X,&Z,&Y,1);}
! 1159:
! 1160: nmnum(A) ::= plus_num(X). {A = X;}
! 1161: nmnum(A) ::= nm(X). {A = X;}
! 1162: nmnum(A) ::= ON(X). {A = X;}
! 1163: nmnum(A) ::= DELETE(X). {A = X;}
! 1164: nmnum(A) ::= DEFAULT(X). {A = X;}
! 1165: %endif SQLITE_OMIT_PRAGMA
! 1166: plus_num(A) ::= plus_opt number(X). {A = X;}
! 1167: minus_num(A) ::= MINUS number(X). {A = X;}
! 1168: number(A) ::= INTEGER|FLOAT(X). {A = X;}
! 1169: plus_opt ::= PLUS.
! 1170: plus_opt ::= .
! 1171:
! 1172: //////////////////////////// The CREATE TRIGGER command /////////////////////
! 1173:
! 1174: %ifndef SQLITE_OMIT_TRIGGER
! 1175:
! 1176: cmd ::= createkw trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). {
! 1177: Token all;
! 1178: all.z = A.z;
! 1179: all.n = (int)(Z.z - A.z) + Z.n;
! 1180: sqlite3FinishTrigger(pParse, S, &all);
! 1181: }
! 1182:
! 1183: trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z)
! 1184: trigger_time(C) trigger_event(D)
! 1185: ON fullname(E) foreach_clause when_clause(G). {
! 1186: sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR);
! 1187: A = (Z.n==0?B:Z);
! 1188: }
! 1189:
! 1190: %type trigger_time {int}
! 1191: trigger_time(A) ::= BEFORE. { A = TK_BEFORE; }
! 1192: trigger_time(A) ::= AFTER. { A = TK_AFTER; }
! 1193: trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;}
! 1194: trigger_time(A) ::= . { A = TK_BEFORE; }
! 1195:
! 1196: %type trigger_event {struct TrigEvent}
! 1197: %destructor trigger_event {sqlite3IdListDelete(pParse->db, $$.b);}
! 1198: trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;}
! 1199: trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;}
! 1200: trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}
! 1201:
! 1202: foreach_clause ::= .
! 1203: foreach_clause ::= FOR EACH ROW.
! 1204:
! 1205: %type when_clause {Expr*}
! 1206: %destructor when_clause {sqlite3ExprDelete(pParse->db, $$);}
! 1207: when_clause(A) ::= . { A = 0; }
! 1208: when_clause(A) ::= WHEN expr(X). { A = X.pExpr; }
! 1209:
! 1210: %type trigger_cmd_list {TriggerStep*}
! 1211: %destructor trigger_cmd_list {sqlite3DeleteTriggerStep(pParse->db, $$);}
! 1212: trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. {
! 1213: assert( Y!=0 );
! 1214: Y->pLast->pNext = X;
! 1215: Y->pLast = X;
! 1216: A = Y;
! 1217: }
! 1218: trigger_cmd_list(A) ::= trigger_cmd(X) SEMI. {
! 1219: assert( X!=0 );
! 1220: X->pLast = X;
! 1221: A = X;
! 1222: }
! 1223:
! 1224: // Disallow qualified table names on INSERT, UPDATE, and DELETE statements
! 1225: // within a trigger. The table to INSERT, UPDATE, or DELETE is always in
! 1226: // the same database as the table that the trigger fires on.
! 1227: //
! 1228: %type trnm {Token}
! 1229: trnm(A) ::= nm(X). {A = X;}
! 1230: trnm(A) ::= nm DOT nm(X). {
! 1231: A = X;
! 1232: sqlite3ErrorMsg(pParse,
! 1233: "qualified table names are not allowed on INSERT, UPDATE, and DELETE "
! 1234: "statements within triggers");
! 1235: }
! 1236:
! 1237: // Disallow the INDEX BY and NOT INDEXED clauses on UPDATE and DELETE
! 1238: // statements within triggers. We make a specific error message for this
! 1239: // since it is an exception to the default grammar rules.
! 1240: //
! 1241: tridxby ::= .
! 1242: tridxby ::= INDEXED BY nm. {
! 1243: sqlite3ErrorMsg(pParse,
! 1244: "the INDEXED BY clause is not allowed on UPDATE or DELETE statements "
! 1245: "within triggers");
! 1246: }
! 1247: tridxby ::= NOT INDEXED. {
! 1248: sqlite3ErrorMsg(pParse,
! 1249: "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements "
! 1250: "within triggers");
! 1251: }
! 1252:
! 1253:
! 1254:
! 1255: %type trigger_cmd {TriggerStep*}
! 1256: %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);}
! 1257: // UPDATE
! 1258: trigger_cmd(A) ::=
! 1259: UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z).
! 1260: { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); }
! 1261:
! 1262: // INSERT
! 1263: trigger_cmd(A) ::=
! 1264: insert_cmd(R) INTO trnm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
! 1265: {A = sqlite3TriggerInsertStep(pParse->db, &X, F, Y, 0, R);}
! 1266:
! 1267: trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S).
! 1268: {A = sqlite3TriggerInsertStep(pParse->db, &X, F, 0, S, R);}
! 1269:
! 1270: // DELETE
! 1271: trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y).
! 1272: {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);}
! 1273:
! 1274: // SELECT
! 1275: trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); }
! 1276:
! 1277: // The special RAISE expression that may occur in trigger programs
! 1278: expr(A) ::= RAISE(X) LP IGNORE RP(Y). {
! 1279: A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0);
! 1280: if( A.pExpr ){
! 1281: A.pExpr->affinity = OE_Ignore;
! 1282: }
! 1283: A.zStart = X.z;
! 1284: A.zEnd = &Y.z[Y.n];
! 1285: }
! 1286: expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). {
! 1287: A.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &Z);
! 1288: if( A.pExpr ) {
! 1289: A.pExpr->affinity = (char)T;
! 1290: }
! 1291: A.zStart = X.z;
! 1292: A.zEnd = &Y.z[Y.n];
! 1293: }
! 1294: %endif !SQLITE_OMIT_TRIGGER
! 1295:
! 1296: %type raisetype {int}
! 1297: raisetype(A) ::= ROLLBACK. {A = OE_Rollback;}
! 1298: raisetype(A) ::= ABORT. {A = OE_Abort;}
! 1299: raisetype(A) ::= FAIL. {A = OE_Fail;}
! 1300:
! 1301:
! 1302: //////////////////////// DROP TRIGGER statement //////////////////////////////
! 1303: %ifndef SQLITE_OMIT_TRIGGER
! 1304: cmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). {
! 1305: sqlite3DropTrigger(pParse,X,NOERR);
! 1306: }
! 1307: %endif !SQLITE_OMIT_TRIGGER
! 1308:
! 1309: //////////////////////// ATTACH DATABASE file AS name /////////////////////////
! 1310: %ifndef SQLITE_OMIT_ATTACH
! 1311: cmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). {
! 1312: sqlite3Attach(pParse, F.pExpr, D.pExpr, K);
! 1313: }
! 1314: cmd ::= DETACH database_kw_opt expr(D). {
! 1315: sqlite3Detach(pParse, D.pExpr);
! 1316: }
! 1317:
! 1318: %type key_opt {Expr*}
! 1319: %destructor key_opt {sqlite3ExprDelete(pParse->db, $$);}
! 1320: key_opt(A) ::= . { A = 0; }
! 1321: key_opt(A) ::= KEY expr(X). { A = X.pExpr; }
! 1322:
! 1323: database_kw_opt ::= DATABASE.
! 1324: database_kw_opt ::= .
! 1325: %endif SQLITE_OMIT_ATTACH
! 1326:
! 1327: ////////////////////////// REINDEX collation //////////////////////////////////
! 1328: %ifndef SQLITE_OMIT_REINDEX
! 1329: cmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);}
! 1330: cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);}
! 1331: %endif SQLITE_OMIT_REINDEX
! 1332:
! 1333: /////////////////////////////////// ANALYZE ///////////////////////////////////
! 1334: %ifndef SQLITE_OMIT_ANALYZE
! 1335: cmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);}
! 1336: cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);}
! 1337: %endif
! 1338:
! 1339: //////////////////////// ALTER TABLE table ... ////////////////////////////////
! 1340: %ifndef SQLITE_OMIT_ALTERTABLE
! 1341: cmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). {
! 1342: sqlite3AlterRenameTable(pParse,X,&Z);
! 1343: }
! 1344: cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). {
! 1345: sqlite3AlterFinishAddColumn(pParse, &Y);
! 1346: }
! 1347: add_column_fullname ::= fullname(X). {
! 1348: pParse->db->lookaside.bEnabled = 0;
! 1349: sqlite3AlterBeginAddColumn(pParse, X);
! 1350: }
! 1351: kwcolumn_opt ::= .
! 1352: kwcolumn_opt ::= COLUMNKW.
! 1353: %endif SQLITE_OMIT_ALTERTABLE
! 1354:
! 1355: //////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////
! 1356: %ifndef SQLITE_OMIT_VIRTUALTABLE
! 1357: cmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);}
! 1358: cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);}
! 1359: create_vtab ::= createkw VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). {
! 1360: sqlite3VtabBeginParse(pParse, &X, &Y, &Z);
! 1361: }
! 1362: vtabarglist ::= vtabarg.
! 1363: vtabarglist ::= vtabarglist COMMA vtabarg.
! 1364: vtabarg ::= . {sqlite3VtabArgInit(pParse);}
! 1365: vtabarg ::= vtabarg vtabargtoken.
! 1366: vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);}
! 1367: vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);}
! 1368: lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);}
! 1369: anylist ::= .
! 1370: anylist ::= anylist LP anylist RP.
! 1371: anylist ::= anylist ANY.
! 1372: %endif SQLITE_OMIT_VIRTUALTABLE
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>