V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Corybyte
V2EX  ›  数据库

需要一个 sql 语法解析器

  •  1
     
  •   Corybyte · 2023-11-14 10:07:17 +08:00 · 2586 次点击
    这是一个创建于 380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1:能够识别复杂子 sql

    第 1 条附言  ·  2023-11-14 11:06:57 +08:00
    能够识别一条 sql 语句中包含的子 sql 语句,并提取出来
    第 2 条附言  ·  2023-11-14 15:01:19 +08:00
    结贴 https://github.com/nene/sql-parser-cst 可以实现讲 sql 文件生成 ast 树,且提供的内部方法提取子 sql 文件
    21 条回复    2023-11-16 14:24:06 +08:00
    wenmin92
        1
    wenmin92  
       2023-11-14 10:28:17 +08:00
    GPT 不行?
    dzdh
        2
    dzdh  
       2023-11-14 10:30:21 +08:00
    tool2d
        3
    tool2d  
       2023-11-14 10:30:41 +08:00
    我把普通 sql ,用文本二次翻译成编程能识别的语言,比如 C ,比如 JAVA 。就很好动态解析了,扔进现有的库就行。
    misaka19000
        4
    misaka19000  
       2023-11-14 10:34:00 +08:00 via Android
    antlr4 做编译处理
    ThinkCat
        5
    ThinkCat  
       2023-11-14 10:42:55 +08:00
    pincap 的 tidb 里面有这个,解析 sql 的,楼上有 go 版本的,我用的是 rust 版本:sqlparser
    Corybyte
        6
    Corybyte  
    OP
       2023-11-14 10:51:10 +08:00
    @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 树为
    Corybyte
        7
    Corybyte  
    OP
       2023-11-14 10:53:19 +08:00
    @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=张三
    ```
    GoldenMan
        8
    GoldenMan  
       2023-11-14 16:43:25 +08:00
    这个玩意可以用来做 sql 注入的检测吗
    Corybyte
        9
    Corybyte  
    OP
       2023-11-14 16:48:49 +08:00
    @GoldenMan 我的需求只是提取 sql 语句中的子 sql 和拿到 sql 语句中用到的关键字,这两个需求已经实现了
    Kould
        10
    Kould  
       2023-11-14 17:26:00 +08:00
    @ThinkCat 老哥也在写数据库?
    zdkk
        11
    zdkk  
       2023-11-14 18:29:00 +08:00
    antlr4 解析 sql 语法
    如果想针对 sql 改动,可结合 calcite sql 模型
    churchill
        12
    churchill  
       2023-11-14 18:56:19 +08:00
    v2ex 的标准答案不是手写一个 LL(1) Parser 吗?
    mikewang
        13
    mikewang  
       2023-11-14 19:43:50 +08:00 via iPhone
    kkadmin
        15
    kkadmin  
       2023-11-14 22:25:27 +08:00
    你该不会认识我把
    loveshuyuan
        16
    loveshuyuan  
       2023-11-14 22:51:47 +08:00
    gongxuanzhang
        17
    gongxuanzhang  
       2023-11-14 23:23:12 +08:00
    druid 超级好用 我最近在写一个项目就用的 druid 的解析器
    很完整 支持很多数据库方言
    beneo
        18
    beneo  
       2023-11-15 07:00:25 +08:00 via iPad
    antlr4 不行么??
    Hieast
        19
    Hieast  
       2023-11-15 10:32:24 +08:00
    感觉主要是语法文件不好弄,你要解析哪个方言的 sql 就去那个方言的开源生态里捞解析器好了
    ThinkCat
        20
    ThinkCat  
       2023-11-15 19:03:32 +08:00
    @Kould 之前没事写着玩的,就是个玩具,rust 的 sqlparser ,我用下来挺好用的,解析的蛮不错的。你可以看下: https://github.com/ThinkCats/neodb
    Kould
        21
    Kould  
       2023-11-16 14:24:06 +08:00
    @ThinkCat 咋不往下写了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3454 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:55 · PVG 18:55 · LAX 02:55 · JFK 05:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.