Apache Calcite 1.10.0 版本发布解析:`!=` 算子、核心修复与 Druid 适配器时区问题详解

发布时间:2026/10/13 8:06:53
Apache Calcite 1.10.0 版本发布解析:`!=` 算子、核心修复与 Druid 适配器时区问题详解 后端数据库【免费下载链接】calciteApache Calcite项目地址https://gitcode.com/gh_mirrors/ca/calcite点击查看免费下载Apache Calcite 1.10.0 于 2016-10-12 发布是紧随 1.9.0 之后的一个以修复为主的快速迭代版本它对核心引擎和 Druid 适配器集中做了一轮 bug 修复其中最关键的是修复了一个阻碍时区维度在不同时区下被一致处理的重要问题CALCITE-1403。阅读本文后你可以完整掌握 1.10.0 的版本定位、兼容性边界、新增的!不等值算子用法以及每一项核心修复所对应的源码位置便于在升级依赖或排查同类问题时快速定位依据。发布背景紧跟 1.9.0 的修复型版本1.10.0 的官方发布通告发布记录指出该版本紧接着 1.9.0 发布主要内容是核心core与 Druid 适配器的 bug 修复。完整变更清单收录在官方历史文档的 1.10.0 章节中history.md 的#v1-10-0锚点段落按新特性、Bug 修复/API 变更/小增强、站点与文档三个维度组织。兼容性边界该章节同时给出了明确的兼容性说明1.10.0 在 Linux、Mac OS X、Microsoft Windows 上完成测试使用 Oracle JDK 1.7、1.8Guava 版本覆盖 14.0 到 19.0Druid 版本为 0.9.1.1其余软件版本以构建文件当时为pom.xml中的声明为准。在仓库中引用该版本能力时应以这一声明为适用前提不要外推到其他 JDK 或依赖版本。新特性!作为的不等值算子替代1.10.0 唯一的新特性由 CALCITE-1374 提供支持将!作为的等价写法。在此之前Calcite 的 SQL 解析只接受标准 SQL 的写法来表示不等于该修复后a ! b与a b可以互换使用二者在语义上都被归一到同一个不等于比较语义注意这与IS NOT DISTINCT FROM空值安全不等值不是同一个算子——后者仍独立存在于标准算子表中可参见 SqlStdOperatorTable.java 中IS NOT DISTINCT FROM的算子定义约第 427-432 行以及真正的不等于二元算子NOT_EQUALS约第 633 行起的定义。对使用 Babel 方言或自定义 SQL 的用户而言这意味着可以按团队习惯选择!写法而不必改写查询。Bug 修复清单核心部分以下逐项继承自 history.md 的 1.10.0 章节并结合当前仓库源码给出可验证的落点。问题号修复内容源码落点/佐证CALCITE-1378两级列two-level columns在 sql-to-rel 转换时抛出ArrayIndexOutOfBoundsExceptionsql-to-rel 转换逻辑位于 core/src/main/java/org/apache/calcite/sql2relCALCITE-1379展开STAR*时对StructKind.PEEK_FIELDS与StructKind.PEEK_FIELDS_DEFAULT列展开其子字段StructKind 相关类型定义见 StructKind.javaCALCITE-1381克隆 SqlCall 时保留函数限定符quantifier如EXISTS、SOME量词算子见 SqlStdOperatorTable.java 中SqlQuantifyOperator约第 507、528 行CALCITE-1386ITEM算子忽略集合值类型、将结果赋给 Object 变量的问题贡献者 Jungtaek LimSqlItemOperator.javaCALCITE-1394使用CoreMatchers.containsString导致 javadoc 出错属构建/文档工具问题CALCITE-1396isDeterministic只检查了顶层RexCall而未深入子树Rex 表达式工具位于 core/src/main/java/org/apache/calcite/rexCALCITE-1397FilterReduceExpressionsRule中出现ClassCastException优化规则位于 core/src/main/java/org/apache/calcite/rel/rulesCALCITE-1398调整RelFieldTrimmer工具方法的可见性API 变更字段裁剪规则同上 rules 目录CALCITE-1400AggregatePullUpConstantsRule可能错误地调整聚合函数参数下标聚合优化规则同上 rules 目录CALCITE-1420允许 Calcite JDBC Driver 的 minor version 大于 9CalciteJdbc41Factory.java约第 53 行有按 major/minor 版本号创建 JDBC 工厂的说明ITEM算子修复的源码视角CALCITE-1386 修的是取值算子ITEM没有使用集合的元素类型这类类型推断问题。从源码结构看SqlItemOperator.java 中该类通过SqlSingleOperandTypeChecker校验左侧操作数类型并在非ROW类型场景下委托检查器推导结果类型checkOperandTypes约第 97-113 行算子本身在标准算子表中注册为new SqlItemOperator(ITEM, OperandTypes.ARRAY_OR_MAP_OR_VARIANT, 1, true)SqlStdOperatorTable.java 约第 2369 行。该修复保证myArray[3]、myMap[foo]这类下标访问的返回值类型是集合的真实元素类型而不是退化为Object。Bug 修复清单Druid 适配器部分1.10.0 修复了三项与 Druid 直接相关的问题其中 CALCITE-1403 被官方通告单独点名。CALCITE-1403不同时区下时间维度处理不一致重点这是本版本最重要的修复。问题的本质是SQL 中的时间表达式DATE、TIMESTAMP、TIMESTAMP WITH LOCAL TIME ZONE在翻译成 Druid 的时间抽取函数Time extraction function时必须携带正确的时区 ID否则同一时间维度在不同时区下会得到不一致的聚合/过滤结果。当前仓库中对应的转换逻辑位于 TimeExtractionFunction.java 的translateCastToTimeExtract约第 193-241 行可以清楚看到时区是如何被显式区分的final String timeZoneId timeZone null ? null : timeZone.getID(); ... case DATE: case TIMESTAMP: granularityTZId DateTimeUtils.UTC_ZONE.getID(); // 固定按 UTC break; case TIMESTAMP_WITH_LOCAL_TIME_ZONE: granularityTZId timeZoneId; // 使用连接/表的时区 break;也就是说DATE/TIMESTAMP的粒度granularity时区固定为 UTC而TIMESTAMP WITH LOCAL TIME ZONE则取实际时区 ID。此外DruidDateTimeUtils.java约第 379 行附近中也注明对 date/timestamp 类型使用 UTC因为 Druid 需要时区信息。从源码结构看这类显式传递时区的分支正是 CALCITE-1403 之后保证不同时区下时间维度处理一致的实现基础。CALCITE-1392 与 CALCITE-1402CALCITE-1392Druid 默认时间列未被正确识别。Druid 数据源存在默认时间列概念若未识别基于时间的下推与元数据推导都会失效。默认维度/列相关的规格见 DefaultDimensionSpec.java 与 DruidTable.java。CALCITE-1402过滤条件中的列引用位于比较表达式右侧RHS时翻译到 Druid 的过滤串不正确。适配器将 SQL 二元表达式翻译为 Druid 表达式的路径是 BinaryOperatorConversion.java其toDruidExpression按(左 操作符 右)拼装约第 45-64 行修复保证了无论列引用在左侧还是右侧生成的 Druid 过滤条件都正确。CALCITE-1403 的集成测试入口官方通告中提到修复了导致DruidAdapterIT无法运行的问题。当前仓库中该集成测试类位于 DruidAdapterIT.java第 70 行声明public class DruidAdapterIT可作为回归验证 1.10.0 这类时区/过滤翻译问题的入口其配套的适配器实现测试位于 druid/src/test。站点与文档修复CALCITE-1393在 javadoc 中排除org.apache.calcite.benchmarks.generated与org.openjdk.jmh两个包避免生成的基准测试代码进入公共 API 文档。如何查阅本版本及相邻版本的完整变更逐版本变更清单含 1.10.0 全部条目site/_docs/history.md1.10.0 章节锚点为#v1-10-0发布通告正文site/_posts/2016-10-12-release-1.10.0.md若你从 1.9.0 升级到 1.10.0重点核对上文Bug 修复清单中的 API 变更项CALCITE-1398 的RelFieldTrimmer可见性调整它可能影响直接调用这些工具方法的下游代码若你使用 Druid 适配器CALCITE-1403/1402/1392 三项修复直接影响时间维度下推与过滤翻译的正确性建议在跨时区场景下用DruidAdapterIT中的用例做回归验证。小结1.10.0 是一个小而关键的版本一个 SQL 语法层面的新算子!加上一批核心引擎与 Druid 适配器的修复其中最值得记住的是时区一致性问题CALCITE-1403——它让时间维度在DATE、TIMESTAMP与TIMESTAMP WITH LOCAL TIME ZONE三类类型下都能携带正确时区翻译到 Druid。版本边界JDK 1.7/1.8、Guava 14.0–19.0、Druid 0.9.1.1以 history.md 的官方声明为准。赞分享后端数据库【免费下载链接】calciteApache Calcite项目地址https://gitcode.com/gh_mirrors/ca/calcite点击查看免费下载相关推荐Apache Calcite 1.8.0 版本解析SELECT without FROM、conformance 兼容模式与 Elasticsearch/Druid 适配器的落地实现Apache Calcite 1.8.0 版本解析SELECT without FROM、conformance 兼容模式与 Elasticsearch/Dr后端数据库Apache Calcite 1.9.0 发版深度解读Druid 适配器进化、LATERAL TABLE 与规划器规则优化Apache Calcite 1.9.0 发版深度解读Druid 适配器进化、LATERAL TABLE 与规划器规则优化 本文基于 Apache Calci后端数据库Agones 1.10.0 版本发布解析gRPC 分配端点性能修复与升级路径Agones 1.10.0 版本发布解析gRPC 分配端点性能修复与升级路径 本篇围绕 Agones 1.10.0 的发布说明展开聚焦该版本分配提速的核游戏开发云原生上一篇Apache Beam 编写 Dataflow 成本基准测试Cost Benchmark完整指南下一篇从零掌握GyroFlow专业级视频防抖工具实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询