TiDB源码exprNode/ExprNode小心得

近期在修改TiDB一个Parser语法Issue时,对ExprNode得到一些更多了解,分享如下:

ExprNode与exrpNode是关于SQL语法中expression表达式ast解析与存储时使用的接口(定义在parser/ast/ast.go与定义在parser/ast/base.go中),Parser(Lex与Yacc)会将sql语句中的expression表达式结合它们进行解析;具体的expression由struct exprNode(注意这里是小写expr…中)代表,
比如BetweenExpr会用于"between and" or "not between and"表达式, PatternLikeExpr会用于“like …”与“like…escape"表达式
exprNode中嵌套ExprNod组成表达式结构,ExprNode比如有ValueExpr(代表表达式中的值,比如int, string,字符)与ParamMarkerExpr(专门代表prepared statement中的?)这些基本的表达式元素。
在sqlexec包中SQLParser接口的ParseSQL方法中,会调用具体的expression Node(如BetweenExpr)的Accept方法填充解析的元素。后续的逻辑优化与物理优化都会用到这个expression Node进行操作。
注意ParamMarkerExpr是derived from ValueExpr的,因此,语法上有时可以用ValueExpr统一代表ParamMarkerExpr(比如Limit 5与Limit ?统一表达),但使用时需要逻辑上进行区分。

3 个赞

点个赞~

感谢分享心得

1 个赞