2026 年变更日志
ClickHouse 26.3 LTS 发布,2026-03-26。演示文稿、视频
不兼容变更
- 升级后再降级可能会导致数据丢失。将数据类型的序列化版本传递到嵌套数据类型中。例如,String 的序列化版本
with_size_stream之前仅应用于顶层 String 列和 Tuple 元素。现在,它会应用于任何嵌套类型 (如Array/Map/Variant/JSON/etc.) 中的任意 String 类型。这种行为由 MergeTree 设置propagate_types_serialization_versions_to_nested_types控制,且该设置现已默认启用。此修改后,新创建的数据分区片段无法被旧版本读取,但旧 parts 仍可在新版本中正常读取。升级是安全的,但降级则不安全——如果您在升级到 26.3 后需要回滚,则 26.3 在包含嵌套类型的列中写入的数据将无法读取! 详情请参见 #101429 。#94859 (Pavel Kruglov). - 移除
hypothesis跳过索引类型。这是一项冷门的 Experimental 功能,实际用途有限。现在,使用INDEX ... TYPE hypothesis创建表会报错。#96874 (Alexey Milovidov) 。 - 移除处于 Experimental 阶段的
detectProgrammingLanguage函数。#99567 (Alexey Milovidov) 。 - 修复
NOT运算符的优先级以符合 SQL 标准:NOT现在的优先级低于IS NULL、BETWEEN、LIKE和算术运算符。例如,NOT (x) IS NULL现在会被解析为NOT (x IS NULL),而不是(NOT x) IS NULL。这可能会改变依赖此前 (非标准) 行为的查询结果。#97680 (Alexey Milovidov). - 修正了普通投影的元数据,使具有多列排序键的投影能够被正确识别。这是在 #90429 的基础上进一步完善的。#91352 (Amos Bird) 。
- 修复了跳过索引文件未遵循 replace_long_file_name_to_hash 设置的问题;该问题会导致出现 "File name too long" 错误,并使名称较长的索引无法正常读取。现在,当跳过索引文件名超过 max_file_name_length 时,会像列文件一样对文件名进行哈希处理。这一更改向后兼容 (新服务器可读取旧 parts) ,但降级 (或滚动升级期间使用旧服务器) 可能导致名称较长的索引被忽略。#97128 (Raúl Marín).
- 默认启用异步插入。ClickHouse 现在会默认将所有小型插入按批次处理。此设置在 compatibility 中配置。如果您设置
compatibility=<version less than 26.2>,则默认值将恢复为之前的值,即false。您可以在多个层级启用或禁用异步插入:在用户 profile 配置中、在会话级别、查询级别,或在 MergeTree 表级别。#97590 (Sema Checherinda)。 - 将
mysql_datatypes_support_level的默认值从空改为decimal,datetime64,date2Date32,默认启用将 MySQLDATE正确映射到Date32、将DECIMAL/NUMERIC映射到Decimal,以及将带精度的DATETIME/TIMESTAMP映射到DateTime64。此前,MySQLDATE列会被映射到Date,而后者无法表示 1970-01-01 之前的日期,从而导致数据损坏。#97716 (Alexey Milovidov). - 由于正则表达式较慢,
mergeTreeAnalyzeIndexes{,UUID}现支持接受 part 名称数组,而不是 regexp (Experimental 功能)。#98474 (Azat Khuzhin). - 将可执行用户定义函数的默认
stderr_reaction从throw修改为log_last。UDFs 在向 stderr 写入警告且退出代码为 0 时将不再失败。退出代码异常现在会包含 stderr 的内容。#99232 (Xu Jia).
新特性
- 为 MergeTree 中的 Map 列新增了分桶序列化支持 (
map_serialization_version = 'with_buckets') 。键会按哈希拆分到不同的桶中,因此读取单个键 (m['key']) 时只需读取一个桶,而不是整个列,从而根据 Map 大小将单键查找速度提升 2 到 49 倍。桶的数量和分桶策略可通过新的 MergeTree 设置进行控制:map_serialization_version、max_buckets_in_map、map_buckets_strategy、map_buckets_coefficient和map_buckets_min_avg_size。#99200 (Pavel Kruglov) 。 - 支持物化 CTE。允许在查询执行期间仅计算一次 CTE,并将结果存储在临时表中。关闭 #53449。#94849 (Dmitry Novik) 。
- 允许某些符合 SQL 标准的函数在不加括号时也能使用,以保持兼容性,例如
NOW。关闭 #52102。#95949 (Aly Kafoury) 。 - 您现在可以使用自然排序键函数
naturalSortKey(s)。#90322 (Nazarii Piontko) 。 - 您现在可以为 JSONExtract 函数使用原生的 JSON/Object 输入。修复了 #88370。#96711 (Fisnik Kastrati).
- 如果某个查询参数的类型为
Nullable,且未显式指定,则会假定其值为NULL。#93869 (Vikash Kumar) 。 - 支持
Replicated数据库使用辅助 ZooKeeper。#95590 (RinChanNOW) 。 - 支持对 JSON 类型使用
has函数来检查路径是否存在,类似于Map。 #96927 (DQ). - 新增了
mergeTreeTextIndex(database, table, index)表函数,可直接从文本索引中读取数据。该函数可用于内省,或基于文本索引数据执行聚合。 #97003 (Anton Popov). - 新增
table_readonlyMergeTree 设置,可将表标记为只读,从而防止插入和修改。#97652 (Alexey Milovidov). - 新增设置
use_partition_pruning及其别名use_partition_key。将其设为false以禁用基于分区键的分区剪枝。#97888 (Nihal Z. Miaji). - 支持对 Iceberg 表执行
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')。#97904 (murphy-4o)。#99130 - 允许
<protocols>中每个type=http条目指定自定义的<handlers>键,使其指向单独的<http_handlers_*>配置节,从而为各端口启用不同的 HTTP 路由规则。#98414 (Amos Bird). - 为
EXPLAIN添加pretty=1设置以输出树状缩进格式,并添加compact=1以折叠Expression步骤,让查询计划更易读。#98500 (Kirill Kopnev)。 - 新增
restore_access_entities_with_current_grants服务器设置。启用后,从备份中恢复的用户/角色,其授权会被限制在执行恢复操作的用户有权授予的范围内 (语义与GRANT CURRENT GRANTS相同) ,而不会因ACCESS_DENIED而失败。#98795 (pufit). - 新增
caseFoldUTF8和removeDiacriticsUTF8函数,用于 Unicode 大小写折叠和去除变音符号。#98973 (George Larionov). - 新增
normalizeUTF8NFKCCasefold字符串函数,用于执行 NFKC_Casefold Unicode 规范化,将 NFKC 规范化与大小写折叠结合起来。#99276 (George Larionov) 。 - 为全文索引和
tokens函数新增asciiCJK分词器。它按 Unicode 单词边界规则拆分文本:ASCII 单词可包含连接字符 (下划线、冒号、点号、单引号) ,而非 ASCII 的 Unicode 字符则会被拆分为单字符标记。#99357 (Amos Bird) 。 - 新增
max_skip_unavailable_shards_num和max_skip_unavailable_shards_ratio设置,用于限制在启用skip_unavailable_shards时可静默跳过的分片数。如果不可用分片的数量或占比超过配置的阈值,则会抛出异常,而不是静默返回不完整的结果。#99369 (Alexey Milovidov). - 现在,用户可以在子查询表达式中使用
SOME关键字。其行为与ANY完全一致。#99842 (Artem Kytkin). - 新增
output_format_trim_fixed_string设置,用于在文本输出格式中去除FixedString值末尾的空字节。#97558 (NeedmeFordev) 。 - 支持在 FROM 子句中使用加括号的表连接表达式,例如
SELECT * FROM (t1 CROSS JOIN t2)。#97650 (Alexey Milovidov) 。 - 实现函数
toDaysInMonth:返回指定日期所在月份的天数。#99227 (Vitaly Baranov)。
Experimental 功能
- 新增对基于 WebAssembly 的用户定义函数 (UDF) 的 Experimental 支持,允许在 WebAssembly 中实现自定义函数逻辑,并在 ClickHouse 内执行。特别感谢 Alexey Smirnov 贡献了 Wasmtime 后端支持。#88747 (Vladimir Cherkasov) 。同时还对 WASM UDF 支持进行了增量改进。#99373 (Vasily Chekalkin) 。
- 新增通过
polyglot库支持外部 SQL 方言。#99496 (Alexey Milovidov) 。 - 新增
ALP浮点压缩编解码器 (对于不可压缩的 double,不使用 ALP_rd 回退) 。#91362 (Nazarii Piontko) 。 - 为
JSON列新增 Experimental 惰性类型提示支持。通过allow_experimental_json_lazy_type_hints启用后,仅添加或修改类型提示的ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName)会作为纯元数据操作立即完成,而无需重写历史数据。对于旧 parts,类型提示会在查询时生效;在 INSERT 和后台合并期间则会被物化。#97412 (tanner-bruce) 。 - 为 YTsaurus 表引擎启用并行读取。#97343 (MikhailBurdukov) 。
性能优化
- 提升数据湖性能。在之前的版本中,从对象存储读取时,管道不会根据处理线程数自动调整大小。这在多核机器上可带来数量级的性能提升 (约 40 倍) 。#99548 (Alexey Milovidov) 。
- 现在,
enable_parallel_replicas与automatic_parallel_replicas_mode之间的关系如下:只有当enable_parallel_replicas > 0时,查询才能使用并行副本。此外,如果automatic_parallel_replicas_mode=1,则是否使用并行副本会在计划阶段根据先前收集的统计信息决定。如果automatic_parallel_replicas_mode=0,则所有受支持的查询都会使用并行副本,而不考虑任何统计信息。一个值得注意的例外是使用并行副本的分布式 insert-select:在这种情况下,查询始终会像automatic_parallel_replicas_mode=0那样执行。#97517 (Nikita Taranov) 。 - 当谓词包含任意比较运算符 (
=,<,>,!=) ,且分区键被包裹在一串决定论函数中时,允许进行分区剪枝 (例如,PARTITION BY x以及cityHash64(x) % 5 > 2、toYYYYMM(x) < 2026、toYYYYMM(x) = 2026或toYYYYMM(x) != 2026这类谓词,都会使用分区键进行剪枝) 。关闭 #28800。#98432 (Nihal Z. Miaji) 。 - 当
CAST的目标类型为Nullable且转换具有单调性时,支持按序读取优化和主键剪枝;例如,在PRIMARY KEY x的情况下,ClickHouse 可以对ORDER BY x::Nullable(UInt64)使用按序读取优化,并对WHERE x::Nullable(UInt64) > 500000这类谓词条件应用主键剪枝。 #98482 (Nihal Z. Miaji). - 当整型列与浮点字面量比较时,现已支持索引剪枝和过滤条件下推;例如,
WHERE x < 10.5这类谓词现在可以使用主键进行剪枝,而prime < 1e9或number < 1e5这类过滤条件现在也会下推到primes()和numbers()表函数中,而不会导致无界执行。关闭 #85167。#98516 (Nihal Z. Miaji) 。 - 新增了用于 Parquet 元数据的 SLRU 缓存,无需仅为读取元数据而重新下载文件,从而提升了读取性能。#98140 (Grant Holly) 。
- 支持根据优化器统计信息对 ANTI、SEMI 和 FULL 连接的两侧进行互换。#97498 (Hechem Selmi).
- 优化
pointInPolygon在大型多边形场景下的 그래뉼 跳过,并修复pointInPolygon索引分析在主键剪枝期间抛出异常的问题。 #91633 (Nihal Z. Miaji). - 优化
levenshteinDistance函数的性能。#94543 (Joanna Hulboj) 。 - 通过避免对每个元素调用函数,优化批次 decimal 类型转换。#95923 (Konstantin Bogdanov).
- Iceberg 表现已支持通过
iceberg_metadata_async_prefetch_period_ms表设置进行异步元数据预取,定期预先填充元数据缓存。此外,iceberg_metadata_staleness_ms查询设置允许 SELECT 查询在缓存的元数据比指定的陈旧阈值更新时使用缓存元数据,从而避免在请求处理过程中调用 Iceberg 目录。#96191 (Arsen Muk) 。 S3Queue有序模式使用 S3 ListObjectsV2 StartAfter,以避免重新列出整个前缀历史,从而减少 ListObjects 调用。#96370 (Venkata Vineel ).- 降低插入去重的内存占用。通常,去重需要保留原始块;但对于同步插入,可以省略它,从而显著节省内存。#96661 (Sema Checherinda).
- 使用与架构对应的缓存行大小值,而不是将其硬编码为 64。 #97357 (Nikita Taranov).
- 对文本索引字典的读取做了小幅优化,提升了文本索引分析的整体性能。#97519 (Anton Popov) 。
- 提升 ARM 上 16 字节块的
LZ4解压缩速度。#97774 (Raúl Marín). - 将分词功能重构为新的高性能接口,以替换旧的迭代器风格 API,从而支持 SIMD 和有状态分词器。属于 #90268 的一部分。#97871 (Amos Bird) 。
- 改进了对同时包含已建立索引列和未建立索引列的组合条件查询进行 텍스트 인덱스 分析时的性能。此前,在这种情况下,索引分析期间的提前退出优化会被错误地禁用。 #98096 (Anton Popov).
- 提升包含会生成超长数组或 Map 的常量表达式的查询性能。#98287 (Alexey Milovidov) 。
- 修复了将
DateTime64主键与整型常量比较时的键条件分析问题;此前这会导致无法进行 그래뉼 剪枝。#98410 (Amos Bird). - 设置
optimize_syntax_fuse_functions默认处于启用状态。#98424 (Alexey Milovidov) 。 - 通过使用局部累加器,而不是按行经由聚合状态进行存储转发,优化了
avgWeighted聚合函数;对于 Nullable 输入,性能最高可提升 27%。#98793 (Antonio Andelic) 。 - 在某些场景下,这项改进可提升并行窗口函数的性能并降低内存占用,对处理大数组的
arrayFoldworkload 也有帮助。它还可以减轻缺页压力,并在内存限制较紧时提高受影响查询的稳定性。#98892 (filimonov). - 提升有序合并的性能。#99013 (Artem Zuikov) 。
- 优化了
INTERSECT ALL和EXCEPT ALL。#99097 (Raufs Dunamalijevs) 。 - 支持在逆序读取中使用
read_in_order_use_virtual_row优化。#99198 (Vladimir Cherkasov) 。 - 通过在写入前检查 JoinUsedFlags 是否已设置,减少
RIGHT和FULLJOIN 中的缓存竞争。#99274 (Hechem Selmi). - 通过将浮点运算替换为纯整数运算,优化
PrefetchingHelper::calcPrefetchLookAhead,从而改进指令缓存布局,并减少聚合循环期间的周期开销。#99327 (Riyane El Qoqui) 。 - 通过将用于存储节点子节点的
absl::flat_hash_set替换为CompactChildrenSet,降低了 Keeper 的内存占用。新容器可内联存储 0–1 个子节点而无需堆分配,这涵盖了绝大多数 Keeper 节点。这样可将KeeperMemNode的大小从 144 字节减小到 128 字节。#99860 (Antonio Andelic) 。 - 现在已在视图中正确支持聚合投影。修复了 #32753。#88798 (Amos Bird) 。
- 支持在启用
join_use_nulls时,将 OUTER 连接转换为 INNER 连接的优化。关闭 #90978。#95968 (Vladimir Cherkasov) 。 - 通过在读取前正确计算大小,优化了子列读取。这减少了内存占用,并提升了子列读取速度。 #96251 (Pavel Kruglov).
- 让 mark 缓存、未压缩缓存和页面缓存使用各自独立的 jemalloc arena,以避免短生命周期的内存分配 (即查询和请求的分配) 与缓存所需的长生命周期分配混用时产生内存碎片。 #96812 (Seva Potapov). #98812. #99021
- 带有
DELETE TTL规则的表现在也可以使用垂直合并算法。#97332 (murphy-4o). - 在分散索引分析过程中应用数据跳过索引。#97767 (Azat Khuzhin) 。
- 启用
prewarm_mark_cache设置后,现在会预热辅助索引的标记 (即在拉取数据分区片段以及表启动期间,将其加载到索引标记缓存中) 。#97772 (Anton Popov) 。 - 减少了访问控制期间的锁争用。#97894 (Nikita Taranov) 。
- 启用 apply_row_policy_after_final 或 apply_prewhere_after_final 后,现在会分解行策略和 PREWHERE 中由 AND 组合的复合条件,以提取排序键原子条件并用于主键索引分析。此前,如果延后过滤器同时包含排序键和非排序键 프레디케이트 (例如 x > 1 AND y != 'foo') ,则整个表达式都不会纳入索引分析。现在,即使在嵌套的 AND 表达式中,也能提取排序键原子条件 (如 x > 1) ,并将其用于 그래뉼剪枝。#98513 (Yarik Briukhovetskyi) 。
- 通过让任务资源在无需获取锁的情况下释放,减少 MergeTreeBackgroundExecutor 中的锁竞争。关闭 #93620。#98604 (Dmitry Novik) 。
- 修复了读取非 Arrow 数据时在自动检测格式期间内存占用过高 (约 514 MiB) 的问题 (例如,从
url或file读取且未显式指定格式的 JSON) ;原因是 ArrowStream 读取器将起始几个字节误判为超大的元数据长度。#98893 (Konstantin Bogdanov).
改进
- 现已支持解析同一列中包含不同 Geo 类型的 GeoParquet 文件。#97851 (Mark Needham).
- 引入
tokensForLikePatternSQL 函数,用于在保留通配符语义的同时对 LIKE 模式进行标记化:%和_视为通配符,转义后的通配符 (\%、\_) 视为字面量,与未转义通配符相邻的标记会被丢弃。#97872 (Amos Bird) 。 - 为 S3 表引擎新增
{_schema_hash}占位符,用于将表列定义的哈希值插入到 S3 路径中。#98265 (Miсhael Stetsyuk). SymbolIndex、addressToSymbol、system.symbols和buildId现已可在 macOS 上通过解析 Mach-O 符号表来工作。#99014 (Alexey Milovidov).system.stack_trace表现在已可在 macOS 上运行,支持检查所有服务器线程的堆栈跟踪。#98982 (Alexey Milovidov).- 新增按服务器配置的 LDAP 选项
<follow_referrals>(默认值为false) ,用于控制 LDAP 客户端是否跟随转介。禁用转介跟随可避免从 Active Directory 域根 base DN 开始搜索时出现超时和卡住的问题。与转介相关的日志消息已从warn调整为trace。#96765 (paf91). - 我们现在会将查询执行期间使用的所有数据跳过索引记录到 query_log 表新增的
skip_indices列中。修复了 #78676。原始著者为 @pheepa。#87862 (Grant Holly) 。 - ACCESS_DENIED 提示不再暴露列名,除非用户有权查看所有必需的列;数据库/表名在提示中仍然可见。#91067 (filimonov).
- 为 MergeTree 新增一个专用清理线程,以避免在高合并负载下发生清理延迟。此项改动修复了 #86181。#91574 (Amos Bird) 。
- 仅在本地服务器主机名对应的 IP 发生变化时才重新加载集群配置,而不是在任意主机的 IP 发生变化时重新加载。修复了 #81215、#70156 和 #65268。#93726 (Zhigao Hong) 。
- 支持 optimize_aggregators_of_group_by_keys 在 GROUPING SETS 查询中正确优化聚合函数。 #93935 (Xiaozhe Yu).
- Keeper-bench:在指标中报告错误,并为
--input-request-log模式生成 JSON 指标文件。#95748 (Mohammad Lareb Zafar). - 在 CREATE USER 中新增 ROLE 子句。#97074 (Vitaly Baranov) 。
- 您现在可以为由 Replicated 数据库创建的集群配置 internal_replication 设置。#97228 (Pervakov Grigorii) 。
- 新设置
allow_nullable_tuple_in_extracted_subcolumns用于控制从Tuple、Variant、Dynamic和JSON中提取的Tuple(...)子列是返回为Nullable(Tuple(...))(缺失行返回NULL) ,还是返回为Tuple(...)(缺失行返回默认的 tuple 值) 。该设置默认禁用,且只能通过重启服务器进行修改。#97299 (Nihal Z. Miaji) 。 - 在 EXPLAIN 查询的输出中,将延迟筛选器信息作为单独一项添加进去 (在使用 Row Policies/PREWHERE 和 FINAL 时) 。相关:#91065。#97374 (Yarik Briukhovetskyi) 。
- 默认启用
type_json_allow_duplicated_key_with_literal_and_nested_object。它可避免在解析{"a" : 42, "a" : {"b" : 42}}这类 JSON 时因重复键而报错;这类 JSON 可能是 ClickHouse 根据原始 JSON 数据{"a" : 42, "a.b" : 42}格式化生成的。#97423 (Pavel Kruglov) 。 - Keeper 改进:
find_super_nodes是一个非常有用的命令语,可用于调试 Keeper 中节点数量意外增长的问题。遗憾的是,如果存在多个超级节点,几乎不可能找到一个以上,因为该命令语在遍历遇到的第一个超级节点的子节点时会一直卡住。此 PR 禁止遍历超级节点的子节点。#97819 (pufit). - 新增对
clickhouse-keeper-client的初始自动补全支持。#97828 (Konstantin Bogdanov) 。 - 在发生崩溃时,刷新异步日志缓冲区。#97836 (Azat Khuzhin).
- 默认启用 impersonate 功能 (参见 EXECUTE AS target_user) 。#97870 (Vitaly Baranov) 。
- 改进了 SQLite 表引擎对 KILL QUERY 和在 clickhouse-client 中按 Ctrl+C 取消查询的支持。#97944 (Roman Vasin).
- 新增 server setting
jemalloc_profiler_sampling_rate,用于控制 jemalloc 的lg_prof_sample,并将其作为jemalloc.prof.lg_sample异步指标暴露出来。#97945 (Antonio Andelic) 。 - 为并发有界队列实现增加权重支持。#97962 (Daniil Ivanik) 。
- 将 sslmode 添加到 PostgreSQL 字典源的允许键列表中。此前,sslmode 不在 PostgreSQLDictionarySource.cpp 的 dictionary_allowed_keys 允许列表内,因此无法为 PostgreSQL 字典连接配置 SSL 模式。这会导致字典无法连接到要求使用 SSL 的 PostgreSQL 服务器 (例如默认强制启用 SSL 的 AWS RDS) ,因为连接会在 TLS 协商阶段失败,服务器也会拒绝回退到未加密连接。#98014 (mcalfin).
- 当向
clickhouse或clickhouse-local传入不存在的文件路径时,显示清晰的 "no such file" 错误,而不是令人困惑的通用错误消息。#98048 (Raúl Marín). - 现在已支持在
Nullable([Fixed]String)和Array(Nullable([Fixed]String))列上构建文本索引。#98118 (Jimmy Aguilar Mena). - 避免删除作为字典源依赖的命名集合。#98127 (Pablo Marcos) 。
- 为带有 totals 的查询启用
grace_hash连接算法。#98144 (János Benjamin Antal) 。 - 在 DROP DATABASE 过程中提前取消 ordinary shared merge tree 的后台合并。#98161 (Shaohua Wang) 。
- 通过 KILL QUERY 和 clickhouse-client 中的取消查询 (Ctrl+C) ,改进了对 MongoDB 和 MySQL 查询取消的支持。#98187 (Roman Vasin).
- 移除 NetlinkMetricsProvider,并改为仅使用 procfs 收集每线程 taskstats 指标。基于 Netlink 的收集方式在容器化环境中存在问题,而且在发生争用时尾延迟更高。#98229 (Amos Bird).
- 重构 Iceberg 清单文件的处理逻辑,以修复清单文件缓存问题。#98231 (Daniil Ivanik) 。
- 现在我们也会考虑这样一种情况:表的排序键可以是
toDate(time)这样的表达式;如果这类表达式是筛选条件的一部分,就可以据此决定不延迟对它们的处理。 #98237 (Yarik Briukhovetskyi). - 新增
MaxAllocatedEphemeralLockSequentialNumber指标,用于表示 ZooKeeper 中临时锁 znode 已分配的最大顺序号。#98243 (Miсhael Stetsyuk) 。 - 将 ClickStack 更新到 2.20.0 版本。#98252 (Aaron Knudtson) 。
- 新增了一个 profile 事件
KeeperRequestTotalWithSubrequests,会对多重请求中的每个子请求分别计数,从而更清楚地反映 Keeper 的实际工作负载。现有的KeeperRequestTotal事件仍会将每个多重请求计为一个请求。#98348 (Antonio Andelic) 。 SYSTEM RELOAD DICTIONARIES现在会按拓扑顺序重新加载字典,因此以其他字典为数据源的字典在重新加载后可以读取到最新数据。#98356 (Alexey Milovidov).- 更改 MergeTree 设置后,重启统计信息缓存。#98520 (Han Fei) 。
- 只有“存活”的副本 (即可以连接的副本) 才会参与分散索引分析。#98521 (Azat Khuzhin) 。
- 添加设置
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users(默认禁用/允许) ,用于禁止 SQL 定义的用户使用配置中定义的设置 profile (defaultprofile 除外) 。#98662 (Alexander Tokmakov) 。 - 将自动并行副本启发式所使用的节点数量上限限定为集群中的实际节点数 (而不是仅受
max_parallel_replicas设置限制) 。#98668 (Nikita Taranov) 。 - 为分散索引分析实现对冲请求与异步读取。#98724 (Azat Khuzhin) 。
- 二进制
AggregateFunction状态的反序列化现在需要读取完整输入。如果存在多余的尾随冗余字节,ClickHouse 将抛出异常,而不再接受格式错误的状态数据。#98786 (Nihal Z. Miaji). - 使 TRUNCATE DATABASE 支持响应查询取消。#98828 (Shaohua Wang) 。
- 改进了
keeper-bench,新增请求流水线、预热期、单操作统计信息、可复现的随机种子以及更完善的错误处理。#98906 (Antonio Andelic). - 支持在分散索引分析中支持 SAMPLE 子句。#98931 (Azat Khuzhin).
- 即使查询返回空结果或报错,也会在仪表板中显示图表标题。#98975 (Yash ).
- Analyzer 错误消息不再输出表中的所有列 (这可能会导致异常信息达到 150KB+) 。列列表现已限制为最多 10 项。#99002 (Yash ).
- 正确返回带有连接的子查询中的列统计信息,以便父查询可利用这些信息对连接顺序进行重排。 #99096 (Alexander Gololobov).
- 在开始最终化时立即将 ZooKeeper 会话标记为已过期,而不是等待发送线程退出。这样可让其他线程立即建立新会话,无需等待。#99102 (Raúl Marín).
- 开始更多使用 LLVM-libc 中的数学函数:
exp、exp2、expm1、fabs、fabsl、floor、fmodl、log、log2、logf、pow、scalbn、scalbnl、copysignl、nan、nanf、nanl,以及explogxf共享常量。#99118 (Konstantin Bogdanov) 。 - 降低
system.jemalloc_profile_text折叠格式的内存占用,并修复潜在的重复输出问题。#99121 (Antonio Andelic) 。 - 向
system.aggregated_zookeeper_log添加is_subrequest列,以区分独立请求与 Multi/MultiRead 请求中的子请求。此前,子请求会被聚合到与独立请求相同的桶中,而且由于每个子操作记录的都是整个多请求的总持续时间,平均延迟会产生误导。现在,子请求的延迟为零。#99169 (Miсhael Stetsyuk). - 允许在不指定列类型的情况下执行
ALTER TABLE MODIFY COLUMN x TTL ...命令。 #99208 (Nikolay Degterinsky). - 跳过已断开连接会话的过期 Keeper 请求,避免不必要的 Raft 往返。被跟踪的已结束会话数量上限由协调设置
max_finished_sessions_cache_size限制。#99246 (Antonio Andelic). - 支持在基于
mapValues(map)构建的文本索引中使用IN运算符。#99286 (Anton Popov) 。 - 在 clickhouse keeper-client 中新增类 shell 的补全支持 (支持补全引号中的参数,即
'foo ba';支持转义参数,即foo\ ba;如果节点包含空白字符,则让ls以带引号的形式输出节点) 。#99312 (Azat Khuzhin) 。 - 防止 Keeper 的
mntr命令因锁竞争而发生卡顿。#99472 (Antonio Andelic) 。 - 通过在互斥锁作用域外调用回调并分发读取请求,减少 Keeper 分发器中的锁竞争,并添加带性能剖析的锁保护,以增强可观测性。#99751 (Antonio Andelic) 。
- 允许 Parquet 文件最后一个块末尾缺少填充。#99857 (Seva Potapov).
错误修复(官方稳定版本中用户可见的异常行为)
- 修复了当别名表目标未完全限定时,其作为 DDL 依赖项的保存方式:现在会使用别名表所在的数据库,而不是会话数据库来保存。#95175 (Enric Calabuig).
- 修复读取 ALIAS 列的子列时返回错误结果或抛出异常的问题。#95408 (Pavel Kruglov).
- 修复在旧分析器中,JOIN 使用非标准标识符别名时出现列缺失的问题。修复了 #25594、#47288 和 #53263。#95679 (Zhigao Hong) 。
- 修复了 Kusto 方言函数
bin()、bin_at()、extract()和indexof()在传入空参数时发生崩溃的问题。#95736 (NeedmeFordev) 。 - 禁止在 clickhouse-client 中,将 local_object_storage (用于构建基于本地文件系统的数据湖,也可能被 LocalDisk 使用) 挂载到 user_files_path 以外的任何位置。#96201 (Daniil Ivanik).
- 在
DeltaLake表引擎中,修复快照版本变化时的逻辑竞态问题,并移除冗余且开销较大的快照重新加载。#96226 (Kseniia Sumarokova) 。 - 修复了 MergeTree 中在分离与附加之间发生多次链式重命名时附加 part 的逻辑错误。#96351 (Alexey Milovidov) 。
- 修复了一个问题:在同一请求中与
compatibility一起发送的显式设置,如果其值恰好与服务器默认值相同,可能会被静默忽略。#97078 (Raufs Dunamalijevs). - 修复以下问题:当启用并行解析的 INSERT 遇到无效数据时,客户端会报告
NETWORK_ERROR,而不是实际的解析错误 (并显示正确的行号) 。 #97339 (Alexey Milovidov). - 修复了在引入
Nullable(Tuple)后,sumCount聚合函数无法读取旧版序列化状态的问题。关闭 #97370。#97502 (Nihal Z. Miaji). - 修复在结合
GROUPING SETS和ORDER BY使用时,涉及Nothing类型元素 (例如与NULL元组元素比较) 的元组比较中出现的异常。#97509 (Alexey Milovidov) 。 - 修复在使用多个压缩编解码器时,Compact MergeTree parts 的
uncompressed_hash计算具有非确定性的问题,这可能导致错误的去重行为。#97522 (Alexey Milovidov) 。 - 修复了在使用 JSON 和 shared data 中的 buckets 执行 INSERT SELECT 时因缺少流而引发的逻辑错误。关闭了 #97331。#97523 (Pavel Kruglov) 。
- 修复了在 SummingMergeTree 和 CoalescingMergeTree 合并过程中,
MEMORY_LIMIT_EXCEEDED异常被误报为CORRUPTED_DATA的问题。#97537 (János Benjamin Antal) 。 - 修复了包含
url()等表函数的关联子查询中出现的“Context has expired”异常。#97544 (Alexey Milovidov) 。 - 修复
optimize_syntax_fuse_functions在处理聚合投影、Date 类型以及保留列名时出现的异常和错误行为。#97545 (Alexey Milovidov) 。 - 移除了将
replaceRegexpOne重写为extract的错误查询重写,该重写在正则表达式未匹配时会产生错误结果;同时修复了在replaceRegexpOne与GROUP BY ... WITH CUBE及group_by_use_nulls=1一起使用时出现的异常。#97546 (Alexey Milovidov). - 修复了在查询被终止时,启用
database_atomic_wait_for_drop_and_detach_synchronously的DROP DATABASE无限期卡住的问题。#97586 (Alexey Milovidov). - 修复
KILL QUERY无法终止以下卡住的查询的问题:卡在WITH FILL生成过程中、通过dictGet加载字典时,或在ReplicatedMergeTree上执行带有mutations_sync=1的ALTER DELETE时。#97589 (Alexey Milovidov). loop表函数会直接调用inner_storage->read(),从而绕过解释器层;而行策略、列级授权及其他安全检查正是在这一层执行的。因此,即使直接执行 SELECT 返回零行,受行策略限制的用户仍可通过loop(table)读取所有行。#97682 (pufit).- 修复了在使用 Unix 纪元前的 DateTime64 配合
toDate()函数时,分区剪枝不正确的问题。#97746 (Yarik Briukhovetskyi). - 应用此补丁后,如果数据分区片段集合中存在另一个分区 ID 更高的分区,
hasPartitionId将返回 false。#97748 (Mikhail Artemenko) 。 - 修复读取 JSON 中进阶共享数据里的空 granule 时可能出现的崩溃问题。关闭 #97563。#97778 (Pavel Kruglov) 。
- 修复了因
DROP与INSERT之间的竞争条件,向Distributed执行INSERT时出现Cannot schedule a fileLOGICAL_ERROR的问题。#97822 (Azat Khuzhin). - 修复了在使用
tokenbf_v1跳过索引调用mapContainsKey/mapContainsKeyLike时,ClickHouse 服务端发生崩溃/断言的问题。#97826 (Shankar Iyer). - 修复了在
concatWithSeparator、format、IN子查询、GLOBAL IN以及带有运行时过滤器的连接中,复合类型 (Variant、Dynamic、Tuple) 内的LowCardinality引发的LOGICAL_ERROR异常。 #97831 (Raúl Marín). - 修复了这样一个问题:在多个 Distributed 表上使用
merge()表函数并配合GROUP BY时,若再使用ARRAY JOIN,会触发LOGICAL_ERROR异常Chunk info was not set for chunk in MergingAggregatedTransform。#97838 (Raúl Marín). - 修复了在高并发情况下,连接组达到硬限制时,HTTP 连接池析构函数中未捕获异常导致的服务器崩溃 (
std::terminate) 问题。将连接回收到连接池时,异常HTTP_CONNECTION_LIMIT_REACHED可能会从~PooledConnection中泄漏出来,进而导致SIGABRT。#97850 (Antonio Andelic). - 修复了在使用
grace_hash算法处理非等值连接时,若因连接结果大小受限而无法完整处理左侧块,导致结果错误的问题。#97866 (János Benjamin Antal). - 修复了在 #96686 中引入的 DeltaLake 元数据扫描性能问题。#97880 (Kseniia Sumarokova) 。
- 修复 ZooKeeper 客户端中 sendThread 与 receiveThread 之间的数据竞争问题。#97887 (Pablo Marcos) 。
- 修复了一个错误:此前无法在分布式 INSERT SELECT 中使用 CTE。这是 https://github.com/ClickHouse/ClickHouse/pull/87789 的后续修复。关闭 #95837。#97889 (Yarik Briukhovetskyi) 。
- 修复
CachedOnDiskReadBufferFromFile::readBigAt中的异常。关闭了 #97325。#97890 (Kseniia Sumarokova) 。 - 修复
Alias引擎在使用物化列时因列不匹配引发的LOGICAL_ERROR异常。关闭 #97907。#97921 (Kai Zhu). - 修复了在使用 Azure Blob Storage 且日志存储使用
s3_plain元数据时,Keeper 重启后数据丢失的问题。#97987 (Antonio Andelic). - 修复
sign函数在宽于Int8的整数类型上的 JIT 误编译问题——超出 -128..127 范围的值可能会产生错误的符号。 #98012 (Alexey Milovidov). - 修复了在读取使用列映射 "name" 模式且 struct 字段名中包含点号 (例如
STRUCT<`a.foo`: STRING, `b.foo`: STRING>) 的 Delta Lake 表时,出现DUPLICATE_COLUMN异常以及无提示返回 NULL 的问题。#98013 (Caio Ishizaka Costa). - 修复轻量级更新和二级索引后的 mutation 问题。#98044 (Raúl Marín) 。
- 修复了在混用主键和非主键跳过索引时,FINAL 查询结果错误的问题。#98097 (Raúl Marín).
- 对 scalar file() 和 DESCRIBE TABLE file() 强制执行 READ ON FILE 权限检查。#98115 (Nikolay Degterinsky) 。
- 修复了一处崩溃问题:使用 glob 模式查询文件时 (例如
file('dir/**', 'LineAsString')) ,如果目录中包含悬空符号链接,先前会抛出未处理的文件系统异常 (STD_EXCEPTION) 。现在会静默跳过悬空符号链接,查询将返回所有有效文件的结果。 #98143 (Mark Andreev). - 修复了在将外连接转换为内连接时,如果过滤表达式中使用
arrayJoin,查询计划优化期间发生段错误的问题。#98147 (Alexey Milovidov). - 修复了
ProtobufList格式因消息之间未重置读取状态而无法在 Kafka 引擎中正常工作的问题。#98151 (Alexey Milovidov). - 修复 analyzer_compatibility_join_using_top_level_identifier 与 ARRAY JOIN 中的逻辑错误,并关闭 #98164。#98179 (Vladimir Cherkasov).
- 在
aggregated_zookeeper_log中,将监视响应的Watch部分设为Watch,而不是留空。#98202 (Antonio Andelic). - 如果排序键未覆盖分区键列,那么分区剪枝可能会错误地跳过某些分区,而这些分区中包含的行本应在 FINAL 去重时"胜出"。#98242 (Yarik Briukhovetskyi).
- 修复在以常量数组参数调用
kql_array_sort_asc/kql_array_sort_desc时出现的逻辑错误 "Bad cast from type DB::ColumnConst to DB::ColumnArray"。#98251 (Alexey Milovidov) 。 - 修复了
ColumnConst::getExtremes中的越界访问问题;启用extremes = 1时,该问题可能导致崩溃。#98263 (Alexey Milovidov) 。 - 修复两个并发执行的
MOVE PARTITION操作在以相反方向处理同一对表时可能发生的死锁。#98264 (Alexey Milovidov) 。 - HTTP 服务器现在会在因标头格式错误而导致的 400 Bad Request 响应中,于响应体内返回错误消息,而不再返回空响应体。#98268 (Alexey Milovidov).
- 修复使用分散索引分析 (Experimental 功能) 和查询条件缓存时出现的错误结果。#98269 (Azat Khuzhin) 。
- 修复了在对数据跨过 65535 边界的键列执行
toDate转换时触发的 LOGICAL_ERROR 异常 "MergeTreeSetIndex中的二分查找结果无效"。#98276 (Alexey Milovidov) 。 - 修复在旧版连接步骤代码路径中,当
query_plan_join_swap_table优化交换包裹在 CROSS JOIN 中的 RIGHT JOIN 的顺序时触发的LOGICAL_ERROR异常。#98279 (Alexey Milovidov). - 在
DDSketch反序列化过程中对损坏数据进行校验,防止在读取已损坏的quantilesDD聚合函数状态时出现段错误、异常、无限循环和 OOM。#98284 (Alexey Milovidov) 。 - 修复在
arrayMap等 lambda 函数中引用外层查询中的关联列时出现的 LOGICAL_ERROR "Trying to execute PLACEHOLDER action" 问题。#98285 (Alexey Milovidov). - 修复了当
CASE表达式涉及materialize(NULL)或其他Nullable(Nothing)参数时,caseWithExpression中抛出逻辑错误异常的问题。#98290 (Alexey Milovidov) 。 - 修复在
merge表函数中过滤_table虚拟列时触发的 bad cast 异常。#98291 (Alexey Milovidov) 。 - 修复了偶发的去重失效问题:由于
blocks/与deduplication_hashes/ZooKeeper 目录的清理顺序不一致,重新插入的数据会被错误地判定为重复并去重。#98293 (Alexey Milovidov). - 修复了同时使用
ORDER BY ... WITH FILL和LIMIT BY时触发的异常。#98361 (Alexey Milovidov) 。 - 修复了将 Parquet/Arrow
Date列插入Enum列时出现的静默数据损坏问题——现在会正确拒绝不兼容的类型转换,而不是存储无效的枚举值。#98364 (Alexey Milovidov). - 修复将包含
Array列的 Arrow 文件读入具有Nested列的表时出现的异常。#98365 (Alexey Milovidov). - 修复了这样一个问题:如果在 mutation 完成前删除索引或投影,
MATERIALIZE INDEX和MATERIALIZE PROJECTIONmutation 会卡住。#98369 (Alexey Milovidov) 。 - 修复从
Nullable(Tuple(...))读取时的异常:当 Tuple 元素名称与 Nullable 的null子列重名时会触发该异常。#98372 (Alexey Milovidov) 。 - 修复将
Merge表 (封装Distributed表) 与另一张表连接时出现的异常:"Column ... query tree node does not have valid source node"。 #98376 (Alexey Milovidov). - 修复原生 V3 读取器中将 Parquet
Bool错误转换为FixedString的问题;此前会产生原始字节,而不是字符串形式。 #98378 (Alexey Milovidov). - 修复
tryGetColumnDescription,使其按父列类型筛选子列,与其他列查找方法保持一致。#98391 (Alexey Milovidov) 。 - 在 HTTP Basic Auth 中接受不带填充的 base64 凭据。某些 HTTP 客户端会省略
Authorization: Basic头中的末尾=填充,这此前会导致身份验证失败。#98392 (Amos Bird). - 修复了在合并 parts 后,由于 min-max 索引边界错误,导致带有
Nullable分区键列的分区剪枝结果不正确的问题。 #98405 (Amos Bird). - 修复了管道执行器中的一个罕见异常:当管道扩展与查询取消发生竞争时,可能触发
Received signal 6(仅在调试构建中) 。#98428 (Alexey Milovidov) 。 - 修复了在同时使用
count_distinct_optimization和QUALIFY子句时出现的 "Column identifier is already registered" 异常。 #98433 (Alexey Milovidov). - 修复将
IN/NOT IN与LowCardinality列参数一起使用时出现的异常 "cannot be inside Nullable type" (例如a NOT IN (b),其中a的类型为LowCardinality(String)) 。#98443 (Alexey Milovidov) 。 - 修复了
full_sorting_merge连接中的“管道卡住”异常:当FilterBySetOnTheFly优化与MergeJoinTransform形成循环依赖时,PingPongProcessor中会发生死锁。#98454 (Alexey Milovidov). - 修复在合并具有会删除所有行的生存时间 (TTL) 的 parts,以及具有常量
GROUP BY键的聚合投影时出现的LOGICAL_ERROR异常 "Projection 无法增加块中的行数"。#98458 (Alexey Milovidov) 。 - 修复了
CROSS JOIN与INNER JOIN USING一起使用时触发的逻辑错误异常。#98459 (Alexey Milovidov) 。 - 修复了当键参数为
Nullable时,dictGetOrDefault中空指针解引用的问题。#98460 (Alexey Milovidov). - 修复了这样一种情况下
DISTINCT查询中的异常:使用聚合投影时,materialize会导致查询与投影之间的LowCardinality类型不一致。#98462 (Alexey Milovidov). - 修复了在启用
join_use_nulls时,于包含 OUTER JOIN 的过滤表达式中使用arrayJoin会触发的 LOGICAL_ERROR 异常。#98464 (Alexey Milovidov). - 修复在使用并行副本和
optimize_aggregation_in_order时出现的逻辑错误异常 "副本决定以 WithOrder 模式读取,而不是以 ReverseOrder 模式读取"。 #98467 (Alexey Milovidov). - 修复了 ClickHouse Keeper 在处理
addWatch请求后断开 Java ZooKeeper 客户端会话的问题。Java 客户端期望在addWatch响应中收到一个 4 字节的ErrorResponse响应体,但 Keeper 发送的是空响应体,导致触发EOFException并断开会话。这会导致 Apache Curator 的CuratorCache以及任何使用持久 watches 的 Java 应用程序无法正常工作。修复了 #98079。#98499 (Antonio Andelic). - 修复了当跟随者宕机时,
zk_followers和zk_synced_followers这两个 Keeper 指标不会减少的问题。向mntr四字母命令中新增zk_learners和zk_synced_non_voting_followers指标。修复 #54173。#98504 (Antonio Andelic) 。 - 修复了
renameAndCommitEmptyParts中的 LOGICAL_ERROR 异常:在使用 MergeTree 事务时,TRUNCATE TABLE与OPTIMIZE TABLE并发执行可能会触发该异常。#98508 (Alexey Milovidov) 。 - 修复了 Keeper 安全 raft 端口忽略
openSSL配置中cipherList和dhParamsFile的问题,此前始终使用默认值,而不是用户指定的值。关闭 #51188。#98509 (Antonio Andelic) 。 - 修复了具有误导性的 Keeper 日志消息,例如 "Receiving request for session X took 9963 ms":其中报告的时间实际上是心跳间隔期间在
poll()中空闲等待所耗费的时间,而非操作本身的执行时间。修复了 #79026。#98510 (Antonio Andelic) 。 - 修复 read_in_order_use_virtual_row 与单调函数配合使用时导致结果异常的问题,关闭 #97837。 #98514 (Vladimir Cherkasov).
- 修复了在 MergeTree 表上配合
IN子查询使用PREWHERE时出现的LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in'问题。#98522 (Alexey Milovidov) 。 - 修复了 Keeper TCP 连接未响应关闭信号、导致服务器无法平滑关闭的问题。#98525 (Alexey Milovidov).
- 修复在启用
query_plan_convert_join_to_in且query_plan_merge_expressions = 0时出现的异常:"Sorting column wasn't found in the ActionsDAG's outputs"。#98526 (Alexey Milovidov) 。 - 修复了使用命名集合时 MongoDB 字典源失效的问题。解决了 #97840。#98528 (Pablo Marcos) 。
- 修复了参数替换后 Identifier 为空时触发的 LOGICAL_ERROR。#98530 (Pervakov Grigorii) 。
- 修复在同时使用
sort_overflow_mode = 'break'和窗口函数时出现的管道死锁问题。#98543 (Alexey Milovidov) 。 - 修复了 Buffer 引擎在追加新块过程中处理异常时的列回滚问题。旧逻辑可能导致列的内存状态损坏。#98551 (Pavel Kruglov) 。
- 修复了在使用 const
Dynamic或Variant列与NULL进行空安全比较 (<=>/IS NOT DISTINCT FROM) 时触发的异常Bad cast from type ColumnConst to ColumnDynamic。同时还修复了Dynamic/Variant与NULL进行IS DISTINCT FROM比较时始终错误地返回 0 的问题。#98553 (Alexey Milovidov). - 修复了文本索引与其他跳过索引配合使用时的问题。此前,当查询过滤条件同时使用文本索引和其他常规跳过索引时,可能会抛出诸如 "尝试获取不存在的 mark" 之类的逻辑错误。#98555 (Anton Popov) 。
- 修复逻辑错误 "TABLE_FUNCTION 不允许出现在表达式上下文中":当带有别名的表函数在同一查询作用域内多次出现时 (例如同时出现在
PREWHERE和QUALIFY子句中) 。#98557 (Alexey Milovidov) 。 - 修复了 PK 中包含表达式 (而非仅列) 时的分散索引分析问题 (否则会导致无法过滤远程副本上的冗余 granule) 。#98561 (Azat Khuzhin) 。
- 当某列的子列已在其他列的默认/别名表达式中使用时,禁止删除该列;并在执行
ALTER DROP COLUMN时,使用分析器处理默认表达式。#98569 (Nikita Mikhaylov) 。 - 修复了 HTTP 客户端在遇到不可重试错误 (包括
HTTP_CONNECTION_LIMIT_REACHED) 时仍错误重试 S3 请求的问题。 #98598 (Sema Checherinda). - 修复了使用 DateTime64 进行分区剪枝时出现的小数溢出问题。#98628 (Yarik Briukhovetskyi) 。
- 修复 JIT expression 编译中的两个错误:一是
nativeCast类型检查中的复制粘贴错误,导致整数到整数以及浮点数到浮点数的类型转换分支无法命中;二是向 LLVMPassBuilder传入了错误的nullptrTargetMachine,导致无法注册目标特定的优化 Pass。 #98660 (Alexey Milovidov) 。 - 修复了一个 RBAC 绕过漏洞:用户可通过指向 localhost 的
remote()、remoteSecure()、cluster()或clusterAllReplicas()对任意表执行DESCRIBE,且无需SHOW_COLUMNS特权。#98669 (pufit). - 修复在存在
JOIN的情况下,当非布尔表达式 (例如sin(col)) 同时用于WHERE和SELECT时,由于过滤器下推优化破坏共享 DAG 节点而导致的BAD_GET异常以及错误的查询结果。#98681 (Alexey Milovidov) 。 - 修复了在结合并行副本使用
read_in_order_through_join时出现的 LOGICAL_ERROR "副本决定以 Default 模式读取,而不是 WithOrder" 问题。#98685 (Alexey Milovidov). - 修复将
input表函数用作remote参数时出现的异常 "Bad cast from typeDB::TableFunctionNodetoDB::QueryNode"。#98694 (Alexey Milovidov) 。 - 修复因错误清理空的覆盖型数据分区片段而导致过期数据分区片段重新出现的问题。#98698 (Shaohua Wang).
- 修复了在
equals比较中布尔函数返回Variant类型时,LogicalExpressionOptimizerPass中发生的异常。#98712 (Alexey Milovidov) 。 - 修复
parseDateTimeBestEffort将以月份/星期前缀开头的单词错误解析的问题。关闭 #97965。#98742 (Pavel Kruglov) 。 - 修复在启用新 analyzer 时,对包含参数不同的 JSON 列 (例如
SKIP字段不同) 且带有引用 JSON 子路径的 ALIAS 列的表执行merge()表函数或Merge引擎查询时出现的UNKNOWN_IDENTIFIER异常。关闭 #97812。#98753 (Pavel Kruglov) 。 - 修复了在
View中使用Distributed存储时,分析器对optimize_skip_unused_shards优化的相关问题。#98754 (Nikolai Kochetov) 。 - 修复了通过
clickhouse-client中的--external传递的外部表无法按名称访问元组子列的问题 (例如,对Tuple(a UUID, b Int32)使用SELECT x.a) 。关闭 #96925。#98755 (Pavel Kruglov) 。 - 修复
reverseUTF8在无效 (截断的) UTF-8 输入时抛出异常的问题。#98770 (Alexey Milovidov) 。 - 修复了在 OR 条件带有 false 谓词 (即 or(x, 0)) 时,无法正确检测 set 跳过索引是否有用的问题。#98776 (Azat Khuzhin) 。
- 修复了一个
LOGICAL_ERROR异常 (removeUnusedColumns中的块结构不匹配) ;该问题可能会在使用FINAL+PREWHERE+ 常量WHERE表达式 + 与列无关的聚合函数 (如count()) 时发生。#98778 (Alexey Milovidov). - 使 ClickHouse 字典自动重载相关的
system.trace_log条目的查询 ID 不再为空。#98784 (Miсhael Stetsyuk). - 修复了一个崩溃问题:在
IDatabaseTablesIterator::table()调用中对系统表进行快照后,如果在后续迭代期间另一线程修改了这些表,我们可能会对在这期间创建的系统表解引用空指针。 #98792 (Grant Holly). - 修复
SYSTEM START REPLICATED VIEW无法唤醒刷新任务的问题。#98797 (Pablo Marcos) 。 - 修复在另一个连接中使用内部包含 JOIN 的
view()表函数时出现的“表名不一致”异常 (仅在使用旧分析器时) 。#98809 (Alexey Milovidov) 。 - 修复了通过 pending_signals 调整 RLIMIT_SIGPENDING 时的问题。 #98829 (Azat Khuzhin).
- 修复
loop与集群表函数组合使用时触发的异常。#98860 (Konstantin Bogdanov). - 具有多个连接键列的 LEFT ANTI JOIN 在
enable_join_runtime_filters=1(默认启用) 时返回了错误结果。#98871 (Alexander Gololobov) 。 - 修复了在分多个块读取数据时 (例如使用较小的
index_granularity时) ,WITH FILL STALENESS会生成多余填充行的问题。#98895 (Alexey Milovidov) 。 - 修复 "RPNBuilderFunctionTreeNode 有 A 个参数,却尝试获取索引 B 处的参数" LOGICAL_ERROR。#98900 (Azat Khuzhin) 。
- 修复了因分配失败后未回滚而导致的内存跟踪漂移、
nallocx(0)的未定义行为,以及全局峰值跟踪中的差一错误。将跟踪范围扩展至io_uring环形缓冲区。#98915 (Antonio Andelic) 。 - 禁止将位于用户路径之外的本地数据湖表附加到系统中,而不只是禁止创建这些表。#98936 (Daniil Ivanik).
- 修复了一个竞态条件:在使用
urlCluster或类似集群表函数的查询中,该问题可能导致出现 "ReadBuffer is canceled" 异常。#98955 (Alexey Milovidov) 。 - 修复了在传入
BFloat16类型参数时,金融函数 (financialNetPresentValue、financialInternalRateOfReturn等) 中触发的LOGICAL_ERROR异常。#98958 (Alexey Milovidov). - 修复在禁用查询计划表达式合并时 (query_plan_merge_expressions = 0 或 query_plan_enable_optimizations = 0) ,跳过索引 (以及主键条件) 未对 ALIAS 列生效的问题。 #98960 (Peng).
- 在异步插入时递增
InsertQueryProfileEvent 计数。关闭 #98626。#98962 (Narasimha Pakeer) 。 - 修复在调试构建中、当主键包含 NaN 浮点值时出现的 "Inconsistent KeyCondition behavior" 异常:使
accurateLess和accurateEquals按照 ClickHouse 排序顺序一致地处理 NaN。关闭 #98075。#98964 (Alexey Milovidov) 。 - SummingMergeTree 不再对 Bool (以及其他域类型) 的列求和。Bool 值会保持原样,而不是进行算术求和。#98976 (Yash ).
- 修复了在设置
optimize_const_name_size且enable_scalar_subquery_optimization= 0 时,查询远程分片时出现的 Scalar doesn't exist 异常。远程查询中,被替换为__getScalar引用的大常量未发送到分片,导致查询失败。#98979 (andriibeee). - 修复某些查询中的
NOT_FOUND_COLUMN_IN_BLOCK问题:这些查询包含GROUP BY以及带有逆向字典查找、Date/DateTime转换比较和元组比较的表达式。关闭 #98888。#98980 (Nihal Z. Miaji) 。 - 修复了在 MergeTree 引擎中将 version/sign/is_deleted 列修改为
EPHEMERAL或ALIAS时出现的未定义行为 (空指针解引用) 。现在,这类修改会被正确地拒绝。#98985 (Alexey Milovidov). - 修复了一个问题:
system.grants在access_object列中遗漏了URL和S3授权中的正则表达式参数。#98987 (DQ). - 修复了 Iceberg BigLake 读取相关问题:现在会将 ADC 凭据转发给 GCS S3 客户端 (修复 403 错误) ;发送前会先对 OAuth2 凭据进行 URL 编码 (修复包含特殊字符的令牌导致的身份验证失败) ;此外,命名空间遍历在遇到 BigLake HTTP 400 响应时也不再中止。#98998 (Nikita Fomichev) 。
- 修复了在
TZ环境变量使用 POSIX 文件路径语法时 (例如TZ=:/etc/localtime) ,clickhouse-client无法切换时区的问题。#99000 (Yash ). - 修复了在
FixedString列上使用startsWith、LIKE、NOT LIKE时出现错误或剪枝不足的问题。此外,当在键列外层包裹从FixedString到String的类型转换函数时,现在也可以对 granules 进行剪枝。关闭了 #98940。#99001 (Nihal Z. Miaji) 。 - 修复了
windowFunnel在遇到重复事件时使用strict_deduplication会返回错误级别的问题。#99003 (Yash ) 。 - 修复了一个 bug:在子查询中,EXISTS 会忽略 LIMIT 和 OFFSET 子句,导致当子查询因 offset 或 limit 为 0 而未返回任何行时,结果不正确。关闭了 #88722。#99005 (andriibeee) 。
- 修复在
GROUPING SETS中,过滤器下推优化遇到会短路为常量的 AND 表达式时触发的“块结构不匹配”异常。#99010 (Alexey Milovidov). - 修复了在查询计划中读取不带
_part_offset列的补丁分区片段 (轻量级更新) 时触发的异常。 #99023 (Alexey Milovidov). - 像
SELECT * FROM table WHERE pk_id = ''这样的查询,如果pk_id是String类型的主键,现在会正确使用主键索引来过滤 granules。#99027 (Shankar Iyer) 。 - 修复了 Kafka 引擎中的
DEPENDENCIES_NOT_FOUND异常:在后台线程流式传输数据时分离 materialized view 会触发该异常。#99028 (Alexey Milovidov). - 修复了创建表时出现的异常:表中包含与虚拟列 (例如
_part_offset) 同名的EPHEMERAL列。#99031 (Alexey Milovidov). - 修复了通过带有 glob 模式的
url()表函数读取不存在的压缩文件时,出现具有误导性的 "inflate failed: buffer error" 报错的问题。现在,启用http_skip_not_found_url_for_globs后,会按预期返回空结果。#99034 (Alexey Milovidov). - 修复在 schema 修改 (例如 ADD COLUMN) 后,对补丁 part 执行
ALTER TABLE ... DROP PART时触发的服务器崩溃 (std::terminate) 问题。该崩溃是由于空覆盖 part 的元数据中缺少系统列 (_part) ,从而导致在NOEXCEPT_SCOPE内部抛出未捕获的异常。#99036 (Peng). - 如果在缓存磁盘读取期间因抛出内存限制超出异常,ClickHouse 服务端进程可能会崩溃。该问题现已修复。#99042 (Shankar Iyer) 。
- 修复了在使用
dictGet查询同时具有 ROW POLICY 和 ALIAS 列的表时出现的LOGICAL_ERROR。该问题是由于新 analyzer 在解析 ALIAS 列期间过早访问表表达式而导致的。#99065 (Peng). - 修复了这样一种越界错误:当用户尝试仅查询使用 Avro 格式存储数据的 Iceberg 表中的虚拟列时,会触发该错误。这种情况极为罕见,因此未将其标记为严重问题。修复了 #88238。#99080 (alesapin) 。
- 修复递归 CTE 中使用
remote()+view()时出现的段错误。#99081 (Konstantin Bogdanov) 。 - 应用按顺序读取优化时,跳过不必要的额外索引分析。#99084 (Vladimir Cherkasov) 。
- 修复了在应用补丁 part 时因抛出内存限制异常而导致的崩溃。#99086 (Anton Popov).
- 修复了
DDLWorker中的调试断言问题:在重新初始化恢复过程中删除 ZooKeeper 条目后,遗留的first_failed_task_name会触发该问题。 #99099 (Antonio Andelic). - 修复了在带有生存时间 (TTL) 的合并期间重建文本索引的问题。#99107 (Anton Popov).
- 修复 Iceberg 表引擎执行
ALTER TABLE ... REMOVE SETTINGS查询时发生崩溃的问题。修复了 #86330。#99108 (alesapin) 。 - 修复了
query_plan_convert_any_join_to_semi_or_anti_join优化中的一个缺陷,该缺陷会导致不匹配的行返回错误结果。相关:https://github.com/ClickHouse/ClickHouse/pull/95995。 #99112 (Yarik Briukhovetskyi). - 修复
ASTColumnsExceptTransformer::transform中的 LOGICAL_ERROR 异常。#99119 (Pablo Marcos) 。 - 修复了一个 RBAC 绕过问题:用户可在不具备所需源访问特权的情况下,通过表函数 (
mysql()、postgresql()、sqlite()、arrowFlight()、jdbc()、odbc()等) 上的DESCRIBE TABLE或CREATE TABLE AS获取表结构。对于会从远程服务器推断 schema 的函数,这还允许在未经授权的情况下触发出站连接 (SSRF) 。#99122 (pufit) 。 - 修复 Keeper 在动态重配置和领导权移交期间崩溃 (NuRaft 中的段错误) 的问题。 #99133 (JIaQi Tang).
- 修复了在目标端不支持
SAMPLE时,使用带有SAMPLE的 Buffer 表会发生崩溃的问题。#99141 (Kseniia Sumarokova). - 修复了因补丁分区片段列顺序不一致而导致的 LOGICAL_ERROR。 #99164 (Pablo Marcos).
- 修复了一个极其罕见的崩溃问题:当 Iceberg 表包含混合格式 (ORC 和 Parquet) 的文件时,可能会发生崩溃。修复 #88126。#99168 (alesapin) 。
- 修复在备份/恢复时未应用 max_execution_time 的问题。#99205 (Kseniia Sumarokova) 。
- 修复了在未使用
ORDER BY ALL的INSERT SELECT查询中,insert_deduplication_token被静默忽略的问题。此前,对于未排序的INSERT SELECT,去重会被完全禁用,即使提供了显式的用户标记也不例外。现在,无论是否使用ORDER BY ALL,只要提供insert_deduplication_token就足以启用去重。#99206 (Desel72). - 修复了
InverseDictionaryLookupPass优化期间过多的访问检查:在该 pass 开始前仅检查一次CREATE_TEMPORARY_TABLE权限,而不是对每个访问到的节点都进行检查。#99210 (Mikhail Artemenko). - 修复
clickhouse format --obfuscate在混淆跳过索引类型、压缩编解码器名称、数据库引擎名称以及字典布局/来源定义时生成无效 SQL 的问题。#99260 (Raúl Marín) 。 - 修复了一个问题:在某些情况下,
Time[64]与DateTime[64]类型之间的比较行为容易引起混淆;现在,遇到这类情况时,会通过添加日期部分1970-01-01,将Time[64]值提升为DateTime[64]。#99267 (Yarik Briukhovetskyi) 。 - 收紧 DDL worker 中分布式 DDL 查询的设置约束。#99317 (Pablo Marcos) 。
- 修复 TOTP 身份验证中的一些小问题:
--one-time-passwordCLI 选项在密码为空时的处理,以及对<digits>和<period>配置值的校验。#99322 (Vladimir Cherkasov). - 修复了 Avro 输出格式中的逻辑错误
unordered_map::at: key not found:序列化Enum8/Enum16列时,如果值不在枚举定义中,就会触发该错误。#99332 (Desel72). - 修复了在包含 Dynamic 的 Tuple 中使用稀疏序列化时
CHECK TABLE的问题。关闭了 #96588。#99351 (Pavel Kruglov). - 修复了对텍스트 인덱스预处理器的验证过于严格的问题。#99359 (Anton Popov) 。
- 修复带有隐式 minmax 索引的复制表从 25.10 升级到更新版本时的兼容性问题。#99392 (Raúl Marín).
- 在文本索引分析中,已移除对否定函数 (
notEquals、notLike、notIn) 的支持。这些函数本来就无法跳过任何 granules,因此为它们分析索引只会增加额外开销,而没有任何收益。#99393 (Anton Popov). - 修复了在 IN 子查询中使用
Distributed表时,新分析器无法正确处理optimize_skip_unused_shards的问题。#99436 (Nikolai Kochetov) 。 - 修复了当查询产生重复列名时,
INTERSECT/EXCEPT中的 heap-use-after-free 问题。#99471 (Alexey Milovidov) 。 - 修复了在将带类型的查询参数作为 part 名称使用时,
ALTER TABLE ... DROP PART中的逻辑错误。#99489 (Alexey Milovidov) 。 - 修复了在通过别名同时于
SELECT和WHERE子句中引用文本索引谓词 (例如hasAllTokens) 时触发的NOT_FOUND_COLUMN_IN_BLOCK异常。#99504 (Anton Popov) 。 - 修复在对具有各自独立文本索引的多列跨列使用 OR 时,
hasAllTokens返回错误结果的问题。#99505 (Anton Popov). - 在
clickhouse-local中初始化 page cache,以使page_cache_max_size设置生效。#99510 (Alexey Milovidov) 。 - 修复了一个罕见问题:在执行
DETACH/ATTACH TABLE查询后,数据分区片段会被误标为损坏,并被分离。 #99529 (Anton Popov). - 修复了通过 HTTP 接口使用 Pretty 格式查询空系统表时触发的
std::length_error异常。 #99541 (Alexey Milovidov). - 修复了在使用
ALTER TABLE ADD COLUMN创建与虚拟列同名的EPHEMERAL列 (例如_part_offset) 时触发的LOGICAL_ERROR。 #99549 (Alexey Milovidov). - 修复因缓存键不匹配导致
VectorSimilarityIndexCache条目在 part 移除后始终不会被逐出的问题。#99575 (Seva Potapov). - 禁止从本地文件中读取 Google 凭据。此设置存在安全风险,因为一旦知道文件路径,就可能读取其他凭据。#99584 (Konstantin Vedernikov) 。
- 修复分析器中的性能劣化问题。裁剪 ARRAY JOIN 中未使用的列。#99587 (Dmitry Novik) 。
- 修复了在已存在轻量级删除和行策略的表中读取텍스트 인덱스时的问题。 #99661 (Anton Popov).
- 修复 Parquet 读取器中的 nullptr 解引用问题:当解码器中的过滤路径遇到已过滤掉的页面时,会触发该问题。关闭 #99676。#99677 (Alexey Milovidov) 。
- 修复了 AsynchronousReadBufferFromFileDescriptor 在使用 O_DIRECT 时错误的 seek。关闭 #99358。#99678 (Pavel Kruglov) 。
- 修复了解压格式错误的压缩数据时,
CompressionCodecT64中的 heap-buffer-overflow 和CompressionCodecMultiple中的进程异常终止问题。这两个问题均由新的 libFuzzer 目标发现。现在这些编解码器会抛出异常,而不是发生崩溃。#99680 (Rahul). - 将处理推迟到服务器完成所有表加载之后。#99700 (Seva Potapov) 。
- 修复 MySQL 字典源在内联 DDL 参数下绕过
RemoteHostFilter的问题。#99720 (Shaohua Wang) 。 - 修复遍历
system.tables中数据湖表时的逻辑错误。#99739 (Konstantin Vedernikov) 。 - 修复了带有预处理器的文本索引在分析使用
IN函数的谓词时的问题。修复了文本索引中搜索标记发生冲突的问题,这可能导致结果错误。#99755 (Anton Popov) 。 - 修复读取形状维度为负数的
Npy格式文件时出现无限循环的问题。#99812 (Desel72). - 修复了在计算查询计划头部信息时,
CRC32函数以零行对FixedString参数求值时出现的 global-buffer-overflow。 #99835 (Alexey Milovidov). - 修复在 Iceberg 表上执行
ALTER TABLE ... MODIFY COLUMN ... COMMENT时因空指针解引用导致的崩溃。#99838 (Desel72) 。 - 修复
aggregate_functions_null_for_empty设置,使其适用于返回非Nullable类型 (如Array或Map) 的聚合函数 (例如groupArray、sumMap) 。#99839 (Alexey Milovidov) 。 - 修复了以混合有符号/无符号整数类型调用
midpoint函数时触发的 LOGICAL_ERROR 异常。#99867 (Alexey Milovidov). - 修复了以下情况下查询中出现的“Block structure mismatch”异常:HAVING 子句的过滤表达式同时包含被会产生 NULL 的函数包裹的聚合以及
materialize(0)。#99915 (Alexey Milovidov) 。 - 修复了
sipHash128Keyed(以及类似的带键哈希函数) 中的断言失败问题:当数据参数为键中包含数组或其他嵌套数组类型的 Map 时,会触发该问题。#99921 (Alexey Milovidov). - 修复了使用
convertAnyJoinToSemiOrAntiJoin优化查询计划时,IN函数中的LOGICAL_ERROR异常 "Not-ready Set"。 #99939 (Alexey Milovidov).
构建/测试/打包改进
- 通过移除重量级头文件引用,并将高开销的模板实例化移出头文件,缩短编译时间。#97893 (Raúl Marín).
- 通过缩减模板分派矩阵并移除重量级引用,缩短算术函数及相关头文件的编译时间。#98204 (Raúl Marín).
- 使用
mongo-c-driver2.2.2。#98304 (Konstantin Bogdanov). - 使用
postgresREL_18_3。#98306 (Konstantin Bogdanov). - 为 UBSan 构建启用 jemalloc 分配器,以避免因 glibc malloc 内存回收能力较差而导致 RSS 持续累积。#98444 (Alexey Milovidov).
- 使用 Rust v0 符号修饰,并从 PRQL 库中剥离内部符号,以减少解析器组合子库导致的符号名膨胀。#98446 (Alexey Milovidov).
- 向
tests/benchmarks添加 TPC-H 基准测试套件和 TPC-DS README。#98495 (Raufs Dunamalijevs). - 为全部 99 个 TPC-DS 查询添加正确性测试。#99204 (Raufs Dunamalijevs).
- 添加一个用于复现离线副本 bug 中 DDL CREATE TABLE + ALTER 问题的集成测试 (#44070) ,并将其标记为预期失败。#99259 (Raufs Dunamalijevs).
- 集成带有
je_前缀的 jemalloc,并移除对链接器 --wrap 的使用。#99342 (Azat Khuzhin).
ClickHouse 发布 26.2,2026-02-26。 演示, 视频
不兼容变更
- 默认情况下,所有插入都会开启去重。此前,异步插入和 MV 默认关闭去重,而同步插入默认开启。此更改的目标是让这两种插入方式使用相同的默认值。如果你在集群上显式禁用了去重,则必须显式设置
deduplicate_insert='backward_compatible_choice'以保持旧行为。deduplicate_blocks_in_dependent_materialized_views也是如此。#95970 (Sema Checherinda). - 优化了统计信息的存储格式。现在,所有统计信息都存储在单个文件中。#93414 (Anton Popov) 。如果你未显式启用表统计信息,可忽略此项。
- 限制 S3(Azure)Queue 的内存元数据。系统表已从
azure_queue重命名为azure_queue_metadata_cache,并将system.s3queue重命名为s3queue_metadata_cache。#95809 (Kseniia Sumarokova) 。 - 此前,将函数应用于
Variant列时,如果变体子类型与函数不兼容,会静默返回 NULL;现在则会抛出异常,这可能导致依赖这种静默 NULL 行为的查询失效。#95811 (Bharat Nallan). - 来自 PostgreSQL 的
DATE列现在在 ClickHouse 中会被推断为Date32(在之前的版本中会被推断为Date,这会导致超出较小范围的值发生溢出) 。现已允许将Date32值插入回 PostgreSQL。关闭 #73084。#95999 (Alexey Milovidov). do_not_merge_across_partitions_select_final设置的语义现在更加清晰。此前,如果未在配置中显式设置该参数,此功能可能会被自动启用。这一行为反复引发困惑,而且遗憾的是,还导致了生产环境中的一些问题。现在规则更简单了:do_not_merge_across_partitions_select_final=1会无条件启用该功能。如果do_not_merge_across_partitions_select_final=0,则仅在新设置enable_automatic_decision_for_merging_across_partitions_for_final=1时才会使用自动决策,否则不会使用。为尽可能保留旧行为,默认值设为do_not_merge_across_partitions_select_final=0和enable_automatic_decision_for_merging_across_partitions_for_final=1。#96110 (Nikita Taranov) 。- 现在,在创建显式指定列的 S3 表时,ClickHouse 会验证这些列名是否确实存在于远程 File 的 schema 中。此前使用不匹配列名时仍可正常运行的查询,现在会在建表时失败。这解决了 #96089。#96194 (Konstantin Vedernikov) 。
- 禁止在 ORDER BY 及其他表键表达式中使用子查询。 #96847 (Alexey Milovidov).
- 默认启用
apply_row_policy_after_final。最初,当optimize_move_to_prewhere_if_final=0时,ROW POLICY 和 PREWHERE 都遵循 FINAL,并在 FINAL 之后应用。这一行为被 #87303 破坏了:该变更在 ROW POLICY 过滤条件中忽略了optimize_move_to_prewhere_if_final。为修复此问题,此 PR 启用了在 #91065 中引入的设置apply_row_policy_after_final。启用apply_row_policy_after_final后,ROW POLICY 将继续像之前一样默认遵循 FINAL。此 PR 是一项不兼容变更,因为它改变了optimize_move_to_prewhere_if_final=1时的行为。现在,若要让 ROW POLICY 在 FINAL 之前应用,应使用apply_row_policy_after_final,而不是optimize_move_to_prewhere_if_final。#97279 (Nikolai Kochetov) 。 Date类型现在在 Arrow/ArrowStream 格式中会序列化为 Arrow 原生的date32类型,而不再是uint16。PyArrow 等工具现在会正确地将该列识别为日期类型。旧行为可通过output_format_arrow_date_as_uint16设置恢复。对于旧版 Arrow File (其中Date列使用uint16) ,仍然支持读取。#96860 (Alexey Milovidov) 。
新特性
- 用户现在可以直接在 ClickHouse 中使用 ClickStack (一款可观测性 UI) ,这对调试和本地开发很有帮助。#96597 (Aaron Knudtson) 。
- 支持将基于时间的一次性密码 (TOTP) 作为身份验证方式。#71273 (Vladimir Cherkasov) 。
- 添加
lazy_load_tables数据库设置。启用后,表不会在数据库启动时加载——而是改为创建一个轻量级的StorageTableProxy,并在首次访问时才实例化实际的表引擎。#96283 (xiaohuanlin). - 新增了
input_format_max_block_wait_ms设置,以便在达到超时时间时输出数据块,并允许在 HTTP 连接意外关闭时继续处理剩余数据。#94509 (Mostafa Mohamed Salah). - Google BigLake 目录集成。#95339 已关闭。#97104 (Konstantin Vedernikov) 。
- 新增系统表
system.tokenizers,用于显示所有可用的 tokenizer。#96753 (Robert Schulze) 。 - 新增系统表
system.user_defined_functions,用于监控 UDF 导入状态及配置。#90340 (Xu Jia) 。 - 新增了
system.jemalloc_stats表,通过malloc_stats_print暴露 jemalloc 内存分配器的统计信息,用于诊断使用 jemalloc 构建的服务器上的内存使用情况。还在 ClickHouse HTTP 接口中新增了/jemalloc.htmlHTTP 端点,用于对这些统计信息进行交互式可视化。#97077 (Antonio Andelic). - 新增
system.jemalloc_profile_text表,用于读取和分析 jemalloc 堆 profile。输出格式由jemalloc_profile_text_output_format设置控制 (raw、symbolized 或 collapsed;默认值为 collapsed) 。内联帧解析由jemalloc_profile_text_symbolize_with_inline控制 (启用时会包含内联帧,但会降低符号化速度;禁用时会跳过内联帧,以加快输出) 。对于 collapsed 格式,jemalloc_profile_text_collapsed_use_count控制栈是按存活分配 count (true) 还是按存活字节数 (false,默认值) 加权。这使得对 jemalloc 堆 profile 进行内存分析和火焰图可视化更加方便。修复了 #93248。#97218 (Antonio Andelic) 。 - 添加
default_dictionary_database设置,使 ClickHouse 能够在指定的默认数据库中解析未带数据库限定符的外部字典引用。这简化了从 XML 定义的全局字典迁移到 SQL 定义的按数据库划分字典的过程,从而使现有的字典查询 (例如dictGet('name', …)) 无需修改即可继续工作。#91412 (Dmitrii Plotnikov) 。 - 支持为
DatabaseReplicated配置辅助 ZooKeeper。#91683 (RinChanNOW). - 实现新的表函数
primes和新的系统表system.primes,其中包含按升序排列的质数。关闭 #90839。#92776 (Nihal Z. Miaji) 。 - 异步插入支持并行 quorum。已插入的数据会复制到 quorum 副本。如果发现重复项,查询会等待先前已插入的数据也完成复制。#93356 (Sema Checherinda).
- 新增了 functions
colorOKLABToSRGB、colorSRGBToOKLAB,用于在 sRGB 与 OKLAB 之间相互转换值。#93361 (Pranav Tiwari) 。 - 新增
deduplicate_insert设置,用于覆盖insert_deduplicate和async_insert_deduplicate。#94413 (Sema Checherinda) 。 - 服务器设置
insert_deduplication_version支持迁移到统一的去重哈希。#95409 (Sema Checherinda). - 新增
xxh3_128哈希函数。#96055 (Raúl Marín) 。 - 新增了
OPTIMIZE <table> DRY RUN PARTS <part names>查询,可在不提交结果 part 的情况下模拟合并。这在测试场景中可能很有用:验证新版本中的合并正确性、确定性复现与合并相关的 bug,以及可靠地对合并性能进行基准测试。#96122 (Anton Popov) 。 - 新增一项默认启用的检查,可通过设置
check_named_collection_dependencies防止删除被表使用的命名集合。#96181 (Pablo Marcos) 。 - 新增了
system.fail_points,用于检查服务器中现有的 failpoint 及其是否已启用。这将有助于实现测试自动化。#96762 (Pedro Ferreira). - 为 Glue 目录添加基于角色的访问控制。使用设置
aws_role_arn,并可选使用aws_role_session_name。#90825 (Antonio Andelic). - 新增设置
add_minmax_index_for_temporal_columns;启用后,会自动为所有Date、Date32、Time、Time64、DateTime和DateTime64列创建 minmax 索引。#93355 (Michael Jarrett) 。 - 支持 JOIN 的扩展表别名 (例如
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b这样的查询) 。已关闭 #95131。#95331 (Yarik Briukhovetskyi) 。 - Iceberg 表新增支持
ALTER TABLE RENAME COLUMN。此前仅支持ADD COLUMN, DROP COLUMN, and MODIFY COLUMN。#97455 (murphy-4o) 。
实验性功能
- 文本索引现已 GA。#96794 (Robert Schulze).
- 用于量化位打包向量存储 (用于近似最近邻搜索) 的
QBit数据类型现已一般可用,且不再需要启用实验性设置。#95358 (Raufs Dunamalijevs). - ClickHouse 中的向量搜索现在可以使用集群中的副本来_分担_向量索引 parts 的负载并执行搜索。这使 ClickHouse 能够支持超出单台 VM 内存容量的大型向量索引。#95876 (Shankar Iyer).
- 新增由
ast_fuzzer_runs和ast_fuzzer_any_query设置控制的服务端 AST fuzzer。启用后,服务器会在每个查询正常执行后,对其运行随机变更版本,并丢弃结果。#97568 (Alexey Milovidov). - 在实验性的 KQL 方言中新增
iif函数。#94790 (happyso). - schema 推断 现已遵循
allow_experimental_nullable_tuple_type。启用后,它允许推断出的元组类型为Nullable(Tuple(...)),这样缺失的嵌套对象可以变为NULL,而不是变成由NULL元素组成的元组。#95525 (Nihal Z. Miaji). use_statistics_cache设置现已默认启用,因此列统计信息会缓存在内存中,以加快查询优化速度,而无需从每个分区片段重新加载。#95950 (Han Fei).
性能优化
- 允许使用主键中的任意确定性表达式来进行数据跳过 (例如
ORDER BY cityHash64(user_id)/ORDER BY length(user_id)) 。对于确定性表达式,ClickHouse 可以将该表达式应用到查询中的常量上,并在主键索引中使用结果来处理=、IN和has等谓词。如果该表达式还是单射的 (例如ORDER BY hex(p)或ORDER BY reverse(tuple(reverse(p), hex(p)))) ,则索引也可有效用于其否定形式:!=、NOT IN和NOT has。已关闭 #10685。已关闭 #82161。#92952 (Nihal Z. Miaji) 。 - 优化了统计信息的存储格式。现在,所有统计信息都存储在单个文件中。#93414 (Anton Popov) 。
- 支持对文件系统缓存中的远程表引擎/函数进行并行读取。 #71781 (Kseniia Sumarokova).
- 允许在本地 File 和对象存储表函数中使用用户态页面缓存。#77874 (Michael Kolupaev) 。
- 避免用户态页面缓存中不必要的 memcpy。#77884 (Michael Kolupaev).
concurrent_threads_scheduler的默认值现已由fair_round_robin改为max_min_fair。通过优先处理分配槽位较少的查询,这项更改提升了高负载下的公平性,从而避免短时运行的查询因长时间运行的查询而受到不利影响。#95300 (Sergei Trifonov).- 如果
FINAL查询使用主键条件进行筛选,并对其他条件使用 skip 索引,PrimaryKeyExpand处理步骤现在将只检查初步筛选出的主键范围是否存在交集。#94903 (Shankar Iyer). - 当并行副本与
s3(...)等表函数配合使用时,若查询中只有一个封装该表函数的子查询,现在也会自动在各副本间并行执行;而此前只有直接引用表函数的查询才会并行执行。关闭 #92264。#96332 (phulv94). - 支持将 cache 中的数据和系统 File 在缓存中拆分为独立段。#87834 (MikhailBurdukov).
- 通过为
ColumnVector::replicate实现动态分派,加速部分哈希连接操作。#79573 (Raúl Marín) 。 - 复杂谓词场景下并行 hash join 的性能提升。此前,未 join 的行仅由单个线程处理,这并不理想;此次优化旨在将未 join 行的处理并行化到多个线程中。可通过
parallel_non_joined_rows_processing设置进行切换。默认启用。 #92068 (Yarik Briukhovetskyi). - 小幅优化 JSON 类型的解析。#93614 (Pavel Kruglov) 。
- 优化 AST 的内存占用。在未使用高亮且不进行 VALUES 解析时,此项优化是合理的。#93974 (Ilya Yatsishin).
- 优化具名 Tuple AST 对象的内存占用。将列名以字符串形式存储在 tuple 对象中,而不是存放在通用 AST 字面量节点中。#94704 (Ilya Yatsishin) 。
- 通过增加额外的链接器选项,改进了去虚拟化效果。#94737 (Nikita Taranov) 。
- 通过对 ZooKeeper 请求进行批处理,提升拥有大量 parts 的 ReplicatedMergeTree 表的副本克隆性能。#94847 (c-end) 。
- 当读取步骤中已有 PREWHERE 过滤器时,就无法再添加新的过滤器。此次变更将 PREWHERE 优化推迟到 JOIN 运行时过滤器优化之后,以便也能将运行时过滤器下推到 PREWHERE。#95838 (Alexander Gololobov) 。
- 通过在 x86 上使用动态分派,加快
T64codec 压缩速度。 #95881 (Raúl Marín). - 在可能的情况下 (非 null、非
-If、无 GROUP BY、无 IPv6 或 String) ,通过批次插入加快数值类型上uniq的执行速度。#95904 (Raúl Marín) 。 - Keeper 的底层优化:
ZooKeeper::observeOperations已被发现占 ZooKeeper 接收线程 CPU 消耗的 >20%。此变更通过以下方式解决该问题:1. 对于AggregatedZooKeeperLog::stats,使用CityHash64替代SipHash,前者速度快 >10 倍。2. 对于Coordination::ErrorCounter,使用std::array<std::atomic<UInt32>, N>替代std::unordered_map和std::mutex。#95962 (Miсhael Stetsyuk) 。 - 取消 ProfileEvents::Counter 的 64 字节对齐,以节省内存。#96097 (Azat Khuzhin) 。
- 内存优化:将
CachedOnDiskReadBufferFromFile结构体大小缩小 50 倍。#96098 (Azat Khuzhin) 。 - 如果 hash table 为空,扩容时不要复制旧数据。#96180 (Raúl Marín) 。
- 为
RIGHT OUTERJOIN 提供 JOIN 运行时过滤器支持。#96183 (Hechem Selmi) 。 - 优化项
enable_join_runtime_filters现已默认启用。#89314 (Alexey Milovidov) 。 - 此前,文本索引直接读取优化仅在所有 parts 都具有已物化的文本索引时才会应用。此 PR 增加了部分支持:如果某些 parts 具有已物化的文本索引,这些 parts 将使用它,而没有已物化文本索引的 parts 则会回退到执行原始过滤表达式。#96411 (Anton Popov).
- 在系统日志表的时间列上添加了
minmax次级索引,并在query_id/initial_query_id列上添加了bloom_filter索引,以加快过滤。#96712 (Alexey Milovidov) 。 - 现在,lazy materialization 优化已应用于
UNION ALL查询的所有分支,而不再仅限于第一个分支。对于通过UNION ALL组合来自不同MergeTree表的多个已排序且数量受限的读取操作的查询,现在每个分支都能受益于延迟列读取,从而减少 I/O。#96832 (Federico Ginosa) 。 - 通过移除一次不必要的数据复制,并为数值列启用向量化的最小/最大值计算,优化了 INSERT 期间 minmax 跳过索引的计算。#97392 (Raúl Marín) 。
- 存储
DeltaLake现在会从 delta lake 元数据中获取count()的结果,并在 system.tables 中显示正确的表统计信息 (总字节数/总行数) 。#96190 (Kseniia Sumarokova). - 如果是从 MergeTree 读取,未使用的列也会在读取步骤中被删除。当过滤条件被下推到
PREWHERE时,这一优化尤其有用。#89982 (János Benjamin Antal). - 优化了
SHOW TABLES查询的处理:仅获取表名,并改进了 getLightweightTablesIterator,使其返回仅包含表名的结构。解决了 #93835。#94467 (Smita Kulkarni) 。 - 改进
assumeNotNull、coalesce、ifNull,使得当键列被这些函数包裹时,范围谓词也能启用主键和跳数索引裁剪。关闭 #94689。#94754 (Nihal Z. Miaji) 。 - 为 Keeper 的 getChildren 请求添加 with_data 和 with_stat 扩展。这样一来,一次操作即可不仅获取子节点列表,还能获取其
stat和/或data。#94826 (Nikolay Degterinsky) 。 - 无论最终执行的是本地计划还是包含并行副本的计划,索引分析通常都只需执行一次。#94854 (Nikita Taranov) 。
- 支持根据 parts 的数量 (
distributed_index_analysis_min_parts_to_activate) 和索引大小 (distributed_index_analysis_min_indexes_size_to_activate) 启用分布式索引分析。#95216 (Azat Khuzhin). - 为 Iceberg 表启用 PREWHERE 优化。#95476 (Konstantin Vedernikov) 。
- 降低部分 AST 类的内存占用。#95514 (Raúl Marín) 。
- 限制在启用
split_intersecting_parts_ranges_into_layers时生成的管道流数量,以避免内存占用过高。#96478 (Nikita Taranov) 。 - 为多个 join 实现等价 Set 优化。包含多个连续
INNER JOIN操作的查询现在可受益于改进后的过滤条件下推优化。当表在等价列上进行连接时 (例如,t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10) ,应用于该链中任意表的过滤条件都会自动下推到所有表。关闭 #96550。#96596 (Vladimir Cherkasov) 。 - 优化 delta lake 元数据扫描。采用了 delta-kernel PR https://github.com/delta-io/delta-kernel-rs/pull/1827 中的更改。#96686 (Kseniia Sumarokova) 。
- 在 Replicated database 中,不要针对每个 dummy 查询都更新已缓存的集群。#96897 (Tuan Pham Anh).
- 如果前缀仅包含 ASCII 字符,则在使用
startsWithUTF8进行过滤时可使用主键索引。#97055 (vkcku) 。
改进
- 为 Keeper 请求添加 OpenTelemetry 追踪。#91332 (Miсhael Stetsyuk) 。
- 新增配置选项:
logger.startup_console_level和logger.shutdown_console_level,分别用于在 ClickHouse 启动和关闭期间覆盖控制台日志级别。#95919 (Garrett Thomas) 。 - 重新加载配置时,遵循命令行覆盖参数。关闭 #80294。#80295 (Alexey Milovidov) 。
- 允许在
mongodb表函数中通过键值对覆盖命名集合参数。#89616 (vanchaklar) 。 - 针对 Iceberg 表的按顺序读取优化现在可与
icebergBucket和icebergTruncate等复杂排序函数配合使用,而不再仅限于简单的列引用。#90256 (Konstantin Vedernikov) 。 - 在 system.mutations 中新增一个名为 parts_postpone_reasons 的列,以改进诊断,显示 parts 被延后的原因。#92206 (Shaohua Wang) 。
- 跟踪
DataflowStatisticsCache中待读取行数的变化 (由插入/删除或查询条件缓存的使用导致) 。 #93636 (Nikita Taranov). - 支持
SYSTEM RESET DDL WORKER [ON CLUSTER]查询。该查询会请求重置 DDLWorker 主线程中的状态。当主机 ID 更新时,这有助于刷新副本的活跃状态。#93780 (Tuan Pham Anh). system.part_log现已为MUTATE_PART和MUTATE_PART_START事件类型支持mutation_ids。 #93811 (Shaohua Wang).- 后台操作 (Mutate、Merge) 现在可以通过 'background' profile 单独配置。此前,这类操作通过 'default' profile 与常规查询共享 settings。#93905 (Arsen Muk) 。
- 为
system.crash_log增加更多信息。#94112 #95857 (Miсhael Stetsyuk) 。 - 新增了
QueryNonInternal指标,用于跟踪正在执行的非内部查询数量。该指标以ClickHouseMetrics_QueryNonInternal形式暴露,可帮助运维人员针对仅适用于非内部查询的max_concurrent_queries限制监控查询并发度。#94284 (Ashwath Singh) 。 - 支持在
RuntimeDataflowStatisticsCacheUpdater中收集来自 compact parts 的列输入字节统计信息。#94626 (Nikita Taranov) 。 - 新增一项检查,用于检测会导致集群组建失败的 Keeper 配置错误。关闭了 #60932。#94682 (Konstantin Bogdanov) 。
- 改进在分区片段导入期间对 JSON 前缀的反序列化处理。#94848 (Pavel Kruglov) 。
- 使用完整的 INSERT 管道重构写入流程,从而触发目标表上的 materialized views。#94890 (Kai Zhu) 。
- 仅在搜索列存在索引时,才使用向量相似性搜索的计划优化。#94998 (Eduard Karacharov) 。
- 在用户身份验证之前检查总内存限制;如果总限制超过允许值,则抛出
(total) memory limit exceeded。#95003 (Nikolai Kochetov) 。 - 新增了
throw_on_unmatched_row_policies配置选项;启用后,如果用户查询某个表,而该表配置了行策略但没有任何一条适用于该用户,则会抛出异常,从而避免因访问控制配置错误而产生返回所有行这一含义模糊的行为。#95014 (Vitaly Baranov) 。 - 在使用 Unity Catalog 的长时间运行查询中动态更新 S3 访问 token。此更改关闭了 #93981。#95069 (Konstantin Vedernikov) 。
- 如果 ClickHouse 持续处于内存压力下达
memory_worker_decay_adjustment_period_ms毫秒,则禁用 jemalloc 的脏页衰减;如果 ClickHouse 在相同时间内恢复到正常工作状态,则重新启用 jemalloc 的脏页衰减。#95145 (Antonio Andelic) 。 - 支持 S3Queue 使用 s3Queue 的
keeper_path设置作为辅助 ZooKeeper。#95203 (Diego Nieto). - 使 TTL drop part merge 遵循
max_parts_to_merge_at_once。#95315 (Kseniia Sumarokova). - 向 query_log 中新增
connection_address和connection_port,以反映实际物理连接 (当通过代理连接且 auth_use_forwarded_address=1 时,address和port会被替换) 。#95471 (Yakov Olkhovskiy) 。 - 修复查询条件缓存的内存核算错误。问题的关键在于,此前未将由多个字符串组成的缓存键纳入计算 (例如 part_name、表 id 以及整个 SQL 条件) 。#95478 (Nikita Mikhaylov) 。
- 使用嵌入式配置启动的服务器将允许操作用户和授权,并像常规配置一样将其保存到
access目录中。这有助于改进测试。此外,还在嵌入式配置和 clickhouse-local 中启用了所有 access_control_improvements。#95481 (Alexey Milovidov) 。 - 改进了 S3 身份验证错误消息:在访问被拒绝时,加入了提示以建议检查凭据。#95648 (Gerald Latkovic) 。
- 启用统计信息 cache,并将 cache 的更新周期设置为 300 秒。#95841 (Han Fei) 。
- 在
system.aggregated_zookeeper_log中添加组件名称。#95882 (Antonio Andelic) 。 - 从
system.tables查询DeltaLake表时,跳过对对象存储的读取。#95899 (Antonio Andelic). - 如果
compatibility设置为26.2或更高版本,则默认启用enable_max_bytes_limit_for_min_age_to_force_merge。 #95917 (Christoph Wurm) 。 - Delta Lake 现已可在 macOS 上使用。关闭 #95979。#95985 (Alexey Milovidov) 。
- 在早期版本中,将相互冲突的 ALTER 表达式与 UPDATE 和 RENAME COLUMN 组合使用时,抛出的是逻辑错误,而不是恰当的异常。修复了 #70678。#96022 (Alexey Milovidov) 。
- 改进所有 ClickHouse 应用的帮助输出,添加
--no-sudo选项,并进行了一些修复。这是对 Ilya Yatsishin 的 #58244 的延续。#96025 (Alexey Milovidov) 。 - 为
cosineDistance新增distanceCosine别名,因为其他所有距离函数都已有这种形式的别名。#96065 (Raufs Dunamalijevs) 。 - 新增对
with_dataKeeper 扩展的支持,以改进 Replicated 数据库中的表获取流程。 #96090 (Nikolay Degterinsky). - 将 chdig 更新至 v26.2.1 (新增功能并支持 MacOS) 。#96113 (Azat Khuzhin) 。
- 改进
numbers和primes的 filter 下推。现在,当无法根据WHERE条件推导出精确边界时,ClickHouse 可以推导出保守的取值范围,并据此限制序列生成 (例如,对于WHERE number % 5 < 2 AND number > 100 AND number < 300,ClickHouse 只会生成 100 到 300 之间的数字,然后再应用该谓词) ,从而避免无界扫描。关闭 #84853。关闭 #93913。#96115 (Nihal Z. Miaji) 。 - 格式化器此前在存在
COMMENT子句时,会将 SELECT 用括号括起来,以消除解析歧义。现在改为在AS SELECT之前输出COMMENT,这样无需括号即可消除歧义。#96293 (Alexey Milovidov) 。 allow_impersonate_userconfig 设置现已位于access_control_improvements部分中,不再是独立的服务器设置。#96451 (Vitaly Baranov) 。- 使
core_dump.size_limit配置项支持热重载,从而避免为使配置更改生效而必须重启服务器。#96524 (Miсhael Stetsyuk) 。 - 改进了 CPU 分析器与实时分析器在 socket 超时场景下的互操作性。#96601 (Sergei Trifonov) 。
- 防止在 DROP COLUMN 变更后很快执行 ADD COLUMN 时,已删除的数据重新恢复。#96713 (Alexey Milovidov).
- 将
system.instrumentation中function_id的类型从 LowCardinality(Int32) 改为 Int32。#96726 (Copilot) 。 - 同步等待变更时,将遵循查询取消和时间限制。#96756 (Alexey Milovidov) 。
- 新增了系统命令
SYSTEM RELOAD DELTA KERNEL TRACING <level>,可用于更改 delta-kernel 的日志级别,这对调试很有帮助。#96763 (Kseniia Sumarokova). - 按 IP 地址族进行过滤 (即
dns_allow_resolve_names_to_ipv4/ipv6settings) 即使在 DNS cache 被禁用时也会生效。#96810 (c-end). - 增强 jemalloc 自省功能。#96840 (Azat Khuzhin) 。
- 修复了
/playWeb UI 在查询系统表时抛出QUERY_CACHE_USED_WITH_SYSTEM_TABLE错误的问题。#96869 (Alexey Milovidov) 。 - 改进 Web UI:更改 favicon 以指示查询正在运行的状态;显示辅助查询 (加载数据库和表) 返回的错误,而不是将其静默忽略。关闭 #85055。#96883 (Alexey Milovidov) 。
- 将
/playUI 中的左侧面板设为可点击,以切换数据库列表。#96884 (Alexey Milovidov). DROP DATABASE现在会按依赖关系的逆序删除表,从而在数据库包含具有导入依赖关系的表时提升崩溃安全性 (例如使用joinGet的Distributed表) 。#97057 (Alexey Milovidov) 。- 升级 yaml-cpp,以避免跳过无效 YAML。#97333 (Azat Khuzhin) 。
- 在获取表时,在
play.html侧边栏中显示加载指示器。#97531 (Alexey Milovidov) 。 - 在内置 Web UI (play.html) 中新增了用于将原始查询结果复制到剪贴板的按钮。#97532 (Alexey Milovidov) 。
- 修复查询混淆器 (
clickhouse-format --obfuscate) ,使其在更多情况下能够生成可解析的 SQL。#97584 (Alexey Milovidov) 。
错误修复(官方稳定版本中用户可见的异常行为)
- 在仅涉及元数据的 ALTER (例如扩展 Enums 的元素) 之后,使用 projection 进行聚合优化时可能会抛出异常。#84143 (Alexey Milovidov) 。
- materialized views 现在使用其创建所在的数据库作为执行上下文,这意味着: - 可以省略在视图的 select query 中引用名称时对数据库的显式限定 - 如果未显式限定数据库,则默认使用创建 materialized view 时所在的同一数据库。 #88193 (Dmitry Kovalev).
- 修复在使用 ON CLUSTER 时,CREATE USER 认证方法中查询参数的替换问题。此前,认证方法中的查询参数 (例如密码) 不会被替换,导致远程节点上出现 UNKNOWN_QUERY_PARAMETER 错误。#92777 (xiaohuanlin).
- 修复了
has、mapContainsKey和mapContainsValue函数在文本索引分析中的不一致问题。此前,使用这些函数的查询在表达式使用或不使用文本索引进行求值时,可能会返回不同的结果。#93578 (Anton Popov) 。 - 修复在将表附加到
MaterializedPostgreSQL数据库时,若dropReplicationSlot在栈展开过程中抛出异常而引发的崩溃。#96871 (Alexey Milovidov). - 如果对同一批 File 执行多个相互冲突的并发备份,可能会导致服务器崩溃。#93659 (Alexey Milovidov) 。
- 修复了使用并行副本以及与非 MT 表进行 JOIN 时的查询问题。关闭了 #92056。#93902 (Igor Nikonov) 。
- 修复了一个问题:名称中带有点号的 Iceberg 列返回值为 NULL。 #94335 (Mikhail Koviazin).
- 修复了
stringJaccardIndexUTF8对 UTF8 字符串的处理问题,并提升了性能。#94613 (Joanna Hulboj) 。 - 修复
WITH FILL STALENESS中可能出现的溢出问题 (会导致未定义行为和/或无限循环) 。修复因大跨度跳变而可能导致的无限循环。添加对旧版分析器的支持 (主要用于压力测试) 。#94663 (Azat Khuzhin) 。 - 修复在主机名解析为多个地址且远程副本冻结时,分布式查询可能卡住的问题。#94726 (c-end).
- 修复了对多个表表达式执行 JOIN 时出现的无效结果问题,当最左侧的表表达式为
-Cluster表函数时。解决了 #89996。#94748 (Konstantin Bogdanov) 。 - 修复涉及
toWeek、toYearWeek、toStartOfWeek、toLastDayOfWeek和toDayOfWeek的谓词中主键裁剪和跳数索引裁剪不正确的问题,并修复其中某些函数在对LowCardinality(String)执行有效查询时引发的异常。#94816 (Nihal Z. Miaji). - 移除对启用 SQL Security 的视图执行
ATTACH查询时不必要的跳过权限检查行为。这样可防止用户在未验证所需访问权限的情况下附加带有 definer 的视图,从而造成潜在的权限提升。 #94865 (pufit). - 修复了
ReplicatedMergeTree启动期间因并发删除delete_tmp_*目录导致的崩溃。#94892 (myeongjun). - 修复了向带有 materialized views 的 Iceberg 表执行
INSERT时丢失去重信息并导致异常的问题。#94938 (Daniil Ivanik) 。 - 修复了一个 bug:
SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME>会清空集群上的整个查询缓存。#94978 (Rory Crispin) 。 - 在 Vertical 合并后保留固定的索引粒度 (use_const_adaptive_granularity) (v2,修复了 Nested 的问题,并进行了整体改进) 。#95013 (Azat Khuzhin).
- 修复了 26.1 版本在 [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764) 之后引入的文件系统缓存竞争问题。#95042 (Kseniia Sumarokova) 。
- 修复在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 中止
postgresql()表函数时的问题。 #95136 (Roman Vasin). - 修复了在使用多个带有
USING子句的 JOIN 时,对源表中带限定符的列进行类型推断的问题。此前,后续 JOIN 会错误地将底层源列的类型更新为共同超类型,即使该列并未参与该次 JOIN (例如,在SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a)中,t2.a列仅用于第一个 JOIN,因此其类型应为t1.a和t2.a的超类型,不应包含t3.a) 。当函数预期的列类型与执行计划中实际出现的类型不一致时,这可能会导致逻辑错误或崩溃。#95157 (Vladimir Cherkasov) 。 - 在获取 manifest .avro 列表和 File 内容时,列转换仅执行一次。#95164 (Daniil Ivanik).
- 修复了 JSON 列大小计算不正确的问题,此问题可能导致内存占用过高或列统计信息错误。#95207 (Azat Khuzhin).
- 修复了在轻量级更新后应用大型补丁分区片段时内存核算不准确的问题。此前,应用大型补丁可能导致内存占用过高,并使服务器进程被 OOM 杀手终止。#95231 (Anton Popov).
- 修复了一处未定义行为:当带有
max_parallel_replicas的分布式查询在索引分析期间回退到本地副本时,可能会返回错误结果或抛出异常。#95263 (Azat Khuzhin) 。 - 修复在
group_by_overflow_mode设置为any时,sum和时间序列对稀疏列进行聚合的问题。#95301 (Mikhail Koviazin). - 修复了
plain_rewritable磁盘策略中的一个可靠性问题:在解除元数据 File 链接的过程中,如果中途发生网络错误,可能导致存储处于不一致状态。#95302 (Mikhail Artemenko) 。 - 将 Iceberg 中的 Date 替换为 Date32。#95322 (Konstantin Vedernikov) 。
redis表函数的 password 参数现在会在日志和系统表中被屏蔽 (例如:query_log) 。#95325 (János Benjamin Antal).- 修复了一个 bug:在分布式查询仍在相关表上执行时,这些表仍可能被删除或修改,进而导致异常或错误结果。#95356 (Azat Khuzhin) 。
- 修复了在某些情况下,分布式查询中使用负数
LIMIT/OFFSET时出现的逻辑错误。#95357 (Nihal Z. Miaji). - 修复了一个 bug:通过 ssh 连接时,clickhouse-client 会提示输入两次密码。#95372 (Isak Ellmer) 。
- 修复 storage S3(Azure)Queue 中的数据竞争问题。#95385 (Kseniia Sumarokova) 。
- 修复了由 prewhere 中的 lambda 表达式引起的 prewhere filter 错误。#95395 (Xiaozhe Yu) 。
- 修复
optimize_syntax_fuse_functions:当聚合 argument 为Nullable时,不再将sum/count/avgRewrite 为sumCount()。关闭 #95390。#95441 (Nihal Z. Miaji) 。 - 避免在取消 distributed queries 时可能发生的崩溃。#95466 (Aleksandr Musorin) 。
- 修复 S3(Azure)Queue 引擎流式传输中的去重问题。#95467 (Kseniia Sumarokova).
- 修复了在分布式查询中更新分配给初始用户的行级策略时出现的问题。#95469 (Vitaly Baranov) 。
- 修复对基于 plain_rewritable 的加密磁盘的检查 (修复可能出现的
It is not possible to register multiple plain-rewritable disks with the same object storage prefix问题) 。#95470 (Azat Khuzhin) 。 mergeTreeProjection表函数此前缺少访问检查,导致没有表 SELECT 权限 (但具有表函数权限) 的用户也可以读取其投影中的数据。此修复增加了与mergeTreeIndex和mergeTreeAnalyzeIndexes已具备的相同访问检查。#95480 (Alexey Milovidov) 。- 修复读取 Dynamic/JSON 类型动态子列中的 size 子列时可能出现的逻辑错误。#95573 (Pavel Kruglov) 。
- 修复了由 #94262 引入的 (实验性) 零拷贝复制中的回归问题:共享的 parts 可能会在其他副本完成获取这些 parts 之前被删除。#95597 (filimonov) 。
- 修复对 JSON 数组应用
tupleElement时发生的崩溃问题。关闭 #95581。#95647 (Pavel Kruglov) 。 - 修复在带有 USING 的 JOIN 中,在 VALUES 子句内的 lambda 函数中使用匹配器 (
*) 时触发的逻辑错误异常。关闭 #93675。#95661 (Vladimir Cherkasov) 。 - 修复了在等待分布式 DDL 的同时并发删除 Replicated 数据库时出现的
There was an error: Cannot obtain error message逻辑错误。修复 #95539。#95664 (Alexander Tokmakov) 。 - 修复了在启用
transform_null_in时,IN函数对NULL值返回错误结果的问题。关闭 #65776。#95674 (Nihal Z. Miaji) 。 - 启用设置
cast_keep_nullable时,正确处理CAST中的 LowCardinality Nullable 类型。修复 #95670。#95747 (Alexey Milovidov) 。 - 修复合并已分区的 delta lake 数据时的问题。#95773 (Kseniia Sumarokova) 。
- 修复运行时过滤器中 Nullable join 列的竞态条件。#95775 (Hechem Selmi) 。
- 修复了在表和选择列表中的
USING列类型不同时,带有匹配器 (*、table.*) 和analyzer_compatibility_join_using_top_level_identifier的查询中可能出现的逻辑错误。关闭 #90477。#95808 (Vladimir Cherkasov) 。 - 修复并行线程池操作 (备份、聚合、分布式查询) 中的内存安全问题;当任务调度期间发生错误时,这些问题可能导致异常。#95818 (Raúl Marín) 。
- 修复了在执行 DROP WORKLOAD、且同时有查询使用正在被删除的 workload 时发生的崩溃。#95856 (Alexey Milovidov).
- 修复了以下情况下查询 system table 时性能缓慢的问题:使用的 USER 在许多数据库上仅具有有限授权。关闭了 #89371。#95874 (pufit) 。
- 修复了在具有嵌套路径的 JSON 上执行 tupleElement 时的问题,此前这可能会导致错误的查询结果。#95907 (Pavel Kruglov).
- 修复了一个可能出现的
NOT_SUPPORTED错误:在空的 MergeTree 表上使用directjoin 算法时,可能会触发该错误。#95935 (Vladimir Cherkasov) 。 - 修复了客户端不会为 settings 的别名提供建议和自动补全的问题,关闭 #92190。#95945 (phulv94).
- 修复 system.asynchronous_metric_log 中 event_date 的问题。#95947 (Raúl Marín).
- 修复了 JSON 数据类型中跳过路径的问题。此前使用
JSON(SKIP path)时,所有以前缀path开头的 JSON 键都会被跳过,甚至包括"pathpath"这样的键,因此在 insert 期间可能导致这些路径的数据丢失。现在该问题已修复,只有键"path"会被跳过。#95948 (Pavel Kruglov). - 带有未知 projections 的分区片段不应被永久标记为丢失。#95952 (Mikhail Artemenko) 。
- 修复
Join表中使用Nullable(String)键时,空字符串变为NULL的问题。关闭 #71414。#96002 (Alexey Milovidov) 。 - 现在,PostgreSQL 引擎已可正确读取
BOOLEAN[]。修复了 #72754。#96006 (Alexey Milovidov) 。 - 修复了从空文件读取时
ProtobufList格式的问题。已关闭 #70059。#96007 (Alexey Milovidov) 。 - 修复
ProtobufList格式在空表中产生幽灵记录的问题。关闭 #72596。#96010 (Alexey Milovidov) 。 - 修复了在一种涉及分布式查询、PREWHERE 和类型推断的特殊情况下,
iffunction 的UInt64与Int32type 不匹配问题。关闭了 #70017。#96012 (Alexey Milovidov) 。 - 修复涉及
Bool类型的JIT编译查询问题。#96013 (Alexey Milovidov) 。 - 修复从 SQLite TEXT 列读取 UUID 列时出现的逻辑错误。关闭 #71263。#96016 (Alexey Milovidov) 。
- 修复 SQLite 引擎对
DateTime、Date、UUID及其他类型的转换问题。关闭 #73481。#96017 (Alexey Milovidov) 。 - 在针对外部数据库 SQLite 和 PostgreSQL 的查询中,
FixedString值被错误地转义。关闭 #73519。与 @jh0x 共同完成。#96019 (Alexey Milovidov) 。 - 修复 WindowTransform 在 PRECEDING 偏移量较大时触发的断言失败。关闭了 #75852。#96026 (Alexey Milovidov) 。
- 修复了一个可能导致数据损坏的问题:当并发异步插入使用相同的参数名但参数值不同时,可能会发生数据损坏。#96035 (Seva Potapov) 。
- 修复全局 profiler 的周期 (由
global_profiler_real_time_period_ns和global_profiler_cpu_time_period_ns控制) 。此前使用的是截断后的值,而不是设定值,导致 profiler 的唤醒频率高于预期。#96048 (Antonio Andelic). - 此前,如果用于 position delete 的 Iceberg manifest File 中,某个 entry 里存在 reference data File 但其值为 null,我们就无法获取对应 data File 的正确边界。此 PR 修复了该 bug。#96061 (Daniil Ivanik).
- 修复撤销默认角色时的问题。 #96103 (Vitaly Baranov).
- 修复了一种罕见情况下索引分析中的释放后使用问题:当
use_primary_key被禁用,且使用索引的条件析取数量非常大时会触发该问题。#96112 (Alexey Milovidov). - 修复了
Gorillacodec 中的一个回归问题:当显式指定的大小与数据类型大小不一致,且缓冲区大小过小时,在先前版本中会在解压时抛出异常。关闭了 #78253。#96118 (Alexey Milovidov) 。 - 避免在已加载的字典中出现死锁:当某个字典引用了一个递归引用该字典的 Merge 表时,会发生这种情况。关闭 #78360。#96120 (Alexey Milovidov) 。
- 修复
formatDateTime在使用非固定宽度 Formatter (如 MySQL 和 JODA 风格) 时读取未初始化值的问题。#96133 (Alexey Milovidov) 。 - 设置
use_const_adaptive_granularity与index_granularity_bytes的组合 (即“非自适应粒度”) 导致待读取行数计算错误,并引发异常。#96143 (Alexey Milovidov) 。 - 在对象存储上的类文件表 (例如 S3 和 Azure) 上执行无效的 ALTER UPDATE 变更,可能会导致 nullptr 解引用。关闭 #92994。#96162 (Alexey Milovidov) 。
- 修复了
AccessRights::contains在存在部分撤销时返回结果错误的问题。#96170 (pufit) 。 - 修复了 CTE 折叠常量导致的查询条件缓存哈希冲突问题,该问题可能会导致错误的查询结果。关闭 #96060。#96172 (Alexey Milovidov) 。
- 修复 ProcessList 中可能出现的死锁。当我们向 cancellation checker 添加任务时,如果 memory overcommit tracker 被触发,可能会因潜在的锁顺序反转而导致该问题。#96182 (Antonio Andelic) 。
- 修复了一个错误:由于非法的 JOIN 重排序,包含外连接 (LEFT、RIGHT 或 FULL) 并结合多个 INNER JOIN 的查询可能返回错误结果。当外连接的 ON 条件引用了多个此前已 JOIN 的表中的列时,优化器未能考虑所有表依赖关系,因此可能错误地对 JOIN 进行重排序,导致结果缺少行。关闭 #95972。#96193 (Vladimir Cherkasov) 。
- 当表未定义统计信息时,ClickHouse 不应尝试导入这些统计信息。这样可避免因检查统计信息 File 是否存在而带来的一些额外开销 (100+ 毫秒) 。 (问题 #96068) 。#96233 (Han Fei) 。
- 修复
optimize_syntax_fuse_functions:当聚合参数为LowCardinality(Nullable)时,不再将sum/count/avg重写为sumCount()。关闭 #95390。#96239 (Nihal Z. Miaji) 。 - 修复了在某些情况下
not IN和not has函数分区裁剪错误的问题。#96241 (Nihal Z. Miaji). - 修复向量相似度索引中的
stack-use-after-scope问题。#96259 (Alexey Milovidov) 。 - 修复了当查询前有 SQL 注释时,测试运行器无法识别错误提示注释的问题。#96336 (Yakov Olkhovskiy) 。
- 修复了在以下情况下 KeyCondition 中的逻辑错误:表的主键为 Nullable,且查询使用了
coalesce函数,并且其第一个参数为常量。#96340 (Alexey Milovidov) 。 GROUPING SETS、group_by_use_nulls以及内部包含LowCardinality的Tuple数据类型之间的相互作用,可能会在查询管道中产生非预期的数据块结构,从而导致逻辑错误。该问题出现在引入NullableTuple之后。 #96358 (Alexey Milovidov).- 此前可以使用空表达式
()作为索引创建表,从而导致无效的内存访问。#96363 (Alexey Milovidov) 。 - 修复了旧版分析器在出现 JOIN 和重复别名时崩溃的问题。#96405 (Ilya Golshtein).
- 修复因针对 Variant 列的错误就地过滤优化而导致的
Nested columns sizes are inconsistent with local_discriminators错误。#96410 (Alexey Milovidov) 。 - 修复
CREATE TABLE ... CLONE AS ...忽略 source 表全限定名的问题。#96415 (Hasyimi Bahrudin) 。 - 修复了在 clickhouse-client 中无法通过 KILL QUERY 和取消查询 (Ctrl+C) 取消
mysql表函数的问题。 #96437 (Roman Vasin). - 修复了
max_execution_time值较高的查询中,取消检查线程的活锁问题。#96450 (Sergei Trifonov) 。 - 修复了在分布式查询中使用非整数
LIMIT/OFFSET时,在某些情况下出现的逻辑错误。#96475 (Nihal Z. Miaji). - 修复某些包含 lambda 函数的表达式中的空指针解引用问题。#96479 (Alexey Milovidov).
- 修复将
LowCardinality列转换为Nullable时结果错误的问题。#96483 (Nihal Z. Miaji). - 修复了创建 Iceberg 表时,
ORDER BY子句引用不存在的列或使用位置参数而导致的崩溃。关闭 #93280。#96484 (Konstantin Vedernikov) 。 - 修复了带有 Nullable 子字段的 Tuple 列上的运行时过滤器异常。#96509 (Alexey Milovidov).
- 修复了 Parquet V3 原生读取器中的
LOGICAL_ERROR异常:当PREWHERE过滤列包含非布尔型 UInt8 值时会触发该异常。#96594 (Alexey Milovidov) 。 - 修复复制表在元数据变更期间隐式重新生成索引的问题。#96600 (Raúl Marín).
- 修复了执行 DROP WORKLOAD 时的数据竞争问题。#96614 (Sergei Trifonov) 。
- 修复了 Iceberg 表写入中的一个缺陷:分区插入可能会导致数据在各分区 File 之间分布不正确。#96620 (Konstantin Vedernikov) 。
- 修复了在包含约束的
CREATE TABLE中出现的heap-use-after-free问题。#96669 (Nikita Taranov) 。 - 验证 bech32 中的 witness version,以避免缓冲区溢出。#96671 (Raúl Marín) 。
- 修复了在使用无效的
auth_header设置创建数据湖 REST 目录时,system.tables报错的问题。#96680 (Han Fei). - 修复了以下问题:在 TTL 合并后,如果一个数据块中的所有行都被过滤掉,
_minmax_count_projection会使min(timestamp)返回 epoch (1970-01-01) 。#96703 (Raquel Barbadillo). - 改进对
iceberg_metadata_file_path设置项的校验,防止路径遍历,并确保指定的元数据文件位于表目录内。#96754 (Daniil Ivanik). - 修复了在
GROUP BY中使用Variant参数时ifNull发生崩溃的问题。#96790 (Alexey Milovidov) 。 - 修复了设置
table_disk=1的表之间的 cache 键冲突问题。#96818 (Raufs Dunamalijevs). - 修复因竞争条件导致 MemoryWorker 的清理线程卡死的问题。#96819 (Antonio Andelic) 。
- 不要在 Iceberg 目录中记录包含凭证的数据。#96831 (Konstantin Vedernikov) 。
- 修复服务器发生错误后 clickhouse-client 的退出状态。#96841 (Vitaly Baranov) 。
- 使用 CROSS JOIN 且启用并行副本的查询可能会返回错误结果。修复了 #74337。#96848 (Igor Nikonov) 。
- 修复了此前在同一列上执行轻量级更新后,
ALTER TABLE DROP COLUMN查询失败的问题。#96861 (Anton Popov) 。 - 修复了在
plain_rewritable对象存储磁盘上创建基于归档文件的备份 (.zip、.tzst) 时发生堆栈溢出 (崩溃) 的问题。#96872 (Alexey Milovidov) 。 - 修复了以下问题:当备份因目标文件系统磁盘已满或其他 I/O 错误而失败时,服务器会发生崩溃。 #96873 (Alexey Milovidov).
- 修复了
EXCEPT ALL和INTERSECT ALL会忽略行的重复次数、表现得与其DISTINCT版本相同的问题。#96876 (Alexey Milovidov) 。 - 修复
indexOfAssumeSorted在使用不兼容类型调用时触发的std::terminate异常 (例如,IPv4数组搭配整型搜索值) 。#96877 (Alexey Milovidov) 。 - 修复在使用窗口函数且
group_by_use_nulls = 1并结合 CUBE/ROLLUP/GROUPING SETS 时出现的异常Bad cast from type DB::ColumnNullable to DB::ColumnString。#96878 (Alexey Milovidov) 。 - 修复了 JIT 已编译表达式将
DateTime转换为DateTime64时产生的错误结果 (例如,在CASE/if/multiIf中混用 DateTime 类型时) 。此前,该值会被重新解释,而不是按正确比例缩放,导致表达式编译生效后生成错误的时间戳。#96879 (Alexey Milovidov). - 修复了
CoalescingMergeTree中的逻辑错误异常:当数据跳过索引表达式生成常量列时 (例如,对整型列上的ifNotFinite(1, c0)使用bloom_filter) 。#96880 (Alexey Milovidov) 。 - 修复了在误用 HTTP 连接到已启用 TLS 的原生协议端口时,错误信息中端口号显示错误的问题。#96881 (Alexey Milovidov) 。
- 修复了在 CTE 和子查询中,各子查询的
SETTINGS未应用于file等表函数的问题。#96882 (Alexey Milovidov). - 修复读取 X509 证书时 BIO 对象的内存泄漏问题。#96885 (Alexey Milovidov) 。
- 修复了查询分析器中的
LOGICAL_ERROR异常:当在应为具体值的位置传入 lambda 表达式时,会触发该异常 (例如,将其作为arrayFold的累加器参数时) 。#96892 (Alexey Milovidov) 。 - 修复对复杂嵌套类型 (包含带有 Nullable Enum 值的 Map 的 Nullable Tuple 数组) 进行类型转换时出现的
ColumnNullable is not compatible with original异常。#96924 (Alexey Milovidov) 。 - 修复了分片
HASHED字典并行导入中的竞争条件,该问题偶尔会导致部分行未能导入。#96953 (Alexey Milovidov). - 修复了
REPLACE PARTITION与后台变更之间的竞争条件,该问题可能导致替换后旧数据和新数据同时可见。#96955 (Alexey Milovidov) 。 - 修复了
arrayJoin函数在与 INNER JOIN 和 WHERE 子句一同使用时产生重复行的问题。其原因是部分谓词下推优化错误地将包含arrayJoin的过滤条件下推到 JOIN 之下。#96989 (Alexey Milovidov). - 修复
clearCaches中的崩溃 (SEGFAULT) :BlockIO::operator=未移动query_metadata_cache,导致缓存的存储快照被提前销毁,并对MergeTreeData存储发生释放后使用。 #96995 (Alexey Milovidov). - 修复
IfTransformStringsToEnumPass中的断言失败:当if或transform函数返回Nullable(String)时会触发该问题 (例如在使用GROUP BY ... WITH CUBE且group_by_use_nulls = true时) 。#97002 (Alexey Milovidov) 。 - 修复在使用带有
UNION ALL和JOIN的INSERT ... SELECT时写入错误数据的问题:常量字符串列在数据块合并后可能会被赋予错误的值。#97019 (Hasyimi Bahrudin). - 修复在
ALTER TABLE MODIFY COLUMN更改列类型后构建列统计信息时触发的assert_cast异常 (或在发布构建中发生静默数据损坏) 问题。#97027 (Alexey Milovidov). - 修复 Azure Blob 存储、SSH 协议和 Arrow Flight 接口中读取未初始化内存的问题。#97053 (Alexey Milovidov).
- 修复了在带有 row policy/PREWHERE 和 FINAL 的查询中,查询结果受索引影响的问题。 #97076 (Yarik Briukhovetskyi).
- 修复了
MergeTree表中REPLACE PARTITION与后台变更之间仍存在的竞争条件,该问题可能导致旧数据重新出现。#97105 (Alexey Milovidov) 。 - 修复带有别名列的隐式索引,并在创建前先进行全面验证。 #97115 (Raúl Marín).
- 修复
FunctionVariantAdaptor中的逻辑错误,该错误会影响需要常量参数的函数,例如arrayROCAUC。#97116 (Bharat Nallan) 。 - 修复了这样一个问题:当
PartCheckThread为已变更的分区片段重新将GET_PART入队时,会导致变更卡住,并在parts_to_do中留下幽灵条目。#97162 (Alexey Milovidov). - 修复了带有
ORDER BY ... LIMIT的子查询在查询计划中的行数估算问题,否则可能导致优化器选择次优的 join 顺序。#97193 (Alexander Gololobov). - 修复了
FunctionVariantAdaptor中的LOGICAL_ERROR异常:当作用于 Variant 列的函数返回Nothing类型时,会触发该异常;这种情况可能发生在UNION ALL查询中的空数组场景下。#97213 (Alexey Milovidov) 。 - 修复了 S3 多段复制操作期间的数据竞争问题 (例如向 S3 执行
BACKUP/RESTORE时) ,该问题在并发访问下可能导致异常。#97227 (Azat Khuzhin) 。 - 修复了当
WHERE子句中的arrayJoin引用JOIN两侧的列时导致的LOGICAL_ERROR异常。#97239 (Alexey Milovidov) 。 - 修复在带 PREWHERE 的 Tuple 中读取稀疏
Nullable(String)的.size子列时出现的LOGICAL_ERROR异常。#97264 (Alexey Milovidov) 。 - 修复在使用
ORDER BY ... LIMIT从采用非自适应索引粒度 (index_granularity_bytes = 0) 的表读取时,LazyMaterializingTransform中出现的异常:"lazy chunk 中的行数与偏移量数目不一致"。#97270 (Alexey Milovidov) 。 - 修复
SYSTEM RESTART REPLICA在因非 ZooKeeper 异常 (例如内存限制) 导致表重建失败时,会使数据库中的表丢失,并导致DatabaseReplicated中元数据摘要不匹配的问题。#97276 (Alexey Milovidov) 。 system.merge_tree_settings中的readonly字段现在能够正确反映某些 merge tree 设置 (例如index_granularity) 是无条件只读的。#97277 (Robert Schulze) 。- 修复了在
MergeTree表上对count()进行优化时发生的崩溃问题:当 storage snapshot 在无数据的情况下创建时,会触发该问题。#97281 (Pablo Marcos) 。 - 修复了从调试信息中解析堆栈跟踪的函数名称时可能发生的崩溃。#97294 (Azat Khuzhin) 。
- 修复 analyzer_compatibility_join_using_top_level_identifier 与 ALIAS 列相关的逻辑错误。关闭 #96228。#97297 (Vladimir Cherkasov) 。
- 修复了在配合
QUALIFY子句使用带有文本索引的列时,applyOrder中出现的LOGICAL_ERROR异常。#97313 (Alexey Milovidov) 。 - 系统表
system.functions现在会将内部函数的categories显示为Internal,而不是空字符串 (categories = '') 。#97315 (Robert Schulze) 。 - 使用 RIGHT JOIN 链且启用并行副本的查询可能会产生错误结果。修复了 #74341。#97316 (Igor Nikonov).
- 修复在可刷新materialized view 及其他表被重命名的场景下可能出现的误报
TABLE_UUID_MISMATCH错误。#97323 (Azat Khuzhin). - 修复
StorageKeeperMap备份中的段错误:原因是在惰性备份批次中对悬空的 storage 指针发生了释放后继续使用。#97336 (Alexey Milovidov) 。 - 修复了在启用
mutations_execute_subqueries_on_initiator时,ALTER UPDATE/DELETE中包含标量子查询的exists函数的问题。此前,该标量子查询会被错误地求值,可能导致报错,或生成损坏的变更命令,使表在下次服务器重启后无法加载。#97347 (Kirill Kopnev). - 修复了在将 NULL 与包含 LowCardinality 类型的 Variant 列进行比较时出现的逻辑异常
Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8)))。#97379 (Alexey Milovidov). - 修复了在启用分片查询缓存时并行执行
EXCHANGE TABLES可能导致的竞态条件问题。 #97411 (Konstantin Vedernikov). - 修复了将 Array 转换为
QBit时的LOGICAL_ERROR异常:当外层Tuple包装器中的nullable_source以不匹配的列 type 替换已转换的数组列时,会触发该问题。关闭 #97389。#97413 (Alexey Milovidov). - 修复括号内带别名的元组字面量在 AST 格式化往返时不一致的问题,例如,
(('a', 'b') AS x)之前会被错误地重新格式化为tuple(('a', 'b') AS x)。#97418 (Alexey Milovidov) 。 - 修复了启用去重的异步插入过程中出现的异常:当解析失败生成零行的空数据块时,会触发该异常。#97460 (Sema Checherinda).
- 修复了在使用
ORDER BY ... LIMIT从采用非自适应索引粒度 (index_granularity_bytes = 0) 的表中读取时,LazyMaterializingTransform中出现的异常 "Number of rows in lazy chunk does not match number of offsets"。#97482 (Alexey Milovidov). - 修复 insert Iceberg 相关设置。为
allow_experimental_insert_into_iceberg设置添加别名。#97483 (Konstantin Vedernikov) 。 - 修复了这样一个
ACCESS_DENIED问题:当optimize_inverse_dictionary_lookup优化重写dictGet(...)谓词时,没有CREATE TEMPORARY TABLE权限的用户会遇到该问题。ClickHouse 现在会跳过该重写并执行原始表达式。关闭 #97269。#97484 (Nihal Z. Miaji) 。 - 修复
Set和MergeTreeIndexSet在处理带有内部稀疏子列的列时出现的断言失败问题 (在 debug/sanitizer 构建中会以异常形式表现出来) ,例如来自具有不同稀疏序列化 profile 的 MergeTree parts 的Tuple列。#97493 (Alexey Milovidov) 。 - 修复 StorageKafka2 中可能出现的释放后使用问题。#97520 (Bharat Nallan) 。
- 修复当输出路径包含目录时,
INTO OUTFILE配合TRUNCATE和into_outfile_create_parent_directories设置使用时出现的问题。#97549 (Alexey Milovidov) 。 - 修复在启用分析器时,通过
merge()表函数查询 ALIAS 列中包含 lambda 表达式的表时出现的BAD_ARGUMENTS错误。#97551 (Alexey Milovidov) 。 - 修复 Keeper 的 zxid 为 0 时
system.zookeeper_info抛出异常的问题。#97553 (Alexey Milovidov) 。 - 修复了当键类型不是 String 时,
ip_trie字典中可能存在的逻辑错误。#97555 (Bharat Nallan) 。 - 修复基础
RestCatalog的 REST 目录 OAuth 身份验证失效问题 (此前仅对派生目录 (如OneLakeCatalog) 生效) 。BigLake 目录引入后,默认 REST 目录因此损坏。#97561 (Konstantin Vedernikov) 。 - 几何函数 (
perimeterSpherical、areaSpherical等) 现在除Geometry变体类型外,还接受单独的几何子类型 (Polygon、Ring、Point等) 。#97571 (Alexey Milovidov) 。 - 修复对
Nullable(Tuple(... Nullable(T) ...))类型的子列使用isNull/isNotNull时触发的LOGICAL_ERROR异常。关闭 #97224。#97582 (Alexey Milovidov) 。 - 修复在轻量级更新期间应用补丁分区片段时发生的空指针解引用问题。#97583 (Alexey Milovidov) 。
BaseSettings::readBinary将accessor.find返回的索引直接传给field_infos[],但未检查“未找到”的哨兵值 (即-1) ,这可能导致std::vector越界访问。该问题因 libcxx 的加固机制而被发现。这很可能发生在查询计划反序列化期间:较新的服务器向较旧的服务器发送其无法识别的设置时,就会触发该问题。基于字符串的读取方法已正确处理这种情况;readBinary只是缺少相同的检查。 #97585 (Miсhael Stetsyuk).- 修复
UNION ALL查询在某个分支包含恒为 false 的谓词时返回错误结果的问题——该分支本应不返回任何结果,却会错误地读取数据。#97620 (Bharat Nallan). - 修复了
IN (col)在仅包含单个列引用时会失败并报UNSUPPORTED_METHOD错误的问题。#97646 (Alexey Milovidov) 。 - 修复在
GROUP BY ... WITH ROLLUP/CUBE中,当键在Nullable(Tuple(...))内包含LowCardinality(Nullable(...))时引发的逻辑错误异常。#97647 (Alexey Milovidov). - 修复
NOT (1, 1, 1)的 AST 格式不一致问题,该问题可能会在调试构建中导致LOGICAL_ERROR。#97653 (Alexey Milovidov) 。 - 修复
keeper-converter在遇到空的 ZooKeeper transaction log File 时抛出异常的问题。#97673 (Alexey Milovidov).
构建/测试/打包方面的改进
- ClickHouse 现已可使用 clang-23 (master) 进行构建。#95578 (Alexey Milovidov) 。
- 修复:当配置了
bind_host时,强制将is_local设为 false,并改用集成测试。对 #74741 的后续跟进。#93109 #96018 (Zhigao Hong). - 压力测试:修复 CI 中的压力测试和升级测试;忽略
no-{build}标签;增加兼容性随机化。#94693 (Nikita Fomichev) 。 - 在构建产物中发布 parser_memory_profiler 二进制文件。该工具可用于分析 AST 的内存占用。#95826 (Ilya Yatsishin) 。
- 为
parser_memory_profiler工具添加--symbolize标志,用于生成在结果中包含已解析符号的.heap.symFile。#96477 (Ilya Yatsishin) 。 - 将 integration tests 中使用的第三方 Docker images 固定为特定版本。#96500 (Alexey Milovidov) 。
- 重新支持动态链接
OpenSSL。虽然不推荐这样做,而且任何生产构建都不会采用,但这个选项仍然保留,供互联网上的爱好者使用。#96506 (Govind R Nair) 。 - 通过为
Coordination::OpNum使用按类型特化,将magic_enum的范围从 [-100, 1000] 缩减为默认值 [-128, 127],从而缩短构建时间。#96632 (Alexey Milovidov) 。 - 从 Function 类中移除不必要的 C++ 模板,以缩短构建时间。#96646 (Alexey Milovidov) 。
- 将
StorageSystemLicenses的生成移至 configure 阶段,以提升构建并行性。#96697 (Alexey Milovidov) 。 - 将许可证扫描并行化。#96727 (Raúl Marín).
- 新增对 SSH 协议支持的无状态功能测试。#96996 (Alexey Milovidov) 。
- 将 Kafka 3.9.0 添加到无状态功能测试基础设施中,使其能够使用 ClickHouse Keeper 充当 ZooKeeper,直接测试 Kafka 和 Kafka2 表引擎。六个新的无状态测试涵盖基本的生产/消费、虚拟列、INSERT、多种格式、损坏消息处理以及基于 Keeper 的偏移量存储。#96997 (Alexey Milovidov) 。
- 新增一个 CI 工作流,用于构建经 PGO+BOLT 优化的 clang 工具链。#96991 (Alexey Milovidov).
- 在 CI 中使用 PGO 优化的 LLVM/Clang 构建,可将构建速度提升 20..30%。#97031 (Alexey Milovidov) 。
- 将 glibc 中的数学函数替换为 llvm-libc 的实现。#90151 (Konstantin Bogdanov) 。
- 将 Boost 从 1.83 升级到 1.90,修复了调试构建中
devector的断言失败问题。#97037 (Alexey Milovidov). - 将
postgres更新至 REL_18_1。 #95189 (Konstantin Bogdanov). - 使用
libexpat2.7.3。#95218 (Konstantin Bogdanov) 。 - 使用
OpenSSL3.5.5。#95345 (Konstantin Bogdanov) 。 - 使用
simdjsonv4.2.4。#97129 (Konstantin Bogdanov) 。 - 升级至
libarchive3.8.5。#97131 (Konstantin Bogdanov) 。 - 升级到
fast_floatv8.2.3。#97133 (Konstantin Bogdanov) 。 - 使用
abseil-cpp20260107.1,并将s2geometry升级至 v0.13.1。#97134 (Konstantin Bogdanov) 。 - 将
libxml2升级至 2.15.1。#95574 (Robert Schulze) 。 - 将 7 个等级 3 集成测试 Docker 镜像从已终止生命周期或已删除的基础镜像升级到当前支持的版本。#97314 (Rahul).
- 新增 TPC-DS 基准测试查询。#97349 (Raufs Dunamalijevs) 。
- 将各个 x86 指令集 cmake 选项 (
ENABLE_SSSE3、ENABLE_AVX2、NO_SSE3_OR_HIGHER、ARCH_NATIVE等) 统一替换为单个数字型X86_ARCH_LEVEL选项 (1/2/3/4) ,以匹配运行时分发系统已采用的标准 x86-64 微架构级别。#97354 (Raúl Marín) 。 - 避免在
FunctionBinaryArithmetic中为非除法运算实例化division_by_nullable=true模板变体,以减少编译时间和二进制体积。#97496 (Raúl Marín). - 通过将
Exception.h从typeid_cast.h、assert_cast.h、Context_fwd.h、IDataType.h等被广泛包含的头文件以及各种 Column 头文件中移除,缩小其包含依赖范围。 #97497 (Raúl Marín). - 始终使用随附的
compiler-rt头文件 (sanitizer 和 XRay 接口) ,而不是主机编译器的头文件,并且默认情况下从源码构建compiler-rt库。#97499 (Raúl Marín) 。 - 在具备足够
long double支持的平台上,避免在wide_integer_impl.h中包含 boost/multiprecision 头文件,以缩短构建时间。#96633 (Alexey Milovidov). - 实现 LLVM 代码覆盖率作业,并首先为 master 分支启用该作业。#90952 (Alexey Bakharew) 。
- 为发布构建启用快速 libcxx 加固。这主要用于越界检查。根据性能测试结果,预计不会带来明显的性能影响。 #94757 (Miсhael Stetsyuk).
ClickHouse 26.1 版本,2026-01-29。演示,视频
不兼容变更
- 修复由于在 formatter 中错误替换别名而导致的格式不一致问题。修复了 #82833 中的问题。修复了 #82832 中的问题。修复了 #68296 中的问题。此更改可能存在向后不兼容性:当 analyzer 被禁用时,某些在 IN 中引用别名的 CREATE VIEW 查询将无法被处理。为避免不兼容,请启用 analyzer(自 24.3 起默认启用)。#82838(Alexey Milovidov)。
- 编解码器
DEFLATE_QPL和ZSTD_QAT已被移除。建议用户在升级前,将使用DEFLATE_QPL或ZSTD_QAT压缩的现有数据转换为其他编解码器。请注意,若要使用这些编解码器,必须先启用设置项enable_deflate_qpl_codec和enable_zstd_qat_codec。#92150(Robert Schulze)。 - 通过在
system.query_log.exception中启用对 stderr 的捕获,改进 UDF 调试体验。之前,UDF 的 stderr 只会被写入文件,而不会出现在查询日志中,导致难以调试。现在,stderr 默认会触发异常,并在抛出前被完整累积(最多 1MB),因此完整的 Python 回溯和错误信息会出现在system.query_log.exception中,从而便于高效故障排查。#92209(Xu Jia)。 JOIN USING ()子句中的空列列表现在被视为语法错误。此前预期的行为是在查询执行期间抛出INVALID_JOIN_ON_EXPRESSION。在某些情况下(例如与Join引擎进行连接)这会导致LOGICAL_ERROR,从而修复了 #82502。 #92371(Vladimir Cherkasov)。- 默认在 JSON 类型中对 SKIP REGEXP 使用部分匹配。已关闭 #79250。#92847(Pavel Kruglov)。
- 回滚「Allow INSERT into simple ALIAS columns」(回滚 ClickHouse/ClickHouse#84154)。该功能无法与自定义格式配合使用,并且没有受任何设置保护。#92849(Azat Khuzhin)。
- 新增一个设置项,当数据湖目录无法访问对象存储时抛出错误。#93606 (Konstantin Vedernikov)。
Lazy数据库引擎已被移除且不再可用。已关闭 #91231。#93627(Alexey Milovidov)。- 移除
metric_log的transposed_with_wide_view模式——由于一个缺陷,该模式无法使用。现在不再允许以该模式定义system.metric_log。这在一定程度上回滚了 #78412。#93867(Alexey Milovidov)。 - 工作负载的 CPU 调度现在默认为抢占式。参见
cpu_slot_preemption服务器设置项。#94060(Sergei Trifonov)。 - 对索引文件名进行转义以防止分区片段损坏。应用此更改后,ClickHouse 将无法加载由先前版本创建且名称中包含非 ASCII 字符的索引。要处理这种情况,可以使用 MergeTree SETTING
escape_index_filenames。#94079 (Raúl Marín)。 - 格式设置
exact_rows_before_limit、rows_before_aggregation、cross_to_inner_join_rewrite、regexp_dict_allow_hyperscan、regexp_dict_flag_case_insensitive、regexp_dict_flag_dotall和dictionary_use_async_executor现已更改为常规(非格式)设置。这是一次纯粹的内部更改,对用户没有可见的副作用,除非在(不太可能的)情况下,你在 Iceberg、DeltaLake、Kafka、S3、S3Queue、Azure、Hive、RabbitMQ、Set、FileLog 或 NATS 的表引擎定义中指定了上述任一设置。在这些情况下,此前这些设置会被忽略,而现在此类定义会报错。#94106(Robert Schulze)。 joinGet/joinGetOrNull函数现在会对底层 Join 表强制要求具备SELECT权限。此更改之后,执行joinGet('db.table', 'column', key)要求用户同时对 Join 表中定义的键列以及要获取的属性列拥有SELECT权限。缺少这些权限的查询将失败,并返回ACCESS_DENIED。迁移时,可通过GRANT SELECT ON db.join_table TO user授予整张表的访问权限,或通过GRANT SELECT(key_col, attr_col) ON db.join_table TO user授予列级访问权限。此更改会影响所有依赖joinGet/joinGetOrNull且之前未显式配置SELECT授权的用户和应用程序。#94307(Vladimir Cherkasov)。- 针对
CREATE TABLE ... AS ...查询改为检查SHOW COLUMNS。之前检查的是SHOW TABLES,这对于此类权限检查来说是不正确的权限授予。#94556(pufit)。 - 使
Hash输出格式不再依赖于数据块大小。#94503(Alexey Milovidov)。请注意,与之前版本相比,此更改会导致输出的哈希值发生变化。
新特性
- ClickHouse Keeper 的 HTTP API 和嵌入式 Web UI。 #78181 (pufit 和 speeedmaster)。
- 异步插入去重现在可以与依赖它的 materialized view 协同工作。当按 block_id 发生冲突时,会先过滤原始数据块以移除与该 block_id 关联的行,对剩余的行应用所有相关 materialized view 的 SELECT 查询进行转换,从而重建不包含冲突行的原始数据块。#89140 (Sema Checherinda)。当涉及 materialized view 时,现在允许在异步插入中使用去重。#93957 (Sema Checherinda)。
- 引入了一种新的语法和框架,用于简化并扩展 PROJECTION 索引功能。该变更是对 https://github.com/ClickHouse/ClickHouse/pull/81021 的后续改进。#91844 (Amos Bird)。
- 为
Array列添加文本索引功能支持。 #89895 (Jimmy Aguilar Mena). - 默认启用
use_variant_as_common_type,从而可以在Array中、UNION查询中以及if/multiIf/case分支中使用彼此不兼容的类型。#90677(Alexey Milovidov)。 - 新增系统表
zookeeper_info。实现了 #88014。#90809(Smita Kulkarni)。 - 在所有函数中支持
Variant类型。#90900(Bharat Nallan)。 - 在 Prometheus 的
/metrics端点中新增一个ClickHouse_Info指标,主要包含版本信息,从而可以构建随时间跟踪详细版本信息的图表。#91125(Christoph Wurm)。 - 为 keeper 引入了一个新的四字母命令
rcfg,用于修改集群配置。与标准的reconfigure请求相比,此命令在配置变更方面提供了更大的灵活性。命令以json字符串作为参数。发送到 TCP 接口的完整字节序列应如下所示:rcfg{json_string_length_big_endian}{json_string}。命令的一些示例如下:{"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}。#91354 (alesapin)。 - 添加函数
reverseBySeparator,用于将由指定分隔符分隔的字符串中的子串的顺序反转。关闭 #91463。#91780(Xuewei Wang)。 - 新增了
max_insert_block_size_bytes设置,用于更精细地控制插入数据块的形成。#92833(Kirill Kopnev)。 - 如果启用了
ignore_on_cluster_for_replicated_database配置项,则可以在 Replicated 数据库中执行带有ON CLUSTER子句的 DDL 查询。在这种情况下,将忽略集群名称。 #92872 (Kirill). - 实现了
mergeTreeAnalyzeIndexes函数。#92954 (Azat Khuzhin). - 新增配置项
use_primary_key。将其设置为false以禁用基于主键的 granule 剪枝。#93319(Nihal Z. Miaji)。 - 添加
icebergLocalCluster表函数。#93323 (Anton Ivashkin). - 新增了
cosineDistanceTransposed函数,用于近似计算两点之间的余弦距离。#93621(Raufs Dunamalijevs)。 - 在 system.parts 表中新增
files列,用于显示每个数据分区片段包含的文件数量。 #94337 (Match). - 为并发控制添加了一个 max-min 公平调度器。在严重 oversubscription 场景下(即大量查询争夺有限的 CPU 槽位时),可以提供更好的公平性。短时运行的查询不会因为那些长时间运行并随时间占用更多槽位的查询而受到惩罚。通过将
concurrent_threads_scheduler服务器 SETTING 的值设置为max_min_fair来启用。#94732(Sergei Trifonov)。 - 新增了允许 ClickHouse 客户端在连接服务器时覆盖 TLS SNI 的功能。 #89761 (Matt Klein).
- 在
joinGet函数调用中支持使用临时表。#92973(Eduard Karacharov)。 - 支持
DeltaLake表引擎中的删除向量。 #93852 (Kseniia Sumarokova). - 为
deltaLakeCluster添加对删除向量的支持。 #94365 (Kseniia Sumarokova). - 为数据湖增加对 Google Cloud Storage 的支持。 #93866 (Konstantin Vedernikov).
实验特性
- 将
QBit从 Experimental 提升至 Beta。 #93816 (Raufs Dunamalijevs). - 新增对
Nullable(Tuple)的支持。将allow_experimental_nullable_tuple_type设置为 1 以启用该功能。 #89643 (Nihal Z. Miaji). - 支持 Paimon REST catalog,延续自 https://github.com/ClickHouse/ClickHouse/pull/84423。 #92011 (JIaQi Tang).
性能优化
- Setting
use_skip_indexes_on_data_readis now enabled by default. This setting allows filtering in a streaming fashion, at the same time as reading, improving query performance and startup time. #93407 (Shankar Iyer). - 提升在
LowCardinality列上执行DISTINCT时的性能。关闭 #5917。#91639 (Nihal Z. Miaji)。 - 优化
distinctJSONPaths聚合函数,使其仅从分区片段中读取 JSON 路径,而无需扫描整个 JSON 列。#92196 (Pavel Kruglov)。 - 将更多过滤条件下推到 JOIN 操作中。#85556 (Nikita Taranov).
- 在过滤条件仅使用一侧输入时,支持更多从 JOIN 的 ON 条件下推过滤的场景。支持
ANY、SEMI、ANTIJOIN。#92584 (Dmitry Novik)。 - 允许使用等价 Set 将过滤条件下推到
SEMI JOIN。Closes #85239。#92837 (Dmitry Novik)。 - 当哈希 JOIN 的右侧为空时,跳过读取左侧。此前会一直读取左侧直到遇到第一个非空数据块,在存在大量过滤或聚合时可能会做大量无用工作。#94062 (Alexander Gololobov).
- 在查询管线内部使用 "fastrange"(Daniel Lemire)方法对数据进行分区。这可以提升并行排序和 JOIN 的性能。#93080 (Alexey Milovidov)。
- 在 PARTITION BY 子句与排序键完全匹配或为其前缀时,提高窗口函数的性能。#87299 (Nikita Taranov)。
- 将外层过滤条件下推到视图中,从而可以在本地和远程节点上应用 PREWHERE。解决了 #88189 问题。#88316 (Igor Nikonov)。
- Implement JIT compilations for more functions. Closes #73509. #88770 (Alexey Milovidov with Taiyang Li).
- 如果在
FINAL查询中使用的跳过索引位于主键中的某个列上,那么在其他分区片段中检查主键交集的额外步骤就是多余的,因此现在不会再执行。Resolves #85897。#93899 (Shankar Iyer)。 - Optimize performance and memory usage for fractional
LIMITandOFFSET. #91167 (Ahmed Gouda). - 修复在 Parquet Reader V3 预取器中使用更快随机读取逻辑的问题。Closes #90890。#91435 (Arsen Muk)。
- 提升
icebergCluster的性能。关闭 #91462。#91537(Yang Jiang)。 - 不要在常量过滤条件上使用虚拟列进行过滤。 #91588 (c-end).
- 通过启用自适应写缓冲区 (adaptive write buffers),在针对超宽表使用宽分区片段时降低 INSERT/合并操作的内存占用。为加密磁盘新增对自适应写缓冲区的支持。#92250 (Azat Khuzhin).
- Improved performance of full text search with text index and
sparseGramstokenizer by reducing the number of searched tokens in the index. #93078 (Anton Popov). - Function
isValidASCII已针对正向结果(即输入完全为 ASCII 的情况)进行了优化。#93347(Robert Schulze)。 - 顺序读取优化现在能够识别由于 WHERE 条件导致 ORDER BY 列为常量的情况,从而实现高效的反向顺序读取。这对于类似
WHERE tenant='42' ORDER BY tenant, event_time DESC的多租户查询非常有益,此类查询现在可以使用 InReverseOrder,而不再需要执行完整排序。#94103 (matanper)。 - 引入专门的 Enum AST 类,用 (string, integer) 对而非 ASTLiteral 子节点来存储值参数,从而优化内存占用。#94178 (Ilya Yatsishin)。
- 在多个副本上执行分布式索引分析。对于共享存储以及集群中海量数据场景具有优势。适用于 SharedMergeTree(ClickHouse Cloud),也可能适用于使用共享存储的其他类型 MergeTree 表。#86786 (Azat Khuzhin)。
- Reduce overhead of join runtime filters by disabling them in the following cases: - too many bits are set in the bloom filter - too few rows are filtered out at runtime. #91578 (Alexander Gololobov).
- Use an in-memory buffer for correlated subqueries input to avoid evaluating it multiple times. Part of #79890. #91205 (Dmitry Novik).
- 允许所有副本在并行副本读取时抢占孤立区间。这可以改善负载均衡并减少长尾延迟。#91374 (zoomxi)。
- 外部聚合/排序/JOIN 现在在所有场景下都会遵循查询设置
temporary_files_codec。修复了 Grace 哈希 JOIN 中缺失 profile 事件的问题。#92388 (Vladimir Cherkasov)。 - 改进在聚合/排序过程中将数据溢写到磁盘时对查询内存使用情况的检测,使其更加健壮。#92500 (Azat Khuzhin)。
- 估算聚合键列的总行数和 NDV(不同值数量)统计。#92812 (Alexander Gololobov)。
- 使用 simdcomp 优化倒排列表压缩。#92871 (Peng Jian)。
- 通过分桶重构 S3Queue 的 Ordered 模式处理流程。这也应当提升性能,减少 keeper 请求的数量。#92889 (Kseniia Sumarokova)。
- 函数
mapContainsKeyLike和mapContainsValueLike现在可以分别利用mapKeys()或mapValues()上的文本索引。#93049 (Michael Jarrett)。 - Reduce memory usage on non-Linux systems (enable immediate purging of jemalloc dirty pages). #93360 (Eduard Karacharov).
- 当脏页大小与
max_server_memory_usage的比值超过memory_worker_purge_dirty_pages_threshold_ratio时,强制清理 jemalloc arena。#93500 (Eduard Karacharov)。 - 降低 AST(抽象语法树)的内存占用。#93601 (Nikolai Kochetov)。
- In some cases we've seen ClickHouse doesn't respect a memory limit when reading from a table. This behaviour is fixed. #93715 (Nikita Mikhaylov).
- 默认启用 Keeper 的
CHECK_STAT和TRY_REMOVE扩展。#93886 (Mikhail Artemenko)。 - Parse lower and upper bounds of file names corresponding to position deletes from Iceberg manifest file entries for better selection of corresponding data files. #93980 (Daniil Ivanik).
- 新增两个设置,用于控制 JSON 列中动态子列的最大数量。第一个是 MergeTree 设置
merge_max_dynamic_subcolumns_in_compact_part(类似于已添加的merge_max_dynamic_subcolumns_in_wide_part),用于限制在合并为 Compact 分片时创建的动态子列数量。第二个是查询级别设置max_dynamic_subcolumns_in_json_type_parsing,用于限制在解析 JSON 数据时创建的动态子列数量,从而可以在插入时指定该上限。#94184 (Pavel Kruglov). - 在部分场景下对 JSON 列的压缩合并进行了小幅优化。#94247 (Pavel Kruglov)。
- 根据生产环境经验减小线程池队列大小。在从 MergeTree 读取任何数据之前,添加一次显式的内存使用量检查。#94692 (Nikita Mikhaylov)。
- 确保在 CPU 资源饥饿时,调度器会优先调度 MemoryWorker 线程,因为它可以保护 ClickHouse 进程免受致命威胁。#94864 (Nikita Mikhaylov)。
- 在与 MemoryWorker 主线程不同的线程中执行 jemalloc 脏页清理。如果清理较慢,可能会延迟 RSS 使用量的更新,从而导致进程因内存不足而被杀死。引入新的配置项
memory_worker_purge_total_memory_threshold_ratio,用于根据总内存使用量的比例启动脏页清理。#94902 (Antonio Andelic)。
改进
system.blob_storage_log现已可用于 Azure Blob Storage。#93105(Alexey Milovidov)。- 为 Local 和 HDFS 实现
blob_storage_log。修复S3Queue在blob_storage_log中记录日志时未使用磁盘名称而导致的错误。为blob_storage_log添加error_code列。拆分测试配置文件以简化本地测试。#93106(Alexey Milovidov)。 - 在输入时,
clickhouse-client和clickhouse-local会高亮显示数值字面量中的数字分组(千位、百万位等)。此更改修复了 #93100。#93108(Alexey Milovidov)。 - 在
clickhouse-client中新增对在等号两侧包含空格的命令行参数的支持。修复了 #93077。#93174(Cole Smith)。 - 在配置
<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap>后,CLI 客户端现在可以像之前一样回退为使用 Ctrl-R 进行常规搜索,而 Ctrl-T 用于模糊搜索。#87785(Larry Snizek)。 - 用于清理缓存的语句
SYSTEM DROP [...] CACHE给人一种错误印象,好像该语句会禁用缓存。ClickHouse 现在支持语句SYSTEM CLEAR [...] CACHE,含义更加清晰。旧的语法仍然可用。#93727(Pranav Tiwari)。 - 在
EmbeddedRocksDB中支持使用多个列作为主键。修复 #32819。#33917(usurai)。 - 现在可以在标量上使用非常量的 IN(例如查询
val1 NOT IN if(cond, val2, val3))。#93495(Yarik Briukhovetskyi)。 - 防止在
HeadObject、UploadPart和CompleteMultipartUploadS3 请求中继续传递x-amz-server-side-encryption头部,因为这些请求不支持该头部。#64577(Francisco J. Jurado Moreno)。 - 在 S3Queue 中跟踪有序模式下的 Hive 分区。修复了 #71161。#81040(Anton Ivashkin)。
- 优化文件系统缓存中的空间预留。
FileCache::collectCandidatesForEviction将在不持有独占锁的情况下执行。#82764 (Kseniia Sumarokova)。 - 支持服务器日志的复合轮转策略(大小 + 时间)。 #87620 (Jianmei Zhang).
- CLI 客户端现在可以指定
<warnings>false</warnings>以替代命令行参数--no-warnings。 #87783 (Larry Snizek). - 为
avg聚合函数添加对 Date、DateTime 和 Time 类型参数的支持。修复了 #82267 中的问题。#87845(Yarik Briukhovetskyi)。 - 优化项
use_join_disjunctions_push_down默认启用。#89313(Alexey Milovidov)。 - 在关联子查询中支持更多表引擎和数据源类型。关闭 Issue #80775。#90175(Dmitry Novik)。
- 如果显式指定了参数化视图的 schema,则会显示该 schema。关闭 #88875、#81385。#90220(Grigorii Sokolik)。
- 如果日志早于最后一次提交的索引,则正确处理 Keeper 日志条目中的间隙。 #90403 (Antonio Andelic)。
- 改进
min_free_disk_bytes_to_perform_insert设置项,使其在 JBOD 卷上能正确工作。 #90878 (Aleksandr Musorin). - 允许在命名集合中为
S3表引擎和s3表函数指定storage_class_name设置。#91926 (János Benjamin Antal)。 - 支持通过
system.zookeeper插入辅助 ZooKeeper。 #92092 (RinChanNOW). - 为 Keeper 添加新指标:
KeeperChangelogWrittenBytes、KeeperChangelogFileSyncMicroseconds、KeeperSnapshotWrittenBytes和KeeperSnapshotFileSyncMicrosecondsprofile events,以及KeeperBatchSizeElements和KeeperBatchSizeBytes直方图指标。#92149(Miсhael Stetsyuk)。 - 新增一个设置项
trace_profile_events_list,将使用trace_profile_event的跟踪限制为指定的事件名称列表。这使得在大规模工作负载下可以进行更精确的数据采集。#92298 (Alexey Milovidov). - 为可暂停的 failpoint 新增对 SYSTEM NOTIFY FAILPOINT 的支持;在 SYSTEM WAIT FAILPOINT fp 中新增对 PAUSE/RESUME 的支持。#92368(Shaohua Wang)。
- 为
system.data_skipping_indices添加creation(隐式/显式)列。 #92378 (Raúl Marín). - 允许将 YTsaurus 动态表的列描述传递给字典数据源。#92391 (MikhailBurdukov)。
- 在 #63985 中,我们实现了可以按端口粒度指定 TLS 配置所需的全部参数(参见 composable protocols),从而不再需要依赖全局 TLS 配置。然而,该实现仍然隐式要求存在一个全局的
openSSL.server配置段,这与需要为不同端口使用不同 TLS 配置的场景相冲突。例如,在 keeper-in-server 部署中,我们需要分别为 keeper 之间的通信和 ClickHouse 客户端连接配置独立的 TLS 配置。#92457(Miсhael Stetsyuk)。 - 引入一个新的设置
input_format_binary_max_type_complexity,用于限制在二进制格式中可解码的类型节点总数,以防止恶意载荷。#92519(Raufs Dunamalijevs)。 - 在
system.background_schedule_pool{,_log}中展示当前正在运行的任务。新增文档。#92587 (Azat Khuzhin). - 如果在客户端中使用 Ctrl+R 搜索时在历史记录中未找到匹配项,则执行当前查询。#92749(Azat Khuzhin)。
- 支持
EXPLAIN indices = 1作为EXPLAIN indexes = 1的别名。关闭 #92483。#92774(Pranav Tiwari)。 - Parquet 读取器现在允许将 Tuple 或 Map 类型的列以 JSON 形式读取:
select x from file(f.parquet, auto, 'x JSON')即使在f.parquet中列x的类型是 tuple 或 map 也能正常工作。#92864(Michael Kolupaev)。 - 在 Parquet 读取器中添加对空元组的支持。 #92868 (Michael Kolupaev).
- 当 Azure Blob Storage 的原生复制因 BadRequest(例如 block 列表无效)失败时,回退到读写复制方式。之前仅在将 blob 复制到不同存储帐户时出现 Unauthorized 错误才会进行此回退。但我们有时也会遇到 “The specified block list is invalid” 错误。因此现在更新了条件,对所有原生复制失败的情况都回退到读写模式。#92888(Smita Kulkarni)。
- 修复在使用 EC2 实例角色凭证运行大量并发 S3 查询时对 EC2 元数据端点访问被限流的问题。之前,每个查询都会创建自己的
AWSInstanceProfileCredentialsProvider,导致对 EC2 元数据服务发起并发请求,从而可能引发超时和HTTP response code: 403错误。现在,凭证提供程序会被缓存,并在所有查询之间共享。#92891(Sav)。 - 重构
insert_select_deduplicate设置,以支持保留向后兼容性。 #92951 (Sema Checherinda). - 将耗时超过平均水平的后台任务记录到日志中(
background_schedule_pool_log.duration_threshold_milliseconds=30),以避免产生过多的任务日志。#92965(Azat Khuzhin)。 - 在之前的版本中,一些 C++ 函数名在
system.trace_log和system.symbols中显示不正确(被“mangled”),并且demangle函数无法正确处理它们。解决了 #93074。#93075(Alexey Milovidov)。 - 引入了名为
backup_data_from_refreshable_materialized_view_targets的备份设置,用于在执行备份时跳过可刷新 materialized view。使用 APPEND 刷新策略的 RMV 始终会被备份。#93076 (Julia Kartseva). #93658 (Julia Kartseva) - Use minimal debug info instead of no debug info for heavy translation units, such as functions. #93079 (Alexey Milovidov).
- 通过为 MinIO 特定错误实现错误码映射,为 AWS S3 C++ SDK 添加了对 MinIO 的兼容性支持。此更改使 ClickHouse 在使用 MinIO 部署替代 AWS S3 时,能够正确处理并重试来自 MinIO 服务器的错误,从而提升在自托管 MinIO 集群上运行对象存储场景的可靠性。 #93082 (XiaoBinMu).
- 写入已符号化的 jemalloc 性能分析文件(在生成堆内存性能分析时无需提供可执行二进制文件)。 #93099 (Azat Khuzhin).
- 恢复
clickhouse git-import工具——此前在处理较大或无效的提交时会出错。参见 https://presentations.clickhouse.com/2020-matemarketing/。 #93202 (Alexey Milovidov)。 - 不在查询日志中显示来自 URL 存储的密码。#93245 (Konstantin Vedernikov).
- 为
flipCoordinates添加对Geometry类型的支持。 #93303 (Bharat Nallan). - 改进 SYSTEM INSTRUMENT ADD/REMOVE 的用户体验:对函数名使用字符串字面量,为所有匹配的函数应用补丁,并允许在
REMOVE中使用 function_name。 #93345 (Pablo Marcos)。 - 新增一个名为
materialize_statistics_on_merge的设置,用于启用或禁用在合并过程中物化统计信息。默认值为1。 #93379 (Han Fei). - ClickHouse 现在可以解析
DESCRIBE SELECT查询中不带括号的SELECT。关闭了 #58382。#93429(Yarik Briukhovetskyi)。 - Add randomization of cache correctness checks under probability. #93439 (Kseniia Sumarokova).
- 添加设置
type_json_allow_duplicated_key_with_literal_and_nested_object,以允许在 JSON 中出现重复路径,其中一个是字面量,另一个是嵌套对象,例如{"a" : 42, "a" : {"b" : 42}}。在对重复路径的限制于 https://github.com/ClickHouse/ClickHouse/pull/79317 中添加之前,部分数据可能已经被创建,现在对这些数据进行进一步操作可能会导致错误。启用此设置后,此类旧数据仍然可以在无错误的情况下使用。#93604 (Pavel Kruglov)。 - 在 Pretty JSON 中,不要将简单类型的值打印在单独的行上。#93836(Pavel Kruglov)。
- 当存在大量
alter table ... modify setting ...语句时,可能在 5 秒内无法获取到锁。此时返回timeout比返回logical error更合适。#93856(Han Fei)。 - 避免在发生语法错误时产生过多输出。在此更改之前,会输出整个 SQL 脚本,而脚本中可能包含大量查询语句。#93876(Alexey Milovidov)。
- 正确计算 Keeper 中带有统计信息的
check请求的字节大小。#93907 (Mikhail Artemenko). - 新增了
use_hash_table_stats_for_join_reordering设置,用于控制在 JOIN 重排序时是否使用运行时哈希表大小的统计信息。该设置默认启用,从而保留collect_hash_table_stats_during_joins的现有行为。#93912(Vladimir Cherkasov)。 - 用户现在可以在
system.server_settings表中查看部分嵌套的全局服务器设置(例如logger.level)。这仅适用于具有固定结构的设置项(不包含列表、枚举、重复等)。#94001(Hechem Selmi)。 QBit现在可以进行相等性比较。#94078(Raufs Dunamalijevs)。- 当 Keeper 检测到快照损坏或变更日志不一致时,将抛出异常,而不是直接中止或自动清理文件。这样可以通过依赖人工干预,使 Keeper 的行为更加安全。#94168 (Antonio Andelic).
- 修复
CREATE TABLE失败时可能遗留多余对象的问题。 #94174 (Azat Khuzhin). - 修复在使用受密码保护的 TLS 密钥时访问未初始化内存的问题(OpenSSL 中的一个缺陷)。 #94182 (Konstantin Bogdanov)。
- 将 chdig 升级到 v26.1.1。#94290(Azat Khuzhin)。
- 在 S3Queue 有序模式下支持更通用的分区方式。#94321 (Bharat Nallan)。
- 为设置
allow_statistics_optimize新增别名use_statistics。这与现有设置use_primary_key和use_skip_indexes更加一致。#94366(Robert Schulze)。 - 在从 Numbers 转换为 Enums 时启用了
input_format_numbers_enum_on_conversion_errorSETTING,以检查元素是否存在。#94384 (Elmi Ahmadov)。 - 在 S3(Azure)Queue 的有序模式下,通过跟踪限制来清理失败节点(此前该操作仅在无序模式下同时对失败和已处理节点执行,因此现在也会在有序模式下执行,但只针对失败节点)。 #94412 (Kseniia Sumarokova).
- 在 clickhouse-local 中为
default用户启用访问管理功能。clickhouse-local中的默认用户缺少access_management权限,这会导致诸如DROP ROW POLICY IF EXISTS之类的操作因ACCESS_DENIED错误而失败,即使该用户本应不受限制。#94501(Alexey Milovidov)。 - 为 YTsaurus 字典和表启用命名集合。#94582 (MikhailBurdukov)。
- 为 S3 和 Azure Blob Storage 的 BACKUP/RESTORE 添加对通过 SQL 定义的命名集合的支持。关闭 #94604。#94605(Pablo Marcos)。
- 在有序模式下,为 S3Queue 提供基于分区键的分桶支持。#94698 (Bharat Nallan)。
- 新增一个异步指标,用于记录耗时最长的合并操作的已用时间。 #94825 (Raúl Marín).
- 在使用 IcebergBitmapPositionDeleteTransform 执行 position delete 操作之前,增加所属文件的检查。 #94897 (Yang Jiang).
- 现在
view_duration_ms显示的是该分组处于活跃状态的持续时间,而不再是其中各线程持续时间的总和。#94966(Sema Checherinda)。 - 移除了
hasAnyTokens和hasAllTokens函数中搜索 token 数量上限为 64 的限制。示例:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]);此前该查询会因为包含 65 个搜索 token 而抛出BAD_ARGUMENTS错误。通过此 PR,该限制已被完全移除,相同查询将不再报错。#95152 (Elmi Ahmadov). - 添加名为
input_format_numbers_enum_on_conversion_error的 SETTING,用于在将 Numbers 转换为 Enums 时检查元素是否存在。Closes: #56144。#56240(Nikolay Degterinsky)。 - Share format parser resources between data file and position delete file reading in Iceberg tables to reduce memory allocations. #94701 (Yang Jiang).
错误修复(官方稳定版本中用户可见的异常行为)
- 修复了一个问题:预定义查询处理程序在插入数据时会将末尾的空白字符误解释为数据。#83604(Fabian Ponce)。
- 修复在 Join 存储以及“外连接转内连接”优化生效时出现的
INCOMPATIBLE_TYPE_OF_JOIN错误。解决了 #80794。#84292(Vladimir Cherkasov)。 - 修复在启用
allow_experimental_join_right_table_sorting并使用哈希连接(hash join)时出现的异常“Invalid number of rows in Chunk”。 #86440 (yanglongwei). - 如果文件系统不区分大小写,则在 MergeTree 中始终将文件名替换为哈希值。此前在使用不区分大小写文件系统(如 macOS)的系统上,当多个列/子列名仅在大小写上不同时,可能会导致数据损坏。 #86559 (Pavel Kruglov)。
- 在创建 materialized view 时,对其中的底层查询执行完整的权限检查。#89180(pufit)。
- 修复了在常量参数上调用
icebergHash函数时发生的崩溃。#90335 (Michael Kolupaev). - 修复了这样一个逻辑错误:在没有事务的情况下执行 mutation 时,会修改处于活动事务中的分区片段,而该活动事务最终会被回滚。 #90469 (Shaohua Wang).
- 在将普通数据库转换为 Atomic 数据库后,正确更新
system.warnings。#90473 (sdk2)。 - 修复了在从 Parquet 文件读取数据时,如果 prewhere 表达式的一部分在查询的其他位置被使用时出现的断言失败。 #90635 (Max Kainov).
- 修复了在单节点集群中使用 split-by-buckets 模式从 Iceberg 读取时发生的崩溃问题。此更改关闭了 #90913。#91553(Konstantin Vedernikov)。
- 修复 Log 引擎在读取子列时可能出现的逻辑错误。关闭问题 #91710。#91711(Pavel Kruglov)。
- 修复在 ATTACH AS REPLICATED 过程中出现的逻辑错误:'Storage does not support transaction'。 #91772 (Shaohua Wang)。
- 修复在
LEFT ANTI JOIN带有额外后置条件时运行时过滤器行为异常的问题。#91824(Alexander Gololobov)。 - 修复了一个错误,该错误出现在对
Nothing类型进行空值安全比较时。关闭了 #91834。关闭了 #84870。关闭了 #91821。#91884(Yarik Briukhovetskyi)。 - 修复原生 Parquet 读取器中 DELTA_BYTE_ARRAY 解码缺陷,影响对高度重复字符串数据的处理。#91929(Daniel Muino)。
- 在使用 globs 进行 schema 推断时,仅为其推断来源的那个文件缓存 schema,而不是为所有文件缓存 schema。修复了 #91745。#92006(Pavel Kruglov)。
- 修复由于归档条目大小头部不正确而导致的
Couldn't pack tar archive: Failed to write all bytes错误。修复了 #89075。#92122(Julia Kartseva)。 - 在 INSERT SELECT 中释放请求流,以防止关闭 HTTP 连接。 #92175 (Sema Checherinda).
- 修复在包含多个带有
USING子句的 JOIN 且启用了join_use_nulls的查询中的逻辑错误。#92251 (Vladimir Cherkasov). - 修复在启用
join_use_nulls时进行 JOIN 重排时的逻辑错误,关闭 https://github.com/ClickHouse/ClickHouse/issues/90795。 #92289 (Vladimir Cherkasov). - 修复 arrayElement 与带负号字面量组合时 AST 格式不一致的问题。关闭 #92288、#92212、#91832、#91789、#91735、#88495、#92386。#92293(Pavel Kruglov)。
- 修复在使用
join_on_disk_max_files_to_merge设置时可能发生的崩溃。#92335 (Bharat Nallan)。 - 相关问题 #https://github.com/ClickHouse/support-escalation/issues/6365。[#92339](https://github.com/ClickHouse/ClickHouse/pull/92339)([Tuan Pham Anh](https://github.com/tuanpach))。
- 修复
SYSTEM SYNC FILE CACHE中缺失的访问检查。关闭 #92101。#92372(Kseniia Sumarokova)。 - 修复
count_distinct_optimization在处理窗口函数和多参数时的优化过程。#92376 (Raúl Marín). - 修复了在将某些聚合函数与窗口函数一起使用时出现的 "Cannot write to finalized buffer" 错误。关闭了 #91415。#92395(Jimmy Aguilar Mena)。
- 修复使用
CREATE TABLE ... AS urlCluster()与数据库引擎Replicated时的逻辑错误。解决 #92216 中报告的问题。#92418(Kseniia Sumarokova)。 - 在 MergeTree 中执行变更操作(mutation)时继承源 part 的序列化信息设置。这样可以在更改数据类型序列化方式后,修复对已变更 part 执行查询时可能出现的查询结果不正确的问题。#92419(Pavel Kruglov)。
- 修复具有相同名称的列和子列之间可能发生的冲突,该冲突可能会导致采用错误的序列化方式,从而引发查询失败。修复 #90219。修复 #85161。#92453(Pavel Kruglov)。
- 修复由于在将外连接转换为内连接时对查询计划进行非预期修改而导致的
LOGICAL_ERROR。同时放宽该优化的条件,使其也能应用于在 JOIN 过程中对聚合键应用单射函数的情况。#92503 (János Benjamin Antal). - 修复在对空元组列进行排序时可能出现的
SIZES_OF_COLUMNS_DOESNT_MATCH错误。关闭 #92422。#92520(Pavel Kruglov)。 - 检查 JSON 类型中的不兼容类型化路径。修复 #91577。#92539(Pavel Kruglov)。
- 修复在 Backup 数据库上执行 SHOW CREATE DATABASE 时出现的死锁问题。#92541 (Azat Khuzhin).
- 在验证假设索引时使用正确的错误代码。 #92559 (Raúl Marín).
- 修复分析器中列别名的动态子列解析问题。此前,列别名中的动态子列会被包装为
getSubcolumn调用,在某些情况下可能根本无法解析。关闭 #91434。#92583(Pavel Kruglov)。 - 防止在
tokens()的第二个参数为NULL时发生崩溃。#92586 (Raúl Marín)。 - 修复由于对底层 const PREWHERE 列进行就地修改可能导致的潜在崩溃问题。该问题可能在列收缩(
IColumn::shrinkToFit)或过滤(IColumn::filter)时触发,这些操作可能会被多个线程并发执行。#92588 (Arsen Muk). - 当前已暂时禁用在包含大型分区片段(超过 4,294,967,295 行)的表上创建和物化文本索引。此限制是为防止出现不正确的查询结果,因为当前的索引实现尚不支持如此大的分区片段。#92644(Anton Popov)。
- 修复在执行 JOIN 时出现的逻辑错误
Too large size (A) passed to allocator。关闭 #92043。#92667(Yarik Briukhovetskyi)。 - 修复了一个错误:当
ngrambf_v1索引的 ngram 长度(第一个参数)大于 8 时会抛出异常的问题。#92672 (Robert Schulze)。 - 修复在使用 ZooKeeper 存储时后台重新加载命名集合时出现的未捕获异常。修复 https://github.com/ClickHouse/clickhouse-private/issues/44180。 #92717 (Kseniia Sumarokova).
- 修正了通配符授权的访问权限检查中不正确的逻辑。之前的尝试 https://github.com/ClickHouse/ClickHouse/pull/90928 虽然修复了一个严重漏洞,但最终限制过于严格,导致某些带通配符的
GRANT语句因无关的撤销操作而失败。#92725(pufit)。 - 修复在
WHERE子句中使用not match(...)时的数据跳过逻辑错误,该错误会导致结果错误。修复 #92492。#92726(Nihal Z. Miaji)。 - 如果在只读磁盘上创建了 MergeTree 表,则在启动时不要尝试删除临时目录。#92748 (Alexey Milovidov)。
- 修复在 ALTER TABLE REWRITE PARTS (v2) 中出现的 "Cannot add action to empty ExpressionActionsChain" 错误。 #92754 (Azat Khuzhin).
- 避免因为从已断开的
Connection读取而导致的崩溃。#92807 (Raufs Dunamalijevs)。 - 修复在
Ordered模式下存储引擎S3Queue中出现的逻辑错误Failed to set file processing within 100 retries。现在该错误已被改为警告。在 25.10 版本之前,如果 Keeper 会话过期,可能会出现此错误;然而在 25.10+ 版本中,这种情况也只会记录为警告,因为在Ordered模式下高并发处理时,从理论上仍有可能出现此错误。 #92814 (Kseniia Sumarokova). - 之前,某些使用 PK 分片并带有恒为假条件的查询会失败,现在则不会了。此更改是 https://github.com/ClickHouse/ClickHouse/pull/89313 所需的。#92815(Yarik Briukhovetskyi)。
- 修复了
system.parts表中文本索引未压缩大小的计算方式。#92832(Anton Popov)。 - 修正了在
WHERE子句谓词中包含带子查询的IN子句时,轻量级更新对主索引的使用。#92838(Anton Popov)。 - 修复在 JSON 中为路径 'skip' 创建类型提示时的问题。关闭 #92731。#92842(Pavel Kruglov)。
- 在 S3 表引擎中,如果存在非确定性函数,应避免缓存分区键。 #92844 (Miсhael Stetsyuk).
- 修复在对带有
ratio_of_defaults_for_sparse_serialization=0.0的稀疏列进行 mutation 后可能出现的错误FILE_DOESNT_EXIST。修复 #92633。#92860(Pavel Kruglov)。 - 修复旧版 Parquet 读取器(默认不启用)在 JSON 列位于 Tuple 列之后时的 Parquet schema 推断问题。修复旧版 Parquet 读取器(默认不启用)在处理空元组时失败的问题。#92867(Michael Kolupaev)。
- 修复在常量条件下并开启
join_use_nulls时执行多个 JOIN 的逻辑错误,关闭 #92640。#92892(Vladimir Cherkasov)。 - 修复在向分区表达式中包含子列的表插入数据时可能出现的错误
NOT_FOUND_COLUMN_IN_BLOCK。关闭 #93210。关闭 #83406。#92905(Pavel Kruglov)。 - 修复在对带有别名的表使用 Merge 引擎时出现的
NO_SUCH_COLUMN_IN_TABLE错误。关闭 #88665。#92910(Pavel Kruglov)。 - 修复在 LowCardinality(Nullable(T)) 列上执行 full_sorting_join 时出现的 NULL != NULL 的情况。#92924(Vladimir Cherkasov)。
- 修复了在
MergeTree表中执行文本索引合并时出现的多个崩溃问题。 #92925 (Anton Popov). - 在进行生存时间 (TTL) 聚合时,如有需要,为 SET 表达式的结果恢复 LowCardinality 包装,以防止在表优化期间抛出异常。#92971 (Seva Potapov).
- 修复在索引分析中,当在
has函数中使用空数组时出现的逻辑错误。关闭 #92906。#92995(Nihal Z. Miaji)。 - 修复在终止后台调度池时可能发生的卡死问题(可能导致服务器在关闭时挂起)。 #93008 (Azat Khuzhin).
- 修复在通过 ALTER 将设置项
ratio_of_defaults_for_sparse_serialization修改为1.0之后,执行稀疏列变更时可能出现的 FILE_DOESNT_EXIST 错误。 #93016 (Pavel Kruglov). - 修复在 WHERE 子句中使用
not materialize(...)或not CAST(...)时的数据跳过逻辑错误,该错误会导致结果不正确。关闭 #88536。#93017(Nihal Z. Miaji)。 - 修复由于共享分区片段上的 TOCTOU 竞态条件,可能会误用已过期分区片段的问题。#93022 (Azat Khuzhin)。
- 修复在反序列化格式错误且包含越界偏移的
groupConcat聚合状态时发生的崩溃。#93028(Raufs Dunamalijevs)。 - 修复在提前取消分布式查询后导致连接处于损坏状态的问题。 #93029 (Azat Khuzhin).
- 修复了在右侧 join 键为稀疏列时的 join 结果问题。这解决了 #92920。我只能在
set compatibility='23.3'时重现该 bug。不确定是否需要进行回溯(backport)。#93038(Amos Bird)。 - 修复在
estimateCompressionRatio()中可能出现的Cannot finalize buffer after cancellation错误。修复: #87380 。 #93068 (Azat Khuzhin)。 - 修复了基于复杂表达式(例如
concat(col1, col2))构建的文本索引在合并时的问题。#93073 (Anton Popov)。 - 修复在过滤条件包含子列时应用 PROJECTION 的问题。解决 #92882。#93141(Pavel Kruglov)。
- 修复在将 join 运行时过滤器添加到查询计划时,在某些情况下被触发的逻辑错误。该问题是由于从 join 的一侧错误地返回了重复的常量列而导致的。 #93144 (Alexander Gololobov).
- 由 join 运行时过滤器使用的特殊函数
__applyFilter在某些本应合法的情况下错误地返回错误码 ILLEGAL_TYPE_OF_ARGUMENT。 #93187 (Alexander Gololobov)。 - 防止在插值列实际上是同一列的别名时,不同的插值列在同一数据块中被折叠到同一列上。#93197 (Yakov Olkhovskiy)。
- 在与已填充的右侧表进行 JOIN 时,不要添加运行时过滤器。#93211 (Alexander Gololobov)。
- 修复 Keeper 在会话终止后未清理持久化 watch 的问题。此更改关闭了 #92480。#93213(Konstantin Vedernikov)。
- 修复 Iceberg 中按元组进行 ORDER BY 时的问题。由此关闭 #92977。#93225(Konstantin Vedernikov)。
- 修复 S3Queue 中
s3queue_migrate_old_metadata_to_buckets设置的 bug。关闭 #93392、#93196、#81739。#93232(Kseniia Sumarokova)。 - 在合并过程中重建投影时移除未使用的列。这样可以减少内存使用并降低临时分区片段的数量。#93233 (Nikolai Kochetov)。
- 修复在存在标量关联子查询时,从子查询中删除未使用列的问题。在修复之前,如果某列仅在关联子查询中使用,则可能会被删除,从而导致查询以
NOT_FOUND_COLUMN_IN_BLOCK错误失败。 #93273 (Dmitry Novik). - 修复在对源表执行 ALTER 时,物化视图中可能出现的子列缺失问题。关闭 #93231。#93276(Pavel Kruglov)。
- 修复在使用 analyzer 为
Merge表引擎进行查询规划时,在合并本地和远程/Distributed 表的情况下,可能对hostName()抛出 ILLEGAL_COLUMN 的问题。关闭 #92059。 #93286 (Jinlin)。 - 修复了在使用非常量数组参数时 NOT IN 返回错误结果的问题,并增加了对非常量 Array 函数的支持。关闭 #14980。#93314(Yarik Briukhovetskyi)。
- 修复
use_top_k_dynamic_filtering优化中的Not found column错误。修复 #93186。#93316(Nikolai Kochetov)。 - 修复了在子列之上创建的文本索引的重建问题。 #93326 (Anton Popov).
- 修复了在
hasAllTokens和hasAnyTokens函数中将空数组作为第二个参数时的处理逻辑。#93328(Anton Popov)。 - 修复在包含右侧表 totals 且使用运行时过滤器的查询中的逻辑错误。 #93330 (Alexander Gololobov).
- 当使用非 const 分词器参数(第 2、3、4 个参数)调用函数
tokens时,例如SELECT tokens(NULL, 1, materialize(1)),服务器不再崩溃。#93383(Robert Schulze)。 - 修复了
groupConcat状态反序列化中的整数溢出漏洞,该漏洞可能在处理精心构造的聚合状态时导致内存安全问题。 #93426 (Raufs Dunamalijevs). - 修复了在数组列上进行文本索引分析时,如果索引中不包含任何 token(所有数组为空或所有 token 都被分词器跳过)时的处理逻辑。 #93457 (Anton Popov).
- 如果连接字符串中已包含用户名/密码,则在 ClickHouse Client 中不再使用 OAuth 登录。#93459(Krishna Mannem)。
- 修复 DataLakeCatalog 中对 Azure ADLS Gen2 下发凭据的支持:从 Iceberg REST 目录中解析
adls.sas-token.*键,并修正 ABFSS URL 解析。#93477(Karun Anantharaman)。 - 修复在使用分析器时对 GLOBAL IN 的支持(此前会在远程节点上再次创建 Set)。 #93507 (Azat Khuzhin).
- 修复在反序列化期间直接将子列提取到稀疏列时的问题。#93512 (Pavel Kruglov)。
- 修复了在直接从文本索引读取时处理重复搜索查询时的错误。 #93516 (Anton Popov).
- 修复在启用运行时过滤器且参与 JOIN 的表中存在相同列被多次返回时(例如 SELECT a, a, a FROM t)出现的 NOT_FOUND_COLUMN_IN_BLOCK 错误。 #93526 (Alexander Gololobov)。
- 修复一个 bug:使用 SSH 连接时,clickhouse-client 会要求输入两次密码。 #93547 (Isak Ellmer).
- 确保在关闭时正确完成 ZooKeeper 的终止(修复在极少数情况下可能发生的关闭挂起问题)。 #93602 (Azat Khuzhin).
- 修复在恢复 ReplicatedMergeTree 时,由去重竞态条件导致的 LOGICAL_ERROR。#93612(Pablo Marcos)。
- 修复在某些输入格式中,直接反序列化到稀疏列时,用稀疏列执行生存时间 (TTL) 更新的方式。该修复解决了可能出现的逻辑错误
Unexpected type of result TTL column。 #93619 (Pavel Kruglov). - 修复 h3 索引函数在使用无效输入调用时偶发崩溃或卡死的问题。#93657 (Michael Kolupaev).
- 对非 UTF-8 数据使用
ngram_bf索引会导致未初始化内存读取,读取到的值可能被写入到生成的索引结构中。修复了 #92576。#93663(Alexey Milovidov)。 - 验证解压后的缓冲区大小是否符合预期。 #93690 (Raúl Marín).
- 防止用户在未经过
SHOW COLUMNS权限检查的情况下,使用merge表引擎从表中获取列列表。 #93695 (János Benjamin Antal). - 修复了针对子列创建的跳过索引在物化时的问题。 #93708 (Anton Popov).
- 我们将各存储对象的共享指针保存在
QueryPipeline::resources::storage_holders中,以确保在PipelineExecutor仍然存活时不会销毁IStorage对象。 #93746 (Miсhael Stetsyuk). - 修复在重启后 interserver 主机发生变化时附加 Replicated 数据库失败的问题。#93779 (Tuan Pham Anh)。
- 修复在启用缓存时会在
ReadBufferFromS3中触发的断言!read_until_position问题。 #93809 (Kseniia Sumarokova). - 修复了在极少数情况下将空元组用于
Map列时的逻辑错误。关闭了 #93784。#93814(Nihal Z. Miaji)。 - 修复了在合并期间重建投影时
_part_offset出现损坏的问题,并通过避免对_part_offset列的不必要读取,以及在投影计算中跳过不需要的列来优化投影处理。此更改延续了在 #93233 中引入的优化。#93827(Amos Bird)。 - 移除对 'Bad version' 的处理逻辑。#93843 (Anton Ivashkin).
- 修复当键为有符号整数类型时,
optimize_inverse_dictionary_lookup在分布式查询中不生效的问题。修复 #93259。#93848(Nihal Z. Miaji)。 - 修复了在分布式
remote()查询中lag/lead无法使用的问题。关闭 #90014。#93858(Nihal Z. Miaji)。 - 修复系统监控分发问题。 #93937 (Pablo Marcos).
- 在 https://github.com/ClickHouse/ClickHouse/pull/89173 中,我们在通过内部管道由
TraceSender发送的结构体中添加了一个额外字段。但是缓冲区大小并未更新(见这里),因此我们向缓冲区写入了超过buffer_size的数据,导致缓冲区被多次 flush。并且由于TraceSender::send是在不同线程中被调用的,不同线程的 flush 可能交错,从而破坏接收端(TraceCollector)所依赖的不变式。#93966(Miсhael Stetsyuk)。 - 修复在使用
USING子句进行连接操作时,存储引擎Join执行向超类型类型转换的问题。修复了 #91672。修复了 #78572。#94000(Dmitry Novik)。 - 修复在 Merge 表上应用 join 运行时过滤器时未正确添加 FilterStep 的问题。#94021(Alexander Gololobov)。
- 包含在多个列上使用谓词、带有 Bloom 过滤器跳过索引,并同时包含
OR和NOT条件的SELECT查询,此前可能会返回不一致的结果。该问题现已修复。#94026 (Shankar Iyer). - 修复在存在依赖索引时对 CLEAR 列的处理问题。#94057 (Raúl Marín)。
- 修复
ReadWriteBufferFromHTTP中 use-of-uninitialized-value(使用未初始化值)的问题。 #94058 (Alexey Milovidov). - 修复对 JSON 中类型化路径的错误检查。该检查在 https://github.com/ClickHouse/ClickHouse/pull/92842 中引入,可能会在启动现有表时导致错误。 #94070 (Pavel Kruglov).
- 修复在存在 OUTER JOIN 时执行过滤分析时出现的崩溃。解决了 #90979。#94080(Dmitry Novik)。
- 修复在并行执行时(
max_threads> 1,默认值)使用 UInt8 聚合键时uniqTheta的精度问题。#94095 (Azat Khuzhin). - 修复由于在
SCOPE_EXIT中调用socket.setBlocking(true)时抛出异常而导致的崩溃。#94100(Miсhael Stetsyuk)。 - 修复在 ReplicatedMergeTree 中,
DROP PARTITION删除由后续日志条目创建的分区片段时导致的数据丢失问题。 #94123 (Tuan Pham Anh)。 - 修复了 parquet reader v3 在处理跨页面边界的数组时的错误行为。比如,当读取由 Arrow 写出但未启用页面统计或页面索引的文件时会出现这种情况。仅影响 Array 数据类型的列。典型表现是大约每 1 MB 数据就会有一个数组被截断。在此修复之前,可以使用如下设置作为临时解决方案:
input_format_parquet_use_native_reader_v3 = 0。#94125 (Michael Kolupaev)。 - 修复 ReplicatedMergeTree 在等待日志记录时产生过多 watch 的问题。#94133(Azat Khuzhin)。
- 函数
arrayShuffle、arrayPartialShuffle和arrayRandomSample用于将 const 列物化,以便不同的行得到不同的结果。#94134 (Joanna Hulboj). - 修复在 materialized view 中执行表函数时的数据竞争问题。#94171 (Alexey Milovidov)。
- 修复在
PostgreSQL数据库引擎中因查询不正确而导致的nullptr解引用问题。关闭 #92887。#94180(Alexey Milovidov)。 - 修复了在可刷新materialized view 中使用包含多个子查询的
SELECT查询时出现的内存泄漏。#94200(Antonio Andelic)。 - 修复了
DataPartStorageOnDiskBase::remove与system.parts之间的数据竞争问题。关闭 #49076。#94262(Alexey Milovidov)。 - 移除 HashTable 复制赋值运算符上错误使用的
noexcept说明符,该说明符可能在发生内存异常时导致程序崩溃(调用std::terminate)。#94275(Nikita Taranov)。 - 此前,在
GROUP BY中使用重复列(例如GROUP BY c0, c0)创建投影并插入数据时,如果启用了optimize_row_order,会抛出std::length_error。修复了 #94065。#94277(Alexey Milovidov)。 - 修复 ZooKeeper 客户端在连接时的一个隐蔽 Bug,该问题会导致进程卡死或崩溃。 #94320 (Azat Khuzhin).
- 修复“函数下推到子列”优化未真正应用于子列的问题。 #94323 (Pavel Kruglov).
- 修复在启用
enable_lazy_columns_replication的情况下,嵌套 RIGHT JOIN 中可能出现的不正确结果。该缺陷导致在被复制的列中,所有行错误地返回相同的值,而非各自不同的值。关闭 #93891。#94339(Vladimir Cherkasov)。 - 修复基于等价集的 SEMI JOIN 过滤下推。当参数类型发生变化时,不要下推该过滤条件。修复了 #93264。#94340(Dmitry Novik)。
- 修复 DeltaLake CDF 与 DataLake 数据库引擎中数据库的配合使用问题(Delta Lake 目录集成)。关闭 #94122。#94342(Kseniia Sumarokova)。
- 在使用
SLRU缓存策略时,修复当前指标FilesystemCacheSizeLimit值不正确的问题。#94363(Kseniia Sumarokova)。 - 创建 Backup 数据库引擎时,如果提供的参数少于两个,现在会返回更具描述性的错误消息(
Wrong number of arguments,而不是std::out_of_range: InlinedVector::at(size_type) const failed bounds check.)。#94374 (Robert Schulze)。 - 在数据库级别撤销带有
GRANT OPTION的全局授权时,会忽略那些实际上不可能执行的撤销操作。#94386 (pufit). - 修复从紧凑分区片段读取稀疏偏移量时的问题。关闭 #94385。#94399(Pavel Kruglov)。
- 即使在
alter_column_secondary_index_mode处于throw模式时,也不再阻止对使用隐式索引的列执行 ALTER 操作。#94425 (Raúl Marín). - 修复当多次调用
receivePacketsExpectQuery读取Protocol::Client::IgnoredPartUUIDs时TCPHandler崩溃的问题。#94434 (Miсhael Stetsyuk)。 - 修复
system.functions中敏感数据掩码处理的问题。 #94436 (Vitaly Baranov). - 修复在禁用
send_profile_events时出现的空指针(nullptr)解引用问题。该功能是最近在 ClickHouse Python 驱动中引入的。关闭了 #92488。#94466(Alexey Milovidov)。 - 修复在合并过程中出现的文本索引与 .mrk 文件之间的不兼容问题。#94494(Peng Jian)。
- 当启用
read_in_order_use_virtual_row时,代码在未检查索引是否被截断的情况下,仍按完整主键大小访问索引列,从而导致 use-after-free / 未初始化内存问题。修复了 #85596。#94500(Alexey Milovidov)。 - 修复在使用 GLOBAL IN 的子查询发送外部表时,当类型为 Nullable 时产生的类型不匹配错误。关闭 #94097。#94511(Alexey Milovidov)。
- 在之前的版本中,对同一表达式具有多个索引条件的查询可能会错误地抛出异常
Not found column。修复了 #60660。#94515(Alexey Milovidov)。 - 修复在运行时过滤器中对 Nullable JOIN 列的不正确处理。#94555(Alexander Gololobov)。
- 在一个正在使用的 workload 内创建另一个 workload 时不再会导致崩溃。#94599(Sergei Trifonov)。
- 修复在进行 ANY LEFT JOIN 优化时,对不存在的列计算
isNotNull会导致的崩溃。#94600(Molly)。 - 修复在默认表达式引用具有计算默认值的其他列时的求值问题。#94615 (Alexey Milovidov).
- 修复 BACKUP/RESTORE 操作中的权限问题。#94617(Pablo Marcos)。
- 修复在数据类型为
Nullable(DateTime64)时由于错误的类型转换导致的崩溃。#94627(Miсhael Stetsyuk)。 - 修复了一个错误:某些带有
ORDER BY的分布式查询可能会返回值被对调的ALIAS列(即列a显示为列b的数据,反之亦然)。#94644 (filimonov). - 修复 keeper-bench 结果写入文件时的问题。#94654 (Antonio Andelic).
- 修复在列包含负浮点数值时,MinMax 类型统计信息产生的估算错误。 #94665 (zoomxi).
- 修复在 Map 的键为 Struct 时读取 Parquet 文件的问题。#94670 (Konstantin Vedernikov)。
- 修复在使用复杂 ON 条件时,RIGHT join 可能产生的不正确结果。关闭 #92913。#94680(Vladimir Cherkasov)。
- 在 Vertical 合并后保留固定索引粒度(use_const_adaptive_granularity)。#94725(Azat Khuzhin)。
- 修复与标量子查询和表依赖相关的 mutation 错误。如果某个表在某列上存在依赖(索引或 PROJECTION),标量子查询可能在没有数据的情况下被求值并缓存,从而导致不正确的变更。#94731 (Raúl Marín).
- 修复 AsynchronousMetrics 在出错时回退到 cpu_pressure 的逻辑。#94827(Raúl Marín)。
- 在解引用指针之前,
getURLHostRFC函数缺少边界检查。当向domainRFC传递空字符串时,它会读取未初始化的内存,从而触发 MSan 错误。#94851(Alexey Milovidov)。 - 修复加密磁盘变为只读的问题。#94852 (Azat Khuzhin).
- 修复在旧分析器下对分布式表使用分数形式
LIMIT/OFFSET时的逻辑错误。关闭 #94712。#94999(Ahmed Gouda)。 - 修复在默认启用 join 运行时过滤器时,在某些条件下发生的崩溃。#95000 (Alexander Gololobov)。
- 改进对表引擎
URL()和表函数url()所使用 URL 中的密码的脱敏处理。#95006 (Vitaly Baranov)。 - 当
enable_extended_results_for_datetime_functions启用时,toStartOfIntervalFUNCTION 的行为现在与toStartOfX相同,其中X为Day, Week, Month, Quarter, Year。 #95011 (Kirill Kopnev). - 修复了常量字符串比较未遵循
cast_string_to_date_time_mode、bool_true_representation、bool_false_representation和input_format_null_as_default等 SETTING 的问题。关闭 #91681。#95040(Nihal Z. Miaji)。 - 修复文件系统缓存中的数据竞态问题。#95064 (Alexey Milovidov)。
- 修复 Parquet 读取器中的一个罕见竞态条件。 #95068 (Alexey Milovidov).
- 修复在
LIMIT为零时 top K 优化中发生的崩溃。关闭 #93893。#95072(Alexey Milovidov)。 - 从 DateTime/整数转换为 Time64 会使用
toTime提取一天中的时间部分,但该函数不是单调的。ToDateTimeMonotonicity模板错误地将此转换标记为单调的,导致在调试构建中出现 "Invalid binary search result in MergeTreeSetIndex" 异常。#95125 (Alexey Milovidov)。 - 仅在必要时才重新生成清单文件中的条目列表(此前会在每次迭代时都重新生成)。 #95162 (Daniil Ivanik)。
构建 / 测试 / 打包改进
- 添加了一组工具,用于利用 jemalloc 的堆分析能力对 ClickHouse SQL 解析器中的内存分配进行剖析。#94072 (Ilya Yatsishin)。
- 添加了一个简化解析器内存分配调试的工具。它在将查询解析为 AST 表示之前和之后使用 jemalloc 的
stats.allocated指标来展示具体的内存分配情况。同时,它支持内存分析模式,会在解析前后转储 profile,以生成报告展示内存分配发生的位置。#93523 (Ilya Yatsishin)。 - 移除传递性的 libc++ 头文件包含。#92523 (Raúl Marín)。
- 将部分顺序测试改为并行执行:https://github.com/ClickHouse/ClickHouse/pull/93030/changes#diff-c3a73510dae653c9bbfa24300b32f5d6ec663fd4e72cc4a3d5daa6e4342915df。[#93030](https://github.com/ClickHouse/ClickHouse/pull/93030) (Nikita Fomichev)。
- 清理部分构建标志。#93679 (Raúl Marín)。
- 将 c-ares 从 v1.34.5 升级到 v1.34.6。这解决了 c-ares 的
CVE-2025-62408,该问题与 ClickHouse 无关。#94129 (Govind R Nair)。 - 使用
curl8.18.0。#94742 (Konstantin Bogdanov)。