ClickHouse v22.10.3.27-stable 点版本解析:从 Changelog 到源码,看懂 22.10 分支的关键修复 📅 发布时间:2026/9/13 9:02:15 👁 浏览次数: ClickHouse v22.10.3.27-stable 点版本解析从 Changelog 到源码看懂 22.10 分支的关键修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文以 docs/changelogs/archive/v22.10.3.27-stable.md 这份 22.10 分支的点版本point releaseChangelog 为主线逐条解读其中的 1 项改进、2 项构建/打包改进、6 项用户可见 Bug 修复以及 4 项NOT FOR CHANGELOG内部改动。读完后你不仅知道修了什么还能结合仓库源码理解lowerUTF8/upperUTF8等修复的底层实现位置、RPM 打包文件的演进以及 ClickHouse Changelog 中 Backported in #xxx 条目的含义。一、这个版本在 22.10 分支中的位置Changelog 标题行本身就是一条重要的版本对照信息ClickHouse release v22.10.3.27-stable (6d3b2985724) FIXME as compared to v22.10.2.11-stable (d2bfcaba002)它说明了三点这是一个stable 点版本由 v22.10.2.11-stable 增量对比生成对比基线的 commit 是d2bfcaba002本版本对应6d3b2985724版本号的第四位27表示这是在 22.10.3 分支上累计的 27 个提交/改动计数ClickHouse 的点版本号用于精确区分同一 stable 分支上的多次发布所有条目都以 Backported in #xxx 开头说明这些改动最初是提交到 master 分支的随后被**回合backport**到 22.10 维护分支——这是 ClickHouse 典型的点版本发布方式master 修复 bug再由发布流程挑选需要紧急修复的 PR 回合进 stable 分支重新打包。从 docs/changelogs/ 目录结构看ClickHouse 将 changelog 按年份目录 归档archive组织每个 stable 版本一个独立 Markdown 文件例如归档目录中的 v20.10.3.30-stable.md、v20.12.8.5-stable.md这种一版本一文件的粒度使得每条修复都可以被精确检索和引用。二、Improvement时区数据更新到 tzdata 2022f本次唯一的 Improvement 条目是把 tzdata时区数据库更新到2022f来自 PR #42796由 #42842 回合。条目原文给出了这次 tzdata 更新的具体语义墨西哥除与美国接壤的边境地区外不再执行夏令时DST**奇瓦瓦州Chihuahua**自 2022-10-30 起全年使用 UTC-6斐济不再执行 DST。对分析型数据库而言时区数据不是锦上添花的附加库toTimeZone()、now()、DateTime类型的所有显示与比较、基于时间分区的裁剪partition pruning都依赖它。一次政策性的时区变更如墨西哥废止 DST如果数据库内的 tzdata 过期跨时区报表、按小时聚合的指标都会产生看起来没错但时间戳差了一小时的隐蔽错误。从仓库结构看ClickHouse 将时区实现以第三方依赖的形式内置在 contrib 目录中构建侧对应 contrib/cctz-cmake/CMakeLists.txt源码来自 Google 的 cctz 库contrib/cctz 子模块目录tzdata 更新通常伴随 cctz 及其内嵌时区数据一起升级。这意味着升级 tzdata 属于编译期变更——必须重新部署二进制才能在服务器上生效而不是改配置即可。三、Build/Testing/PackagingRPM 打包与发布流程3.1 修复 RPM 升级时覆盖用户配置的问题PR #42936这条改动对用户直接可感知Before the fix, the user-defined config was preserved by RPM in$file.rpmsave. The PR fixes it and wont replace the users files from packages.背景是 RPM 对标记为%config的文件的处理规则当包内文件与磁盘上的版本不一致时默认行为是保留用户修改的文件、把包内的版本存为xxx.rpmnew而某些配置下用户修改的文件会被挪到xxx.rpmsave。修复前的行为会让用户在升级 ClickHouse RPM 包后发现自己的config.xml被挪走、需要手工从.rpmsave文件恢复——这在实际运维中是一个典型的升级事故。修复后包安装/升级流程不再用包内文件替换用户文件用户自定义配置得以原位保留。该行为落在仓库的打包层packages/ 目录包含各组件的 RPM spec 定义与安装钩子例如 packages/clickhouse-server.yaml、packages/clickhouse-server.postinstall、packages/clickhouse-keeper.postinstall以及 packages/clickhouse-server.service 等 systemd 单元。排查打包相关问题时从这些文件入手即可定位包到底往磁盘上放了什么、覆盖了什么。3.2 CI 增加发布就绪标记并限制发布脚本入口PR #43017Add a CI step to mark commits as ready for release; soft-forbid launching a release script from branches but master.这条是发布流程治理一方面在 CI 中增加一步给可发布的提交打上 ready-for-release 标记另一方面软禁止soft-forbid从 master 以外的分支直接启动发布脚本防止从 feature 分支误发版本。发布脚本对应的仓库代码位于 ci/jobs/release_job.py同目录下的 ci/jobs/ 还包含auto_release_job.py、changelog_nightly.py等与 changelog 生成和自动发布相关的任务——本文件这类 v22.10.3.27-stable.md 正是这条自动化链路nightly changelog 生成 手动/自动发布的产物之一。四、Bug Fixes六条用户可见修复逐条解析4.1lowerUTF8()/upperUTF8()的 16 字节边界错误PR #42812这是本版本中最值得展开的一条Fix lowerUTF8()/upperUTF8() in case of symbol was in between 16-byte boundary (very frequent case of you have strings 16 bytes long).问题机理lowerUTF8/upperUTF8的加速实现采用 SIMD 向量化处理以16 字节为一个处理块。当待转换的符号尤其是多字节 UTF-8 字符恰好跨在 16 字节块的边界上时边界两侧的处理逻辑会错误地处理该字节导致长字符串16 字节条目中特别指出这是非常常见的情况转换结果不正确。当前仓库的实现结构该函数的实现位于 src/Functions/LowerUpperUTF8Impl.h。从源码结构看当前版本采用了清晰的快慢双路径设计先调用isAllASCII()判断整列数据是否全为 ASCII是则走LowerUpperImpl...::vector()的 ASCII 快速路径第 43–48 行完全不触碰 Unicode 逻辑非 ASCII 数据则逐行调用 ICU 的ucasemap_utf8ToLower/ucasemap_utf8ToUpper做完整 case mapping并处理了U_BUFFER_OVERFLOW_ERROR的重试扩容第 108–132 行由于 ICU API 以int32_t表示缓冲区长度代码中还显式拦截了最坏情况下 case-mapping 输出可能超过 2 GiB 的输入第 75–81 行超出则抛出BAD_ARGUMENTS而非让重试路径拿到溢出后的长度破坏输出缓冲区。回归测试证据仓库中保留了针对 UTF-8 转换边界问题的测试用例 tests/queries/0_stateless/00761_lower_utf8_bug.sql期望输出见 00761_lower_utf8_bug.reference其内容是对单个非法/边界字节\xF0做lowerUTF8的自比较更完整的边界覆盖在 tests/queries/0_stateless/00170_lower_upper_utf8.sql 及其同名 reference 文件中另有00170_lower_upper_utf8_memleak.sh专门验证 ICU 路径的内存释放。这些用例正是SIMD 块边界 非 ASCII 字符这类回归的守门员。4.2 修复取消查询时的罕见挂起PR #42874Fix rare possible hung on query cancellation.查询取消用户CtrlC或KILL QUERY在 ClickHouse 中通过任务Task间的取消信号传播实现。罕见挂起意味着存在一个小概率的时序窗口取消信号到达时某个线程已越过检查点导致任务无法在有限时间内退出。这类修复的价值在于稳定性分布式查询中一个节点上的悬挂任务会一直占用连接与内存放大为集群上莫名有查询永远不结束的表象。条目未展开内部细节从 Changelog 层面可以确认它属于并发同步路径上的修复回合自 #43173。4.3 修复 projection 不可用时偶发的NOT_FOUND_COLUMN_IN_BLOCKPR #42938Fix rare NOT_FOUND_COLUMN_IN_BLOCK error when projection is possible to use but there is no projection available. This fixes #42771. The bug was introduced in #25563.这条是典型的回归修复且 Changelog 明确标注了引入来源#25563。语义拆解PROJECTION是 MergeTree 族引擎的二级索引结构允许为同一表保存按不同列排序的数据副本查询规划阶段若判断该查询可以用 projection会切换到 projection 的读取路径但如果实际执行时 projection 不可用例如尚未物化完毕、存储引擎不支持等旧代码未回退到正常读取路径而是直接以 projection 路径去取列于是抛出NOT_FOUND_COLUMN_IN_BLOCK错误。修复点就是补上可能用 projection 但实际没有可用 projection这个分支的判空回退逻辑。对使用 projection 功能的用户升级该版本即可消除这一偶发报错。4.4 修复 Lambda 表达式解析PR #42979Fix lambda parsing. Closes #41848.Lambda 表达式如x - x 1广泛用于arrayMap、arrayFilter等数组函数。此类解析器回归通常表现为某类合法 lambda 被拒绝、或与相邻运算符如-附近的比较符号、负号产生歧义解析。修复位于 SQL 词法/语法层仓库中对应 src/Parsers/ 目录下的解析器代码升级后此前误报的语法错误消失。4.5 修复多处 buffer over-readPR #43159Fix several buffer over-reads.越界读over-read在 C 项目中属于未定义行为轻则被 AddressSanitizer/UBSan 报告ClickHouse 的 CI 中有专门的 UBSan 测试见 tests/ubsan_ignorelist.txt重则泄露相邻内存中的字节内容或被编译器利用做错误优化。一次 PR 修复several处说明这是同一轮内存安全审计的集中清理属于防御性修复——不改变任何正常输入下的行为但消除了潜在的安全与正确性风险面。4.6 修复 Merge 引擎上SAMPLE BY PREWHERE 优化的问题PR #43315Fixed queries withSAMPLE BYwith prewhere optimization on tables usingMergeengine.三个概念的组合是这个 bug 的触发条件SAMPLE BY对带SAMPLE BY键的表做随机抽样读取通常服务于 MergeTree 系引擎PREWHERE 优化ClickHouse 把过滤性强的条件提前到列读取之前执行以减少 IOMerge引擎只是把多个子表视图化合并没有采样键这一概念。问题在于PREWHERE 优化路径在为Merge引擎表改写/执行SAMPLE BY查询时未按引擎能力降级处理导致结果错误或查询失败。修复使优化器在Merge引擎上正确绕过不成立的采样路径。对同时使用Merge引擎与SAMPLE BY语法的用户这是直接影响查询正确性的修复。五、NOT FOR CHANGELOG 区段四条不面向用户的改动ClickHouse Changelog 中的 NOT FOR CHANGELOG / INSIGNIFICANT 段落专门收录不对用户行为产生可观测影响的改动通常不会同步到面向用户的 release notes。本版本包含四条改动PR性质Fix a bug in CAST function parser#42980内部解析器修正正常输入下无行为变化Fix TSan errors (correctly ignore _exit interception)#43009ThreadSanitizer 报告抑制纯测试基建Update SECURITY.md on new stable tags#43365发布流程自动化打新 stable 标签时同步更新 SECURITY.md 中的受支持版本声明Use all parameters with prefixes from ssm#43467CI 从 AWS SSM 读取带前缀的全部参数属于内部基础设施这一区段的存在本身也说明了 ClickHouse 版本记录的惯例把用户需要知道的行为变化与维护者需要留痕的内部改动显式分离。阅读任意一个 stable 版本时前者是升级决策依据后者可忽略。六、如何基于这份 Changelog 做升级决策结合本文条目可以给出一条可操作的解读清单看分类Bug Fix (user-visible misbehavior in official stable release)是唯一直接影响是否要升级的区段Improvement关注功能与数据正确性如 tzdataBuild/Testing/Packaging关注部署方式RPM 用户应重点看 3.1 节看触发条件本版本中只有满足长字符串 UTF-8 大小写转换4.1、使用 projection4.3、Merge 引擎 SAMPLE BY PREWHERE4.6等特定条件的用户才会受对应 bug 影响其余条目属于稳定性加固看回合标记Backported in #xxx 提示该修复同时存在于 master若你跟进 master 构建prestable无需额外动作若锁定 22.10 分支则升级到 v22.10.3.27-stable 即可获得全部上述修复看时区数据如果你的业务涉及墨西哥或斐济时区且对跨 2022-10 的 DST 变化敏感那么这条 tzdata 2022f 的 Improvement 应当作为升级的直接理由。最后需要说明适用前提本文以 22.10 分支的这份归档 changelog 为准其中当前仓库源码部分如LowerUpperUTF8Impl.h的 ICU 双路径实现、INT32_MAX 防护反映的是仓库 HEAD 的较新版本状态用于帮助理解修复所涉及模块的演进脉络v22.10 当时的具体代码形态以对应 tag 为准。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考