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

需要一个 sql 语法解析器

  •  1
     
  •   Corybyte · 360 天前 · 2573 次点击
    这是一个创建于 360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1:能够识别复杂子 sql

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