type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
为什么需要解析SQL?解析完SQL后又能做什么?
0. 校验SQL的语法是否合规
1. 数据安全需要解析SQL获取出对应的的操作
2. 数据血缘的抽取需要解析SQL
3. 类似Hive/Spark等在将SQL转化为mr,执行计划等的时候,也是需要解析SQL的
4. 等等;欢迎你来补充更多需要解析SQL的话题
📝 解析的方法
项目名称 | 适合的数据库 | 项目地址 | 个人观点 |
JSqlParser | RDBMS | 目前只适合关系型的数据库,对于大数据很多领域的数据库目前还不是特别支持 | |
calcite | Cassandra、Druid、Elasticsearch、MongoDB、Kafka,FlinkSQL等 | 后续再补 | |
antlr | 可以借助 grammars-v4 这个项目提供,可以解析很多数据库以及编程语言等都可以解析的 | antlr4项目:https://github.com/antlr/antlr4
语法校验项目模块: | 社区构建比较完善,比如Spark,Hive,Iceberg等都有.g4文件来满足antlr4对SQL的解析,并且你也可以借助开源项目提供的g4来解析 |
类似阿里开源的druid这种也是有解析SQL的功能的,但是稍微看了下源码,其底层好像也是有利用到antlr
antlr怎么用
IDEA插件
借助IDEA插件来进行安装,但是需要注意的是,项目中的antlr的版本最好是和idea中antlr的版本一致;如果不一致的话,需要使用antlr对应版本的jar来对g4文件生成对应的文件

手动JAR安装
我们在此处的地址下载自己需要的对应版本;此处的anltr4如果你不想配置环境变量,就替换为 java jar antrlxxx.jar -o… 后面需要的参数
常用参数说明:
- -o : 生成 tokens,interp,java等路径
- -listener: 生成监听者模式的参数
- -visitor: 生成访问者模式的参数
- -lib: 指定g4文件的路径
其它方法
生成效果
采用如上,最后生成的效果如下图;那我们就可以愉快的在代码中使用和调试了

使用流程
我们按照上面的流程,都生成对应的文件之后,就可以导入到项目中进行使用了;假设导入后报错的话,仔细检查下是否包名的路径之类的问题,手动处理下就好了
我们这里基于访问者来进行介绍
继承 BaseVisitor
比如我借助 grammars-v4 的hive4生成的访问者base类叫
HiveParserBaseVisitor
借助 Spark的g4生成的
SqlBaseBaseVisitor
这里我已Hive的为准介绍,
HiveSqlAst
来集成 HiveParserBaseVisitor
解析使用
创建一个来进行调用使用;大家可以使用下面的例子来进行校验使用
使用结果
比如我们这里使用的一条update中嵌套一个select校验,看最后的结果都是查询出来的;如果只是库和表的校验的话,那么对应的功能就是可以满足了的

错误SQL解析的错误获取
继承
BaseErrorListener
; 我们这里借助传入list来收起错误的error我们新addErrorListener和addErrorListener,注册上我们的错误监听器
我们故意在sql前加个;号,就可以看到错误解析的具体位置在 ; 这里,还是非常的准确的

方法使用小结
可以看到该接口还提供了很多的对用操作方法,那么我们在使用的时候,就根据对应的方法耐心的调试即可

idea方法小结
上面不是提到我们安装了antlr的插件么?那么也得使用起来了吧
还是以grammer-v4为准来看; 点击
statement
会出现下面的Test Rule statement;然后我们就可以将我们SQL放入如下,就可以看到左下角的SQL语法树的结构然后我们的代码就可以根据树的调用方法来进行精确的获取,并且同时也可以看到校验的SQL是否有问题

🤗 总结归纳
目前我这边更多的是解析出来SQL,然后对权限进行校验和拦截操作
对于多种不同类似的数据库,其语法是可能不同的,我们其实是可以借助一些设计模式来更好的帮助我们维护和扩展代码
最后,放一个我编写的demo的传送门: https://github.com/ruY9527/boot-case/blob/master/boot-base/boot-basic-io/src/main/java/com/iyang/bootbasicio/sql/hive/utils/HiveSqlHelper.java
📎 参考文章
有关文章的问题,欢迎您在底部评论区留言,一起交流~