Calcite 解析
SQL Parser 使用 Demo
SchemaPlus rootSchema = Frameworks.createRootSchema(true);
final FrameworkConfig config = Frameworks.newConfigBuilder()
.parserConfig(SqlParser.configBuilder()
.setParserFactory(SqlParserImpl.FACTORY)
.setCaseSensitive(false)
.setQuoting(Quoting.BACK_TICK)
.setQuotedCasing(Casing.TO_UPPER)
.setUnquotedCasing(Casing.TO_UPPER)
.setConformance(SqlConformanceEnum.ORACLE_12)
.build())
.build();
String sql = "select ids, name from test where id < 5 and name = 'zhang'";
SqlParser parser = SqlParser.create(sql, config.getParserConfig());
try {
SqlNode sqlNode = parser.parseStmt();
System.out.println(sqlNode.toString());
} catch (Exception e) {
e.printStackTrace();
}
-
语法参数设置
- setCaseSensitive() 大小是写否敏感,比如说列名、表名、函数名
- setQuoting() 设置引用一个标识符,比如说MySQL中的是``, Oracle中的""
- setQuotedCasing Quoting策略,不变,变大写或变成小写,代码中的全部设置成变大写
- setUnquotedCasing 当标识符没有被Quoting后的策略,值同上
更多可以更以参考Calcite类Lex, 你也可以直接设置成MySQL、Oracle、MySQL_ANSI语法,如果需要定制化的话可以单独设置上面4个参数
-
ParserConfig中其它需要注意的参数
- setIdentifierMaxLength() 设置标识符的最大长度,如果你的列名、表较长可以相应的加大这个值
- setConformance() 特定语法支持,比如是否支持差集等
Sql Parser 功能
Calcite SqlParser 只会去检验 SQL 的语法是否正确,识别关键字(Keyword)与标识符(Identifier), 上面Sql关键字有select、from、where、<、=,其他为标识符,而不会去验证语义部分是否正确。比如表名、列名、列数据类型等信息的检验会在 Validate 阶段。