解析引擎 #
相对于其他编程语言,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 模板化功能