📄 parse.y
字号:
expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}expr(A) ::= expr(X) ISNULL(E). { A = sqliteExpr(TK_ISNULL, X, 0, 0); sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) IS NULL(E). { A = sqliteExpr(TK_ISNULL, X, 0, 0); sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) NOTNULL(E). { A = sqliteExpr(TK_NOTNULL, X, 0, 0); sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) NOT NULL(E). { A = sqliteExpr(TK_NOTNULL, X, 0, 0); sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) IS NOT NULL(E). { A = sqliteExpr(TK_NOTNULL, X, 0, 0); sqliteExprSpan(A,&X->span,&E);}expr(A) ::= NOT(B) expr(X). { A = sqliteExpr(TK_NOT, X, 0, 0); sqliteExprSpan(A,&B,&X->span);}expr(A) ::= BITNOT(B) expr(X). { A = sqliteExpr(TK_BITNOT, X, 0, 0); sqliteExprSpan(A,&B,&X->span);}expr(A) ::= MINUS(B) expr(X). [UMINUS] { A = sqliteExpr(TK_UMINUS, X, 0, 0); sqliteExprSpan(A,&B,&X->span);}expr(A) ::= PLUS(B) expr(X). [UPLUS] { A = sqliteExpr(TK_UPLUS, X, 0, 0); sqliteExprSpan(A,&B,&X->span);}expr(A) ::= LP(B) select(X) RP(E). { A = sqliteExpr(TK_SELECT, 0, 0, 0); if( A ) A->pSelect = X; sqliteExprSpan(A,&B,&E);}expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). { ExprList *pList = sqliteExprListAppend(0, X, 0); pList = sqliteExprListAppend(pList, Y, 0); A = sqliteExpr(TK_BETWEEN, W, 0, 0); if( A ) A->pList = pList; sqliteExprSpan(A,&W->span,&Y->span);}expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). { ExprList *pList = sqliteExprListAppend(0, X, 0); pList = sqliteExprListAppend(pList, Y, 0); A = sqliteExpr(TK_BETWEEN, W, 0, 0); if( A ) A->pList = pList; A = sqliteExpr(TK_NOT, A, 0, 0); sqliteExprSpan(A,&W->span,&Y->span);}expr(A) ::= expr(X) IN LP exprlist(Y) RP(E). { A = sqliteExpr(TK_IN, X, 0, 0); if( A ) A->pList = Y; sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) IN LP select(Y) RP(E). { A = sqliteExpr(TK_IN, X, 0, 0); if( A ) A->pSelect = Y; sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E). { A = sqliteExpr(TK_IN, X, 0, 0); if( A ) A->pList = Y; A = sqliteExpr(TK_NOT, A, 0, 0); sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) NOT IN LP select(Y) RP(E). { A = sqliteExpr(TK_IN, X, 0, 0); if( A ) A->pSelect = Y; A = sqliteExpr(TK_NOT, A, 0, 0); sqliteExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) IN nm(Y) dbnm(D). { SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D); A = sqliteExpr(TK_IN, X, 0, 0); if( A ) A->pSelect = sqliteSelectNew(0,pSrc,0,0,0,0,0,-1,0); sqliteExprSpan(A,&X->span,D.z?&D:&Y);}expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). { SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D); A = sqliteExpr(TK_IN, X, 0, 0); if( A ) A->pSelect = sqliteSelectNew(0,pSrc,0,0,0,0,0,-1,0); A = sqliteExpr(TK_NOT, A, 0, 0); sqliteExprSpan(A,&X->span,D.z?&D:&Y);}/* CASE expressions */expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { A = sqliteExpr(TK_CASE, X, Z, 0); if( A ) A->pList = Y; sqliteExprSpan(A, &C, &E);}%type case_exprlist {ExprList*}%destructor case_exprlist {sqliteExprListDelete($$);}case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { A = sqliteExprListAppend(X, Y, 0); A = sqliteExprListAppend(A, Z, 0);}case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { A = sqliteExprListAppend(0, Y, 0); A = sqliteExprListAppend(A, Z, 0);}%type case_else {Expr*}case_else(A) ::= ELSE expr(X). {A = X;}case_else(A) ::= . {A = 0;} %type case_operand {Expr*}case_operand(A) ::= expr(X). {A = X;} case_operand(A) ::= . {A = 0;} %type exprlist {ExprList*}%destructor exprlist {sqliteExprListDelete($$);}%type expritem {Expr*}%destructor expritem {sqliteExprDelete($$);}exprlist(A) ::= exprlist(X) COMMA expritem(Y). {A = sqliteExprListAppend(X,Y,0);}exprlist(A) ::= expritem(X). {A = sqliteExprListAppend(0,X,0);}expritem(A) ::= expr(X). {A = X;}expritem(A) ::= . {A = 0;}///////////////////////////// The CREATE INDEX command /////////////////////////cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X) ON nm(Y) dbnm(D) LP idxlist(Z) RP(E) onconf(R). { SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D); if( U!=OE_None ) U = R; if( U==OE_Default) U = OE_Abort; sqliteCreateIndex(pParse, &X, pSrc, Z, U, &S, &E);}%type uniqueflag {int}uniqueflag(A) ::= UNIQUE. { A = OE_Abort; }uniqueflag(A) ::= . { A = OE_None; }%type idxlist {IdList*}%destructor idxlist {sqliteIdListDelete($$);}%type idxlist_opt {IdList*}%destructor idxlist_opt {sqliteIdListDelete($$);}%type idxitem {Token}idxlist_opt(A) ::= . {A = 0;}idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;}idxlist(A) ::= idxlist(X) COMMA idxitem(Y). {A = sqliteIdListAppend(X,&Y);}idxlist(A) ::= idxitem(Y). {A = sqliteIdListAppend(0,&Y);}idxitem(A) ::= nm(X) sortorder. {A = X;}///////////////////////////// The DROP INDEX command ///////////////////////////cmd ::= DROP INDEX nm(X) dbnm(Y). { sqliteDropIndex(pParse, sqliteSrcListAppend(0,&X,&Y));}///////////////////////////// The COPY command /////////////////////////////////cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y) USING DELIMITERS STRING(Z). {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,&Z,R);}cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y). {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,0,R);}///////////////////////////// The VACUUM command ///////////////////////////////cmd ::= VACUUM. {sqliteVacuum(pParse,0);}cmd ::= VACUUM nm(X). {sqliteVacuum(pParse,&X);}///////////////////////////// The PRAGMA command ///////////////////////////////cmd ::= PRAGMA ids(X) EQ nm(Y). {sqlitePragma(pParse,&X,&Y,0);}cmd ::= PRAGMA ids(X) EQ ON(Y). {sqlitePragma(pParse,&X,&Y,0);}cmd ::= PRAGMA ids(X) EQ plus_num(Y). {sqlitePragma(pParse,&X,&Y,0);}cmd ::= PRAGMA ids(X) EQ minus_num(Y). {sqlitePragma(pParse,&X,&Y,1);}cmd ::= PRAGMA ids(X) LP nm(Y) RP. {sqlitePragma(pParse,&X,&Y,0);}cmd ::= PRAGMA ids(X). {sqlitePragma(pParse,&X,&X,0);}plus_num(A) ::= plus_opt number(X). {A = X;}minus_num(A) ::= MINUS number(X). {A = X;}number(A) ::= INTEGER(X). {A = X;}number(A) ::= FLOAT(X). {A = X;}plus_opt ::= PLUS.plus_opt ::= .//////////////////////////// The CREATE TRIGGER command /////////////////////cmd ::= CREATE(A) trigger_decl BEGIN trigger_cmd_list(S) END(Z). { Token all; all.z = A.z; all.n = (Z.z - A.z) + Z.n; sqliteFinishTrigger(pParse, S, &all);}trigger_decl ::= temp(T) TRIGGER nm(B) trigger_time(C) trigger_event(D) ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). { SrcList *pTab = sqliteSrcListAppend(0, &E, &DB); sqliteBeginTrigger(pParse, &B, C, D.a, D.b, pTab, F, G, T);}%type trigger_time {int}trigger_time(A) ::= BEFORE. { A = TK_BEFORE; }trigger_time(A) ::= AFTER. { A = TK_AFTER; }trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;}trigger_time(A) ::= . { A = TK_BEFORE; }%type trigger_event {struct TrigEvent}%destructor trigger_event {sqliteIdListDelete($$.b);}trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }%type foreach_clause {int}foreach_clause(A) ::= . { A = TK_ROW; }foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; }foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }%type when_clause {Expr *}when_clause(A) ::= . { A = 0; }when_clause(A) ::= WHEN expr(X). { A = X; }%type trigger_cmd_list {TriggerStep *}%destructor trigger_cmd_list {sqliteDeleteTriggerStep($$);}trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). { X->pNext = Y; A = X;}trigger_cmd_list(A) ::= . { A = 0; }%type trigger_cmd {TriggerStep *}%destructor trigger_cmd {sqliteDeleteTriggerStep($$);}// UPDATE trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). { A = sqliteTriggerUpdateStep(&X, Y, Z, R); }// INSERTtrigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP. {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);}trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). {A = sqliteTriggerInsertStep(&X, F, 0, S, R);}// DELETEtrigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). {A = sqliteTriggerDeleteStep(&X, Y);}// SELECTtrigger_cmd(A) ::= select(X). {A = sqliteTriggerSelectStep(X); }// The special RAISE expression that may occur in trigger programsexpr(A) ::= RAISE(X) LP IGNORE RP(Y). { A = sqliteExpr(TK_RAISE, 0, 0, 0); A->iColumn = OE_Ignore; sqliteExprSpan(A, &X, &Y);}expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y). { A = sqliteExpr(TK_RAISE, 0, 0, &Z); A->iColumn = OE_Rollback; sqliteExprSpan(A, &X, &Y);}expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y). { A = sqliteExpr(TK_RAISE, 0, 0, &Z); A->iColumn = OE_Abort; sqliteExprSpan(A, &X, &Y);}expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y). { A = sqliteExpr(TK_RAISE, 0, 0, &Z); A->iColumn = OE_Fail; sqliteExprSpan(A, &X, &Y);}//////////////////////// DROP TRIGGER statement //////////////////////////////cmd ::= DROP TRIGGER nm(X) dbnm(D). { sqliteDropTrigger(pParse,sqliteSrcListAppend(0,&X,&D));}//////////////////////// ATTACH DATABASE file AS name /////////////////////////cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). { sqliteAttach(pParse, &F, &D, &K);}%type key_opt {Token}key_opt(A) ::= USING ids(X). { A = X; }key_opt(A) ::= . { A.z = 0; A.n = 0; }database_kw_opt ::= DATABASE.database_kw_opt ::= .//////////////////////// DETACH DATABASE name /////////////////////////////////cmd ::= DETACH database_kw_opt nm(D). { sqliteDetach(pParse, &D);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -