1:能够识别复杂子 sql

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