KaiwuDB 解析器介绍
解析器是数据库系统的重要组成部分之一,主要的功能是将客户端输入的 SQL 语句分解为语法单元,然后将这些语法单元转化成数据库内部可识别的数据结构,最终生成数据库可以执行的计划。
KaiwuDB 的一条 SQL 执行的整个生命周期:
- 从客户端输入一个 SQL 指令(文本格式),数据库执行器无法直接执行该文本指令,会先通过词法解析和语法解析将文本指令生成数据库能识别的数据结构 AST;
- 语义解析对 AST 进行有效性校验,生成优化器需要的 Memo 数据结构;
- 通过优化器(包括 RBO、CBO)优化后选出一个最优的 Memo 结构;
- 经过逻辑计划构建,生成一个 Plan 数据结构;
- 通过物理计划构建,生成数据库可执行的数据结构 Physical Plan,最终执行返回结构。
KaiwuDB 的解析器在整个 SQL 生命周期所处的位置比较靠前,介于客户端和优化器之间,主要功能是将客户端发来的文本指令转化成数据库能识别的数据结构,最后转成优化器需要的数据结构,具体包括三部分:词法解析,语法解析,语义解析。
- 词法解析:从左到右逐个字符地读入文本,根据构词规则以及空格,将 SQL 文本切成词和符号;
- 语法解析:在词法分析的基础上将单词序列按照定义好的语法规则组合成各类语法短语,语法分析程序判断源程序在结构上是否正确,并构建出抽象语法树 AST;
- 语义解析:主要对获得的 AST 进行审查。
KaiwuDB 语义解析原理
在 KaiwuDB 语义解析阶段,会获取到对应 SQL 的 AST,通过解析完 AST 中需要解析的部分,比如下图 AST 中,查询列表的未解析名称、From Clause 中的表名、Where Clause 中未解析名称,最后转化成 Memo 数据结构,供后面优化器优化使用。
对应的,From Clause 转成 Scan Expr,Where Clause 转成 Select Expr,查询列表转成 Project Expr,其中解析完之后表名会用表 ID 表示,列名用列 ID 表示,这就是语义解析主要功能。
::: hljs-center
表名解析
1、校验前缀:如果没有则直接校验表名,否则,先校验前缀是否存在,如果不存在需要报错,如果存在就继续解析表名。
2、解析表名:校验表名在缓存中是否存在,获取到表的元数据供后续解析使用。
列名解析
简单列名解析
1、判断是否有前缀,如果没有,直接校验表名;否则,先校验这个表前缀是不是前面解析出来的表,如果都不是,则应报错。
2、检验列名,通过对应表的元数据校验有没有该列,如果没有,则应报错;如果有,则解析成功,获取到列的元数据供后面解析使用。
函数列解析
1、先解析函数名称,会有一份定义列表,从定义列表查看该函数是否已定义的函数,如果不是应报错。
2、解析函数参数,如果函数的参数存在列,那么就需要校验列的有效性。
3、校验列的类型是否与事先定义好的参数类型一致,如不一致需要报错;如都解析过了,就会获得函数列的信息供后续使用。
图片
复合运算列解析
1、先校验操作符是否被定义过,操作符也有一个定义列表,如在定义列表中没找到则需要报错;如能找到,就会获取该操作符定义的所有表达式。
2、遍历操作符左右表达式,比如 a+5,左表达式是 a 列,右表达式是 5。
3、判断是否是列,如果是就校验列的有效性。
4、根据左表达式类型筛选出部分操作符表达式,后再根据右表达式类型筛选出最终操作符表达式。
5、如操作符最终表达式个数为 0,说明没匹配上,需要报错,操作符最终表达式个数为 1 才是解析成功,最后获得复合运算列的信息,供后续使用。
点击视频观看完整版回放。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。