ClickHouse v25.3.12.8-lts 补丁版发布解析:六大 Bug 修复与稀疏序列化、通配符授权等底层改动详解 📅 发布时间:2026/9/18 3:32:05 👁 浏览次数: ClickHouse v25.3.12.8-lts 补丁版发布解析六大 Bug 修复与稀疏序列化、通配符授权等底层改动详解【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHousev25.3.12.8-lts 是 ClickHouse 官方稳定分支LTS上的一次维护性补丁发布基准版本为 v25.3.11.20-lts。本版聚焦于 6 项用户可见的行为错误修复覆盖 Log 引擎子列读取、列与子列命名冲突、通配符授权校验、JSON 路径类型推断、稀疏序列化变更与数据跳过逻辑另含 1 项日志级别调整。阅读本文后你将了解每个修复的触发场景、根因原理、官方回归跟踪方式以及仓库中对应的实现代码与配置证据可在升级评估和排障时快速定位。版本信息与定位该版本的 changelog 记录于 docs/changelogs/v25.3.12.8-lts.md核心版本信息如下版本号v25.3.12.8-ltscommit58271a59e2d对比基准v25.3.11.20-ltscommit08a3e570d15修复类别全部为Bug Fix用户可见的官方稳定版错误行为外加 1 项NOT FOR CHANGELOG / INSIGNIFICANT级别改动LTS长期支持分支的补丁发布以稳定性优先为原则因此本次变更中没有任何新功能全部是回归修复与行为收敛。每个修复条目都带有官方回溯跟踪号Backported in #…用于定位该修复最初合入的 PR 与原始 issue。Bug Fix 详解1. 修复 Log 引擎读取子列subcolumns时可能的逻辑错误关联 issue[#91710]修复 PR[#91711]作者 Pavel Kruglov表现使用 Log 系列引擎的表在读取子列如map.key、JSON 类型的路径子列时可能触发逻辑错误logical error导致查询失败。从源码看Log 引擎含 TinyLog由 src/Storages/StorageLog.h 中的StorageLog类实现该类明确声明了bool supportsSubcolumns() const override { return true; }即 Log 引擎原生支持子列读取。文件头注释也说明Log 是无索引的简单表引擎数据以压缩形式存储TinyLog 与 Log 的区别在于没有 mark 文件use_marks_file成员见 StorageLog.h 第 163-164 行。读取流程通过createReadingPipe/readImpl与LogSource、LogSink协作完成Mark结构rows offset用于支持多线程按块读取压缩文件。子列读取路径正是在这些按列分文件的机制上叠加的因此当子列对应的数据文件状态与 mark 不一致时就会出现逻辑错误。仓库中存在对应的单元测试 src/Storages/tests/gtest_storage_log.cpp 覆盖 Log 引擎行为。2. 修复列与子列同名冲突导致的错误序列化与查询失败关联 issue[#90219]、[#85161]修复 PR[#92453]作者 Pavel Kruglov表现当表同时存在某个列以及与该列同名的子列subcolumn时可能使用错误的序列化serialization方式进而导致查询失败。该问题与第 1 个修复同属子列机制范畴。ClickHouse 中Nested类型、Map类型的.key/.value、JSON 类型的路径子列都会展开为独立的子列存储。当用户显式定义的列名与自动展开的子列名发生冲突时列与子列的解析顺序、序列化选择逻辑可能被干扰选错序列化器。结合 src/Storages/StorageLog.h 中supportsSubcolumns()返回true可以看出Log 引擎同样会受到该问题影响因此修复同时覆盖了 Log 系列与其他支持子列的表引擎。日常建表时应避免列名与子列展开名冲突例如避免同时存在m列与m.key这类名称。3. 重写通配符授权wildcard GRANT校验逻辑修复 PR[#92725]作者 pufit背景该修复是针对之前一次修复的再修正。前一次提交PR #90928原本是为了修复一个严重安全漏洞但由于校验过严导致某些使用通配符的GRANT语句因为无关的REVOKE而执行失败。本次 PR #92725 重写了通配符授权校验中不正确的逻辑在保留漏洞修复效果的同时恢复了对合理通配符授权语句的兼容。该改动位于访问控制Access模块涉及代码目录 src/Access/。通配符授权常用于批量授予/回收多个表或数据库的权限例如GRANT SELECT ON db.* TO user配合部分REVOKE的场景。升级后如果此前遇到过无关 REVOKE 导致通配符 GRANT 失败的现象本版本即为官方修复版本。4. 修复 JSON 中 path 为 skip 时的类型提示type hint创建关联 issue[#92731]修复 PR[#92842]作者 Pavel Kruglov表现JSON 类型在使用SKIP路径参数即跳过某条路径不解析时创建该路径的类型提示会出错。JSON 类型JSON/Object(json)支持json_path表达式对字段进行投影SKIP表示忽略指定路径。修复前当某条路径被标记为skip时类型提示type hint的创建逻辑存在缺陷可能影响该路径下字段的解析与查询。相关实现位于数据类型与解析模块涉及 src/DataTypes/ 中的 JSON 相关类型与 src/Parsers/ 中的 JSON 路径解析。使用 JSON 列且配置了SKIP path的用户应关注此修复。5. 修复稀疏列变更后 FILE_DOESNT_EXIST 错误修复 PR[#93016]作者 Pavel Kruglov表现通过ALTER将设置ratio_of_defaults_for_sparse_serialization改为1.0后对稀疏列sparse column执行变更mutation时可能报FILE_DOESNT_EXIST错误。该修复涉及的设置定义在 src/Storages/MergeTree/MergeTreeSettings.cppratio_of_defaults_for_sparse_serialization默认值为0.9375表示当列中默认值default 值占比超过 93.75% 时该列采用稀疏序列化sparse serialization存储。设置说明明确取0到1之间的浮点数即可启用稀疏序列化取1.0或更大值则列始终使用普通完整序列化full serialization。稀疏格式的优势在于包含大量默认值的列可被紧凑编码查询时无需完整解压数据即可参与计算从而显著降低磁盘占用并加速查询。system.columns表的data_compressed_bytes/data_uncompressed_bytes可以对比压缩效果system.parts_columns表的serialization_kind列则会显示每个 part 的列使用了Default还是Sparse编码。修复前的场景是表在稀疏编码下写入数据后通过ALTER ... MODIFY SETTING将阈值提升到1.0即禁用稀疏序列化再对该列执行 mutation如ALTER TABLE ... UPDATE变更任务在读取旧数据、写回新 part 时引用了不存在的稀疏数据文件从而抛出FILE_DOESNT_EXIST。修复后稀疏列在阈值变更后的 mutation 流程中能正确解析新旧编码的数据文件。涉及实现包括 src/Storages/MergeTree/MutateTask.cpp、src/Storages/MergeTree/MergeTask.cpp 与 src/Storages/MergeTree/IMergeTreeDataPart.cpp。6. 修复 WHERE 中 NOT materialize(...) 或 NOT CAST(...) 导致的数据跳过data skipping错误结果关联 issue[#88536]修复 PR[#93017]作者 Nihal Z. Miaji表现当WHERE条件中出现NOT materialize(...)或NOT CAST(...)这类被包装的表达式时数据跳过索引逻辑data skipping判断错误导致查询返回错误结果。数据跳过索引如minmax、set、bloom_filter索引通过在粗粒度 granule 级别评估条件来跳过不可能命中的数据块。当条件表达式被materialize、CAST等函数包装后再取反NOT跳过逻辑对表达式含义的推断可能出错误判 granule 不满足条件而被跳过从而返回缺失数据。修复修正了该场景下的可跳过性判定。相关代码集中在 src/Storages/MergeTree/ 的跳过索引评估路径如MergeTreeDataSelectExecutor与跳过索引相关实现以及 src/Interpreters/ 的表达式分析逻辑。如果你在带数据跳过索引的表上使用过NOT materialize(col) ...或NOT CAST(...)形式的查询本版本值得关注。非 Changelog 改动NOT FOR CHANGELOG / INSIGNIFICANT回溯号[#92818]PR[#92810]作者 Konstantin Vedernikov内容调整了某条日志的日志级别Change log level。该改动不会影响任何 SQL 行为仅涉及日志输出的级别调整通常用于降低非关键路径的日志噪音或修正某条日志的误报级别。属于内部质量改进对用户无感知。升级与验证建议确认基线本版本仅面向 25.3 LTS 分支升级前确认当前运行版本为v25.3.x系列跨大版本升级请参考官方升级文档docs/get-started/ 中的部署与升级指引。关注两类用户使用 Log/TinyLog 引擎或 JSON 类型子列读取的用户应优先验证涉及子列的查询修复 1、2、4使用通配符GRANT做批量授权并配合REVOKE的用户建议回归授权脚本修复 3使用稀疏序列化ratio_of_defaults_for_sparse_serialization默认即启用并频繁执行ALTER MODIFY SETTING与 mutation 的用户应回归相关变更任务修复 5在带数据跳过索引的表上使用NOT materialize(...)/NOT CAST(...)条件的查询需回归结果正确性修复 6。验证工具可在升级后利用 tests/queries/ 下的回归测试套件或针对上述场景编写等价查询进行对比验证磁盘占用与序列化方式可分别用system.columns与system.parts_columns观测。可追溯性每个修复条目都携带原始 issue 号与回溯 PR 号Backported in #…在 docs/changelogs/ 目录下按版本归档便于在后续版本中交叉核对相同修复是否已包含。小结v25.3.12.8-lts 是一次典型的 LTS 稳定性补丁没有任何新特性6 项修复全部针对官方稳定版中的用户可见错误行为覆盖存储引擎Log 子列、类型系统JSON/子列命名、安全通配符授权、存储格式稀疏序列化 mutation与查询正确性数据跳过索引五大方向。对于生产环境建议在充分回归上述高危场景后择机升级。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考