1:能够识别复杂子 sql
1
wenmin92 361 天前
GPT 不行?
|
3
tool2d 361 天前
我把普通 sql ,用文本二次翻译成编程能识别的语言,比如 C ,比如 JAVA 。就很好动态解析了,扔进现有的库就行。
|
4
misaka19000 361 天前 via Android
antlr4 做编译处理
|
5
ThinkCat 361 天前
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 361 天前
这个玩意可以用来做 sql 注入的检测吗
|
11
zdkk 361 天前
antlr4 解析 sql 语法
如果想针对 sql 改动,可结合 calcite sql 模型 |
12
churchill 361 天前
v2ex 的标准答案不是手写一个 LL(1) Parser 吗?
|
13
mikewang 361 天前 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 |
15
kkadmin 361 天前
你该不会认识我把
|
17
gongxuanzhang 361 天前
druid 超级好用 我最近在写一个项目就用的 druid 的解析器
很完整 支持很多数据库方言 |
18
beneo 361 天前 via iPad
antlr4 不行么??
|
19
Hieast 360 天前
感觉主要是语法文件不好弄,你要解析哪个方言的 sql 就去那个方言的开源生态里捞解析器好了
|
20
ThinkCat 360 天前
@Kould 之前没事写着玩的,就是个玩具,rust 的 sqlparser ,我用下来挺好用的,解析的蛮不错的。你可以看下: https://github.com/ThinkCats/neodb
|