Logo
解析引擎

解析引擎 #

相对于其他编程语言,SQL 是比较简单的。不过,它依然是一门完善的编程语言,因此对 SQL 的语法进行解析,与解析其他编程语言(如:Java 语言、C 语言、Go 语言等)并无本质区别。

抽象语法树 #

解析过程分为词法解析和语法解析。词法解析器用于将 SQL 拆解为不可再分的原子符号,称为 Token。并根据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面量和操作符。再使用语法解析器将词法解析器的输出转换为抽象语法树。

例如,以下 SQL:

sql> SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18

解析之后的为抽象语法树见下图。

抽象语法树

为了便于理解,抽象语法树中的关键字的 Token 用绿色表示,变量的 Token 用红色表示,灰色表示需要进一步拆分。最后,通过 visitor 对抽象语法树遍历构造域模型,通过域模型(SQLStatement )去提炼分片所需的上下文,并标记有可能需要改写的位置。供分片使用的解析上下文包含查询选择项(Select Items)、表信息(Table)、分片条件(ShardingCondition)、自增主键信息(Auto increment Primary Key)、排序信息(Order By)、分组信息(Group By)以及分页信息(Limit、Rownum、Top)。SQL 的一次解析过程是不可逆的,一个个 Token 按 SQL 原本的顺序依次进行解析,性能很高。考虑到各种数据库 SQL 方言的异同,在解析模块提供了各类数据库的 SQL 方言字典。

SQL 解析引擎 #

  • 功能点

    • 提供独立的 SQL 解析功能
    • 可以非常方便的对语法规则进行扩充和修改(使用了 ANTLR )
    • 支持多种方言的 SQL 解析
    数据库支持状态
    MySQL支持,完善
    PostgreSQL支持,完善
    SQLServer支持
    Oracle支持
    SQL92支持
    openGauss支持
  • 开发中功能

    • 提供 SQL 格式化功能
    • 提供 SQL 模板化功能