一、前言
在先前的技术博客中,我们已经详细介绍过数据库的 parser 模块与执行流程:用户输入的 SQL 语句通过词法解析器生成 token,再通过语法分析器生成抽象语法树(AST),经过 AST 生成对应的 planNode,最后执行 planNode。本期博客我们将以新增语法为例,重点介绍一条 SQL 语句需要历经的流程,以及如何自定义 SQL 语句和功能。
二、新增 SQL 语法
KaiwuDB 是通过 goyacc 解析 sql.y 中的代码生成 AST,而我们想要新增一个语法,则需要在 sql.y 中添加对应的关键字以及对应的语法解析规则,最后在代码中添加对应的语法节点以及功能实现。我们以创建时序数据库的语法 CREATE TS DATABASE xxx 为例,讲解如何添加新 SQL 语句,以及该语句的执行过程。
- 定义新的关键字
词法分析器是通过一个个关键字解析整条语句,所以第一步我们需要将整条语句涉及到的所有关键字定义完毕。
搜索 pkg/sql/parser/sql.y 文件,在文件中找到 %token(这个代表着定义的关键字),我们可以在这里看到已经有 CREATE 和 DATABASE 关键字,所以需要新增一个 TS 关键字。
Go
......
%token <str> TS
......
加好关键字后,我们还需定义其是保留关键字或是非保留关键字,非保留关键字可以作为标识符使用并在使用时需要加上双引号。所以,我们需要将 TS 加到非保留关键字里中。
Go
unreserved_keyword:
......
| TS
......
添加完毕后,词法分析器即可解析整条语句的所有关键字,接下来我们需要定义一个新的语法规则,使得语法解析器可以处理这条新的语句。
- 添加新的语法规则
新的语法首先要给它定义一个类型。在 sql.