ClickHouse v24.6.4.42-stable 补丁发布解析:16 项 Bug 修复及其源码佐证
2026/9/16 18:47:19 网站建设 项目流程

ClickHouse v24.6.4.42-stable 补丁发布解析:16 项 Bug 修复及其源码佐证

【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse

本文基于 ClickHouse 仓库中 v24.6.4.42-stable 的官方 Changelog,逐项解读这个 24.6 分支补丁版本相对 v24.6.3.95-stable 修复的 16 个用户可见缺陷与 3 项次要变更,并结合仓库源码定位关键修复点(时间窗口函数、Variant 列、SIPHash 系列哈希函数等),帮助运维与开发者评估是否升级、升级后应如何验证。

版本定位与 Changelog 结构

该版本的完整标题为:

ClickHouse release v24.6.4.42-stable (c534bb4b4dd) FIXME as compared to v24.6.3.95-stable (8325c920d11)

从版本号可以读出 ClickHouse 的语义化版本规则:24.6是年份(2024)+ 月份(6 月)组成的分支版本,4是第 4 个补丁,42是补丁构建序号;括号内c534bb4b4dd是本版本对应的 Git 提交短哈希,8325c920d11是其比较基线 v24.6.3.95-stable 的提交哈希。24.6 分支属于稳定分支,后续只接收 backport(回合)的修复,不引入新功能。

本版本文档(v24.6.4.42-stable.md)由两个章节组成:

  • Bug Fix(user-visible misbehavior in an official stable release):正式稳定版中用户可见行为的错误修复,共 16 条;
  • NOT FOR CHANGELOG / INSIGNIFICANT:不影响最终用户、不对外的内部变更,共 3 条。

每一条修复都带有 "Backported in #issue" 前缀和对应的 PR 编号及作者,说明它来自 master 分支的某个修复,被回合(backport)到了 24.6 release 分支。同分支的前后版本(v24.6.3.95-stable.md 与 v24.6.5.30-stable.md)可用于串联该分支的完整修复时间线。

SQL 语义与执行计划类修复

