一个纯 Druid 实现的多方言 SQL 解析引擎与工具包:表解析、表/字段血缘、函数解析、SQL 切分、行级权限改写,配套标准文档站与开箱即用的可视化解析平台
项目地址:https://github.com/DTStack/SqlParserX
文档站:https://dtstack.github.io/SqlParserX/
开源协议:Apache License 2.0
缘起:我们为什么要把 SQL 解析"重做一遍"
如果你做过数据平台、数据开发、数据资产或数据 API 这类系统,一定绕不开一个组件------SQL 解析器。
只要你想做这些事,就必然需要一个靠谱的 SQL 解析器:
-
从一段 SQL 里识别出它到底动了哪些真实表;
-
追踪数据加工链路,搞清楚表血缘、字段血缘;
-
识别 SQL 里用到了哪些函数;
-
把带动态变量的 SQL 脚本改写成可执行的预编译 SQL;
-
做行列级权限、SQL 脱敏、SQL 类型识别、脚本切分......
在数栈平台内部,SQL 解析能力过去主要由多个子产品分别承接:离线解析、API 解析、标签解析、实时解析等场景,会根据自身需求选用 Calcite、hive-exec、Druid、Flink Parser 等不同的解析框架。随着业务不断演进,这种相对分散的实现方式,在语法扩展、逻辑复用和长期维护上也逐渐显现出一些挑战:
-
不同数据源语法扩展能力有限
遇到新方言或新语法时,往往需要先做正则预处理,或在既有框架上单独扩展语法,扩展点相对集中;
-
解析框架较为多样
各场景各选其需,语法树结构与业务解析逻辑难以统一复用,维护成本较高;
-
血缘等业务解析门槛较高
需要先理解不同框架的节点定义与语法树结构,再实现转换与解析逻辑,整体学习与扩展成本不低。
为了更系统地应对这些问题,我们探索并落地了一套新的解析方案------对 SQL 解析做分层改造,把解析拆成"语法解析层 + 业务解析层"两层,并沉淀出一套可复用、可扩展的解析能力:
-
统一的 SQL 语法树采用 Druid
语法层基于 Druid 实现,后续由我们统一维护并持续扩展语法能力;
-
解析业务层由我们核心自研
基于这一套统一的语法树,自研并维护一套标准的核心解析框架结构,其他 SQL 类型直接继承扩展即可。
需要说明的是,这是一套面向未来的新方案:新接入的数据源会直接采用全新的分层实现,存量数据源则按计划逐步迁移替换,平滑过渡。
在这套新方案验证落地之后,我们做了一个决定:把这套核心的分层改造实现开源出去,做成一个纯净的、基于统一语法树的 SQL 解析器,让更多做数据平台的团队直接复用。
于是就有了 SqlParserX ------一个无需依赖 Calcite、ANTLR 等其他解析组件,完全基于 Druid 实现各类 SQL 解析,并将不同数据源统一到一棵抽象语法树的开源项目。
SqlParserX 是什么
一句话概括:SqlParserX 是一套「Druid 语法解析层 + SqlParserX 业务解析层」的 SQL 解析中间件。
它采用两层解耦架构,各层职责清晰、可独立演进:

SqlParserX 两层架构
bash
子产品封装层: 离线 / API / 资产 等子产品包(按需封装,复用核心解析能力)
│
能力出口层: sqlparserx-web (REST :8888) / sqlparserx-ui (Vue + ECharts)
│ 统一契约 ISqlParser
解析业务层: sqlparserx-core(本项目自研)
│ SQL + DbType / SQLStatement AST
语法解析层: sqlparserx-syntax(Druid 1.2.28)
值得一提:sqlparserx-core 对外暴露的是一套统一的解析能力与契约 。在其之上,不同的产品团队可以按各自的业务场景,进一步封装成离线、API、资产等子产品包 ,复用同一套核心解析能力,而不必再各自重复造解析轮子。

