需要一个 sql 语法解析器

177 天前
 Corybyte

1:能够识别复杂子 sql

2435 次点击
所在节点    数据库
21 条回复
wenmin92
177 天前
GPT 不行?
dzdh
177 天前
tool2d
177 天前
我把普通 sql ,用文本二次翻译成编程能识别的语言,比如 C ,比如 JAVA 。就很好动态解析了,扔进现有的库就行。
misaka19000
177 天前
antlr4 做编译处理
ThinkCat
177 天前
pincap 的 tidb 里面有这个,解析 sql 的,楼上有 go 版本的,我用的是 rust 版本:sqlparser
Corybyte
177 天前
@ThinkCat 不太行
```
SELECT C.cno FROM C WHERE C.cno not in (SELECT DISTINCT SC.cno FROM S INNER JOIN SC ON S.sno=SC.sno WHERE S.sname=张三);
```
生成的 ast 树为
Corybyte
177 天前
@Corybyte
```
&{{{{ SELECT C.cno FROM C WHERE C.cno not in (SELECT DISTINCT SC.cno FROM S INNER JOIN SC ON S.sno=SC.sno WHERE S.sname=张三); 0}}} 0xc000240390 false 0xc00017e300 0xc0002100c0 0xc0002403c0 <nil> <nil> [] <nil> <nil> <nil> [] false false 0 <nil> <nil> 0 [] <nil>}
```
而我想拿到的结果为
```
SELECT C.cno FROM
SELECT DISTINCT SC.cno FROM S INNER JOIN SC ON S.sno=SC.sno WHERE S.sname=张三
```
GoldenMan
177 天前
这个玩意可以用来做 sql 注入的检测吗
Corybyte
177 天前
@GoldenMan 我的需求只是提取 sql 语句中的子 sql 和拿到 sql 语句中用到的关键字,这两个需求已经实现了
Kould
177 天前
@ThinkCat 老哥也在写数据库?
zdkk
177 天前
antlr4 解析 sql 语法
如果想针对 sql 改动,可结合 calcite sql 模型
churchill
177 天前
v2ex 的标准答案不是手写一个 LL(1) Parser 吗?
mikewang
177 天前
zyuu2
177 天前
kkadmin
177 天前
你该不会认识我把
loveshuyuan
177 天前
gongxuanzhang
177 天前
druid 超级好用 我最近在写一个项目就用的 druid 的解析器
很完整 支持很多数据库方言
beneo
176 天前
antlr4 不行么??
Hieast
176 天前
感觉主要是语法文件不好弄,你要解析哪个方言的 sql 就去那个方言的开源生态里捞解析器好了
ThinkCat
176 天前
@Kould 之前没事写着玩的,就是个玩具,rust 的 sqlparser ,我用下来挺好用的,解析的蛮不错的。你可以看下: https://github.com/ThinkCats/neodb

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/991707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX