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