业务层内部则是经典的「工厂 → 接口 → 基类 → 方言扩展」模式:
SqlParserFactory(按 Druid DbType 选择方言)→ ISqlParser(统一契约)→ BaseSqlParser(把 AST 分发给各 Client)→ 各方言实现(按需重写表/血缘解析)。
这套架构最大的价值在于:语法问题回到语法层按 Druid 的方式扩展,业务语义在业务层沉淀;通用能力沉到 Base,数据源差异按方言覆盖。 目前已经支持 15+ 种数据源方言(MySQL、Doris、StarRocks、Hive、ClickHouse、Oracle、达梦、OceanBase、PostgreSQL、Greenplum、Spark、SQL Server、TiDB、Trino 等)。
核心能力:把最常用的解析能力全部开源
SqlParserX 把数栈内部沉淀多年的基础解析能力做了开源:一方面将各场景通用的核心抽象方法进行统一规范 ,另一方面基于一套新的解析扩展思路 进行扩展实现,从而支持不同数据源的 SQL 场景快速扩展,覆盖数据平台最常用的几类场景。
引入 pom 依赖
在业务工程的 pom.xml 中引入业务解析层 sqlparserx-core 即可:
bash
<dependency>
<groupId>com.dtstack</groupId>
<artifactId>sqlparserx-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
sqlparserx-core 会传递依赖 sqlparserx-syntax(语法层)与官方 Druid,因此业务解析只需引入 core 一个坐标;若只做 SQL → AST 的语法解析,也可以单独引入 sqlparserx-syntax。
下面用三段核心代码,分别演示最常用的三类能力。
表血缘:看清数据在表之间的流转
从 INSERT、CTAS 等语句中追溯目标表 与来源表,并输出表之间的依赖关系,同时支持 CTE 前向引用推断。
bash
ISqlParser parser = SqlParserFactory.getSqlParser(SqlParserDataSourceType.MYSQL);
TableLineageResult result = parser.parseTableLineages(
"INSERT INTO db1.table1 " +
"SELECT a.id, b.name FROM db2.table2 a JOIN db3.table3 b ON a.id = b.id");
result.getTableLineages().forEach(System.out::println);
输出:
bash
Target Tables:
db1.table1
Source Tables:
db2.table2
db3.table3
字段血缘:把每个字段追溯到它的来源
字段血缘会把每个目标字段追溯回它的来源字段 ,覆盖表达式、聚合、CASE、窗口函数、* 展开和 CTE 等复杂场景。
bash
ColumnLineageResult result = parser.parseColumnLineages(
"CREATE TABLE db1.summary AS " +
"SELECT u.id AS user_id, SUM(o.amount) AS total_amount " +
"FROM db1.users u JOIN db1.orders o ON u.id = o.user_id " +
"GROUP BY u.id",
tableColumnsMap /* 可选:传入真实表字段信息,用于 SELECT * 展开 */);
result.printColumnLineage();
输出:
bash
db1.users.id -> db1.summary.user_id
db1.users.id, db1.orders.amount -> db1.summary.total_amount
SQL 改写:动态变量解析与预编译
这是很多"SQL 转 API / 数据 API"场景的刚需能力。用户在平台上手写一条带 ${变量} 的 SQL,平台据此生成标准 API,调用方按标准入参传值即可拿到结果。
SqlParserX 提供了两个核心入口,覆盖「配置期」和「运行期」:
-
参数提取
(
parseParameterSql):解析脚本中的${变量},得到变量名、位置、绑定字段、操作符、是否必填等信息,用于生成 API 入参配置; -
预编译改写
(
buildSqlByPrepareCompile):根据 SQL 中动态变量的位置,自动把${变量}替换为 JDBC?占位符 ,并输出按顺序排列的参数值列表,直接交给PreparedStatement执行,既避免了字符串拼接,也天然防住了 SQL 注入。
bash
ISqlParser parser = SqlParserFactory.getSqlParser(SqlParserDataSourceType.MYSQL);
String sql = "SELECT * FROM db1.table1 WHERE dt = '${bizdate}' AND region = '${region}'";
// 1、参数提取:解析 SQL 中的动态变量(名称、是否必填、默认值、绑定的表字段等)
ParseParameterResult paramResult = parser.parseParameterSql(sql, false, null);
paramResult.getInputParams().forEach(p ->
System.out.println(p.getName() + " / " + p.getDataType() + " / " + p.getSqlPart()));
// 2、预编译:传入参数值,得到 ? 占位符 SQL 与按序参数列表
Map<String, Object> inParams = new HashMap<>();
inParams.put("bizdate", "20240101");
inParams.put("region", "hangzhou");
PrepareCompileResult compileResult = parser.buildSqlByPrepareCompile(sql, inParams, columns);
compileResult.getBeautifulSql(); // SELECT * FROM db1.table1 WHERE dt = ? AND region = ?
compileResult.getInputFields(); // [20240101, hangzhou]
除此之外,SqlParserX 还提供了一套完整的通用解析能力:

