让 SQL 解析不再重复造轮子:SqlParserX 正式开源

一个纯 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 等不同的解析框架。随着业务不断演进,这种相对分散的实现方式,在语法扩展、逻辑复用和长期维护上也逐渐显现出一些挑战:

  1. 不同数据源语法扩展能力有限

    遇到新方言或新语法时,往往需要先做正则预处理,或在既有框架上单独扩展语法,扩展点相对集中;

  2. 解析框架较为多样

    各场景各选其需,语法树结构与业务解析逻辑难以统一复用,维护成本较高;

  3. 血缘等业务解析门槛较高

    需要先理解不同框架的节点定义与语法树结构,再实现转换与解析逻辑,整体学习与扩展成本不低。

为了更系统地应对这些问题,我们探索并落地了一套新的解析方案------对 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

相关推荐
桃西西呀44 分钟前
饭桌上又卡壳了?我用 TRAE 写了个嘴替鸭,把回话提前备好
人工智能·llm·ai编程
kyriewen1 小时前
我让 AI 当候选人面了一轮:居然一个问题都没问倒它
人工智能·程序员·ai编程
月与清酒1 小时前
2026年10月AI大模型全景对比:GPT-6、Claude 5.5、Gemini 4、DeepSeek V4.1到底差在哪
人工智能·gpt·ai
这个DBA有点耶1 小时前
期货 CTP 系统 Oracle RAC 迁移国产库实战:读写分离架构设计与性能对标
数据库·架构·dba
来自于狂人1 小时前
AI前沿速递|AI自己“进化“操作界面干翻GPT-5.5!8B“流体模型“提速2.54倍,清华让Agent学会“收拾记忆“成本直降28%
人工智能·gpt
数据库安全1 小时前
AI数据访问安全 |如何控制AI访问权限,防止越权
数据库·安全
科技看点说1 小时前
AI画面不廉价:质感的三层来源详解
人工智能
秦先生在广东1 小时前
Agentic Awesome Skills 解析:构建本地优先的 Agent 技能控制平面
人工智能
径硕科技JINGdigital2 小时前
企业搭建 AI 模型网关,该选择哪些支持多模型接入与统一治理的平台?
人工智能