前言
最近需要解析presto sql。
sql 解析
第一种方法
presto 本身也是用的 antlr
进行 sql 语法的编辑,如果你clone了presto的源码,会在 presto-parse
模块中发现 presto/presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4
文件,也就是说我们可以通过直接使用该文件生成解析的配置文件,然后进行 sql 解析
,但是这种方法太过复杂,我尝试了下放弃了,因为从语法树中获取某些值时比较混乱,容错较小,还需要再遍历其儿子、兄弟节点,并且通过节点的 getText 方法获得节点值。
1. antlr
安装
idea
安装插件 antlr
2. 解析sql
presto
的 g4 文件在:presto-parser/src/main/antlr4/com/facebook/presto/sql/parser/SqlBase.g4
第二种方法
我们肯定很容易的就想到,presto 源码肯定也对 sql 进行了解析,何不直接使用 presto 的解析类呢?
功夫不负有心人,我在源码中发现了 SqlParser 这个类,该类在 presto-parser 模块中,通过调用 createStatement(String sql) 方法会返回一个Statement 2,后面我们只需要对 Statement 进行遍历即可
presto-parser/src/main/java/com/facebook/presto/sql/parser/SqlParser.java
里面有个createStatement
public static void main(String[] args) {
SqlParser sqlParser = new SqlParser();
Statement statement = sqlParser.createStatement(
"SELECT s.sid,s.sname,AVG(score)\n" +
"FROM SC sc JOIN Student s on sc.sid=s.sid WHERE\n" +
"sc.score<60 GROUP BY s.sid,s.sname HAVING COUNT(sc.score)>=2\n");
System.out.println(statement);
}