拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ClickHouse v26.3.8.4-lts 变更深度解读:字符串搜索越界读取、全文索引兼容性与 Coalescing 合并树修复

ClickHouse v26.3.8.4-lts 变更深度解读字符串搜索越界读取、全文索引兼容性与 Coalescing 合并树修复【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHousev26.3.8.4-lts 是 ClickHouse 2026 年 LTS 分支的一个补丁版本包含三项针对官方稳定版用户可见行为的 Bug Fix覆盖字符串搜索函数、全文文本索引配置兼容性以及 Coalescing 合并树三类问题。本文以 官方变更记录 为主体结合仓库源码逐项解析每个修复的背景、影响面与底层实现帮助你判断升级必要性并做好验证。版本概览根据变更记录本版本基线信息如下版本号v26.3.8.4-ltscommitf3c6e5a4d27对比基准v26.3.7.8-ltscommit177c6aa7da1修复类型全部为 Bug Fix官方稳定版中的用户可见错误行为三项修复分别由不同维护者提交并反向移植backport到 LTS 分支修复项核心问题关联提交/Issue字符串搜索越界读取needle 全为\0字节时越界读PR #102401backport #102479全文索引配置被误禁用compatibility低于 26.1 时文本索引设置失效PR #102422backport #102456Coalescing 合并树 array 类型合并树对数组类型的合并异常PR #102384关闭 #89509backport #102453下文按修复项逐一展开。修复一字符串搜索函数对全零字节 needle 的越界读取问题现象countSubstrings、position等字符串搜索函数在查找“完全由\0null byte组成”的 needle搜索子串时存在**越界读取out-of-bounds read**问题。这类问题在内存安全检查如 AddressSanitizer下可能触发报告在特定数据布局下也可能导致不可预期的行为。涉及的函数族这些函数由 src/Functions/FunctionsStringSearch.h 统一实现包括position(haystack, needle)返回子串出现的字节位置从 1 开始未找到返回 0positionUTF8/positionCaseInsensitive/positionCaseInsensitiveUTF8按码点或忽略大小写变体countSubstrings(haystack, needle)统计 needle 在 haystack 中的出现次数like/ilike/match等基于同样搜索原语的函数countSubstrings的独立实现位于 src/Functions/countSubstrings.cpp 与 src/Functions/CountSubstringsImpl.h。源码层面的边界处理从 CountSubstringsImpl.h 可以看到实现针对空 needle 已有显式防护。例如在vectorConstant路径中if (needle.empty()) return; /// Return all zeros; the entry checkpoint above already observed the deadline.在vectorVector路径中也有对应处理else if (0 needle_size) { /// 0 already }而本修复针对的是非空但内容全部为\0的 needle。这类 needle 长度不为零会进入搜索器searcher初始化与逐行扫描路径问题正出现在这段扫描逻辑中——修复后确保了整个搜索路径含countSubstrings、position及其大小写变体对全零字节 needle 的读写都严格落在列数据边界内。实战验证建议升级到v26.3.8.4-lts后可在本地使用如下查询验证该场景不再触发越界读取-- 构造全零字节 needle 的边界场景 SELECT countSubstrings(materialize(abc), char(0, 0, 0)); SELECT position(materialize(abc), char(0, 0, 0));配合ASAN_OPTIONS...启动的 AddressSanitizer 构建可进一步确认无越界告警。仓库中的 gtest_functions_stress.cpp 等压力测试文件覆盖了字符串函数的边界输入组合可作为回归验证参考。修复二全文文本索引设置不再被 compatibility 误禁用问题背景本修复解决的是设置Settings与兼容性compatibility机制的交互缺陷当查询或会话的compatibility设置指向26.1 之前的版本时以下三个全文索引相关设置会被错误地禁用enable_full_text_indexallow_experimental_full_text_indexuse_skip_indexes_on_data_read这导致一个实际问题SharedDatabaseCatalog在使用文本索引创建表时可能失败——因为底层索引设置被认为不可用。设置定义与别名关系在 src/Core/Settings.cpp 中可以看到enable_full_text_index的定义方式DECLARE_WITH_ALIAS(Bool, enable_full_text_index, true, R( If set to true, allow using the text index. ), 0, allow_experimental_full_text_index) \也就是说allow_experimental_full_text_index是enable_full_text_index的历史别名实验性名称二者指向同一个开关默认值为true。它控制的是“是否允许使用文本索引text index / inverted index”。另一个被误禁用的use_skip_indexes_on_data_read定义于 src/Core/Settings.cpp默认true控制读取数据时是否应用跳数索引skip index进行过滤。SettingsQuirks 的兼容性调整机制ClickHouse 用compatibility设置模拟旧版本行为相关调整集中在 src/Core/SettingsQuirks.cpp。其中可以看到一个同族的文本索引设置也会在兼容模式下被强制关闭if (settings[Setting::query_plan_direct_read_from_text_index]) settings[Setting::query_plan_direct_read_from_text_index] false; adjusted.emplace_back(query_plan_direct_read_from_text_index 0);本次修复正是修正了这类兼容性“淬火”quirk逻辑中把文本索引设置一刀切禁用的行为确保compatibility指向旧版本时enable_full_text_index等设置仍保持有效从而让SharedDatabaseCatalog能正常创建带文本索引的表。文本索引周边设置一览围绕全文索引仓库还提供了若干配套开关Settings.cpp升级后可结合使用设置默认值作用query_plan_direct_read_from_text_indextrue查询计划中仅用倒排文本索引完成全文过滤query_plan_optimize_count_from_text_indextrue直接依据索引 posting-list 基数回答count()需前者开启query_plan_text_index_add_hinttrue基于倒排索引构造附加谓词提示text_index_hint_max_selectivity0.2提示生效的最大选择率阈值use_text_index_like_evaluation_by_dictionary_scantrue通过扫描索引词典加速%value%等 LIKE 模式text_index_like_min_pattern_length4走词典扫描的最小模式长度文本索引的读取端实现见 src/Storages/MergeTree/MergeTreeReaderTextIndex.h查询计划侧的过滤/裁剪逻辑位于 src/Processors/QueryPlan/ReadFromMergeTree.cpp。修复三Coalescing 合并树对 array 类型的修复Coalescing 合并模式是什么在 MergeTree 家族的合并参数中MergingParams::Mode定义了多种合并语义Coalescing是其中之一其枚举定义位于 src/Storages/MergeTree/MergeTreeData.hCoalescing 8,Coalescing 模式与 Summing 模式同族它会在合并时把相邻行中相同键的数值列合并coalesce。在 src/Storages/MergeTree/MergeTreeData.cpp 中可以看到相关校验逻辑——columns_to_sum非空时要求模式必须是 Summing 或 Coalescingif (!columns_to_sum.empty() mode ! MergingParams::Summing mode ! MergingParams::Coalescing)该合并模式的排序合并在执行端由 src/Processors/Merges/CoalescingSortedTransform.h 中的CoalescingSortedTransform完成它基于SummingSortedAlgorithm实现。本次修复的内容变更记录描述为“Coalescing merge tree fix for array type”即该合并模式在处理Array数组类型列时存在缺陷本版本对其进行了修正并关闭了 issue #89509。从源码结构看此类修复通常落在合并算法的类型分派与数值累加路径上MergeTreeData.cpp 中 Summing/Coalescing 共用同一分支涉及对列类型分支的边界补齐。受影响的部署形态如果你的表使用了基于 Coalescing 合并语义的 MergeTree 变体并且表中包含Array(...)类型列建议升级后对相关表执行一次OPTIMIZE TABLE ... FINAL并比对合并前后结果以验证数据一致性。升级建议与验证路径升级到 v26.3.8.4-lts在 LTS 分支内做补丁升级风险面小三项修复均为稳定版用户可见行为的缺陷修正。验证版本SELECT version();应输出26.3.8.4及以上 LTS 版本。重点回归场景含全零字节字符串的countSubstrings/position查询修复一设置了compatibility为 26.1 之前版本、且使用文本索引建表的SharedDatabaseCatalog场景修复二含Array类型列、启用 Coalescing 合并语义的 MergeTree 表修复三。本版本的完整变更条目可在 docs/changelogs/v26.3.8.4-lts.md 查看更多历史版本的变更记录位于 docs/changelogs 目录相关设置的默认值与说明可在 src/Core/Settings.cpp 中检索对应设置名进行核对。【免费下载链接】ClickHouseClickHouse® is a real-time analytics database management system项目地址: https://gitcode.com/GitHub_Trending/cli/ClickHouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门