V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Corybyte
V2EX  ›  数据库

需要一个 sql 语法解析器

  •  1
     
  •   Corybyte · Nov 14, 2023 · 3307 views
    This topic created in 901 days ago, the information mentioned may be changed or developed.

    1:能够识别复杂子 sql

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