我把普通 sql ,用文本二次翻译成编程能识别的语言,比如 C ,比如 JAVA 。就很好动态解析了,扔进现有的库就行。
misaka19000
2023-11-14 10:34:00 +08:00
antlr4 做编译处理
ThinkCat
2023-11-14 10:42:55 +08:00
pincap 的 tidb 里面有这个,解析 sql 的,楼上有 go 版本的,我用的是 rust 版本:sqlparser
Corybyte
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
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=张三 ```