Calcite SQL解析
代码目录
如图:
java
config.fmpp
calcite 模板配置mysql
Parser.jj
JavaCC解析器git
parserImpls.ftl/compoundIdentifier.ftl
自定义JavaCC语法格式的解析SQL代码github
生成解析器的流程
如图:
web
Sql解析使用
解析示例代码
public class SqlParserSample {
public static void main(String[] args) throws SqlParseException {
// Sql语句
String sql = "select * from emps where id = 1";
// 解析配置
SqlParser.Config mysqlConfig = SqlParser.configBuilder().setLex(Lex.MYSQL).build();
// 建立解析器
SqlParser parser = SqlParser.create(sql, mysqlConfig);
// 解析sql
SqlNode sqlNode = parser.parseQuery();
// 还原某个方言的SQL
System.out.println(sqlNode.toSqlString(OracleSqlDialect.DEFAULT));
}
}
解析流程
首先生成SQL解析器SqlParser.Config,SqlParser.Config中存在获取解析工厂类SqlParser.Config#parserFactory()方法,能够在SqlParser.configBuilder()配置类中设置解析工厂
SqlParserImplFactory解析工厂中调用getParser方法获取解析器
SqlAbstractParserImpl抽象解析器,JavaCC中生成的解析器的父类,Calcite中默认的解析类名为SqlParserImpl
SqlParserImpl中,有静态字段FACTORY,主要是实现SqlParserImplFactory,并建立解析器