ClickHouse v23.10.6.60-stable 更新详解:22 项 Bug 修复与源码定位
ClickHouse v23.10.6.60-stable 更新详解22 项 Bug 修复与源码定位【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于当前仓库中的版本更新日志 v23.10.6.60-stable.md逐项解读 ClickHouse v23.10.6.60-stable对照 v23.10.5.20-stable这一稳定补丁版本的全部变更22 项 Bug 修复、2 项功能改进与 1 项构建修复。文中每一项变更都尽量回溯到仓库中的源码实现位置如 src/Interpreters/、src/Functions/、src/Storages/MergeTree/帮助你在升级到该版本前评估其对 Nested 类型、ALTER 语句、投影Projection、物化变更Mutation、JSON 格式解析与复制表监控等具体场景的实际影响。版本概览版本标识v23.10.6.60-stable构建 commit68907bbe643对照基线v23.10.5.20-stablecommite84001e5c61变更构成Improvement 2 项、Build/Testing/Packaging 1 项、Bug Fix 22 项、内部/无分类变更若干发布性质v23.10 系列稳定分支上的补丁版本patch release按惯例仅包含 bug 修复、回移backport修复与工程化改进不包含新功能的默认行为变更作为运维或开发者的判断基准如果你运行的是 v23.10.5.x本版本属于可放心跟进的稳定性补丁尤其涉及 Nested 建表、复制表监控、Kafka 消费者状态表的用户下文相关条目与你的线上行为直接相关。改进Improvement回移修复transfer query 生成 MySQL 兼容语句回移自上游 #58493将 transfer query数据转移查询改写为 MySQL 兼容的查询形式修复上游问题 #57253、#52654、#56729对应 PR #56456作者 flynn。该修复影响 ClickHouse 与 MySQL 之间的数据交换路径在执行跨系统数据转移例如通过 transfer 相关流程向 MySQL 导出时原本生成的 SQL 可能不符合 MySQL 语法约定导致执行失败修复后语句在 MySQL 侧可正常解析执行。回移修复获取 PostgreSQL 表结构时空数组导致 SIGABRT回移自上游 #57659处理通过 PostgreSQL 外部表获取表结构table structure时遇到空数组触发的SIGABRT崩溃对应 PR #57618作者 Mike Kot。这是一次典型的外部目录解析健壮性修复当外部 PostgreSQL 表中存在空数组字段时元数据解析路径此前会因断言失败而中止进程。修复后该路径降级为正常处理不再导致服务崩溃。Bug 修复Schema 与 ALTER 操作仅当 flatten_nested1 时才展平真正的 Nested 类型修复此前flatten_nested设置会无差别地展平所有Array(Tuple(...))列本版本修正为只展平真正的Nested类型列PR #56132作者 Kruglov Pavel。这是本版本中值得重点理解的一项修复。flatten_nested是会话/服务器级设置在源码中定义于 src/Core/Settings.cpp约 L5780 起默认值为true取1默认Nested列被展平为若干独立的数组列例如n Nested(a UInt32, b UInt32)变为n.a Array(UInt32)、n.b Array(UInt32)取0Nested列保持单个数组元组的形态且可以表示任意层级的嵌套结构。设置文档内嵌于 Settings 源码给出了示例SET flatten_nested 1; CREATE TABLE t_nest (n Nested(a UInt32, b UInt32)) ENGINE MergeTree ORDER BY tuple(); SHOW CREATE TABLE t_nest; -- 结果n.a Array(UInt32), n.b Array(UInt32)SET flatten_nested 0; CREATE TABLE t_nest (n Nested(a UInt32, b UInt32)) ENGINE MergeTree ORDER BY tuple(); SHOW CREATE TABLE t_nest; -- 结果n Nested(a UInt32, b UInt32)展平的实现工具集中在 src/DataTypes/NestedUtils.cpp 与 src/DataTypes/NestedUtils.h建表时的类型转换逻辑位于 src/Interpreters/InterpreterCreateQuery.cpp。修复前的行为意味着一张包含普通Array(Tuple)列的表在flatten_nested1默认值下可能被误当成 Nested 结构展平从而改变表结构与查询语义修复后是不是真正的 Nested 类型成为展平的唯一判据普通Array(Tuple)列不再受该设置影响。修复 ALTER COLUMN ... ALIAS修复带ALIAS的ALTER COLUMN操作PR #56493作者 Nikolay Degterinsky。ALIAS列是 ClickHouse 的虚拟列机制不落盘、查询时按表达式求值。此前对已有列执行ALTER COLUMN ... ALIAS的路径存在缺陷本版本修复了该 DDL 路径。相关 DDL 解释器逻辑位于 src/Interpreters/ 目录下的 Alter 解释器实现。阻止对投影列的不兼容 ALTER防止对投影projection列执行不兼容的ALTER变更PR #56948作者 Amos Bird。投影是 MergeTree 的预聚合/预物化视图机制投影列的存储布局与主表数据耦合。对投影列执行与既有物化结构不兼容的ALTER例如改类型、改聚合函数形态会导致投影数据与实际数据无法对应。本版本在变更入口增加校验直接拦截这类不兼容操作避免产生静默的元数据不一致。Bug 修复查询执行与优化修复部分物化普通投影导致的错误 JOIN 计划修复在存在部分物化的普通投影时生成的错误 JOIN 执行计划PR #57196作者 Amos Bird。部分物化指投影文件在后台物化过程中只覆盖了部分数据分区。规划器在评估能否使用投影回答 JOIN 时若未正确区分投影完整与投影仅部分可用会生成错误的执行计划例如错误地跳过主数据扫描。本版本修正了该判断逻辑确保部分物化场景下 JOIN 计划仍然正确。LIMIT-only 查询禁用 MergeTreePrefetchedReadPool对仅含LIMIT的查询禁用MergeTreePrefetchedReadPool预取读池PR #58505作者 Maksim Kita。预取读池通过多线程批量预取数据块来优化大范围扫描但对扫描行数极少、只取前 N 行的 LIMIT 类查询而言多预取线程的启动开销反而大于收益甚至可能放大尾延迟。本版本识别这类查询并绕过预取池走低开销的读取路径。Bug 修复MergeTree 存储、物化变更与复制含 Nullable MATERIALIZED 列的表 ALTER UPDATE 段错误修复含Nullable类型MATERIALIZED列的表执行ALTER UPDATEmutation后的段错误PR #57147作者 Nikolay Degterinsky。MATERIALIZED列在 mutation 重写数据块时需要按表达式重新求值并填充Nullable包装增加了额外的空值指针层。此前该组合在 mutation 数据流中触发了内存越界访问。这是数据变更mutation路径上的崩溃类修复涉及 src/Storages/MergeTree/ 下的 mutation 执行实现。后台合并正确复用缓存中的临时数据存储后台合并background merge现在正确地在缓存中使用临时数据存储PR #57275作者 vdimir。在写盘路径挂缓存如cache_disk的部署形态下merge 过程中产生的中间数据块需要落在缓存管理的临时存储内而不能直接落到缓存背后的慢速原始介质。本版本修复了后台 merge 任务在此场景下的落盘路径保证临时数据的生命周期由缓存统一管理。Mutation 复用源数据分区的索引粒度MergeTree 的 mutation 结果分区复用源分区的索引粒度index granularity设置PR #57352作者 Maksim Kita。索引粒度index_granularity默认 8192 行一个主键索引标记决定了标记文件的密度与查询跳过能力。此前 mutation 重写出的分区可能使用默认粒度而非源分区粒度造成同一表内不同分区索引密度不一致影响查询跳过效率与空间占用。本版本使 mutation 结果继承源分区的粒度配置。修复删除含损坏 detached 分区副本后 Blob 丢失修复在删除带有 broken detached parts 的副本后出现 blob 丢失的问题PR #58333作者 Alexander Tokmakov。该项涉及共享存储Shared MergeTree 一类场景中的对象blob引用生命周期删除副本时若其目录下存在无法读取的 detached 分区清理逻辑此前可能误删仍被其他副本引用的远端对象。修复后清理流程对损坏 detached 分区做了隔离处理不再级联丢失共享对象。Bug 修复函数与格式解析修复 jsonMergePatch 对部分常量列的处理修复jsonMergePatch函数在输入包含部分常量列partially const columns时的错误行为PR #57379作者 Nikolay Degterinsky。jsonMergePatch实现于 src/Functions/jsonMergePatch.cpp函数注册名JSONMergePatch别名jsonMergePatch。向量引擎中常量列是特殊的单值物化优化形态当两路 JSON 列一路为常量、一路为普通列时逐元素 patch 逻辑此前会取错指针或索引。该函数是 JSON PatchRFC 7396 风格 merge patch的数据库化入口修复后在混合常量/非常量列上行为正确。JSONCompactEachRow 并行解析先移除、后修复的两次迭代移除先移除了JSONCompactEachRow格式的并行解析PR #58181作者 Alexey Milovidov修复随后修复了该格式的并行解析实现并重新启用PR #58250作者 Kruglov Pavel。这一先禁用、后修复的组合值得注意说明并行解析路径存在缺陷可能与共享读缓冲区竞争有关见下一条修复团队选择以最小风险先回退为串行解析保证正确性再提交修复版本。最终态是修复后的并行解析。修复 StreamingFormatExecutor 中读缓冲区的使用修复流式格式执行器StreamingFormatExecutor中读缓冲区read buffers的工作方式PR #57438作者 Kruglov Pavel。流式格式执行器支撑了客户端直读 MergeTree 数据文件等旁路查询路径绕过常规查询流水线。该路径与常规读路径共享底层读缓冲区缓冲区状态位置、剩余量在两条路径间切换时若未正确管理会读到越界或错位的字节。本版本修复了该缓冲区管理问题。Bug 修复系统命令、访问控制与安全正确解析 SYSTEM STOP LISTEN TCP SECURE修复SYSTEM STOP LISTEN TCP SECURE系统命令的解析错误PR #57483作者 joelynch。该命令用于停止监听安全的 TCP 端口例如故障排查时临时关停加密接入。此前由于子命令关键词组合的解析缺陷命令无法被正确识别执行。系统命令的解析与执行逻辑位于 src/Interpreters/InterpreterSystemQuery.cpp 等文件。管理副本化访问实体时忽略 GRANT/REVOKE 的 ON CLUSTER 子句对用于管理副本化访问实体replicated access entities的GRANT/REVOKE查询忽略其ON CLUSTER子句PR #57538作者 MikhailBurdukov。ClickHouse 支持将用户、角色、权限定义本身放到 Keeper/ZooKeeper 上做多副本一致管理replicated access management。这类语句的一致性由副本机制保证ON CLUSTER广播反而是冗余且可能引发歧义的本版本在解析阶段对这类语句明确忽略该子句。默认关闭 system.kafka_consumers因潜在内存泄漏出于潜在的常驻内存泄漏live memory leak考虑默认禁用system.kafka_consumers表PR #57822作者 Azat Khuzhin。system.kafka_consumers是监控 Kafka 引擎消费者进度的系统表读取时需要实时查询各 Kafka 消费任务状态。此前该表存在内存持续增长的风险因此本版本将其默认关闭需要显式开启才可见属于先止血的保守处理。受 Kafka 引擎消费监控依赖该表的告警/巡检逻辑需要相应调整。修复 BLAKE3Rust 实现的非法内存访问修复 BLAKE3 哈希函数 Rust 实现中的非法内存访问PR #57876作者 Raúl Marín。ClickHouse 的 BLAKE3 计算路径由 Rust 组件实现见 rust/ 工作区及 contrib/ 中的 Rust 依赖管理C 侧通过边界层调用。非法内存访问类修复属于内存安全加固消除潜在的越界读写风险。CREATE INDEX 中函数名规范化在CREATE INDEX表内二级索引中规范化函数名PR #57906作者 Alexander Tokmakov。索引表达式中的函数此前可能存在大小写/别名不一致导致的存储形态问题本版本统一规范化函数名保证同一索引函数在不同写法下得到一致的存储与查询展开形态。修复 Keeper 上的非法预处理preprocessing修复在 Keeper 上执行时的非法查询预处理问题PR #58069作者 Antonio Andelic。当 ClickHouse 以 KeeperRaft 一致性存储见 programs/keeper/、src/Coordination/作为依赖运行相关组件时部分查询在预处理阶段走了错误的展开路径。本版本修正了 Keeper 场景下的预处理行为。修复 Poco::UTF32Encoding 中的整型溢出修复第三方库 Poco 的Poco::UTF32Encoding中的整型溢出PR #58073作者 Andrey Fedotov。Poco 是仓库内置的 C 基础库源码位于 base/poco/含 Foundation、Net、XML 等模块。UTF32 编码转换中的整型溢出属于输入边界未校验问题在极端编码输入下可导致越界计算。该修复直接落在仓库内置的 Poco 副本上随 ClickHouse 整体发布。可观测性修复ReadonlyReplica 指标修复所有场景下ReadonlyReplica指标的统计正确性PR #57267作者 Antonio Andelic。ReadonlyReplica是衡量当前有多少复制表副本处于只读状态的关键监控指标基于CurrentMetrics实现。从源码结构看指标的加/减操作分布在 src/Storages/StorageReplicatedMergeTree.cpp如 L5950 的CurrentMetrics::add、src/Storages/MergeTree/ReplicatedMergeTreeAttachThread.cppL94/L104 的加/减与 src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cppL118/L428/L436等多条线程路径上。只读副本的进入/退出涉及 attach 线程、restart 线程、存储主逻辑等多个入口任一入口漏加或漏减都会使指标漂移。本版本统一修复了各路径的配对关系使system.metrics中的该值在所有状态下与实际只读副本数一致——这对基于该指标触发告警的高可用部署尤为重要。构建 / 测试 / 打包与内部变更修复 Docker 官方镜像构建问题回移自上游 #57586修复在 Docker 官方镜像official-images审查中被发现的构建问题PR #57571作者 Mikhail f. Shiryaev。该项保证v23.10.6.60标签的官方 Docker 镜像能顺利通过构建与推送流程仓库中的构建与镜像相关脚本参见 docker/ 目录。内部/对最终用户无影响的变更NOT FOR CHANGELOG / NO CL CATEGORY以下变更属于 CI、工具链与测试基础设施不改变产品行为此处按原日志完整保留回移自上游 #57916无分类变更PR #57909作者 Alexey Milovidov固定pin集成测试辅助容器的 alpine 版本PR #57669作者 Mikhail f. Shiryaev移除较重的 rust stable 工具链PR #57905作者 Mikhail f. Shiryaev修复集成测试使用的 Docker 镜像修复 CIPR #57952作者 Azat Khuzhin修复test_user_valid_until测试PR #58409作者 Nikolay Degterinsky。升级评估建议常规跟进本版本是 v23.10 稳定分支上的补丁变更以修复为主无默认行为破坏性变更运行 v23.10.5.x 的集群可以按常规流程滚动升级。重点核对项如果你的工作负载涉及以下场景建议逐项确认使用Nested建表、且表中含Array(Tuple)列 → 对照本文flatten_nested一节修复后建表结果更符合设置语义依赖system.metrics中ReadonlyReplica做告警 → 修复后指标更准注意升级前后基线可能变化使用system.kafka_consumers监控 Kafka 消费 → 本版本默认禁用需评估告警链路依赖JSONCompactEachRow高并发导入 → 最终态为修复后的并行解析性能应恢复到预期水平使用投影projection JOIN 的工作负载 → 升级前建议用生产查询抽样回归验证计划。验证方式升级后可通过SELECT version()确认版本为23.10.6.60并对照 docs/changelogs/ 目录中相邻版本日志核对变更集。附变更条目与源码位置对照变更主题上游 PR本仓库可对照的源码位置flatten_nested 展平逻辑#56132src/Core/Settings.cpp、src/DataTypes/NestedUtils.cpp、src/Interpreters/InterpreterCreateQuery.cppALTER COLUMN ALIAS / 投影列 ALTER#56493、#56948src/Interpreters/、src/Storages/MergeTree/Nullable MATERIALIZED mutation 段错误#57147src/Storages/MergeTree/ReadonlyReplica 指标#57267src/Storages/StorageReplicatedMergeTree.cpp、src/Storages/MergeTree/ReplicatedMergeTreeRestartingThread.cpp后台 merge 临时存储缓存#57275src/Storages/MergeTree/、src/Disks/mutation 索引粒度复用#57352src/Storages/MergeTree/jsonMergePatch 常量列修复#57379src/Functions/jsonMergePatch.cppJSONCompactEachRow 并行解析#58181、#58250src/Formats/StreamingFormatExecutor 读缓冲区#57438src/Formats/、src/IO/SYSTEM STOP LISTEN TCP SECURE#57483src/Interpreters/InterpreterSystemQuery.cppGRANT/REVOKE ON CLUSTER 忽略#57538src/Access/、src/Interpreters/system.kafka_consumers 默认关闭#57822src/Storages/System/BLAKE3Rust非法内存访问#57876rust/ 工作区Poco::UTF32Encoding 整型溢出#58073base/poco/Keeper 非法预处理#58069src/Coordination/完整变更日志原文见 v23.10.6.60-stable.md相邻版本的日志可在 docs/changelogs/ 与 docs/changelogs/archive/ 目录中按版本号查阅。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考