
ClickHouse v23.3.14.78 LTS 版本发布解读核心 Bug 修复、回归修复与 CI 改进全景【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse本文基于 ClickHouse 官方仓库中的版本变更记录 v23.3.14.78-lts changelog 展开系统梳理该维护版本对 SQL 解析、正则匹配、轻量删除、聚合函数、物化视图等模块的十余项用户可见修复并结合仓库源码逐项解读修复背后的实现原理与影响范围。读完本文你将理解 LTS 补丁版本如何组织回归修复、每项修复对应哪些源码模块以及如何借助 changelog 与源码快速定位和验证 ClickHouse 行为变更。版本背景与维护策略v23.3.14.78-lts源码提交c8f4ba52c65是 ClickHouse 23.3 LTS 系列的一个维护版本变更基线为上一补丁版本v23.3.13.6-lts提交25635e27551。LTSLong-Term Support版本的特点在于不引入新功能只合入经过验证的回归修复Bug Fix与构建/测试/打包改进Build/Testing/Packaging Improvement。本版共包含4 项构建/测试/打包改进12 项用户可见的 Bug 修复changelog 中标注为 user-visible misbehavior in an official stable release若干无变更日志条目NO CL ENTRY与不重要的内部改动NOT FOR CHANGELOG / INSIGNIFICANT。从源码结构看这些修复涉及 src/Common正则与递归深度检查、src/Functionscast 解析、正则函数、方差聚合、src/AggregateFunctionsanalysisOfVariance、src/Interpreters参数化视图、src/StoragesMergeTree 投影、稀疏列排序、轻量删除、MaterializedPostgreSQL等核心模块下文逐项剖析。构建、测试与打包改进Build/Testing/Packaging本版的 4 项改进全部服务于 CI 基础设施与发布流程的可靠性变更内容关联 PR说明修复额外的 QEMU 日志输出#50442消除上一轮修复后遗留的干扰性日志净化 CI 输出Darwin 特殊构建任务携带含子模块的源码包#51435支持在不 checkout 子模块的情况下构建 ClickHouse简化 macOS 构建流程为未变更镜像补充 master 最新 tag 到changed_images.json#54369使镜像变更追踪文件信息更完整便于发布审计停止对每次 push 都构建并上传某些产物#54675降低 CI 资源消耗只在实际需要时产出这些改进与仓库中的 CI 框架一致ClickHouse 的 CI 由 ci 目录下的 Python 工作流驱动例如 ci/jobs/build_clickhouse.py 负责构建任务编排镜像 tag 追踪相关的changed_images.json逻辑可在 ci/praktika 中找到对应实现。值得注意的是本版还包含对 CI 的进一步内部重构Refactor CI_CONFIG、Use pathlib.Path in S3Helper、Get rid of the most of os.path stuff等方向是把 S3 产物与构建报告的处理迁移到现代pathlib.Path风格 API属于发布工程层面的技术债清理。核心 Bug 修复逐项解读1. 修复参数化视图Parameterized View与 CTE 的多次引用问题PR #52328修复了参数化视图在使用 WITH 子句CTE且同一 CTE 被多次引用时的错误。参数化视图允许在创建视图时使用{param:Type}占位符查询时通过设置传入实际值。当视图定义中包含 CTE 且该 CTE 被多处引用时旧的实现可能在参数替换与 CTE 展开过程中产生不一致导致解析或执行错误。修复位于查询分析与展开路径中相关逻辑可追溯至 src/Interpreters 目录下的表达式分析与 CTE 展开代码如ExpressionAnalyzer、QueryNormalizer相关实现。2. OptimizedRegularExpression 增加递归深度检查PR #52451在OptimizedRegularExpression中增加递归深度检查防止深嵌套正则表达式触发栈溢出。这是本版与源码对应关系最清晰的一项修复。src/Common/OptimizedRegularExpression.cpp 中analyzeImpl是一个对正则表达式语法进行递归下降分析的函数它负责提取“必需子串”required substring和顶层备选分支alternatives从而把常规正则匹配降级为更快的子串搜索预过滤。其入口 analyze 调用analyzeImpl后者在解析嵌套括号时会递归调用自身见 analyzeImpl 的 ( 分支pos analyzeImpl(regexp, pos 1, group_required_substr, group_is_trival, group_has_capture, group_alters);同时函数在递归入口处显式调用checkStackSize()见 源码第 244 行该调用来自 base/base/checkStackSize.h用于在线程栈耗尽前抛出异常。递归深度检查正是为对抗形如((((...))))这种由用户输入或机器生成、嵌套极深的恶意正则而设避免其击穿线程栈导致进程崩溃而非干净地报错。OptimizedRegularExpression是 ClickHouse 文本检索的底层基础设施被 src/Functions/MatchImpl.h、src/Functions/ReplaceRegexpImpl.h、src/Functions/extract.cpp、src/Storages/MergeTree/MergeTreeIndexConditionText.cpp 等大量模块引用因此该修复对所有match/extract/replaceRegexp系列函数与全文索引查询均有效。3. 修复删除投影Projection后的轻量删除Lightweight DeletePR #52517修复了在删除某个投影后执行轻量删除DELETE FROM ...的is_deleted标记方式可能引发的错误。轻量删除通过DELETE语句将行标记为已删除后续查询按_row_exists/is_deleted掩码过滤。当表上的投影被删除后旧的实现可能在部件part元数据或掩码处理上与投影的残留状态冲突导致DELETE后查询返回错误结果。该修复涉及 MergeTree 引擎的删除掩码与投影元数据同步相关代码位于 src/Storages/MergeTree 目录如数据部件写入与MergeTreeData的投影管理逻辑。4. 修复稀疏列Sparse Column在大 LIMIT 下的排序错误PR #52827修复稀疏列ALTER TABLE ... MODIFY SETTING ratio_of_defaults_for_sparse_serialization启用后的列存储格式在大LIMIT排序时可能出现的错误结果。稀疏列将默认值单独编码显著节省存储。排序尤其带大LIMIT的 TopN 排序需要将稀疏列物化为稠密表示修复前在特定行数边界下可能计算出错误行序。实现位于 src/Columns/ColumnSparse.h 与排序相关处理器src/Processors/Transforms/SortingTransform.h中。5. 修复向 DateTime 添加亚秒sub-second间隔PR #53309修复DateTime INTERVAL亚秒单位毫秒/微秒/纳秒运算的溢出问题。当DateTime与INTERVAL 1 MILLISECOND这类亚秒间隔相加时旧实现可能在秒与亚秒的进位处理上出现溢出或精度丢失。该修复涉及时间间隔算术的实现src/Common/DateLUT.h 与时间函数模块 src/Functions 下的toStartOf*、addInterval类逻辑。6. 允许 Bloom Filter 索引使用 IPv6PR #54200修复bloom_filter跳过索引在 IPv6 类型列上无法工作的问题。Bloom Filter 索引需要把索引列值转换为可哈希的字节表示。修复前 IPv6IPv6数据类型未纳入转换支持导致建索引或查询时报错或失效。相关实现位于 src/Storages/MergeTree/MergeTreeIndexBloomFilter.cpp 及其哈希值提取逻辑。7. analysisOfVariance 函数加法前检查溢出PR #54385在方差分析聚合函数analysisOfVariance的内部求和组间/组内平方和中在加法操作前检查溢出。analysisOfVariance是 ClickHouse 提供的统计学聚合函数实现于 src/AggregateFunctions/AggregateFunctionAnalysisOfVariance.cpp用于单因素方差分析ANOVA。修复前当样本量或数值极大导致平方和累加溢出时会产生未定义行为UB修复后在每次加法前执行溢出检查超限时抛出异常而非静默出错。这与仓库 src/Common/arithmeticOverflow.h 提供的common::addOverflow系列工具一脉相承。8. 修复并复现 removeSharedRecursive 的 BugPR #54430复现并修复removeSharedRecursive共享磁盘存储中的递归删除逻辑中的缺陷。removeSharedRecursive用于在共享存储S3、HDFS 等上递归删除数据需处理多副本/多表共享同一对象的场景。修复的核心是引用计数与删除顺序的正确性。相关实现位于 src/Disks/DiskObjectStorage.cpp 与 src/Disks 目录的IDisk/IDiskRemote层。注意该修复随后在本版被回滚见下文 NO CL ENTRY 一节属于本版中唯一出现“合入后回滚”的条目反映了 LTS 分支严格的稳定性把关流程。9. 修复聚合投影Aggregate Projection与归一化状态PR #54480修复使用聚合投影ALTER TABLE ... ADD PROJECTION时与归一化聚合状态normalized states即-State/-Merge组合相关的错误。聚合投影会把预聚合结果物化存储查询命中投影时通过状态合并加速。修复前当投影中的聚合使用归一化状态表示时合并路径可能计算出错误结果。实现涉及 src/Processors/QueryPlan/Optimizations/optimizeAggregateProjections.cpp 与聚合状态合并代码。10. 修复 WithNames 格式在禁用 input_format_with_names_use_header 时的解析错误PR #54513修复WithNames及WithNamesAndTypes输入格式在关闭input_format_with_names_use_header设置时可能出现的解析错误。该设置控制是否使用输入数据中的列名头来匹配表结构。关闭时输入解析应回退到按位置匹配修复前在特定列组合下会解析失败。相关实现位于 src/Formats/FormatFactory.cpp 与 src/Formats 目录下的*WithNames*格式解析器。11. 修复 MaterializedPostgreSQL 的 Invalid number of rows in ChunkPR #54844修复 MaterializedPostgreSQL 数据库引擎在复制数据时偶发的 Invalid number of rows in Chunk 错误。MaterializedPostgreSQL 通过复制协议实时同步 PostgreSQL 数据实现于 src/Databases/PostgreSQL 目录的MaterializedPostgreSQL相关类。修复前在事务复制与 WAL 回放过程中Chunk列块的行数元数据可能与实际数据不一致触发该内部断言。12. 阻止附加来自不同投影/索引的部件PR #55062防止将具有不同投影projection或跳过索引skip index定义的表部件partATTACH到当前表。ALTER TABLE ... ATTACH PART在恢复或迁移场景中常用。修复前若被附加部件的投影/索引定义与目标表不一致不会在附加时被拒绝从而在后续查询中产生错误结果。修复后在ATTACH阶段即校验元数据一致性并拒绝非法部件相关逻辑位于 src/Storages/MergeTree/MergeTreeData.cpp 的部件加载与校验路径。13. 修复 trash 优化在某种程度上PR #55353修复查询优化器中的 trash 优化问题changelog 原话 Fix trash optimization (up to a certain extent)即修复了该优化中的错误结果问题但作者承认是“在一定程度上”修复。该条目指查询计划优化阶段产生的错误行为具体涉及谓词下推或表达式重写路径。从措辞看这是一个已知边界内的修复后续版本仍会持续完善可参考 src/Interpreters 目录下的查询优化代码。14. 修复 cast 操作符中数组的解析PR #55417修复CAST操作符中数组类型表达式的解析问题。例如CAST(x AS Array(Int32))或对数组常量进行 cast 时旧解析器可能错误地把[后的内容当作其他语法元素。修复涉及类型转换函数的解析路径相关实现位于 src/Functions/FunctionsConversion.cpp其cast包装逻辑见该文件的createArrayWrapper等相关函数与 src/Parsers 目录下的类型解析器。NO CL ENTRY 与内部改动NO CL ENTRYPR #54731回滚了此前 backport 到 23.3 的 reproduce and fix the bug in removeSharedRecursive即前述第 8 项修复。由于该修复在 23.3 LTS 分支引入了其他问题维护者选择整体回滚以保证 LTS 分支的稳定性优先。NOT FOR CHANGELOG / INSIGNIFICANT值得关注但无需写 changelog本类条目虽不面向最终用户但揭示了维护者关注的方向测试libunwind变更#51436重构CI_CONFIG#52948、S3Helper 改用pathlib.Path并重写构建报告#54010、清理大部分os.path用法#55028异步插入重试后检查 block 是否为空#55143——涉及 src/Interpreters 的异步插入流水线MaterializedPostgreSQL 移除回退检查#55297当allow_remove_stale_moving_parts关闭时删除残留的moving/目录#55480——涉及 src/Storages/MergeTree 的部件移动逻辑。升级与验证建议对于运行 23.3 LTS 系列的用户本版建议升级的优先级场景正则与全文检索相关负载升级以获取OptimizedRegularExpression递归深度保护防栈溢出与正则匹配相关修复使用轻量删除、投影、稀疏列、Bloom FilterIPv6的高级 MergeTree 特性本版集中修复了这四个特性组合下的错误结果问题使用 MaterializedPostgreSQL 或 PostgreSQL 同步场景修复了 Chunk 行数不一致的内部错误批量导入WithNames格式数据且关闭了 header 匹配修复了解析失败问题。验证方式建议升级后在测试环境重放此前触发问题的查询如深嵌套正则match(column, ((((...)))))、大 LIMIT 的稀疏列排序、IPv6 列的bloom_filter索引查询并观察system.mutations、system.parts中与投影/轻量删除相关的状态确认行为符合预期。完整变更明细可继续阅读 docs/changelogs/archive/v23.3.14.78-lts.md历史版本记录见 docs/changelogs。小结v23.3.14.78-lts是典型的 LTS 维护版本没有新功能全部精力用于回归修复与工程稳定性。其 12 项用户可见修复覆盖了解析器、正则引擎、MergeTree 高级特性、聚合函数、格式解析与 PostgreSQL 集成等关键路径构建与 CI 改进则持续为发布流程减负。从源码对应关系看每项修复都能在 src 目录中找到明确的落点这也印证了 changelog 在 ClickHouse 开发流程中“问题记录—修复实现—回归测试”闭环中的枢纽作用。若你的环境仍在使用 23.3 LTS建议在验证测试后尽快跟进此版本。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考