1:能够识别复杂子 sql
1
wenmin92 2023-11-14 10:28:17 +08:00
GPT 不行?
|
2
dzdh 2023-11-14 10:30:21 +08:00
|
3
tool2d 2023-11-14 10:30:41 +08:00
我把普通 sql ,用文本二次翻译成编程能识别的语言,比如 C ,比如 JAVA 。就很好动态解析了,扔进现有的库就行。
|
4
misaka19000 2023-11-14 10:34:00 +08:00 via Android
antlr4 做编译处理
|
5
ThinkCat 2023-11-14 10:42:55 +08:00
pincap 的 tidb 里面有这个,解析 sql 的,楼上有 go 版本的,我用的是 rust 版本:sqlparser
|
6
Corybyte OP @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 树为 |
7
Corybyte OP @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=张三 ``` |
8
GoldenMan 2023-11-14 16:43:25 +08:00
这个玩意可以用来做 sql 注入的检测吗
|
9
Corybyte OP @GoldenMan 我的需求只是提取 sql 语句中的子 sql 和拿到 sql 语句中用到的关键字,这两个需求已经实现了
|
11
zdkk 2023-11-14 18:29:00 +08:00
antlr4 解析 sql 语法
如果想针对 sql 改动,可结合 calcite sql 模型 |
12
churchill 2023-11-14 18:56:19 +08:00
v2ex 的标准答案不是手写一个 LL(1) Parser 吗?
|
13
mikewang 2023-11-14 19:43:50 +08:00 via iPhone
如果是 MySQL 语法的 SQL ,那就直接调 MySQL 源码里的函数呗。
调用 parse_sql()函数解析: https://github.com/mysql/mysql-server/blob/87307d4ddd88405117e3f1e51323836d57ab1f57/sql/sql_parse.cc#L7171 YACC 语法在这: https://github.com/mysql/mysql-server/blob/87307d4ddd88405117e3f1e51323836d57ab1f57/sql/sql_yacc.yy |
14
zyuu2 2023-11-14 22:21:44 +08:00
python 有个 sql 解析库挺好用的: https://github.com/klahnakoski/mo-sql-parsing 俺之前做的一个网页用的就是这个库,效果如下: https://sql-translate.com/translator/#sql/kql/SELECT%20C.cno%20FROM%20C%20WHERE%20C.cno%20not%20in%20(SELECT%20DISTINCT%20SC.cno%20FROM%20S%20INNER%20JOIN%20SC%20ON%20S.sno=SC.sno%20WHERE%20S.sname='%E5%BC%A0%E4%B8%89')%0A%0A
|
15
kkadmin 2023-11-14 22:25:27 +08:00
你该不会认识我把
|
16
loveshuyuan 2023-11-14 22:51:47 +08:00
|
17
gongxuanzhang 2023-11-14 23:23:12 +08:00
druid 超级好用 我最近在写一个项目就用的 druid 的解析器
很完整 支持很多数据库方言 |
18
beneo 2023-11-15 07:00:25 +08:00 via iPad
antlr4 不行么??
|
19
Hieast 2023-11-15 10:32:24 +08:00
感觉主要是语法文件不好弄,你要解析哪个方言的 sql 就去那个方言的开源生态里捞解析器好了
|
20
ThinkCat 2023-11-15 19:03:32 +08:00
@Kould 之前没事写着玩的,就是个玩具,rust 的 sqlparser ,我用下来挺好用的,解析的蛮不错的。你可以看下: https://github.com/ThinkCats/neodb
|