You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:55:33