📄 parse.y
字号:
sqlite3Select(pParse, X, SRT_Callback, 0, 0, 0, 0, 0); sqlite3SelectDelete(X);}%type select {Select*}%destructor select {sqlite3SelectDelete($$);}%type oneselect {Select*}%destructor oneselect {sqlite3SelectDelete($$);}select(A) ::= oneselect(X). {A = X;}%ifndef SQLITE_OMIT_COMPOUND_SELECTselect(A) ::= select(X) multiselect_op(Y) oneselect(Z). { if( Z ){ Z->op = Y; Z->pPrior = X; }else{ sqlite3SelectDelete(X); } A = Z;}%type multiselect_op {int}multiselect_op(A) ::= UNION(OP). {A = @OP;}multiselect_op(A) ::= UNION ALL. {A = TK_ALL;}multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;}%endif SQLITE_OMIT_COMPOUND_SELECToneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { A = sqlite3SelectNew(W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);}// The "distinct" nonterminal is true (1) if the DISTINCT keyword is// present and false (0) if it is not.//%type distinct {int}distinct(A) ::= DISTINCT. {A = 1;}distinct(A) ::= ALL. {A = 0;}distinct(A) ::= . {A = 0;}// selcollist is a list of expressions that are to become the return// values of the SELECT statement. The "*" in statements like// "SELECT * FROM ..." is encoded as a special expression with an// opcode of TK_ALL.//%type selcollist {ExprList*}%destructor selcollist {sqlite3ExprListDelete($$);}%type sclp {ExprList*}%destructor sclp {sqlite3ExprListDelete($$);}sclp(A) ::= selcollist(X) COMMA. {A = X;}sclp(A) ::= . {A = 0;}selcollist(A) ::= sclp(P) expr(X) as(Y). { A = sqlite3ExprListAppend(P,X,Y.n?&Y:0);}selcollist(A) ::= sclp(P) STAR. { A = sqlite3ExprListAppend(P, sqlite3Expr(TK_ALL, 0, 0, 0), 0);}selcollist(A) ::= sclp(P) nm(X) DOT STAR. { Expr *pRight = sqlite3Expr(TK_ALL, 0, 0, 0); Expr *pLeft = sqlite3Expr(TK_ID, 0, 0, &X); A = sqlite3ExprListAppend(P, sqlite3Expr(TK_DOT, pLeft, pRight, 0), 0);}// An option "AS <id>" phrase that can follow one of the expressions that// define the result set, or one of the tables in the FROM clause.//%type as {Token}as(X) ::= AS nm(Y). {X = Y;}as(X) ::= ids(Y). {X = Y;}as(X) ::= . {X.n = 0;}%type seltablist {SrcList*}%destructor seltablist {sqlite3SrcListDelete($$);}%type stl_prefix {SrcList*}%destructor stl_prefix {sqlite3SrcListDelete($$);}%type from {SrcList*}%destructor from {sqlite3SrcListDelete($$);}// A complete FROM clause.//from(A) ::= . {A = sqliteMalloc(sizeof(*A));}from(A) ::= FROM seltablist(X). { A = X; sqlite3SrcListShiftJoinType(A);}// "seltablist" is a "Select Table List" - the content of the FROM clause// in a SELECT statement. "stl_prefix" is a prefix of this list.//stl_prefix(A) ::= seltablist(X) joinop(Y). { A = X; if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;}stl_prefix(A) ::= . {A = 0;}seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). { A = sqlite3SrcListAppendFromTerm(X,&Y,&D,&Z,0,N,U);}%ifndef SQLITE_OMIT_SUBQUERY seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP as(Z) on_opt(N) using_opt(U). { A = sqlite3SrcListAppendFromTerm(X,0,0,&Z,S,N,U); } // A seltablist_paren nonterminal represents anything in a FROM that // is contained inside parentheses. This can be either a subquery or // a grouping of table and subqueries. // %type seltablist_paren {Select*} %destructor seltablist_paren {sqlite3SelectDelete($$);} seltablist_paren(A) ::= select(S). {A = S;} seltablist_paren(A) ::= seltablist(F). { sqlite3SrcListShiftJoinType(F); A = sqlite3SelectNew(0,F,0,0,0,0,0,0,0); }%endif SQLITE_OMIT_SUBQUERY%type dbnm {Token}dbnm(A) ::= . {A.z=0; A.n=0;}dbnm(A) ::= DOT nm(X). {A = X;}%type fullname {SrcList*}%destructor fullname {sqlite3SrcListDelete($$);}fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(0,&X,&Y);}%type joinop {int}%type joinop2 {int}joinop(X) ::= COMMA|JOIN. { X = JT_INNER; }joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); }joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); }joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. { X = sqlite3JoinType(pParse,&A,&B,&C); }%type on_opt {Expr*}%destructor on_opt {sqlite3ExprDelete($$);}on_opt(N) ::= ON expr(E). {N = E;}on_opt(N) ::= . {N = 0;}%type using_opt {IdList*}%destructor using_opt {sqlite3IdListDelete($$);}using_opt(U) ::= USING LP inscollist(L) RP. {U = L;}using_opt(U) ::= . {U = 0;}%type orderby_opt {ExprList*}%destructor orderby_opt {sqlite3ExprListDelete($$);}%type sortlist {ExprList*}%destructor sortlist {sqlite3ExprListDelete($$);}%type sortitem {Expr*}%destructor sortitem {sqlite3ExprDelete($$);}orderby_opt(A) ::= . {A = 0;}orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;}sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). { A = sqlite3ExprListAppend(X,Y,0); if( A ) A->a[A->nExpr-1].sortOrder = Z;}sortlist(A) ::= sortitem(Y) sortorder(Z). { A = sqlite3ExprListAppend(0,Y,0); if( A && A->a ) A->a[0].sortOrder = Z;}sortitem(A) ::= expr(X). {A = X;}%type sortorder {int}sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;}sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;}sortorder(A) ::= . {A = SQLITE_SO_ASC;}%type groupby_opt {ExprList*}%destructor groupby_opt {sqlite3ExprListDelete($$);}groupby_opt(A) ::= . {A = 0;}groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;}%type having_opt {Expr*}%destructor having_opt {sqlite3ExprDelete($$);}having_opt(A) ::= . {A = 0;}having_opt(A) ::= HAVING expr(X). {A = X;}%type limit_opt {struct LimitVal}// The destructor for limit_opt will never fire in the current grammar.// The limit_opt non-terminal only occurs at the end of a single production// rule for SELECT statements. As soon as the rule that create the // limit_opt non-terminal reduces, the SELECT statement rule will also// reduce. So there is never a limit_opt non-terminal on the stack // except as a transient. So there is never anything to destroy.////%destructor limit_opt {// sqlite3ExprDelete($$.pLimit);// sqlite3ExprDelete($$.pOffset);//}limit_opt(A) ::= . {A.pLimit = 0; A.pOffset = 0;}limit_opt(A) ::= LIMIT expr(X). {A.pLimit = X; A.pOffset = 0;}limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y). {A.pLimit = X; A.pOffset = Y;}limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). {A.pOffset = X; A.pLimit = Y;}/////////////////////////// The DELETE statement ///////////////////////////////cmd ::= DELETE FROM fullname(X) where_opt(Y). {sqlite3DeleteFrom(pParse,X,Y);}%type where_opt {Expr*}%destructor where_opt {sqlite3ExprDelete($$);}where_opt(A) ::= . {A = 0;}where_opt(A) ::= WHERE expr(X). {A = X;}////////////////////////// The UPDATE command //////////////////////////////////cmd ::= UPDATE orconf(R) fullname(X) SET setlist(Y) where_opt(Z). { sqlite3ExprListCheckLength(pParse,Y,SQLITE_MAX_COLUMN,"set list"); sqlite3Update(pParse,X,Y,Z,R);}%type setlist {ExprList*}%destructor setlist {sqlite3ExprListDelete($$);}setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(Z,Y,&X);}setlist(A) ::= nm(X) EQ expr(Y). {A = sqlite3ExprListAppend(0,Y,&X);}////////////////////////// The INSERT command ///////////////////////////////////cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) VALUES LP itemlist(Y) RP. {sqlite3Insert(pParse, X, Y, 0, F, R);}cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). {sqlite3Insert(pParse, X, 0, S, F, R);}cmd ::= insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. {sqlite3Insert(pParse, X, 0, 0, F, R);}%type insert_cmd {int}insert_cmd(A) ::= INSERT orconf(R). {A = R;}insert_cmd(A) ::= REPLACE. {A = OE_Replace;}%type itemlist {ExprList*}%destructor itemlist {sqlite3ExprListDelete($$);}itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqlite3ExprListAppend(X,Y,0);}itemlist(A) ::= expr(X). {A = sqlite3ExprListAppend(0,X,0);}%type inscollist_opt {IdList*}%destructor inscollist_opt {sqlite3IdListDelete($$);}%type inscollist {IdList*}%destructor inscollist {sqlite3IdListDelete($$);}inscollist_opt(A) ::= . {A = 0;}inscollist_opt(A) ::= LP inscollist(X) RP. {A = X;}inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqlite3IdListAppend(X,&Y);}inscollist(A) ::= nm(Y). {A = sqlite3IdListAppend(0,&Y);}/////////////////////////// Expression Processing ///////////////////////////////%type expr {Expr*}%destructor expr {sqlite3ExprDelete($$);}%type term {Expr*}%destructor term {sqlite3ExprDelete($$);}expr(A) ::= term(X). {A = X;}expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqlite3ExprSpan(A,&B,&E); }term(A) ::= NULL(X). {A = sqlite3Expr(@X, 0, 0, &X);}expr(A) ::= ID(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);}expr(A) ::= JOIN_KW(X). {A = sqlite3Expr(TK_ID, 0, 0, &X);}expr(A) ::= nm(X) DOT nm(Y). { Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); A = sqlite3Expr(TK_DOT, temp1, temp2, 0);}expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). { Expr *temp1 = sqlite3Expr(TK_ID, 0, 0, &X); Expr *temp2 = sqlite3Expr(TK_ID, 0, 0, &Y); Expr *temp3 = sqlite3Expr(TK_ID, 0, 0, &Z); Expr *temp4 = sqlite3Expr(TK_DOT, temp2, temp3, 0); A = sqlite3Expr(TK_DOT, temp1, temp4, 0);}term(A) ::= INTEGER|FLOAT|BLOB(X). {A = sqlite3Expr(@X, 0, 0, &X);}term(A) ::= STRING(X). {A = sqlite3Expr(@X, 0, 0, &X);}expr(A) ::= REGISTER(X). {A = sqlite3RegisterExpr(pParse, &X);}expr(A) ::= VARIABLE(X). { Token *pToken = &X; Expr *pExpr = A = sqlite3Expr(TK_VARIABLE, 0, 0, pToken); sqlite3ExprAssignVarNumber(pParse, pExpr);}expr(A) ::= expr(E) COLLATE id(C). { A = sqlite3ExprSetColl(pParse, E, &C);}%ifndef SQLITE_OMIT_CASTexpr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). { A = sqlite3Expr(TK_CAST, E, 0, &T); sqlite3ExprSpan(A,&X,&Y);}%endif SQLITE_OMIT_CASTexpr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). { if( Y && Y->nExpr>SQLITE_MAX_FUNCTION_ARG ){ sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); } A = sqlite3ExprFunction(Y, &X); sqlite3ExprSpan(A,&X,&E); if( D && A ){ A->flags |= EP_Distinct; }}expr(A) ::= ID(X) LP STAR RP(E). { A = sqlite3ExprFunction(0, &X); sqlite3ExprSpan(A,&X,&E);}term(A) ::= CTIME_KW(OP). { /* The CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP values are ** treated as functions that return constants */ A = sqlite3ExprFunction(0,&OP); if( A ){ A->op = TK_CONST_FUNC; A->span = OP; }}expr(A) ::= expr(X) AND(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}expr(A) ::= expr(X) OR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}expr(A) ::= expr(X) CONCAT(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);}%type likeop {struct LikeOp}likeop(A) ::= LIKE_KW(X). {A.eOperator = X; A.not = 0;}likeop(A) ::= NOT LIKE_KW(X). {A.eOperator = X; A.not = 1;}likeop(A) ::= MATCH(X). {A.eOperator = X; A.not = 0;}likeop(A) ::= NOT MATCH(X). {A.eOperator = X; A.not = 1;}%type escape {Expr*}%destructor escape {sqlite3ExprDelete($$);}escape(X) ::= ESCAPE expr(A). [ESCAPE] {X = A;}escape(X) ::= . [ESCAPE] {X = 0;}expr(A) ::= expr(X) likeop(OP) expr(Y) escape(E). [LIKE_KW] { ExprList *pList; pList = sqlite3ExprListAppend(0, Y, 0); pList = sqlite3ExprListAppend(pList, X, 0); if( E ){ pList = sqlite3ExprListAppend(pList, E, 0); } A = sqlite3ExprFunction(pList, &OP.eOperator); if( OP.not ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A, &X->span, &Y->span); if( A ) A->flags |= EP_InfixFunc;}expr(A) ::= expr(X) ISNULL|NOTNULL(E). { A = sqlite3Expr(@E, X, 0, 0); sqlite3ExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) IS NULL(E). { A = sqlite3Expr(TK_ISNULL, X, 0, 0); sqlite3ExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) NOT NULL(E). { A = sqlite3Expr(TK_NOTNULL, X, 0, 0); sqlite3ExprSpan(A,&X->span,&E);}expr(A) ::= expr(X) IS NOT NULL(E). { A = sqlite3Expr(TK_NOTNULL, X, 0, 0); sqlite3ExprSpan(A,&X->span,&E);}expr(A) ::= NOT|BITNOT(B) expr(X). { A = sqlite3Expr(@B, X, 0, 0); sqlite3ExprSpan(A,&B,&X->span);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -