Parser:SQL 语法解析器,产生 AST 由AST 做映射判断是否有 PlanCache(v8.4 之前仅支持 session 级别的 plan cache,之后支持了 instance 级别的 plan cache),如果可以直接将 cached 的 physical plan refill 参数之后即可使用。 Build Plan:常规 AST 结构到逻辑计划的构建过程 Logical Plan 有两条路可以走,其中 Sta...
在ast包中,几乎所有的stmt结构都实现了ast.Node接口,这个接口中的Accept()方法,主要作用就是处理AST,通过Visitor模式遍历所有的节点,并且对AST结构做一个转换。而为了能正常将RETURNING关键字转换成DeleteStmt,我们还需要在parser中去将RETURNING 关键字注册为token。 在parser.y中definitions区域定义好RETURNING相关句式的...
项目使用 TiDB 的 parser 解析 SQL,有一个 case 是解析 MySQL 的 CREATE TABLE 语句,获取表的信息。 有一张表使用了 utf32 字符集,在解析这条 SQL 时报错 Unknown character set,从源码上来看是因为不支持 utf32 这种字符集,遇到这个 token 就直接抛出错误了。 想问下有没有不修改源码就可以解决的办法;如果...
需要注意的是,对于关键字,在生成最新的parser.go之后,我们还需要在parser/misc.go中定义,这是由于lexer采用了字典树技术进行token识别,而其实现代码就是在其中,不然lexer会不认识这所谓的关键字。 改完之后的验证其实很简单,在parser包中找到parser_test.go的测试文件,写一个delete returning的句式,运行一遍测试,过...
TiDB 的一大特性就是和 MySQL 高度兼容,目标是让用户能够无需修改代码即可从 MySQL 迁移至 TiDB。要达成这个目标,需要完成两个提升兼容性的任务,分别是「...
Parser:SQL 语法解析器,产生 AST 由AST 做映射判断是否有 PlanCache(v8.4 之前仅支持 session 级别的 plan cache,之后支持了 instance 级别的 plan cache),如果可以直接将 cached 的 physical plan refill 参数之后即可使用。 Build Plan:常规 AST 结构到逻辑计划的构建过程 ...
Parser:SQL 语法解析器,产生 AST 由AST 做映射判断是否有 PlanCache(v8.4 之前仅支持 session 级别的 plan cache,之后支持了 instance 级别的 plan cache),如果可以直接将 cached 的 physical plan refill 参数之后即可使用。 Build Plan:常规 AST 结构到逻辑计划的构建过程 Logical Plan 有两条路可以走,其中 Sta...
TiDB SQL Parser的实现 终于到了正题。有了上面的背景知识,对TiDB 的 SQL Parser 模块会相对容易理解一些。先看SQL语法规则文件parser.y,goyacc 就是根据这个文件生成SQL语法解析器的。 parser.y 有6500多行,第一次打开可能会被吓到,其实这个文件仍然符合我们上面介绍过的结构: ...
[shawnyan@centos7 tidb7]$ makeCGO_ENABLED=1 GO111MODULE=on go build -tags codes -ldflags '-X "github.com/pingcap/tidb/parser/mysql.TiDBReleaseVersion=v7.5.0-alpha" -X "github.com/pingcap/tidb/util/versioninfo.TiDBBuildTS=2023-10-11 06:08:32" -X "github.com/pingcap/tidb/util/...
TiDB SQL parser 的功能是把 SQL 语句按照 SQL 语法规则进行解析,将文本转换成抽象语法树,另外 TiDB SQL parser 支持将语法树转换成 SQL 文本,因此可以通过修改语法树结构达到修改 SQL 文本的目的。 1. 通过 TiDB SQL 解析器将 SQL 解析成语法树 解析出的语法树大致如下,其中"..." 代表之前存在多级。