一、介绍 SQL 解析引擎(官方)

1 历史

1 SQL 解析作为分库分表类产品的核心,其性能和兼容性是最重要的衡量指标。ShardingSphere 的 SQL 解 析器经历了 3 代产品的更新迭代。

2 第一代 SQL 解析器为了追求性能与快速实现,在 1.4.x 之前的版本使用 Druid 作为 SQL 解析器。经实际 测试,它的性能远超其它解析器。

3 第二代 SQL 解析器从 1.5.x 版本开始,ShardingSphere 采用完全自研的 SQL 解析引擎。由于目的不同, ShardingSphere 并不需要将 SQL 转为一颗完全的抽象语法树,也无需通过访问器模式进行二次遍历。它 采用对 SQL 半理解的方式,仅提炼数据分片需要关注的上下文,因此 SQL 解析的性能和兼容性得到了进 一步的提高。

4 第三代 SQL 解析器从 3.0.x 版本开始,尝试使用 ANTLR 作为 SQL 解析引擎的生成器,并采用 Visit 的方 式从 AST 中获取 SQL Statement。从 5.0.x 版本开始,解析引擎的架构已完成重构调整,同时通过将第一 次解析的得到的 AST 放入缓存,方便下次直接获取相同 SQL 的解析结果,来提高解析效率。因此我们建 议用户采用 PreparedStatement 这种 SQL 预编译的方式来提升性能。

2 功能点

1) 提供独立的 SQL 解析功能

2) 可以非常方便的对语法规则进行扩充和修改(使用了 ANTLR)

3 )支持多种方言的 SQL 解析

数据库 支持状态
MySQL 支持,完善
PostgreSQL 支持,完善
SQLServer 支持
Oracle 支持
SQL92 支持

4) 提供 SQL 格式化功能(开发中)

5 ) 提供 SQL 模板化功能(开发中)

二、单独使用

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>shardingsphere-sql-parser-engine</artifactId>
  4. <version>${project.version}</version>
  5. </dependency>
  6. <!-- 根据需要引入指定方言的解析模块(以 MySQL 为例),可以添加所有支持的方言,也可以只添加使用到的
  7. -->
  8. <dependency>
  9. <groupId>org.apache.shardingsphere</groupId>
  10. <artifactId>shardingsphere-sql-parser-mysql</artifactId>
  11. <version>${project.version}</version>
  12. </dependency>

1 SQLStatement解析工厂

image.png

2 解析引擎
image.png
3 Statement解析执行器
image.png
4 解析引擎
image.png

5 SQLParserExecutor

image.png

6 解析Facade
image.png
7 SQLParserFactory
image.png

8 SQL 语法解析器
image.png

9 语法解析器实现
MySQLStatementParser 是动态编译生成的
image.png
image.png
10 ParseASTNode

image.png
11 antlr(ANother Tool for Language Recognition) 的语法解析树 (ParseTree)
Github

官网
image.png

12 默认多表解析
image.png

三、流程图

image.png

03 解析引擎 - 图15