📄 parse.y
字号:
expr(A) ::= MINUS(B) expr(X). [UMINUS] { A = sqlite3Expr(TK_UMINUS, X, 0, 0); sqlite3ExprSpan(A,&B,&X->span);}expr(A) ::= PLUS(B) expr(X). [UPLUS] { A = sqlite3Expr(TK_UPLUS, X, 0, 0); sqlite3ExprSpan(A,&B,&X->span);}%type between_op {int}between_op(A) ::= BETWEEN. {A = 0;}between_op(A) ::= NOT BETWEEN. {A = 1;}expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ExprList *pList = sqlite3ExprListAppend(0, X, 0); pList = sqlite3ExprListAppend(pList, Y, 0); A = sqlite3Expr(TK_BETWEEN, W, 0, 0); if( A ){ A->pList = pList; }else{ sqlite3ExprListDelete(pList); } if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&W->span,&Y->span);}%ifndef SQLITE_OMIT_SUBQUERY %type in_op {int} in_op(A) ::= IN. {A = 0;} in_op(A) ::= NOT IN. {A = 1;} expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { A = sqlite3Expr(TK_IN, X, 0, 0); if( A ){ A->pList = Y; sqlite3ExprSetHeight(A); }else{ sqlite3ExprListDelete(Y); } if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&X->span,&E); } expr(A) ::= LP(B) select(X) RP(E). { A = sqlite3Expr(TK_SELECT, 0, 0, 0); if( A ){ A->pSelect = X; sqlite3ExprSetHeight(A); }else{ sqlite3SelectDelete(X); } sqlite3ExprSpan(A,&B,&E); } expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { A = sqlite3Expr(TK_IN, X, 0, 0); if( A ){ A->pSelect = Y; sqlite3ExprSetHeight(A); }else{ sqlite3SelectDelete(Y); } if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&X->span,&E); } expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { SrcList *pSrc = sqlite3SrcListAppend(0,&Y,&Z); A = sqlite3Expr(TK_IN, X, 0, 0); if( A ){ A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,0,0); sqlite3ExprSetHeight(A); }else{ sqlite3SrcListDelete(pSrc); } if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&X->span,Z.z?&Z:&Y); } expr(A) ::= EXISTS(B) LP select(Y) RP(E). { Expr *p = A = sqlite3Expr(TK_EXISTS, 0, 0, 0); if( p ){ p->pSelect = Y; sqlite3ExprSpan(p,&B,&E); sqlite3ExprSetHeight(A); }else{ sqlite3SelectDelete(Y); } }%endif SQLITE_OMIT_SUBQUERY/* CASE expressions */expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { A = sqlite3Expr(TK_CASE, X, Z, 0); if( A ){ A->pList = Y; sqlite3ExprSetHeight(A); }else{ sqlite3ExprListDelete(Y); } sqlite3ExprSpan(A, &C, &E);}%type case_exprlist {ExprList*}%destructor case_exprlist {sqlite3ExprListDelete($$);}case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { A = sqlite3ExprListAppend(X, Y, 0); A = sqlite3ExprListAppend(A, Z, 0);}case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). { A = sqlite3ExprListAppend(0, Y, 0); A = sqlite3ExprListAppend(A, Z, 0);}%type case_else {Expr*}%destructor case_else {sqlite3ExprDelete($$);}case_else(A) ::= ELSE expr(X). {A = X;}case_else(A) ::= . {A = 0;} %type case_operand {Expr*}%destructor case_operand {sqlite3ExprDelete($$);}case_operand(A) ::= expr(X). {A = X;} case_operand(A) ::= . {A = 0;} %type exprlist {ExprList*}%destructor exprlist {sqlite3ExprListDelete($$);}%type nexprlist {ExprList*}%destructor nexprlist {sqlite3ExprListDelete($$);}exprlist(A) ::= nexprlist(X). {A = X;}exprlist(A) ::= . {A = 0;}nexprlist(A) ::= nexprlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);}nexprlist(A) ::= expr(Y). {A = sqlite3ExprListAppend(0,Y,0);}///////////////////////////// The CREATE INDEX command /////////////////////////cmd ::= CREATE(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) ON nm(Y) LP idxlist(Z) RP(E). { sqlite3CreateIndex(pParse, &X, &D, sqlite3SrcListAppend(0,&Y,0), Z, U, &S, &E, SQLITE_SO_ASC, NE);}%type uniqueflag {int}uniqueflag(A) ::= UNIQUE. {A = OE_Abort;}uniqueflag(A) ::= . {A = OE_None;}%type idxlist {ExprList*}%destructor idxlist {sqlite3ExprListDelete($$);}%type idxlist_opt {ExprList*}%destructor idxlist_opt {sqlite3ExprListDelete($$);}%type idxitem {Token}idxlist_opt(A) ::= . {A = 0;}idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;}idxlist(A) ::= idxlist(X) COMMA idxitem(Y) collate(C) sortorder(Z). { Expr *p = 0; if( C.n>0 ){ p = sqlite3Expr(TK_COLUMN, 0, 0, 0); if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); } A = sqlite3ExprListAppend(X, p, &Y); sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index"); if( A ) A->a[A->nExpr-1].sortOrder = Z;}idxlist(A) ::= idxitem(Y) collate(C) sortorder(Z). { Expr *p = 0; if( C.n>0 ){ p = sqlite3Expr(TK_COLUMN, 0, 0, 0); if( p ) p->pColl = sqlite3LocateCollSeq(pParse, (char*)C.z, C.n); } A = sqlite3ExprListAppend(0, p, &Y); sqlite3ExprListCheckLength(pParse, A, SQLITE_MAX_COLUMN, "index"); if( A ) A->a[A->nExpr-1].sortOrder = Z;}idxitem(A) ::= nm(X). {A = X;}%type collate {Token}collate(C) ::= . {C.z = 0; C.n = 0;}collate(C) ::= COLLATE id(X). {C = X;}///////////////////////////// The DROP INDEX command ///////////////////////////cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);}///////////////////////////// The VACUUM command ///////////////////////////////%ifndef SQLITE_OMIT_VACUUM%ifndef SQLITE_OMIT_ATTACHcmd ::= VACUUM. {sqlite3Vacuum(pParse);}cmd ::= VACUUM nm. {sqlite3Vacuum(pParse);}%endif SQLITE_OMIT_ATTACH%endif SQLITE_OMIT_VACUUM///////////////////////////// The PRAGMA command ///////////////////////////////%ifndef SQLITE_OMIT_PRAGMAcmd ::= PRAGMA nm(X) dbnm(Z) EQ nmnum(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);}cmd ::= PRAGMA nm(X) dbnm(Z) EQ ON(Y). {sqlite3Pragma(pParse,&X,&Z,&Y,0);}cmd ::= PRAGMA nm(X) dbnm(Z) EQ minus_num(Y). { sqlite3Pragma(pParse,&X,&Z,&Y,1);}cmd ::= PRAGMA nm(X) dbnm(Z) LP nmnum(Y) RP. {sqlite3Pragma(pParse,&X,&Z,&Y,0);}cmd ::= PRAGMA nm(X) dbnm(Z). {sqlite3Pragma(pParse,&X,&Z,0,0);}nmnum(A) ::= plus_num(X). {A = X;}nmnum(A) ::= nm(X). {A = X;}%endif SQLITE_OMIT_PRAGMAplus_num(A) ::= plus_opt number(X). {A = X;}minus_num(A) ::= MINUS number(X). {A = X;}number(A) ::= INTEGER|FLOAT(X). {A = X;}plus_opt ::= PLUS.plus_opt ::= .//////////////////////////// The CREATE TRIGGER command /////////////////////%ifndef SQLITE_OMIT_TRIGGERcmd ::= CREATE trigger_decl(A) BEGIN trigger_cmd_list(S) END(Z). { Token all; all.z = A.z; all.n = (Z.z - A.z) + Z.n; sqlite3FinishTrigger(pParse, S, &all);}trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) trigger_time(C) trigger_event(D) ON fullname(E) foreach_clause when_clause(G). { sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); A = (Z.n==0?B:Z);}%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 {sqlite3IdListDelete($$.b);}trigger_event(A) ::= DELETE|INSERT(OP). {A.a = @OP; A.b = 0;}trigger_event(A) ::= UPDATE(OP). {A.a = @OP; A.b = 0;}trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X;}foreach_clause ::= .foreach_clause ::= FOR EACH ROW.%type when_clause {Expr*}%destructor when_clause {sqlite3ExprDelete($$);}when_clause(A) ::= . { A = 0; }when_clause(A) ::= WHEN expr(X). { A = X; }%type trigger_cmd_list {TriggerStep*}%destructor trigger_cmd_list {sqlite3DeleteTriggerStep($$);}trigger_cmd_list(A) ::= trigger_cmd_list(Y) trigger_cmd(X) SEMI. { if( Y ){ Y->pLast->pNext = X; }else{ Y = X; } Y->pLast = X; A = Y;}trigger_cmd_list(A) ::= . { A = 0; }%type trigger_cmd {TriggerStep*}%destructor trigger_cmd {sqlite3DeleteTriggerStep($$);}// UPDATE trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z). { A = sqlite3TriggerUpdateStep(&X, Y, Z, R); }// INSERTtrigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) VALUES LP itemlist(Y) RP. {A = sqlite3TriggerInsertStep(&X, F, Y, 0, R);}trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S). {A = sqlite3TriggerInsertStep(&X, F, 0, S, R);}// DELETEtrigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y). {A = sqlite3TriggerDeleteStep(&X, Y);}// SELECTtrigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(X); }// The special RAISE expression that may occur in trigger programsexpr(A) ::= RAISE(X) LP IGNORE RP(Y). { A = sqlite3Expr(TK_RAISE, 0, 0, 0); if( A ){ A->iColumn = OE_Ignore; sqlite3ExprSpan(A, &X, &Y); }}expr(A) ::= RAISE(X) LP raisetype(T) COMMA nm(Z) RP(Y). { A = sqlite3Expr(TK_RAISE, 0, 0, &Z); if( A ) { A->iColumn = T; sqlite3ExprSpan(A, &X, &Y); }}%endif !SQLITE_OMIT_TRIGGER%type raisetype {int}raisetype(A) ::= ROLLBACK. {A = OE_Rollback;}raisetype(A) ::= ABORT. {A = OE_Abort;}raisetype(A) ::= FAIL. {A = OE_Fail;}//////////////////////// DROP TRIGGER statement //////////////////////////////%ifndef SQLITE_OMIT_TRIGGERcmd ::= DROP TRIGGER ifexists(NOERR) fullname(X). { sqlite3DropTrigger(pParse,X,NOERR);}%endif !SQLITE_OMIT_TRIGGER//////////////////////// ATTACH DATABASE file AS name /////////////////////////%ifndef SQLITE_OMIT_ATTACHcmd ::= ATTACH database_kw_opt expr(F) AS expr(D) key_opt(K). { sqlite3Attach(pParse, F, D, K);}cmd ::= DETACH database_kw_opt expr(D). { sqlite3Detach(pParse, D);}%type key_opt {Expr *}%destructor key_opt {sqlite3ExprDelete($$);}key_opt(A) ::= . { A = 0; }key_opt(A) ::= KEY expr(X). { A = X; }database_kw_opt ::= DATABASE.database_kw_opt ::= .%endif SQLITE_OMIT_ATTACH////////////////////////// REINDEX collation //////////////////////////////////%ifndef SQLITE_OMIT_REINDEXcmd ::= REINDEX. {sqlite3Reindex(pParse, 0, 0);}cmd ::= REINDEX nm(X) dbnm(Y). {sqlite3Reindex(pParse, &X, &Y);}%endif SQLITE_OMIT_REINDEX/////////////////////////////////// ANALYZE ///////////////////////////////////%ifndef SQLITE_OMIT_ANALYZEcmd ::= ANALYZE. {sqlite3Analyze(pParse, 0, 0);}cmd ::= ANALYZE nm(X) dbnm(Y). {sqlite3Analyze(pParse, &X, &Y);}%endif//////////////////////// ALTER TABLE table ... ////////////////////////////////%ifndef SQLITE_OMIT_ALTERTABLEcmd ::= ALTER TABLE fullname(X) RENAME TO nm(Z). { sqlite3AlterRenameTable(pParse,X,&Z);}cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column(Y). { sqlite3AlterFinishAddColumn(pParse, &Y);}add_column_fullname ::= fullname(X). { sqlite3AlterBeginAddColumn(pParse, X);}kwcolumn_opt ::= .kwcolumn_opt ::= COLUMNKW.%endif SQLITE_OMIT_ALTERTABLE//////////////////////// CREATE VIRTUAL TABLE ... /////////////////////////////%ifndef SQLITE_OMIT_VIRTUALTABLEcmd ::= create_vtab. {sqlite3VtabFinishParse(pParse,0);}cmd ::= create_vtab LP vtabarglist RP(X). {sqlite3VtabFinishParse(pParse,&X);}create_vtab ::= CREATE VIRTUAL TABLE nm(X) dbnm(Y) USING nm(Z). { sqlite3VtabBeginParse(pParse, &X, &Y, &Z);}vtabarglist ::= vtabarg.vtabarglist ::= vtabarglist COMMA vtabarg.vtabarg ::= . {sqlite3VtabArgInit(pParse);}vtabarg ::= vtabarg vtabargtoken.vtabargtoken ::= ANY(X). {sqlite3VtabArgExtend(pParse,&X);}vtabargtoken ::= lp anylist RP(X). {sqlite3VtabArgExtend(pParse,&X);}lp ::= LP(X). {sqlite3VtabArgExtend(pParse,&X);}anylist ::= .anylist ::= anylist ANY(X). {sqlite3VtabArgExtend(pParse,&X);}%endif SQLITE_OMIT_VIRTUALTABLE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -