Apache Calcite 1.39.0 版本全解析:VARIANT/UUID 新类型、DPhyp 连接枚举与检查算术
后端数据库【免费下载链接】calciteApache Calcite项目地址https://gitcode.com/gh_mirrors/ca/calcite点击查看免费下载Apache Calcite 1.39.0 于 2025 年 3 月 16 日发布这是继 1.38.0 之后历时 5 个月积累的版本包含 45 位贡献者的成果并解决了 209 个 issue。本指南基于官方发布公告与完整发布历史结合仓库源码深入解析本版本的五大核心亮点VARIANT与UUID数据类型的引入、检查算术checked arithmetic支持、基于动态规划的 DPhyp 最优连接枚举算法、Arrow 适配器新增运算符与数据类型以及覆盖 Oracle、PostgreSQL、Hive、Spark、MSSQL 等方言的 SQL 兼容性增强。读完本文你将掌握这些新特性的底层实现原理、行为差异与升级注意事项并能在实际查询中直接使用它们。发布概况与版本定位本版本在 1.38.0 之后 5 个月发布共接收 45 位贡献者的代码解决 209 个 issue。从完整发布历史可见除上述五大亮点外还包括 JDBC 适配器的BatchNestedLoopJoin实现、Elasticsearch 适配器的NULLS FIRST/NULLS LAST支持、依赖升级Avatica 1.25.0 → 1.26.0、Cassandra 4.1.6 及驱动 4.18.1以及大量跨方言的 bug 修复。兼容性方面该版本在 Linux、macOS、Microsoft Windows 上测试通过支持 JDK/OpenJDK 8 至 23Guava 21.0 至 33.3.0-jre其余软件版本以仓库根目录 gradle.properties 声明为准。新数据类型VARIANT 与 UUIDVARIANT 动态类型VARIANT是一种动态类型dynamically-typed数据类型其值在运行时才确定具体类型非常适合半结构化数据场景。该类型通过 CALCITE-4918 引入在 SqlTypeName.java 中注册为新的类型枚举并归属于SqlTypeFamily.VARIANT。VARIANT 常见于 Snowflake 等数据仓库产品其典型用法是-- 将任意类型的值存入 VARIANT 列 SELECT CAST({a: 1} AS VARIANT); -- 访问 VARIANT 中的字段 SELECT variant_col[a] FROM t;仓库为其提供了完整的运行时类支撑位于 core/src/main/java/org/apache/calcite/runtime/variant/ 包VariantValueVARIANT 值的抽象基类/接口VariantNonNull非 NULL 的 VARIANT 值支持通过item(Object index)按下标/键访问内部元素VariantNull单例模式的 NULL VARIANT 值INSTANCE常量VariantSqlNull代表 SQL NULL 语义的 VARIANT 值VariantSqlValue提供create(...)工厂方法将普通 SQL 值包装为 VARIANT 值。伴随类型支持本版本还实现了 VARIANT 相关函数TYPEOF与VARIANTNULL前者返回值的动态类型信息后者显式构造 NULL VARIANT 值。在类型系统层面SqlCastFunction、SqlItemOperator下标访问[]、SqlDotOperator字段访问.等运算符均已针对 VARIANT 适配。UUID 原生类型通过 CALCITE-6738Calcite 以原生方式支持UUID类型不再需要将 UUID 存为字符串或 BINARY 后手工转换。UUID类型在 SqlTypeName.java 中注册归属SqlTypeFamily.UUID。运行时方面仓库新增 UuidValue.java该类实现ComparableUuidValue为 UUID 值提供比较排序能力。RelJson也已支持序列化UUID字面量CALCITE-6992 的修复保证 UUID 在计划序列化/反序列化链路中可用。UUID 的引入同时带来两类边界修正体现了类型系统的严谨性CAST 规则收紧CALCITE-6779从UUID到DATE的转换被判定为非法二进制转换修正CALCITE-6777修复了UUID与BINARY之间转换产生错误结果的问题。检查算术Checked ArithmeticSQL 标准语义下整数溢出行为在不同数据库中差异巨大PostgreSQL、BigQuery 会在溢出时抛出异常而 MySQL非严格模式则静默回绕。Calcite 1.39.0 通过 CALCITE-6685 引入SqlConformance.checkedArithmetic()属性来统一控制这一行为并同时在短整型上启用检查算术支持。从 SqlConformance.java 的接口定义可见该属性作为 conformance方言符合度配置的一部分暴露给上层。其具体开关逻辑在 SqlConformanceEnum.java 中实现Override public boolean checkedArithmetic() { switch (this) { case DEFAULT: case LENIENT: case BABEL: case ORACLE_10: case ORACLE_12: case PRAGMATIC_99: case PRESTO: case PRAGMATIC_2003: case STRICT_92: case STRICT_99: case STRICT_2003: case MYSQL_5: default: return false; case BIG_QUERY: case SQL_SERVER_2008: return true; } }即BIG_QUERY与SQL_SERVER_2008两种 conformance 默认启用检查算术与这两种方言溢出即报错的规范一致其余 conformance 保持静默回绕行为。这属于本版本的 Breaking Change——如果你使用BIG_QUERY或SQL_SERVER_2008conformance 且此前依赖溢出回绕行为升级后相关算术表达式将改为抛出溢出异常。该特性同时修复了相关缺陷CALCITE-6706 修复了检查算术在子查询中不生效的问题CALCITE-6721 修复了SqlFunction.checkedDivide的错误实现。DPhyp基于动态规划的最优连接枚举算法连接重排join reorder是查询优化器最核心的课题之一。Calcite 原本通过LoptOptimizeJoinRule使用启发式heuristic算法寻找连接顺序而 1.39.0 通过 CALCITE-6846 引入基于动态规划的 DPhyp 算法用于在合理代价内寻找最优连接顺序。实现结构仓库在core/src/main/java/org/apache/calcite/rel/rules/下新增了完整实现DphypJoinReorderRule.java规则入口通过CoreRules#HYPER_GRAPH_OPTIMIZE注册标注ExperimentalDpHyp.javaDPhyp 动态规划枚举核心HyperEdge.java超边hyper-edge数据结构用于表达多表连接条件LongBitmap.java以 long 位图表示节点子集的高效实现。从 DphypJoinReorderRule.java 的onMatch逻辑可以看到完整流程Override public void onMatch(RelOptRuleCall call) { HyperGraph hyperGraph call.rel(0); RelBuilder relBuilder call.builder(); // enumerate by Dphyp DpHyp dpHyp new DpHyp(hyperGraph, relBuilder, call.getMetadataQuery(), config.bloat()); dpHyp.startEnumerateJoin(); RelNode orderedJoin dpHyp.getBestPlan(); if (orderedJoin null) { return; } call.transformTo(orderedJoin); }规则首先从HyperGraph提取连接图结构随后启动 DPhyp 枚举最终取出代价最优计划并交给优化器。bloat 参数与复杂度控制动态规划枚举的 dpTable 在最坏情况下n 个输入两两相连且任意组合合法规模可达 2^n − 1。为防止组合爆炸规则配置提供了bloat()参数作为 dpTable 增长上限默认值为 127对应 n7 的假设。从 DphypJoinReorderRule.java 的实现看在完全连接的图上超过该上限的枚举空间将被截断从而在枚举完备性与执行时间之间取得平衡。由于该规则标注为Experimental生产环境接入时建议先在测试集上验证枚举质量与耗时。Arrow 适配器增强1.39.0 对 arrow 模块进行了多项增强显著提升 Arrow 列式存储的查询能力新增数据类型支持TIME 类型CALCITE-6760在 ArrowFieldTypeFactory.java 中新增到SqlTypeName.TIME的类型映射DECIMAL 带精度/标度CALCITE-6690ArrowFieldTypeFactory.java 中创建SqlTypeName.DECIMAL时同时传递 precision 与 scale 参数保证十进制精度的精确映射ArrowTranslator.java 在表达式翻译时也针对 DECIMAL 做专门处理相关的过滤器下推增强CALCITE-6684 支持包含 DECIMAL 子表达式的过滤条件下推。新增运算符IS TRUE/IS FALSE运算符CALCITE-6668NOT EQUALS运算符CALCITE-6618IS_UNKNOWN运算符测试用例同步补充。行为修正CALCITE-6637 修复了 Arrow 适配器中 DATE 类型结果被自动转换为 TIMESTAMP 的问题确保日期语义与列式存储类型一致。SQL 兼容性增强跨方言函数扩展本版本在 SQL 函数兼容性上投入巨大覆盖 Oracle、PostgreSQL、Hive、Spark、MSSQL、Presto、Redshift 等多个方言库。这些函数大多定义在 SqlLibraryOperators.java 中按方言库组织注册。Oracle 库CONVERT函数CALCITE-6730字符集转换函数SYSDATE与SYSTIMESTAMPCALCITE-6666返回当前系统日期/时间戳的系统函数。PostgreSQL / Redshift 库SPLIT_PARTCALCITE-6663按分隔符拆分字符串并取指定段行为调整DATEADD、DATEDIFF从 PostgreSQL 库移至 Redshift 库CALCITE-6766使用 PostgreSQL conformance 的用户需注意这两个函数不再可用。Hive / Spark 库本版本对 Hive、Spark 函数库进行了大范围补齐CRC32CALCITE-6821循环冗余校验BINCALCITE-6815十进制转二进制字符串HEXCALCITE-6805十进制转十六进制字符串BASE64/UNBASE64CALCITE-6812Base64 编解码ARRAY_SLICECALCITE-6831数组切片INSTRCALCITE-6689子串位置查找启用已有ARRAY系列函数CALCITE-6844及若干既有函数CALCITE-6800DATE_SUBCALCITE-6612Spark 库日期减法GREATEST、LEAST在 Spark 库中替换为 PostgreSQL 库的实现CALCITE-6664。MSSQL / Presto 库MSSQL 支持%取模运算符CALCITE-6726与CEILING函数CALCITE-6633Presto 方言启用LENGTH/CHAR_LENGTHCALCITE-6643并修正FLOAT→DOUBLE、BINARY→VARBINARY的类型转换CALCITE-6771、CALCITE-6796。通用 SQL 特性DUAL 表查询CALCITE-6678当目标数据库提供 DUAL 时支持FROM DUAL语法无括号 UDF 调用CALCITE-6645当方言的allowNiladicParentheses属性为 false 时支持无参数 UDF 不带括号调用Babel 解析器支持 PostgreSQL 的SET TRANSACTION命令CALCITE-5612。执行引擎与适配器其他改进BatchNestedLoopJoinCALCITE-5409JDBC 适配器新增BatchNestedLoopJoin实现为批处理场景提供嵌套循环连接路径。该特性对无法走 hash join / merge join 的连接条件如不等式连接提供了批量执行方案。Elasticsearch 适配器支持NULLS FIRST/NULLS LAST排序语法CALCITE-4860修复索引间 JOIN 返回空结果的问题CALCITE-6274修复TEXT字段分组失败CALCITE-4954Druid 适配器同步扩展支持更多函数CALCITE-6876并修复NOT IN过滤被错误转换为 DruidIN的问题CALCITE-6867。优化器规则与元数据RelMdUniqueKeys增加唯一键数量上限CALCITE-6704默认 1000防止某些查询模式产生指数级唯一键集合导致崩溃或 OOM——需要调整上限的用户可通过自建RelMdUniqueKeys实例并注册到自定义 metadata provider 实现新增isEmpty元数据用于判断关系表达式是否返回空行CALCITE-6665多项规则修正FilterToCalcRule/ProjectToCalcRule等规则不再转换包含子查询的节点CALCITE-6870、CALCITE-6874、CALCITE-6873RelDecorrelator规则支持配置化CALCITE-6674。Breaking Changes 升级清单升级到 1.39.0 前需要关注以下破坏性变更RelDataTypeFactory#enforceTypeWithNullability新方法CALCITE-6764接口新增方法行为与createTypeWithNullability类似但后者无法创建可空的ROW类型而可空 ROW 类型在多个 SQL 方言中合法。实现该接口的自定义类型工厂需要补充新方法。检查算术启用CALCITE-6685BIG_QUERY与SQL_SERVER_2008conformance 默认启用溢出检查溢出行为从静默回绕变为抛异常。RelMdUniqueKeys结果受限CALCITE-6704唯一键结果集默认上限 1000。Schema 查找 API 弃用CALCITE-6728Schema#getTable(String)、Schema#getTableNames()、Schema#getSubSchema(String)、Schema#getSubSchemaNames(String)被标记为弃用新增查找表与子 schema 的新方法。函数归属调整DATEADD/DATEDIFF移出 PostgreSQL 库CALCITE-6766Spark 库的GREATEST/LEAST更换实现CALCITE-6664。SOME子查询修复CALCITE-4758SOME子查询在SqlNodeList转换为VALUES时结果错误的问题被修复依赖旧行为的计划可能变化。关键 Bug 修复分类速览除上述内容外本版本修复了大量影响正确性的问题按领域分类如下领域代表性修复子查询/相关查询相关子查询与 PROJECT 生成错误计划CALCITE-2295ANY/SOME在相关查询中产生多行CALCITE-6786SOME重写未正确处理 NULLCALCITE-6778类型与类型强制转换可空 ROW 字段访问应为可空CALCITE-6764UNNEST对含可空 ROW 的数组推断错误可空性CALCITE-6813比较类型推导过窄CALCITE-6733ROW类型比较缺少强制转换CALCITE-6735SQL 生成/反解析RelToSqlConverter对UNNEST查询输入生成双重括号CALCITE-6838半连接在UNION中生成无效表别名CALCITE-6833ClickHouse/StarRocks 的IS TRUE/IS FALSE反解析错误CALCITE-6979、CALCITE-6835 相关修复窗口与聚合嵌套窗口聚合抛UnsupportedOperationExceptionCALCITE-6853ROW_NUMBER在 Enumerable 约定下生成非法代码CALCITE-6837窗口缺失常量导致错误优化CALCITE-6632适配器MongoDB 适配器Decimal128/Binary类型ClassCastExceptionCALCITE-6623InnoDB 过滤条件构造错误CALCITE-6614BindableTableScan未计入下推过滤的行数估计CALCITE-6615构建与测试、文档同步更新测试套件方面Arrow 适配器测试被重构CALCITE-6635、MongoDB 适配器新增 JOIN 测试CALCITE-6856、MockTable支持多键CALCITE-6724并补充了IS_UNKNOWN运算符测试与TRIM函数 Hsqldb 单测。站点文档同步更新了 Elasticsearch 适配器教程CALCITE-6758并将官网背景代码示例与图片、字体改为自托管CALCITE-6845、CALCITE-6843同时新增 CI 动作确保站点可构建性CALCITE-6806。结语Apache Calcite 1.39.0 是一个类型系统 优化器 方言兼容三线并进的版本VARIANT/UUID补齐了现代半结构化数据的类型底座检查算术让语义行为向 BigQuery、SQL Server 对齐DPhyp 为连接重排提供了从启发式到最优枚举的进阶路径Arrow 适配器的 TIME/DECIMAL 与逻辑运算符支持则进一步夯实了列式处理能力。对于将 Calcite 嵌入数据中台、或作为 SQL 层驱动多数据源的开发者本版本尤其值得评估升级——建议重点验证上述 Breaking Changes 对现有查询计划与自定义类型工厂的影响。赞分享后端数据库【免费下载链接】calciteApache Calcite项目地址https://gitcode.com/gh_mirrors/ca/calcite点击查看免费下载相关推荐Apache Calcite 1.41.0 版本全解析UNSIGNED 类型、DPhyp 连接重排、函数依赖元数据与位运算新特性Apache Calcite 1.41.0 版本全解析UNSIGNED 类型、DPhyp 连接重排、函数依赖元数据与位运算新特性 Apache Calcite后端数据库Apache Calcite 1.21.0 版本全解析隐式类型转换、MATCH_RECOGNIZE 与 Enumerable 新连接算法Apache Calcite 1.21.0 版本全解析隐式类型转换、MATCH_RECOGNIZE 与 Enumerable 新连接算法 导读 本文围绕 Ap后端数据库Synology硬盘兼容性突破5步解锁第三方硬盘的完全指南Synology硬盘兼容性突破5步解锁第三方硬盘的完全指南 Synology_HDD_db是一个专门为群晖NAS设计的硬盘兼容性数据库修改工具能够让你在群晖运维存储CLI上一篇DeepLabCut 安装实战指南从 GitHub 源码直装、Ubuntu GPU 环境搭建到常见故障排查下一篇微信聊天记录永久保存如何三步备份你的数字记忆创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考