v25.8 Cloud 更新日志
向后不兼容的变更
JSON 和数据格式变更
- 默认在 JSON 格式中禁用对 64 位整数的加引号。#74079 (Pavel Kruglov).
- 在 JSON 中,对于包含不同类型值的数组,推断为
Array(Dynamic)而不是未命名的Tuple。若要恢复之前的行为,请禁用设置input_format_json_infer_array_of_dynamic_from_array_of_different_types。#80859 (Pavel Kruglov). - 在 Parquet 输出格式中,默认将
Enum类型的值写为逻辑类型为ENUM的BYTE_ARRAY。#84169 (Pavel Kruglov).
存储和分区
- 添加对 hive 分区风格写入的支持,并重构读取实现(hive 分区列不再是虚拟列)。#76802 (Arthur Passos)。
- 默认启用 MergeTree 设置
write_marks_for_substreams_in_compact_parts。这将显著提升从新创建的 Compact 分区片段中读取子列的性能。版本低于 25.5 的服务器将无法读取新的 Compact 分区片段。#84171 (Pavel Kruglov)。 - 禁止在 SummingMergeTree 中对显式列出的用于求和的列执行
RENAME COLUMN或DROP COLUMN操作。修复 #81836。#82821 (Alexey Milovidov)。
函数增强
- 为
extractKeyValuePairs函数新增参数unexpected_quoting_character_strategy,用于控制在意外遇到quoting_character时的处理方式。更多详情,参见extractKeyValuePairs的文档。#80657(Arthur Passos)。 - 先前,函数
countMatches即使在模式允许出现空匹配的情况下,遇到第一个空匹配时也会停止计数。为解决此问题,countMatches现在在出现空匹配时会继续执行,并向前推进一个字符。希望保留旧行为的用户可以启用 SETTINGcount_matches_stop_at_empty_match。#81676(Elmi Ahmadov)。
数据类型改进
- 提高从
Decimal到Float32转换的精度,实现从Decimal到BFloat16的转换。修复 #82660 中的问题。#82823(Alexey Milovidov)。
性能和资源管理
- 之前,
BACKUP查询、合并和变更在本地(max_local_read_bandwidth_for_server和max_local_write_bandwidth_for_server)及远程(max_remote_read_network_bandwidth_for_server和max_remote_write_network_bandwidth_for_server)流量方面并未使用全局服务器级限速器,而是仅受专用服务器设置(max_backup_bandwidth_for_server、max_mutations_bandwidth_for_server和max_merges_bandwidth_for_server)的限速。现在,它们会同时使用这两类限速器。 #81753 (Sergei Trifonov)。 - 新增设置
cluster_function_process_archive_on_multiple_nodes,在设为 true(默认值)时,可以提升在集群函数中处理归档的性能。如果在较早版本中使用带归档的集群函数,为了兼容性并避免在升级到 25.7+ 期间出现错误,应将其设为false。 #82355 (Kseniia Sumarokova)。 - 之前
concurrent_threads_scheduler的默认值为round_robin,在存在大量单线程查询(例如INSERT查询)时被证明是不公平的。本次变更将更安全的替代方案fair_round_robin调度器设为默认值。 #84747 (Sergei Trifonov)。 - 为避免在未启用分析器时仍需维护惰性物化(在这种情况下可能会出现一些问题,例如在条件中使用
indexHint()时),现在仅在启用分析器时才启用惰性物化。 #83791 (Igor Nikonov)。
模式和 SQL 语法
- 禁止创建没有可插入的列的表。#81835 (Pervakov Grigorii)
- 要求在默认表达式中,对包含点号的标识符使用反引号包裹,以防止其被解析为复合标识符。#83162 (Pervakov Grigorii)
- 支持 PostgreSQL 风格的 heredoc 语法:
$tag$ string contents... $tag$,也称为美元符号引用的字符串字面量。此前的版本中,对 tag 的限制较少:它们可以包含任意字符,包括标点符号和空白字符。这会与同样可以以美元符号开头的标识符产生解析歧义。同时,PostgreSQL 仅允许在 tag 中使用单词字符。为解决该问题,我们现在将 heredoc 的 tag 限制为只能包含单词字符。修复 #84731。#84846 (Alexey Milovidov)
安全和权限
SYSTEM RESTART REPLICAS现在只会在你拥有SHOW TABLES权限的数据库中重启副本。此前,该查询会在 Lazy 数据库中的表正在被并发删除时,即使你对该数据库没有访问权限,也会唤醒这些表。#83321(Alexey Milovidov)。- 函数
azureBlobStorage、deltaLakeAzure和icebergAzure已更新为正确校验AZURE权限。所有集群变体函数(-Cluster函数)现在都会根据其对应的非集群变体来验证权限。为避免权限错误,请确保调用-Cluster函数的用户具有相应的权限(例如,GRANT S3 ON *.* TO user)。此外,icebergLocal和deltaLakeLocal函数现在会强制执行FILE权限检查。#84938(Nikita Mikhaylov
新功能
数据类型
- 新增数据类型:
Time([H]HH:MM:SS)和Time64([H]HH:MM:SS[.fractional]),以及一些基础的 cast 转换函数和用于与其他数据类型交互的函数。新增用于兼容旧版函数ToTime的设置。#81217 (Yarik Briukhovetskyi).
函数
- 添加
NumericIndexedVector,一种基于 bit-sliced 与 roaring-bitmap 压缩的新向量数据结构,并提供 20 多个用于构建、分析和逐元素算术运算的函数。可减少存储占用并加速对稀疏数据的 join、filter 和聚合操作。实现了 #70582 以及 T. Xiong 和 Y. Wang 在 VLDB 2024 上发表的《Large-Scale Metric Computation in Online Controlled Experiment Platform》一文。#74193(FriendLey)。 - 新增财务函数:
financialInternalRateOfReturnExtended(XIRR)、financialInternalRateOfReturn(IRR)、financialNetPresentValueExtended(XNPV)、financialNetPresentValue(NPV)。#81599(Joanna Hulboj)。 - 添加地理空间函数
polygonIntersectsCartesian和polygonIntersectsSpherical,用于检查两个多边形是否相交。#81882(Paul Lamb)。 - 支持
lag和lead窗口函数。修复 #9887。#82108(Dmitry Novik)。 - 添加函数
colorSRGBToOkLCH和colorOkLCHToSRGB,用于在 sRGB 和 OkLCH 色彩空间之间进行颜色转换。#83679(Fgrtue)。 - 用户现在可以使用
JSONExtractCaseInsensitive(以及JSONExtract的其他变体)执行不区分大小写的 JSON 键查找。#83770(Alistair Evans)。 - 新增了函数
nowInBlock64。 #84178 (Halersson Paris)。 - 添加函数
dateTimeToUUIDv7,用于将 DateTime 值转换为 UUIDv7。使用示例:SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56'))返回0198af18-8320-7a7d-abd3-358db23b9d5c。#84319(samradovich)。 - 添加
timeSeriesDerivToGrid和timeSeriesPredictLinearToGrid聚合函数,用于将数据重新采样为由指定开始时间戳、结束时间戳和步长定义的时间网格;分别计算类似 PromQL 中的deriv和predict_linear。 #84328 (Stephen Chi). - 新增
timeSeriesRange和timeSeriesFromGrid函数。 #85435 (Vitaly Baranov).
系统表
- 添加
system.dead_letter_queue表,用于保留来自 Kafka 等引擎的错误入站消息。#68873(Ilya Golshtein)。 - 添加
system.zookeeper_connection_log系统表,用于存储 ZooKeeper 连接的历史信息。#79494(János Benjamin Antal)。 - 新增系统表
system.codecs,用于查看可用的编解码器。(问题 #81525)。#81600(Jimmy Aguilar Mena)。 - 引入
system.completions表。解决 #81889。#83833(|2ustam)。
Iceberg 和 Delta Lake
- 在 Iceberg 模式演进中支持复杂类型。#73714 (scanhex12)。
- 为
insert查询引入 Iceberg 写入能力。#82692 (scanhex12)。 - 为 Iceberg 表引擎支持基于位置的删除(positional deletes)。#83094 (Daniil Ivanik)。
- 通过字段 ID 读取 Iceberg 数据文件。关闭 #83065。#83653 (scanhex12)。
- 为 CREATE 操作提供 Iceberg 写入支持。关闭 #83927。#83983 (scanhex12)。
- 为 Glue catalog 提供写入支持。#84136 (scanhex12)。
- 为 Iceberg REST catalog 提供写入支持。#84684 (scanhex12)。
- 将所有 Iceberg 位置删除文件合并到数据文件中。这将减少 Iceberg 存储中 Parquet 文件的数量和大小。语法:
OPTIMIZE TABLE table_name。#85250 (scanhex12)。 - 为 Iceberg 支持
DROP TABLE(从 REST/Glue catalog 中移除并删除该表的元数据)。#85395 (scanhex12)。 - 为以 merge-on-read 格式存储的 Iceberg 支持
ALTER DELETE变更操作。#85549 (scanhex12)。 - 支持写入 Delta Lake。关闭 #79603。#85564 (Kseniia Sumarokova)。
- 在元数据(manifest 条目)中写入更多 Iceberg 统计信息(列大小、下界和上界),用于 min-max 剪枝。#85746 (scanhex12)。
- 在 Iceberg 中为简单类型支持添加 / 删除 / 修改列。#85769 (scanhex12)。
MergeTree 和存储
- 现在所有数据表都支持
_table虚拟列,而不仅仅是 Merge 类型的表。#63665(Xiaozhe Yu)。 - 添加 SZ3 作为一种有损但误差有界的压缩编解码器,用于
Float32和Float64类型的列。#67161(scanhex12)。 - 为
MergeTree系列表添加了对轻量级更新的支持。可以通过新的语法使用轻量级更新:UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>。通过轻量级更新实现了轻量级删除,可通过设置lightweight_delete_mode = 'lightweight_update'启用。#82004(Anton Popov)。 - 在 MergeTree 系列表中支持
_part_granule_offset虚拟列。该列表示每一行在其数据 part 中所属 granule/mark 的从零开始计数的索引。这解决了 #79572。#82341(Amos Bird)。
协议和客户端支持
- 通过添加
arrowflight表引擎,实现对 ArrowFlight RPC 协议的支持。#74184(zakr600)。 - 新增对 PostgreSQL 协议
COPY命令的支持。#74344(scanhex12)。 - 为 MySQL 协议增加对 C# 客户端的支持。解决了 #83992。#84397(scanhex12)。
- 对
mysql_port和postgresql_port强制使用安全连接。#82962(Shaohua Wang)。
SQL 和查询特性
- 在
DESCRIBE (SELECT ...)之外,新增对DESCRIBE SELECT的支持。#82947 (Yarik Briukhovetskyi)。 - 新增对使用
USE DATABASE {name}语句的支持。#81307 (Yarik Briukhovetskyi)。 - 在并行副本中实现了从投影读取。新增设置项
parallel_replicas_support_projection,用于控制是否启用投影支持。为简化实现,只有在parallel_replicas_local_plan激活时才会启用对投影的支持。#82807 (zoomxi)。
格式
- 添加
format_schema_source设置,用于定义format_schema的来源。#80874 (Tuan Pham Anh)。 - 新增
Hash输出格式。它会为结果的所有列和行计算一个单个哈希值。这对于计算结果的“指纹”非常有用,例如在数据传输成为瓶颈的场景下。例如:SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash返回e5f9e676db098fdb9530d2059d8c23ef。#84607 (Robert Schulze)。
服务器配置和工作负载管理
- 服务器配置项
cpu_slot_preemption为工作负载启用抢占式 CPU 调度,并确保在各工作负载之间实现 max-min 公平的 CPU 时间分配。新增用于 CPU 限流的工作负载设置:max_cpus、max_cpu_share和max_burst_cpu_seconds。#80879(Sergei Trifonov)。 - 现在支持工作负载设置
max_waiting_queries。它可用于限制查询队列的大小。如果达到该限制,所有后续查询将以SERVER_OVERLOADED错误终止。#81250(Oleg Doronin)。 - 在达到预设的查询数量或时间阈值后断开 TCP 连接。解决了 #68000。#81472(Kenny Sun)。
云存储
- 将
extra_credentials添加到AzureBlobStorage,以使用client_id和tenant_id进行身份验证。#84235 (Pablo Marcos)。
Keeper
- 新增在 Keeper Multi 查询中设置任意 watch 的功能。#84964 (Mikhail Artemenko)。
- 支持部分聚合指标。#85328 (Mikhail Artemenko)。
实验性功能
表引擎和表函数
- 添加 Ytsaurus 表引擎和表函数。 #77606 (MikhailBurdukov)。
文本索引改进
- 新增函数
searchAny和searchAll,作为用于搜索文本索引的通用工具。#80641(Elmi Ahmadov)。 - 文本索引现在支持
string分词器。#81752(Elmi Ahmadov)。 - 将
text索引的默认索引粒度值更改为 64。这在内部基准测试中提升了平均测试查询的预期性能。#82162(Jimmy Aguilar Mena)。 - 256 位位图按顺序存储某个状态的出边标签,但出边状态写入磁盘时按照它们在哈希表中出现的顺序保存。因此,从磁盘读取时,某个标签会指向错误的下一状态。#82783(Elmi Ahmadov)。
- 当前 FST 树以未压缩形式保存在磁盘上。这可能在读写磁盘时导致性能下降或更高的 I/O 带宽占用。#83093(Elmi Ahmadov)。
功能成熟度更新
- 将 catalog 提升到 beta 阶段。#85848 (Melvyn Peignon).
- 将轻量级更新从 experimental 阶段提升到 beta 阶段。#85952 (Anton Popov).
性能优化
查询执行与聚合
- 对
-If聚合函数组合器进行了轻量优化。#78454 (李扬)。 - 添加了新的逻辑(由设置
enable_producing_buckets_out_of_order_in_aggregation控制,默认启用),允许在内存高效的聚合过程中无序发送部分 bucket。当某些聚合 bucket 的合并时间明显长于其他 bucket 时,该逻辑通过允许发起端在此期间先合并 bucket id 更高的 bucket 来提升性能。缺点是可能会增加内存使用量(不应显著)。#80179 (Nikita Taranov)。 - 使
TOTALS步骤之后的 pipeline 支持多线程。#80331 (UnamedRus)。 - 当聚合查询只包含对
NOT NULL列的单个COUNT()函数时,聚合逻辑会在哈希表探测期间被完全内联。这样可以避免分配和维护任何聚合状态,从而显著降低内存使用和 CPU 开销。该改进部分解决了 #81982。#82104 (Amos Bird)。 - 当按多个字符串或数字列进行 GROUP BY 时,以列式方式计算序列化后的键。#83884 (李扬)。
- 为
-If组合器实现了addManyDefaults。#83870 (Raúl Marín)。
JOIN 优化
- 添加新的设置项
min_joined_block_size_rows(类似于min_joined_block_size_bytes;默认值为 65409),用于控制 JOIN 输入和输出数据块的最小块大小(以行数计,如果 JOIN 算法支持)。更小的数据块会被压缩合并处理。#81886(Nikita Taranov)。 - 通过在仅有一个键列这一典型场景下移除对哈希表的额外循环来优化
HashJoin的性能,同时在null_map和join_mask始终为true/false时省略相关检查。#82308(Nikita Taranov)。 - 将 #82308 中对
null_map和JoinMask的优化应用到具有多个析取条件的 JOIN 场景,同时优化了KnownRowsHolder数据结构。#83041(Nikita Taranov)。 - 对 join 标志使用普通的
std::vector<std::atomic_bool>,以避免在每次访问标志时计算哈希。#83043(Nikita Taranov)。 - 在 hash JOIN 主循环之外处理
max_joined_block_rows,略微提升 ALL JOIN 的性能。#83216(Nikolai Kochetov)。 - 当
HashJoin使用lazy输出模式时,不再为结果列预先分配内存。这种方式并不理想,尤其是在匹配数量较少时。此外,在 JOIN 完成后我们可以确切知道匹配的数量,因此可以更精确地进行预分配。#83304(Nikita Taranov)。 - 如果右侧由 join 键列函数依赖唯一确定(即所有行的 join 键值唯一),则所有
LEFT/INNERJOIN 将自动转换为RightAny。#84010(Nikita Taranov)。 - 提升了在
Join模式下应用补丁分区片段时的性能。#85040(Anton Popov)。
分布式查询改进
- 引入了一个选项,可以将数据块的(解)压缩和(反)序列化,从原本与网络连接绑定的单个线程卸载到管线线程中。通过
enable_parallel_blocks_marshalling设置进行控制。该选项应能加速在发起端与远程节点之间传输大量数据的分布式查询。#78694(Nikita Taranov)。 - 默认启用并行分布式
INSERT SELECT,其模式是在每个分片上独立执行INSERT SELECT,参见parallel_distributed_insert_select设置。#80425(Igor Nikonov)。 - 在原生协议中对日志和 profile 事件进行压缩。在具有 100+ 副本的集群上,未压缩的 profile 事件会占用 1–10 MB/秒,并且在较慢的网络连接上进度条会变得迟缓。此更改关闭了 #82533。#82535(Alexey Milovidov)。
- 默认启用并行分布式
INSERT SELECT,其模式是在每个分片上独立执行INSERT SELECT,参见parallel_distributed_insert_select设置。#83040(Igor Nikonov)。 - 修复了并行副本最小任务大小的计算方式。#84752(Nikita Taranov)。
索引改进
- 使用向量相似度索引的向量搜索查询,由于减少了存储读取和 CPU 使用,延迟更低。#79103 (Shankar Iyer).
- 在
filterPartsByQueryConditionCache中遵循merge_tree_min_{rows,bytes}_for_seek,使其与其他按索引过滤的方法保持一致。#80312 (李扬). - 优先处理粒度更高的 min-max 索引。修复了 #75381。#83798 (Maruth Goyal).
- 现在,bloom filter 索引可用于类似
has([c1, c2, ...], column)的条件,其中column不是Array类型。这样可以提升此类查询的性能,使其与使用IN运算符一样高效。#83945 (Doron David). - 按文件大小递增顺序处理索引。整体索引排序会优先处理 minmax 和 vector 索引(分别因为实现简单和选择性高),然后再执行较小的索引。在 minmax/vector 索引内部,也会优先选择更小的索引。#84094 (Maruth Goyal).
- 之前,文本索引数据会被拆分为多个分段(每个分段的默认大小为 256 MiB)。这可能在构建文本索引时降低内存消耗,但会增加磁盘空间需求并延长查询响应时间。#84590 (Elmi Ahmadov).
子查询优化
- 通过使用等价类删除多余的
JOIN操作,优化关联子查询生成的执行计划。如果对所有关联列都存在等价表达式,且已启用query_plan_correlated_subqueries_use_substitutionsetting,则不会生成CROSS JOIN。#82435 (Dmitry Novik)。 - 当关联子查询作为函数
EXISTS的参数时,仅读取所需的列。#82443 (Dmitry Novik)。
Azure Blob Storage 改进
azureBlobStorage表引擎现在会在可能的情况下缓存并复用托管身份(Managed Identity)身份验证令牌,以避免被限流。 #79860 (Nick Blakely)。- 使用 poco HTTP 客户端替换用于 Azure Blob Storage 的 curl HTTP 客户端。为这些客户端引入了多个设置,这些设置与 S3 中的设置保持一致。为 Azure 和 S3 都引入了更激进的连接超时设置。改进了对 Azure profile events 和 metrics 的观测与分析能力。新的客户端默认启用,在 Azure Blob Storage 上执行冷查询时可以显著提升延迟表现。如需恢复使用旧的
Curl客户端,可以将azure_sdk_use_native_client设为false。 #83294 (alesapin)。
存储引擎改进
- 修复了 Redis 和 KeeperMap 存储按键进行过滤时的问题。#81833 (Pervakov Grigorii).
ATTACH PARTITION不再导致所有缓存被清空。#82377 (Alexey Milovidov).- 在创建存储快照数据时避免持有锁,以减少在高并发负载下的锁竞争。#83510 (Duc Canh Le).
- 删除临时分区片段可能需要一段时间(尤其是在使用 S3 时),而目前我们是在
MergeTreeBackgroundExecutor中持有全局锁的情况下执行这一操作。当由于连接丢失需要重启所有表,并且我们等待后台任务完成时,表甚至可能长时间处于只读模式(长达一小时)。但看起来在调用cancel时并不需要这个锁。#84311 (Alexander Tokmakov).
格式改进
- 新的 Parquet 读取器实现。整体速度更快,并支持页级过滤下推和
PREWHERE。目前为实验性功能。使用设置input_format_parquet_use_native_reader_v3来启用。#82789 (Michael Kolupaev)。 - 通过在没有解析错误时复用序列化器,提升了 ProtobufSingle 输入格式的性能。#83613 (Eduard Karacharov)。
数据类型和序列化优化
- 通过为 MergeTree 中的
JSON共享数据实现新的序列化方式,大幅提升从这些共享数据中读取JSON子列的性能。#83777 (Pavel Kruglov). - 通过简化代码来优化字符串反序列化,解决 #38564 问题。#84561 (Alexey Milovidov).
Pipeline 和执行改进
- 在构建 pipeline 期间,尽量减少在端口头信息中的内存拷贝。最初的 PR 由 heymind 提交。#83381(Raúl Marín)。
- 提升 pipeline 构建的性能。#83631(Raúl Marín)。
- 优化 MergeTreeReadersChain::getSampleBlock。#83875(Raúl Marín)。
- 在仅为返回单行数据而对常量进行物化时,优化常量物化过程。#85071(Alexey Milovidov)。
内存和资源优化
- 调整部分 jemalloc 配置以提升性能。#81807 (Antonio Andelic)。
- 在 ProfileEvents 的 Counter 中添加对齐以减少伪共享。#82697 (Jiebin Sun)。
- 减少
CompressedReadBufferBase::readCompressedData中不必要的memcpy调用。#83986 (Raúl Marín)。
查询计划与分析
- 提升
QueryTreeHash的性能。 #82617 (Nikolai Kochetov).
日志改进
- 引入异步日志。#82516 (Raúl Marín).
函数优化
- 通过去除临时数据来优化
largestTriangleThreeBuckets。#84479 (Alexey Milovidov)。 - 对许多字符串处理函数的实现进行了优化和简化,并纠正了多个函数的错误文档说明。注意:对于 String 列以及包含 String 列的复杂类型,
byteSize的输出已从每个空字符串 9 字节变更为每个空字符串 8 字节,这是符合预期的行为。#85063 (Alexey Milovidov)。
Keeper 改进
- 通过 RocksDB 的初始加载改进 Keeper。#83390 (Antonio Andelic)。
数据湖改进
- 通过 delta-kernel-rs 后端提升并行文件处理能力。#85642 (Azat Khuzhin).
改进
访问控制与安全性
- 引入了两种新的源访问类型:
READ和WRITE,并弃用所有之前与源相关的访问类型。之前是GRANT S3 ON *.* TO user,现在为:GRANT READ, WRITE ON S3 TO user。这也允许为源分别设置READ和WRITE权限,例如:GRANT READ ON * TO user、GRANT WRITE ON S3 TO user。该功能由设置access_control_improvements.enable_read_write_grants控制,默认禁用。#73659(pufit)。 - 允许在
CREATE USER查询中为用户名使用参数。#81387(Diskein)。 - 在核心转储文件中排除敏感数据。新增两个分配器:兼容 AWS 库的
AwsNodumpMemoryManager和兼容 STL 的JemallocNodumpSTLAllocator。两者都是 Jemalloc 分配器的封装。它们使用 Jemalloc 的 extent hooks 和 madvise 将内存页标记为“不转储(don't dump)”。用于 S3 凭证、用户凭证和部分查询数据。#82441(Miсhael Stetsyuk)。 - 由临时用户创建的 VIEW 现在会存储实际用户信息的副本,并且在临时用户被删除后不再失效。#84763(pufit)。
- 以不区分大小写的方式匹配外部认证的
forward_headers。#84737(ingodwerust)。 - 为
system.grants添加parameter列,用于确定GRANT READ/WRITE的源类型以及GRANT TABLE ENGINE的表引擎。#85643(MikhailBurdukov)。
备份和恢复
- 允许对 PostgreSQL、MySQL 和 DataLake 数据库进行备份。此类数据库的备份仅会保存其定义,而不会保存其中的数据。#79982 (Nikolay Degterinsky)。
- 将所有用于写入备份文件的日志消息级别设置为 TRACE。#82907 (Hans Krutzer)。
- 引入
backup_restore_s3_retry_initial_backoff_ms、backup_restore_s3_retry_max_backoff_ms、backup_restore_s3_retry_jitter_factor,用于配置在备份和恢复操作期间使用的 S3 重试退避策略。#84421 (Julia Kartseva)。 - 引入新的
backup_slow_all_threads_after_retryable_s3_error设置,用于在由于SlowDown等错误导致的重试风暴期间,通过在检测到单个可重试错误后放慢所有线程的速度来减小对 S3 的压力。#84854 (Julia Kartseva)。
数据完整性与校验
- 在提交分区片段之前,检查其
checksum.txt文件的一致性。 #76625 (Sema Checherinda). - 如果某个
RENAME COLUMN类型的 mutation 将会重命名当前仍受未完成的数据 mutation 影响的某一列,则禁止启动该操作。 #81823 (Mikhail Artemenko). - 现在 mutation 的快照将基于可见分区片段的快照构建。快照中使用的 mutation 计数器也将根据包含的 mutation 重新计算。 #82945 (Mikhail Artemenko).
- 新增解析分区片段前缀与后缀的能力,并检查非常量列的覆盖范围。 #83377 (Mikhail Artemenko).
Iceberg 表引擎
- 为 Iceberg 表引擎增加对位置删除(position deletes)的支持。#80237 (YanghongZhong).
- 现在 ClickHouse 支持 Iceberg 的压缩
metadata.json文件。修复 #70874。#81451 (alesapin). - 修复按字段 ID 读取复杂类型的 Iceberg 数据。#84821 (scanhex12).
- 支持在写入 Iceberg 时从 pyiceberg 读取数据。#84466 (scanhex12).
- 为数据湖表引擎增加快照版本信息。#84659 (Pete Hampton).
- 支持在 Iceberg 中写入 version-hint 文件。关闭 #85097。#85130 (scanhex12).
- 通过
iceberg_metadata_compression_method设置支持压缩的.metadata.json文件。它支持 ClickHouse 的所有压缩方法。关闭 #84895。#85196 (scanhex12). - 优化了 Iceberg 位置删除文件的内存使用。不再将所有删除文件数据加载到内存中,而是仅在 RAM 中保留 Parquet 删除文件当前的行组(row-group)。这在处理大型位置删除文件时显著降低了内存消耗。#85329 (scanhex12).
- 允许异步遍历 Iceberg 表中的对象,而无需为每个数据文件显式存储对象。#85369 (Daniil Ivanik).
- 支持 Iceberg 等值删除(equality deletes)。#85843 (Han Fei).
DeltaLake 表引擎
- 改进
DeltaLake表引擎:delta-kernel-rs 提供了ExpressionVisitorAPI,本 PR 对其进行了实现,并将其应用于分区列表达式的转换(它将替换之前在我们代码中使用的、在 delta-kernel-rs 中已弃用的旧方式)。未来,这个ExpressionVisitor还将支持基于统计信息的裁剪以及一些 Delta Lake 的专有特性。此外,此更改的目的之一是为了在DeltaLakeCluster表引擎中支持分区裁剪(解析后的表达式结果 ActionsDAG 将被序列化,并和数据路径一起从发起端发送,因为这种用于裁剪的信息仅能作为数据文件列表中的元信息获得,而该列表仅由发起端生成,但需要在每个读取服务器上应用到数据)。#81136(Kseniia Sumarokova)。 - 修复使用 DataLake 集群函数时的分区裁剪问题。#82131(Kseniia Sumarokova)。
- 修复在 DeltaLakeCluster 表函数中读取分区数据的问题。本 PR 提升了集群函数协议版本,从而允许从发起端向副本发送额外信息。该额外信息包含 delta-kernel 的转换表达式,用于解析分区列(以及未来的一些其他内容,例如生成列等)。#82132(Kseniia Sumarokova)。
- 现在 Datalake 数据库会抛出更易理解的异常信息。修复了 #81211。#82304(alesapin)。
- 在
DeltaLake存储中实现内部使用delta-kernel-rs的过滤(基于统计信息和分区裁剪)。#84006(Kseniia Sumarokova)。 - 新增设置
delta_lake_enable_expression_visitor_logging,用于关闭 ExpressionVisitor 日志,因为在调试时即使在测试日志级别,它们也可能过于冗长。#84315(Kseniia Sumarokova)。 - 新增设置
delta_lake_snapshot_version,以便在DeltaLake表引擎中读取特定快照版本。#85295(Kseniia Sumarokova)。
数据湖集成
- 通过异步请求加速在数据目录中列出表。#81084 (alesapin).
- 在 Glue catalog 中支持
TimestampTZ。这解决了 #81654。#83132 (scanhex12). - 将 FormatParserGroup 拆分为两个独立的结构体,第一个负责共享计算和 IO 资源,第二个负责共享过滤资源(filter ActionDag、KeyCondition)。这样做是为了让不同线程可以更灵活地共享使用这些结构。#83997 (Daniil Ivanik).
- 在 Azure 配置中补充缺失的
partition_columns_in_data_file。#85373 (Arthur Passos). - 添加
show_data_lake_catalogs_in_system_tables标志位,用于控制是否在system.tables中添加数据湖表,解决 #85384。#85411 (Smita Kulkarni).
S3 和对象存储
- 在
s3_plain_rewritable中实现moveFile和replaceFile方法,以支持将其用作数据库磁盘。#79424(Tuan Pham Anh)。 - 在 HTTP 套接字层级对 S3 读写请求进行限速(而不是对整个 S3 请求限速),以避免与
max_remote_read_network_bandwidth_for_server和max_remote_write_network_bandwidth_for_server限速相关的问题。#81837(Sergei Trifonov)。 - 当启用
s3_slow_all_threads_after_network_error配置时,此 PR 为 S3 重试机制引入抖动(jitter)。#81849(zoomxi)。 - 实现通过显式提供 IAM 角色的 AWS S3 身份验证,并实现对 GCS 的 OAuth 支持。这些功能此前仅在 ClickHouse Cloud 中可用,现在已开源。同时对部分接口进行了统一,例如对象存储连接参数的序列化。#84011(Alexey Milovidov)。
- 允许将任意存储策略(例如 S3 等对象存储)用于外部聚合/排序。#84734(Azat Khuzhin)。
- 汇总所有待删除的对象,通过一次对象存储删除操作统一删除。#85316(Mikhail Artemenko)。
S3Queue 表引擎
- 现在可以在 S3Queue 表引擎的
keeper_path设置中使用{uuid}之类的宏。#82463 (Nikolay Degterinsky)。 - 新增服务器设置
s3queue_disable_streaming,用于在使用 S3Queue 表引擎的表中禁用流式处理。该设置可在无需重启服务器的情况下进行更改。#82515 (Kseniia Sumarokova)。 - 向
system.s3queue_log中添加commit_time、commit_id列。#83016 (Kseniia Sumarokova)。 - 为 s3queue 的关停过程添加日志。#83163 (Kseniia Sumarokova)。
- 在服务器关机时,在关闭任何表之前先停止 S3(Azure/etc)Queue 的流式处理。#83530 (Kseniia Sumarokova)。
- 支持在
S3Queue表级别更改物化视图插入相关设置。新增S3Queue级别设置:min_insert_block_size_rows_for_materialized_views和min_insert_block_size_bytes_for_materialized_views。默认情况下将使用配置概要级别的设置,S3Queue级别设置会覆盖这些设置。#83971 (Kseniia Sumarokova)。 - 修复 S3Queue 有序模式:在收到关停请求后可更早退出。#84463 (Kseniia Sumarokova)。
Kafka 集成
- 手动统计消费的消息数量,以避免依赖 StorageKafka2 中此前已提交的 offset。#81662 (János Benjamin Antal).
- 将
StorageKafka2集成到system.kafka_consumers。#82652 (János Benjamin Antal).
ClickHouse Keeper 改进
- Keeper 改进:通过后台线程在不同磁盘之间移动 changelog 文件。此前,将 changelog 移动到不同磁盘会在移动完成前全局阻塞 Keeper。如果移动操作耗时较长(例如移动到 S3 磁盘),会导致性能下降。#82485 (Antonio Andelic)。
- Keeper 改进:新增配置项
keeper_server.cleanup_old_and_ignore_new_acl。启用后,所有节点的 ACL 都会被清空,同时新请求的 ACL 会被忽略。如果目标是从节点中完全移除 ACL,务必在创建新快照之前保持此配置项为启用状态。#82496 (Antonio Andelic)。 - Keeper 改进:为 world:anyone ACL 提供特定权限支持。#82755 (Antonio Andelic)。
- 支持在配置中为路径指定额外的 Keeper ACL。如果希望为某个特定路径添加额外 ACL,可在配置中的
zookeeper.path_acls下进行定义。#82898 (Antonio Andelic)。 - 当 Keeper 因软内存限制拒绝写入时,新增 ProfileEvent。#82963 (Xander Garbett)。
- 在 Keeper 中默认启用
create_if_not_exists、check_not_exists、remove_recursive功能标志,从而启用新的请求类型。#83488 (Antonio Andelic)。 - 通过
apply_to_children配置,支持在特定 Keeper 节点上应用额外 ACL。#84137 (Antonio Andelic)。 - 在 KeeperClient 中新增
get_acl命令。#84641 (Antonio Andelic)。 - 在 Keeper 中新增 4LW 命令
lgrq,用于切换对已接收请求的日志记录。#84719 (Antonio Andelic)。 - 降低 Keeper 中存储锁的竞争。#84732 (Antonio Andelic)。
encrypt_decrypt工具现在支持加密的 ZooKeeper 连接。#84764 (Roman Vasin)。- 通过
keeper_server.coordination_settings.latest_logs_cache_entry_count_threshold和keeper_server.coordination_settings.commit_logs_cache_entry_count_threshold,按条目数量限制 Keeper 日志条目缓存大小。#84877 (Antonio Andelic)。
JSON 和 Dynamic 类型
- 将
columns_substreams.txt文件添加到 Wide 分区片段中,用于跟踪该分区片段中存储的所有子流。它有助于跟踪 JSON 和 Dynamic 类型中的动态子流,从而避免为获取动态子流列表(例如用于计算列大小)而读取这些列的样本数据。此外,现在所有动态子流都会体现在system.parts_columns中。 #81091 (Pavel Kruglov)。 - 允许在 JSON 和 Dynamic 列中使用
ALTER UPDATE。 #82419 (Pavel Kruglov)。 - 用户现在可以在 JSON 类型中使用
Time和Time64类型。 #83784 (Yarik Briukhovetskyi)。 - 新增设置
json_type_escape_dots_in_keys,用于在解析 JSON 类型时转义 JSON 键中的点。该设置默认禁用。 #84207 (Pavel Kruglov)。
Parquet 和 ORC 格式
- 引入用于设置 ORC 压缩块大小的设置项,并将其默认值从 64KB 更新为 256KB,以与 Spark 或 Hive 保持一致。#80602 (李扬).
- 支持按照规范的要求,将 parquet enum 写为字节数组。后续会补充更多信息。#81090 (Arthur Passos).
- 支持将 GeoParquet 作为输出格式写出。#81784 (scanhex12).
分布式查询和并行副本
- 引入了一个新的设置
enable_add_distinct_to_in_subqueries。启用后,ClickHouse 会在分布式查询的 IN 子句中,自动为子查询添加DISTINCT。这可以显著减少在分片之间传输的临时表大小,从而提升网络效率。注意:这是一个权衡——虽然网络传输减少了,但每个节点需要进行额外的合并(去重)工作。当网络传输成为瓶颈且可以接受合并成本时,可启用此设置。#81908(fhw12345)。 - 在
address_expression参数中提供集群名称(cluster)时,为并行副本添加了对remote-()表函数的支持。同时修复了 #73295。#82904(Igor Nikonov)。 - 使用并行副本的 JOIN 现在会使用 Join 逻辑步骤。如果在使用并行副本的 JOIN 查询中遇到任何问题,可尝试执行
SET query_plan_use_new_logical_join_step=0并提交 issue。#83801(Vladimir Cherkasov)。
设置与配置
- 将
allow_experimental_join_condition设置标记为已废弃。#80566(Vladimir Cherkasov)。 - 总体和按用户的网络限流器将不再被重置,从而确保不会超过
max_network_bandwidth_for_all_users和max_network_bandwidth_for_all_users的限制。#81729(Sergei Trifonov)。 - 引入
optimize_rewrite_regexp_functions设置(默认启用),允许优化器在检测到特定正则表达式模式时,将某些replaceRegexpAll、replaceRegexpOne和extract调用重写为更简单且更高效的形式。(问题 #81981)。#81992(Amos Bird)。 - 根据 listen_backlog(默认 4096)调整 TCP 服务器队列(默认 64)。#82045(Azat Khuzhin)。
- 支持在无需重启服务器的情况下,动态重新加载
max_local_read_bandwidth_for_server和max_local_write_bandwidth_for_server。#82083(Kai Zhu)。 - 引入设置
enable_vector_similarity_index,必须启用该设置才能使用向量相似度索引。现有设置allow_experimental_vector_similarity_index现已废弃,但在需要时仍可使用。#83459(Robert Schulze)。 - 在
max_joined_block_size_rows之外新增max_joined_block_size_bytes,用于限制包含数据量较大列的 JOIN 的内存使用。#83869(Nikolai Kochetov)。 - 修复 cluster_function_process_archive_on_multiple_nodes 的兼容性问题。#83968(Kseniia Sumarokova)。
- 默认启用对相关子查询(correlated subqueries)的支持。#85107(Dmitry Novik)。
- 添加
database_replicated设置,用于定义 DatabaseReplicatedSettings 的默认值。如果在创建 Replicated 数据库的查询中未指定该设置,则使用这里的值。#85127(Tuan Pham Anh)。 - 允许在
s3或s3Cluster表引擎/函数中使用键值形式的参数,例如s3('url', CSV, structure = 'a Int32', compression_method = 'gzip')。#85134(Kseniia Sumarokova)。 - 将非相关的
EXISTS作为标量子查询执行。这允许使用标量子查询缓存并对结果进行常量折叠,从而有利于索引。为兼容性,新增加execute_exists_as_scalar_subquery=1设置。#85481(Nikolai Kochetov)。 - 支持解析更多复合标识符(compound identifiers)的情况。特别是提升了
ARRAY JOIN与旧分析器的兼容性。引入新设置analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested以保留旧行为。#85492(Nikolai Kochetov)。
系统表和可观测性
- 将压力类指标添加到 ClickHouse 异步指标中。#80779(Xander Garbett)。
- 添加指标
MarkCacheEvictedBytes、MarkCacheEvictedMarks、MarkCacheEvictedFiles,用于跟踪标记缓存中的淘汰情况(issue #60989)。#80799(Shivji Kumar Jha)。 system.formats表现在包含关于格式的扩展信息,例如 HTTP 内容类型、模式推断能力等。#81505(Alexey Milovidov)。- 为
system.warnings表添加使用TRUNCATE TABLE system.warnings清除所有警告的支持。#82087(Vladimir Cherkasov)。 - 在
system.licenses中列出 Rust crate(包)的许可证。#82440(Raúl Marín)。 - 通过统计信息估算复杂的 CNF/DNF 表达式,例如
(a < 1 and a > 0) or b = 3。#82663(Han Fei)。 - 在某些场景下,我们需要为指标提供多个维度。例如,根据错误码统计失败的合并或变更(mutation)操作次数,而不是只使用单一计数器。#83030(Miсhael Stetsyuk)。
- 为
MergeParts条目的 part_log profile events 添加进程资源指标(例如UserTimeMicroseconds、SystemTimeMicroseconds、RealTimeMicroseconds)。#83460(Vladimir Cherkasov)。 - 现在会同时上报 Cgroup 级别和系统范围的指标。Cgroup 级别的指标命名为
CGroup<Metric>,而操作系统级别指标(从 procfs 收集)命名为OS<Metric>。#84317(Nikita Taranov)。 - 添加维度化指标,用于监控并发有界队列的大小,并按队列类型和实例 ID 打标签,以提升可观测性。#84675(Miсhael Stetsyuk)。
system.columns表现在提供column作为现有name列的别名。#84695(Yunchi Pang)。- 向
system.errors添加格式字符串列。该列用于在告警规则中按相同错误类型进行分组。#84776(Miсhael Stetsyuk)。 - 使 Async Log 的限制可调,并添加自省能力。#85105(Raúl Marín)。
- 在获取
system.columns的表列大小时忽略UNKNOWN_DATABASE。#85632(Azat Khuzhin)。
数据库引擎
系统和内部改进
- 修复通过在 DatabaseCatalog 中手动添加表 UUID 的方式附加使用只读远程磁盘的数据库时出现的问题。#82670 (Tuan Pham Anh)。
- 改进在
distributed_ddl_output_mode='*_only_active'时的 DDL 任务处理逻辑,对于复制延迟超过max_replication_lag_to_enqueue的新副本或恢复的副本,不再等待它们完成。这样可以避免在某个新副本在初始化或恢复后变为 active,但已经积累了大量复制日志时出现DDL task is not finished on some hosts错误。同时实现了SYSTEM SYNC DATABASE REPLICA STRICT查询,用于等待复制日志降到max_replication_lag_to_enqueue以下。#83302 (Alexander Tokmakov)。 - 更改 SystemLogs 的关闭顺序,使其在普通表之后关闭(并在 system 表之前,而不是在普通表之前)。#83134 (Kseniia Sumarokova)。
- 为 Replicated 数据库设置添加服务器设置
logs_to_keep,允许配置 Replicated 数据库的默认logs_to_keep参数。较低的数值会减少 ZooKeeper 节点的数量(当数据库很多时尤其有利),而较高的数值则允许缺失的副本在较长停机时间后仍能赶上进度。#84183 (Alexey Khatskevich)。 - 将 Replicated 数据库设置
max_retries_before_automatic_recovery的默认值更改为 10,从而在某些情况下实现更快速的恢复。#84369 (Alexander Tokmakov)。 - 在 Replicated 数据库中优化非追加型可刷新 materialized view 的 DDL 操作,通过跳过旧临时表的创建和重命名步骤提升效率。#84858 (Tuan Pham Anh)。
复制和同步
SystemAndInternalImprovements
- 改进
SYSTEM RESTART REPLICA,在出现 ZooKeeper 连接问题时重试创建表,从而防止表被遗漏。#82616 (Nikolay Degterinsky). - 在
ReplicatedMergeTree::executeMetadataAlter中添加 UUID 校验,以防止在获取 StorageID 和调用IDatabase::alterTable之间发生表交换时出现错误的表定义。#82666 (Nikolay Degterinsky). - 移除与实验性零拷贝复制相关的实验性
send_metadata逻辑。这段代码从未被使用、不受支持,并且很可能存在问题,也没有测试来验证其功能。#82508 (alesapin). - 为
remote_fs_zero_copy_zookeeper_path添加宏展开支持。#85437 (Mikhail Koviazin).
函数与表达式
- 函数
addressToSymbol和system.symbols表会改为使用文件偏移量,而不是虚拟内存地址。#81896(Alexey Milovidov)。 - 在为具名元组推导超类型时,尽量保留元素名称。#81345 (lgbo).
- 允许在不同的窗口函数中对同一列使用不同的排序规则。 #82877 (Yakov Olkhovskiy).
- 添加函数,用于将类型写入 WKB 格式。 #82935 (scanhex12).
- 新增支持将
Time和Time64解析为 MM:SS、M:SS、SS 或 S 格式。#83299(Yarik Briukhovetskyi)。 - 函数
reinterpret()现在支持转换为Array(T),其中T是定长数据类型(issue #82621)。#83399(Shankar Iyer)。 - 修复
structureToProtobufSchema和structureToCapnProtoSchema函数,使其正确添加以零结尾的字节而不是使用换行符,从而避免输出中换行符丢失,以及在依赖该零字节的函数(例如logTrace、demangle、extractURLParameter、toStringCutToZero和encrypt/decrypt)中出现潜在的缓冲区溢出问题。修复 #85062。#85063(Alexey Milovidov)。 - 修复
regexp_tree字典结构,以支持处理包含零字节(\0)的字符串。#85063 (Alexey Milovidov)。 - 修复
formatRowNoNewline函数:当以Values格式或任何行末不带换行符的格式调用时,该函数会错误地删掉输出的最后一个字符。 #85063 (Alexey Milovidov)。 - 修复
stem函数中的异常安全性错误,该错误在罕见场景下可能导致内存泄漏。#85063(Alexey Milovidov)。 - 修复
initcap函数在处理FixedString参数时的问题:当同一数据块中前一个字符串以单词字符结尾时,现在也能在字符串开头正确识别单词起始位置。 #85063 (Alexey Milovidov). - 修复 Apache
ORC格式中的一个安全漏洞,该漏洞可能导致未初始化内存内容被泄露。#85063 (Alexey Milovidov)。 - 将
replaceRegexpAll及其别名REGEXP_REPLACE的行为更改为:即便前一个匹配已经覆盖了整个字符串,仍然允许在字符串末尾出现空匹配(例如^a*|a*$或^|.*),从而在语义上与 JavaScript、Perl、Python、PHP 和 Ruby 保持一致,但与 PostgreSQL 不同。#85063(Alexey Milovidov)。 - 优化并简化了许多字符串处理函数的实现。修正了多个函数的文档错误。注意:对于 String 列以及包含 String 列的复杂类型,
byteSize的输出结果已从每个空字符串 9 字节调整为每个空字符串 8 字节,这是预期行为。#85063(Alexey Milovidov)。 - 在函数
timeSeries*ToGrid()中允许步长为零。这是 PR #75036 的第 3 部分。#85390(Vitaly Baranov)。 - 为
nested函数添加对内层数组的支持。#85719 (Nikolai Kochetov)。
MergeTree 改进
- 以更细粒度的方式禁用依赖于实时更新列或补丁分区片段的跳过索引。现在,跳过索引只会在受实时变更或补丁分区片段影响的分区片段中禁用;此前,这些索引会在所有分区片段上统一禁用。#84241 (Anton Popov)。
- 新增 MergeTree 设置
search_orphaned_parts_drives,用于限制查找分区片段的范围,例如仅在具有本地元数据的磁盘上查找。#84710 (Ilya Golshtein)。 - 为
WHERE补充对read_in_order_use_virtual_row的缺失支持。这样在过滤条件未完全下推到PREWHERE的查询中,可以跳过读取更多分区片段。#84835 (Nikolai Kochetov)。 - 修复 MergeTree 中“紧凑” Variant 类型判别器序列化的使用问题。此前在某些本可使用的场景下没有被使用。#84141 (Pavel Kruglov)。
- 为补丁分区片段中的未压缩总字节数添加限制(表设置
max_uncompressed_bytes_in_patches)。这可以防止在执行轻量级更新后SELECT查询显著变慢,并防止轻量级更新被错误使用。#85641 (Anton Popov)。
缓存和内存管理
- 修复文件系统缓存中的逻辑错误:“Having zero bytes but range is not finished”。#81868 (Kseniia Sumarokova).
- 添加 rendezvous 哈希以提升缓存局部性。#82511 (Anton Ivashkin).
- 重构文件系统缓存的动态扩缩容功能,并增加更多日志用于分析与排查。#82556 (Kseniia Sumarokova).
- 降低可执行用户自定义函数的查询内存跟踪开销。#83929 (Eduard Karacharov).
- 现在所有由外部库执行的内存分配都对 ClickHouse 的内存跟踪器可见并被正确计入。这可能会导致某些查询报告的内存使用量“增加”,或出现
MEMORY_LIMIT_EXCEEDED错误。#84082 (Nikita Mikhaylov). - 对加密命名集合的 encrypted_buffer,只分配所需的最小内存量。#84432 (Pablo Marcos).
向量相似度索引
- 禁止用户在
NumericIndexedVector中使用nan和inf。修复了 #82239 以及更多相关问题。#82681(Raufs Dunamalijevs)。 - 向量相似度索引现在支持二进制量化。二进制量化可显著降低内存占用,并加快向量索引构建过程(由于距离计算更快)。此外,现有的
vector_search_postfilter_multiplier设置已废弃,并被更通用的设置vector_search_index_fetch_multiplier取代。#85024(Shankar Iyer)。 - 基于向量相似度索引的近似向量搜索现已进入 GA 阶段。#85888(Robert Schulze)。
错误处理和消息
- 当已知是否需要保持连接时,会在头部末尾发送
Connection头字段。#81951 (Sema Checherinda). - 在之前的版本中,将聚合函数状态与 IPv4 相乘会产生逻辑错误,而不是正确的错误码。修复 #82817。#82818 (Alexey Milovidov).
- 改进了
AsynchronousMetrics中的错误处理。如果/sys/block目录存在但不可访问,服务器仍会启动,但不会监控块设备。修复 #79229。#83115 (Alexey Milovidov). - 针对带有格式错误的
SELECT的 materialized view 的INSERT,其依赖检查不正确,用户可能会收到晦涩的std::exception,而不是带有清晰说明的有意义错误。现在已修复。修复问题:#82889。#83190 (Nikita Mikhaylov). - 不再在异常消息中输出对表达式操作的过长描述。修复 #83164。#83350 (Alexey Milovidov).
- 当存储正在关闭时,
getStatus会抛出ErrorCodes::ABORTED异常。之前这会导致SELECT查询失败。现在我们会捕获ErrorCodes::ABORTED异常并有意忽略它们。#83435 (Miсhael Stetsyuk). - 使在某些加载和添加 PROJECTION 的场景下的异常消息更易于阅读。#83728 (Robert Schulze).
- 在检查 EOF 之前先检查连接是否已取消,以防止从已关闭的连接中读取。修复 #83893。#84227 (Raufs Dunamalijevs).
- 通过简化内部检查,改进了服务器关闭期间对客户端连接的处理。#84312 (Raufs Dunamalijevs).
- 现在在 UDF 执行期间发生的底层错误会统一以错误码
UDF_EXECUTION_FAILED失败,而之前可能会返回不同的错误码。#84547 (Xu Jia).
SQL 格式改进
- 修复
CREATE DICTIONARY格式不一致的问题。关闭 #82105。#82829(Alexey Milovidov)。 - 修复当
TTL包含materialize函数时格式不一致的问题。关闭 #82828。#82831(Alexey Milovidov)。 - 修复在子查询中且包含诸如
INTO OUTFILE等输出选项时,EXPLAIN AST的格式不一致问题。关闭 #82826。#82840(Alexey Milovidov)。 - 修复在不允许别名的上下文中,带别名的括号表达式格式不一致的问题。关闭 #82836。关闭 #82837。#82867(Alexey Milovidov)。
- 修复带查询参数的
CREATE USER语句(例如CREATE USER {username:Identifier} IDENTIFIED WITH no_password)的格式问题。#84376(Azat Khuzhin)。 - 修复在
CREATE DICTIONARY查询的列列表中,在带参数的列(例如Decimal(8))之后解析末尾逗号时的问题。关闭 #85586。#85653(Nikolay Degterinsky)。
外部集成
- 在使用命名集合时统一 ODBC 和 JDBC 中的参数名称。#83410 (Andrey Zvonov).
- MongoDB:隐式将字符串解析为数值类型。此前,如果从 MongoDB 源接收到用于 ClickHouse 表中数值列的字符串值,会抛出异常。现在,引擎会尝试自动从字符串中解析数值。修复了 #81167 中的问题。#84069 (Kirill Nikiforov).
- 允许在不受支持的架构上使用
simdjson(此前会导致CANNOT_ALLOCATE_MEMORY错误)。#84966 (Azat Khuzhin).
其他杂项改进
- 添加 Ytsaurus 表引擎和表函数。#77606 (MikhailBurdukov)。
- 改进 HashJoin::needUsedFlagsForPerRightTableRow,对于 cross join 返回 false。#82379 (lgbo)。
- 允许将 map 列以元组数组的形式进行写入/读取。#82408 (MikhailBurdukov)。
- 此 PR 已被回滚。#82884 (Mithun p)。
- 异步日志:限制队列中保留的最大条目数。#83214 (Raúl Marín)。
- 在 JSON 输入格式中支持将 Date/Date32 作为整数处理。#83597 (MikhailBurdukov)。
- 改进对布隆过滤器索引(regular、ngram 和 token)的支持,使其在第一个参数为常量数组(集合),第二个参数为被索引列(子集)时也可以利用,从而实现更高效的查询执行。#84700 (Doron David)。
- 当对 KeyValue 存储的主键(例如 EmbeddedRocksDB、KeeperMap)下推
IN/GLOBAL IN过滤条件时,允许对 set 值进行类型转换。#84515 (Eduard Karacharov)。 - 在并行副本读取时,如果索引分析结果为空区间,则避免进行全表扫描。#84971 (Eduard Karacharov)。
- 修复在尝试在本地主机上运行集成测试时可能出现的一系列问题。#82135 (Oleg Doronin)。
- 为旧部署默认启用 trace_log.symbolize。#85456 (Azat Khuzhin)。
Bug 修复(官方稳定版中用户可见的异常行为)
性能优化
- 修复在 25.5 中通过 https://github.com/ClickHouse/ClickHouse/pull/79051 引入的 SummingMergeTree 性能下降问题。#82130(Pavel Kruglov)。
- 修复在启用 analyzer 时,由于次级查询总是从 VIEW 中读取所有列而导致的性能下降问题。修复 #81718。#83036(Dmitry Novik)。
- 在创建没有依赖关系的表时,不再检查循环依赖。该改动修复了通过 https://github.com/ClickHouse/ClickHouse/pull/65405 引入的、在创建成千上万张表场景下出现的性能下降问题。#83077(Pavel Kruglov)。
- 使
DISTINCT窗口聚合在线性时间内运行,并修复sumDistinct中的一个错误。关闭 #79792。关闭 #52253。#79859(Nihal Z. Miaji)。
查询执行相关修复
- 对于组合使用
ORDER BY ... LIMIT BY ... LIMIT N的查询,当 ORDER BY 以 PartialSorting 方式执行时,计数器rows_before_limit_at_least现在反映的是被 LIMIT 子句消耗的行数,而不是被排序算子消耗的行数。#78999(Eduard Karacharov)。 - 修复了在使用
<=>运算符和 Join 存储引擎时的逻辑错误,现在查询会返回正确的错误码。#80165 (Vladimir Cherkasov)。 - 修复
loop函数在与remote函数族一起使用时发生的崩溃问题,确保在loop(remote(...))中能够正确遵守 LIMIT 子句。#80299 (Julia Kartseva)。 - 修复
to_utc_timestamp和from_utc_timestamp函数在处理 Unix 纪元起始时间(1970-01-01)之前以及最大日期(2106-02-07 06:28:15)之后的日期时的错误行为。现在,这些函数会分别将时间值正确截断到纪元起始时间和最大日期。#80498(Surya Kant Ranjan)。 - 修复在
transform_null_in=1时,左侧参数为 null 且子查询结果为非 Nullable 类型情况下的IN执行问题。#81584 (Pavel Kruglov)。 - 修复在处理标量关联子查询时未读取所需列的问题。修复了 #81716。#81805(Dmitry Novik)。
- 修复在查询仅使用常量别名列时的过滤分析问题。修复了 #79448。#82037(Dmitry Novik)。
- 修复在
WHERE条件中并使用IndexSet时,包含arrayJoin的查询出现Not found column错误的问题。#82113 (Nikolai Kochetov)。 - 修复当 CTE 定义引用另一个具有相同名称的表表达式时抛出的
TOO_DEEP_SUBQUERIES异常。#83413(Dmitry Novik)。 - 修复在启用查询条件缓存(设置
use_query_condition_cache)时,包含WHERE ... IN (<subquery>)子句的查询返回结果不正确的问题。 #83445 (LB7666)。 - 在某些边缘情况下,使用
UNION ALL的INSERT SELECT可能会导致空指针解引用。已修复 #83618。#83643(Alexey Milovidov)。 - 修复在对关联列进行行级策略表达式分析时出现的
LOGICAL_ERROR。#82618 (Dmitry Novik)。 - 修复了在查询条件缓存与递归 CTE 联合使用时产生错误结果的问题(issue #81506)。#84026(zhongyuankai)。
- 修复对无效
WINDOW定义进行无限递归分析的问题。修复 #83131。#84242(Dmitry Novik)。 - 修复在
additional_table_filters expression设置中使用IN (subquery)时出现的Not-ready Set问题。#85210 (Nikolai Kochetov). - 修复在启用
optimize_syntax_fuse_functions时出现的重复子查询逻辑错误,关闭 #75511。#83300(Vladimir Cherkasov)。
Iceberg 和数据湖修复
- 修复通过 REST catalog 查询 Iceberg 表时的元数据解析问题。... #80562 (Saurabh Kumar Ojha).
- 修复 Iceberg 中的数据竞争问题。#82088 (Azat Khuzhin).
- 修复 Iceberg 中出现 “Context has expired” 的问题。#82146 (Azat Khuzhin).
- 现在 ClickHouse 可以在模式演进之后,从 Glue catalog 读取 Iceberg 表。修复 #81272。#82301 (alesapin).
- 修复 Iceberg 中的数据竞争问题。#82841 (Azat Khuzhin).
- 为 Iceberg 数组元素和 Iceberg map 值(包括其所有嵌套子字段)禁用基于范围的文件剪枝。#83520 (Daniil Ivanik).
- 修复复杂类型的 Iceberg 写入问题。#85330 (scanhex12).
- 对复杂类型不再支持写入下界和上界(lower / upper bounds)。#85332 (scanhex12).
- 修复 Iceberg 中字段可空性的问题。#85977 (scanhex12).
- 不再创建空的 Iceberg 删除文件。#86061 (scanhex12).
- 在 Iceberg 写入过程中更新元数据时间戳。#85711 (scanhex12).
- 修复 Spark 无法读取位置删除文件(position delete files)的问题。#85762 (scanhex12).
- 不再从 manifest 文件中获取 schema,而是为每个快照单独存储其相关 schema。为每个数据文件从其对应的快照推断相关 schema。之前的行为违反了 Iceberg 规范中对 manifest 文件里 existing 状态条目的要求。#84588 (Daniil Ivanik).
- 现在 Iceberg 不再尝试在 SELECT 查询之间缓存相关快照版本,而是始终重新解析快照。之前尝试缓存 Iceberg 快照会在使用 Iceberg 表进行时间旅行时引发问题。#85038 (Daniil Ivanik).
- 修复通过 REST catalog 查询 Iceberg 表时的元数据解析问题。... #85531 (Saurabh Kumar Ojha).
- 修复 icebergS3Cluster 和 icebergAzureCluster 表函数中的机密信息掩码处理问题。#85658 (MikhailBurdukov).
DeltaLake 修复
- 修复在
DeltaLake存储中使用 delta-kernel 时的列裁剪问题。修复 #84543。#84745(Kseniia Sumarokova)。 - 在
DeltaLake存储中为 delta-kernel 刷新凭证。#84751(Kseniia Sumarokova)。 - 修复 delta-kernel 实现中的段错误。#85160(Kseniia Sumarokova)。
- 修复
DeltaLake引擎中 delta-kernel 实现中的竞争条件问题。#85221(Kseniia Sumarokova)。 - 修复在
DeltaLake引擎中禁用 delta-kernel 时读取分区数据的问题。该问题在 25.7 中引入(https://github.com/ClickHouse/ClickHouse/pull/81136)。[#85223](https://github.com/ClickHouse/ClickHouse/pull/85223)([Kseniia Sumarokova](https://github.com/kssenii))。 - 为了兼容性,将 25.5 之前版本中
allow_experimental_delta_kernel_rs的取值更改为false。#84587(Kseniia Sumarokova)。 - 修复在 Delta Lake 中从缓存读取计数值的问题。#85704(Kseniia Sumarokova)。
生存时间 (TTL) 和 MergeTree 修复
- 当生存时间 (TTL) 减少行数时,重新计算最小-最大索引,以确保依赖该索引的算法(例如
minmax_count_projection)的正确性。修复了 #77091。#77166(Amos Bird)。 - 修复在更新生存时间 (TTL) 时,
TTL GROUP BY中生存时间 (TTL) 重新计算不正确的问题。#81222(Evgeniy Ulasik)。 - 修复在合并期间,当在生存时间 (TTL) 表达式中使用字典时出现的 “Context has expired” 错误。#81690(Azat Khuzhin)。
- 修复在将同一列同时用于
TTL GROUP BY和 Set 的生存时间 (TTL) 时引发 LOGICAL_ERROR 及后续崩溃的问题。#82054(Pablo Marcos)。 - 当表中移除了所有生存时间 (TTL) 时,MergeTree 现在不会再执行任何与生存时间 (TTL) 相关的操作。#84441(alesapin)。
- 修复
ALTER MODIFY ORDER BY在排序键中未校验生存时间 (TTL) 列的问题。现在在ALTER操作的ORDER BY子句中使用生存时间 (TTL) 列会被正确拒绝,从而防止潜在的表损坏。#84536(xiaohuanlin)。
投影修复
- 修复在对投影进行物化时,当列类型被更改为 Nullable 所导致的逻辑错误。#80741 (Pavel Kruglov).
- 修复在
enable_shared_storage_snapshot_in_query = 1时,mergeTreeProjection表函数中父级元数据使用不正确的问题。此修复对应 #82634。#82638 (Amos Bird). - 修复一种罕见的 ClickHouse 崩溃问题:当表具有投影、
lightweight_mutation_projection_mode = 'rebuild',并且用户执行轻量级删除操作以删除表中任意数据块内的所有行时,会导致崩溃。#84158 (alesapin). - 修复在备份包含损坏投影的分区片段时出现的问题。#85362 (Antonio Andelic).
- 在功能稳定之前的各版本中,禁止在投影中使用
_part_offset列。#85372 (Sema Checherinda).
并行副本修复
- 对于某些使用并行副本执行的查询,发起节点上可能会应用按顺序读取优化,而远程节点上不会应用。这导致并行副本协调器(在发起节点上)与远程节点使用了不同的读取模式,从而产生逻辑错误。#80652(Igor Nikonov)。
- 当子查询包含
FINAL时禁用并行副本。#81401 #83455(zoomxi)。 - 修复在并行副本场景下,对包含多个 INNER JOIN 且后接 RIGHT JOIN 的查询抛出的
LOGICAL_ERROR。对于此类查询不要使用并行副本。#84299(Vladimir Cherkasov)。 - 使用反向按顺序读取优化的并行副本查询可能会产生不正确的结果。#85406(Igor Nikonov)。
认证和安全
- 修复在日志/query_log 中未能隐藏命名集合值的问题。修复 #82405。#82510(Kseniia Sumarokova)。
- 在从 AST 解析类型为 SCRAM_SHA256_PASSWORD 的认证数据时,为认证数据设置盐值(salt)。#82888(Tuan Pham Anh)。
- 对 Avro schema registry 的认证细节进行掩码处理,使其对用户以及在日志中不可见。#83713(János Benjamin Antal)。
- 修复执行
REVOKE S3 ON system.*时的错误行为,该命令会从*.*撤销 S3 权限。此问题修复了 #83417。#83420(pufit)。 - 修复当使用
no_password创建的用户在服务器设置allow_no_password被改为 0 之后尝试登录时导致服务器崩溃的问题。#84426(Shankar Iyer)。 - 改进在尝试创建使用 JWT 进行身份标识的用户时的错误信息。#85072(Konstantin Bogdanov)。
- 对
deltaLakeAzure、deltaLakeCluster、icebergS3Cluster和icebergAzureCluster的凭证进行掩码处理。#85889(Julian Maicher)。 - 修复在 #79963 中引入的一个 bug。向带有定义者(definer)的 materialized view 插入数据时,权限检查应使用定义者的授权。修复 #79951。#83502(pufit)。
备份和恢复修复
- 修复空
Memory表的备份问题,该问题会导致在恢复备份时失败并报出BACKUP_ENTRY_NOT_FOUND错误。 #82791 (Julia Kartseva). - 修复在只读磁盘上恢复备份时出现的误导性错误信息。 #83051 (Julia Kartseva).
- 修复在连接出现问题后会启动冗余内部备份的行为。 #84755 (Vitaly Baranov).
窗口与聚合函数
- 修复在合并过程中发生异常时,
Aggregator可能崩溃的问题。#81450 (Nikita Taranov)。 - 修复在合并过程中发生异常时,
Aggregator可能崩溃的问题。#82022 (Nikita Taranov)。 - 修复
arraySimilarity中的复制粘贴错误,不再允许使用 UInt32 和 Int32 权重。更新测试和文档。#82103 (Mikhail f. Shiryaev)。 - 修复在将
numericIndexedVectorPointwiseAdd、numericIndexedVectorPointwiseSubtract、numericIndexedVectorPointwiseMultiply、numericIndexedVectorPointwiseDivide函数应用于较大数值时发生的溢出问题。#82165 (Raufs Dunamalijevs)。
Parquet 和文件格式修复
- 修复 Parquet 布隆过滤器在处理类似
WHERE function(key) IN (...)的条件时,被错误地当作WHERE key IN (...)来应用的问题。 #81255 (Michael Kolupaev). - 修复 Parquet writer 为 Decimal 类型输出错误统计信息(最小值/最大值)的问题。 #83754 (Michael Kolupaev).
- 修复在元素为空时
groupArraySample/groupArrayLast的反序列化问题(如果输入为空,反序列化可能会跳过部分二进制数据,从而在读取数据时导致数据损坏,并在 TCP 协议中出现 UNKNOWN_PACKET_FROM_SERVER)。这不会影响数字和日期时间类型。 #82763 (Pedro Ferreira). - 修复在 RowBinary 格式中写入包含 NULL 值的 JSON 路径时的问题。 #83923 (Pavel Kruglov).
JOIN 修复
- 修复了对包含 JOIN 表达式、且与使用
Merge存储的表进行连接的查询的过滤条件修改问题。修复了 #82092。#82950(Dmitry Novik)。 - 修复了在将键值存储与经过类型转换的键进行 JOIN 时发生的崩溃问题。#82497(Pervakov Grigorii)。
- 修复了在包含多个 JOIN 的查询中解析匹配器时出现的逻辑错误,关闭 #81969。#82421(Vladimir Cherkasov)。
- 修复了在相等运算两侧操作数类型不同或引用常量时,将过滤条件合并到 JOIN 条件中的问题。修复了 #83432。#84145(Dmitry Novik)。
- 修复了在基于不等条件进行 JOIN、且一列为
LowCardinality而另一列为常量时出现的逻辑错误Expected single dictionary argument for function。关闭 #81779。#84019(Alexey Milovidov)。
Replicated 数据库修复
- 修复 DDLWorker 和 DatabaseReplicatedDDLWorker 中的 markReplicasActive。#81395(Tuan Pham Anh)。
- 修复
DatabaseReplicated::getClusterImpl。如果hosts的第一个(或前几个)元素具有id == DROPPED_MARK,且同一分片没有其他元素,则shards的第一个元素将是空向量,从而导致std::out_of_range。#82093(Miсhael Stetsyuk)。 - 跟踪异步表加载任务的数量。如果仍有任务在运行,则不要在
TransactionLog::removeOldEntries中更新tail_ptr。#82824(Tuan Pham Anh)。 - 修复这样一个问题:如果在创建 MergeTree 表时设置了
add_minmax_index_for_numeric_columns=1或add_minmax_index_for_string_columns=1,该索引随后会在 ALTER 操作期间被物化,从而阻止在新副本上正确初始化 Replicated 数据库。#83751(Nikolay Degterinsky)。 - 修复在删除 DEFINER 后,在 Replicated 数据库的新副本上创建 RMV 的问题。#85327(Nikolay Degterinsky)。
- 修复在移动元数据文件耗时较长时恢复 Replicated 数据库的问题。#85177(Tuan Pham Anh)。
- 在 Keeper 中恢复数据库元数据后,强制恢复 Replicated 数据库。#85960(Tuan Pham Anh)。
- 修复
Replicated数据库恢复中的一个问题:如果表名包含%符号,在恢复过程中可能会使用不同的名称重新创建该表。#85987(Alexander Tokmakov)。 - 现在 DDL worker 会从副本集合中清理过期的 hosts,从而减少在 ZooKeeper 中存储的元数据量。#88154(alesapin)。
轻量级更新修复
- 修复对使用
ReplacingMergeTree和CollapsingMergeTree引擎的表执行轻量级更新时的问题。#84851 (Anton Popov)。 - 修复在对表中所有列进行轻量级更新时出现的逻辑错误。#84380 (Anton Popov)。
- 修复对在版本低于 25.7 的服务器上创建且使用
ReplicatedMergeTree引擎的表执行轻量级更新时的问题。#84933 (Anton Popov)。 - 修复在运行
ALTER TABLE ... REPLACE PARTITION查询后,对使用非复制MergeTree引擎的表进行轻量级更新时的问题。#84941 (Anton Popov)。 - 修复
ReplicatedMergeTree中补丁分区片段的清理问题。先前,在轻量级更新之后,直到从另一个副本下载了实现这些补丁分区片段的已合并或已变更分区片段之前,更新结果可能在该副本上暂时不可见。#85121 (Anton Popov)。
S3 和对象存储修复
- 修复了在敏感信息掩码处理中 S3 表函数参数校验的问题,防止可能出现的
LOGICAL_ERROR,关闭 #80620。#82056(Vladimir Cherkasov)。 - 修复了在服务器处于内存压力时远程查询可能发生死锁的问题。#82160(Kirill)。
- 为 AWS ECS token 添加过期时间,以便可以重新加载。#82422(Konstantin Bogdanov)。
- 修复了外部表引擎中缓存缓冲区禁用边界对齐的功能。该问题由 https://github.com/ClickHouse/ClickHouse/pull/81868 引入。#82493(Kseniia Sumarokova)。
- 修复了 S3 客户端的
no_sign_request。它可用于显式避免对 S3 请求进行签名。也可以通过基于 endpoint 的设置为特定 endpoint 定义该选项。#83379(Antonio Andelic)。 - 在通过 s3Cluster() 执行 INSERT SELECT 写入 replicated MergeTree 时跳过不可用节点。#83676(Igor Nikonov)。
- 修复了 S3 请求速率降速的提前返回条件:当由于可重试错误导致所有线程被暂停时,只需
s3_slow_all_threads_after_network_error或backup_slow_all_threads_after_retryable_s3_error其中之一为 true 即可启用降速行为,而不再要求二者同时为 true。#85505(Julia Kartseva)。 - 修复了通过 Distributed 表或远程表函数从对象存储函数读取时出现的逻辑错误。修复:#84658、#85173、#52022。#85359(alesapin)。
- 修复了来自 S3Queue 的逻辑错误 “Table is already registered”。关闭 #84433。问题由 https://github.com/ClickHouse/ClickHouse/pull/83530 引入。#84677(Kseniia Sumarokova)。
- 修复了过大的设置值导致 S3Queue 表异常并使副本重启失败的问题。#86074(Nikolay Degterinsky)。
DynamicAndVariantTypeFixes
- 修复在解析失败时回滚 Dynamic 列的问题。#82169 (Pavel Kruglov)。
- 修复在 UNION 中使用 Variant 类型时可能发生的崩溃。#83295 (Pavel Kruglov)。
- 修复以惰性物化方式读取 Variant 列的问题。#84400 (Pavel Kruglov)。
- 读取现有表时,在执行 default/materialize 表达式期间不再验证实验性/可疑类型。#81618 (Pavel Kruglov)。
Keeper 修复
- Keeper 修复:在会话关闭时删除 ephemeral 节点时,正确更新 total watch 计数。#83583 (Antonio Andelic)。
- 修复对 Keeper 变更日志的乱序写入。此前,可能存在对变更日志的未完成写入,但回滚可能会导致目标文件被并发修改。这会导致日志不一致,并可能造成数据丢失。#84434 (Antonio Andelic)。
- 修复使用 RocksDB 存储的 Keeper 的泄漏问题(迭代器未被销毁)。#84523 (Azat Khuzhin)。
- 修复 Keeper 中将
rotate_log_storage_interval = 0设置为 0 会导致 ClickHouse 崩溃的问题(问题 #83975)。#84637 (George Larionov)。 - 修复 Keeper 返回的 total watches 计数错误的问题。#84890 (Antonio Andelic)。
- 在 RefreshTask 中从 'view' 获取 ZooKeeper 时加锁 'mutex'。#84699 (Tuan Pham Anh)。
索引修复
- 修复了在使用包含交替且首个分支为非字面量的正则表达式对 token/ngram 索引进行过滤时,过度跳过 granule 数据块的问题。#79373 (Eduard Karacharov).
use_skip_indexes_if_final_exact_mode设置的实现(在 25.6 中引入)在某些情况下,可能会根据MergeTree引擎设置或数据分布,未能选出合适的候选范围。该问题现已修复。#82667 (Shankar Iyer).use_skip_indexes_if_final_exact_mode设置的优化(在 25.6 中引入)在某些情况下,可能会根据MergeTree引擎设置或数据分布,未能选出合适的候选范围。该问题现已修复。#82879 (Shankar Iyer).- 之前,
set索引在检查 granule 是否通过过滤条件时,没有考虑Nullable列(问题 #75485)。#84305 (Elmi Ahmadov). - 在执行
MinMax索引评估时,与 NaN 值的比较未使用正确的范围。#84386 (Elmi Ahmadov). ngram和no_op分词器在处理空输入标记时,不再导致(实验性的)文本索引崩溃。#84849 (Robert Schulze).
Materialized view 修复
- 修复了一个表依赖关系中的 bug,该 bug 会导致 Materialized Views 漏掉部分 INSERT 查询。#82222(Nikolay Degterinsky)。
- 在 https://github.com/ClickHouse/ClickHouse/pull/79963 之后,Materialized Views 中对子列的使用出现问题,用户可能会收到错误
Not found column X in block。该问题已修复。修复了:#82784。#83221(Nikita Mikhaylov)。 - 修复了在 materialized view 中,不同类型导致出现
illegal_type_of_argument错误的问题。#85135(Sema Checherinda)。
Azure 和云存储修复
- 在 AzureBlobStorage 中,对于原生复制,我们会比较认证方式。如果在此过程中出现异常,已更新代码以回退为先读取再复制(即非原生复制)。#82693 (Smita Kulkarni)。
- 修复
AzureIteratorAsync中的 double-free 问题。#85064 (Nikita Taranov)。
崩溃和稳定性修复
- 修复在终止会话时,由于
user_id有时可能为空而在日志记录中发生的潜在崩溃。#82513 (Bharat Nallan). - 修复在异常的
INSERT之后连接保持断开状态而导致的客户端崩溃。#83253 (Azat Khuzhin). - 修复在计算包含空列的块大小时发生的崩溃。#83271 (Raúl Marín).
- 修复在启用 CPU 调度并在负载下执行,且设置为
max_threads=1的查询时可能发生的崩溃。#83387 (Fan Ziqi). - 将
zoutofmemory标记为硬件错误,否则会被视为逻辑错误。参见 https://github.com/clickhouse/clickhouse-core-incidents/issues/877。[#84420](https://github.com/ClickHouse/ClickHouse/pull/84420) (Han Fei). - 修复在
BackgroundSchedulePool关闭期间,由任务中线程 join 导致的可能进程中止,以及(在单元测试中)可能出现的挂起问题。#83769 (Azat Khuzhin). - 修复由后台取消检查线程导致的死锁。#84203 (Antonio Andelic).
- 修复在关闭期间,由于在库桥清理时对上下文进行递归加锁而导致的死锁。#83824 (Azat Khuzhin).
- 修复在异常的
INSERT之后连接保持断开状态而导致的客户端崩溃。#83842 (Azat Khuzhin). - 修复在发生
MEMORY_LIMIT_EXCEEDED时,String 反序列化过程中可能出现的未定义行为(崩溃)。#85440 (Azat Khuzhin). - 修复在异步插入中,当修改
log_comment或insert_deduplication_token设置时出现的罕见崩溃。#85540 (Anton Popov).
Glue 和目录修复
- 修复 Glue Catalog 集成中的 bug。现在 ClickHouse 可以读取具有嵌套数据类型、且某些子列包含小数的表,例如:
map<string, decimal(9, 2)>。修复 #81301。#82114(alesapin)。 - ClickHouse 现在可以读取 Glue Catalog 中其表类型以小写形式指定的表。#84316(alesapin)。
- Unity Catalog 现在在处理非 Delta 表时会忽略具有异常数据类型的 schema。修复 #85699。#85950(alesapin)。
函数修复
- 现在,函数
trim{Left,Right,Both}已支持类型为 "FixedString(N)" 的输入字符串。例如,SELECT trimBoth(toFixedString('abc', 3), 'ac')现在可以正常工作。#82691(Robert Schulze)。 - 当函数
trim以全常量参数调用时,现在会生成常量输出字符串(修复问题 #78796)。#82900(Robert Schulze)。 - 修复在格式化符
%f与可变长度格式化符(例如%M)一起使用时,函数formatDateTime输出不正确的问题。#83020(Robert Schulze)。 - 修复
CASE函数中NULL参数的错误。#82436(Yarik Briukhovetskyi)。 - 在
lowCardinalityKeys函数中不再使用共享字典中无关的部分。#83118(Alexey Milovidov)。 - 修复 colorSRGBToOKLCH/colorOKLCHToSRGB 在常量与非常量参数混合时的错误。#83906(Azat Khuzhin)。
- 修复在
array()函数中构造空元组不正确的问题,修复了 #84202。#84297(Amos Bird)。 - 修复导致 Bech32 编码和解码不正确的错误。该错误最初未被发现,是因为用于测试的一个在线算法实现也存在同样的问题。#84257(George Larionov)。
分布式查询修复
- 允许带有
LIMIT的并行分布式INSERT SELECT是不正确的,这会导致目标表中的数据重复。#84477 (Igor Nikonov). - 在存在
JOIN或子查询的情况下,不再尝试将表函数替换为其 cluster 版本。#84335 (Konstantin Bogdanov). - 新增检查:在分布式上下文中使用关联子查询时进行检测,以避免崩溃。修复 #82205。#85030 (Dmitry Novik).
- 使用
distributed_depth作为*Cluster函数的标识是不正确的,可能导致数据重复;现在改为使用client_info.collaborate_with_initiator。#85734 (Konstantin Bogdanov). - 为目标表为
Distributed的并行分布式INSERT SELECT增加对WITH子句中全局常量的支持。此前,该查询可能抛出Unknown expression identifier错误。#85811 (Nikolai Kochetov). - 修复在使用
DatabaseReplicated时尝试执行CREATE ... AS (SELECT * FROM s3Cluster(...))所导致的逻辑错误。#85904 (Konstantin Bogdanov). - 在对 Distributed 表执行 ALTER 时,添加对 sharding_key 的检查。此前,不正确的 ALTER 会破坏表定义并需要重启服务器。#86015 (Nikolay Degterinsky).
指标和监控修复
- 修复异步指标相关设置
asynchronous_metrics_update_period_s和asynchronous_heavy_metrics_update_period_s的校验。 #82310 (Bharat Nallan). - 修复
IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles指标(此前它们被计入未带Cache前缀的指标中)。 #83730 (Azat Khuzhin). - 修复 QueryMetricLog 中的
LOGICAL_ERROR:Mutex 不能为NULL。 #82979 (Pablo Marcos). - 修复
KafkaAssignedPartitions和KafkaConsumersWithAssignment指标不正确的问题。 #85494 (Ilya Golshtein). - 修复在使用
PREWHERE(显式或自动)时,处理字节统计值被低估的问题。 #85495 (Michael Kolupaev). - 修复后台调度池和执行器中的内存跟踪偏移问题。 #84946 (Azat Khuzhin).
数据类型和转换修复
- 修复了解析
Time时可能导致 msan 问题的情况。修复了:#82477、#82514(Yarik Briukhovetskyi)。 - 修复了在
LowCardinality(Float32|Float64|BFloat16)类型中对 NaN 值进行排序的问题。#83786(Pervakov Grigorii)。 - 修复了从
Date转换为DateTime64时,对于大于 2106-02-07 的值发生溢出的问题。#83982(Yarik Briukhovetskyi)。 - 修复了将负
Time值隐式读取到表中的问题,并使相关文档表述更加清晰,避免产生歧义。#83091(Yarik Briukhovetskyi)。 - 编解码器
DoubleDelta现在只能应用于数值类型的列。具体来说,FixedString列不再支持使用DoubleDelta进行压缩(修复 #80220)。#84383(Jimmy Aguilar Mena)。 - 修复了
JSONExtract在将 JSON 数字转换为 Decimal 类型时的精度损失问题。现在数值型 JSON 值会保留其精确的小数表示,从而避免浮点舍入误差。#85665(ssive7b)。
内存与资源管理
- 修复与
max_untracked_memory相关的不正确内存统计问题。#83607 (Azat Khuzhin). - 不在查询之间共享
async_read_counters。#83423 (Azat Khuzhin). - 修复在将文件缓存用作临时数据存储时可能出现的“文件缓存未初始化”错误。#83539 (Bharat Nallan).
- 始终应用
filesystem_prefetches_limit(而不仅仅是在MergeTreePrefetchedReadPool中)。#83999 (Azat Khuzhin).
配置和设置修复
- 通过 URI 传递配置参数时,会采用最后一个值。#82137 (Sema Checherinda).
- 修复了客户端中的数据竞争问题(通过不使用全局上下文)以及
session_timezone覆盖问题(之前如果在users.xml/客户端选项中将session_timezone设置为非空,而在查询上下文中设置为空,则会使用users.xml中的值,这是不正确的;现在查询上下文将始终优先于全局上下文)。#82444 (Azat Khuzhin). - 禁止将
threadpool_writer_pool_size设置为零,以确保服务器操作不会卡住。#82532 (Bharat Nallan). - 修复了设置
role_cache_expiration_time_seconds时配置中的轻微整数溢出问题(issue #83374)。#83461 (wushap). - 禁止
max_insert_block_size取零值,因为这可能会导致逻辑错误。#83688 (Bharat Nallan). - 修复了在
estimateCompressionRatio()中当block_size_bytes为 0 时出现的无限循环。#83704 (Azat Khuzhin). - 修复了在使用 multipart 的 HTTP 请求时,类似
date_time_input_format这样的参数会被忽略的问题。#85570 (Sema Checherinda).
MongoDB 修复
- 之前,
MongoDB表引擎定义可以在host:port参数中包含路径组件,但该组件会被静默忽略。MongoDB集成会拒绝加载此类表。在此次修复中,我们允许加载此类表并忽略路径组件,前提是MongoDB引擎具有 5 个参数,并使用参数中的数据库名称。注意: 此修复不适用于新创建的表、使用mongo表函数的查询,以及字典源和命名集合。#81942(Vladimir Cherkasov)。
杂项修复
- 在早期版本中,服务器对
/js请求返回了过多的内容。这修复了 #61890。#81895(Alexey Milovidov)。 - 修复
InterpreterInsertQuery::extendQueryLogElemImpl,在需要时为数据库和表名称加上反引号(例如,当名称包含-等特殊字符时)。 #81528 (Ilia Shvyrialkin). - 修复建议线程与主客户端线程之间可能存在的数据竞争。#82233 (Azat Khuzhin).
- 修复在重写
union/intersect/except_default_mode时的异常安全性问题。关闭 #82664。#82820(Alexey Milovidov)。 - 在使用非缓存型 Database 实现时,对应表的元数据会在返回列并使引用失效后被删除。#82939(buyval01)。
- JSONEachRowWithProgress 中的 onprogress 调用与最终化过程同步。 #83879 (Sema Checherinda).
- 修复了一个罕见的 bug:在执行
MATERIALIZE COLUMN查询时,可能会在checksums.txt中出现意外的文件记录,并最终导致数据部件被分离。 #84007 (alesapin). - 在周期性 parts 刷新过程中正确处理异常。#84083 (Azat Khuzhin).
- 修复布尔字面量的列名生成逻辑,将其改为使用 "true"/"false" 而不是 "1"/"0",从而避免在查询中布尔字面量与整数字面量之间发生列名冲突。 #84945 (xiaohuanlin)。
- 修复 Merge 表引擎中潜在的排序不准确问题。 #85025 (Xiaozhe Yu).
- 为 DiskEncrypted 补充缺失的 API 实现。 #85028 (Azat Khuzhin).
- 引入向后兼容性设置,使新的 analyzer 在发生名称冲突时可以在
WITH子句中引用外层别名。修复 #82700。#83797(Dmitry Novik)。 - 在启用 analyzer 时,允许在
remote表函数的view(...)参数中引用任意表。修复了 #78717。修复了 #79377。#83844(Dmitry Novik)。 - 修复在 MergeTree 中用于实验性事务的追加写入在使用
plain_rewritable/plain元数据类型时的问题,以前这些元数据类型会被直接忽略。 #83695 (Tuan Pham Anh). - 修正
IAccessStorage中 logger 的使用方式。 #84365 (Konstantin Bogdanov). - 修复在数据湖中基于虚拟列进行文件裁剪时的问题。 #84520 (Kseniia Sumarokova).
- 修复在查询存在延迟的远程数据源时可能导致向量越界访问的问题。#84820 (George Larionov).
- 在对象队列引擎中,将所有设置正确保存到表元数据中。 #84860 (Antonio Andelic).
- 修复在使用惰性列配合外部排序时出现的
CORRUPTED_DATA错误。#84738 (János Benjamin Antal)。 - 在执行
SYSTEM DROP REPLICA查询时,去除不必要的getStatus()调用。修复了在后台删除表时会抛出Shutdown for storage is called异常的问题。#85220(Nikolay Degterinsky)。 - 在
CREATE OR REPLACE和RENAME查询中添加缺失的表名长度检查。#85326 (Michael Kolupaev). - 修复在针对 JSON 执行
ALTER UPDATE时导致的崩溃和数据损坏问题。#85383 (Pavel Kruglov). - 修复在 CoalescingMergeTree 中处理大字符串时出现的段错误(segfault)。这解决了 #84582。#85709(scanhex12)。
- 在 #85105 中进行异步日志重构之后,修复 send_logs_source_regexp。#85797(Azat Khuzhin)。
- 修复在出现
MEMORY_LIMIT_EXCEEDED错误时,使用 update_field 的字典可能产生的潜在不一致性问题。 #85807 (Azat Khuzhin). - 修复由
url()表函数发起的 HTTP 请求,使其在访问非标准端口时,能够在 Host 头部中正确包含端口号。此更改解决了在使用运行于自定义端口上的 S3 兼容服务(例如开发环境中常见的 MinIO)时,使用预签名 URL 进行身份验证会失败的问题。(修复 #85898)。#85921(Tom Quist)。