JQuick-SQL AST 解析:从 SQL 文本到强类型节点
Meta 描述:使用 JQuickSQLExecutor 将 SQL 解析为 JQuickQueryNode,理解 jquick-sql AST 在 SQL 审计、语句治理和计划生成中的作用。
标签:SQL AST、JQuickSQLExecutor、JQuickQueryNode、SQL 解析、jquick-sql、SQL 审计
官网示例:
- FORMULAS 示例页:https://www.jquick.org/jquick-sql
- github 地址:https://github.com/paohaijiao/jquick-sql
前言
字符串截取难以可靠识别嵌套查询、Join 和复杂谓词。jquick-sql 使用解析器生成强类型 AST,使 Java 团队可以按节点检查 SQL 结构,再决定是否继续执行或转换。
一行得到 AST
java
import com.github.paohaijiao.ast.JQuickQueryNode;
import com.github.paohaijiao.executor.JQuickSQLExecutor;
JQuickQueryNode ast = new JQuickSQLExecutor().execute(
"SELECT dept, COUNT(*) FROM emp WHERE salary > 20000 GROUP BY dept"
);
System.out.println(ast);
入口返回 JQuickQueryNode,而不是用正则拆分的字符串片段。
检查 SELECT 子句
README 示例展示了通过强类型访问器读取结构:
java
JQuickSelectExpressionNode expression = ast.getSelectStatement().getSelectExpression();
for (JQuickSelectClauseNode clause : expression.getDataSetOp().getSelectClauses()) {
System.out.println(clause.getNodeType());
System.out.println(clause.getFromClause() != null);
System.out.println(clause.getJoinClauses().size());
System.out.println(clause.getWhereClause() != null);
}
可据此采集表、Join、过滤、分组或排序等信息,构建审计规则。
AST 与计划执行的关系
执行模式下,AST 会经 JQuickASTToLogicalPlanVisitor 转换为逻辑计划,优化后下推为物理计划。仅做 SQL 解析、审计或治理时,不需要注册表,也不会建立数据库连接。
可解析的 SQL 能力
项目 AST 覆盖 SELECT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT、集合运算、子查询、CTE、CASE WHEN 与函数调用。实际执行支持范围应以 README 为准,例如不支持 FULL OUTER JOIN。
常见问题
**AST 解析会执行 SQL 吗?**不会,JQuickSQLExecutor 只负责解析。
**适合做 SQL 注入防护吗?**可用于结构化检查,但完整安全策略仍应由应用统一实现。
**能直接连库获取元数据吗?**不能,jquick-sql 不提供 JDBC 直连。
总结与拓展
AST 层是 jquick-sql 最适合做治理与二次开发的入口。它为 Java 分布式 SQL 查询引擎的后续逻辑计划、优化和数据集执行提供结构化基础。
Core Advantage
Typed nodes replace fragile string manipulation for SQL understanding.
Applicable Scenarios
SQL auditing, statement classification, governance rules, and custom planning pipelines.