解析器是数据库系统的重要组成部分之一,主要的功能是将客户端输入的 SQL 语句分解为语法单元,然后将这些语法单元转化成数据库内部可识别的数据结构,最终生成数据库可以执行的计划。KaiwuDB 的一条 SQL 执行的整个生命周期:- 从客户端输入一个 SQL 指令(文本格式),数据库执行器无法直接执行该文本指令,会先通过词法解析和语法解析将文本指令生成数据库能识别的数据结构 AST;
- 语义解析对 AST 进行有效性校验,生成优化器需要的 Memo 数据结构;
- 通过优化器(包括 RBO、CBO)优化后选出一个最优的 Memo 结构;
- 通过物理计划构建,生成数据库可执行的数据结构 Physical Plan,最终执行返回结构。
KaiwuDB 的解析器在整个 SQL 生命周期所处的位置比较靠前,介于客户端和优化器之间,主要功能是将客户端发来的文本指令转化成数据库能识别的数据结构,最后转成优化器需要的数据结构,具体包括三部分:词法解析,语法解析,语义解析。
在 KaiwuDB 语义解析阶段,会获取到对应 SQL 的 AST,通过解析完 AST 中需要解析的部分,比如下图 AST 中,查询列表的未解析名称、From Clause 中的表名、Where Clause 中未解析名称,最后转化成 Memo 数据结构,供后面优化器优化使用。对应的,From Clause 转成 Scan Expr,Where Clause 转成 select Expr,查询列表转成 Project Expr,其中解析完之后表名会用表 ID 表示,列名用列 ID 表示,这就是语义解析主要功能。
1、校验前缀:如果没有则直接校验表名,否则,先校验前缀是否存在,如果不存在需要报错,如果存在就继续解析表名。2、解析表名:校验表名在缓存中是否存在,获取到表的元数据供后续解析使用。