所有能力都通过统一契约 ISqlParser 对外暴露,一套 API 走遍所有数据源。
标准文档站:让接入有章可循
开源项目最怕"只有代码、没有说明"。SqlParserX 同步建设了一个标准的文档站,把核心 SDK 的使用规范、能力支持边界和扩展指南都讲清楚:
🔗 文档站:https://dtstack.github.io/SqlParserX/
文档站基于 Docusaurus 搭建,具备以下特点:
-
核心 SDK 使用规范
从环境准备、依赖引入,到表解析、表/字段血缘、函数解析、参数提取与预编译,每一类能力都有完整的「引入方式 + 可运行示例」;
-
能力支持矩阵
按「语法层能否生成正确 AST」和「业务层能否输出稳定结果」双重视角,维护了各数据源的语法/业务解析支持情况;
-
架构与扩展指南
包含双层架构设计、模块依赖边界,以及《解析能力标准迭代维护扩展指南》,告诉你新增数据源/新能力应该放在语法层还是业务层;
-
中英双语 + 版本管理
站点内置简体中文 / English 切换与版本下拉,方便国内外开发者阅读。
说明:SqlParserX 的能力支持需要同时检查"语法层"和"业务层",因此文档也按这两层分别维护,保证能力边界清晰、可追溯。
快速验证:开箱即用的平台服务
除了把能力集成进自己的系统,SqlParserX 还提供了一套开箱即用的平台站点服务 (sqlparserx-web + sqlparserx-ui),用于快速启动一个 Web 服务来验证核心解析能力,无需写代码即可在页面上直接体验。
启动后,访问 Web 服务即可在浏览器里直接体验各类解析能力:
-
血缘可视化
输入一段 SQL,一键解析表血缘、字段血缘,并以图形化方式直观展示来源与目标的流转关系(基于 ECharts);
-
表解析 / 建表解析
可视化展示主表、真实表,以及建表语句中的字段、键、分区、分桶结构;
-
语法校验 / SQL 切分
在线验证 SQL 语法、切分多语句脚本;
-
参数解析与预编译工作台
在线体验
${变量}提取与?占位符改写。
这相当于一个核心功能的场景示范:你可以把它当作一个独立的解析服务跑起来,用可视化页面快速验证表解析、血缘、参数解析等核心能力是否满足你的业务场景;验证通过后,再把 SqlParserX 当作 Java SDK 引入到自己的系统里即可。
快速上手
从源码构建
bash
git clone https://github.com/DTStack/SqlParserX.git
cd SqlParserX
mvn clean package -U -DskipTests
一键跑起来,打开可视化页面
参考项目 bin/ 目录下的启停脚本启动 sqlparserx-web,然后访问服务地址,即可在页面上体验表解析、血缘可视化、参数解析等能力。
更多细节,欢迎直接阅读 README 和文档站。
写在最后
SqlParserX 的诞生,不是一次性的重构,而是一次次把问题放回正确层次的取舍:
语法问题扩展 Druid,业务语义扩展 SqlParserX;通用能力沉淀 Base,数据源差异按方言覆盖。
我们希望通过这个项目,让更多做数据平台、数据开发、数据资产、数据 API 的团队,不用再从零踩一遍 SQL 解析的坑,而是可以直接站在一个经过生产验证的分层解析引擎之上。
项目已开源,欢迎 Star、Issue 和 PR:
🐙 GitHub:https://github.com/DTStack/SqlParserX
📖 文档站:https://dtstack.github.io/SqlParserX/
📄 开源协议:Apache License 2.0
如果你正在做多数据源的 SQL 解析、血缘、表解析相关工作,欢迎一起交流与共建,我们下期见。

作者:changlu | 项目:DTStack / SqlParserX
