Corybyte
V2EX  ›  数据库

需要一个 sql 语法解析器

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