需要一个 sql 语法解析器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Corybyte
V2EX    数据库

需要一个 sql 语法解析器

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

    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     Solana     2706 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 11:29 PVG 19:29 LAX 04:29 JFK 07:29
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86