需要一个 sql 语法解析器

2023-11-14 10:07:17 +08:00
 Corybyte

1:能够识别复杂子 sql

2612 次点击
所在节点    数据库
21 条回复
wenmin92
2023-11-14 10:28:17 +08:00
GPT 不行?
dzdh
2023-11-14 10:30:21 +08:00
tool2d
2023-11-14 10:30:41 +08:00
我把普通 sql ,用文本二次翻译成编程能识别的语言,比如 C ,比如 JAVA 。就很好动态解析了,扔进现有的库就行。
misaka19000
2023-11-14 10:34:00 +08:00
antlr4 做编译处理
ThinkCat
2023-11-14 10:42:55 +08:00
pincap 的 tidb 里面有这个,解析 sql 的,楼上有 go 版本的,我用的是 rust 版本:sqlparser
Corybyte
2023-11-14 10:51:10 +08:00
@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
2023-11-14 10:53:19 +08:00
@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
2023-11-14 16:43:25 +08:00
这个玩意可以用来做 sql 注入的检测吗
Corybyte
2023-11-14 16:48:49 +08:00
@GoldenMan 我的需求只是提取 sql 语句中的子 sql 和拿到 sql 语句中用到的关键字,这两个需求已经实现了
Kould
2023-11-14 17:26:00 +08:00
@ThinkCat 老哥也在写数据库?
zdkk
2023-11-14 18:29:00 +08:00
antlr4 解析 sql 语法
如果想针对 sql 改动,可结合 calcite sql 模型
churchill
2023-11-14 18:56:19 +08:00
v2ex 的标准答案不是手写一个 LL(1) Parser 吗?
mikewang
2023-11-14 19:43:50 +08:00
zyuu2
2023-11-14 22:21:44 +08:00
kkadmin
2023-11-14 22:25:27 +08:00
你该不会认识我把
loveshuyuan
2023-11-14 22:51:47 +08:00
gongxuanzhang
2023-11-14 23:23:12 +08:00
druid 超级好用 我最近在写一个项目就用的 druid 的解析器
很完整 支持很多数据库方言
beneo
2023-11-15 07:00:25 +08:00
antlr4 不行么??
Hieast
2023-11-15 10:32:24 +08:00
感觉主要是语法文件不好弄,你要解析哪个方言的 sql 就去那个方言的开源生态里捞解析器好了
ThinkCat
2023-11-15 19:03:32 +08:00
@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