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 |