1. 外部数据库查询中的布尔字面量(PR #66282)

修复发往外部数据库(如PostgreSQL引擎)的查询中布尔字面量的翻译问题。ClickHouse 的布尔字面量true/false在跨库查询(postgres()表函数等)下发前需要做方言转换,此前转换逻辑存在缺陷,导致外部库收到的字面量不正确。

2.count()在非确定性谓词下结果错误(PR #67922)

当谓词(WHERE 条件)中包含非确定性函数时,count()可能返回错误结果。这类问题通常与谓词下推、常量折叠时把非确定性函数当作可提前求值的表达式处理有关——修复保证了优化器不再对含非确定性函数的谓词做错误的提前求值或改写。

3. 移除针对含OFFSET子查询的错误排序消除优化(PR #68099,修复 #67906)

优化器原先有一条"移除子查询中排序"的优化,但它没有正确处理子查询中带OFFSET的场景,导致返回的行不符合 LIMIT/OFFSET 语义。本版本直接移除了这条不正确的优化,属于典型的"宁可少优化、不可算错结果"的取舍。

4.indexHint函数边界用例(PR #66286)

indexHint是用于提示存储引擎使用哪个二级索引的函数,该问题由 fuzzer 自动发现,属于输入解析层面的边界修复。

崩溃与稳定性修复(含源码佐证)

5. 时间窗口边界函数空指针解引用(PR #68098)

一个经过特制的查询可以通过hopEndhopStarttumbleEndtumbleStart四个函数触发 NULL 指针解引用并导致服务端崩溃。这四个函数都是时间窗口(滑动窗口/翻滚窗口)的边界计算函数,其实现位于 src/Functions/FunctionsTimeWindow.cpp。从源码结构看,该文件在入口处通过dispatchForIntervalColumns校验 interval 列是否为常量 Int64 且必须为正数,通过executeWindowBound校验第一个参数必须是Tuple(DateTime, DateTime)类型——PR #68098 正是补全了这条校验链上导致空指针访问的分支。这类修复对暴露 HTTP 接口的 ClickHouse 实例尤为重要:修复前,任何能提交查询的用户都可能使进程退出。

6. SIPHash 系列函数对空数组/空元组报LOGICAL_ERROR(PR #68630)

sipHash64KeyedsipHash128KeyedsipHash128ReferenceKeyed作用于空数组([])或空元组(())时,会抛出LOGICAL_ERROR而非按预期返回常量结果。该系列的实现位于 src/Functions/FunctionsHashingMisc.cpp。修复后这些调用退化为对空输入的常量哈希,符合 ClickHouse "向量函数对空容器返回单元素常量列"的常规行为约定。

存储读取与 DDL 校验类修复

7. Variant 子列读取时的PARAMETER_OUT_OF_BOUND误报(PR #66659)

读取 Variant 类型的子列时,可能触发本不该发生的PARAMETER_OUT_OF_BOUND错误。Variant 列的底层实现是 src/Columns/ColumnVariant.cpp,其中insertRangeFrom方法在参数越界时会抛出该错误(见 ColumnVariant.cpp 第 533 行);该 PR 修正了读取 Variant 子列时传入该方法的区间参数计算,消除误报。

8. 非归档文件名/URI 中含::的解析(PR #67433)

文件路径或远端 URI(如 S3 地址)中包含::时,只要它不是归档(archive),现在能被正确解析。此前::是"归档内文件"语法的分隔符,未加甄别地应用于非归档路径会导致读取失败。

9. 新分析器下 mutation 未跳过无关 part(PR #68052)

启用新查询分析器(analyzer)后,mutation(ALTER TABLE ... UPDATE/DELETE类后台重写操作)本应根据谓词跳过不受影响的 part,但实际却把不受影响的 part 也重写了,白白消耗磁盘 IO 和 CPU。修复恢复了"跳过未触及 part"的行为。

10.ALTER ADD/MODIFY COLUMN校验实验性/可疑类型(PR #67911)

现在对 ALTER 新增或修改列时出现的实验性(experimental)或标记为可疑的数据类型会进行显式校验,避免把未成熟类型固化进表结构后引发难以回滚的问题。

接口、集群与副本同步类修复

11. HTTP 接口向流引擎(Kafka/RabbitMQ/NATS)写入(PR #67554)

修复通过 HTTP 接口向 Kafka、RabbitMQ、NATS 这类"流式"(只读消费)引擎执行 INSERT 的问题。这类引擎表是数据源而非数据目标,此前经由 HTTP 接口插入时的行为不正确,修复使其按预期被拒绝或正确处理。

12.cluster()函数与 inter-server secret 的交互(PR #66364)

配置了interserver_credentials(inter-server secret)后,cluster()表函数展开远程查询时对远端节点的认证方式会改变。该修复保留原有行为:以初始用户身份连接远端节点,避免该配置项悄然改变cluster()查询的认证语义。

13.SYSTEM SYNC REPLICA缺少 sync 模式(PR #68326,修复 #68396)

SYSTEM SYNC REPLICA命令用于手动触发 Replicated 表引擎副本追赶最新数据,此前该命令缺少"同步(sync)模式"的支持,现在补齐。

14. PostgreSQL 外部库查询被取消时的崩溃(PR #68288)

当指向外部 PostgreSQL 的查询被取消(客户端断开、超时等)时,ClickHouse 侧对底层 PostgreSQL 库的错误处理存在竞态,可能触发崩溃,本版本尝试修复了该路径。

15. 容器环境下最大线程软限计算错误(PR #67963)

修复了在可用 CPU 数量受限的容器化环境(如设置了cpulimit 的 Docker/K8s Pod)中,计算"最大线程数软限"(max thread soft limit)时未正确读取 cgroup/CPU 配额的问题。此前 ClickHouse 在受限容器内可能按宿主机核数派生线程数,导致过度超卖;修复后线程预算与实际可用 CPU 匹配。

16.ReplaceTableNodeToDummyVisitor遍历未解析的表函数参数(PR #67522,修复 #66026)

优化器改写阶段的ReplaceTableNodeToDummyVisitor会对未解析的表函数参数做遍历,存在越界/误处理风险,该 PR 避免了对这类参数的遍历,消除了相关异常路径。

NOT FOR CHANGELOG:内部变更

以下三项不影响最终用户行为,列出于此以保证变更可追溯:

  • 发布后版本号自增(PR #67909):release 流程由机器人自动完成,属于常规发版动作;
  • ALTER MODIFY SQL SECURITY作用于非视图表时报显式错误(PR #67953):把原先的含糊失败改为明确的报错信息,便于用户发现误用;
  • 补丁发布流程调整(PR #68750):为了支持从 release 分支任意提交直接打补丁版本,package_debug构建不再可跳过,这是发布工程侧的 CI 调整。

升级与验证建议

  • 适用前提:本版本仅包含修复,无新特性,面向需要 24.6 稳定分支的用户;从 v24.6.3.x 升级到 v24.6.4.42 是纯补丁升级,不涉及数据格式不兼容变更。
  • 验证方式:升级后可用clickhouse-server --version或查询SELECT version()确认构建号是否含42;对照括号中的提交短哈希c534bb4b4dd可进一步核对二进制与发布物的对应关系。
  • 重点关注场景:如果你的部署涉及(a)对外的 HTTP 查询接口且使用过hopEnd/tumbleEnd等窗口函数、(b)容器化限 CPU 部署、(c)Replicated 表引擎 + 定期SYSTEM SYNC REPLICA、(d)S3/远端文件路径中带::的读取,本版本的对应修复与你直接相关。
  • 完整时间线:24.6 分支上 v24.6.4.42 之前是 v24.6.3.95-stable.md,之后是 v24.6.5.30-stable.md,三者共同构成该分支从 v24.6.3 到 v24.6.5 的完整修复记录。

【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询