时间:2021-07-01 10:21:17 帮助过:29人阅读
我们看看cc.dispatch的实现
query类型的sql在 clientConn.handleQuery 里面处理:
一连串调用之后来到了session.execute, 我们看看实现:
session.execute里面做了这几件事:
1. 通过语法和词法分析将sql解析为抽象语法树,进而生成一个InsertStmt结构体;
语法分析和词法分析使用的是go语言版的yacc和lex;
tidb用了一个工具ebnf2y(EBNF文法转 .y文件)将mysql的sql BNF文法转为了 parser.y,可以参见 github.com\pingcap\parser\parser.y;
值得一提的是,pingcap将sql解析器从tidb独立出来,可以方便的供其他项目使用;
2. 优化sql, 生成执行计划;
3. 执行sql;
对于 insert 语句,将数据插入到 kv 中;
tidb-server 中 mock kv 是直接把键值对保存在了 go 语言版的 leveldb 中;
我们看看Insert语句对应的结构体:
限于篇幅,暂时讲到这里,下篇我们一起进入 session.executeStatement 函数;
看 tidb 是怎样将列数据编码为 kv,插入到 go leveldb 中的;
跟随一条insert语句, 进入TiDB的源码世界(上)
标签:举例 时间戳 session ssi src 客户端 成本 一起 抽象语法树