Cloud v25.12 变更日志
向后不兼容的更改
数据类型更改
- 引入
Geometry类型,为其增加对WKB和WKT格式的读取支持。在之前的版本中,Geometry类型是String的别名,但现在它是一个功能完整的类型。#83344 (Konstantin Vedernikov)。 - 移除已弃用的 Object 类型。#85718 (Pavel Kruglov)。
- 对在 MergeTree 表的 Wide 数据部分为 Variant 类型子列创建的文件名进行转义。此更改会破坏与旧表中 Variant/Dynamic/JSON 数据类型的兼容性。该变更修复了在 Variant 内部存储包含特殊符号的类型的问题(例如包含
\的、带特定时区的 DateTime)。可以通过修改 MergeTree 设置escape_variant_subcolumn_filenames来禁用转义(为保持兼容性,请在 MergeTree 的配置中禁用此设置,或在升级前将compatibility设置为之前的版本)。解决了 #69590。#87300 (Pavel Kruglov)。
查询和函数变更
- 在将可为空列转换为非可为空类型时,
ALTER MODIFY COLUMN现在需要显式指定DEFAULT。之前此类ALTER可能会因为 cannot convert null to not null 错误而卡住,现在会将NULL替换为该列的默认表达式。修复了 #5985。#84770(Vladimir Cherkasov)。 - 移除设置项
allow_not_comparable_types_in_order_by/allow_not_comparable_types_in_comparison_functions。在ORDER BY或比较函数中允许不可比较类型可能会导致逻辑错误和非预期结果。修复了 #90028。#90527(Pavel Kruglov)。 - 修复函数
bitShiftLeft和bitShiftRight,在移位位数恰好等于类型大小时返回 0 或空值。#91943(Pablo Marcos)。 - Ngram tokenizer 将不再返回长度小于其设置长度 N 的 n-gram。当搜索 token 为空时,Text Search 将不返回任何行。#89757(George Larionov)。
存储和索引变更
- 移除已废弃的
LIVE VIEW功能。如果正在使用LIVE VIEW,则无法升级到新版本。#88706 (Alexey Milovidov)。 - 禁止在同一个共享对象存储路径之上创建多个
plain-rewritable磁盘,因为这会在不同元数据存储事务发生冲突时导致未定义行为。#89038 (Mikhail Artemenko)。 - 现在禁止创建带有空
ORDER BY键的特殊MergeTree表(例如ReplacingMergeTree、CollapsingMergeTree等),因为这类表中的合并行为是未定义的。如果仍然需要创建此类表,请启用allow_suspicious_primary_key设置。#91569 (Anton Popov)。 - 针对隐式索引进行了多项修复。显示或存储的 schema(keeper 元数据)将不再包含隐式索引,例如由
add_minmax_index_for_numeric_columns或add_minmax_index_for_string_columns设置创建的索引。在较新版本中创建或更新 ReplicatedMergeTree 表、且仍存在运行旧版本的副本时,这可能会导致元数据错误。#91429 (Raúl Marín)。
设置和配置更改
- 支持对 HTTP 响应结果进行异常标记,使客户端能够更可靠地解析异常。修复了 #75175。为了在不同格式间保持一致,
http_write_exception_in_output_format设置默认禁用。#88818 (Kaviraj Kanagaraj). - 修复 Kafka 存储的 SASL 设置优先级问题。在
CREATE TABLE查询中指定的表级 SASL 设置现在可以正确覆盖配置文件中为 consumer/producer 指定的设置。#89401 (János Benjamin Antal). - 将 ACME 配置参数
refresh_certificates_task_interval重命名为refresh_certificates_task_interval_seconds,并将refresh_certificates_before重命名为refresh_certificates_before_seconds。refresh_certificates_task_interval_seconds参数现在要求以秒为单位的值。#92211 (Konstantin Bogdanov). - 将在 PROJECTION 中禁用位置参数视为向后不兼容的变更。此外,引入了
enable_positional_arguments_for_projections设置,以便在 PROJECTION 中存在位置参数时安全地升级 ClickHouse 集群。#92007 (Dmitry Novik).
客户端变更
- 更新
clickhouse-client,当由于receive_timeout导致查询超时时返回非零退出码(159 - TIMEOUT_EXCEEDED)。此前,超时会返回退出码 0(成功),这使得脚本和自动化流程难以检测到超时失败。#91432(Sav)。
统计信息格式变更
- 当将列从
String修改为Nullable(String)时,我们不会对现有数据执行变更(mutation)操作。但对于uniq聚合函数,它会使用不同的数据结构:对于可为空列,将使用带有嵌套 uniq 聚合器的AggregateFunctionNull。AggregateFunctionNull会额外序列化一个 bool 标志位,这会导致统计信息文件不兼容。由于统计信息的格式已更改,如果仍存在旧格式的统计信息,服务器将会崩溃。为了避免异常,请运行ALTER TABLE [db.]table MATERIALIZE STATISTICS ALL以重新生成统计信息。#90311 (Han Fei)。
其他重大变更
- 修复在使用 T64 codec 压缩数据时,由于数据大小未按元素大小对齐而触发
Fatal的问题。解决了 #89282。#89432(yanglongwei)。
新增功能
Functions
- 新增 SQL 语句 EXECUTE AS 以支持用户模拟。解决了 #39048。#70775(Shankar)。
- 新增
flipCoordinates函数,用于展开数组中所需数量的维度,并在 Tuple 列内交换指针。解决了 #79469。#79634(Sachin Kumar Singh)。 - 增强了
IS NOT DISTINCT FROM(<=>) 运算符:新增了反向的IS DISTINCT FROM支持,并支持不同类型但兼容的数值型操作数(例如Nullable(UInt32)和Nullable(Int64))。#87581(yanglongwei)。 - 新增对
cume_dist窗口函数的支持。修复了 #86920。#88102(Manuel)。 - 新增用于计算 geometry 类型面积和周长的函数。#89047(Konstantin Vedernikov)。
- 实现了
dictGetKeys函数,用于返回属性等于指定值的字典键。它使用基于每个查询(per-query)的反向查找缓存(通过max_reverse_dictionary_lookup_cache_size_bytes设置进行调优)来加速重复查找。#89197(Nihal Z. Miaji)。 - 为
arrayRemove(arr, elem)提供支持,用于从数组arr中移除所有等于elem的元素。解决了 #52099。#89585(tiwarysaurav)。 - 引入
midpoint标量函数,用于计算平均值。解决了 #89029。#89679(simonmichal)。 - 现在可以使用新的
argAndMin和argAndMax函数,同时获取参数及其对应的最小或最大值。#89884(AbdAlRahman Gad)。 - 新增
HMAC(algorithm, message, key)SQL 函数,作为 #73900 和 #38775 的一部分。#90837(Mikhail f. Shiryaev)。 - 为
has()函数添加支持,使其在第一个参数为常量数组时可以使用主键和数据跳过索引。关闭 #90980。#91023(Nihal Z. Miaji)。
系统表
- 新增
system.unicode表,其中包含 Unicode 字符及其属性的列表。关闭 #80055。#80857(wxybear)。 - 新增系统表
shared_merge_tree_condemned_parts,类似于shared_merge_tree_outdated_parts,用于列出即将被 PartsKillerThread 删除的被标记为废弃的分区片段。(Smita Kulkarni)。
表引擎和存储
- 支持 Prometheus HTTP Query API 的一部分功能。要启用它,请在配置文件的
<prometheus>部分中添加一个类型为query_api的规则。目前支持的处理器为/api/v1/query_range和/api/v1/query。#86132(Nikita Mikhaylov)。 - 用户现在可以为 S3/Azure Queue 表配置在处理完成后移动或为文件打上标签,除了之前可以保留或删除文件的选项之外。这解决了 #72944。#86907(Murat Khairulin)。
- 新增 MergeTree 设置
merge_max_dynamic_subcolumns_in_wide_part,用于在合并后限制 Wide 部分中动态子列的数量,而不受数据类型中指定参数的影响。#87646(Pavel Kruglov)。 - 支持 Microsoft OneLake 目录集成。#89366(Konstantin Vedernikov)。
- 支持临时表的
CREATE OR REPLACE语法。修复 #35888。#89450(Aleksandr Musorin)。 - 支持在 MergeTree 表上使用
direct(嵌套循环)连接。要使用它,请在设置中将其作为唯一选项指定:join_algorithm = 'direct'。#89920(Vladimir Cherkasov)。 - 该 PR 引入了投影级别的设置,可通过
ALTER TABLE ... ADD PROJECTION中新增的WITH SETTINGS子句进行配置。这些设置允许投影在每个投影的基础上覆盖某些 MergeTree 存储参数(例如index_granularity、index_granularity_bytes)。#90158(Amos Bird)。
Iceberg 和数据湖
- 在 Iceberg 的
CREATE操作中支持使用ORDER BY,以及在INSERT中支持排序。修复 #89916。#90141(Konstantin Vedernikov)。
SQL 和查询特性
- 为
windowFunnel聚合函数新增allow_reentry选项。与strict_order一起启用时,它会忽略违反顺序的事件,而不是停止漏斗分析。这样可以在不低报转化率的情况下,处理包含刷新(A->A->B)或后退导航(A->B->A->C)的用户路径。#86916(Lee ChaeRok)。 - 现在用户可以在文本索引构建中添加新的参数
preprocessor。该参数是一个任意表达式,用于在分词前对每个文档进行转换。#88272(Jimmy Aguilar Mena)。 - 为
LIMIT和OFFSET新增小数形式的支持,以便按比例选取表中的一部分数据。修复 #81892。#88755(Ahmed Gouda)。 - 新增设置
into_outfile_create_parent_directories,用于在使用 INTO OUTFILE 时自动创建父目录,避免输出路径不存在时出现错误。解决 #88610。#88795(Saksham)。 - 新增设置
type_json_skip_invalid_typed_paths,当输入 JSON 无法转换为 JSON 类型中显式定义的 typed path 时,可禁用插入/类型转换为 JSON 类型时抛出的异常,此时会回退为该 typed path 的空值/零值。修复 #86917。#89886(Max Justus Spransy)。
客户端和 CLI 功能
- CLI 客户端现在可以通过指定
--no-server-client-version-message或将其设置为false来禁用“ClickHouse server 版本早于 ClickHouse client。这可能表示 server 已过期,可以升级。”的提示消息。#87784(Larry Snizek)。 - 使用
--login和 Cloud 凭证访问 ClickHouse Cloud 实例。#89261(Krishna Mannem)。 - Web UI 现在提供下载按钮。即使 UI 只显示部分结果,它也会下载完整的结果集。#89768(Alexey Milovidov)。
服务器配置和监控
- 在
X-ClickHouse-Progress和X-ClickHouse-Summary中新增memory_usage字段,可用于在客户端实时采集查询的内存使用情况。#88393 (Christoph Wurm)。 - 新增
send_profile_events设置,当未使用 profile 事件时允许客户端减少网络流量。#89588 (Kaviraj Kanagaraj)。
Keeper
- Keeper 与 ZooKeeper 的兼容性:支持带统计信息的创建。#88797 (Konstantin Vedernikov)。
- 在 ClickHouse Keeper 中支持 ZooKeeper 持久监听(persistent watches)。#88813 (Konstantin Vedernikov)。
输入/输出格式
- 实现了新的输入/输出格式
Buffers。该格式类似于Native,但与Native不同的是,它不会存储列名、列类型或任何额外的元数据。修复(关闭)#84017。#91156(Nihal Z. Miaji)。 - 新增
arrow_flight_request_descriptor_type设置,以支持 Dremio 和其他需要命令式描述符的 Arrow Flight 服务器。修复 #89523。#89826(Shreyas Ganesh)。 - 向 Kafka 表引擎添加
kafka_schema_registry_skip_bytes设置,用于在解析消息有效负载之前跳过封装头部字节(例如 AWS Glue Schema Registry 的 19 字节前缀)。#89621(Taras Polishchuk)。
其他新特性
- 添加设置
max_streams_for_files_processing_in_cluster_functions,用于控制在 Cluster 表函数中并行读取文件时的流数量。解决 #90223。#91323(Pavel Kruglov)。 - 允许按查询粒度禁用邻近 part 数据的后台下载。修复 #89524。#89668(tanner-bruce)。
- 实验性地支持 e2k(Elbrus-2000)作为 ClickHouse 的新平台。#90159(Ramil Sattarov)。
实验性特性
- 支持从 ACME 提供商获取 TLS 证书,RFC 8555。#66315(Konstantin Bogdanov)。
- 引入新的逻辑,用于自动使用并行副本执行查询,通过设置
automatic_parallel_replicas_mode控制。#87541(Nikita Taranov)。 - 全文搜索现已进入私有预览阶段(此前为实验阶段)。#88928(Robert Schulze)。
- 将
Alias标记为实验性功能,可通过allow_experimental_alias_table_engine=1启用。#89712(Kai Zhu)。
性能改进
查询执行与优化
- 当查询达到行数限制时快速失败。解决了 #61872。#62804(Sean Haynes)。
- 添加优化以在查询计划中移除未使用的列。解决了 #75152。#76487(János Benjamin Antal)。
- 对
ConstantNode中的大值进行优化。关闭了 #72880。#81104(Yakov Olkhovskiy)。 - 在哈希表迭代期间预取键以最小化缓存未命中。#84708(lgbo)。
- 通过简化代码并调整选择算法来提升 LZ4 解压缩速度。#88360(Raúl Marín)。
- 在
JOIN和ARRAY JOIN中实现惰性列复制。避免在某些输出格式中将Sparse和Replicated等特殊列表示转换为完整列,从而避免在内存中的不必要数据拷贝。#88752(Pavel Kruglov)。 - 通过动态分派为逻辑函数使用高级 SIMD 操作。#90432(Raúl Marín)。
- 通过避免对结果列进行不必要的零初始化来提升 JIT 函数的性能。#90449(Raúl Marín)。
- 通过动态分派加速 T64 解压缩。#90610(Raúl Marín)。
- 通过动态分派加速将列转换为
bool(在WHERE子句中)。#91203(Raúl Marín)。 - 通过动态分派加速对单个数值块的排序。#91213(Raúl Marín)。
JOIN 优化
RIGHT和FULL JOIN现在使用 ConcurrentHashJoin,这意味着这类 JOIN 现在可以以更高的并行度运行。在多种场景下将RIGHT和FULL JOIN` 的性能提升至多 2 倍。修复 #78027。#78462(Yarik Briukhovetskyi)。- 在某些场景下允许将
ANY LEFT JOIN或ANY RIGHT JOIN重写为ALL INNER JOIN。#89403(Dmitry Novik)。 - 为
ANTIJOIN 提供JOIN运行时过滤器支持。同时重构运行时过滤器的实现以减少锁竞争。#89710(Dmitry Novik)。 - 支持在
LEFT/INNER JOIN操作中保持从左表按顺序读取,从而可被后续步骤利用。#89815(Vladimir Cherkasov)。
MergeTree 和存储优化
- 在具有 1 万多个分区片段的表上进行大量分区裁剪时,
SELECT查询速度最高可提升 8 倍。#85535 (James Morrison)。 - 当查询在聚合状态中使用固定哈希表(按小整数进行 GROUP BY)时,ClickHouse 会并行合并聚合状态以加速查询执行。解决了 #63666。#87366 (Jianfei Hu)。
- Parquet reader v3 现已默认启用。#88827 (Michael Kolupaev)。
- 查询现在可以同时受益于
optimize_read_in_order和query_plan_optimize_lazy_materialization。解决了 #88767。#88866 (Manuel)。 - 对包含
DISTINCT的查询使用聚合 PROJECTION。关闭了 #86925。#88894 (Nihal Z. Miaji)。 - 当输入排序顺序与
LIMIT BY键匹配时,运行流式LIMIT BY转换。#88969 (Eduard Karacharov)。 - 为 Nullable 类型的列新增对稀疏序列化的支持。#88999 (Amos Bird)。
- 优化 MergeTree 读取器的就地过滤。解决了 #87119。#90630 (Xiaozhe Yu)。
- 引入了一个额外的启发式策略,以减少所选合并选项的宽度。#91163 (Mikhail Artemenko)。
索引和文本搜索优化
- ClickHouse 现在会使用 skip 索引,对在
AND与OR组合连接的过滤条件的WHERE子句执行索引分析。此前,WHERE子句必须是过滤条件的合取(AND)才能利用 skip 索引。一个名为use_skip_indexes_for_disjunctions的新设置(默认:on)控制此功能。#87781 (Shankar Iyer)。 - 通过利用由文本索引构建的额外预过滤器,提高了对于带有
like、equals、has等函数谓词的过滤操作的性能。该优化可通过query_plan_text_index_add_hint设置启用。#88550 (Anton Popov)。 - 通过缓存字典块并使用哈希表进行 token 查找(而不是二分查找),改进了文本索引性能。#88786 (Elmi Ahmadov)。
- 由于 posting 列表在数据量上最大,对其进行缓存将提高连续多次运行时的性能。#88912 (Elmi Ahmadov)。
- 通过在预计算的一组可能键值中进行更快速的查找,优化了重复的反向字典查找,从而修复了 #7968。#88971 (Nihal Z. Miaji)。
- 通过使用 skip 索引和动态阈值过滤器来显著减少处理的行数,从而优化
ORDER BY...LIMIT N查询。#89835 (Shankar Iyer)。 - 在存在大型
minmax索引(数百万个 granule)时,索引分析的延迟应会降低。#90428 (Shankar Iyer)。
聚合优化
- 通过仅对 points 数组的末尾部分进行排序,并在输入单调时跳过排序来优化
AggregateFunctionHistogram,实现约 10% 的加速。#85760(MakarDev)。 - 通过减少 HashSetTable::merge 的开销,略微加快某些 countDistinct 操作。#89727(Raúl Marín)。
- 改进 topK 的性能和行为。#90091(Raúl Marín)。
- 提升 Decimal 类型比较操作的性能。解决 #28192。#90153(Konstantin Bogdanov)。
S3 和备份优化
- S3 会基于键名前缀在内部对对象进行分区,并且可以在每个分区上自动扩展,以支撑很高的请求速率。此更改引入了两个新的 BACKUP 设置:
data_file_name_generator和data_file_name_prefix_length。当data_file_name_generator=checksum时,备份数据文件会使用其内容的哈希值来命名。#88418 (Julia Kartseva) - 通过下推
_path过滤条件的取值,改进使用 glob 模式创建的 S3 表的查询性能,从而避免执行 S3 列举操作。该行为由s3_path_filter_limit设置控制。#91165 (Eduard Karacharov)
数据湖优化
- 分布式执行:优先按行组 ID 而不是按文件来划分任务。#87508 (Konstantin Vedernikov)。
- 支持对 Paimon 函数进行分区裁剪。#90253 (JIaQi Tang)。
改进
查询优化与执行
- 在 ReplicatedMergeTree 表存在损坏磁盘时,允许执行
FETCH PARTITION。#58663(Duc Canh Le)。 - 新增
h3PolygonToCellsFUNCTION,可将几何区域填充为 h3 六边形网格。解决 #33991。#66262(Zacharias Knudsen)。 - 所有 DDL
ON CLUSTER查询现在都会在原始查询的 USER 上下文中执行,从而改进访问验证。#71334(pufit)。 - 为
ALTER TABLE ... FREEZE查询增加了并行处理能力。#71743 (Kirill)。 - 允许在
IN中使用非常量的第二参数,并且也支持将元组作为第二参数。#77906 (Yarik Briukhovetskyi)。 - 此 PR 允许将常规 PROJECTION 用作二级索引。启用后,某些查询谓词可以通过读取投影的分区片段并生成位图,在 PREWHERE 阶段高效过滤行。#81021(Amos Bird)。
- 默认启用
enable_shared_storage_snapshot_in_query,以提供更强的一致性保证。 #82634 (Alexey Milovidov). - 如有需要,
UNION在进行类型统一时应支持Variant类型。修复了 #82772。#83246(Mithun p)。 - 记录内部查询(例如由字典、可刷新materialized view 等在内部执行的查询),并在
system.query_log中新增is_internal列。 #83277 (Miсhael Stetsyuk). - 允许对
ALIAS列执行INSERT(此类列仅简单引用某个物理列且不包含任何表达式)。关闭了 #80060。#84154(Shaurya Mohan)。 - 你可以在 clickhouse-client 中查看包含
SELECT的CREATE OR REPLACE TABLE查询的进度条、日志和性能统计信息。解决了 #38416。#87247(Diskein)。 - 在哈希函数中支持 JSON 和 Dynamic 类型。解决了 #87734。#87791(Pavel Kruglov)。
query_plan_optimize_join_order_limit的默认值更改为 10。 #89312 (Alexey Milovidov)。- 现在默认启用优化项 enable_lazy_columns_replication,可减少 JOIN 中的内存使用量。 #89316 (Alexey Milovidov)。
- 默认启用
allow_statistics_optimize设置,使 JOIN 优化器能够使用列统计信息。#89332 (Alexey Milovidov)。 - 默认启用
create_table_empty_primary_key_by_default。这有助于提升易用性。#89333 (Alexey Milovidov). enable_time_time64_type设置现已默认开启。#89345(Yarik Briukhovetskyi)。- 默认启用设置
allow_special_serialization_kinds_in_output_formats。 #89402 (Pavel Kruglov). - 在通过 Shared Catalog 执行的查询中将忽略
ON CLUSTER(Nikolay Degterinsky)。 - 为 Shared Catalog 增加对
ALTER DATABASE MODIFY COMMENT的支持。(Nikolay Degterinsky) - 在 Shared 数据库中为 SharedSet/SharedJoin 提供对
CREATE OR REPLACE的支持。(Tuan Pham Anh)。 - 在 SharedMergeTree 中运行
SYNC REPLICA时避免等待其他查询。(Raúl Marín)。
存储和 MergeTree 改进
- 新增虚拟列
_tags(Map(String, String)),包含与 S3 中该 blob 关联的所有标签。解决了 #72945。#77773(Zicong Qu)。 - 新增错误信息,指明该分区片段已被去重。#80264(Aleksandr Musorin)。
- 使用 OpenSSL 3.5.4。#81389(Konstantin Bogdanov)。
- 为 bcrypt 身份验证新增缓存。#87115(Nikolay Degterinsky)。
- 现在会将 Parquet 无时区时间戳(isAdjustedToUTC=false)读取为 DateTime64(..., 'UTC'),而不是 DateTime64(...)。#87872(Michael Kolupaev)。
- 现在可以将 SQL 中定义的角色授予在
users.xml中定义的用户。#88139(c-end)。 - 如果在 FINAL 查询中使用的跳过索引位于主键包含的列上,那么在其他分区片段中检查主键交集的额外步骤是多余的,现在不会再执行。解决了 #85897。#88368(Shankar Iyer)。
- 在启用
disable_insertion_and_mutation时,允许向远程表和数据湖表中插入数据。#88549(Alexander Tokmakov)。 - 缓存表级统计信息,新增两个设置:MergeTree 设置
refresh_statistics_interval和会话设置use_statistics_cache。#88670(Han Fei)。 - 新增 MergeTree 设置
alter_column_secondary_index_mode,用于控制在执行 mutation 时如何处理二级索引。可选值:throw、drop、rebuild 和 compatibility。修复了 #77797。#89335(Raúl Marín)。 - 为每张表的分区片段引入
ColumnsDescription缓存,当表包含大量分区片段和大量列时,可降低内存使用。#89352(Azat Khuzhin)。
系统表和监控
- 为 server 和 keeper 添加多个直方图指标,用于度量 keeper 请求执行各阶段的耗时。#88158 (Miсhael Stetsyuk).
- 在
system.columns中新增列statistics,用于指示在该表上构建的统计信息类型。#89086 (Han Fei). - 当使用查询结果缓存时,HTTP 接口将提供
Age和Expires响应头。引入新的 profile 事件:QueryCacheAgeSeconds、QueryCacheReadRows、QueryCacheReadBytes、QueryCacheWrittenRows、QueryCacheWrittenBytes。#89759 (Alexey Milovidov). - 在 Web UI 中展示表属性。点击行数或字节数时,将弹出一个来自
system.tables的查询。#89771 (Alexey Milovidov). - 向
system.error_log表添加字段last_error_time、last_error_message、last_error_query_id和last_error_trace。#89879 (Narasimha Pakeer). - 在 system.part_logs 中存储去重块 ID。#89928 (Sema Checherinda).
- 将
check_query_single_value_result设置项的默认值从true更改为false。这会使CHECK TABLE返回按分区片段拆分的详细结果,而不是聚合结果。#90150 (Robert Schulze). - 在
system.mutations中新增列parts_in_progress_names,以改进诊断能力。#90155 (Shaohua Wang). - 引入
system.background_schedule_pool{,_log},以改进对后台任务的观测和诊断能力。#91157 (Azat Khuzhin). - 添加 profile 事件
FailedInitialQuery和FailedInitialSelectQuery。#91172 (RinChanNOW). - 在
system.tables中添加三列,用于悬空分区片段(dangling parts)指标。(Han Fei). - 将
distributed_cache_client.connection_pool_size的值以指标形式暴露出来。(Francesco Ciocchetti).
客户端和 UI 改进
- 当分页器正在运行时,用户现在可以按 Ctrl-C 来取消查询。修复 #80778。#88935(Grigorii Sokolik)。
- 即使值为负数,Web UI 也会在表格中显示条形图。#89016(Alexey Milovidov)。
- 以空白字符开头的查询将不再保存到历史记录中。#89116(Konstantin Bogdanov)。
- 交互模式下的
clickhouse-client和clickhouse-local会在命令行中高亮显示与光标下当前标识符同名的所有标识符。#89689(Alexey Milovidov)。 - 将 Web UI 中查询文本区域的调整大小拖动条设置为占满整个宽度。#89457(Alexey Milovidov)。
- Web UI 中的类型提示不再溢出到表头。#89753(Alexey Milovidov)。
- 现在可以在 Web UI 查询编辑器中使用
Ctrl+/(或在 Mac 上使用Cmd+/)快速注释或取消注释当前选中的行。#91160(Samuel K.)。 - 新增对从 XDG Base Directory 路径加载 ClickHouse 客户端配置的支持。修复 #89882。#90306(Wujun Jiang)。
S3 和云存储改进
- 当在 endpoint 中未指定 region 时,允许在 S3 中自动使用按需启用的 AWS 区域。#88930 (Andrey Zvonov)。
- 在 25.6 中将默认
s3_retry_attempts设置为 500,以确保在发生 S3 重新分区时备份能够成功完成。#89051 (Nikita Mikhaylov)。 - 缓存与 STS endpoint 交互时使用的 S3 凭据,以便它们可以在不同的函数调用之间复用。#89734 (Antonio Andelic)。
- 现在预签名 URL 已可用于 S3。修复了 #65032。#90827 (Yarik Briukhovetskyi)。
数据湖改进
- 支持通过
deltaLake表函数,并使用delta_lake_snapshot_start_version、delta_lake_snapshot_end_version这两个设置项读取 DeltaLake CDF。#90431(Kseniia Sumarokova)。 - 在 insert into 表函数中支持存储设置项,以与 select 保持一致。关闭 #89386。#91707(Kseniia Sumarokova)。
- 对数据湖上的 truncate 查询抛出 “not implemented” 错误,而不是静默不执行任何操作。关闭 #86604。#91713(Kseniia Sumarokova)。
Kafka 改进
- 现在可以使用
kafka_compression_codec和kafka_compression_level设置为 Kafka 生产者指定压缩方式。#89073(János Benjamin Antal)。 - 新增
kafka_consumer_reschedule_ms作为可调节的Kafka表引擎设置。解决 #89204。#90112(Jeremy Aguilon)。
Keeper 改进
- 在 Keeper 中为 append 请求批次添加字节大小限制。该限制由
keeper_server.coordination_settings.max_requests_append_bytes_size控制。#90342 (Antonio Andelic)。 - 在握手期间添加 Keeper 服务器端检查,当
last_zxid_seen(由客户端提供)> last_processed_zxid时拒绝客户端。#90016 (Miсhael Stetsyuk)。 - 在进行 S3Queue 清理时,对 RemoveRecursive Keeper 请求使用更低的节点数上限。#90201 (Antonio Andelic)。
输入/输出格式改进
- 为 Parquet 中以逻辑类型 UUID 表示且物理类型为
FixedString(16)的 UUID 添加了支持。#74484 (alekseev-maksim)。 - 支持将字符串数组作为
hasAnyTokens或hasAllTokens函数的输入参数。#89124 (Elmi Ahmadov)。 - 在 Pretty 格式中,命名元组现在显示为 Pretty JSON。这解决了 #65022。#91779 (Mostafa Mohamed Salah)。
- 新增 CapnProto 消息大小限制。可以通过
format_capn_proto_max_message_size进行配置。#91888 (Antonio Andelic)。
文本索引改进
- 文本索引现在可以配合 ReplacingMergeTree 表使用。#90908 (Elmi Ahmadov)。
- 支持在
PREWHERE中使用倒排索引。解决了 #89975。#89977 (Peng Jian)。 - 现在可以使用
ngram_length = 1构建 Ngram 分词器。#91529 (George Larionov)。 - 为文本索引反序列化后的头部信息引入了缓存,以减少 I/O 并提升查询性能。#89513 (Elmi Ahmadov)。
其他改进
- 修复了
Array和Map的二进制反序列化逻辑,在校验大小限制时使用max_binary_array_size设置而不是max_binary_string_size。#88744 (Raufs Dunamalijevs)。 - 如果系统内存低于 5GB,则默认不对可执行文件执行 mlock。#89751 (Alexey Milovidov)。
- 通过将
min_bytes_for_wide_part和vertical_merge_algorithm_min_bytes_to_activate设置为 128MB,减少在system.metric_log表合并期间的内存使用。#89811 (filimonov)。 - 当 S3 库解析 XML 响应时重试网络错误。#90216 (Sema Checherinda)。
- 在接近 guardrails 限制时更新警告消息:显示当前值和抛出异常的阈值。#90438 (Nikita Fomichev)。
- 在
system.filesystem_cache表中以流式方式传输分块,而不是创建包含所有缓存状态的单个分块。#90508 (Kseniia Sumarokova)。 - 当表的分区片段被删除或被更新的分区片段替换时,现在会从向量相似度索引缓存中移除相应的条目。#90750 (Shankar Iyer)。
- 避免在认证前返回的 HTTP 错误响应中暴露 ClickHouse 服务器版本。#91003 (filimonov)。
- 新增设置
apply_row_policy_after_final和apply_prewhere_after_final,允许在FINAL处理之后再应用行策略和PREWHERE条件。修复 #90986。#91065 (Yarik Briukhovetskyi)。 - 在 tupleElement 中支持 JSON 类型。关闭 issue #81630。#91327 (Pavel Kruglov)。
- 为 tuple 元素访问支持负索引(例如 tuple.-1)。#91665 (Amos Bird)。
- 允许在将
Array转换为QBit时进行隐式类型转换。#91846 (Raufs Dunamalijevs)。 - 在
system.blob_storage_log中新增列elapsed_time_microseconds。#92322 (Alexey Milovidov)。 - 新增设置
database_shared_drop_table_delay_seconds,允许用户控制 Shared 数据库中删除表的延迟。(Nikolay Degterinsky)。 - 为命名集合懒加载加密密钥。(Pablo Marcos)。
- 允许针对分布式缓存为每个缓冲区禁用客户端缓存。(Kseniia Sumarokova)。
- 为分布式缓存连接添加共享上限。(Kseniia Sumarokova)。
Bug Fixes
注意
本节仅列出部分重要的缺陷修复。要查看本次发布中所有缺陷修复的完整列表,请参阅完整更新日志。
查询执行修复
- 修复在分布式合并聚合中涉及多个远程分片时
rows_before_limit_at_least不正确的问题。#63511 (Amos Bird)。 - 修复在执行
INSERT INTO ... SELECT查询后出现0 rows in set的问题。关闭 #47800。#79462 (Engel Danila)。 - 修复
multiIf在常量参数和短路求值场景下的问题。关闭 #72714。#84546 (Yakov Olkhovskiy)。 - 修复从带有子查询约束的表中查询时出现的 LogicalError。解决 #84190。#85575 (Pervakov Grigorii)。
- 修复在
query_plan_optimize_join_order_limit > 1时 CROSS JOIN 重排中的逻辑错误。关闭 #89409。#88286 (Vladimir Cherkasov)。 - 修复在右侧表键唯一且使用 OR 条件时 JOIN 结果不正确的问题。解决 #89391。#89512 (Vladimir Cherkasov)。
- 修复在带有重复列的
full_sorting_mergeJOIN 中的逻辑错误。解决 #86957。#89495 (Vladimir Cherkasov)。 - 修复在带有重复列的 JOIN 中可能出现的
Invalid number of rows in Chunk错误。解决 #89411。#90053 (Vladimir Cherkasov)。 - 修复在启用并行副本时,分布式表上的 RIGHT JOIN 出现数据重复的问题。#90806 (zoomxi)。
- 修复在启用
join_use_nulls时,多次 JOIN 与 CROSS JOIN 一起使用导致的逻辑错误。#91853 (Vladimir Cherkasov)。
数据类型和 JSON 修复
- 修复在某些情况下从列名包含点的列中读取子列的问题。修复 #81261、#82058、#88169。#87205(Pavel Kruglov)。
- 修复在 JSON 中读取包含浮点数和布尔值的混合数组的问题。此前插入此类数据会导致异常。#88008(Pavel Kruglov)。
- 修复从
LowCardinality(Nullable(T))到 Dynamic 的转换问题。#86365(Pavel Kruglov)。 - 修复在高级 JSON 共享数据序列化中读取路径及其子列时可能出现的逻辑错误。修复 #89805。#89819(Pavel Kruglov)。
- 修复数据类型二进制反序列化中可能发生的堆栈溢出问题。修复 #88710。#89822(Pavel Kruglov)。
- 修复 JSON 中共享数据和动态路径可能出现的不一致状态,可能导致逻辑错误和意外结果。#90816(Pavel Kruglov)。
- 修复在 Summing/Aggregating/Coalescing MergeTree 中合并 JSON 列的问题。#91151(Pavel Kruglov)。
MergeTree 和存储修复
- 修复了在生存时间 (TTL) 过程中过早删除列导致的若干问题。解决了 #88002。#88860(Amos Bird)。
- 修复了在主键按逆序排序时
min(PK)/max(PK)结果不正确的问题。修复了 #83619。#88796(Amos Bird)。 - 修复了在主键按降序排序时,
JOIN优化中的分片错误问题。解决了 #88512。#88794(Amos Bird)。 - 修复了在 PROJECTION 索引读取路径中的竞争条件。解决了 #89497。#89762(Peng Jian)。
- 修复了在使用
deduplicate_merge_projection_mode='ignore'时,对被生存时间 (TTL) 清空但具有非空 PROJECTION 的分区片段进行合并时处理不正确的问题。解决了 #89430。#89458(Amos Bird)。 - 修复了在针对紧凑分区片段执行某些
ALTER查询后可能出现的TOO_MANY_MARKS错误。#91980(alesapin)。
Parquet 和格式修复
- 修复了在将
input_format_parquet_local_file_min_bytes_for_seek设置为 0 时,Parquet reader 出现段错误的问题。修复了 #78456。#88784(Animesh)。 - 在 Parquet writer 中,以正确的格式写出
created_by字符串。#87735(Michael Kolupaev)。 - 修复了在使用 native writer 进行单线程写入时,Parquet 写入未保留原始顺序的问题。#90126(Arthur Passos)。
- 修复了 ORC reader 在读取使用 DICTIONARY_V2 编码且仅包含 NULL 值的字符串列时的错误。#91889(Peng Jian)。
- 修复了从 ORC 格式读取 Date 和 DateTime64 类型时的溢出问题。关闭了 #70976。#91572(Yarik Briukhovetskyi)。
Iceberg 和数据湖修复
- 修复
icebergS3Cluster协议问题。开始在 iceberg 集群函数中支持 schema 演化、位置删除和等值删除。解决 #88287。#88919(Yang Jiang)。 - 修复在使用 Glue catalog 时,带有 timestamp 列的 iceberg 表中出现的 JSON 异常错误。解决 #90210。#90209(Alsu Giliazova)。
- 现在如果在 manifest 文件中未指定 sort order,ClickHouse 将不会对 Iceberg 使用 read-in-order 优化。修复 #89178。#90304(alesapin)。
函数修复
- 修复了函数
reverseUTF8中的一个错误。在之前的版本中,它错误地反转了长度为 4 的 UTF-8 码点的字节。修复了 #88913。#88914(Alexey Milovidov)。 - 修复了 phi 平方值计算在
cramersV、cramersVBiasCorrected、theilsU和contingency中导致结果不正确的问题。#87831(Nihal Z. Miaji)。 - 修复了
top_k在仅使用单个参数调用时未正确应用阈值参数的问题。修复了 #88757。#88867(Manuel)。 - 修复了
countIf(*)的参数被截断的问题。修复了 #89372。#89373(Manuel)。 - 修复了
trim、ltrim、rtrim函数在使用两个参数时无法正常工作的问题。修复了 #90170。#90305(Nihal Z. Miaji)。 - 修复了在使用空数组和
isNull函数时,arrayFilter函数无法正常工作的问题。修复了 #73849。#91105(Nihal Z. Miaji)。
内存和崩溃修复
- 修复在启用
enable_lazy_columns_replication设置时,包含IN中ARRAY JOIN的远程查询可能导致的崩溃问题。解决 #90361。#89997(Pavel Kruglov)。 - 修复由于错误的析构顺序导致在服务器干净关闭过程中发生的崩溃。解决 #82420。#90076(Nikita Mikhaylov)。
- 修复在聚合函数状态包含
LowCardinality(String)列的序列化值时发生的崩溃。#89550(Pavel Kruglov)。 - 修复在解析格式错误的分片目录名时,
StorageDistributed中的崩溃。#90243(Aleksandr Musorin)。 - 修复在启用用户态页缓存时偶发的内存限制错误。#91361(Michael Kolupaev)。
- 修复在出现
MEMORY_LIMIT_EXCEEDED之后聚合函数中可能发生的崩溃。#92390(Azat Khuzhin)。 - 改进了哈希连接结果生成过程中的内存跟踪。#89560(Azat Khuzhin)。
安全性和访问修复
- 修复当角色不存在的用户尝试执行
clusterAllReplicas时出现ACCESS_ENTITY_NOT_FOUND错误的问题。修复了 #87670。#89068(pufit)。 - 修复在使用
remote表函数且以localhost作为目标主机时,对ALTER UPDATE查询的访问验证问题。#90761(pufit)。 - 修复针对部分撤销(partial revoke)的通配符授权检查问题。#90922(pufit)。
- 修复在存在通配符撤销时对全局授权的处理问题。#90928(pufit)。
Replicated 数据库修复
- 在恢复之后,Replicated 数据库副本可能会长时间卡住,并不断打印类似
Failed to marked query-0004647339 as finished的消息,此问题已修复。#88671 (Alexander Tokmakov)。 - 修复了 Distributed 中由于关闭过程与后台
INSERT之间的竞争而导致的 use-after-free 问题。解决了 #88640。#89136 (Azat Khuzhin)。 - 可刷新 materialized view:修复了在刷新期间如果源表被完全删除时可能发生的罕见服务器崩溃问题。#89203 (Michael Kolupaev)。
Keeper 修复
- 修复 Keeper 启动期间读取变更日志的问题,该问题会在某个变更日志在轮转过程中未被正确重命名时出现。#89496 (Antonio Andelic)。
其他重要修复
- 修复了在分析跳过索引时的性能下降问题。#89004 (Anton Popov)。
- 修复 hive 分区不兼容问题,解决其导致在 25.8 中无法平滑升级的情况。#90202 (Kseniia Sumarokova).
- 修复包含无穷值
nan/inf的WITH FILL查询问题。解决 #69261。#90255(Konstantin Bogdanov)。 - 在从 DateTime 和 DateTime64 类型进行转换时,Time 和 Time64 现在能够正确处理时区。修复 #89896。#90310(Yarik Briukhovetskyi)。
- 修复了在启用查询条件缓存的情况下,执行轻量级更新后进行的
SELECT查询可能产生不正确查询结果的问题。修复 #90176。#90204(Anton Popov)。 - 修复内存中 String 聚合状态的序列化兼容性问题。#90880(Antonio Andelic)。
- 修复了
SummingMergeTree在处理NestedLowCardinality列时的聚合问题。 #90927 (Ivan Babrou)。 - 修复当出现错误
No macro 'replica' in config时system.view_refreshes失败的问题。 #92203 (Michael Kolupaev). - 修复在使用 Shared Catalog 时,以间接方式向物化视图添加列的
ALTER操作的复制问题。(Nikolay Degterinsky). - 修复因物化视图(MV)提交失败而导致共享目录状态应用进程挂起的问题。(Nikolay Degterinsky).
- 修复在使用 Shared Catalog 时,对次级副本执行
ALTER操作时的设置约束检查问题。 (Nikolay Degterinsky). - 在 SharedCatalog 迁移过程中保留数据库注释。(Alexander Tokmakov)
- 修复 Shared Catalog 中次级副本上的 Materialized Views 被替换的问题。(Nikolay Degterinsky).
- 修复 system.distributed_cache_usage 计数器。(Kseniia Sumarokova).
- 修复了在 Shared Catalog 中,对因
ILLEGAL_COLUMN异常而创建失败的表执行DROP时会卡住的问题。(Nikolay Degterinsky). - 在副本数据库中禁用对 SharedSet/SharedJoin 使用
CREATE OR REPLACE。(Tuan Pham Anh). - 修复在 Shared 数据库上执行 RMV 刷新时出现的
UNFINISHED异常。(Nikolay Degterinsky)。 - 修复在 Shared 数据库中出现
TABLE_ALREADY_EXISTS错误时发生的崩溃。(Nikolay Degterinsky)。 - 修复了 Shared Catalog 中带有损坏 CREATE 查询的表的迁移问题。 (Nikolay Degterinsky)
- 在
getStatus中始终使用内存中的虚拟分区片段。(Mikhail Artemenko)。 - 在启动时为 Shared catalog state 应用添加重试机制。(Nikolay Degterinsky)
- 修复在建表过程中发生异常后导致
DROP DATABASE卡住的问题。(Nikolay Degterinsky)。 - 修复分布式缓存中的逻辑错误。(Kseniia Sumarokova)。
- 修复分布式缓存返回错误不正确的问题。(Kseniia Sumarokova)。
- 修复 Shared Catalog 中 ~TemporaryLockForUUIDDirectory 出现的
LOGICAL_ERROR。(Nikolay Degterinsky) - 修复在重命名数据库后,元数据缓存返回错误的依赖关系的问题。(Nikolay Degterinsky)。
- Shared Catalog:修复在次要副本上对大型表执行 DROP 操作时的问题。(Raúl Marín)。
- 修复了分布式缓存在
processWriteRequest中的逻辑错误。(Kseniia Sumarokova)。 - 移除在次要副本上对 MV
ALTER操作的检查。 (Nikolay Degterinsky)。