Apache Calcite解析自身输出的BigQuery格式SQL失败及疑问
Apache Calcite解析BigQuery兼容问题的疑问
我是Apache Calcite新手,遇到了一个奇怪的问题:
给定简单SQL查询:
select * from orders
使用以下Java代码解析:
SqlParser.Config sqlParserConfig = SqlParser .configBuilder() .setConformance(SqlConformanceEnum.LENIENT) .build(); SqlParser parser = SqlParser.create(sqlQuery, sqlParserConfig); SqlNode parseAst = parser.parseQuery(); CalciteCatalogReader catalogReader = buildCatalogReader(schema, typeFactory); SqlValidator.Config validatorConf = SqlValidator.Config.DEFAULT.withSqlConformance(SqlConformanceEnum.BIG_QUERY); validatorConf = validatorConf.withIdentifierExpansion(true); SqlValidator validator = SqlValidatorUtil.newValidator(SqlStdOperatorTable.instance(), catalogReader, typeFactory, validatorConf); validator.validate(parseAst).toSqlString(BigQuerySqlDialect.DEFAULT).toString();
得到的输出结果:
SELECT ORDERS.o_orderkey, ORDERS.o_custkey, ORDERS.o_orderstatus, ORDERS.o_totalprice, ORDERS.`o_order date`, ORDERS.o_orderpriority, ORDERS.o_clerk, ORDERS.o_shippriority, ORDERS.o_comment FROM ORDERS AS ORDERS
(注:含空格的列名o_order date使用反引号引用,这部分逻辑合理)
但如果将上述输出的查询字符串用SqlConformanceEnum.BIG_QUERY配置重新解析,会抛出如下错误:
org.apache.calcite.sql.parser.SqlParseException: Lexical error at line 1, column 95. Encountered: "`" (96), after : ""
我尝试修改解析配置,强制设置处理反引号引用的标识符:
SqlParser.Config sqlParserConfig = SqlParser .configBuilder() .setConformance(getConformance(SqlConformanceEnum.BIG_QUERY)) .setQuoting(Quoting.BACK_TICK_BACKSLASH) .build();
调整后得到可用的查询结果:
SELECT ORDERS.o_orderkey AS O_ORDERKEY, ORDERS.o_custkey AS O_CUSTKEY, ORDERS.o_orderstatus AS O_ORDERSTATUS, ORDERS.o_totalprice AS O_TOTALPRICE, ORDERS.`o_order date`, ORDERS.o_orderpriority AS O_ORDERPRIORITY, ORDERS.o_clerk AS O_CLERK, ORDERS.o_shippriority AS O_SHIPPRIORITY, ORDERS.o_comment AS O_COMMENT FROM ORDERS AS ORDERS
现在有两个疑问:
- BigQuery本身使用反引号作为标识符的引用符号,但Calcite的BigQuery默认一致性配置为何采用双引号?
- 循环解析过程中,第一次生成的查询与原始输入不一致,第二次解析后结果才趋于稳定,这种初始不一致的现象原因是什么?
内容的提问来源于stack exchange,提问作者Michael Crampon
相关产品推荐
相关产品推荐

