向后不兼容的变更
- 将
date_time_input_format和cast_string_to_date_time_mode的默认值从basic改为best_effort。此前无法解析非 basic 日期时间字符串 (例如2024 April 4、Apr 15, 2020 10:30:00) 的查询,现在默认可能会成功。若要保持原先的严格解析行为,请将这些设置设为basic(或使用compatibility) 。#89334 (Alexey Milovidov). - 现在禁止将 Tuple 元素命名为
null,因为它会与 Nullable 的 null Map 使用的子列名称冲突,导致子列解析产生歧义。#98377 (Alexey Milovidov). - 新增设置
dynamic_disk_allow_from_env、dynamic_disk_allow_from_zk和dynamic_disk_allow_include,用于禁止在动态 disk 中使用from_env、from_zk和include。这是一项向后不兼容的变更,因为它默认禁止了此前默认允许的行为。#99138 (Kseniia Sumarokova). - 不能再使用已废弃的基于 Arrow 的 Parquet reader 和 writer,系统将改用原生实现。#100949 (Alexey Milovidov).
SHOW CREATE TABLE t现在会在同时存在名为t的永久表和 temporary table 且未指定 database 时,优先选择 temporary table,这与现有的DESCRIBE TABLE行为一致。此外,现已支持DESCRIBE TEMPORARY TABLE语法。#100966 (Alexey Milovidov).- 将默认的
http_max_fields从 1,000,000 降至 1,000,并将http_max_field_name_size从 128 KB 降至 4 KB,以限制 HTTP connections 在身份验证前的内存使用量。新增了http_max_request_header_size和http_headers_read_timeout设置。依赖先前较高限制的用户可通过设置将其恢复。#103285 (Sema Checherinda). - 为
system.metric_log新增了一个histograms嵌套列,用于在每一行中记录所有已注册 histogram metric 的快照,并新增system_metric_log_show_zero_values_in_histograms设置以控制是否输出零值。这意味着system.histogram_metric_log表已被弃用。#103770 (Miсhael Stetsyuk). - 现在,在未显式指定 time zone 的情况下,将
CAST转换为DateTime或DateTime64时,会保留源 argument 的 time zone (前提是源值为带显式 time zone 的DateTime/DateTime64) ,与toDateTime/toDateTime64函数的行为一致。关闭 #55072。#104433 (Alexey Milovidov). - 移除了
kqltable function。请使用SET dialect = 'kusto'以 KQL 方言运行查询。#105101 (Alexey Milovidov). - window functions
RANK和DENSE_RANK现在会拒绝 arguments,并抛出NUMBER_OF_ARGUMENTS_DOESNT_MATCH,以符合 SQL 标准。此前,诸如RANK(x) OVER (ORDER BY id)这样的查询会被静默接受,但其中的 argument 会被忽略。若要恢复先前较宽松的行为,请设置allow_rank_dense_rank_arguments = 1。关闭 #49526。#104324 (Groene AI).
新特性
- 新增设置
max_bytes_ratio_before_external_join,与max_bytes_ratio_before_external_group_by和max_bytes_ratio_before_external_sort相对应。它将哈希 JOIN 的落盘阈值表示为可用内存的一个比例;与绝对值max_bytes_before_external_join结合使用时,将采用两者中较小的阈值。#103862 (Alexey Milovidov) 。新的max_bytes_ratio_before_external_join设置现已默认启用,默认值为 0.5,与max_bytes_ratio_before_external_group_by和max_bytes_ratio_before_external_sort保持一致。哈希 JOIN 会在右侧数据超过可用系统内存一半时自动落盘到 grace hash join (在配置了内存限制时) 。#104285 (Alexey Milovidov) 。 - 新增表函数
filesystem。它可将目录结构表示为一张表,从而用 SQL 查询文件的元数据和内容。最初由 @perst20 在 #42039 中提出。参见 #42039。参见 #50208。#53610 (Alexey Milovidov) 。 - 允许将裸函数名传递给高阶函数,如
arrayMap、arrayFilter等。例如,arrayMap(negate, [1, 2, 3])现在等价于arrayMap(x -> negate(x), [1, 2, 3])。#101033 (Alexey Milovidov) 。 - 新增设置
send_table_structure_on_insert_with_inline_data和客户端选项--inline-insert-data,允许服务器通过原生协议自行解析内联 INSERT 数据,从而避免为了接收表结构而发生一次往返通信,并提升大量小批量插入的性能。#101034 (Alexey Milovidov) 。 - 新增
tokenizeQuery和highlightQuery函数,用于 SQL 查询的标记化和语法高亮。tokenizeQuery返回带有字节偏移和标记类型的词法分析标记;highlightQuery返回基于解析器的语法高亮范围及高亮类别 (keyword、identifier、function、number、string 等) 。#101054 (Alexey Milovidov) 。 - 新增
url_base设置,用于在url表函数和URL表引擎中解析相对 URL,并遵循 RFC 3986 语义。#101113 (Alexey Milovidov) 。 LIMIT BY子句现支持负值,以便从每个分组的末尾而非开头选取行。例如,LIMIT -2 BY id会返回每个id的最后两行。还支持负偏移量 (LIMIT -1 OFFSET -1 BY id) 以及混合符号 (LIMIT -2 OFFSET 1 BY id) 。#103222 (Nihal Z. Miaji) 。json_value函数现支持以tuple和array形式输出,以提升多个 JSON 查询的性能。#78362 (kevinyhzou) 。JSON_VALUE、JSON_EXISTS和JSON_QUERY现支持多路径Tuple/ArrayJSONPath 参数,由 @KevinyhZou 提供。#101102 (Alexey Milovidov) 。- 新增
kafka_autodetect_client_rack参数。设置后,会通过云平台能力探测可用区,并将其作为librdkafka的client.rack参数传递,以避免跨可用区通信。#81323 (Ilya Golshtein) 。 - 为
system.blob_storage_log新增Read事件类型,用于跟踪对象存储读取操作,由新设置enable_blob_storage_log_for_read_operations控制。#96867 (Alexey Milovidov) 。 - 现在,用户可以通过新的
system.zookeeper_watches表查看clickhouse-server发出的 ZooKeeper watches。#99277 (Den Kalantaevskii) 。 - 新增
Shardsprofile event,用于统计分布式查询中涉及的分片数量,并对所有表的结果求和。#99470 (Alexey Milovidov) 。 WASMUDF 现可声明为DETERMINISTIC,并可参与常量折叠。#100005 (Vasily Chekalkin) 。- 新增
parallel_replicas_prefer_local_replica设置:禁用时,并行副本将完全由负载均衡算法选择,因此即使max_parallel_replicas = 1的查询也可能被路由到另一台主机。#100139 (Alexey Milovidov) 。 - 新增
{disk,storage,http}_connections_rcvbuf和{disk,storage,http}_connections_sndbuf服务器设置,用于控制出站 HTTP 连接的 TCP socket buffer 大小,让运维人员能够覆盖内核 autotuning,并限制每个连接的内存使用量。#100478 (Sema Checherinda) 。 - 支持
CREATE OR REPLACE MATERIALIZED VIEW,其原子交换语义与CREATE OR REPLACE TABLE相同。适用于内部表、TO表、POPULATE、REFRESH和ON CLUSTER。#100539 (DQ) 。 - 新增
s3_read_request_duration_microseconds和s3_read_request_bytes直方图指标,用于观测 S3 GET 请求连接生命周期及消耗的字节数,可在system.histogram_metrics和 Prometheus 端点中查看。#102058 (Sema Checherinda) 。 - 新增
Paimon、PaimonS3、PaimonAzure、PaimonHDFS和PaimonLocal表引擎,支持基于 Keeper 快照进度跟踪的增量读取。增量模式仅返回自上一个已提交快照以来的新行。可通过paimon_target_snapshot_id执行定向快照增量读取,并通过max_consume_snapshots为每个查询设置快照上限。后台元数据刷新可通过paimon_metadata_refresh_interval_sec配置。该功能受allow_experimental_paimon_storage_engine控制。#102343 (XiaoBinMu) 。 - 新增 Kafka 表设置
kafka_map_virtual_columns_on_write。启用后,Kafka 表 schema 中名为_key、_timestamp、_headers.name和_headers.value的列会在INSERT时映射为对应的 Kafka 消息 key、timestamp 和 headers,并从消息负载中排除。#103243 (Alexey Milovidov) 。 - 为可刷新materialized view 新增了
SYSTEM PAUSE VIEW [db.]name和SYSTEM PAUSE VIEWS查询。与SYSTEM STOP VIEW不同,SYSTEM PAUSE VIEW不会中断当前正在进行的刷新——进行中的刷新会正常完成,只会阻止后续刷新。可通过SYSTEM START VIEW或SYSTEM START VIEWS恢复,这两个命令现在都会统一清除 stopped 和 paused 两种状态。#103252 (Nikita Mikhaylov). - 新增函数
regexpPosition(以及与 PostgreSQL 兼容的别名regexpInstr和regexp_instr) ,用于返回字符串中第 N 次 Regex 匹配的字节位置。支持起始偏移、匹配后返回模式、Regex 标志以及捕获组选择。#104172 (Abhinav Agarwal). - 新增用于质数判断的函数
isPrime和isProbablePrime。isPrime可对最大至UInt64的无符号整数返回精确结果。isProbablePrime还支持UInt128和UInt256;对于这些更宽的类型,0表示确定为合数,1表示可能为质数。isProbablePrime的可选第二个参数rounds用于控制置信度 (上限为256) ;默认25轮可将随机合数的假阳性率控制在10^-15以下,并且isProbablePrime支持取消。#104234 (Nihal Z. Miaji). #104639 (Alexey Milovidov). #104806 (Nihal Z. Miaji). clear和/clear现在会清空 clickhouse 命令行工具中的终端,而不再被误当作查询执行。#104318 (Tyler Hannan).- 允许
file表函数在SELECT查询中接受路径数组Array(String)。#104442 (Yue). - 向
system.functions表新增了deterministic和higher_order列。#104479 (Pedro Ferreira). - 为
bech32Encode新增可选的编码 Variant 参数 (bech32/bech32m) ,并为bech32Decode新增原始解码模式,用于非 SegWit 地址编码 (例如 Cosmos SDK、Injective、Osmosis) 。#98986 (Yash ). - 现在可以写入
AvroConfluent格式的数据,而它此前仅支持输入。这使得可以直接从 ClickHouse 生成带有 Confluent Schema Registry 帧的 Avro 消息,例如在写入 Kafka 时。schema 会自动注册到 registry。可使用新的output_format_avro_confluent_subject设置来指定 subject 名称。#101935 (János Benjamin Antal). - 新增
prettyPrintJSON函数,可将 JSON 字符串格式化为便于阅读的形式。适用于仪表盘或报告,因为此前这类美化通常需要在客户端额外处理一步。关闭了 #62523。#102594 (Dmitry Prokofyev). - 新增
STRING_AGG,作为groupConcat的不区分大小写别名,以兼容 PostgreSQL / SQL 标准。#105125 (Alexey Milovidov) 。 - 现在可以在特定子查询上使用
SETTINGS use_query_cache = true,从而单独缓存各个子查询的结果,而无需缓存整个外层查询。新设置query_cache_for_subqueries = true可将use_query_cache批量应用到所有子查询。注意:外层查询上的use_query_cache现在不再自动传播到子查询。#99804 (Vincent Voyer) 。 - 为 Web UI (
play.html) 中的查询编辑器新增了基于词法分析的语法高亮,颜色风格参照clickhouse-client。#105105 (Alexey Milovidov) 。
Experimental 功能
- 新增了一个 Experimental 的 Web 终端界面,位于
/webterminal,可通过 WebSocket 在浏览器中提供交互式clickhouse-client会话。默认禁用;可通过allow_experimental_webterminal服务器设置启用。可在这里查看。 #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov). Kafka2引擎 (Experimental,使用基于 Keeper 的 offset 存储) 现已支持直接SELECT查询以及kafka_commit_on_select设置。 #100276 (Alexey Milovidov).WASMUDFs 现在可强制转换更多数值类型:较小的整数可转换为更宽的整数 (例如Int8到UInt64) ,任意整数都可转换为浮点数 (例如Int32到Float32) 。 #100435 (Vasily Chekalkin).- 支持在
DELETE FROM system.webassembly_modules查询中使用LIKE函数。 #104397 (Vladimir Cherkasov). - 为
Iceberg增加了对 Geo 类型的支持。 #103113 (Konstantin Vedernikov). - 为 ArrowFlight SQL server 添加了预处理语句功能。 #103047 (Yakov Olkhovskiy).
- 通过在 KQL 解析器各阶段之间保留解析深度和回溯计数器,提升了 KQL 解析器 (用于支持 Kusto 语言) 的稳健性,从而能够对复杂 KQL 查询一致地跟踪解析器限制。 #103528 (Yakov Olkhovskiy).
性能提升
- 通过
file表函数或File表引擎读取本地 Parquet 文件时,可复用 Parquet 页脚元数据缓存。此前,该缓存仅会用于对象存储后端。#104260 (Alexey Milovidov) 。 - 当排序键只引用 join 保留侧的列时,可将
ORDER BY ... LIMIT n下推到LEFT/RIGHTjoin 之下,从而限制保留侧输入在连接前需要产出的行数。该行为由新设置query_plan_top_k_through_join控制 (默认启用) 。#104268 (Alexey Milovidov) 。 - 默认启用
use_top_k_dynamic_filtering和use_skip_indexes_for_top_k设置,以提升ORDER BY ... LIMIT N查询的性能。#99537 (Alexey Milovidov) 。默认将use_top_k_dynamic_filtering限制为仅适用于定长排序列,以避免在ORDER BY <var-length-column> LIMIT N查询中出现性能回退,因为逐行进行阈值比较的成本会超过节省的 I/O 开销。此前的行为仍可通过新设置use_top_k_dynamic_filtering_for_variable_length_types启用。#104216 (Alexey Milovidov) 。 - 使用
jemalloc的 oversize-arena 特性来减少缺页错误。#103958 (Nikita Taranov) 。 - 限制
UNION ALL中同时活跃的流,以降低峰值内存占用。#100176 (Alexey Milovidov) 。 - 对用户态页缓存进行了小幅优化。#100300 (Alexey Milovidov) 。现在,用户态页缓存始终优于 OS page cache。
- 通过用户态页缓存 (
use_page_cache_for_object_storage = 1) 读取对象存储中的冷数据时,现在速度显著提升,因为连续的缓存未命中会被合并为一次 HTTP 请求,而不是每个page_cache_block_size块发起一次请求。#104230 (Alexey Milovidov) 。 - 加快涉及类型转换和函数应用的索引分析。修复 #55653。#100366 (Alexey Milovidov) 。
- 加快在包含大量底层表的
Merge表上执行超大查询的速度。修复 #32465。#100369 (Alexey Milovidov) 。 - 从设置字段类型中移除 vtable,将
Settings的拷贝大小减少约 28 倍,并通过适用于所有设置类型的类型化数组布局提升缓存局部性。#102269 (Raúl Marín) 。 - 新增
max_threads_min_free_memory_per_thread和max_insert_threads_min_free_memory_per_thread设置,以便在服务器可用内存不足时自动降低查询并行度。#100383 (Alexey Milovidov) 。 - 降低低内存系统 (< 4 GiB) 上的内存占用。#100389 (Alexey Milovidov) 。
- 新增
OptimizeTrivialGroupByLimitPass。对于简单的SELECT ... FROM t GROUP BY k LIMIT n查询 (不含HAVING、ORDER BY或窗口函数) ,analyzer 现在会设置max_rows_to_group_by = n + offset和group_by_overflow_mode = 'any',因此 aggregation 会在产出n个不同键后停止,而不是对整个输入完成分组。由新设置optimize_trivial_group_by_limit_query控制 (默认启用) 。#104473 (Amos Bird) (Alexey Milovidov). - 为
_part_offset和_block_number虚拟列新增粒度级隐式 min-max 索引,也包括 projections。可基于虚拟列谓词快速对粒度进行 pruning。#103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko). - 对于
prealloc_serialized家族的 aggregation 方法,在批次序列化阶段预先计算每行的哈希,并将其用于:(a) 在emplaceKey/findKey中跳过重复哈希计算,以及 (b) 对下一行的 bucket 执行软件预取。通过隐藏哈希表缓存未命中延迟,加速多键字符串/序列化 aggregation。#104475 (Amos Bird) (Alexey Milovidov). - 为
Iceberg表新增查询条件缓存。#102115 (Konstantin Vedernikov). - 优化
cramersV、cramersVBiasCorrected、theilsU和contingency与窗口函数配合使用时的性能。关闭 #83521。#93384 (Nihal Z. Miaji). - 新增一项查询优化,将
tupleElement(dictGet('dict', ('a', 'b', 'c'), key), N)重写为dictGet('dict', 'a', key),避免拉取不必要的字典属性。由optimize_dictget_tuple_element设置控制 (默认启用) 。#100186 (Alexey Milovidov). - 为带排序的分布式查询,在发起端的排序步骤启用缓冲。#100661 (Nikita Taranov).
- 提升
partial_mergeJOIN 的性能。#100945 (Artem Zuikov). - 略微减少了
partial_mergeJOIN 中的内存过量分配。#100963 (Artem Zuikov). - 通过缓存 sampling settings 而不是遍历整个 memory-tracker 层级,优化分配/释放操作。#101267 (Azat Khuzhin).
- 通过预分配内部跟踪容器,降低 S3 分段上传期间的内存分配开销。#101799 (Gagan Dhakrey).
- 在 hash join 探测阶段添加软件预取,以降低大型哈希表的内存访问延迟,由设置
enable_software_prefetch_in_join控制。#102444 (Xiaozhe Yu). - 优化
MemoryTracker布局,性能提升约 25%。#103464 (Azat Khuzhin). - 在索引分析前重写
coalesce(a, b, ...) <op> const和ifNull(a, b) <op> const谓词,使每个参数对应列上的主键和跳过索引都能裁剪粒度。由新设置allow_key_condition_coalesce_rewrite控制 (默认开启) 。#103468 (Manuel). - 通过优化转义斜杠的处理,显著提升了读取带有大型 JSON 元数据文件的 Iceberg 目录时的查询性能。#103998 (Mohaidoss).
- 在缓存被禁用时,避免了索引未压缩缓存的额外开销 (server setting
index_uncompressed_cache_size = 0,默认即为此值) 。#104063 (Michael Kolupaev). - 修复了
ORDER BY ... LIMIT查询在搭配非选择性WHERE过滤器且 limit 较小时会读取过多粒度的问题。此前,按序读取之上的任何过滤器都会禁用按 mark range 拆分任务,因此管道无法在粒度之间取消,并会为每个 stream 读取整个分片。#104112 (Vladimir Cherkasov). - 修复了在重新调整 JOIN 两侧顺序后,未能复用 hash table 大小缓存的问题。#104131 (Nikita Taranov).
- 启用
fsync_after_insert后,现在会通过 IO thread pool 并行对分片文件执行 fsync,从而加快宽表上 insert 的收尾过程。完整的 ClickBenchhits载入速度提升约 22%。#104137 (Alexey Milovidov). - 在 AArch64 上使用 NEON 对
find_first_symbols、find_first_not_symbols、find_last_symbols_or_null、find_last_not_symbols_or_null和splitInto进行了向量化。此前这些 helpers 仅在 x86 (SSE2 / SSE4.2) 上有 SIMD 路径,在 ARM 上则会退回到标量循环。在 ClickBenchhits数据集上,TSV parsing 提速约 2 倍,URL functions 和splitByChar提速约 1.3 倍;而对于非常密集的 JSON parsing (字段间隔小于 16 字节) ,性能会略有下降,这与现有 SSE2 的权衡一致。#104228 (Alexey Milovidov). - 现在,通过简单
ALIAS列读取数据 (例如some_alias['key'],其中some_alias ALIAS m) 时,会走与直接引用底层列相同的按 subcolumn 读取路径,从而重新获得Map、Array、Tuple和Nullable别名列可带来的大量 I/O 节省。#104245 (Raúl Marín). - 通过将每个查询的
AsyncReadCounters改为无锁实现,降低了异步远程 FS 读取路径上的锁竞争。#104374 (Nikita Mikhaylov). - 小幅优化了 projections 按序扫描的查询计划。#103723 (Mikhail Artemenko).
- 扩展
optimizeUseNormalProjections,使其也能处理这样一种特定情况:虽然没有过滤掉任何内容,但 projection 的 sorting key 可以从查询计划中去掉排序步骤。#104680 (Mikhail Artemenko). - 允许
json.path[]语法糖和显式类型提示在带类型的JSON路径上正常工作。#99179 (Pavel Kruglov) 。 - 将
json.path[N].nested.path(会展开为tupleElement(tupleElement(json.path[N], 'nested'), 'path')) 优化为json.path[].nested.path[N],从而减少读取的数据量。#99802 (Pavel Kruglov) 。 - 通过将数据库级别的 grant 检查移出逐表循环,优化
system.parts中的SHOW TABLES访问检查。#100860 (Shaohua Wang) 。 - 移除
system.tables中SELECT name/SELECT database, name快速路径里冗余的逐表SHOW TABLES访问检查。#100881 (Shaohua Wang) 。 - 在 macOS 上启用 JIT 编译。#100947 (Alexey Milovidov) 。
- 当行策略仅依赖排序键列且具有确定性时,跳过在
FINAL之后延后应用该行策略;同时跳过该情况下由行策略强制触发的相应PREWHERE延后处理。#102884 (Yarik Briukhovetskyi) 。 - 新增支持将
hasAny和hasAll作为文本索引中的过滤谓词。#103266 (Anton Popov) 。 - 将长期存在的 MergeTree 堆状态 (每个 parts 和每张表的元数据) 分配到专用的 jemalloc arena 中,并通过
jemalloc.mergetree_arena.*异步指标对外暴露。这样可以减少稳定运行状态下默认 arena 的碎片化,并避免每个 parts 中长期存活的对象占住原本可衰减回收的页。#104136 (Raúl Marín) 。 - 改进高负载下 ZooKeeper 客户端的超时处理,适用于单个会话上有大量请求以管道化方式发送的场景。ZooKeeper 客户端现在使用基于进度的超时机制:只要在
session_timeout_ms内从服务端收到任何数据,就会延长等待时间。每个请求仍受3 * session_timeout_ms的硬上限约束,以限制调用方延迟。关闭 #100466。#104351 (Antonio Andelic) 。 - 将每个事件的 trace 标志移到单独的数组中,并按需延迟分配,从而降低
ProfileEventstracing 的开销。#105030 (Azat Khuzhin) 。 - 为
ColumnDecimal添加compareTrackAt,提升Decimal列的比较性能。#105110 (Artem Zuikov) 。 - 新增
MD5的 SIMD 实现 (AVX2/AVX512) ,可并行计算多个输入的哈希,从而提升吞吐量。#105161 (Joanna Hulboj) 。
改进
- 改进了所有 ClickHouse 应用程序的帮助输出:
--help现在会稳定返回退出码0、输出到stdout,并且顶层clickhouse --help会列出所有子命令。为clickhouse start/restart新增了--no-sudo选项 (在 Docker 中很有用) ,以及clickhouse help子命令。这是来自 @qoega 的 #58244 的后续工作。#98148 (Alexey Milovidov) 。 input_format_column_name_matching_mode的默认值已从match_case更改为auto。对于会将输入列名与表 schema 进行匹配的输入格式 (JSONEachRow、CSVWithNames、JSONColumns、BSONEachRow、RowBinaryWithNames等) ,现在会先尝试区分大小写匹配;如果未匹配到,再回退为不区分大小写匹配。此前的严格行为会在compatibility模式下保留。#104320 (Alexey Milovidov) 。- 新增
STDDEV,作为stddevSamp的不区分大小写别名,以兼容 PostgreSQL/SQL 标准。#105120 (Alexey Milovidov) 。 - 新增
array_to_string,作为arrayStringConcat的不区分大小写别名,以兼容 PostgreSQL。#105121 (Alexey Milovidov) 。 - 新增
unnest,作为arrayJoin的不区分大小写别名,以兼容 PostgreSQL (函数调用形式) 。#105124 (Alexey Milovidov) 。 clickhouse-client中的进度条现在会在 RAM 旁显示磁盘临时数据的使用情况 (例如外部排序、aggregation 或 JOIN) ,其中还包括分布式查询按 host 细分的信息。#105190 (Alexey Milovidov) 。- 新增
system.predicate_statistics_log,这是一个新的采样日志,用于记录每个查询的 predicate 过滤器选择性,以及 MergeTree 索引粒度剪枝。默认禁用;可通过predicate_statistics_sample_rateserver setting 启用。这是自动索引和 projection 推荐所必需的。#98727 (Yarik Briukhovetskyi) 。 - 启用
skip_unavailable_shards时,如果本地 shard 缺少表,则允许跳过该 shard。#100141 (Alexey Milovidov) 。 - 当 Linux mdraid 阵列正在重新同步或处于降级状态时,会添加启动警告 (可在
system.warnings中查看) ,因为这两种情况都可能影响磁盘 I/O 性能,或表明磁盘存在故障。#100941 (Alexey Milovidov) 。 - WASM UDFs 现在会显示在
system.functions中,并且其origin(WasmUserDefined) 、syntax、arguments和returned_value列会根据其 ClickHouse 类型元数据正确填充。此前它们要么缺失,要么因origin错误而作为重复项列出。#101053 (Vasily Chekalkin) 。 generate_seriestable function 现在支持使用负 step 值生成降序 sequence,例如SELECT * FROM generate_series(99, 0, -1)。#101056 (Alexey Milovidov) 。- 修复某些函数 (
dotProduct、formatRow、structureToCapnProtoSchema/structureToProtobufSchema、用户自定义函数) 在DEFAULT/MATERIALIZED表达式、表引擎设置等延迟执行路径中使用时抛出的Context has expired异常:在需要时确保这些函数持有强引用的上下文。#101109 (Alexey Milovidov). - 修复对零限制创建的优先级误报
Cache limits violated逻辑错误的问题 (例如启用enable_filesystem_query_cache_limit时按查询划分的文件系统缓存优先级) 。#101428 (Alexey Milovidov). - 为
s3express端点自动检测区域。#101520 (Pradeep Chhetri). - 支持在向
Iceberg写入时为数据文件指定字段 ID。关闭 #102322。#102362 (Konstantin Vedernikov). - web UI (
play.html) 中的左侧面板现在支持独立滚动,页面滚动时仍保持可见,并且点击某个表后会滚动到查询区域。#102498 (Alexey Milovidov). - 现在可以通过 Ctrl/Cmd/Shift+单击或鼠标中键单击左侧面板中的 ClickHouse 徽标,在新选项卡中打开 Play UI。#102501 (Alexey Milovidov).
- 新增指标,用于跟踪所有表中投影主键和投影索引粒度占用的内存。#102587 (Narasimha Pakeer).
- 将
max_network_bandwidth_for_user和max_network_bandwidth_for_all_users应用于远程文件系统的读写。#103080 (Azat Khuzhin). - 在 Refreshable Materialized Views 持续刷新的情况下,基于快照中表的状态而非全局状态进行决策,从而提升备份的健壮性。#103384 (Nikita Mikhaylov).
SELECT * FROM system.databases现在无论show_data_lake_catalogs_in_system_tables设置如何,都会始终列出数据湖 catalog 数据库。此前默认会隐藏它们,这与始终显示它们的SHOW DATABASES不一致。#103444 (Alsu Giliazova).- 使代码中的服务器设置
concurrent_threads_soft_limit_ratio_to_cores默认值与随附config.xml中的值 (2) 保持一致,因此即使未使用随附的config.xml,默认的max_min_fair并发线程调度器也会开箱即用地将查询处理线程限制为 CPU 核心数的 2 倍。#103446 (Alexey Milovidov). - 提升解析器和字符串函数在边界情况的 sanitizer 稳健性:在
getURLScheme中处理空输入;在Lexer::nextToken的max_query_size检查中避免空指针算术运算;以及在解码前对空 haystack 的 UTF-8 子序列评估进行短路处理。#103489 (Yakov Olkhovskiy). - 改进了对
divide(0, x)和intDiv(0, x)的单调性推断准确性:此前这些函数会被无条件视为单调,但0 / x在任何包含 0 的范围内都是非单调的,因为0 / 0未定义 (对divide而言会得到NaN/Inf,对intDiv而言则会抛出除零异常) 。这一错误判断会导致KeyCondition::applyMonotonicFunctionsChainToRange生成left > right的范围;当主键上的IN/NOT IN表达式将键包裹为divide(0, key)或intDiv(0, key)时,会在调试构建中触发LOGICAL_ERRORInvalid binary search result in MergeTreeSetIndex。发布构建不受影响——该断言受#ifndef NDEBUG控制。#103621 (Groene AI). - 将
HTTPConnectionPool*TCP{Rcv,Snd}BufBytes_{p50,p75,p90,p95}异步指标替换为system.histogram_metrics中基于 bucket 的直方图http_pool_tcp_buf_bytes(标记为group、direction) 。各组的异步指标总量仍予以保留。#103704 (Sema Checherinda). system.server_settings现会将服务器设置{disk,storage,http}_connections_{rcvbuf,sndbuf}标记为可在无需重启的情况下修改。其值可通过SYSTEM RELOAD CONFIG更新;运行时生效路径自 #100478 起就已具备。#103772 (Sema Checherinda).- 在
flameGraph中新增对已解析符号 (Array(String)) 的支持。#103816 (Azat Khuzhin). - CLI 客户端现在可以在其配置中指定
<rainbow_parentheses>false</rainbow_parentheses>,用于终端颜色与括号显示冲突的环境 (类似地,clickhouse format现在也支持--no_rainbow_parentheses) 。#103851 (Larry Snizek). - 修复了
MultiVolnitsky的 UTF-8 不区分大小写搜索:在失败时回滚部分putNGram插入,并将失败的 needles 切换为 fallback searcher,从而避免状态不一致。#103864 (Yakov Olkhovskiy). - 在与 glibc 兼容的 musl 中,通过
rseqTLS 实现sched_getcpu。#104016 (Azat Khuzhin). - APPEND 模式下的 Replicated 可刷新materialized view 在刷新期间如果与 ZooKeeper 的连接短暂中断,将不再发生重复刷新两次的问题。#104051 (Michael Kolupaev).
- 允许未显式指定列列表的分布式表根据推断出的远程表结构来校验分片键。#104111 (Yue).
- 修复带有
Azureabfss路径的 REST catalog。#104120 (Konstantin Vedernikov). - 在 Keeper S3 snapshot client 中支持
role_arn和role_session_name身份验证设置,使 snapshot 上传能够使用基于 STSAssumeRole的身份验证。#104140 (Alexey Milovidov). - 修复了运行带有
MATERIALIZEDCTE 的查询时出现的内存泄漏问题。#104153 (Alexey Milovidov). - 修复了
lowerUTF8/upperUTF8在处理大型非 ASCII 数据集时 (例如构建文本索引期间) 抛出异常的问题:当累计输出缓冲区超过 2 GiB 时会出错;现在会以明确的错误信息拒绝超长单行。#104229 (Shaohua Wang). - 增强了 MergeTree 列统计信息加载在瞬时 I/O 故障下的健壮性,避免受影响的 parts 永久禁用基于统计信息的优化。#104372 (zoomxi).
INSERT INTO ... SELECT FROM input(...)不再需要CREATE TEMPORARY TABLEgrant。#104470 (Alexey Milovidov).- 新增 MergeTree setting
concurrent_part_removal_threshold_for_remote_disk(默认值为16) :当待删除的 parts 中至少有一个存储在远程 disk 上时,将使用该设置替代concurrent_part_removal_threshold。此前的阈值100可能导致对象存储后端上的DROP TABLE及其他 part 删除操作卡顿数十秒,因为即使每次删除都是一次独立的网络往返,这些删除仍会串行执行。新 setting 会让远程存储更早进入并行删除路径,同时保持本地 disk 的行为不变。#104676 (Groene AI). - 新 setting
defer_partition_pruning_after_final(默认值为1) 使 26.3 中引入的在FINAL下跳过 partition pruning 的行为变为可选择退出。将其设为0可恢复 26.3 之前的 partition pruning——对于相同 PK 的行不会跨分区的事件日志 workload,速度会明显更快。compatibility = '26.2'会自动将其切换为0。#104705 (Nikita Fomichev). - 修复了
intExp2对超出范围的输入返回错误结果的问题 (包括 JIT 下>= 64的移位,以及两条代码路径中绝对值超过INT_MAX的整数) 。#105054 (Raúl Marín). - 在
clickhouse install和clickhouse git-import中,为基于 CLI 选项和解析后输入构建的 shell arguments 添加引号,从而能够正确处理包含空白字符或 shell 元字符的路径、用户/组名称以及 commit 哈希。#105232 (Raúl Marín). Aliastable engine 现已不再属于 Experimental,无需allow_experimental_alias_table_enginesetting 即可使用。#103488 (Alexey Milovidov).- 为
clickhouse-benchmark添加了--queries-format选项,可在默认的制表符转义、每行一条查询的输入格式 (tsv) 与将标准输入解析为由;分隔的多查询脚本 (script) 之间进行选择。#99972 (Aleksandr Musorin). - 逐元素的 Tuple operators
tuplePlus、tupleMinus、tupleMultiply、tupleDivide、tupleModulo、tupleIntDiv和tupleIntDivOrZero现在支持可变参数,可接受两个或更多大小相同的 tuples,并以左折叠方式逐元素应用。此前它们只能接受恰好两个参数。#104659 (Aruj Bansal). - 在
/processors-profile新增了一个内置 Web UI,可将任意历史SELECT查询的管道以热力图形式可视化,数据来自system.query_log和system.processors_profile_log。每个处理器都会根据其elapsed_us着色,并在悬停时显示该处理器的统计信息 (行数、字节数、等待时间) 。#104614 (Nikita Mikhaylov). - 设置
query_plan_use_logical_join_step(及其别名query_plan_use_new_logical_join_step) 现已废弃且不再生效;现在始终使用逻辑 join 步骤。#104017 (Vladimir Cherkasov). play.html以及其他内置网页 (dashboard.html、jemalloc.html、merges.html、binary.html、webterminal.html) 中的user输入框不再预填字面文本default。现在会显示user占位提示,且默认留空。留空时,页面不会发送user=URL 参数 (WebTerminal 的认证 JSON 也会省略user字段) ,因此服务器会按其常规回退逻辑使用default用户——而且通过其他渠道提供的 HTTP 凭据 (X-ClickHouse-User、HTTP Basic、每个 handler 的<handler><user>configuration) 也不再会被覆盖。#105254 (Alexey Milovidov).ORCreader:将基于偏移量的读取 (readBigAt) 与use_prefetch解耦,因此HDFS上经过 EC 编码的数据即使在use_prefetch = false时 (例如由 Gluten 设置) 也能被正确读取。#103348 (zhanglistar).- 现在,从
play.html以CSVWithNames格式下载的文件会使用.csv文件扩展名。#103737 (JackFielding). - 为 BigLake catalog 增加了更多输入校验。#105117 (Konstantin Vedernikov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 通过记住表达式是否带括号,修复格式不一致的问题。#92340 (Alexey Milovidov).
- 修复
Decimal与 Float 类型之间无法准确比较的问题。#94293 (zoomxi). - 允许在分布式查询中使用位置参数。#94359 (simonmichal).
- 修复删除并重新创建同名 materialized view 时,
DatabaseCatalog::updateDependencies中出现的断言失败;同时修复在引用依赖为空时,RENAME TABLE或EXCHANGE TABLES过程中视图依赖被静默丢失的问题。#98779 (Alexey Milovidov). - 修复一个服务器中止问题 (
DatabaseCatalog::getTableImpl中的断言失败) :当通过ON CLUSTER创建表,且其 UUID 与现有数据库的 UUID 相同时,会触发该问题。#98861 (xiaohuanlin). - 修复启用设置
use_skip_indexes_on_data_read时,数据读取阶段使用跳过索引以及处理由轻量级更新创建的现有补丁分区片段时的问题。#99543 (Alexey Milovidov). - 修复当查询优化器将带有
IN (subquery)的过滤器下推到 PREWHERE 时出现的 “Not-ready Set” 异常。#100375 (Alexey Milovidov). - 修复在单条
ALTER TABLE语句中同时使用ADD COLUMN和RENAME COLUMN时出现的 “Cannot find column” 错误。#100387 (Alexey Milovidov). - 修复视图在混合使用
UNION和INTERSECT/EXCEPT运算符时,于DETACH/ATTACH或服务器重启后返回错误结果的问题。#100390 (Alexey Milovidov). - 修复在 IN 子句中出现关联子查询时,使用 AST fuzzer 进行压力测试期间可能发生的 “Trying to execute PLACEHOLDER action” 异常。#100398 (Alexey Milovidov).
- 修复向按
year、month或daytransform 分区、且包含Date列的 Iceberg table 插入数据时出现的 logical error 异常。#100404 (Alexey Milovidov). - 修复在
ALTER TABLE MODIFY COLUMN更改列类型后,跳过索引仍用于不兼容数据的问题,这可能导致 sanitizer 构建中的服务器崩溃或查询结果错误。#100526 (Alexey Milovidov). - 修复
paimonCluster、paimonS3Cluster、paimonAzureCluster和deltaLakeS3table function 在query_log中泄露凭据的问题。#100529 (JIaQi Tang). - 修复 Kafka 引擎表执行
DROP TABLE时,因rd_kafka_consumer_close中的死锁而可能无限期挂起的问题。#100604 (Alexey Milovidov). - 将硬编码的
source_table_engines列表替换为通过StorageFactory和DatabaseFactory在 runtime 中查找。为DatabaseFactory::EngineFeatures添加source_access_type,使使用源引擎 (PostgreSQL、MySQL、S3 等) 的CREATE DATABASE与CREATE TABLE一样需要相同的源授权。修复了在table_engines_require_grant=false时GRANT TABLE ENGINE ON *执行失败的问题。关闭 #71544。#100746 (pufit). - 修复了读取某些表时可能发生的 server crash:这些表的
ALIAS列中包含嵌套在函数调用内的关联子查询 (例如ALIAS toString(intDivOrZero(x, (SELECT ...)))) 。现在,CREATE TABLE和ALTER TABLE会以THERE_IS_NO_DEFAULT_VALUE拒绝出现在DEFAULT/ALIAS/MATERIALIZED列表达式中、任意嵌套深度的任何子查询。此前,浅层校验会放过嵌套子查询,因此关联场景会在读取时崩溃,而嵌套的非关联场景虽然看似可用,却可能导致异常行为;现在这两类情况都会在 DDL 阶段被拒绝。#100753 (Groene AI). - 修复了一个 server crash (
Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode) :当对带有CONSTRAINT ... ASSUME定义的表执行包含关联子查询的查询,且启用了optimize_substitute_columns和convert_query_to_cnfsettings 时,可能会触发该问题。#100756 (Groene AI). - 修复了向 JSON column 插入一行时可能出现的异常:该行在引入新动态字段的同时,还为某个类型化字段提供了不兼容的值,并且该列随后被用作 GROUP BY 键。#100758 (Jimmy Aguilar Mena).
- 修复了通过
DiskObjectStorageTransaction路径进行的 S3/对象存储写入会被静默绕过 workload IO scheduling 的问题 (该路径用于s3_with_keeperdisks,以及在use_fake_transaction=false时显式使用) 。此前,向这类 disk 上的 MergeTree tables 执行 INSERT 写入时,会忽略CREATE RESOURCE/CREATE WORKLOADthrottling,因为事务性写入路径从未将资源链接注入WriteSettings。#100777 (JIaQi Tang). - 修复了
Protobuf与ProtobufList共用 schema-cache 时的冲突问题:先以FORMAT Protobuf读取消息,再以FORMAT ProtobufList读取时可能失败,因为ProtobufList会强制将缓存的 schema 转换为其 envelope 形式。现在,当没有可用的 envelope schema 时,ProtobufList会回退到缓存的消息类型。#100849 (Callum Cooper). - 修复了 Rust CXX bridge 中因
std::exceptionABI 不匹配导致的 heap-buffer-overflow。#100931 (Azat Khuzhin). FunctionVariantAdaptor现在会在所有Variant备选类型都与函数不兼容时抛出ILLEGAL_TYPE_OF_ARGUMENT,而不是静默返回Nullable(Nothing)。此前,如果没有任何备选类型兼容,WHERE function(variant_col)predicate 会在不报错的情况下返回 0 行,而等效的SELECT上下文则已经会正确抛出错误。#100939 (Vasily Chekalkin).- 当 database 中包含视图时,
TRUNCATE ALL TABLES不再失败。#100943 (Alexey Milovidov). - 修复
optimize_rewrite_array_exists_to_has优化,使其能够正确处理类型不兼容的情况 (如 Date 与 String) ,并默认重新启用该优化。#100944 (Alexey Milovidov). - 修复 S3 设置优先级:
storage_configuration的磁盘设置现在会覆盖全局<s3>部分,而用户/profile/查询级别的设置会覆盖前两者。#100975 (Alexey Milovidov). - 修复 BFloat16、Float32 和 Float64 列在稀疏序列化过程中丢失负零 (-0.0) 符号的问题。#100983 (Takumi Hara).
- 修复读取 WKT 编码的 GeoParquet 和 Arrow 文件时所用 WKT 几何解析器中的两个 bug:
MULTILINESTRING几何对象此前会被错误解析为Polygon(导致类型化列抛出异常,并使混合Geometry列发生静默数据损坏) ;此外,不包含类型关键字的格式错误 WKT 字符串此前会触发未定义行为,而不是返回明确的错误。#100997 (Vasily Chekalkin). - 修复单个 shard 上分布式表的
grouping/GROUPING SETS查询失败,并报错 “Method executeImpl is not supported for ‘grouping’ function” 的问题。#101030 (Alexey Milovidov). - 修复 planner 中的
LOGICAL_ERROR“Column identifier is already registered”,该问题可能在同一个表表达式被多次处理时出现。#101048 (Alexey Milovidov). - 修复在
additional_result_filter设置与 UNION 或 EXCEPT 查询一起使用时出现的 LOGICAL_ERROR 异常 “Column identifier is already registered”。#101051 (Alexey Milovidov). - 修复将
* APPLY与 aggregate functions 以及group_by_use_nulls=1配合 GROUPING SETS、ROLLUP 或 CUBE 使用时发生的 server crash (Logical error: Bad cast from ColumnVector to ColumnNullable) 。#101062 (Groene AI). - 修复当
input_format_csv_skip_first_lines或input_format_tsv_skip_first_lines超过文件总行数时出现的无限循环问题。#101111 (Alexey Milovidov). - 修复 lazy materialization optimization 中的越界访问问题,该问题可能会在调试构建中导致异常。#101144 (Alexey Milovidov).
- 修复递归 CTE 中的 type inference:现在会通过
getLeastSupertype在UNION ALL的非递归部分和递归部分之间迭代扩展列类型,直到收敛,从而避免x + 1这类表达式中的整数 overflow。#101155 (Alexey Milovidov). - 将 MergeTree 压缩块大小设置 (max_compress_block_size、min_compress_block_size、marks_compress_block_size、primary_key_compress_block_size) 限制为 256 MiB,以防止通过 CREATE TABLE SETTINGS 设置极端值时发生 server crash。#101159 (Groene AI).
- 修复当 ROW POLICY 在其
USINGclause 中使用标量子查询 (例如USING (SELECT 1)) 时,QueryAnalyzer::resolve()发生的 LOGICAL_ERROR 崩溃。关闭 #100695。#101263 (Groene AI) 。 - 修复
MergeTreeDataPartWriterCompact::cancel在流分配失败时的未定义行为。#101292 (Alexey Milovidov) 。 - 修复 ALTER 语句中赋值时未包含时区的情况。关闭 #101328。相关:https://github.com/ClickHouse/ClickHouse/pull/100647。[#101403](https://github.com/ClickHouse/ClickHouse/pull/101403) (Yarik Briukhovetskyi) 。
- 修复当 SELECT 管道产生多个流时,带有 ORDER BY ALL 的 INSERT SELECT 查询会导致服务器崩溃 (LOGICAL_ERROR) 。#101443 (Groene AI) 。
- 修复因 join 重排序将 INNER JOIN 过滤器 (仅引用 outer join 的保留侧) 推入 outer join 的 ON 子句而导致的错误查询结果。#101504 (Vladimir Cherkasov) 。
- 对包含 arrayJoin 的执行计划跳过应用 lazy materialization,否则可能导致 LIMIT 未生效。关闭 #101608。#101644 (Vladimir Cherkasov) 。
- 修复
mergeFilterIntoJoinCondition优化在静默丢弃类型不匹配的 WHERE 等值条件时,导致 JOIN 查询结果错误的问题。#101652 (Xiaozhe Yu) 。 - 修复
error测试提示对 syntax/parsing error 不生效的问题——此前,对于格式错误的查询,使用-- { error SYNTAX_ERROR }会报出 “Expected server error”,而不是匹配客户端 parse error。#101675 (Groene AI) 。 - 修复
INTO OUTFILE ... TRUNCATE实际并未使用原子重命名的问题——数据会直接写入原始文件,而不是临时文件,因此查询失败时原有内容会被破坏。现在数据会先写入临时文件,只有成功后才会重命名。#101884 (Pablo Marcos) 。 - 修复读取 schema 包含 varchar(n) 或 char(n) 列类型的 Delta Lake 表时出现的异常
Unsupported DeltaLake type: varchar(n)。这些类型现在会映射为 String,这与 Delta Lake 协议在 Parquet 中将其存储为普通字节数组的方式一致。#101973 (Flavio Malavazi) 。 - 修复从 S3 读取 tar 归档且
schema_inference_mode=union并包含异构 Parquet schema 时发生的静默数据丢失问题——Parquet 元数据缓存错误地将第一个文件的元数据复用于归档中的后续所有文件。#101990 (Ahaan Limaye) 。 - 修复在同一服务器生命周期内,如果某个 Iceberg 表此前未执行过 SELECT 或 INSERT,则对其执行 ALTER TABLE UPDATE/DELETE 会导致服务器崩溃 (LOGICAL_ERROR) 的问题。#102113 (Alexey Milovidov) 。
- 修复了在内存数据库中的表 (例如临时表) 上执行 ALTER 查询时可能发生崩溃的问题。#102360 (Den Kalantaevskii).
- 修复了
formatQuery在格式化同一 source 上向后兼容的 READ/WRITE 授权时,会生成重复授权 (如GRANT FILE ON *.*, FILE ON *.* TO x) 而非GRANT FILE ON *.* TO x的问题。#102411 (Groene AI). - 修复了当
max_streams_to_max_threads_ratio大于 1 时,read-in-order 查询后的聚合失去并行性的问题。#102467 (Alexey Milovidov). - 修复了从 Buffer 表引擎中选择子列 (例如 Nullable 的
.null、Array 的.size0、Tuple 元素或 map 键/值) 时发生的崩溃问题 (LOGICAL_ERROR: Unknown virtual column) 。#102470 (Groene AI). - 修复了在 join 重排优化中,当带有
join_use_nulls的 LEFT/RIGHT JOIN 与其他涉及两个以上表的 JOIN 组合时出现的异常 “Cannot fold actions for projection”。#102516 (Alexey Milovidov). - 修复了 numericIndexedVector 上标量按元素操作 (例如
numericIndexedVectorPointwiseAdd) 在标量超出范围时的静默溢出问题。现在这类输入会抛出INCORRECT_DATA,而不是返回损坏的值。#102546 (FriendLey). - 修复了带有 SAMPLE 和查询级 OFFSET 的 INSERT 语句 AST 格式不一致的问题。关闭 #102523。#102547 (zoomxi).
- 修复了
groupConcat在反序列化格式错误的 aggregate function 状态时触发LOGICAL_ERROR异常的问题。#102558 (Christoph Wurm). - 现在,当
input_format_csv_use_default_on_bad_values=0时,不再接受 Time64 CSV 值末尾的垃圾内容。关闭 #102490。#102596 (Yarik Briukhovetskyi). - 修复了向具有 Enum 类型路径的 JSON 列插入默认值时出现 UNKNOWN_ELEMENT_OF_ENUM 异常的问题。关闭 #102359。#102687 (Pavel Kruglov).
- 修复了在某些情况下,列重命名期间
columns_substreams.txt损坏的问题。关闭 #102259。#102689 (Pavel Kruglov). - 修复了 JSON 解析期间向 Time 数据类型插入数据的问题。关闭 #102016。#102690 (Pavel Kruglov).
- 修复了缓存的 schema 文件名中内容样本十六进制编码的问题。关闭 #101904。#102703 (Pavel Kruglov).
- 修复了
SummingMergeTreemerge 期间的排序顺序违例问题:当ORDER BY键是基于包含 signaling NaN 值的Float32列的哈希表达式时,会在 debug 版本中崩溃、在 release 版本中静默导致数据损坏。#102791 (Groene AI). - 使
DETACH DATABASE ... SYNC以及其他调用waitDetachedTableNotInUse的操作可通过KILL QUERY取消,并能响应服务器关闭,从而避免并发查询持有表引用时无限期挂起。#102804 (Antonio Andelic). - 修复了
ANY RIGHT JOIN可能返回错误结果的问题。#102893 (Nikita Taranov). - 修复了 S3 请求失败后未进行重试、而是直接报出
ios_base::clear: unspecified iostream_category error的问题,原因是 Poco 的BufferedStreamBuf::flushBuffer未处理来自套接字层的短写入。#102894 (Sema Checherinda). - 修复了
input('auto')表函数在 INSERT SELECT 查询中通过 HTTP 接口调用时失败的问题。#102902 (Miсhael Stetsyuk). - 在存在行策略/additional_table_filters 时禁用简单的 LIMIT 优化 (以支持并行索引分析) 。#102921 (Azat Khuzhin).
- 在
HMACSQL 函数中隐藏 secret key。修复 #102927。#102997 (Mikhail f. Shiryaev). - 修复了启用
optimize_syntax_fuse_functions时,分布式查询中多次引用同一个quantile调用 (例如在SELECT、HAVING和ORDER BY中) 会触发MULTIPLE_EXPRESSIONS_FOR_ALIAS异常的问题。#103014 (tanner-bruce). - 修复了 CI 发现的一种情况:当过滤器依赖左侧列时,传入了一个尚未就绪的 Set。关闭 #102966。#103029 (Yarik Briukhovetskyi).
- 修复了 castOrNull 在某些情况下转换为 JSON 时的问题。关闭 #101818。#103036 (Pavel Kruglov).
- 修复了
SELECT DISTINCT静默返回不完整结果的问题:当聚合 projection 与查询匹配,但表中的某些 parts 没有 projection 数据时 (例如在表中已有数据后才添加 projection,且未运行MATERIALIZE PROJECTION) 。关闭 #102951。#103052 (Nihal Z. Miaji). - 修复了 analyzer 在进行公共表达式提取时,如果
WHEREpredicate (例如AND(OR(A, A), A)) 折叠为单个顶层 argument,会触发TOO_FEW_ARGUMENTS_FOR_FUNCTION异常的问题。#103072 (Peng). - 修复对包含
QBit元素的 tuple、map 或 array 求值if/ifNull时触发的逻辑错误Function writeSlice expects same column types for GenericArraySlice and GenericArraySink。ColumnQBit::structureEquals错误地将一个QBit列的内部 tuple 与另一个QBit列的外层包装进行比较,导致结构相同的QBit列被误判为不同。#103084 (Groene AI). - 修复在持有表引用时,启用
database_atomic_wait_for_drop_and_detach_synchronously的DETACH DATABASE不响应KILL QUERY、而是无限期挂起的问题。#103095 (Alexey Milovidov). - 修复使用非标识符 predicate (例如
WHERE 1=1) 删除 WASM 模块时发生的 segfault。#103101 (Joe Redfern). - 修复向较新 server 通过
remote()或分布式表执行 insert 时的向后兼容性问题:由于processInsertQuery末尾无条件调用sendProgress,旧客户端会报UNEXPECTED_PACKET_FROM_SERVER错误而失败。#103148 (Sema Checherinda). - 当 IN 的第二个参数是非常量 tuple 时,不得将 tuple 元素 CAST 为更窄的 LHS 类型,否则可能导致 overflow。关闭 #103055。#103169 (Yarik Briukhovetskyi).
- 修复 protocol function 中使用未初始化值的问题。#103187 (Pavel Kruglov).
- 修复 MergeTree 索引分析期间出现的
LOGICAL_ERROR(Bad cast … to ColumnLowCardinality) :当WHERE子句将LowCardinality键列与一个 CAST 为包含嵌套LowCardinality的类型的常量进行比较时 (例如Variant(LowCardinality(Date), String)) 。#103211 (Groene AI). - 修复
timeSeries*ToGridaggregate function 家族 (例如timeSeriesResampleToGridWithStaleness、timeSeriesChangesToGrid、timeSeriesResetsToGrid、timeSeriesRateToGrid) 在使用极端 timestamp 参数调用时出现的Logical error: 'index < bucket_count'。这类参数会在计算 bucket count 时导致有符号 64 位算术 overflow。同时将 grid buckets 总数限制为最多 1600 万,以防止对抗性输入意外触发大内存分配。#103223 (Groene AI). - 修复
ReplacingMergeTree的 lazyFINAL路径中,在管道扩展期间抛出的Logical error: 'Port is already connected'异常。该 bug 会影响设置了query_plan_optimize_lazy_final = 1的查询:当ReadFromMergeTree::initializePipeline插入内部 transforms (例如Resize) 并将子管道中的 processors 连接起来时,LazyUnorderedReadFromMergeTreeSource::expandPipeline会尝试再次连接已经连接的输出 ports。#103230 (Groene AI). - 修复当输入是已排序 subqueries 的
UNION ALL时,LIMIT BY和DISTINCT返回错误结果的问题。查询计划优化器错误地将这类 union 视为全局有序,因此返回了额外的行。#103231 (Nihal Z. Miaji). - 修复在启用 lazy replication 的 Map type 上计算 statistics 时可能发生的崩溃。关闭 #102390。#103273 (Pavel Kruglov).
- 修复 ClickHouse、MySQL、PostgreSQL 和 XDBC 字典源中的一个数据竞争问题:
clone() const会读取同一个invalidate_query_response字符串,而isModified() const会向其写入。 #103277 (Miсhael Stetsyuk). - 修复
Date32的单调性检测错误。关闭 #101265。 #103283 (Yarik Briukhovetskyi). - 将认证前 TCP Hello 数据包中的字符串限制为 64 KB,并新增
handshake_timeout_milliseconds服务器设置来限制总握手时间,防止未认证客户端占用过多内存或无限期占用线程。 #103284 (Sema Checherinda). - 修复 Parquet ColumnIndex 统计信息中 String 列出现
min_value > max_value的问题。 #103334 (Saurabh Kumar Ojha). - 修复
flattenTuple和tupleToNameValuePairs在处理Nullable(Tuple(...))输入时对 NULL 行处理不正确的问题。flattenTuple现在会保留外层 null map,因此 NULL 行会保持为 NULL。tupleToNameValuePairs现在会在输入为Nullable(Tuple(...))时,尽可能将结果的值类型改为Nullable(T),这样 NULL 行会生成[('a', NULL), ('b', NULL)],而不是[('a', 0), ('b', 0)]。当元素类型无法包装为Nullable(例如Array) 时,将使用默认值而非 NULL。关闭 #103312。 #103383 (Nihal Z. Miaji). - 在 Native format 中检查格式错误的展平 Dynamic 数据。 #103392 (Pavel Kruglov).
- 修复快照同步后因过时 RPC 导致复制停滞的问题。 #103406 (Seva Potapov).
- 修复一个会导致 server 中止的
LOGICAL_ERROR“Cannot pop N rows from X” 问题 (出现在 debug / sanitizer 构建中) :此前在读取格式错误的 BSON 文档时,如果其中某个值的 BSON 类型与Nullable(T)或Array(Nullable(T))列内的目标列类型不兼容,就会触发该错误。现在,这类格式错误的行会按预期产生明确的ILLEGAL_COLUMN异常。 #103418 (Groene AI). - 修复
arrayFill和arrayReverseFill应用于首行为空的Array(String)列且配合恒为 false 的 lambda 时导致的 server 中止问题。聚合 / 子数组循环中,size_t索引发生 underflow 变为SIZE_MAX,随后在ColumnString::doInsertManyFrom内部导致越界读取。属于与 #12263 相同的 bug 家族。 #103424 (Groene AI). - 修复以下问题:当上游 REPLACE RMV 的 EXCHANGE 在解析过程中途切换目标存储 identity 时,下游带有 SQL SECURITY DEFINER 的 APPEND RMV 中会出现 ACCESS_DENIED / UNKNOWN_TABLE。 #103427 (Alexander Gololobov).
- 从
urltable function 填充_time列。 #103437 (Nikita Taranov). - 修复在处理位宽无效的畸形输入时,
ALPcodec 解压路径中可能出现的越界读取。 #103457 (Raufs Dunamalijevs). - 修复了一个 bug:
SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ...在格式化查询时可能丢失缓存名称,导致远程节点同步所有文件系统缓存,而不只是请求的那个缓存。 #103469 (Asish Kumar). - 修复
deltaLakeAzure中对 URL 编码路径的处理。关闭 #103509。 #103525 (Smita Kulkarni). - 修复将
AggregateFunction状态与整数相乘时的 heap-use-after-free 问题 (例如quantilesExactState(...) * N) 。平方求幂循环会将该状态与自身合并,而当聚合函数的merge重新分配其内部存储时,这种行为是未定义的。关闭 STID 0988-40af。 #103536 (Groene AI). - 修复了一个罕见问题:在
ReplicatedMergeTree表启动期间,如果磁盘上两个空的异常 parts 的 block 范围发生重叠但互不包含,就会触发LOGICAL_ERROR“Part X intersects previous part Y”。该异常会中止表 attach 线程,导致表无法启动。 #103537 (Groene AI). - 修复
Logical error: Incorrect mark rows for part ...(仅在调试版本中触发的断言) 的问题。该问题由MergeTree表上的 mutations 触发:这些表使用非自适应索引粒度 (index_granularity_bytes = 0) ,且最后一个数据标记不完整 (最可靠的复现方式是先执行DETACH/ATTACH,再执行 lightweightDELETE) 。 #103538 (Groene AI). - 修复
clickhouse-local通过file()table function 读取/proc和/sys伪文件时静默返回 0 行的问题 (例如SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')) 。 #103548 (Ashrith Bandla). - 修复
GenerateRandom表引擎中max_string_length参数的处理。 #103550 (Alex Kuleshov). - 修复在日志中屏蔽嵌套 credentials 的问题。 #103552 (Vitaly Baranov).
- 修复在 SVE 不可用时仍使用 SVE 指令进行检测的问题。 #103568 (Raúl Marín).
- 修复
GenerateRandom存储参数的解析。 #103574 (Konstantin Bogdanov). - 修复
WITH FILL在数据以 ±inf 开头时出现无限循环的问题。 #103580 (Konstantin Bogdanov). - 修复了
JSONExtract提取到Variant类型时静默截断 JSON 小数的问题。此前,JSONExtract('{"x": 3.14}', 'x', 'Variant(Int64, Float64)')返回Int64=3,而JSONExtract('{"x": 3.14}', 'x', 'Variant(String, Int64)')返回Int64=3,导致小数部分丢失。现在小数值可无损保留:如果存在Float64/Decimal成员,则由其接收该值;否则由String成员保留原始 JSON。仅包含整数成员的Variant类型 (例如Variant(Int64, Int32)) 以及直接提取整数 (JSONExtract(json, 'Int64')、JSONExtractInt等) 的行为不变。#103620 (Groene AI). - 修复了不带参数的
SYSTEM INSTRUMENT REMOVE会产生std::bad_optional_access(错误码 1001) 而不是SYNTAX_ERROR(错误码 62) 的问题。#103622 (Pablo Marcos). - 修复了
windowID和tumblewindow view 在将时区字符串作为第 3 个参数调用时出现的 logical error / 未定义行为。#103641 (Alexey Milovidov). - S3 client 日志现在会将带有非空 x-amz-bucket-region 请求头的 HTTP 400 响应 (SigV4 签名区域错误) 视为信息性的区域错误场景,并输出更清晰的日志,而不是走通用的错误处理路径。只有在配置了 web identity 时,才会将 STS web identity credentials provider 添加到 S3 credentials chain 中,从而减少未使用该功能的部署中出现的无关警告。关闭 #99140。#103673 (MeltonSmith).
- 修复了
SYSTEM SYNC REPLICA <db>.<tbl> IF EXISTS在数据库不存在时静默成功,使其与表不存在时的现有行为以及DROP TABLE IF EXISTS所确立的先例保持一致。此前,尽管指定了IF EXISTS,查询仍会抛出UNKNOWN_DATABASE。关闭 #103629。#103689 (Groene AI). - 修复了这样一个问题:当
MergeTree表的排序键中包含Array(LowCardinality(...)),且WHERE子句对该列与元素类型不同的Array常量使用plus/minus时,FunctionBinaryArithmetic::executeImpl2会抛出 logical errorArguments of 'plus' have incorrect data types。KeyCondition::getMonotonicityForRange现在会在调用内部数值分发前递归去除LowCardinality。#103701 (Groene AI). - 修复了 26.1+ 中动态 cache 调整大小时的竞态问题。#103702 (Kseniia Sumarokova).
- 修复了一个问题:对于表达式中包含捕获常量的 lambda 的
ALIAS列 (例如arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m)))) ,其上的 text 和 bloom_filter 跳过索引会被静默忽略。#103708 (Anton Popov). - 修复了
position和positionCaseInsensitive在start_pos接近UINT64_MAX时,因指针运算溢出而卡住或导致段错误的问题。#103766 (Raúl Marín). - 修复了解析带有双重小数部分的 dateTime 时的未定义行为。#103773 (Yarik Briukhovetskyi).
- 修复了 26.x 中一个数据正确性回归问题:当 JIT 编译的
if和multiIf的结果类型为Decimal,且某个分支中包含非Decimal(整数或浮点) 字面量时,会在无报错的情况下返回一个比正确值小10^scale倍的结果。慢速 (非 JIT) 路径不受影响。受影响版本的临时规避方法:SET compile_expressions = 0。#103809 (Groene AI). - 修复了将分词器从文本索引传递给受支持函数的问题。#103826 (Elmi Ahmadov).
- 修复了
numbers、generate_series以及类似遵循范围约束的源在WHERE子句中对某个元组使用IN或NOT IN,且其元素去重后归并为单个键列时返回错误结果的问题 (例如,WHERE tuple(number, number) NOT IN (tuple(1, 2))) 。关闭 #103660。#103835 (Groene AI). - 让自动 spilling 的 hash join 实际内存峰值保持在
max_bytes_before_external_join之下。此前,由统计信息驱动的预分配、原地哈希表翻倍扩容,以及无界的GraceHashJoin内存桶都可能分别导致查询超出配置上限并触发MEMORY_LIMIT_EXCEEDED。#103838 (Alexey Milovidov). - 修复了在配置系统日志 (如
text_log或filesystem_cache_log) 时,clickhouse-local在关闭过程中卡住的问题。SystemLogs::flushImpl会调用BaseDaemon::instance().flushTextLogs(),而该调用在clickhouse-server之外会抛出std::bad_cast,导致保存线程持续运行,直到pthread_cond_destroy阻塞了系统日志队列的销毁。#103874 (Alexey Milovidov). - 现在,对于其 body 在不同引用中推断出不同列类型的
MATERIALIZEDCTE 查询,会明确报出TYPE_MISMATCH错误并拒绝执行,而不再因Bad castLOGICAL_ERROR导致 server 崩溃。此前,这种情况会在 CTE body 引用了外层作用域中的标识符 (例如调用方子查询投影中的别名) ,且这些标识符在每次引用时被内联为不同常量时发生。#103879 (Groene AI). - 修复了 JOIN 转换查询计划优化器 (
tryConvertAnyOuterJoinToInnerJoin、tryConvertAnyJoinToSemiOrAntiJoin) 中的未初始化值使用问题;当ANYOUTERJOIN上层的过滤器包含rand、now或rowNumberInAllBlocks等非确定性函数时会触发该问题。优化器现在不再尝试对此类过滤器进行常量折叠,并保持 JOIN 不变,这也避免了错误地将其转换为INNER/SEMI/ANTI JOIN而在无提示的情况下丢弃行。#103880 (Groene AI). - 修复了
StorageKafka2中的一个释放后使用问题:当 Keeper session 被替换,而消费者持有临时 topic-partition 锁时,可能导致 server 崩溃。#103890 (Groene AI). - 修复了一个会抛出
LOGICAL_ERROR“Primary key type mismatch”的问题:当通过JOIN ... USING (key)将EmbeddedRocksDB表与一个 key 列类型 (例如Nullable(UInt64)、Int64、Decimal) 不同于存储主键类型的子查询进行连接时,就会出现该错误。现在,planner 在类型不匹配时会拒绝DirectKeyValueJoin,并回退到可处理类型转换的HashJoin。#103928 (Groene AI). SET max_threads = DEFAULT(max_final_threads和max_parsing_threads同样如此) 不再丢失自动状态。此前,重置这些设置之一后,system.settings会显示解析后的 CPU 核心数 (例如32) ,而不是'auto(32)',并且 server 会表现得像该值已被显式固定一样。#103991 (Groene AI) 。- 修复了读取
AggregateFunction(topK(N), String)列时出现SIZES_OF_ARRAYS_DONT_MATCH的问题;当其持久化的alpha_size因一次 25.12 之前的 deserialize+serialize 循环而增大时,就会触发该问题。#104002 (Raúl Marín) 。 - 修复了 PostgreSQL、Cassandra 和 XDBC 字典源中的 SQL 注入漏洞:此前,包含单引号的字符串键会被转义为
\'(反斜杠) ,而这些 backend 会将其视为字面反斜杠,而不是转义序列,从而允许将任意 SQL 注入到字典 lookup 查询中。现在,ExternalQueryBuilder会为这些 backend 生成符合 SQL 标准的''转义;ClickHouse 和 MySQL 字典源则继续使用反斜杠转义。#104009 (Shaohua Wang) 。 - 修复了聚合中的潜在类型不匹配问题;当列类型在 LowCardinality 与非 LowCardinality 之间变更,且 min-max projection 未重建时,就可能出现该问题。#104013 (Nikita Taranov) 。
- 修复了因合并 expression 时未传递“防止移除未使用列”的标记而导致的查询优化无限循环问题。#104083 (János Benjamin Antal) 。
- 修复了批量重命名流式表 (S3Queue、Kafka、RabbitMQ) 时,
StreamingStorageRegistry::renameTable中出现的LOGICAL_ERROR:改为使用基于 UUID 的 identity 跟踪,而不是基于名称的跟踪。#104101 (Nikita Taranov) 。 - 修复了以下场景下的错误结果:由
UNION ALL构造的 CTE 包含一个SELECT DISTINCT分支,而外层查询只投影该 CTE 的部分列。新的 analyzer 中的RemoveUnusedProjectionColumnsPass错误地从内部DISTINCTprojection 中移除了未被引用的列,导致原本应保持 distinct 的行 (投影列值相同,但被删除列值不同) 被合并成一行。#104114 (Groene AI) 。 - 修复了设置
optimize_inverse_dictionary_lookup中多个边界场景下的正确性问题;在这些情况下,该优化可能会悄然丢弃行或抑制异常。关闭 #103270。关闭 #103085。#104133 (Nihal Z. Miaji) 。 - 修复了反序列化
quantileTiming状态时发生的越界写入问题。#104141 (Alexey Milovidov) 。 - 修复了将越界的
Float64值转换为宽整数类型 (UInt64、Int64、Int128、UInt128、Int256、UInt256) 时的未定义行为。此前,等于Float64(numeric_limits<T>::max())的值 (会向上舍入到一个超过实际最大值的值) 会绕过边界检查,并在后续类型转换中产生 UB。这会影响聚合函数参数解析 (topK、histogram、uniqUpTo、groupArrayInsertAt等) 以及通过SET <setting> = <Float64>设置的整数类型配置项。关闭 #103817。#104154 (Groene AI) 。 - 修复了将嵌套的
Tuple(Tuple(Nullable(...)))(或更深层嵌套) 与String字面量比较时出现的LOGICAL_ERROR异常:“Unexpected return type from comparison. ExpectedUInt8. GotConst(Nullable(UInt8))”。现在,比较结果的返回类型会被正确推断为Nullable(UInt8),与运行时行为一致。#104171 (Groene AI). - 修复了在
query_plan_optimize_lazy_final = 1时,执行SELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr>会导致 server 中止的问题 (UndefinedBehaviorSanitizer: reference binding to null pointer,并在 release 构建中发生 segfault) 。lazy-FINAL 的非相交读取步骤丢失了输出头信息中的is_deleted列,因为 prewhere 将其作为输入消耗后,没有重新将其作为输出暴露出来。随后,下游的addIsDeletedFilter步骤解引用了一个空的ActionsDAG::Node指针。#104177 (Groene AI). - 修复了调用 system.failpoints 表时会使用一个 failpoint,从而可能将其禁用的问题。#104237 (Pedro Ferreira).
- 修复了当输入包含一个恰好在缓冲区边界结束的 UTF-8 字符时,
detectLanguage*函数中的MemorySanitizer: use-of-uninitialized-value问题。#104257 (Raúl Marín). - 修复了一个逻辑错误 (
Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage) :当对底层对象存储被文件系统缓存等装饰器包装的 disk 使用SETTINGS disk = '...'调用数据湖表函数和引擎 (icebergS3、deltaLakeS3等) 时,该错误会中止参数解析。关闭 #89300。#104258 (Groene AI). - 修复了对名为
values的列使用带括号的下标表达式时的解析问题,例如(values['a']),使其不再被解释为 SQL 标准的VALUES表表达式。#104312 (Desel72). - 修复了文件系统缓存后台逐出线程 (
SLRUFileCachePriority::collectEvictionInfo) 中的 server 中止/LOGICAL_ERROR:当keep_free_space_size_ratio或keep_free_space_elements_ratio足够高,以至于在所有缓存条目都已提升到 SLRU protected queue (probationary 为空) 时触发逐出,就可能出现该问题。#104313 (Groene AI). - 修复了将 projections 与 UNION ALL 视图、窗口函数或别名列名冲突一起使用时出现的异常 (
NOT_FOUND_COLUMN_IN_BLOCK、LOGICAL_ERROR、AMBIGUOUS_COLUMN_NAME) 。这是由 #88798 引入的回归问题。#104317 (Amos Bird). - 修复了解析 Postgres 数组时可能出现的 underflow 问题。#104322 (Grant Holly).
- 返回非
Nullable类型 (如Array、Tuple或Map) 的函数现在也支持Nullable参数。受影响的函数包括extractAll、extractAllGroups、extractAllGroupsHorizontal、extractAllGroupsVertical、extractGroups、splitByChar、splitByString、splitByRegexp、splitByWhitespace、splitByNonAlpha和alphaTokens。对于NULL输入行,现在会返回结果类型的默认值 (例如空数组) ,而不是抛出 “Nested type is not allowed inside Nullable type”。#104326 (Alexey Milovidov). - 修复了带分区的 Iceberg 表的统计信息问题。此更改关闭了 #104321。#104329 (Konstantin Vedernikov).
- 修复了 macOS (以及类似的 jemalloc 构建) 上 server 启动时的一个致命 logical error:由于可选的
background_thread/max_background_threadsmallctl 不存在,Jemalloc::verifySetup会错误报告jemalloc_enable_background_threads不匹配;现在,如果这些 mallctl 不可用,则会跳过校验,且getValue在失败时也不再让输出保持未初始化状态。关闭了 #102183。#104330 (SAYON DEEP). - 修复了一个正确性回归问题:带有
max_rows_to_read_leaf和read_overflow_mode_leaf = 'throw'的SELECT查询,即使跳过索引本可将读取量降到叶子节点上限以下,也可能错误抛出TOO_MANY_ROWS。对应的非叶子节点设置 (max_rows_to_read/read_overflow_mode) 此前已正确处理。#104331 (Groene AI). toUUID、toUUIDOrNull、toUUIDOrZero、toUUIDOrDefault、到UUID和Nullable(UUID)的CAST、到UUID的accurateCastOrNull,以及从文本解析 UUID 的输入格式 (Avro、MsgPack、JSONExtract等) 现在会拒绝长度正确但包含非十六进制字符的字符串。此前,这类输入会因为越过十六进制数字查找表末尾而被静默转换为伪造的 UUID;现在toUUID会抛出CANNOT_PARSE_UUID,而Or*变体会返回NULL/ 零 UUID / 提供的默认值。#104370 (Groene AI).- 修复了
caseWithExpression(以及 SQLCASE expr WHEN ... THEN ... ELSE ...) 中的Bad castLOGICAL_ERROR:当仅 THEN 分支的 supertype 与 (THEN + ELSE) 的 supertype 落在不同的ColumnDecimal存储中时,会触发该问题——例如 THEN 值为(UInt16, Int8),而 ELSE 为Decimal(9, 2)。关闭了 #104335。#104378 (Groene AI). - 通过
logExceptionBeforeStart报告的内部故障 (asynchronous insert 刷写、materialized-view 刷新、内部查询期间抛出的解析错误) 现在会正确增加FailedInternalQuery、FailedInternalSelectQuery和FailedInternalInsertQuery这几个 ProfileEvents,同时也会增加用户可见的FailedQuery、FailedSelectQuery和FailedInsertQuery计数器。此前,这些内部计数器对于在查询执行开始前发生的故障始终保持为零,导致一大类内部故障被少计。#104399 (Groene AI). - 修复了在
BACKUP或RESTORE语句的base_backupsetting 中使用查询参数时抛出的Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type}错误 (例如BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)) 。该回归问题由 PR #99205 在26.1.5中引入。关闭 #103324。#104413 (Groene AI). - 修复了
IcebergLocal/IcebergS3写入时的 server 中止问题:当执行ALTER TABLE ... DROP COLUMN后,再执行一个iceberg_metadata_staleness_ms大于 0 的INSERT时会触发该问题。现在ALTER会使本地 Iceberg 元数据文件缓存失效,因此后续读写都能看到新的 schema。#104419 (Groene AI). - 修复了
DROP ROLE、DROP USER、DROP SETTINGS PROFILE、DROP ROW POLICY、DROP QUOTA和DROP MASKING POLICY,使其在删除某个 entity 时,也会从所有引用该 entity 的其他 access entity 中移除相关引用 (例如用户的DEFAULT ROLE列表、settings profile 的TO列表、row policy 的 grantees) ,并将清理结果持久化到 disk。此前SHOW CREATE会过滤未知 UUID,因此内存状态看起来是正确的;但磁盘上的.sql文件仍保留了悬空的ID('<dropped-uuid>')条目,这些引用会在下次 server 重启时重新出现,并在 distributed query execution 期间表现为ACCESS_ENTITY_NOT_FOUND错误。#104427 (Groene AI). - 修复了
azureBlobStorage、AzureBlobStorage-engine 以及 Azure 上的 DeltaLake 在使用 connection string 时可能触发的 server 中止问题:当其中BlobEndpointURL 的端口为空、非数字或超出范围时 (例如BlobEndpoint=http://host:abc/) ,就会出现该问题。现在 server 会返回明确的BAD_ARGUMENTS错误,而不再在 debug/sanitizer 构建中中止。#104460 (Groene AI). - 允许在
remote和remoteSecuretable functions 中使用未加引号的标识符作为用户名,这与 database 和 table arguments 接受未加引号标识符的方式一致。此前,这类查询会因一条误导性的身份验证错误而失败,并错误地指向default用户。#104465 (Alexey Milovidov). - 修复了当 SQL 用户自定义函数的函数体中包含带括号的内部
UNION ALL时触发的Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N)(例如CREATE FUNCTION f AS x -> (SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1))) 。#104477 (Groene AI). - 修复了
uniqThetaIntersect的问题:当第二个 argument 为空uniqTheta状态时,它会返回第一个 argument 的 cardinality,而不是0——例如uniqThetaMergeStateIf(s, predicate)的结果,其中 predicate 会排除所有行。#104529 (Groene AI). - 修复了
SHOW TABLES和system.tables在列出由 Iceberg REST 目录 (iceberg-rest、onelake、biglake) 支持的DataLakeCatalog数据库时静默截断列表的问题。当目录 server 对 list-tables 或 list-namespaces 响应进行分页时 (例如 Microsoft Fabric / OneLake 中每个命名空间超过约 50 张表时) ,后续页面中的表在SHOW TABLES和system.tables中会静默消失,尽管仍可通过直接SELECT查询。RestCatalog现在会遵循 Iceberg REST OpenAPI 规范中定义的next-page-token延续标记,与PaimonRestCatalog和UnityCatalog的现有行为保持一致。#104531 (Groene AI). inputtable function 现在会在外围INSERT查询的FORMATclause 使用固定 schema 的 format (如LineAsString、RawBLOB、JSONAsString等) 时,从该子句推断其结构,因此用户不再需要为这些 format 重复写出input('line String')这样的结构定义。#104532. #104533 (Groene AI).- 将 Iceberg history 中字段的数据类型从
Int32更新为Int64。关闭 #94176。#104579 (Smita Kulkarni). - 修复了解析函数调用时 (当逗号后跟着 lambda 时) 出现的
Inconsistent AST formattingLOGICAL_ERROR,例如SELECT substring(x, `x` -> `x`)。parser 过去会静默地把前面的 arguments 合并到 lambda 的左侧,生成单参数调用,导致无法重新解析回相同的 AST。现在会保留函数原始的参数个数。#104626 (Groene AI). - 当未给出 database 限定符时,
CHECK TABLE t现在会优先选择同名的TEMPORARY表,而不是永久表,这与SHOW CREATE TABLE、DESCRIBE TABLE、OPTIMIZE TABLE和ALTER TABLE已采用的优先级规则一致。此前CHECK TABLE t会完全跳过 temporary tables,因此即使这些引擎支持CHECK,对 temporary日志或File 表引擎表执行时仍会因UNKNOWN_TABLE而失败。这是对 #100966 的后续修复。#104637 (Groene AI). - 修复了当向未配置
<placement>的 Keeper 发送带有quorum_reads=true的get /keeper/availability_zone时,Keeper 终止并进入重启循环的问题。#104663 (myeongjun). - 修复了
FutureSetFromTuple::buildOrderedSetInplace中会导致 logical error 的 TOCTOU data race。#104673 (Miсhael Stetsyuk). - 修复了若干函数对相同输入会因 arguments 以列或常量形式传入而返回不同结果的问题:
bitRotateLeft/bitRotateRight(边界移位计数) 、length(FixedString)/concatWithSeparator配合LowCardinality(Nullable)输入、作用于 NaN 的roundDown,以及作用于无效 UTF-8 的rightUTF8。#104710 (Raúl Marín). - 修复了当最频繁的值是列默认值且数据分布在多个
MergeTreeparts 中时,anyHeavy会返回非 heavy 值的问题 (稀疏列读取路径) 。#104712 (Raúl Marín). - 修复设置约束处理中的多个缺陷:声明在设置规范名称上的
MergeTreeSettings约束,可通过写入该设置的别名来绕过;此外,disallowed_values约束检查在 clamp 路径 (次级查询、ON CLUSTER工作线程、SQL SECURITY DEFINER视图) 上会抛出异常,而不是静默丢弃该更改。#104737 (Raúl Marín) 。 - 修复了惰性附加的
Iceberg/IcebergLocal/DeltaLake/Hudi表在执行OPTIMIZE TABLE、ALTER TABLE ... DELETE、ALTER TABLE ... ADD COLUMN及其他 ALTER 变体时触发的LOGICAL_ERROR异常 (Metadata is not initialized) :当时 metadata 尚未加载 (常见于 server 重启后,或之前 metadata 写入失败并在磁盘上留下损坏的 metadata 文件之后) 。现在,如果 metadata 成功加载,操作会正常继续;如果加载失败,则会将底层加载失败作为常规的用户可见异常抛出,而不再在 debug / sanitizer 构建中导致 server 中止。#104738 (Groene AI) 。 - 修复
AvroConfluentRowInputFormat中 use-after-free 缺陷导致的 segfault。#104751 (Miсhael Stetsyuk) 。 numericIndexedVectorPointwiseMultiply、numericIndexedVectorPointwiseDivide、numericIndexedVectorPointwiseEqual和numericIndexedVectorPointwiseNotEqual的标量变体现在会在传入大于Int64::max的UInt64标量时抛出INCORRECT_DATA。#104784 (FriendLey) 。- 修复一个问题:应用
compatibility设置后,如果通过别名手动覆盖某个设置 (例如使用SET enable_analyzer = 1而不是SET allow_experimental_analyzer = 1) ,则后续再修改compatibility设置时,可能会把该覆盖还原掉。#104829 (Raúl Marín) 。 - 修复在 https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d 之后 AWS 日志记录器被禁用的问题。#104837 (Konstantin Bogdanov) 。
- 修复另外三个函数的问题:同样的输入,结果会因 argument 是以列还是常量形式传入而不同:默认值为常量
Date/Date32/Enum/FixedString的transform(以及经由它调用的caseWithExpression) 、String与常量FixedString之间的比较运算符,以及条件为常量时带有FixedString分支的if/ifNull/nullIf。#104858 (Raúl Marín) 。 - 修复
MergeTree表在执行分区裁剪时出现的Bad cast from type DB::ColumnConst to DB::ColumnNullableserver 中止问题;当分区表达式中包含会折叠为单个常量值的函数事件链时,就会触发该问题 (例如floor(NULL, toRelativeYearNum(...))) 。#104861 (Groene AI) 。 - 修复
ContextData复制构造函数中的一个ThreadSanitizerdata race:复制table_function_results时未获取table_function_results_mutex,因此并发的Context::executeTableFunction写入可能会与复制构造函数中未同步的读取发生竞争。#104879 (Groene AI) 。 - 修复对具有动态结构的类型进行数据分区片段一致性检查的问题,并可检测损坏的 columns_substreams.txt。这是对 https://github.com/ClickHouse/ClickHouse/pull/103858 的重新提交,包含额外更改。#104888 (Pavel Kruglov) 。
- 修复了 DatabaseCatalog 中
DROP与UNDROP之间的竞态问题。#104915 (Azat Khuzhin). - 修复了文件系统缓存动态调整大小时对部分已下载分段的处理问题,包括在驱逐失败后恢复相关统计计数。#104921 (Antonio Andelic).
- 现在,对 temporary table 执行
DETACH TABLE(不带TEMPORARY关键字) 时,会正确抛出SYNTAX_ERROR,与DETACH TEMPORARY TABLE的行为一致。此前,它会静默设置内部is_detached标志并直接返回,不报错。要删除 temporary table,请使用DROP TEMPORARY TABLE或DROP TABLE(后者会通过Context::ResolveExternal解析该 temporary table) 。关闭 #103475。#104943 (Groene AI). - 使
filesystemtable function 在加载文件内容时遵守max_memory_usage/max_server_memory_usage限制。此前,读取大型内容或进行大量并行内容读取时,可能会在未抛出MEMORY_LIMIT_EXCEEDED的情况下突破限制,最终被 OOM 杀死。#104956 (Alexey Milovidov). - 修复了按
uuid过滤system.detached_tables时抛出的LOGICAL_ERROR(例如SELECT count() FROM system.detached_tables WHERE uuid = '...') 。现在,该查询会返回预期结果,而不是导致 server 中止。#104979 (Groene AI). - 对嵌套结构仅包含空
Tuple()叶子的 tuple 调用flattenTuple时,不再抛出LOGICAL_ERROR(例如Tuple(c0 Array(Tuple()))或Tuple(c0 Tuple())) 。现在,这类输入会产生面向用户的ILLEGAL_TYPE_OF_ARGUMENT异常,明确说明展平结果将是一个空 tuple。#104989 (Groene AI). - 修复了在使用
GROUP BY查询loop(remote(...))(或任何包装了可延迟 aggregation 的存储的loop()) 时,会导致 server 中止以及静默返回错误结果的问题。外层 planner 之前会根据内层存储报告的 processing stage 添加MergingAggregatedStep,但LoopSource总是以QueryProcessingStage::Complete物化其内部 select,并输出普通列 chunks,因此在enable_parallel_replicas = 1时,MergingAggregatedTransform会触发LOGICAL_ERROR(Chunk info was not set for chunk in MergingAggregatedTransform) ;在其他情况下,则会静默丢弃外层 aggregation。#105001 (Groene AI). clickhouse-benchmark --reconnect(裸用、不带值) 在 25.4 中因某项变更而被意外破坏:该变更将--reconnect改成了整数选项,必须提供值。现在,裸用形式已再次可用,并且等价于--reconnect=1(每个查询都重新连接) 。#105006 (Groene AI).- 修复了列名以不完整 UTF-8 序列结尾时导致 JSON 输出格式错误的问题。#105012 (Pablo Marcos).
- 修复了对 materialized view 的 source table 执行
EXCHANGE TABLES或CREATE OR REPLACE TABLE后出现的静默数据丢失问题。现在,MV的 source-view dependency edge 会保留在原始名称上,因此仍会在 inserts 时触发。该回归由 #98779 引入;现已恢复到回归前的行为。#105029 (Sema Checherinda). - 修复在 JIT 编译将
Float转换为UInt128的表达式时出现的CANNOT_COMPILE_CODE Could not find symbol __fixunsdfti问题,例如toUInt128(<Float64 expression>)。原因是 JIT 符号解析器中缺少用于无符号 128 位浮点转整数的 compiler-rt builtin 符号。关闭 #105031。#105048 (Raúl Marín)。 - 修复在设置
send_logs_level时,clickhouse-local不输出失败查询日志消息的问题。#105067 (Alexey Milovidov)。 - 修复同一 parameterized view 在同一个查询中以不同 argument values 被多次引用时结果不正确的问题。此前,analyzer 会将这些调用折叠成一个,静默丢弃除第一个过滤器外的所有过滤器。#105170 (Alexey Milovidov)。
- 修复
play.htmlweb UI 中,TOTALS行在结果表底部被渲染两次的问题。#103803 (Alexey Milovidov)。 - 在向量搜索期间拒绝非有限向量 (
NaN、±Inf) (无论是待搜索向量还是参考向量) ;此前它们会导致usearch中出现未定义行为。#104079 (Groene AI)。 - PromQL:修复空向量上的 aggregation 运算符问题。#104425 (Vitaly Baranov)。
- PromQL:修复 Prometheus 查询 API 中的错误处理问题。#104741 (Vitaly Baranov)。
- 修复
MergeTreeTransaction::afterCommit中的一个竞态问题:如果在将提交CSN写入 ZooKeeper 后、事务完成前 connection 丢失,COMMIT响应可能会在新的creation_csn/removal_csn出现在system.parts中之前先到达 client。#104708 (Tuan Pham Anh)。 - 修复 KQL parser 在转换嵌套数组索引 (
arr[arr[arr[...]]]) 时内存呈指数级增长的问题。#105142 (Alexey Milovidov)。 - 修复
RIGHT ANY JOIN在右表每个键对应多行,且输出块因大小限制被拆分时结果不正确的问题。关闭 #99431。#102064 (Vladimir Cherkasov)。 - 在嵌套类型反序列化期间,为
Avro读取器增加栈溢出检查。#102417 (Pavel Kruglov)。 - 修复
MergeTreesettings 的system.completions中出现重复行的问题——每个 setting 名称都会出现两次,因为虽然两者的设置名称相同,getMergeTreeSettings和getReplicatedMergeTreeSettings的结果仍都被转储了。关闭 #102013。#102015 (Groene AI)。 - 修复
StorageObjectStorageQueue(S3Queue、AzureQueue) 在关闭时被阻塞的问题:此前必须等对象存储中部分已处理文件被完整读取后才能关闭。现在源会在关闭时立即中止读取;借助去重机制,关闭前已流式写入目标表的行,在下次启动重试该文件时不会重复。#103126 (Tuan Pham Anh) 。 - 修复对
Alias表引擎使用insert_deduplication_token进行多块插入时只保留部分块的问题,现在会保留所有块。#103246 (Enric Calabuig) 。 - 修复原生
JSON列上的JSONHas和JSONExtractBool返回提取出的值 (转换为UInt8) 而不是0/1的问题。#103313 (zxuhan7) 。 - 修复
CustomSeparated输入格式在面对省略format_custom_row_after_delimiter的畸形或恶意数据时防护不足的问题。此前,标头检测、schema 推断以及可变列数的行会无限制累积字段,并可能在失败前分配数 GB 内存。现在,只要单行包含超过 1,000,000 个字段,读取就会以INCORRECT_DATA失败。#103404 (Groene AI) 。 - 修复复制
MergeTree表执行RESTORE时的问题:恢复后的数据分片附加操作现在使用backup_restore_keeper_max_retries,而不是常规插入的 Keeper 重试次数预算。#104610 (Pablo Marcos) 。 - 修复
MergeTree表上WHERE p AND <LowCardinality(Nullable(int)) constant>返回错误结果的问题。此前,这类查询会返回零行,因为分片裁剪会从LowCardinality(Nullable(...))类型推导出默认NULL,并构造出notEquals(x, NULL)保护条件,从而裁掉所有分片。#104767 (Groene AI) 。 - 修复按某列的非单射函数分组且该列同时又是分区键时,聚合结果错误的问题 (例如
PARTITION BY a且GROUP BY intDiv(a, 2)或a % 2) 。此前,来自不同分区但映射到同一分组的值不会被合并,导致在allow_aggregate_partitions_independently = 1下出现重复的分组行。#104869 (Nihal Z. Miaji) 。 - 修复
Keeper快照传输中的竞态问题:在向正在恢复的 follower 发送快照时,快照可能被删除或移动。#104941 (Antonio Andelic) 。 - 修复
hilbertEncode和mortonEncode中一个静默产生错误结果的问题:当第一个参数 (范围掩码) 是非常量Tuple时,每一行的位移计算都会错误地使用第 0 行的值。现在,这些函数会按行计算掩码值,因此结果不再依赖输入是否为常量,也不再依赖块大小。#104992 (Groene AI) 。 - 修复
clickhouse-local在从./clickhouse-local.xml、~/.clickhouse-local/config.xml或/etc/clickhouse-local/config.xml自动发现配置文件时,会静默忽略用户级配置 (profiles、users、quotas、访问控制设置) 的问题。此前,只有传入--config-file或当前目录存在./config.xml时,这些设置才会生效;现在所有发现路径的行为都已保持一致。#105008 (Groene AI) 。 - 修复了
BFloat16列与字符串字面量比较时静默返回零匹配的问题 (例如WHERE bf16_col = '49.9') 。#105042 (Raúl Marín). - 修复了
SummingMergeTree、AggregatingMergeTree和CoalescingMergeTree在合并过程中处理CLEAR COLUMN和 TTL 时的问题:当合并所需的列缺失或已过期时会出错。已关闭 #101953。#105203 (Antonio Andelic). - 通过在解引用
shared->clusters_config前添加显式空值检查,修复了DNSCacheUpdater::run与Context::reloadClusterConfig之间的竞态问题。#105220 (Mikhail f. Shiryaev). - 修复了
toDateTime64在ms和ns精度下的best_effort日期时间解析问题。#105233 (Kaviraj Kanagaraj). - 修复了
OSIOWaitMicroseconds错误地上报线程生命周期的 I/O 等待时间,而不是每次查询的 I/O 等待时间的问题。#105246 (Mikhail f. Shiryaev). Hudi表引擎现在在表目录中的 Parquet 文件不符合 Hudi[FileId]_[FileWriteToken]_[Timestamp].[extension]命名约定时,会抛出INCORRECT_DATA(普通的查询级异常) ,而不是LOGICAL_ERROR。此前,这类文件名会在调试构建中触发异常。#105266 (Groene AI).- 修复了
ParallelFormattingOutputFormat在调度失败时的死锁问题:当scheduleFormatterThreadForUnitWithNumber抛出异常时 (例如CANNOT_SCHEDULE_TASK) ,该单元会停留在READY_TO_FORMAT状态,且没有格式化线程继续处理,最终导致挂起。现在,调度调用已包装在try/catch中,任何失败都会通过onBackgroundException处理,从而让收集器正常退出。#105275 (Azat Khuzhin). - 修复了
Distributed异步插入在异常关闭后恢复时发生的静默数据丢失问题:如果保存的批次中最后一个.bin文件完好,但中间某个文件已损坏,DistributedAsyncInsertBatch::recoverBatch过去只会校验最后一个文件的文件头,随后sendBatch会将整个批次——包括完好的文件——都标记为损坏,导致其中的行丢失。现在会逐个校验每个文件的文件头,因此只有实际损坏的文件会被移到broken/,其余未损坏的行会发送到远程分片。#105281 (Groene AI). - 修复了
clickhouse extract-from-config --try中的一个回归问题:当配置使用from_env属性且没有include_from元素 (或该元素指向不存在的文件) 时,所有from_env替换都会被静默丢弃并返回空字符串。这破坏了 26.2.5 中 Docker 入口点的端口发现。已关闭 #101704。#105283 (Groene AI). - 修复了向
SQLite表执行INSERT INTO时因 SQLite 语法错误而失败的问题:当插入值为Enum、JSON或AggregateFunction,且其文本表示中包含单引号时,就会触发该问题。现在,相应的序列化也会遵循output_format_values_escape_quote_with_quote设置 (此前只有String和FixedString支持该设置) 。#105285 (Groene AI). - 修复了这样一个问题:在
allow_push_predicate_ast_for_distributed_subqueries = 1(默认值) 时,如果GLOBAL IN元组与一个投影中包含重复列名的子查询匹配,例如(x, y) GLOBAL IN (SELECT number, number FROM numbers(5)),分布式查询会抛出Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists。#105290 (Groene AI) 。 - 修复了
reinterpret应用于Array(LowCardinality(...))时在运行时返回令人困惑的NOT_IMPLEMENTED错误的问题;现在会在类型检查阶段返回ILLEGAL_TYPE_OF_ARGUMENT。#105301 (Raúl Marín) 。 minMap/maxMap(数组形式) 和minMappedArrays/maxMappedArrays现在对NaN的处理与ORDER BY一致:NaN被视为排在最后 (仅当所有值都是NaN时才会返回) 。此前,由于 IEEE 754 的无序比较语义,结果会受NaN在数据中位置的影响,并且与已在 #100448 中修复的minMap/maxMap的Map参数形式不一致。#105331 (Raúl Marín) 。- 修复了带有
Nested列的MergeTree家族表中按表划分的ColumnsDescription缓存内存泄漏问题。在share_nested_offsets = 1(默认值) 时,条目在经历ALTER ADD COLUMN/DROP COLUMN循环后也从未被淘汰。#105376 (Groene AI) 。 - 修复了这样一个问题:当带有
TYPE set(N)跳过索引的SELECT包含一个结果类型为Float、BFloat16或其他任意非整数类型的WHERE原子表达式时 (例如WHERE c0 + 0.1或WHERE log(c0)) ,会抛出BAD_ARGUMENTS异常 “It’s a bug! Only integer types are supported by__bitWrapperFunc”。现在在这种情况下,跳过索引会回退到常规过滤路径。#105384 (Groene AI) 。
构建/测试/打包改进
- 停止使用系统
compiler-rt库和头文件。关闭 #91475。#102857 (Konstantin Bogdanov). - 更新 distroless Docker 基础镜像,以修复
libssl3t64中的 OpenSSL CVE。#103583 (Rahul Nair). - 在发布过程中,通过串联多个 Ubuntu 密钥服务器来可靠获取 GPG 密钥,避免在
keyserver.ubuntu.com上超时。#103834 (Mikhail f. Shiryaev). - 移除并禁止构建时的
CMake检查 (check_*、try_compile、try_run) 。由于编译器和工具链是固定的,因此没有必要在配置阶段进行功能检测;现在项目范围内已全面禁止此类做法,任何与特定版本相关的行为都必须显式以CMAKE_CXX_COMPILER_VERSION为条件控制。#103980 (Alexey Milovidov). - 将
libarchive从 3.8.6 升级到 3.8.7。#104047 (Robert Schulze). - 将
mongo-c-driver更新到 2.3.0。#104300 (Raúl Marín). - 为 22.x 更新 LLVM 依赖项。#104381 (Joshua Carp).
- 通过使用可移植的 POSIX
posix_openpt/grantpt/unlockpt,并移除仅限 Linux 的#if保护,使 embedded-client 和 PTY 描述符类能够在 macOS 和 FreeBSD 上构建。#104436 (Alexey Milovidov). - 将
librdkafka升级到 2.14.1 版本。#105222 (János Benjamin Antal).
向后不兼容的变更
IN运算符现在对Bool类型采用精确值语义:集合中只有0和1才会与Bool值匹配。此前,与Bool比较时,IN集合中大于255的数值会被错误地钳制为 true,因此SELECT CAST(1, 'Bool') IN (256)会返回 1。现在它会正确返回0。关闭了 #92980。#93115 (Ashrith Bandla) 。- H3 库已更新到 v4,这提高了长度、面积等度量计算的精度。此更改不向后兼容,因为新结果与之前不同。#100348 (Alexey Milovidov) 。
- 不再允许在
WITH表达式列表元素中将SELECT用作裸标识符。#101059 (Aruj Bansal) 。 - 此补丁更改了 Merge 表处理虚拟列的方式。如果底层表包含
_table或_database,则会从存储中读取这些列;否则,这些列会在读取步骤之后通过表达式步骤填充。#101742 (Mikhail Artemenko) 。 IN运算符现在也会拒绝复合类型 (Tuple、Array、Map) 内部发生的有损Decimal转换,使其行为与顶层标量比较保持一致。此前,精度检查仅对顶层标量值生效:例如,CAST('33.3', 'Decimal64(1)') IN (33.33)会正确返回0,但CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])会错误地返回1,因为有损转换发生在Array内部。现在这两种情况都会正确返回0。#101812 (Nihal Z. Miaji) 。- 将默认
http_max_fields从 1,000,000 下调到 1,000,并将http_max_field_name_size从 128 KB 下调到 4 KB,以限制 HTTP 连接在身份验证前的内存占用。新增了http_max_request_header_size和http_headers_read_timeout设置。依赖此前较高限制的用户可通过设置将其恢复。#103285 (Sema Checherinda) 。
新特性
- 新增自动落盘机制:达到内存限制时,哈希 join 和并行哈希 join 会自动转换为 grace hash join。此行为由
max_bytes_before_external_join控制。#97813 (János Benjamin Antal) 。 - 新增对 Arrow Flight SQL 的支持。#91170 (Yakov Olkhovskiy) 。
- 为
Paimon表引擎新增增量读取支持,使用 Keeper 支持的快照进度跟踪机制,包括通过paimon_target_snapshot_id定向读取快照增量,并扩展类型映射、分区裁剪和增量读取场景的测试覆盖范围。#93655 (XiaoBinMu). stem函数现已不再处于 Experimental 状态 (此前必须启用allow_experimental_nlp_functions设置) 。#102399 (Jimmy Aguilar Mena) 。现在,您可以使用stem函数,轻松对String、FixedString、Array([Fixed]String)、Nullable、LowCardinality和Const列中的所有单词/标记进行词干提取。#99137 (Jimmy Aguilar Mena) 。- 在兼容性设置
use_strict_insert_block_limits下,为max_insert_block_size_rows、max_insert_block_size_bytes、min_insert_block_size_rows、min_insert_block_size_bytes引入了 squashing 过程中的新行为。#94207 (Kirill Kopnev) 。 - 新增函数
arrayAutocorrelation(arr [, max_lag]),用于计算数值数组在各个滞后值下的归一化自相关。支持整数、Float 和 Decimal 数组类型。#94776 (Wenyu Chen) 。 - 新增 SQL 函数
obfuscateQuery。关闭 #98010。#98305 (Xuewei Wang) 。 - 新增支持将 Map 和 JSON/Object 类型用作字典属性。现在,字典可在 FLAT 和 HASHED 布局中存储和读取复杂类型,包括 Map(String, String)、Map(String, Array(String))、JSON 和 Nullable(JSON)。#98627 (yanglongwei).
- 新增了两个新的 MergeTree 设置——
replicated_fetches_min_part_level和replicated_fetches_min_part_level_timeout_seconds——允许副本跳过从其他副本拉取新近插入的 (未合并的) parts,从而在高负载摄取期间降低复制开销。#98625 (tanner-bruce). - 为使用 JSONAllPaths 且采用 bloom_filter、tokenbf_v1、ngrambf_v1 和 text (倒排) 索引类型的 JSON 列新增 MergeTree 跳过索引支持,从而能够根据每个粒度中存在的 JSON 路径集合跳过相应粒度。#98886 (Pavel Kruglov).
printf函数现已支持非常量格式字符串,因此可根据列值为每一行使用不同的格式模板。#98991 (Yash ).- 新增一个名为
commit_order的投影索引,用于按插入顺序重组数据。#99004 (Mikhail Artemenko) 。 - 新增
highlight函数,可将文本字符串中出现的搜索词用 HTML 标签包裹起来 (默认为<em>/</em>) 。支持 ASCII 不区分大小写匹配、自动合并重叠的匹配项,以及自定义开始/结束标签。#99131 (Peng). - 通过按归一化查询哈希实施配额,保护公网 ClickHouse 服务免遭滥用。1. 支持将
NORMALIZED_QUERY_HASH用作配额键类型——为每个唯一的归一化查询单独划分配额桶,因此CREATE QUOTA q KEYED BY normalized_query_hash会分别跟踪每条不同的查询。2. 支持将QUERIES_PER_NORMALIZED_HASH用作配额资源类型——限制在一个时间间隔内任意单条归一化查询的最大执行次数,因此MAX queries_per_normalized_hash = 100可防止任何单一查询模式的运行次数超过 100 次。#99586 (Alexey Milovidov). - 现在,用户可以使用
NATURAL JOIN语法编写 join 查询,该语法会自动基于所有同名列进行匹配,并在结果中对这些列去重。#99840 (Peter Nguyen). - 支持将
SET TIME ZONE 'tz'用作SET session_timezone的别名。#99883 (phulv94). - 在 Web UI (
play.html) 中新增了对参数化查询的支持:系统会检测诸如{name:Type}这样的查询参数,并显示可用于填写其值的输入字段。#100041 (Alexey Milovidov) 。 - 支持在
FROM中将 SQL 标准VALUES子句作为表表达式使用,例如SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val)。#100143 (Desel72). - 为
EXTRACToperator 新增与 PostgreSQL 兼容的单位:EPOCH、DOW、DOY、ISODOW、ISOYEAR、WEEK、CENTURY、DECADE、MILLENNIUM。同时修复了此前会报错的EXTRACT(WEEK FROM date)。#100274 (Alexey Milovidov). - 新增了对带有
TO范围限定符的 SQL 标准复合时间间隔字面量的支持,例如INTERVAL '1:30' HOUR TO MINUTE。在内部,它会被分解为多个时间间隔之和。#100453 (Desel72). - 为 HTTP 连接池套接字的内核 TCP 接收和发送缓冲区内存 (
sk_rmem_alloc,sk_wmem_alloc) 新增异步指标,并按每个连接组以 p50/p75/p90/p95 分位数和总量形式上报。#100575 (Sema Checherinda). - 为 ClickHouse Keeper 新增了 jemalloc profiling web UI,可通过 HTTP 控制端口上的
/jemalloc访问。 #100606 (murphy-4o). - 新增命令
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x',适用于 ordered 模式和 unordered 模式。#100709 (Bharat Nallan) 。 - 新增函数
JSONAllValues,可将JSON列中的所有值以Array(String)形式返回;这些值会按路径名称排序,并以文本形式序列化。新增对JSON列上JSONAllValues表达式的文本索引支持。当在JSONAllValues(json_column)上创建文本索引时,该索引会自动用于过滤针对JSON子列的查询 (例如json_column.key1 = 'value') 。#100730 (Anton Popov). - 新增设置
input_format_column_name_matching_mode,允许为输入格式采用不同的大小写匹配方式。#99346 (manerone) 。 - 为
clickhouse-keeper-client新增watch命令,并为get、exists和ls命令添加 watch 支持。 #100834 (Den Kalantaevskii). - 为 ClickHouse Keeper 新增了
getChildrenRecursive(ListRecursive) 请求,并为clickhouse-keeper-client新增了lsr命令。此更改关闭了 #99916。#100998 (Konstantin Vedernikov) 。 - 新增函数
arrayTranspose,可接受二维数组 (矩阵) 并对其进行转置:SELECT arrayTranspose([[1, 2, 3], [4, 5, 6]])。#101214 (Vitaly Baranov) 。 auto_statistics_types mergetree设置的默认值为'minmax, uniq'—— 系统会为新表中所有合适的列自动创建 minmax 和 uniq 统计信息 -materialize_statistics_on_insert的默认值为 false —— 现在统计信息会在合并期间构建,而不是在写入时构建,从而降低写入开销。使用SET materialize_statistics_on_insert = 1可恢复旧行为。#101275 (Han Fei).- 为 materialized view 依赖链新增
prefer_dependency_replica刷新设置,以减少跨副本复制延迟导致的数据缺失。#101591 (Seva Potapov) 。 - 新增
hasPhrase(别名matchPhrase) 函数,用于短语搜索 (连续的标记序列) 。搜索采用穷举方式,也就是说,文本索引暂未支持该功能。#101997 (Elmi Ahmadov) 。 - 新增
s3_read_request_duration_microseconds和s3_read_request_bytes直方图指标,用于观测 S3 GET 请求连接的存续时间以及消耗的字节数,可在system.histogram_metrics和 Prometheus 端点中查看。 #102058 (Sema Checherinda). - 现在可以使用
+运算符将Date和Date32值与Time和Time64值相加,得到DateTime或DateTime64结果。例如,SELECT toDate('2024-01-15') + toTime('14:30:25')会返回2024-01-15 14:30:25。结果会按照会话时区计算,超出范围的结果则根据date_time_overflow_behavior设置处理。关闭 #95914。#102421 (Nihal Z. Miaji). - 文本索引现已正式可用,并且无论
compatibility设置如何都会保持启用状态,从而避免在备份恢复期间或以兼容模式运行时被意外禁用。#101518 (Nikita Fomichev) 。
Experimental 功能
- 为 Iceberg 表新增
ALTER TABLE ... EXECUTE remove_orphan_files,用于识别并从对象存储中删除未被引用的文件。#99127 (murphy-4o). - 新增
query_plan_optimize_join_order_randomize设置,用于将 join 重排序所依据的统计信息随机化,便于测试。#100643 (Vladimir Cherkasov). - 为 ClickHouse 新增 AI 函数支持,允许用户通过 SQL 调用 OpenAI 和 Anthropic 端点。
aiGenerate是首个此类函数。#100831 (George Larionov). - 新增 AI 函数:
aiClassify、aiExtract和aiTranslate,用于在 ClickHouse 中调用 LLM API。#100832 (George Larionov). - 新增
system.histogram_metric_log,这是一个新的系统表,会定期对所有直方图指标创建快照 (例如 S3/Azure 延迟、Keeper 请求处理各阶段的耗时) 。此外,system.histogram_metrics的value列改为Float64,因为这样更灵活,也更兼容 Prometheus 数据模型。#103046 (Miсhael Stetsyuk). 该表结构很可能会在未来的发行版中发生变化。
性能提升
- ClickHouse 现已能够在
SELECT查询中基于最小/最大统计信息剪枝整个数据分区片段。#94140 (zoomxi). - 减少已完成变更的 ReplicatedMergeTree 表在执行只读操作时的锁竞争。#95771 (Eduard Karacharov).
- 读取投影时遵循
optimize_read_in_order。修复 #89453。#95885 (Andrey Zvonov) 。 - 对 Hash Join 和 Concurrent Hash Join 进行了一些小优化。#96663 (Yarik Briukhovetskyi) 。
- 通过在输入数据几乎全为唯一值时禁用
LowCardinality列优化,优化DISTINCT转换。#97113 (Nihal Z. Miaji) 。 - 来自 #97723 的
LIKE查询性能优化:现在这类查询可以使用文本索引。#98149 (Elmi Ahmadov) 。 - 向量化数学函数 (
exp、log、sigmoid、tanh) 现已在 AArch64 (使用 NEON/SVE) 以及 FreeBSD/Darwin 上获得加速;此前这些平台使用的是较慢的标量回退实现。 #98230 (Raúl Marín). - 对于按
MergeTree主键列进行过滤、且使用字面字符串正则表达式交替分支 (例如^(abc-1|abc-2)) 的查询,如今只要这些备选分支具有共同前缀,就可以利用主键裁剪。#98988 (Yash ). - 将
ORDER BY ... LIMIT的 top-k 动态过滤扩展为支持Nullable、String和COLLATE类型。#99033 (murphy-4o) 。 - 对键值范围较小的
Int32和Int64键,使用直接索引哈希表来加速哈希连接。 #99275 (Hechem Selmi). - 使用单个字典的
LowCardinality列在非连续查询场景下速度更快。#99285 (Ivan Babrou). - 通过对内部循环去虚拟化,加快
Float64列上var*Stable和stddev*Stable函数的执行速度。注意:这会启用编译器优化 (FMA/寄存器) ,从而在 ULP 级别改变浮点结果。#99460 (Riyane El Qoqui) 。 - 对 32/64 字节的输入使用优化后的 Firedancer base58 编码 (对
base58Encode自动启用) 。如果解码结果为 32/64 字节,则可使用优化后的 base58 解码 (需显式指定,如base58Decode('...', 32)或类似形式) 。#99461 (Joanna Hulboj) 。 - 启用基于链接器节的优化 (
-ffunction-sections、-fdata-sections、--icf=all) ,以减小可执行文件体积并提高指令缓存利用率。#99474 (Alexey Milovidov) 。 - 修复了在多核机器上,带聚合的短查询出现负向扩缩容的问题。当查询读取的标记较少时,管道在聚合后将不再扩展到
max_threads,从而避免了大部分流几乎为空所带来的额外开销。#99493 (Alexey Milovidov). - 通过正确选择读取任务大小,利用并行副本提升查询性能。#99801 (Nikita Taranov).
- 允许在通过用户态页缓存读取远程文件时执行预取。#99919 (Alexey Milovidov) 。
- 在枚举子列时,避免了对 String
.size子列的不必要计算。#99941 (Pavel Kruglov) 。 - 在酒店网络环境下使用拥有大量副本的集群时,减少 clickhouse-client 进度条的抖动。#100145 (Alexey Milovidov) 。
- 当启用页缓存时,在
clickhouse-local中启动MemoryWorker,以便真正使用用户态页缓存。#100306 (Alexey Milovidov) 。 - 将
LIMIT子句下推至UNION ALL中,以优化查询。#100364 (Alexey Milovidov) 。 - 为
ORDER BY中String和FixedString列的比较新增 JIT 编译支持,使以字符串为主的排序键在合并阶段的排序性能提升了 6–17%。与 @lgbo-ustc 共同完成。#100577 (Raúl Marín). - 当启用
read_in_order_use_virtual_row并配合新的read_in_order_use_virtual_row_per_block设置时,现在每次从MergeTree读取完一个块后都会输出虚拟行边界信息,使merge能够在流处理中途重新调整 source 的优先级,适用于其数据被WHERE/PREWHERE/JOIN完全过滤掉的 parts。关闭 #99945。#100603 (Vladimir Cherkasov) 。 - 通过以兼容 dragonbox 的舍入方式扩展
itoa的快速路径,加快了大整数值的 Float 到 String 转换。#100649 (Raúl Marín). - 将
dragonbox替换为zmij,使 Float 到 String 的转换速度提高 1.5 倍至 3 倍。#100650 (Raúl Marín) 。 - 通过以 Barrett reduction 替代软件除法并展开转换循环,加快了
Int128/UInt128到字符串的转换。#100671 (Raúl Marín) 。 - 避免在
uniqExact并行合并时生成冗余线程。#100686 (Jiebin Sun) 。 - 为
uniqExact增加批次并行合并支持。#100687 (Jiebin Sun) 。 - 对于通过并行副本执行、且底层为
MergeTree表的简单视图查询,并行化效果更佳。#100815 (Igor Nikonov) 。 - 实现了在
parallel_replicas_allow_view_over_mergetree=1时对简单视图启用并行副本的支持 (包括基于MergeTree表、符合条件的UNION ALL视图) 。这样可以并行化视图的外层查询,而不是内层查询,从而提升跨节点的查询并行度。#100958 (Igor Nikonov) 。 - 当查询计划中存在带有
IN的过滤器时,优化full_sorting_merge按主键顺序读取的性能。 #101261 (Nikita Taranov). - 通过缓存采样设置而非遍历整个 memory tracker 层级结构,优化内存分配/释放。#101267 (Azat Khuzhin).
- 修复在
deduplicate_insert = 'enable'(自 26.2 起默认为启用) 时显著的 INSERT 性能下降问题:将数据哈希计算从 squashing 阶段推迟到 sink,并通过updateHashWithValueRange按批次对列进行哈希计算,使 22 列、500 万行数据的开销从约 2.5 秒降至约 0.5 秒。#101494 (Sema Checherinda) 。 - 通过使用
try_lock避免为无竞争获取计时,并移除持有时间测量,降低锁分析的额外开销。#101502 (Antonio Andelic) 。 - 将
arrayDotProduct中手写的 AVX-512 内建函数替换为与平台无关、可自动向量化的循环,并新增对 AVX2 和 ARM NEON 的支持。#101571 (Peng). - 当值以转义字符串形式传入时 (例如
'{\'key\':1}') ,优化INSERT VALUES中Map、Array和Tuple列的性能,避免不必要地回退到 SQL 表达式解析器。#102119 (Joanna Hulboj) 。 - 修复了
RabbitMQ表引擎 CPU 占用过高的问题。#102711 (Jaap Elst) 。 - JOIN 顺序优化器现在可以根据现有 JOIN 条件推断传递性的等值 JOIN 谓词。例如,给定
A.x = B.x AND B.x = C.x,就能识别出等价关系A.x = C.x,从而让优化器可以考虑在通过传递关系相连的表之间直接执行 JOIN。这可以提升星型和雪花 schema 的 plan 质量,因为在这类 schema 中,维度表通过共享的事实表相连。该功能由新的enable_join_transitive_predicates设置控制 (默认关闭) 。#98479 (Alexander Gololobov) 。 - 通过预先并行取消合并操作,优化
TRUNCATE DATABASE TABLES LIKE。#98597 (Shaohua Wang) 。 - 为乘法增加单调性支持,从而使
key * constant表达式也能进行主键剪枝。#98983 (Amos Bird). - 缓存字典在
hasKeys中不再使用独占锁;改为在缓存读取时使用共享锁,从而减少锁竞争。#100796 (liuguangliang). - 在查询树中内联 VIEW 子查询,从而可对 VIEW 应用更多优化。#100830 (Dmitry Novik) 。
- 优化服务器启动时的缓存加载。#101500 (Kseniia Sumarokova) 。
- 当谓词选择性足够高时,为带有 FINAL 的 ReplacingMergeTree 实现延迟列物化。#101647 (Nikolai Kochetov) 。
- 重新启用
optimize_rewrite_array_exists_to_has优化 (自 23.10 起默认关闭) 。它会将arrayExists(x -> x = elem, arr)重写为快得多的has(arr, elem);现在,当数组元素类型与elem不兼容、无法用于has时 (例如Date与String) ,会正确跳过此重写,因此此前会报错的查询现在仍可正常工作。关闭了 #71431。#100944 (Alexey Milovidov) 。
改进
- 改进了 EXPLAIN PLAN pretty=1 的输出:打印顶层查询的输出列,显示 join 关系的标签/符号以及预估结果行数和本地性,并包含 join/source 步骤中每一步的输出列。这些变更涵盖了 #98117 中的 Information Deficit 部分。#99462 (Kirill Kopnev) 。
- 新增 MergeTree 表设置
share_nested_offsets(默认值为true) 。当其设为false时,带点号名称的 Array 列 (例如n.a、n.b) 会被视为彼此独立的列,而不再按旧版Nested语义共享偏移量文件,也不再校验数组大小是否相等。#98416 (Amos Bird) 。 - 现在,用户可以在 users.xml/yaml 配置中指定多种身份验证方法 (SQL 中一直都支持) 。#91998 (Flip-Liquid).
- 自动重新加载启用 TLS 的 Raft 节点间连接。#93455 (Evgeny).
- 将
cast_keep_nullable扩展为支持 Dynamic/JSON 类型。启用后,对可为 Nullable 的类型中的 NULL 进行类型转换时会返回 NULL;否则会抛出CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN错误。#96504 (Seva Potapov) 。 - 通过引入对象池,降低了内部数据结构 (
ISerialization对象) 的内存占用。#96563 (Nikita Mikhaylov) 。 - 为 keeper-client 的 XML 配置新增对
password和identity字段的支持。#96800 (Grigorii Sokolik) 。 - 改进对 Unity Catalog 的
Iceberg写入支持。#98162 (Konstantin Vedernikov). - 新增设置
finalize_projection_parts_synchronously,支持在 INSERT 期间同步完成 projection parts 的最终化;默认仍保留现有的异步行为,同时可降低具有大量 projections 的表的峰值内存占用。#98228 (Amos Bird) 。 - 向
system.part_log添加projections_duration_ms列,用于记录各投影合并/重建的耗时 (以毫秒为单位) 。#98292 (Amos Bird) 。 - 改进了在 clickhouse-client 中通过 KILL QUERY 和取消查询 (Ctrl+C) 来取消使用 ExpressionTransform 和 NumbersRangedSource 的查询。#98908 (Roman Vasin).
- 将硬编码的
source_table_engines列表替换为通过StorageFactory::getAllStorages()进行运行时查找。这为一些此前缺失的表引擎补充了访问检查,并关闭了 #71544。#98984 (pufit) 。 - 新增一个设置,用于控制 Variant 和 Dynamic 的类型不匹配处理方式 (抛出异常或返回 NULL) 。#99085 (Bharat Nallan).
- 改进
Iceberg与 Spark 的兼容性:修复因混用存储路径和元数据路径而导致的路径处理不一致问题;强制Iceberg表写入的表位置必须为 URL 或绝对路径;由于某些 ClickHouse 读取器在遍历后不支持按字节计数,因此为Azure中的文件大小统计添加回退机制;以与 Spark 兼容的方式处理version-hint.txt;引入类型级抽象,使今后更不容易混淆不同的路径类型;为Azure和Local添加测试,以验证无需中间上传/下载即可实现跨引擎互操作;修复 position delete 的使用问题,此前它依赖基于路径推断的启发式方法,而这种做法在这里并不适用。 #99163 (Daniil Ivanik). #100420 (Daniil Ivanik). - 修复了在 https://github.com/ClickHouse/ClickHouse/pull/92844 中引入的
IPartitionStrategy::cached_result中可能存在的竞态条件。#99400 (Arthur Passos) 。 - 现在,用户可以在 Arrow 格式中写入 ClickHouse 的 Interval 数据类型。#99519 (Peter Nguyen) 。
- 新增了在
Arrow和Parquet格式中导入和导出UUID数据类型的原生支持。现在,用户无需手动将其转换为字符串或采用其他变通方法,即可在 ClickHouse 与其他数据工具之间直接查询和传输 UUID 数据。支持自动推断顶层 UUID 的逻辑类型,并支持为嵌套 UUID 显式提供 schema 提示。#99521 (Ivan). - 支持对象存储上的
7z归档文件。解决了 #70968。#99600 (Alexey Milovidov) 。 - 添加
ObjectStorageListedObjects、ObjectStorageGlobFilteredObjects、ObjectStoragePredicateFilteredObjects和ObjectStorageReadObjectsProfileEvents,用于查看对象存储 (S3、Azure等) 文件列举和读取管道的内部信息。#99778 (Sema Checherinda) 。 - 修复了在查询并非所有底层分布式/远程表都包含的列时,
merge表函数因UNKNOWN_IDENTIFIER错误而失败的问题。#99833 (Alexey Milovidov). - 现在,我们将 commit 时间计入 ReplicatedMergeTree 的变更总执行时间指标中。该时间在 #96376 之后丢失了。#99936 (alesapin).
- 为
MetadataStorageFromDisk中待移除的 blob 对象添加预写日志,在删除对象时提高元数据与远程对象存储之间的持久性和一致性。#100019 (Maksim Kita) 。 - 在嵌入式客户端 (SSH 和 WebSocket 协议) 中禁用 AI SQL 生成 (
??命令) ,以防止访问服务器环境变量。#100290 (Alexey Milovidov) 。 - 调整通过 catalog 进行 Iceberg 插入的接口。废弃以下设置:
storage_catalog_type、storage_aws_access_key_id等。#100334 (Konstantin Vedernikov). - 粘贴到 clickhouse-client 时,将制表符转换为 4 个空格。修复了 #100405。#100416 (Raúl Marín) 。
- 当
show_data_lake_catalogs_in_system_tables被禁用时,避免为了“Maybe you meant …”表提示而扫描整个远程数据湖目录。#100452 (Alsu Giliazova) 。 - 在分区裁剪后再应用
distributed_index_analysis_min_indexes_bytes_to_activate。#100477 (Azat Khuzhin) 。 - 修复在使用空 IN/NOT IN 子句时,Parquet bloom 过滤器下推导致的断言失败。#100543 (zoomxi).
- MinMax 列统计信息现在将最小值和最大值存储为 Field (带类型) ,而非 Float64。序列化格式除这些值外,还会包含列的类型名称。统计信息文件版本已升级到 V2;由旧版本写入的文件需要重新物化 (ALTER TABLE … MATERIALIZE STATISTICS ALL) 。修复 #53140。#100605 (Han Fei) 。
- 更新
cppkafka,包含了消费者关闭死锁问题的修复。#100612 (Azat Khuzhin) 。 - 用于解析 Iceberg 中数据文件的对象信息现在包含从 manifest 文件中解析得到的文件行数以及以字节为单位的文件大小。#100645 (Daniil Ivanik).
- 新增
use_separate_cache_arena配置参数,以便控制是否将缓存内存分配区分离。#100664 (Seva Potapov) 。 - 新增原生支持将 Apache Arrow 的
StringView和BinaryView数据类型导入到 ClickHouseString列中,提升了基于 Arrow 的摄取兼容性。#100762 (Ivan). - 如果在运行时更改了配置文件,一些 Keeper server 设置现在支持热重载:max_requests_batch_size、max_requests_batch_bytes_size、max_request_size、quorum_reads。#100773 (Michael Kolupaev) 。
- 在 release build 中增加
MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytes这两个 profile events 的计数。#100899 (Pavel Kruglov) 。 - Cgroupv2 内存跟踪现在会将内核内存中的
slab_reclaimable排除在外,从而能更准确地衡量不可回收的内存使用量。#100901 (Antonio Andelic) 。 use_partition_pruning = 0现在不仅会禁用基于分区键的剪枝,还会禁用MinMax索引剪枝以及针对分区键列的计数优化。#100904 (Nihal Z. Miaji) 。- 在
EXPLAIN [PLAN]中,pretty=1现在会以更易于阅读的格式输出 expression。#100927 (Kirill Kopnev) 。 accurateCastOrNull和accurateCastOrDefault现已支持Tuple目标类型,包括元素为Nullable的嵌套Tuples。此前,这些函数会拒绝Tuple目标类型,因为Tuple不能位于Nullable内。已关闭 #100820。#100942 (Nihal Z. Miaji) 。- 修复了在浅色与深色主题间切换时 Play UI 中图表重复显示的问题。#101058 (Alexey Milovidov).
- 将 chdig 更新到 v26.3.1 (perfetto UI,为 CPU/内存/合并/查询摘要添加迷你图、system.warnings,以及日志中的正则搜索) 。#101092 (Azat Khuzhin) 。将 chdig 更新到 v26.4.3 (perfetto 改进、修复通过 pastila.nl 共享的问题、火焰图差异对比、实时修改设置) 。#103145 (Azat Khuzhin) 。
- 现在,
WITH子句在SELECT查询前可以带尾随逗号。#101093 (Aruj Bansal) 。 - 新增
compress_per_column_in_compact_partsMergeTree setting,用于控制 Compact parts 内压缩块的组织方式。当为true(默认值,保持当前行为) 时,每列都会开启一个新的压缩块,从而支持选择性解压。当为false时,一个粒度内的所有列都会打包到同一个压缩块中,从而为始终读取全部列的 workloads 提升压缩率和读取性能。#101114 (Amos Bird) 。 - 仅在鼠标悬停于表名上时,才在 Play UI 中显示表信息气泡,而不是在悬停于整行时显示。#101118 (Alexey Milovidov).
- 为 Play UI 侧边栏添加引擎专属图标,并优化表列表的使用体验。#101134 (Alexey Milovidov).
- 支持
Arrow、ArrowStream、ORC和旧版Parquet格式中的Nullable(Tuple)。 #101272 (Nihal Z. Miaji). - 在 web UI (play.html) 中将 TOTALS 行显示在表格页脚。#101286 (Alexey Milovidov) 。
- 在 web UI (
play.html) 中支持多查询模式:可一次运行多个查询,支持并行执行类似SELECT的查询,并分别显示每个查询的结果。#101290 (Alexey Milovidov) 。 - 修复将结果表重构为 Web 组件后,play.html web UI 中列宽调整失效的问题。#101295 (Alexey Milovidov).
- 支持按时间间隔限制在 MEMORY_LIMIT_EXCEEDED 时 jemalloc profile 的刷写次数。#101396 (Azat Khuzhin) 。
- 新增 Keeper 设置
nuraft_streaming_mode(默认值为false) 、nuraft_max_log_gap_in_stream和nuraft_max_bytes_in_flight_in_stream。已关闭 #90743。#101427 (Kseniia Sumarokova) 。 - 新增了异步指标
CGroupMemoryUsedWithoutPageCache,用于报告排除了内核 OS page cache 和 ClickHouse 用户态页缓存后的 cgroup 内存使用量,对应于MemoryResidentWithoutPageCache。同时还明确了CGroupMemoryUsed指标的说明。#101513 (Francesco Ciocchetti). - 在解析器层面为 SQL 标准
OVERLAY函数语法添加语法糖。overlay函数已存在;此次新增了对基于关键字形式的支持,使用PLACING、FROM和FOR作为分隔符。#101681 (Desel72). - 为系统表
information_schema.tables新增了列别名INDEX_LENGTH,与该表中现有的大写别名保持一致。#101705 (Robert Schulze) 。 - 系统表
information_schema.tables现在会忽略非活跃的表 parts。这使显示的表大小数值更接近实际。#101706 (Robert Schulze) 。 ngrams函数现在会拒绝无效的 ngram 长度。示例:SELECT ngrams('abc', 0)现在会报错。#101922 (Robert Schulze) 。- 对 #91820 和 #90837 的后续改进:从错误信息中滤除不受支持的算法;在 FIPS 构建中运行 FIPS 专用测试。#102067 (Mikhail f. Shiryaev) 。
- 将 Web UI (
play.html) 中的单元格高度限制为最多三行,并支持点击展开。#102154 (Alexey Milovidov). - 新增了一个选项,可强制 S3 端点使用 (virtual/path) 风格。解决了 #82019;#76007,是 https://github.com/ClickHouse/ClickHouse/pull/83168 的延续。 #102378 (Konstantin Vedernikov).
- 现在,
restore_replace_external_engines_to_null设置也会跳过恢复使用外部引擎 (例如DataLakeCatalog、MySQL、PostgreSQL、S3) 的数据库,而不再失败或发起外部连接。#102400 (Nikita Fomichev) 。 - 通过
HINT模式为hasPhrase函数新增文本索引分析支持。#102438 (Elmi Ahmadov) 。 - 在 ColumnDependency 中将 STATISTICS 设为只读,以修复执行 MATERIALIZE STATISTICS ALL 期间出现的 LOGICAL_ERROR。#102627 (Konstantin Bogdanov) 。
- 在 keeper-as-server 模式下创建并填充
system.asynchronous_metric_log。#102664 (Miсhael Stetsyuk) 。 - 新增
default_system_log_flush_policy.skip_alias_columns配置选项,允许在系统日志表中省略 ALIAS 列,从而修复以 S3 为后端且不接受 ALIAS 列的系统日志问题。#102669 (Miсhael Stetsyuk) 。 - 不要为系统表启用自动统计信息,因为它们几乎没有机会用到这些统计信息。#102862 (Han Fei).
- 为 LIKE 优化增加对
array分词器的支持。#102880 (Elmi Ahmadov) 。 - 即使在正式版构建中,也会发送 MemoryAllocatedWithoutCheck。#103064 (Azat Khuzhin) 。
- 在 system.stack_trace 中提供每个线程的 untracked_memory 信息。#103065 (Azat Khuzhin) 。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了因 Lazy materialization 返回多余列而导致的
Block structure mismatch in stream错误。修复 #95191。#96682 (Nikolai Kochetov) 。 - 修复了使用
ON CLUSTER的数据脱敏策略查询中的逻辑错误。#97594 (Bharat Nallan) 。 - 修复了在 GCS 上使用 Unity Catalog 时的一个 bug。#98456 (Melvyn Peignon) 。
DataLakeCatalog现在在验证auth_header设置时,会遵循服务器上的http_forbid_headers配置。 #98827 (Michael Anastasakis).- 修复 S3 花括号展开通配符中的 N+1
HeadObject调用问题。#99219 (Konstantin Bogdanov). - 当引擎本身也支持设置时,验证 CREATE 查询中的设置变更。#99279 (János Benjamin Antal) 。
- 修复了以下问题:当表中包含一个表达式依赖于 EPHEMERAL 列的 MATERIALIZED 列时,
ALTER TABLE UPDATE/DELETE会因Missing columns错误而失败。#99281 (Yash ). - JDBC、ODBC 和 NATS 连接字符串中的凭据现在会在查询日志和
SHOW CREATE输出中被屏蔽,从而避免敏感信息意外泄露。对于 URI 样式的连接字符串 (例如{scheme}://{user}:{password}@{host}) ,现在仅屏蔽密码部分,其余内容仍然可见,以便于调试。nats_token设置现在也会被屏蔽。#99344 (János Benjamin Antal) 。 - 修复了 parseDateTimeBestEffort 在 DD-month-YYYY 格式中将以月份前缀开头的单词错误解析的问题。关闭 #99345。#99350 (Pavel Kruglov) 。
- 修复了在非 analyzer 下会忽略 TABLE_UUID_MISMATCH 的问题。#99380 (Azat Khuzhin) 。
- 修复了一个问题:在同一请求中与
compatibility一起发送显式设置时,如果其值与服务器默认值相同,这些设置可能会被静默忽略。#99402 (Raufs Dunamalijevs) 。 - 修复了 hive 分区路径中带有前导零的数字导致报错的问题。修复了 #98801。#99458 (Yarik Briukhovetskyi) 。
- 修复在表被删除的同时仍有读取查询在运行时的 heap-use-after-free 问题 (过去 90 天内在 CI 中出现 19 次) 。#99483 (Alexey Milovidov) 。
- 修复了 Keeper 中的一个 bug:如果同一 server 上另一个不相关的 session 恰好在错误的时机被关闭,读取请求可能会卡住 (导致 session 超时) 。#99484 (Michael Kolupaev).
- 在应用补丁前验证列结构。#99531 (Seva Potapov) 。
- 修复在包含
Dynamic列的表执行合并期间,快速切换SYSTEM STOP/START MERGES时出现的垂直合并rows_sources断言失败问题。#99532 (Alexey Milovidov). - 修复了
toWeek()的分区裁剪错误:在按toYYYYMM(date)分区的表上,带有WHERE toWeek(date, mode) = N的查询在第 49–52 周会返回空结果。#99542 (Takumi Hara). - 修复了在处理由 JOIN 生成的未引用行时,对 ColumnReplicated 进行操作的函数中出现的异常。#99564 (Hechem Selmi) 。
- 修复
CLEAR COLUMN不会重建 projections,也不会重新计算依赖被清除列的 materialized 列的问题,否则可能在后续合并期间导致异常或数据损坏。#99565 (Desel72) 。 - 修复了
ConditionSelectivityEstimator中的一个异常 (Bad get: has Tuple, actual type String) :当查询在已启用use_statistics且具有列统计信息的表上,对单个标量查询参数使用 IN 时 (例如WHERE col IN ({p:String})) ,会触发该异常。#99614 (Ilya Yatsishin). - 带有未知投影的分片不应被标记为永久丢失。#99623 (Sema Checherinda) 。
- 修复了一个罕见的逻辑错误异常:并发执行
SYSTEM STOP MERGES和SYSTEM START MERGES时,可能会在 vertical merge 期间抛出该异常。#99628 (Desel72). - 修复
injectRequiredColumns中的悬空引用,避免在合并期间导致崩溃。#99679 (Tuan Pham Anh). - 修复了 Avro 格式读取器在读取超出目标列类型可表示范围的数值时的未定义行为。现在发生溢出时,查询会直接失败,而不再静默产生错误的值。 #99697 (asyablue22).
- 修复了
executable表函数参数中 shell 风格引号的解析错误。#99794 (Nikita Semenov) 。 - 修复了
NativeReader在反序列化行数不匹配的 Native 格式 stream 时误报abort的问题:将其从LOGICAL_ERROR改为INCORRECT_DATA,使该错误按数据错误处理,而不会在 sanitizer/debug 构建中触发abort()。#99822 (Rahul Nair). - 修复当二进制流中的序列化类型为
DETACHED时,Tuple列在反序列化过程中导致进程中止的问题。#99823 (Rahul Nair). - 修复了在文件系统缓存动态调整大小期间,由于 SLRU 子队列提升中的竞态条件而误触发
LOGICAL_ERROR异常的问题。#99850 (Alexey Milovidov) 。 - 修复 async insert 查询在
query_log和客户端输出中将written_rows、read_rows和result_rows误报为 0 的问题。#99879 (Sema Checherinda) 。 - 修复了
KILL QUERY中的异常 “Bad cast from type X to Y”:当针对系统表的内部查询返回由ColumnConst包装的列时,会出现该问题。#99881 (Alexey Milovidov) 。 - 修复
untuple参数中关联子查询的逻辑错误。#99917 (Vladimir Cherkasov) 。 - 修复了调用
right、rightUTF8或其他子串函数时传入长度为 INT64_MIN (-9223372036854775808) 的值所引发的异常;此前由于整数溢出,会导致未定义行为。现在,这些函数会正确报告 ARGUMENT_OUT_OF_BOUND 错误。#99934 (Jimmy Aguilar Mena) 。 - 现在 ClickHouse 应该能够正确处理 Spark 风格的表 (即每个文件都有完整的绝对路径,或相对于公共表路径的相对路径) 。修复了 #92348。#99935 (alesapin) 。
- 修复以下问题:当
ALTER语句本身也带有SETTINGS时,对于包含带有SETTINGS的嵌套子查询的ALTER TABLE ... MODIFY QUERY,会抛出“AST 格式不一致”异常。#99938 (Nikita Mikhaylov) 。 - 由于疑似出现性能回退,撤销 #97114 “将 join step 的行数估算提前到检查是否只有 1 个子节点之前”。#99957 (Alexander Gololobov) 。
- 修复了一个 bug:如果对文件发起的 HEAD 请求响应中缺少
Content-Length请求头 (例如由于 GCS 中的解压转码) ,ClickHouse 可能会跳过这些文件。#99971 (Yarik Briukhovetskyi). - 修复在将
NumericIndexedVector聚合状态与偶数整数常量相乘时发生的断言失败问题 (在 debug 构建中会抛出异常,在 release 构建中会产生错误结果) ;其原因是pointwiseAddInplace中带别名的 Roaring bitmap 发生了自异或。#99976 (Desel72). - 防止在链式
JOIN USING的旧版过滤器下推中,因JOIN转换后键类型发生变化而触发Unexpected return type异常。#99999 (Alexey Milovidov) 。 - 修复了在未解析的表函数参数中使用标量子查询时出现的
LOGICAL_ERROR异常“表表达式的节点类型异常……实际为 IDENTIFIER”,例如SELECT * FROM remote('localhost', view(SELECT 2 AS x), concat(x, (SELECT 1)))。#100014 (Alexey Milovidov) 。 - 修复了这样一个问题:当数据后的下一行带有尾随 SQL 注释 (
--或/* */) 时,INSERT配合VALUES会失败。现在会跳过该注释,而不会将其解析为另一行。#100016 (Pratima Patel) 。 - 修复了
arrayRemove在比较包含 NULL 值的元组时出现异常的问题。#100017 (Alexey Milovidov) 。 - 修复
system.asynchronous_inserts中的跨用户数据泄露问题:任何对该表具有SELECT权限的用户都可能看到其他用户待处理的异步 insert 条目。现在,这些条目会按当前用户进行过滤,除非该用户拥有SHOW_USERS权限。#100024 (Shaohua Wang) 。 - 修复了将 Time64 转换为 UInt64 时,值可能被限制在 24 小时内的问题。#100025 (Yarik Briukhovetskyi) 。
- 修复了以下问题:当 CREATE DICTIONARY 的定义中包含带有不存在函数的列表值时,本地服务器会崩溃。#100036 (Yakov Olkhovskiy) 。
- 修复了
CSV、MsgPack格式无法正确解析Nullable(Tuple)的问题。关闭 #99753。#100038 (Nihal Z. Miaji) 。 - 修复在将带有 WITH 函数表达式别名 (例如
tuple(...)) 作为IN右侧使用时,CREATE VIEW因UNKNOWN_IDENTIFIER而失败的问题。#100042 (Peng) 。 - 修复时间序列聚合函数 (例如
timeSeriesResampleToGridWithStaleness) 在并行副本下配合initializeAggregation或AggregatingMergeTree使用时,会因报错ILLEGAL_TYPE_OF_ARGUMENT而失败的问题。#100053 (Alexey Milovidov) 。 - 修正 NumericIndexedVectorDataBSI 内部负值处理的问题。 #100086 (Daniil Ivanik).
- 修复
accurateCastOrDefault和to*OrDefault函数在输入为常量时无法保留 Const 列类型的问题。#100132 (Alexey Milovidov) 。 - 省略的
LowCardinality(Nullable(T))类型查询参数现在会像Nullable(T)一样,正确默认使用 NULL。#100144 (Denys Melnyk) 。 - 修复
StringSearcher.h中使用未初始化值的问题。#100225 (Konstantin Bogdanov) 。 - 允许通过 Ctrl+C 取消标量子查询及其他分析阶段的管道。此前,在长时间运行的标量子查询执行期间按下 Ctrl+C 不会有任何效果,必须等到子查询完成后才行。同时还修复了进度条和 JSON 统计信息,使其能够在
clickhouse-client和clickhouse-local中正确报告标量子查询执行期间读取的行数。与 @YjyJeff 共同完成。#100230 (Raúl Marín) 。 - 修复了涉及
Dynamic列、交叉连接和运行时过滤器的查询中出现的LOGICAL_ERROR异常。该问题的原因是,ColumnVariant::filter在hasOnlyNulls优化路径中共享了 Variant 列指针,而不是对其进行克隆。关闭 https://github.com/ClickHouse/ClickHouse/pull/100147。 #100234 (Pavel Kruglov). - 修复了 Variant 数组的一个 bug:调用
arrayFirst/arrayLast函数时,可能会错误地重新解释数据类型。例如,之前当实际底层的 Variant 类型为Date时,Array(Variant(Date, Bool))会被转换为Bool。#100255 (timothygk) 。 - 函数有一些小幅调整:h3 函数现在能更好地校验边界;readWKB 会检查大小限制 (新增设置
max_wkb_geometry_elements) ;随机生成器函数会限制计算中的最大迭代次数。这是对 #93543 的后续修复。#100270 (Alexey Milovidov) 。 - 修复了一个问题:当某些参数名是其他参数名的子字符串时,
cutURLParameter可能会错误地跳过这些参数。#100280 (Nikita Semenov) 。 - 修复了 Iceberg metadata 文件路径设置中包含空字节时触发的异常。#100283 (Alexey Milovidov) 。
- 修复了在
distributed_index_analysis与包含IN子查询的谓词一同使用时,实际执行的查询数量呈二次增长的问题。#100287 (Anton Popov). - 修复在将
GROUP BY ... WITH TOTALS HAVING与UNION DISTINCT及 Nullable 表达式组合使用时出现的 “Block structure mismatch” 异常。 #100293 (Alexey Milovidov). - 修复了当
block_size_bytes参数大到极端时,estimateCompressionRatio中出现LOGICAL_ERROR异常的问题。#100298 (Alexey Milovidov). - 修复在调试构建中使用
GROUP BY CUBE(...) WITH ROLLUP或类似组合时触发的“AST 格式化不一致”异常。#100376 (Alexey Milovidov). - 修复了使用列别名以及
SELECT *或EXCEPT/INTERSECT查询创建视图时出现的异常。#100386 (Alexey Milovidov) 。 - 修复了这样一个问题:在发生心跳错误后,如果消费者卡在重平衡过程中,Kafka 引擎表上的
DROP TABLE会无限期挂起。#100388 (Alexey Milovidov). - 修复了在使用 zip 归档执行备份/恢复操作时出现的
ReadBuffer is canceled. Can't read from it.异常。#100400 (Alexey Milovidov) 。 - 修复了以下
TOO_MANY_ROWS异常:当数据分散在多个粒度边界不对齐的 parts 中时,带有max_rows_to_read/force_primary_key的SELECT count()查询会触发该异常。#100408 (Alexey Milovidov). - 修复
system.completions,使其能够在所有权限授予组合下根据访问权限正确过滤数据库、表和列:按表、按库授权,以及按列 revoke。#100432 (Shaohua Wang). - 修复 NuRaft 中由竞态条件导致的 SEGFAULT。 #100444 (Pablo Marcos).
min/max/argMin/argMax现在对 NaN 的处理与ORDER BY一致:NaN 始终会被跳过 (仅当所有值均为 NaN 时才返回) 。此前,由于 IEEE 754 的无序比较语义,结果取决于 NaN 在数据中的位置。#100448 (Raúl Marín) 。- 修复了一个复制粘贴导致的 bug:如果只设置了
delta_lake_snapshot_end_version而未设置delta_lake_snapshot_start_version,此前会被静默忽略,而不是报出BAD_ARGUMENTS错误。 #100454 (Mohammad Lareb Zafar). StorageRabbitMQ::shutdown不是幂等的 (它会无条件地访问弱指针,然后销毁相应的共享指针) ,但现在会被调用两次:一次在StreamingStorageRegistry中,随后一次在DatabaseCatalog中。此次修复使该方法变为幂等,并添加了防御性的空值检查。#100455 (Miсhael Stetsyuk) 。- 修复了将
accurateCastOrNull与QBit目标类型一起使用时触发的LOGICAL_ERROR异常。#100470 (Raufs Dunamalijevs). - 修复了在
optimize_on_insert=0的 wide parts 中,向包含嵌套Array(JSON)列的表插入数据时出现的 LOGICAL_ERROR 异常 “Stream … not found”。#100475 (Pavel Kruglov). - 在
RESTORE期间,对备份 metadata 中的文件条目路径进行校验,以拒绝路径遍历、绝对路径和空名称。#100483 (Pablo Marcos) 。 - 修复
LIMIT m OFFSET n WITH TIES语法无法生效的问题。该语法等同于LIMIT n, m WITH TIES,后者此前已可正常使用。#100491 (Nihal Z. Miaji). - 修复了在对带有命名字段且元素为
LowCardinality的Nullable(Tuple)列使用IN时出现的异常 “No set is registered for key”。#100523 (Alexey Milovidov) 。 - 修复了 usearch
sorted_buffer_gt::insert()中的堆缓冲区溢出问题;该问题可能导致在执行向量相似性搜索时发生崩溃,或静默地损坏内存。#100537 (Dustin Healy) 。 - 修复了
EXECUTE AS会忽略查询中指定的FORMAT和INTO OUTFILE子句的问题。#100538 (pufit). - 修复 SAMPLE 在查询级 OFFSET 下 AST 格式不一致的问题。关闭 #100576。#100579 (Pavel Kruglov) 。
- 修复 Azure 上的 Polaris 目录问题。自 25.12 起,该目录在 Azure 上会在路径开头附加 bucket。例如,会变成
abfss://polaris-polaris@<some_url>.windows.net/polaris-polaris/<other-path>,而不是abfss://polaris-polaris@<some_url>.windows.net/<other-path>。此 PR 会从路径中去掉 bucket。#100583 (Konstantin Vedernikov) 。 - 修复了在某些块中默认列为 const 时,transform 中的类型不匹配异常。关闭了 #100574。#100616 (Pavel Kruglov) 。
- 修复了以下 NOT_FOUND_COLUMN_IN_BLOCK 情况:projection 的 SELECT 部分包含查询原始 SELECT 部分中不存在的列。关闭 #100194。#100623 (Yarik Briukhovetskyi) 。
- 根据文件大小和溢出限制校验 Npy 格式的形状维度,以防止恶意构造、维度大得不合理的
.npy文件导致拒绝服务。同时还会拒绝空形状,并将每行内存限制在 2 GiB。#100625 (Raúl Marín). - 修复了在异步插入 (TCP) 以及所有通过 HTTP 进行的插入中解析
DateTime值时忽略session_timezone的问题。#100647 (Sema Checherinda) 。 - 当使用表函数作为 source 时,允许向
cluster()和clusterAllReplicas()表函数传递 sharding key (例如cluster('name', view(...), sharding_key)) 。#100665 (Sergey Veletskiy) 。 - 修复使用带有 Array 组合器和 NULL 参数的参数化聚合函数时导致的服务端崩溃 (断言失败) 问题,例如
quantileIfArrayArray(0.5)([[NULL]], [[1]])。#100679 (nerve-bot) 。 - 修复在启用
use_variant_as_common_type时,计算空元组和非空元组的共同超类型时出现的异常。#100699 (Antonio Andelic) 。 - 当配置了 Azure Blob 存储 disk,但端点暂时无法访问 (例如 DNS 故障) 时,服务器不再启动失败。#100701 (Raúl Marín) 。
- 修复了
positiveModulo中的未定义行为:当无符号除数超出有符号结果类型的表示范围时,会出现该问题。#100705 (Raúl Marín). - 修复了在启用
use_top_k_dynamic_filtering且ORDER BY列为Dynamic或Variant类型时发生的服务器崩溃问题 (逻辑错误“来自 __topKFilter 的返回类型异常”) 。#100742 (Groene AI) 。 - 修复在包含 LowCardinality 元素的 Tuple 键上,结合 PREWHERE/WHERE 使用
has()函数时导致的 server 崩溃问题。#100760 (Groene AI) 。 - 修复在存在并发写入时,从 S3 对象存储上的
Log或StripeLog表读取数据时出现的file_offset_of_buffer_end <= getFileSize()断言失败问题 (会在调试构建中抛出异常) 。#100763 (Alexey Milovidov) 。 - 修复了一个异常:当 WHERE 子句在已启用统计信息的表中包含函数表达式 (例如
toDecimal64(col, 3)) 时,统计信息选择性估算器会触发该异常。现在,估算器会跳过此类谓词,而不再尝试进行无效的类型转换。#100764 (Han Fei) 。 - 修复了一个罕见问题:带重排序的 join 可能产生错误结果。#100790 (Yarik Briukhovetskyi) 。
- 修复了优化后的简单 count 中
AggregateFunction参数类型错误的问题;此前,在分布式表上查询诸如count(v0 + v1)之类的表达式时,会触发NUMBER_OF_ARGUMENTS_DOESNT_MATCH异常。#100794 (YjyJeff). - 某些目录可能会在
select * from system.databases查询结果的SETTINGS部分暴露一些敏感信息。此 PR 可防止这种情况发生。#100800 (Konstantin Vedernikov). - 修复了
toStartOfInterval在使用 Week、Quarter 或 Year 时间间隔、指定 origin 参数且时间间隔值极端时出现的未定义行为 (有符号整数溢出) 。 #100817 (Raúl Marín). - 修复了
If、Distinct、DistinctIf、IfState聚合函数组合器在返回类型为Tuple且一个或多个参数为Nullable时,因引入Nullable(Tuple)而无法读取旧版已序列化状态的问题。关闭了 #98917。#100826 (Nihal Z. Miaji) 。 - 修复了因连接池释放后仍被使用而导致的 s3Cluster 和分布式查询段错误。#100837 (Konstantin Bogdanov) 。
- 修复服务器关闭期间加载字典时,因空指针解引用而导致的 segfault。
Context::getUserDefinedSQLObjectsStorage(会解引用user_defined_sql_objects_storage) 会被字典线程并发调用,而此时主线程会调用Context::shutdown(将user_defined_sql_objects_storage设为 null) 。我们需要确保在执行Context::shutdown之前,先在字典加载器中禁用后续更新、终止当前正在运行的字典查询,并等待字典加载线程结束。做法与普通查询类似。#100839 (Miсhael Stetsyuk) 。 - 修复了
ULIDStringToDateTime在输入包含非 ASCII 字节时发生的缓冲区溢出问题。#100843 (Konstantin Bogdanov). - 修复了在启用
distributed_group_by_no_merge=1时,查询封装多个表 (包括Distributed表) 的Merge表 (或merge()表函数) 时发生的崩溃 (LOGICAL_ERROR) 问题。#100859 (Groene AI). - 启用 Cast_keep_nullable 后,将 dynamic null 转换为 variant 时不会抛出异常。#100864 (Seva Potapov) 。
- 修复了
clickhouse-keeper-client的get、exists和ls命令将重复的watch_id错误消息输出到 stdout 而非 stderr 的问题。#100893 (Mohammad Lareb Zafar). - 修复了
intDiv/intDivOrZero在 Nullable Tuple 数组上抛出的异常,例如SELECT intDiv([divide((1, 2), ... AND NULL)], 2). #100895 (Raúl Marín). - 在存储
StorageAlias的定义之前,先对其引擎参数进行求值,这样像currentDatabase()这样的表达式在保存到数据库前就会被解析为字面量。#100902 (Nikolay Degterinsky). - 修复在
query_plan_merge_expressions = 0且ExpressionStep直接位于ReadFromMergeTree之上时,processAndOptimizeTextIndexFunctions的问题。修复了 #100879。#100909 (Jimmy Aguilar Mena) 。 - 更新 replxx,纳入对 do_complete_line 中越界访问问题的修复。#100925 (Azat Khuzhin) 。
- 修复了启用 shard-by-PK 优化的 JOIN 在使用查询条件缓存、且部分 parts 被缓存条件过滤掉时会返回错误结果的问题。 #100926 (Groene AI).
- 修复了在某些情况下,
divide和intDiv在索引分析期间用于过滤表达式时返回ILLEGAL_DIVISION的问题。#100928 (Nihal Z. Miaji) 。 - 修复了异步启动期间因启动依赖顺序错误,导致带内部表的 materialized view 出现“目标表不存在”错误的问题。 #100946 (Nikolay Degterinsky).
- 修复了
parseDateTimeBestEffort在解析小数秒超过 18 位的日期时间字符串时出现的未定义行为 (有符号整数溢出) 。#100948 (Vasily Chekalkin) 。 - 修复了这样一种崩溃:使用文本搜索索引时,如果
IN子句包含 Tuple 子查询,例如WHERE (id, str) IN (SELECT (id, str) FROM ...),或者子查询中的列数与IN左侧元组中的列数不一致,就会触发该问题。#100959 (Anton Popov). - 修复了从使用稀疏列序列化的
MergeTree表构建 Polygon 字典时的崩溃问题。#100964 (Anton Popov). - 修复将
INTERSECT ALL/UNION ALL与常量折叠表达式一起使用时出现的逻辑错误 “Invalid action query tree node”。#100977 (Alexey Milovidov) 。 - 修复了
sumCountOrDefault聚合函数的一个问题:在引入Nullable(Tuple)后,当存在一个或多个Nullable参数时,无法读取旧版序列化状态。关闭 #100882。#101021 (Nihal Z. Miaji). - 修复了合并算法中的崩溃问题 (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) :当惰性列复制 (enable_lazy_columns_replication) 生成的ColumnReplicated列流入归并排序管道,且部分输入延迟到达时,会触发该问题。#101036 (Groene AI). - 修复了在
SELECT中同一别名用于多个表达式时误报UNKNOWN_IDENTIFIER错误的问题;现在会正确报告MULTIPLE_EXPRESSIONS_FOR_ALIAS错误。#101040 (Alexey Milovidov) 。 - 修复了这样一个问题:当声明的时区与表达式中的时区不一致时,
DateTime/DateTime64类型的 ALIAS 列不会应用时区转换。#101043 (Alexey Milovidov) 。 - 修复了
query_log未记录视图、子查询和INSERT ... SELECT所涉及行策略的问题。尽管行策略在查询计划阶段已生效,但此前不会为了记录日志而从子规划器传递到父规划器。现在,行策略 (仅用于日志记录) 会保存在QueryAccessInfo中,以便规划器和子规划器都能对其进行填充。#101044 (Narasimha Pakeer). - 修复
DirectJoinMergeTreeEntity中的异常:当管道块包含ColumnConst列,且与普通列合并时,会触发该异常。#101046 (Alexey Milovidov). - 修复 CTE 列别名格式中的多余空格 (
WITH t (a, b)→WITH t(a, b)) 。#101049 (Alexey Milovidov). - 修复启用 analyzer 时,
remote/cluster表函数与merge等嵌套表函数一起使用时失败的问题。#101055 (Alexey Milovidov). - 修复了在
prefer_localhost_replica=1时,分布式查询中OFFSET被重复应用两次、导致返回行数少于预期的问题。#101071 (Nihal Z. Miaji). - 修复了在
format_regexp设置中使用无效正则表达式时,使用Regexp格式会导致崩溃的问题。 #101074 (Nihal Z. Miaji). - 修复在并行副本场景下使用
serialize_query_plan=1时,timeseries 聚合函数报出“Illegal type Decimal64 of start parameter”错误的问题。#101083 (Groene AI). - 修复了在带有 PREWHERE 的投影配合
ORDER BY ... LIMIT使用时,optimizeLazyMaterialization中出现的异常。#101115 (Anton Popov) 。 - 修复了在启用
aggregate_functions_null_for_empty = 1设置时,使用仅限内部使用的Null组合器 (例如sumNull、avgNull) 的聚合函数会导致服务器崩溃 (SIGABRT) 的问题。#101147 (Groene AI). - 修复了文件系统缓存写入路径中的一个释放后使用问题;该问题可能会在为已完成的 File 段记录日志时导致从已释放的内存中读取 (由 BuzzHouse 中的 MemorySanitizer 检测到) 。#101161 (Groene AI) 。
- 修复了以下服务器崩溃问题:当分布式索引分析遇到一个 GLOBAL IN 谓词,且其集合是在未显式指定元素的情况下构建时,会触发 “Trying to attach external table to a ready set without explicit elements”。#101178 (Groene AI).
- 修复了在启用 JIT 编译时 (达到编译阈值后) ,
Decimal列上的MAX/MIN聚合函数返回错误结果的问题。#101203 (Raúl Marín). - 修复以下问题:执行轻量级删除后,
minmax_count_projection和简单的COUNT(*)优化会被永久禁用,即使所有带有轻量级删除掩码的 parts 都已合并消除。#101212 (Anton Popov). - 修复了一种情况:远程对象在
list与read之间被覆盖时,先前会产生过期的对象元数据,从而导致缓存报出Having zero bytes, ...逻辑错误。#101219 (Kseniia Sumarokova). - 修复了查询带有
ORDER BY CAST(lc_column, 'Type')的 MergeTree 表时的服务器崩溃问题 (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) ,其中lc_column的类型为 LowCardinality。#101220 (Groene AI). - 修复
S3Queue中失效处理节点的清理问题。#101230 (Kseniia Sumarokova) 。 - 修复了当
optimizations参数无效时mergeTreeAnalyzeIndexes()中的 UB 问题。 #101253 (Azat Khuzhin). - 修复在分区 Iceberg 表上连续执行
ALTER TABLE UPDATE时出现的Logical error: 'partitions_count > 0'异常。#101278 (Desel72). - 修复了在 MergeTree 表中,当大整数常量 (例如 256、2147483648) 在带有 AND 的 WHERE 子句中作为布尔谓词使用时导致查询结果错误的问题。例如,
SELECT count() FROM t WHERE (2147483648 > b) AND 2147483648之前会错误地返回 0,而不是匹配所有行。#101287 (Groene AI). - 修复在使用 Replicated MergeTree 的 Delta Lake 集群上执行 insert-select 时出现的问题。#101299 (Konstantin Vedernikov) 。
- 修复了以下崩溃问题:当标量子查询引用一系列存在依赖关系的 materialized CTE 时,会出现“逻辑错误:在 materialized CTE 完成物化之前读取它”。#101305 (Groene AI) 。
- 修复
IStorage::getDependentViewsByColumn中storage_id的数据竞争问题。#101385 (Nikolay Degterinsky) 。 - 修复 BACKUP FROM SNAPSHOT AST 的格式化和克隆相关问题。#101405 (Pablo Marcos) 。
- 修复在启用
enforce_keeper_component_tracking时查询system.part_moves_between_shards会触发 LOGICAL_ERROR 崩溃,并显示 “Current component is empty” 的问题。#101462 (Groene AI) 。 - 修复了在 fuzzer 生成格式错误的 Dynamic 类型 AST 时,DataTypeDynamic::create() 中出现的段错误。 #101464 (Groene AI).
- 在未启用 DeltaKernel 的情况下使用
delta_lake_snapshot_version或 CDF 版本设置时,将抛出错误,而不是悄然返回错误数据。#101489 (Desel72). - 修复了在启用
analyzer_compatibility_join_using_top_level_identifier设置时,同时使用 ARRAY JOIN 和 JOIN USING 会触发的NOT_FOUND_COLUMN_IN_BLOCK异常。关闭 #101240。#101507 (Vladimir Cherkasov) 。 - 修复了以下问题:当表使用
iceberg_metadata_file_path创建且目标元数据版本已存在时,Iceberg INSERT 重试循环会失败。#101548 (Groene AI) 。 - 在 arrayIntersect 及相关函数的结果列中去除 Nullable,以避免序列化/反序列化不一致。#101569 (George Larionov) 。
- 修复从基于 IcebergLocal 表引擎的 materialized view 执行 SELECT 时服务器崩溃 (LOGICAL_ERROR) 的问题。#101577 (Groene AI) 。
- 修复了使用 NaN 参数调用
intExp10时错误消息有误的问题——原本显示为intExp2,而不是intExp10。#101582 (Krishna Chaitanya) 。 - 修复了在 #100288 重构后,
allow_statistics=0无法阻止ALTER TABLE ADD STATISTICS和ALTER TABLE DROP STATISTICS的问题。#101585 (Krishna Chaitanya) 。 - 修复
KeeperMapCREATE TABLE在处理 25.1 之前部分 drop 操作遗留的 ZooKeeper 节点时,若缺少drop_lock_version节点,会因“无法为表创建元数据”而失败的问题。#101623 (Antonio Andelic) 。 - 修复了读取 Map 子列时可能出现的逻辑错误。关闭了 #100769。关闭了 #101336。#101641 (Pavel Kruglov).
- 修复
getSubcolumnData中精确子列匹配的优先级,使其高于前缀匹配,以避免可能发生的崩溃。关闭 #101271。#101645 (Pavel Kruglov) 。 - 修复了在禁用
use_variant_default_implementation_for_comparisons时,将LowCardinality列与VariantNULL 常量比较时发生的崩溃问题 (LOGICAL_ERROR: “ColumnUnique 不能包含 null 值”) 。#101690 (Groene AI). - 内容:为 Bzip2ReadBuffer 增加了空 stream 保护,因此当内部 stream 为空时,将返回 EOF,而不是抛出 UNEXPECTED_END_OF_FILE。 #101691 (ClickGap AI Bot) 。
- 内容:修正了
system.s3_queue_settings和system.azure_queue_settings中alterable列说明文本前后颠倒的问题——将0和1的含义对调,使其与实际代码行为一致。#101703 (ClickGap AI Bot) 。 - 修复 positiveModulo(tuple, number) 被错误分派到除法而非取模运算的问题。#101709 (ClickGap AI Bot) 。
- 修复了在经缓存封装的 disk 上配置
thread_pool_size时发生的 crash。此前,FileCacheSettings::loadFromConfig()会将thread_pool_size识别为未知设置,从而导致 server 无法启动。该设置是一个有效的IDiskparameter,用于控制在后台分片 moves 过程中执行 disk 间复制操作时使用的线程数量。#101712 (Francisco). - 修复了
RANGE_HASHED字典创建时静默接受不存在的MAX范围属性,以及在最小和最大范围属性类型不一致时使用错误类型配置的问题。该 bug 源于buildRangeConfiguration中的一处复制粘贴错误:查找最大属性时误用了min_attr_name,而不是max_attr_name。#101732 (Yakov Olkhovskiy) 。 - 修复 CPU 租约调度器中的 use-after-free 崩溃:当等待计时器的生命周期长于其引用的
ProfileEvents::Counters所属工作线程时,会触发该问题。#101761 (Antonio Andelic). - 修复了 arrayLevenshteinDistanceWeighted 和 arraySimilarity 函数中的错误。已关闭 #101725。#101767 (Mikhail f. Shiryaev) 。
- 修复了 Prometheus 查询 API 忽略 POST 表单请求体的问题。#101794 (James Cunningham) 。
- 修复因 S3
Client::~Client析构函数中的异常逸出而导致服务器终止的问题。#101798 (Gagan Dhakrey) 。 - 修复了在并行反序列化
Object类型动态路径时的 use-after-scope 问题;读取包含大量动态路径的表时,该问题可能导致崩溃。 #101823 (Antonio Andelic). - 修复了在某些 (非默认) 格式设置下,函数
formatDateTime使用格式说明符%W时输出错误的问题。#101847 (Robert Schulze) 。 - 修复了
SYSTEM INSTRUMENT ADD中shouldPatchFunction的假阴性问题:当搜索字符串首次出现在经反修饰的符号名的模板参数中时,会出现该问题。#101885 (Pablo Marcos). - 修复在周期性刷新期间因 ZooKeeper 会话过期导致 UDF registry 丢失的问题——在完全刷新成功之前,所有用户自定义函数都可能无法使用。#101891 (Nikita Fomichev).
- 修正了
system.codecs中AES_256_GCM_SIV的描述,将其显示为AES-256而非AES-128。#101917 (Jimmy Aguilar Mena) 。 - 修复了在 JSON 列上创建的 min-max 索引因使用错误极值而导致查询结果错误的问题。关闭 #101700。#101918 (Pavel Kruglov).
splitByString分词器现在会拒绝空字符串分隔符。#101928 (Robert Schulze) 。- 修复了
materialize_skip_indexes_on_merge=false在合并期间未能禁止构建文本 (全文) 索引的问题。此前,只有非文本跳过索引 (minmax、set、bloom_filter) 会被禁止构建;文本索引仍会继续构建,造成 CPU 和 I/O 浪费。#101932 (Groene AI) 。 sparseGrams分词器生成的标记长度超过了指定的最大长度 (原因是实现中将+2硬编码了进去) 。#101934 (Elmi Ahmadov) 。- 修复
MergeTreeDataPartWriterWide::cancel中的 SIGSEGV:当流构造函数在addStreams期间抛出异常时,column_streams中会留下一个空条目。#101936 (Antonio Andelic) 。 - 修复了在启用
query_plan_direct_read_from_text_index时,查询带有全文索引的 Merge 或 Distributed 表且组合过滤条件中同时混用has*Tokens和 LIKE 时出现的异常。#101939 (Jimmy Aguilar Mena). - 修复了解析原生协议查询数据包时,
QueryProcessingStage值无效所导致的未定义行为。#101972 (Raúl Marín). - 当初始查询解析期间发生异常时,会关闭 TCP 连接,以防止从失去同步的流中读取无效数据。#101989 (Raúl Marín) 。
- 修复 26.1+ 版本中文件系统缓存的 SLRU 竞争问题,该问题可能导致空间预留逻辑错误。在调试构建中,还可能触发断言失败:
'Previous state is Evicting, but expected state to be Active while setting Evicting flag for 2c1e3484ecdc6b78a8978fa5b17c5097:0:339 (state: Evicting)'.。#101991 (Kseniia Sumarokova) 。 - 修复了将带有尾随数据的字符串转换为空
Tuple()类型时触发的异常。 #102011 (Alexey Milovidov). - 修复了在使用 ORDER BY 和 grace_hash join 算法的查询中,行顺序不正确的问题。受影响的查询可能会以错误顺序返回结果,从而在无任何提示的情况下产生错误输出。#102036 (János Benjamin Antal).
- 修复了一个 LOGICAL ERROR (索引类型大小异常) 问题:配置了
max_bytes_in_join设置时,RIGHT JOIN 和 FULL JOIN 查询中可能会出现该错误。#102042 (Jimmy Aguilar Mena) 。 - 修复了
Time包含负值时与日期时间比较会返回错误结果的问题。关闭了 #101670。#102056 (Yarik Briukhovetskyi) 。 - 修复了 UDF refresh 中的崩溃问题:
ZooKeeperRetriesControl在未续订已失效 (expired) 的 ZooKeeper 会话时进行了 retry,因而导致崩溃。#102059 (Nikita Fomichev). - 修复格式化解锁快照时空格缺失的问题。关闭 https://github.com/clickhouse/clickhouse/issues/101723。 #102063 (Han Fei) 。
- 修复查询带有 WHERE 子句的视图时发生的崩溃 (SIGSEGV) 问题:当内部查询生成的列类型与视图元数据不一致时 (例如,启用
join_use_nulls的 LEFT JOIN 产生的 Nullable) ,会触发该问题。#102085 (Miсhael Stetsyuk). - 修复了因缓存键不匹配,移除分片后
VectorSimilarityIndexCache缓存项始终无法被淘汰的问题。 #102152 (Seva Potapov). - 使用 rabbitmq 存储时,对损坏消息进行 NACK。 #102157 (Seva Potapov).
- 修复在解析错误的空元组字符串时的逻辑错误。#102289 (Nihal Z. Miaji) 。
- 修复了在使用
optimize_aggregation_in_order=1时,若 GROUP BY 列的顺序与表的排序键不同,会导致聚合结果错误 (出现重复行) 的问题。#102299 (Groene AI). - 修复了在使用 Avro 格式时,
IcebergLocalALTER TABLE ... UPDATE发生崩溃的问题,原因是LowCardinality/Nullable包装类型在序列化前未先解包。#102337 (Desel72). - 修复了在对不带表达式的 materialized 列执行变更时发生的段错误。关闭了 #102185。#102342 (zoomxi) 。
- 修复了 Coalescing merge tree 对 Array 类型的处理问题。此更改关闭了 #89509。#102384 (Konstantin Vedernikov) 。
- 修复了在启用 bloom filter 下推、且
WHERE 子句包含等值/不等条件时读取 Parquet 文件会触发 segfault (或在调试构建中触发 LOGICAL_ERROR) 的问题。该崩溃是由 Parquet 预取器拉取 bloom filter 数据时发生越界内存访问导致的,还可能造成非确定性的错误查询结果。#102385 (Groene AI). - 修复了 SLRU 文件系统缓存动态调整大小期间发生的
LOGICAL_ERROR异常中止问题;其原因是子队列之间共享了淘汰统计信息,以及对失败候选项采用了错误的恢复路径。#102396 (Antonio Andelic). - 修复了 Database Replicated 中不带目标表的别名表在新副本上初始化失败的问题。关闭 #101320。#102397 (Nikolay Degterinsky) 。
- 修复了在字符串搜索函数 (
countSubstrings、position等) 中,搜索由 null byte 完全构成的 needle 时发生的越界读取问题。#102401 (Raúl Marín). - 当
compatibility设置指向早于 26.1 的版本时,全文索引设置 (enable_full_text_index、allow_experimental_full_text_index、use_skip_indexes_on_data_read) 将不再被禁用。此前,这可能会导致SharedDatabaseCatalog无法创建带有文本索引的表。#102422 (Nikita Fomichev) 。 - 修复
printf在末尾带有%时发生的越界读取问题。#102472 (Raúl Marín) 。 - 修复了 AsynchronousMetrics 中调试构建里的一个 chassert 异常
ReadBuffer is canceled,其原因是 rewind 没有重置缓冲区的取消标志。 #102524 (Yuri Fedoseev). - 修复了在带有文本索引的列上,
hasToken/hasTokenOrNull处理仅由分隔符组成的 needle (例如'()'、'!!!') 时的问题:此前,索引会悄然跳过所有粒度,而不是抛出BAD_ARGUMENTS(对hasToken而言) 或返回NULL(对hasTokenOrNull而言) 。#102544 (Jimmy Aguilar Mena) 。 - 修复 keeper 中超大 multi 请求导致的 OOM。对于 OpenTelemetry tracing,我们此前会在
ZooKeeperRequest对象中无条件为 OpenTelemetry spans 分配 >1 KiB 的空间——这意味着,对于特别大的 multi 请求,可能会额外尝试分配 >10 GiB 的内存。为解决这一问题,我们现在将 shared data 保存在静态内存中,并在ZooKeeperOpentelemetrySpans中使用std::unique_ptr替代std::optional。#102586 (Miсhael Stetsyuk) 。 - 修复了以下问题:对现有 collection 执行
CREATE NAMED COLLECTION IF NOT EXISTS时,会导致NamedCollection的 CurrentMetric 被错误抬高;此外,从配置或 SQL 存储加载的 collection 在启动时不会被初始化。关闭 #102507。#102598 (Pablo Marcos) 。 - 修复了在并发 DDL 导致本地分片返回空列时,
getStructureOfRemoteTable中抛出的异常。#102604 (Alexey Milovidov) 。 - 修复了多个并发
CREATE TABLE IF NOT EXISTS查询针对同一个 Shared database 上的S3Queue表时触发的LOGICAL_ERROR异常。#102610 (Nikita Taranov). - 修复了在使用 WHERE 过滤器读取 Nullable 列时,原生 Parquet V3 读取器中出现的 LOGICAL_ERROR 崩溃问题:“列子块中的行数异常”。#102628 (Groene AI) 。
- 修复了
AzureWriteMicrosecondsprofile 事件描述中将 “write” 误写成 “read” 的问题。#102639 (Miсhael Stetsyuk). - 修复了在某些特殊情况下 row policy 会触发 ‘Not found column in block’ 异常的问题。#102648 (Yarik Briukhovetskyi) 。
- 修复了 ClusterDiscovery 中的一个服务端异常:当静态集群 (在 config 中定义) 暂时没有存活节点时,会触发该异常。#102661 (Kseniia Sumarokova) 。
- 修复了时区调整后发生溢出时日期数据类型推断错误的问题。关闭 #102601。#102674 (Pavel Kruglov).
- 修复了在等待过程中删除可刷新materialized view 时,
SYSTEM WAIT VIEW会一直挂起的问题。#102681 (Nikolay Degterinsky). - 修复了 CASE 搭配 Dynamic 表达式时对所有行都返回 ELSE 的问题。关闭 #102511。#102684 (Pavel Kruglov) 。
- 修复了使用二进制编码数据类型时,扁平化 Dynamic 类型的序列化问题。关闭了 #101911。#102692 (Pavel Kruglov).
- 修复了 format_schema_source=‘query’ 静默忽略多行结果的问题。关闭 #101905。#102698 (Pavel Kruglov) 。
- 通过 SSH 客户端报告实际退出码,而不是将所有错误统一映射为
1。关闭 #101741。#102700 (Konstantin Bogdanov) 。 - 修复动态/预定义查询处理程序中 HTTP 请求头丢失的问题。关闭 #101846。#102706 (Konstantin Bogdanov) 。
- 对折叠后的 jemalloc 堆内存剖析应用泊松采样校正,使其与 jeprof 的输出一致。此前,折叠格式由于未计入采样概率,低估了实际分配大小。#102759 (Antonio Andelic).
- 修复了函数
hasPhrase在参数为NULL时发生崩溃的问题。#102802 (Nikita Taranov) 。 - 修复了在读取包含循环符号类型引用的递归 schema 的 Avro 文件时 server 发生崩溃 (SIGSEGV) 的问题。现在会检测并拒绝此类 schema,并返回清晰的错误消息,而不是直接崩溃。#102853 (Groene AI).
- 修复服务器崩溃问题 (
LOGICAL_ERROR断言) :当Variant列上的函数在FunctionVariantAdaptor中对结果进行类型转换时触发内存限制或其他非类型转换异常,异常现在会被正确传播,而不再被误归类为内部错误。#102855 (Groene AI). - 修复了在调试/sanitizer 构建中,若在 schema 推断期间抛出
std::length_error(例如由于input_format_msgpack_number_of_columns值极端或输入数据格式错误) ,导致服务器崩溃的问题。#102859 (Groene AI) 。 - 使复制列和稀疏列在序列化时的 null 表示遵循相关设置 (例如 format_tsv_null_representation) 。#102888 (Hechem Selmi) 。
- 已在 #103499 中回移:修复了这样一个问题:由于 Poco
BufferedStreamBuf::flushBuffer未处理来自套接字层的短写,导致 S3 请求失败且不会重试,而是报出ios_base::clear: unspecified iostream_category error。#102894 (Sema Checherinda) 。 - 修复了这样一个问题:执行轻量级删除后,
minmax_count_projection和简单的COUNT(*)优化会被永久禁用,即使所有带有轻量级删除掩码的 parts 都已合并掉,也不会恢复。#102900 (Anton Popov). - 修复了因 LTO 导致的 jemalloc 随机崩溃问题。#102913 (Azat Khuzhin) 。
- 在新的 analyzer 中,将行策略中的 OR 链优化为 IN。 #102915 (Azat Khuzhin).
- 修复了因 page cache 以错误对齐方式释放内存而导致的 jemalloc metadata 损坏问题,该问题可能会引发 crash。#102918 (Azat Khuzhin) 。
- 不带 materialized views 的普通 INSERTs 不再会请求过多的 ConcurrencyControl 槽位和线程 (使用
max_threads而不是max_insert_threads) ,从而避免在高 INSERT 吞吐量的集群上出现 CC 槽位饥饿和线程数暴涨。#102961 (Sema Checherinda) 。 - 重新引入 ArrowMemoryPool,以便在达到内存限制时抛出 MEMORY_LIMIT_EXCEEDED,从而避免内核 OOM。 #102999 (Azat Khuzhin).
- 修复了将
CAST转换为Nullable(DateTime)时忽略cast_string_to_date_time_mode的问题。关闭 #101840。#103035 (Pavel Kruglov). - 文本索引直接读取优化现已支持
ALIAS列。#103037 (Anton Popov) 。 - 已在 #103454 中回移:修复了以下问题:当聚合投影与查询匹配,且表中的某些 parts 没有投影数据时,
SELECT DISTINCT会在无提示的情况下返回不完整的结果 (例如,在已包含数据的表上添加了该投影,但未运行MATERIALIZE PROJECTION) 。关闭 #102951。#103052 (Nihal Z. Miaji) 。 - 修复了在
MergeTree表上使用WHERE x AND toNullable(N)时返回错误结果的问题:当N是位宽大于UInt8的整数 (例如256、65535、2147483648或任何负整数) 时,就会出现该问题。由于splitFilterNodeForAllowedInputs在将化简后AND的Nullable余项转换为布尔值时错误地使用了NULL作为零值,导致在三值逻辑下比较结果变为NULL,从而错误地丢弃了所有行。#103077 (Groene AI). - 修复了字符串搜索函数 (例如
locate、position) 在参数顺序颠倒传递时 (locate(needle, haystack)且function_locate_has_mysql_compatible_argument_order = 1) ,在错误消息中报告错误参数类型的问题。#103102 (Alex Kuleshov). - 修复了这样一个问题:当 failpoint 处没有线程暂停时调用 disableFailPoint,可能导致 waitForPause 一直挂起。 #103119 (Shaohua Wang).
- 将预认证 TCP Hello 数据包中的字符串大小限制为 64 KB,并新增
handshake_timeout_milliseconds服务器级设置,用于限制握手总时长,防止未认证客户端占用过多内存或无限期占用线程。#103284 (Sema Checherinda) 。 - 修复 Parquet ColumnIndex 统计信息中 String 列出现 min_value > max_value 的问题。#103334 (Saurabh Kumar Ojha) 。
- 检查 Native 格式中格式不正确的扁平化 Dynamic 数据。#103392 (Pavel Kruglov) 。
- 支持从
url表函数填充_time列。#103437 (Nikita Taranov) 。 - 修复了在 SVE 指令不可用时仍用其进行检测的问题。 #103568 (Raúl Marín).
构建/测试/打包改进
- Libstemmer (Snowball) 依赖现已升级到较新的 v3.0.1 版本。#99256 (Jimmy Aguilar Mena) 。
- 在 clickhouse-test 中将以下设置随机化:
use_skip_indexes_for_top_k、use_top_k_dynamic_filtering、query_plan_max_limit_for_top_k_optimization。#91782 (Nikita Fomichev) 。 - 为函数实现了压力测试,用于检查其各项属性的健全性。#93543 (Michael Kolupaev) 。
- 为
llvm-project提供自有的 CMake 配置,而不是导入上游配置。#97453 (Konstantin Bogdanov) 。 - 在测试基础设施中对更多
optimize_*设置进行随机化,以提升查询优化各个 pass 的覆盖率。#97547 (Alexey Milovidov) 。 - 使用 Rust 工具链 nightly-2026-03-22。#98602 (Konstantin Bogdanov) 。
- 采用
wasmtimev42.0.1。#98603 (Konstantin Bogdanov) 。 - 改用
llvm-project22.1.1。#98882 (Konstantin Bogdanov) 。 - 将用于夜间按测试统计覆盖率的
SANITIZE_COVERAGE(自定义 sanitizer 回调、符号级粒度) 替换为基于 LLVM 源代码的覆盖率 (WITH_COVERAGE,-fprofile-instr-generate -fcoverage-mapping) 。现在,server 会在启动时从 ELF 段中读取自身的覆盖率映射,并通过新的SYSTEM SET COVERAGE TEST 'name'命令为每个测试收集(file, line_start, line_end)元组。定向 CI check 中的测试选择会针对新的checks_coverage_linesCIDB 表执行行范围查询,并按候选测试覆盖的变更 diff 行数进行排序。#99513 (Nikita Fomichev). - 修复了 -O0 构建中的 llvm-libc 链接错误。#100023 (Zheguang Zhao) 。
- 修复了容器启动时的两条错误消息:当配置中未包含
logger.log和logger.errorlog设置时 (例如,所有日志消息都应输出到 STDOUT/STDERR 的情况下) 。#100239 (Simon) 。 - 在 macOS 构建中,优先使用
ld64.lld,而不是 Apple 的ld(cctools-port ld64) 。这应能显著缩短 Darwin 的链接时间,因为 cctools-port 的 ld64 在使用-ffunction-sections和-dead_strip时非常慢。如果ld64.lld不可用,则回退到ld。#100275 (Alexey Milovidov) 。 - 用于确保目录不会注册任何机密信息的测试 (REST + Glue) 。#100307 (Konstantin Vedernikov) 。
- 在不同的随机化设置下重复运行近期修改过的测试。#100385 (Alexey Milovidov) 。
- 在 CMake 中跟踪
#embed文件依赖项,并启用 ccache 的 depend 模式,以确保正确重建。#100411 (Alexey Milovidov) 。 - 为 TPC-H 查询新增正确性测试。#100580 (Raufs Dunamalijevs) 。
- 使用
aws-sdk-cpp1.11.771 版本。 #100582 (Konstantin Bogdanov). - 允许性能测试 XML 通过
file属性引用外部 SQL 查询文件及设置。#100747 (Raufs Dunamalijevs) 。 - 通过在
LowerUpperImpl.h中补充缺失的TargetSpecific.hinclude,修复了使用-march=x86-64-v4时的编译问题。#100932 (Alexey Milovidov) 。 - 通过在 cxxflags 中添加 —no-default-config,修复了 Gentoo 上的构建问题。#100973 (Isak Ellmer) 。
- 新增
utils/auto-bisect/——这是一个基于 shell 的二分定位框架,可下载预构建的 CI 二进制文件,并运行用户提供的测试脚本,以找出首次引入回归的提交,无需在本地 build。 #100989 (Nikita Fomichev). - 在 CMake 中默认禁用 ThinLTO,这样开发者的本地构建将不再隐式启用它。CI 的发布构建不受影响,因为它们会显式传递
-DENABLE_THINLTO=1。#101041 (Alexey Milovidov) 。 - 在性能测试中新增 TPC-DS SF1 基准测试。#101209 (Raufs Dunamalijevs) 。
- 新增了针对 MergeTree 轻量级删除的无状态测试,覆盖:
has_lightweight_delete标志的生命周期、启用optimize_trivial_count_query时COUNT(*)的正确性、MATERIALIZED/DEFAULT列的完整性、ReplicatedMergeTree标志的恢复、已删除行场景下的read_in_order、多次删除/合并循环、_row_exists列隐藏、多种谓词,以及ALTER DELETE的 RBAC 权限控制执行。#101792 (Nikita Fomichev) 。 - 现在,Distroless Docker 镜像已针对带标签的发行版提供 ubuntu 和 alpine 两种变体。#101941 (Rahul Nair).
- 堆栈跟踪现在会显示干净的纯相对路径 (例如
src/Common/Exception.cpp) ,而不再是夹杂构建目录的路径 (例如./ci/tmp/fast_build/./src/Common/Exception.cpp) 。#102000 (Raúl Marín) 。 - 新增一项 CI 风格检查,禁止将大于 5 MB 的文件提交到仓库,并为现有的合法测试数据设置白名单。移除未使用的 14 MB
zookeeper_log.parquet。#102080 (Raúl Marín) 。 - 从头文件中移除约 400 条未使用的
#include指令,以缩短编译耗时。#102585 (Raúl Marín) 。 - 使用
wasmtimev43.0.1。 #102603 (Konstantin Bogdanov) 。 - 使用
openssl3.5.6。#102606 (Konstantin Bogdanov) 。 - 使用
xz5.8.3。 #102607 (Konstantin Bogdanov) 。 - 将 distroless Docker 镜像的基础从 Debian 12 (glibc 2.36、OpenSSL 3.0) 升级到 Debian 13 (glibc 2.41、OpenSSL 3.5) ,将 CVE 暴露面缩减至零可达漏洞。#101678 (Rahul Nair) 。
向后不兼容的变更
- 升级后再降级可能会导致数据丢失。数据类型的序列化版本现在会传播到嵌套数据类型中。例如,String 序列化版本
with_size_stream以前仅应用于顶层 String 列和 Tuple 元素;现在它会应用于任意嵌套类型中的任何 String 类型,例如Array/Map/Variant/JSON/等。此行为由 MergeTree settingpropagate_types_serialization_versions_to_nested_types控制,该设置现已默认启用。此变更后,新创建的数据分区片段将无法被旧版本读取,但旧的数据分区片段可以在新版本中正常读取。升级是安全的,但降级不是——如果你在升级到 26.3 后需要回滚,26.3 在包含嵌套类型的列中写入的数据将无法读取! 详情参见 #101429。#94859 (Pavel Kruglov) 。 - 移除
hypothesis跳过索引类型。它是一个较为冷门的 Experimental 功能,实际用途有限。现在,使用INDEX ... TYPE hypothesis创建表会报错。#96874 (Alexey Milovidov) 。 - 移除实验性的
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。你可以在多个级别关闭/开启异步插入:在 users profiles 的 config 中、在 session 级别、在查询级别,或在 MergeTree 表级别。#97590 (Sema Checherinda). - 将
mysql_datatypes_support_level的默认值从空改为decimal,datetime64,date2Date32,默认启用将 MySQLDATE正确映射为Date32、将DECIMAL/NUMERIC映射为Decimal,以及将带精度的DATETIME/TIMESTAMP映射为DateTime64。此前,MySQLDATE列会映射为Date,而Date无法表示 1970-01-01 之前的日期,从而导致数据损坏。#97716 (Alexey Milovidov). mergeTreeAnalyzeIndexes{,UUID}现已接受分片名称数组而非 regexp,因为 regexp 较慢 (Experimental 功能) 。#98474 (Azat Khuzhin) 。- 将可执行 UDF 的默认
stderr_reaction从throw调整为log_last。对于向 stderr 写入警告的 UDF,只要退出码为 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) 。 - 支持 materialized 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) 。 - 支持
Replicateddatabase 使用辅助 ZooKeeper。 #95590 (RinChanNOW). - 支持对 JSON 类型使用
has函数来检查路径是否存在,类似于 Map。#96927 (DQ). - 新增了
mergeTreeTextIndex(database, table, index)表函数,支持直接从文本索引中读取数据。该函数可用于查看内部信息,或基于文本索引数据执行聚合。#97003 (Anton Popov). - 新增
table_readonlyMergeTree setting,用于将表标记为只读,防止插入和修改。#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_*>config 部分,从而可为每个端口启用不同的 HTTP 路由规则。#98414 (Amos Bird) 。 - 为
EXPLAIN新增pretty=1选项,以生成树状缩进输出;并新增compact=1,用于折叠Expression步骤,使查询计划更易读。#98500 (Kirill Kopnev) 。 - 新增
restore_access_entities_with_current_grants服务器设置。启用后,从 backups 中恢复的用户/roles,其授权将限制在执行 restoring 的用户有权授予的范围内 (与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值末尾的 null 字节。#97558 (NeedmeFordev). - 支持在 FROM 子句中使用带括号的表 JOIN 表达式,例如
SELECT * FROM (t1 CROSS JOIN t2)。#97650 (Alexey Milovidov) 。 - 实现函数
toDaysInMonth:返回指定日期所在月份的天数。#99227 (Vitaly Baranov) 。
Experimental 功能
- 新增对基于 WebAssembly 的用户自定义函数 (UDF) 的实验性支持,允许使用 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列新增实验性的惰性类型提示。通过allow_experimental_json_lazy_type_hints启用后,ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName)这类仅添加或修改类型提示的操作会立即完成,作为仅元数据操作执行,无需重写历史数据。对于旧 parts,类型提示会在查询时应用;在 INSERT 和后台 merges 期间则会被 materialized。#97412 (tanner-bruce) 。 - 启用从 YTsaurus table engine 进行并行读取。#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,则所有受支持的查询都会使用并行副本,而不受任何统计信息影响。一个值得注意的例外是使用并行副本的 distributed 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 join 的左右两侧。#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 查询在缓存元数据的新鲜度高于指定 staleness 时直接使用缓存,从而避免在请求处理期间调用 Iceberg catalog。#96191 (Arsen Muk). S3Queueordered 模式使用 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) 。 - 在某些场景下,可提升并行窗口函数的性能并降低内存占用;对于含大型数组的
arrayFold工作负载也是如此。这还可以减轻缺页压力,并在内存限制较严时提高受影响查询的稳定性。#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,从而优化指令缓存布局,并减少聚合循环中的 CPU 周期开销。#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 JOIN 转换为 INNER JOIN 的优化。关闭 #90978。#95968 (Vladimir Cherkasov) 。 - 通过在读取前正确计算大小,优化了子列读取。这减少了内存占用,并加快了子列读取速度。#96251 (Pavel Kruglov).
- 让标记缓存、未压缩缓存和页缓存使用各自独立的 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 数据时进行 format 自动检测期间内存占用过高 (约 514 MiB) 的问题 (例如来自
url或file且未显式指定 format 的 JSON) ;原因是 ArrowStream 读取器将起始字节误识别为一个巨大的 metadata 长度。#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,可用于查看所有 server 线程的堆栈跟踪内部信息。#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 增加一个专用清理线程,避免在高 merge 负载下出现清理延迟。此更改修复了 #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 database 创建的集群设置 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 查询输出中,将延迟过滤器的信息单独列出 (在配合行策略/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) 。
- 改进了在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 来取消 SQLite 表引擎查询的功能。#97944 (Roman Vasin) 。
- 新增服务器级设置
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_hashJOIN 算法。#98144 (János Benjamin Antal) 。 - 在 ordinary shared merge tree 的 DROP DATABASE 操作中提前取消后台合并。#98161 (Shaohua Wang) 。
- 改进了在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 来取消 MongoDB 和 MySQL 查询的能力。#98187 (Roman Vasin).
- 移除 NetlinkMetricsProvider,改为仅使用 procfs 收集每线程的 taskstats 指标。基于 Netlink 的收集方式在容器化环境中存在问题,而且在发生争用时,尾延迟表现更差。#98229 (Amos Bird) 。
- 重构了 Iceberg manifest 文件处理逻辑,修复了 manifest 文件缓存相关问题。#98231 (Daniil Ivanik).
- 现在我们也会考虑这样一种情况:表的排序键可以是像
toDate(time)这样的 expression;如果这类 expression 属于过滤器的一部分,我们就可以决定不延迟对它们的处理。#98237 (Yarik Briukhovetskyi) 。 - 新增
MaxAllocatedEphemeralLockSequentialNumber指标,用于表示 ZooKeeper 中为临时锁 znode 分配的最大顺序编号。#98243 (Miсhael Stetsyuk). - 将 ClickStack 更新至 2.20.0 版本。#98252 (Aaron Knudtson) 。
- 新增了一个新的 profile 事件
KeeperRequestTotalWithSubrequests,会将多请求中的每个子请求分别计数,从而更清楚地反映实际的 Keeper workload。现有的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(默认值为 disabled/allowed) ,禁止为通过 SQL 定义的用户使用在 config 中定义的 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 ).
- 正确返回包含 joins 的子查询中的列统计信息,以便父查询可利用这些信息对 join 顺序进行重排。#99096 (Alexander Gololobov).
- 在终结过程开始时,立即将 ZooKeeper session 标记为已过期,而不是等待发送线程退出。这样一来,其他线程就能立即建立新的 session,而无需等待。#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). - 通过在 mutex 作用域之外调用回调函数并分发读取请求,减少 Keeper 分发器中的锁竞争,并添加带 profile 的锁保护机制以增强可观测性。#99751 (Antonio Andelic).
- 允许 Parquet 文件最后一个块末尾缺少填充。 #99857 (Seva Potapov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了当别名表目标未使用完全限定名称时,将其保存为 DDL 依赖的方式:现在会保存为别名表所在的数据库,而不是会话数据库。 #95175 (Enric Calabuig).
- 修复读取 ALIAS 列的子列时返回错误结果或抛出异常的问题。#95408 (Pavel Kruglov) 。
- 修复了在使用旧 analyzer 时,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 中附加分片时的一个逻辑错误:如果在 detach 和 attach 之间经历了多次连续重命名,就会触发该问题。#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 和桶执行 INSERT SELECT 时,stream 缺失导致的逻辑错误。关闭 #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) 。- 修复了在对纪元前的 DateTime64 使用
toDate()函数时,分区裁剪不正确的问题。 #97746 (Yarik Briukhovetskyi). - 应用此补丁后,如果数据分区片段集合中存在另一个分区 ID 更高的分区,
hasPartitionId将返回 false。#97748 (Mikhail Artemenko) 。 - 修复读取 JSON 中高级共享数据的空粒度时可能发生的崩溃。关闭 #97563。#97778 (Pavel Kruglov) 。
- 修复因
DROP与INSERT之间的竞争条件,导致向Distributed执行INSERT时出现Cannot schedule a fileLOGICAL_ERROR错误的问题。#97822 (Azat Khuzhin) 。 - 修复了在调用
mapContainsKey/mapContainsKeyLike且使用tokenbf_v1跳过索引时,ClickHouse 服务器崩溃/断言的问题。#97826 (Shankar Iyer) 。 - 修复了在
concatWithSeparator、format、IN子查询、GLOBAL IN以及带运行时过滤器的连接操作中,由复合类型 (Variant、Dynamic、Tuple) 内的LowCardinality引发的 LOGICAL_ERROR 异常。#97831 (Raúl Marín). - 修复了在多个分布式表上使用
ARRAY JOIN、merge()表函数并结合GROUP BY时出现的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) 。
- 修复了一个 bug:此前无法在 distributed 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 存储并将
s3_plainmetadata 用于日志存储时,Keeper 重启后出现的数据丢失问题。#97987 (Antonio Andelic). - 修复了
sign函数在比Int8更宽的整数类型上的 JIT 误编译问题——超出 -128..127 范围的值可能会得到错误的符号。#98012 (Alexey Milovidov) 。 - 修复了读取使用列映射 “name” 模式的 Delta Lake 表时出现的
DUPLICATE_COLUMN异常,以及对名称中包含点号的 struct 字段无提示地返回 NULL 的问题 (例如STRUCT<`a.foo`: STRING, `b.foo`: STRING>) 。#98013 (Caio Ishizaka Costa) 。 - 修复轻量级更新和次级索引后的变更问题。#98044 (Raúl Marín) 。
- 修复混用主键和非主键跳过索引时 FINAL 查询结果错误的问题。#98097 (Raúl Marín) 。
- 对标量 file() 和 DESCRIBE TABLE file() 强制进行 READ ON FILE 权限检查。#98115 (Nikolay Degterinsky) 。
- 修复了一个崩溃问题:使用 glob 模式查询文件 (例如
file('dir/**', 'LineAsString')) 时,如果目录中包含悬空符号链接,会抛出未处理的文件系统异常 (STD_EXCEPTION) 。现在会静默跳过悬空符号链接,查询将返回所有有效文件的结果。#98143 (Mark Andreev). - 修复了在过滤表达式中使用
arrayJoin将外连接转换为内连接时,查询计划优化中发生的 segfault。#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) 。
- 修复了 LOGICAL_ERROR 异常 “
MergeTreeSetIndex中的二分查找结果无效”:当对数据跨越 65535 边界的键列执行toDate转换时会触发该异常。#98276 (Alexey Milovidov) 。 - 修复了在旧版 join 步骤代码路径中,被包裹在 CROSS JOIN 中的 RIGHT JOIN 被
query_plan_join_swap_table优化交换时触发的LOGICAL_ERROR异常。#98279 (Alexey Milovidov) 。 - 在
DDSketch反序列化期间对损坏数据进行校验,以防在读取已损坏的quantilesDD聚合函数状态时出现段错误、异常、无限循环和 OOM。 #98284 (Alexey Milovidov). - 修复了在
arrayMap等 lambda 函数中引用外层查询中的关联列时出现的 LOGICAL_ERROR “Trying to execute PLACEHOLDER action”。 #98285 (Alexey Milovidov). - 修复了
caseWithExpression中的逻辑错误异常:当CASE表达式涉及materialize(NULL)或其他Nullable(Nothing)参数时会触发该异常。#98290 (Alexey Milovidov) 。 - 修复在
merge表函数中过滤_table虚拟列时出现的错误类型转换异常。#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) 。 - 修复了以下问题:如果在索引或投影对应的变更完成前将其删除,
MATERIALIZE INDEX和MATERIALIZE PROJECTION变更会卡住。#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) 。 - 修复 native V3 读取器中将 Parquet
Bool错误转换为FixedString的问题,此问题会产生 raw bytes,而不是字符串表示形式。#98378 (Alexey Milovidov). - 修复
tryGetColumnDescription:按父列类型筛选子列,使其与其他列查找方法保持一致。#98391 (Alexey Milovidov). - 支持在 HTTP Basic Auth 中接受不带填充的 base64 凭据。某些 HTTP 客户端会省略
Authorization: Basic请求头末尾用于填充的=,此前这会导致身份验证失败。#98392 (Amos Bird). - 修复了合并带有
Nullable分区键列的 parts 后,因 min-max 索引边界错误导致的分区裁剪结果不正确问题。#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_mergejoin 中的 “Pipeline stuck” 异常:当FilterBySetOnTheFly优化与MergeJoinTransform形成循环依赖时,PingPongProcessor中的死锁会触发该异常。#98454 (Alexey Milovidov). - 修复在合并带有会删除所有行的生存时间 (TTL) 且具有常量
GROUP BY键的聚合投影的 parts 时出现的LOGICAL_ERROR异常 “Projection cannot increase the number of rows in a block”。#98458 (Alexey Milovidov). - 修复了同时使用
CROSS JOIN和INNER JOIN USING时出现的逻辑错误异常。#98459 (Alexey Milovidov). - 修复了
dictGetOrDefault在键参数为Nullable时的空指针解引用问题。#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以及任何使用持久 watch 的 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时出现的异常:“在 ActionsDAG 的输出中未找到排序列”。 #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) 。
- 修复了在常量
Dynamic或Variant列与NULL进行 NULL 安全比较 (<=>/IS NOT DISTINCT FROM) 时出现的异常Bad cast from type ColumnConst to ColumnDynamic。同时还修复了Dynamic/Variant与NULL进行IS DISTINCT FROM比较时始终错误返回 0 的问题。#98553 (Alexey Milovidov). - 修复了文本索引与其他跳过索引一起使用时的问题。此前,当查询过滤器同时使用文本索引和其他常规跳过索引时,可能会抛出诸如 “Trying to get non-existing mark” 之类的逻辑错误。#98555 (Anton Popov) 。
- 修复了逻辑错误 “在表达式上下文中不允许使用 TABLE_FUNCTION”:当带有别名的表函数在同一查询作用域中出现多次时 (例如同时出现在
PREWHERE和QUALIFY子句中) 。 #98557 (Alexey Milovidov). - 修复了 PK 中针对表达式 (而不只是列) 进行分布式索引分析的问题 (否则会导致远程副本上的冗余粒度完全无法被过滤) 。#98561 (Azat Khuzhin).
- 当某列的子列被用于其他列的默认值/别名表达式时,禁止删除该列,并在 alter drop column 操作中对默认表达式使用 analyzer。#98569 (Nikita Mikhaylov) 。
- 修复了 HTTP 客户端在遇到不可重试错误 (包括
HTTP_CONNECTION_LIMIT_REACHED) 时,仍错误重试 S3 请求的问题。#98598 (Sema Checherinda) 。 - 修复了使用 DateTime64 进行分区裁剪时出现的十进制溢出问题。 #98628 (Yarik Briukhovetskyi).
- 修复 JIT 表达式编译中的两个 bug:
nativeCast类型检查里的一处复制粘贴错误,导致整数到整数和 Float 到 Float 的 cast 分支不可达;以及向 LLVMPassBuilder传入了错误的nullptrTargetMachine,致使无法注册特定目标的优化 pass。#98660 (Alexey Milovidov) 。 - 修复了一个 RBAC 绕过漏洞:用户此前可通过指向 localhost 的
remote()、remoteSecure()、cluster()或clusterAllReplicas()对任意表执行DESCRIBE,且无需SHOW_COLUMNS权限。#98669 (pufit). - 修复了以下问题:当非布尔表达式 (例如
sin(col)) 在包含 JOIN 的 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).
- 修复了
LogicalExpressionOptimizerPass中的一个异常:在equals比较中,如果布尔函数返回Variant类型,就会报异常。#98712 (Alexey Milovidov). - 修复
parseDateTimeBestEffort错误地解析以月份/星期前缀开头的单词的问题。关闭 #97965。#98742 (Pavel Kruglov) 。 - 修复在启用新 analyzer 时,对具有不同参数 (例如不同
SKIP字段) 且包含引用 JSON 子路径的 ALIAS 列的 JSON 列使用merge()表函数或Merge引擎进行查询时出现的UNKNOWN_IDENTIFIER异常。关闭了 #97812。#98753 (Pavel Kruglov) 。 - 修复了在
View中使用Distributed存储时,analyzer 对optimize_skip_unused_shards优化处理不正确的问题。#98754 (Nikolai Kochetov). - 修复了在
clickhouse-client中,通过--external传入的外部表无法按名称访问 Tuple 子列的问题 (例如,对Tuple(a UUID, b Int32)使用SELECT x.a) 。关闭 #96925。#98755 (Pavel Kruglov) 。 - 修复
reverseUTF8在无效 (截断的) UTF-8 输入上抛出异常的问题。#98770 (Alexey Milovidov) 。 - 修复在带有 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 内使用包含 JOIN 的
view()表函数时出现的异常 “表名不一致” (仅在旧 analyzer 下) 。#98809 (Alexey Milovidov) 。 - 修复了通过 pending_signals 调整 RLIMIT_SIGPENDING 时的问题。#98829 (Azat Khuzhin) 。
- 修复
loop与 cluster 表函数组合使用时触发的异常。#98860 (Konstantin Bogdanov) 。 - 使用多个连接键列的 LEFT ANTI JOIN 在
enable_join_runtime_filters=1(默认开启) 时会返回错误结果。#98871 (Alexander Gololobov) 。 - 修复
WITH FILL STALENESS在分多个数据块读取数据时 (例如,index_granularity较小时) 产生额外填充行的问题。#98895 (Alexey Milovidov). - 修复了 “RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B” LOGICAL_ERROR。#98900 (Azat Khuzhin) 。
- 修复了由失败的内存分配未回滚、
nallocx(0)的未定义行为以及全局峰值跟踪中的差一错误导致的内存跟踪偏差。并将跟踪范围扩展到io_uring的 Ring buffer。#98915 (Antonio Andelic). - 禁止附加用户路径之外的本地数据湖表,而不只是禁止创建这些表。#98936 (Daniil Ivanik) 。
- 修复了一个竞态条件:在使用
urlCluster或类似 cluster 表函数的查询中,它可能导致出现 “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 (以及其他 domain 类型) 的列进行求和。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) 。
- 修复了
clickhouse-client在TZ环境变量使用 POSIX 文件路径语法时 (例如TZ=:/etc/localtime) 无法切换时区的问题。#99000 (Yash ). - 修复了将
startsWith、LIKE、NOT LIKE用于FixedString列时出现的剪枝不正确或剪枝不足问题。此外,包裹键列的FixedString到String类型转换函数现在也可以进行粒度剪枝。关闭 #98940。#99001 (Nihal Z. Miaji) 。 - 修复了
windowFunnel在遇到重复事件时,启用strict_deduplication会返回错误级别的问题。#99003 (Yash ). - 修复了一个问题:EXISTS 会忽略子查询中的 LIMIT 和 OFFSET 子句,导致当子查询因 OFFSET 或 LIMIT 为 0 而未返回任何行时,结果不正确。关闭 #88722。#99005 (andriibeee) 。
- 修复在使用
GROUPING SETS时,过滤器下推优化遇到可短路为常量的 AND 表达式时触发的 “Block structure mismatch” 异常。 #99010 (Alexey Milovidov). - 修复了在查询计划中未包含
_part_offset列时,读取补丁分区片段 (轻量级更新) 会触发异常的问题。 #99023 (Alexey Milovidov). - 对于类似
SELECT * FROM table WHERE pk_id = ''这样的查询,如果pk_id是主键且类型为String,现在会正确使用主键索引来过滤粒度。 #99027 (Shankar Iyer). - 修复了一个问题:当 materialized view 在后台线程流式传输数据时被 detach,Kafka 引擎会抛出
DEPENDENCIES_NOT_FOUND异常。#99028 (Alexey Milovidov) 。 - 修复了在创建包含与虚拟列 (如
_part_offset) 同名的EPHEMERAL列的表时触发的异常。#99031 (Alexey Milovidov). - 修复了通过带有通配符模式的
url()表函数读取不存在的压缩文件时,误导性的 “inflate failed: buffer error” 报错。现在,当启用http_skip_not_found_url_for_globs时,会按预期返回空结果。#99034 (Alexey Milovidov). - 修复了在 schema 变更 (例如 ADD COLUMN) 后,对 patch part 执行
ALTER TABLE ... DROP PART时发生的 server 崩溃 (std::terminate) 问题。该崩溃是由于空 coverage part 的 metadata 中缺少系统列 (_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) 。
- 修复了在应用 patch 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优化中的一个 bug,该 bug 会导致不匹配的行返回错误结果。相关链接:https://github.com/ClickHouse/ClickHouse/pull/95995。[#99112](https://github.com/ClickHouse/ClickHouse/pull/99112) (Yarik Briukhovetskyi). - 修复
ASTColumnsExceptTransformer::transform中的 LOGICAL_ERROR 异常。#99119 (Pablo Marcos) 。 - 修复了一个 RBAC 绕过漏洞:该漏洞允许用户在未具备所需 source 访问特权的情况下,通过对表函数 (
mysql()、postgresql()、sqlite()、arrowFlight()、jdbc()、odbc()等) 执行DESCRIBE TABLE或CREATE TABLE AS来获取表结构。对于那些从远程服务器推断 schema 的函数,这还会导致用户在未经授权的情况下触发出站连接 (SSRF) 。#99122 (pufit). - 修复 Keeper 在动态重新配置和 leader 切换期间发生的崩溃问题 (NuRaft 中的 segfault) 。#99133 (JIaQi Tang) 。
- 修复了在目标端不支持 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,即使提供了显式的用户标记,也会完全禁用去重。现在,只要提供insert_deduplication_token,无论是否使用ORDER BY ALL,都足以启用去重。 #99206 (Desel72). - 修复
InverseDictionaryLookupPass优化过程中权限检查过多的问题:不再对遍历到的每个节点都检查一次CREATE_TEMPORARY_TABLE权限,而是在该 pass 开始前只检查一次。#99210 (Mikhail Artemenko)。 - 修复了
clickhouse format --obfuscate因混淆跳过索引类型、压缩编解码器名称、数据库引擎名称以及字典布局和数据源定义而生成无效 SQL 的问题。#99260 (Raúl Marín) 。 - 修复了一个 bug:在某些情况下,
Time[64]与DateTime[64]类型之间的比较结果容易引起混淆;现在,遇到这类情况时,会通过添加日期部分1970-01-01,将Time[64]值提升为DateTime[64]。#99267 (Yarik Briukhovetskyi) 。 - 在 DDL 工作线程中收紧分布式 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) 的支持。这些函数本来就无法跳过任何粒度,因此为它们进行索引分析只会徒增开销,毫无收益。#99393 (Anton Popov) 。 - 修复了在 IN 子查询中使用
Distributed表时,新 analyzer 下optimize_skip_unused_shards的问题。#99436 (Nikolai Kochetov). - 修复当查询产生重复列名时,
INTERSECT/EXCEPT中的 heap-use-after-free 问题。#99471 (Alexey Milovidov) 。 - 修复了
ALTER TABLE ... DROP PART在使用带类型的查询参数作为分片名称时的逻辑错误。#99489 (Alexey Milovidov) 。 - 修复了
NOT_FOUND_COLUMN_IN_BLOCK异常:当通过别名在SELECT和WHERE子句中同时引用文本索引谓词 (如hasAllTokens) 时,会触发该异常。#99504 (Anton Popov). - 修复了在对具有各自独立文本索引的列执行 OR 操作时使用
hasAllTokens会导致结果不正确的问题。#99505 (Anton Popov). - 在
clickhouse-local中初始化页缓存,使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创建与虚拟列 (如_part_offset) 同名的EPHEMERAL列时触发的LOGICAL_ERROR。#99549 (Alexey Milovidov) 。 - 修复了因缓存键不匹配导致在移除分片后
VectorSimilarityIndexCache条目始终无法被淘汰的问题。#99575 (Seva Potapov). - 禁止从本地文件读取 Google 凭据。此设置存在安全隐患,因为一旦知道文件路径,就可能读取其他凭据。#99584 (Konstantin Vedernikov).
- 修复 analyzer 中的性能劣化问题。移除 ARRAY JOIN 中未使用的列。#99587 (Dmitry Novik) 。
- 修复了在已启用轻量级删除和行策略的表中读取文本索引时的问题。#99661 (Anton Popov) 。
- 修复 Parquet 读取器在 filter-in-decoder path 遇到已过滤页面时的 nullptr 解引用问题。关闭了 #99676。#99677 (Alexey Milovidov).
- 修复了 AsynchronousReadBufferFromFileDescriptor 在使用 O_DIRECT 时错误的寻道操作。关闭了 #99358。#99678 (Pavel Kruglov)。
- 修复了解压格式错误的压缩数据时,
CompressionCodecT64中的堆缓冲区溢出,以及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) 。 - 修复带有 HAVING 子句的查询中出现的 “块结构不匹配” 异常:当过滤表达式同时包含由会生成 NULL 的函数包装的聚合,以及
materialize(0)时,会触发该问题。#99915 (Alexey Milovidov). - 修复了当
data参数为键类型为 Array 的 Map 或其他嵌套 Array 类型时,sipHash128Keyed(以及类似的带密钥哈希函数) 中的断言失败问题。#99921 (Alexey Milovidov) 。 - 修复在使用
convertAnyJoinToSemiOrAntiJoin优化查询计划期间,IN函数中出现的LOGICAL_ERROR异常 “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).
- 添加一个集成测试,用于复现离线副本场景下 DDL CREATE TABLE + ALTER 的 bug (#44070) ,并将其标记为预期失败。#99259 (Raufs Dunamalijevs).
- 以
je_前缀集成 jemalloc,并移除对链接器--wrap的使用。#99342 (Azat Khuzhin).
向后不兼容的变更
- 默认情况下,所有插入操作都启用去重。此前,异步插入和 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设置的语义现在更加明确了。此前,如果未在 config 中显式设置该 setting,这一功能可能会被自动启用。这一行为反复引发困惑,而且遗憾的是,还在生产环境中导致了一些问题。现在,规则更简单了:do_not_merge_across_partitions_select_final=1会无条件启用该功能。如果do_not_merge_across_partitions_select_final=0,则仅当新的 settingenable_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 会验证这些列名是否确实存在于远程文件的 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 文件,这些文件对Date列使用了uint16。#96860 (Alexey Milovidov).
新特性
- 用户现在可以直接在 ClickHouse 中使用 ClickStack (一款可观测性 UI) ,这对调试和本地开发很有帮助。#96597 (Aaron Knudtson) 。
- 支持将基于时间的一次性密码 (TOTP) 用作身份验证方法。#71273 (Vladimir Cherkasov) 。
- 新增
lazy_load_tables数据库设置。启用后,数据库启动时不会加载表,而是先创建一个轻量级的StorageTableProxy,并在首次访问时再将真实的表引擎 materialized。#96283 (xiaohuanlin) 。 - 新增了
input_format_max_block_wait_ms设置,以便在超时后输出数据块,并允许在 HTTP 连接意外关闭时继续处理剩余数据。#94509 (Mostafa Mohamed Salah). - Google BigLake catalog 集成。已关闭 #95339。#97104 (Konstantin Vedernikov) 。
- 新增系统表
system.tokenizers,用于展示所有可用的分词器。#96753 (Robert Schulze) 。 - 新增系统表
system.user_defined_functions,用于监控 UDF 的加载状态及其配置。#90340 (Xu Jia) 。 - 新增
system.jemalloc_stats表,用于公开 jemalloc 内存分配器的统计信息 (通过malloc_stats_print) ,以便诊断使用 jemalloc 构建的服务器上的内存使用情况。另在 ClickHouse HTTP interface 上新增了/jemalloc.htmlHTTP 端点,用于以交互方式可视化这些统计信息。#97077 (Antonio Andelic). - 新增了
system.jemalloc_profile_text表,用于读取和分析 jemalloc 堆内存剖析数据。输出格式由jemalloc_profile_text_output_format设置控制 (raw、symbolized 或 collapsed;默认为 collapsed) 。内联帧解析由jemalloc_profile_text_symbolize_with_inline控制 (启用时,会包含内联帧,但符号化速度会变慢;禁用时,则会跳过内联帧以加快输出) 。对于 collapsed 格式,jemalloc_profile_text_collapsed_use_count控制技术栈是按存活分配次数 (true) 还是按存活字节数 (false,默认) 加权。这使 jemalloc 堆内存剖析的内存分析和火焰图可视化更加便捷。修复了 #93248。#97218 (Antonio Andelic) 。 - 新增
default_dictionary_database设置,使 ClickHouse 能够在指定的默认数据库中解析未带数据库限定符的 external dictionaries 引用。这简化了从以 XML 定义的全局字典迁移到以 SQL 定义的按数据库划分的字典——让现有的字典查询 (例如 dictGet(‘name’, …)) 无需修改即可继续使用。#91412 (Dmitrii Plotnikov) 。 - 为
DatabaseReplicated添加对辅助 ZooKeeper 的支持。#91683 (RinChanNOW) 。 - 新增了表函数
primes和系统表system.primes,其中包含按升序排列的质数。关闭 #90839。#92776 (Nihal Z. Miaji) 。 - 异步插入支持并行 quorum。插入的数据会复制到满足 quorum 的副本上。如果发现重复项,查询会等待,直到先前插入的数据也完成复制。#93356 (Sema Checherinda).
- 新增函数
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>查询,可在不提交结果分片的情况下模拟合并操作。它可用于测试场景:验证新版本中合并操作的正确性、确定性地复现与合并相关的 bug,以及可靠地对合并性能进行基准测试。#96122 (Anton Popov). - 新增一项默认启用的检查,可通过设置
check_named_collection_dependencies控制,以避免删除被表使用的命名集合。#96181 (Pablo Marcos) 。 - 新增了
system.fail_points,可用于查看服务器中现有的 failpoint 以及它们是否已启用。这将有助于实现测试自动化。#96762 (Pedro Ferreira) 。 - 为 Glue catalog 添加基于角色的访问。使用
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) 。
Experimental 功能
- 文本索引现已 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。启用后,推断出的 Tuple 类型可以为Nullable(Tuple(...)),这样缺失的嵌套对象就会变为NULL,而不是由NULL元素组成的 Tuple。#95525 (Nihal Z. Miaji)。 use_statistics_cache设置现已默认启用,因此列统计信息会缓存在内存中,从而加快查询优化,而无需从每个 part 重新加载。#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) 。
- 允许在本地文件和对象存储表函数中使用用户态页缓存。#77874 (Michael Kolupaev) 。
- 避免用户态页缓存中不必要的 memcpy 操作。#77884 (Michael Kolupaev) 。
concurrent_threads_scheduler的默认值现已由fair_round_robin改为max_min_fair。这一调整通过优先处理已分配槽位较少的查询,提升了高负载下的公平性,从而避免短时查询因长时查询而吃亏。#95300 (Sergei Trifonov).- 如果某个
FINAL查询先使用主键条件进行过滤,再对其他条件使用跳过索引,那么PrimaryKeyExpand处理步骤现在只会检查最初筛选出的主键范围是否相交。#94903 (Shankar Iyer) 。 - 当并行副本与
s3(...)等表函数配合使用时,仅包含一个封装该表函数的子查询的查询现在也会自动在各个副本间并行执行;而此前只有直接引用表函数的查询才会并行执行。关闭 #92264。#96332 (phulv94). - 支持将缓存中的数据文件和系统文件分别拆分到独立的分段中。#87834 (MikhailBurdukov) 。
- 通过为
ColumnVector::replicate实现动态分派,提升了某些哈希 join 操作的速度。#79573 (Raúl Marín) 。 - 针对复杂谓词场景下的并行哈希连接进行了性能提升。此前,未连接的行仅由单个线程处理,这样的效率并不理想;此次优化的思路是将未连接行的处理并行化,分配到多个线程中执行。可通过
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) 。
- 当 read step 已有 PREWHERE 过滤器时,就无法再添加新的过滤器。此更改将 PREWHERE 优化推迟到 JOIN 运行时过滤器优化之后,以便也能将运行时过滤器下推到 PREWHERE。 #95838 (Alexander Gololobov).
- 通过在 x86 上使用动态分派,加速
T64编解码器的压缩。 #95881 (Raúl Marín). - 在可能的情况下,通过对插入操作进行批处理来加速数值类型上的
uniq(非 NULL、非 -If、无 GROUP BY、无 IPv6 或 String) 。#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). - 如果哈希表为空,调整大小时不要复制旧数据。#96180 (Raúl Marín).
- 支持在
RIGHT OUTERJOIN 中使用运行时过滤器。#96183 (Hechem Selmi) 。 - 优化项
enable_join_runtime_filters现在默认启用。#89314 (Alexey Milovidov) 。 - 此前,只有当所有 parts 都具有 materialized 文本索引时,才会应用文本索引直接读取优化。此 PR 新增了部分支持:如果某些 parts 具有 materialized 文本索引,这些 parts 将使用该索引;而没有 materialized 文本索引的 parts 则会回退到执行原始过滤表达式。#96411 (Anton Popov).
- 为系统日志表中的时间列添加了
minmax次级索引,并为query_id/initial_query_id列添加了bloom_filter索引,以提升过滤速度。#96712 (Alexey Milovidov). - 现在,惰性物化优化已扩展到
UNION ALL查询的所有分支,不再仅作用于第一个分支。对于通过UNION ALL组合来自不同MergeTree表的多个已排序且带 LIMIT 的读取操作的查询,现在每个分支都能受益于延迟列读取,从而减少 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) 。 - 无论最终执行的是本地 plan,还是带有并行副本的 plan,索引分析 (在大多数情况下) 都只需进行一次。 #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). - 为多个连接实现等价集合优化。包含多个连续
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 中,不必为每个虚拟查询都更新已缓存的集群。#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 的主线程中重置其状态。当 host ID 更新时,这有助于刷新副本的活跃状态。#93780 (Tuan Pham Anh) 。
- 在
system.part_log中为MUTATE_PART和MUTATE_PART_START事件类型添加了对mutation_ids的支持。#93811 (Shaohua Wang) 。 - 后台操作 (Mutate、Merge) 现在可通过 ‘background’ profile 单独配置。此前,这类操作通过 ‘default’ profile 与常规查询共用设置。#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 访问令牌。此更改关闭了 #93981。#95069 (Konstantin Vedernikov).
- 如果 ClickHouse 持续处于内存压力下达
memory_worker_decay_adjustment_period_ms毫秒,则禁用 jemalloc 的脏页衰减。如果 ClickHouse 在相同时间内恢复正常运行,则重新启用 jemalloc 的脏页衰减。#95145 (Antonio Andelic) 。 - S3Queue 现已支持辅助 ZooKeeper,可使用 s3Queue 中的
keeper_path设置。#95203 (Diego Nieto) 。 - 在生存时间 (TTL) drop part merge 中遵循
max_parts_to_merge_at_once限制。#95315 (Kseniia Sumarokova) 。 - 向 query_log 添加
connection_address和connection_port,以反映物理连接 (当通过 proxy 连接且 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) 。
- 启用统计信息缓存,并将缓存更新周期设置为 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 扩展的支持,以改进 Database Replicated 中的表拉取能力。#96090 (Nikolay Degterinsky). - 将 chdig 更新至 v26.2.1 (新增功能并支持 MacOS) 。#96113 (Azat Khuzhin) 。
- 改进了
numbers和primes的过滤器下推。现在,当无法推导出精确边界时,ClickHouse 可以根据WHERE条件推导出保守的取值边界,并据此限制序列生成 (例如,对于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_user配置项现已移至access_control_improvements部分中,不再作为独立的服务器级设置。#96451 (Vitaly Baranov).- 使
core_dump.size_limit配置项支持热重载,避免为使配置更改生效而必须重启服务器。#96524 (Miсhael Stetsyuk) 。 - 改进了 CPU 和实时 Profiler 与套接字超时机制之间的兼容性。#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/ipv6设置) 即使在禁用 DNS 缓存时也会生效。#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) 。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 在仅修改 metadata 的 ALTER 操作 (例如扩展枚举的元素) 之后,使用投影优化聚合时最终可能会导致异常。#84143 (Alexey Milovidov) 。
- materialized views 现在会使用其创建所在的 database 作为执行上下文,这意味着:- 可以在视图的 select 查询中省略所引用名称的显式 database 限定 - 如果未显式指定 database 限定,则默认使用创建 materialized view 时所在的同一个 database。 #88193 (Dmitry Kovalev).
- 修复了在使用 ON CLUSTER 时,CREATE USER 身份验证方法中的查询参数替换问题。身份验证方法中的查询参数 (例如密码) 此前不会被替换,导致远程节点上出现 UNKNOWN_QUERY_PARAMETER 错误。#92777 (xiaohuanlin).
- 修复了
has、mapContainsKey和mapContainsValue函数在文本索引分析中的结果不一致问题。此前,使用这些函数的查询在表达式通过文本索引求值或不通过文本索引求值时,可能返回不同的结果。#93578 (Anton Popov). - 修复了在将表附加到
MaterializedPostgreSQL数据库时,若dropReplicationSlot在栈展开过程中抛出异常而导致崩溃的问题。#96871 (Alexey Milovidov) 。 - 如果同时对同一文件执行大量彼此冲突的备份操作,可能会导致服务器崩溃。#93659 (Alexey Milovidov).
- 修复了在使用并行副本且对非 MT 表执行 JOIN 时的查询问题。关闭 #92056。#93902 (Igor Nikonov) 。
- 修复了一个问题:当 Iceberg 列名中包含点号时,其值会返回为 NULL。#94335 (Mikhail Koviazin).
- 修复了
stringJaccardIndexUTF8中 UTF8 字符串处理的问题,并提升了性能。#94613 (Joanna Hulboj) 。 - 修复
WITH FILL STALENESS中可能发生的溢出问题 (会导致 UB 和/或无限循环) 。修复因跨度过大而导致的潜在无限循环。新增对旧 analyzer 的支持 (主要用于压力测试) 。#94663 (Azat Khuzhin). - 修复了在主机名解析到多个地址且远程副本冻结时,分布式查询可能挂起的问题。#94726 (c-end).
- 修复在连接多个表表达式时,当最左侧的表表达式为
-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 view 的 Iceberg 表执行
INSERT时丢失去重信息并导致异常的问题。 #94938 (Daniil Ivanik). - 修复了一个 bug:
SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME>原本会删除整个集群上的全部缓存。#94978 (Rory Crispin). - 在 Vertical merge 后保留恒定的索引粒度 (use_const_adaptive_granularity) (包括修复了 Nested 的 v2 以及一般情况) 。#95013 (Azat Khuzhin) 。
- 修复了在 [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764) 之后,26.1 版本中文件系统缓存的竞争问题。#95042 (Kseniia Sumarokova) 。
- 修复在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 时,无法取消 postgresql() 表函数的问题。#95136 (Roman Vasin).
- 修复了在使用多个 join 且带有
USING子句时,对源表中带限定名前缀的列进行类型推断的问题。此前,后续 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) 。 - 在获取清单 .avro 列表和文件内容时,仅对列执行一次转换。#95164 (Daniil Ivanik).
- 修复了 JSON 列大小计算错误的问题,此问题可能导致内存占用过高或列统计信息错误。#95207 (Azat Khuzhin).
- 修复了在轻量级更新后应用大型补丁分区片段时内存统计不准确的问题。此前,应用大型补丁可能导致内存占用过高,并使服务器进程被 OOM killer 杀死。#95231 (Anton Popov).
- 修复了一处未定义行为:当启用
max_parallel_replicas的分布式查询在索引分析期间回退到本地副本时,可能导致结果错误或抛出异常。 #95263 (Azat Khuzhin). - 修复在
group_by_overflow_mode设为any时,sum和时间序列对稀疏列的聚合问题。#95301 (Mikhail Koviazin) 。 - 修复了
plain_rewritabledisk policy 中的一个可靠性问题:如果在解除元数据文件链接的过程中途发生网络错误,可能会导致存储处于不一致状态。#95302 (Mikhail Artemenko) 。 - 将 Iceberg 的 Date 替换为 Date32。#95322 (Konstantin Vedernikov) 。
redis表函数的密码参数现在会在日志和系统表 (例如:query_log) 中进行脱敏处理。#95325 (János Benjamin Antal) 。- 修复了一个 bug:在分布式查询仍在访问某些表时,这些表可能被删除或修改,从而导致异常或错误结果。#95356 (Azat Khuzhin) 。
- 修复了某些情况下在分布式查询中使用负数
LIMIT/OFFSET时的逻辑错误。#95357 (Nihal Z. Miaji) 。 - 修复了一个问题:通过 ssh 连接时,clickhouse-client 会要求输入两次密码。 #95372 (Isak Ellmer).
- 修复存储 S3(Azure)Queue 中的数据竞争问题。#95385 (Kseniia Sumarokova) 。
- 修复了由 prewhere 中的 lambda 表达式引发的 prewhere 过滤器错误。#95395 (Xiaozhe Yu) 。
- 修复
optimize_syntax_fuse_functions:当聚合参数为Nullable时,不再将sum/count/avg重写为sumCount()。关闭 #95390。#95441 (Nihal Z. Miaji) 。 - 避免在取消时分布式查询可能发生的崩溃。#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 引入的 (Experimental) 零拷贝复制回归问题:共享 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 数据在 squashing 过程中的问题。#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).
- 修复了这样一个崩溃问题:在与使用即将被删除的 workload 的查询并发执行时运行 DROP WORKLOAD,可能会导致崩溃。#95856 (Alexey Milovidov) 。
- 修复了当用户仅在许多数据库上具有受限授权时,查询系统表性能缓慢的问题。关闭 #89371。#95874 (pufit)。
- 修复了在带有嵌套路径的 JSON 上执行 tupleElement 时的问题,此前该问题可能导致查询结果错误。#95907 (Pavel Kruglov).
- 修复了在空 MergeTree 表上使用
directjoin 算法时可能出现的NOT_SUPPORTED错误。#95935 (Vladimir Cherkasov) 。 - 修复客户端不会为设置项建议并自动补全别名的问题,关闭 #92190。#95945 (phulv94) 。
- 修复 system.asynchronous_metric_log 中的 event_date 问题。 #95947 (Raúl Marín) 。
- 修复了 JSON 数据类型中的 skipping paths 问题。此前,使用
JSON(SKIP path)时,所有以前缀path开头的 JSON 键都会被跳过,甚至包括"pathpath"这样的键,因此在插入时可能导致这些 paths 的数据丢失。现在该问题已修复,只有键"path"会被跳过。#95948 (Pavel Kruglov) 。 - 包含未知投影的分片不应被永久标记为丢失。#95952 (Mikhail Artemenko).
- 修复
Join表中使用Nullable(String)键时空字符串变为NULL的问题。关闭 #71414。#96002 (Alexey Milovidov) 。 - 现在,PostgreSQL 引擎已能正确读取
BOOLEAN[]。修复了 #72754。#96006 (Alexey Milovidov) 。 - 修复了从空文件读取时
ProtobufList格式的问题。关闭 #70059。#96007 (Alexey Milovidov) 。 - 修复
ProtobufListformat 在空表中产生幽灵记录的问题。关闭 #72596。#96010 (Alexey Milovidov) 。 - 修复了在涉及 distributed queries、PREWHERE 和类型推断的一种特殊情况下,
if函数在UInt64与Int32之间的类型不匹配问题。关闭 #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).
- 修复全局性能分析器的周期设置问题 (由
global_profiler_real_time_period_ns和global_profiler_cpu_time_period_ns控制) 。此前使用的是截断后的值,而不是设定值,导致性能分析器的唤醒频率高于预期。#96048 (Antonio Andelic) 。 - 此前,如果用于 position delete 的 Iceberg manifest 文件中,引用的数据文件在某个条目里存在但其值为 NULL,我们就无法获取对应数据文件的正确范围。此 PR 修复了这个 bug。#96061 (Daniil Ivanik) 。
- 修复撤销默认角色时出现的问题。#96103 (Vitaly Baranov) 。
- 修复了索引分析中的释放后使用问题,该问题会在罕见情况下出现:禁用
use_primary_key,且使用索引的条件析取数量非常大。#96112 (Alexey Milovidov) 。 - 修复了
Gorilla编解码器中的一个回归问题:当显式指定的大小与数据类型大小不一致,且缓冲区大小过小时,先前版本会在解压缩时抛出异常。关闭 #78253。#96118 (Alexey Milovidov) 。 - 避免在字典加载时出现死锁:当某个字典引用了一个又递归引用该字典的 Merge 表时。关闭 #78360。#96120 (Alexey Milovidov) 。
- 修复了
formatDateTime在使用非固定宽度格式说明符 (如 MySQL 和 JODA 风格) 时会使用未初始化值的问题。#96133 (Alexey Milovidov). - 设置
use_const_adaptive_granularity与index_granularity_bytes的组合 (即“非自适应粒度”) 会导致待读取行数计算错误,并引发异常。#96143 (Alexey Milovidov) 。 - 在对象存储的类文件表 (如 S3 和 Azure) 上执行无效的 ALTER UPDATE 变更,可能会导致空指针解引用。已关闭 #92994。#96162 (Alexey Milovidov) 。
- 修复
AccessRights::contains在部分撤销权限时返回错误结果的问题。#96170 (pufit) 。 - 修复了 CTE 折叠常量导致的查询条件缓存哈希冲突问题,该问题可能会导致查询结果错误。关闭 #96060。#96172 (Alexey Milovidov) 。
- 修复 ProcessList 中可能出现的死锁问题。当我们向 cancellation checker 添加任务时,如果此时触发了内存 overcommit 跟踪器,可能会因潜在的锁顺序反转而导致这种情况发生。#96182 (Antonio Andelic).
- 修复了一个错误:当包含外连接 (LEFT、RIGHT 或 FULL) 的查询与多个 INNER JOIN 结合使用时,由于不合法的 JOIN 重排序,可能会返回错误结果。当外连接的 ON 条件引用了之前已连接的多个表中的列时,优化器未能正确考虑所有表依赖关系,因此可能错误地重排 JOIN,导致部分行丢失。关闭 #95972。#96193 (Vladimir Cherkasov) 。
- 当表未定义统计信息时,ClickHouse 不应尝试加载这些统计信息。这样可避免为检查统计信息文件是否存在而带来的额外开销 (100+ms) 。 (issue #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) 。
- 修复了以下逻辑错误:当表的主键为 Nullable,且查询使用了
coalesce函数并且其第一个参数为常量时,KeyCondition 会出现逻辑错误。#96340 (Alexey Milovidov) 。 GROUPING SETS、group_by_use_nulls以及内部包含LowCardinality的Tuple数据类型相互作用时,可能会在查询管道中产生异常的块结构,进而导致逻辑错误。这个问题是在引入NullableTuple之后出现的。#96358 (Alexey Milovidov) 。- 此前可以创建将空表达式
()用作索引的表,这会导致无效的内存访问。#96363 (Alexey Milovidov). - 修复了旧版 analyzer 在 JOIN 与重复别名同时出现时的崩溃问题。#96405 (Ilya Golshtein).
- 修复了因对 Variant 列进行错误的原地过滤优化而导致的
Nested columns sizes are inconsistent with local_discriminators错误。#96410 (Alexey Milovidov). - 修复
CREATE TABLE ... CLONE AS ...忽略源表完整限定名称的问题。#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 表写入中的一个缺陷:分区插入可能导致数据在各分区文件间分布不正确。#96620 (Konstantin Vedernikov) 。
- 修复了在带约束的
CREATE TABLE中出现的heap-use-after-free问题。#96669 (Nikita Taranov). - 在 bech32 中校验 witness version,以避免缓冲区溢出。#96671 (Raúl Marín) 。
- 修复在使用无效的
auth_header设置创建数据湖 REST catalog 时,system.tables报错的问题。#96680 (Han Fei). - 修复在生存时间 (TTL) 合并后,当一个块中的所有行都被过滤掉时,
_minmax_count_projection会使min(timestamp)返回纪元 (1970-01-01) 的问题。 #96703 (Raquel Barbadillo). - 改进了对
iceberg_metadata_file_path设置项的校验,以防止路径遍历,并确保指定的元数据文件位于表目录内。#96754 (Daniil Ivanik) 。 - 修复了在
GROUP BY中使用Variant参数时ifNull崩溃的问题。#96790 (Alexey Milovidov). - 修复了启用
table_disk=1设置的表之间发生的缓存键冲突。#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 错误而导致备份失败时,server 崩溃的问题。#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时结果不正确的问题 (例如,在混用 DateTime 类型的CASE/if/multiIf中) 。该值此前被重新解释,而不是按正确标度进行缩放,导致表达式编译生效后生成错误的时间戳。#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的 accumulator 参数) 。#96892 (Alexey Milovidov) 。 - 修复对复杂嵌套类型 (Array 中包含 Nullable Tuple,而该 Tuple 又包含带有 Nullable 枚举值的 Map) 进行类型转换时出现的
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异常 (或在 release 构建中导致静默数据损坏) 问题。#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为已变更的 part 重新将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). - 修复了这样一个
LOGICAL_ERROR异常:当WHERE子句中的arrayJoin引用JOIN两侧的列时会触发该异常。#97239 (Alexey Milovidov). - 修复在带有 PREWHERE 的 Tuple 中读取稀疏
Nullable(String)的.size子列时触发的LOGICAL_ERROR异常。#97264 (Alexey Milovidov) 。 - 修复在使用
ORDER BY ... LIMIT从采用非自适应索引粒度 (index_granularity_bytes = 0) 的表读取数据时,LazyMaterializingTransform中出现的异常 “lazy chunk 中的行数与 offsets 数量不一致”。#97270 (Alexey Milovidov). - 修复了一个问题:当因非 ZooKeeper 异常 (例如
memory limit) 导致表重建失败时,SYSTEM RESTART REPLICA会使该表从数据库中丢失,从而导致DatabaseReplicated中的元数据摘要不匹配。#97276 (Alexey Milovidov) 。 system.merge_tree_settings中的readonly字段现在会正确显示某些 merge tree 设置 (例如index_granularity) 为无条件只读。#97277 (Robert Schulze).- 修复了在对
MergeTree表进行count()优化时的崩溃问题:当存储快照是在没有数据的情况下创建时,会触发该问题。 #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备份中的 segfault,原因是在惰性备份批次中对悬空存储指针发生了释放后使用。 #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以不匹配的列类型替换已转换的数组列时,会触发该异常。关闭 #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中出现的异常 “lazy chunk 中的行数与 offsets 数量不匹配”。 #97482 (Alexey Milovidov). - 修复向 Iceberg 插入数据的相关设置问题。为
allow_experimental_insert_into_iceberg设置添加别名。#97483 (Konstantin Vedernikov) 。 - 修复了一个问题:当
optimize_inverse_dictionary_lookup优化重写dictGet(...)谓词时,没有CREATE TEMPORARY TABLE权限的用户会收到ACCESS_DENIED。ClickHouse 现在会跳过该重写,执行原始表达式。关闭 #97269。#97484 (Nihal Z. Miaji) 。 - 修复了
Set和MergeTreeIndexSet在处理包含内部稀疏子列的列时触发的断言失败问题 (在 debug/sanitizer 构建中表现为异常) ,例如来自具有不同稀疏序列化 profile 的 MergeTree parts 的Tuple列。#97493 (Alexey Milovidov). - 修复了 StorageKafka2 中一个可能的释放后使用 (use-after-free) 问题。#97520 (Bharat Nallan).
- 修复当输出路径包含目录时,
INTO OUTFILE与TRUNCATE及into_outfile_create_parent_directories设置配合使用时的问题。#97549 (Alexey Milovidov) 。 - 修复了在启用 analyzer 时,通过
merge()表函数查询其 ALIAS 列中包含 lambda 表达式的表时出现的BAD_ARGUMENTS错误。#97551 (Alexey Milovidov) 。 - 修复 Keeper zxid 为 0 时
system.zookeeper_info抛出异常的问题。#97553 (Alexey Milovidov) 。 - 修复了
ip_trie字典在键类型不是String时可能存在的逻辑错误。#97555 (Bharat Nallan). - 修复了基础
RestCatalog的 REST catalog OAuth 身份验证失效的问题 (此前仅对OneLakeCatalog等派生 catalog 生效) 。这导致在引入 BigLake catalog 后,默认 REST catalog 无法正常工作。 #97561 (Konstantin Vedernikov). - Geometry 函数 (
perimeterSpherical、areaSpherical等) 现在除了GeometryVariant 类型外,也接受单独的几何子类型 (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 的加固机制才被发现。它很可能发生在查询计划反序列化期间:较新的服务器向较旧的服务器发送了后者无法识别的 setting。基于字符串的读取方法已经正确处理了这种情况;readBinary则缺少同样的检查。#97585 (Miсhael Stetsyuk).- 修复了
UNION ALL查询在某个分支的谓词恒为假时返回错误结果的问题——该分支本应不返回任何内容,却会错误地读取数据。#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 事务日志文件时发生异常的问题。 #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.sym文件。#96477 (Ilya Yatsishin). - 将集成测试中使用的第三方 Docker 镜像固定为特定版本。#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的生成提前到配置时,以提升构建并行度。#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).
- 用 llvm-libc 的实现替换 glibc 中的数学函数。 #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 个 Tier-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 头文件中移除,缩小Exception.h的包含范围。#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) 。
向后不兼容的变更
- 修复了因在格式说明符中错误替换别名而导致的格式不一致问题。此项更改关闭了 #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) 。
- 撤销“允许向简单 ALIAS 列执行 INSERT” (回退了 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). - 对索引文件名进行转义,以避免 parts 损坏。此更改后,ClickHouse 将无法加载由旧版本创建、名称中包含非 ASCII 字符的索引。要处理这个问题,你可以使用 MergeTree 设置
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 表中定义的键列以及要获取的 attribute 列的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,但对这类权限检查而言,这并不是正确的 grant。 #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)。
- 引入了新的语法和框架,用于简化并扩展投影索引功能。这是对 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,以禁用基于主键的粒度剪枝。#93319 (Nihal Z. Miaji). - 新增了
icebergLocalCluster表函数。#93323 (Anton Ivashkin) 。 - 新增了
cosineDistanceTransposed函数,可近似计算两点之间的余弦距离。#93621 (Raufs Dunamalijevs) 。 - 为 system.parts 表新增
files列,用于显示每个数据分区片段中的文件数量。#94337 (Match) 。 - 新增了一个用于并发控制的 max-min fair 调度器。在高超额订阅场景下 (即大量查询竞争有限的 CPU 插槽时) ,可提供更好的公平性。短时运行的查询不会因为长期运行、且随着时间推移占用更多插槽的查询而受到影响。可通过将
concurrent_threads_scheduler服务器设置设为max_min_fair来启用。#94732 (Sergei Trifonov) 。 - 支持 ClickHouse client 在连接到服务器时覆盖 TLS SNI。#89761 (Matt Klein) 。
- 支持在
joinGet函数调用中使用临时表。#92973 (Eduard Karacharov) 。 DeltaLake表引擎现已支持删除向量。#93852 (Kseniia Sumarokova) 。- 为
deltaLakeCluster增加对删除向量的支持。#94365 (Kseniia Sumarokova) 。 - 支持 Google 云存储数据湖。#93866 (Konstantin Vedernikov) 。
Experimental 功能
- 将
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).
性能提升
- 设置
use_skip_indexes_on_data_read现已默认启用。该设置支持在读取数据的同时以流式方式进行过滤,从而提升查询性能并缩短启动时间。#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) 。 - 允许使用等价集合将过滤器下推到
SEMI JOIN。已关闭 #85239。#92837 (Dmitry Novik). - 当右侧为空时,跳过读取
hash join的左侧。此前,我们会一直读取左侧,直到遇到第一个非空块;而在过滤或聚合开销较大的情况下,这可能会导致大量额外工作。#94062 (Alexander Gololobov). - 在查询管道中使用 “fastrange” (Daniel Lemire) 方法对数据进行分区。这有望提升并行排序和 JOIN 的性能。#93080 (Alexey Milovidov) 。
- 当 PARTITION BY 与排序键一致或为其前缀时,窗口函数性能得到提升。#87299 (Nikita Taranov) 。
- 外层过滤器可下推到视图中,从而能够在本地和远程节点上应用 PREWHERE。已解决 #88189。#88316 (Igor Nikonov) 。
- 为更多函数实现了 JIT 编译。关闭 #73509。#88770 (Alexey Milovidov 与 Taiyang Li) 。
- 如果在
FINAL查询中使用的跳过索引位于主键列上,那么就无需再额外检查其他 parts 中的主键交集,现已不再执行该步骤。解决了 #85897。#93899 (Shankar Iyer) 。 - 优化对小数
LIMIT和OFFSET的性能及内存占用。#91167 (Ahmed Gouda). - 修复 Parquet Reader V3 预取器未使用更快随机读取逻辑的问题。关闭 #90890。#91435 (Arsen Muk) 。
- 提升
icebergCluster性能。关闭 #91462。#91537 (Yang Jiang) 。 - 不要在常量过滤条件中按虚拟列进行过滤。#91588 (c-end) 。
- 通过启用自适应写入缓冲区,利用 wide parts 降低超宽表在 INSERT/merges 时的内存占用。新增对加密磁盘的自适应写入缓冲区支持。#92250 (Azat Khuzhin).
- 通过减少索引中需要搜索的标记数量,提升了使用文本索引和
sparseGrams分词器进行全文检索的性能。#93078 (Anton Popov) 。 - 函数
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) 。
- 在以下情况下禁用 join 运行时过滤器,以降低开销:- bloom filter 中置位过多 - 运行时被过滤掉的行过少。#91578 (Alexander Gololobov) 。
- 对关联子查询的输入使用内存缓冲区,以避免被多次求值。属于 #79890 的一部分。#91205 (Dmitry Novik).
- 允许所有副本在并行副本读取期间并行接管孤立范围。这有助于改善负载均衡并降低长尾延迟。#91374 (zoomxi).
- 外部聚合/排序/连接现在会在所有上下文中遵循查询设置
temporary_files_codec。修复了 grace hash join 缺少 profile events 的问题。#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) 。 - 降低非 Linux 系统上的内存占用 (启用 jemalloc 脏页的即时清理) 。#93360 (Eduard Karacharov).
- 当脏页大小占
max_server_memory_usage的比例超过memory_worker_purge_dirty_pages_threshold_ratio时,强制清理 jemalloc arena。 #93500 (Eduard Karacharov). - 减少 AST 的内存占用。#93601 (Nikolai Kochetov) 。
- 在某些情况下,我们发现 ClickHouse 在从表中读取数据时不会遵守内存限制。此问题已修复。#93715 (Nikita Mikhaylov) 。
- 默认启用
CHECK_STAT和TRY_REMOVE这两个 Keeper 扩展。#93886 (Mikhail Artemenko) 。 - 解析 Iceberg manifest 文件条目中与位置删除对应的文件名上下界,以便更准确地筛选相应的数据文件。#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 数据时创建的动态子列数量,从而支持在 insert 时指定该限制。#94184 (Pavel Kruglov) 。 - 在某些情况下,对 JSON 列的压缩合并进行了小幅优化。 #94247 (Pavel Kruglov).
- 根据生产环境中的实践经验,下调线程池队列大小。在从 MergeTree 读取任何数据之前,增加显式的内存占用检查。#94692 (Nikita Mikhaylov) 。
- 确保调度器在 CPU 资源严重不足时优先调度 MemoryWorker 线程,因为这可以保护 ClickHouse 进程免受致命威胁。#94864 (Nikita Mikhaylov) 。
- 将 jemalloc 脏页的清理放到独立于 MemoryWorker 主线程的其他线程中执行。如果清理速度较慢,可能会延迟 RSS 使用量的更新,从而导致进程因内存不足而被杀死。引入新的 config
memory_worker_purge_total_memory_threshold_ratio,根据总内存使用量的比例开始清理脏页。#94902 (Antonio Andelic) 。
改进
- 现已支持在 Azure Blob 存储中使用
system.blob_storage_log。#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 client 现在可以像以前一样使用 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) 。 - 防止将
x-amz-server-side-encryption请求头传递到HeadObject、UploadPart和CompleteMultipartUpload的 S3 请求中,因为这些请求不支持该请求头。#64577 (Francisco J. Jurado Moreno). - 为 S3Queue 的 ordered 模式添加对 Hive 分区的跟踪支持。解决了 #71161。#81040 (Anton Ivashkin) 。
- 优化文件系统缓存中的空间预留。
FileCache::collectCandidatesForEviction将在不加 unique lock 的情况下执行。#82764 (Kseniia Sumarokova) 。 - 支持服务器日志的组合轮换策略 (大小 + 时间) 。#87620 (Jianmei Zhang).
- CLI 客户端现在可指定
<warnings>false</warnings>,无需再使用命令行参数--no-warnings。 #87783 (Larry Snizek). - 新增了对
avg聚合函数的支持,可将 Date、日期时间和 Time 值用作参数。解决了 #82267。#87845 (Yarik Briukhovetskyi). - 优化项
use_join_disjunctions_push_down默认处于启用状态。#89313 (Alexey Milovidov) 。 - 关联子查询现已支持更多表引擎和数据源类型。关闭了 #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表函数的 named collections 中指定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的 tracing 限定为指定的事件名称列表,从而能够在大型工作负载上更精确地收集数据。#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 dyn tables 的列描述传递给字典源。#92391 (MikhailBurdukov) 。
- 在 #63985 中,我们实现了可按端口分别指定 TLS 配置所需的全部参数 (参见可组合协议) ,因此不再依赖全局 TLS 配置。不过,当前实现仍会隐式要求存在全局
openSSL.server配置节,这与不同端口需要不同 TLS 配置的场景存在冲突。比如,在 keeper-in-server 部署中,我们需要为 keeper 之间的通信和 clickhouse client 连接分别配置独立的 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 reader 处理空元组。#92868 (Michael Kolupaev) 。
- 当原生复制因 BadRequest 失败时 (例如块列表无效) ,会回退为对 Azure Blob 存储执行读写复制。此前,只有在将 blob 复制到不同存储账户时遇到 Unauthorized 错误,才会执行这种回退。但我们有时也会遇到“指定的块列表无效”错误。因此,现在已更新条件:只要原生复制失败,都会回退到读写方式。#92888 (Smita Kulkarni).
- 修复了在使用 EC2 实例 profile 凭证运行大量并发 S3 查询时,EC2 metadata 端点遭到限流的问题。此前,每个查询都会各自创建一个
AWSInstanceProfileCredentialsProvider,从而并发请求 EC2 metadata 服务,这可能导致超时和HTTP response code: 403错误。现在,凭证提供商会被缓存,并在所有查询间共享。#92891 (Sav). - 调整
insert_select_deduplicate设置,新增保持向后兼容的能力。#92951 (Sema Checherinda) 。 - 将慢于平均水平的后台任务记入日志 (
background_schedule_pool_log.duration_threshold_milliseconds=30) ,以避免记录过多任务日志。#92965 (Azat Khuzhin) 。 - 在早期版本中,
system.trace_log和system.symbols中部分 C++ 函数名显示不正确 (“mangled”) ,而且demangle函数也无法很好地处理这些名称。关闭 #93074。#93075 (Alexey Milovidov) 。 - 引入了
backup_data_from_refreshable_materialized_view_targets备份设置,用于跳过可刷新materialized views 目标表数据的备份。采用 APPEND 刷新策略的 RMV 始终会被备份。 #93076 (Julia Kartseva). #93658 (Julia Kartseva) - 对于较大的编译单元 (如函数) ,使用最少的调试信息,而不是完全禁用调试信息。#93079 (Alexey Milovidov).
- 通过为 MinIO 特有错误实现错误码映射,AWS S3 C++ SDK 现已增加对 MinIO 的兼容性支持。此变更使 ClickHouse 在使用 MinIO 部署而非 AWS S3 时,能够正确处理并重试 MinIO 服务器错误,从而提升在 self-hosted 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 的用户体验:对函数名使用 String 字面量,修正所有匹配的函数,并允许在
REMOVE中使用 function_name。#93345 (Pablo Marcos) 。 - 新增设置
materialize_statistics_on_merge,用于在 merge 期间启用/禁用统计信息物化。默认值为1。#93379 (Han Fei) 。 - ClickHouse 现在可以解析
DESCRIBE SELECT查询中不带括号的SELECT。修复了 #58382。#93429 (Yarik Briukhovetskyi) 。 - 为缓存正确性检查增加了按概率随机执行的机制。#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 秒内无法获取锁。与其返回logical error,不如返回timeout。#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 ordered 模式下更通用的分区方式。#94321 (Bharat Nallan) 。
- 为设置
allow_statistics_optimize新增了别名use_statistics。这与现有设置use_primary_key和use_skip_indexes的命名更加一致。#94366 (Robert Schulze). - 启用了设置
input_format_numbers_enum_on_conversion_error,以在从 Numbers 转换为枚举类型时检查元素是否存在。#94384 (Elmi Ahmadov) 。 - 在 S3(Azure)Queue 的 ordered 模式下,借助跟踪限制清理失败节点 (此前仅在 Unordered 模式下对失败节点和已处理节点执行此操作;现在 Ordered 模式下也会执行,但仅限失败节点) 。#94412 (Kseniia Sumarokova).
- 在
clickhouse-local中为default用户启用访问管理。此前,clickhouse-local中的default用户缺少 access_management 权限,导致DROP ROW POLICY IF EXISTS之类的操作会因ACCESS_DENIED错误而失败,尽管该用户本应拥有不受限制的访问权限。#94501 (Alexey Milovidov). - 为 YTsaurus 字典和表启用 named collection 功能。#94582 (MikhailBurdukov).
- 为 BACKUP/RESTORE 添加了对用于 S3 和 Azure Blob 存储的 SQL 定义命名集合的支持。已关闭 #94604。#94605 (Pablo Marcos) 。
- 支持在 S3Queue 的 ordered 模式下按分区键分桶。#94698 (Bharat Nallan) 。
- 新增一个异步指标,用于显示耗时最长的 merge 的运行时间。#94825 (Raúl Marín).
- 在使用 IcebergBitmapPositionDeleteTransform 应用位置删除前,先添加归属文件检查。#94897 (Yang Jiang) 。
- 现在,
view_duration_ms显示的是 group 处于活跃状态的时长,而不是其中各线程耗时的总和。#94966 (Sema Checherinda) 。 - 移除了
hasAnyTokens和hasAllTokens函数中搜索标记最大数量的限制,此前上限为 64。示例:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]);该查询会因包含 65 个搜索标记而报BAD_ARGUMENTS错误。通过此 PR,该限制已被完全移除,因此相同的查询现在可以无错误运行。#95152 (Elmi Ahmadov). - 新增设置项
input_format_numbers_enum_on_conversion_error,用于在从 Numbers 转换为枚举时检查相应元素是否存在。关闭:#56144。#56240 (Nikolay Degterinsky) 。 - 在 Iceberg 表中,在读取数据文件和位置删除文件时共享 format 解析器资源,以减少内存分配。#94701 (Yang Jiang).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了一个问题:在执行插入时,预定义查询处理程序会将末尾空白解析为数据。#83604 (Fabian Ponce).
- 修复了在 Join 存储上应用 outer to inner 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). - 如果 filesystem 大小写不敏感,则在 MergeTree 中始终将文件名替换为哈希。此前,在使用大小写不敏感 filesystem (如 MacOS) 的系统上,如果多个列/子列名称仅大小写不同,可能会导致数据损坏。#86559 (Pavel Kruglov).
- 在创建阶段,对 materialized view 中的底层查询执行完整的权限检查。#89180 (pufit) 。
- 修复了
icebergHash函数在常量参数情况下发生崩溃的问题。#90335 (Michael Kolupaev) 。 - 修复了以下逻辑错误:无事务的变更会修改处于活动事务中的 parts,而该事务最终会被回滚。#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 不支持事务’。#91772 (Shaohua Wang).
- 修复了在 LEFT ANTI JOIN 带有额外后置条件时,运行时过滤器无法正常工作的问题。#91824 (Alexander Gololobov) 。
- 修复了一个在涉及 Nothing 类型的 NULL 安全比较时出现的错误。关闭 #91834。关闭 #84870。关闭 #91821。#91884 (Yarik Briukhovetskyi) 。
- 修复 native Parquet reader 中影响高度重复字符串数据的 DELTA_BYTE_ARRAY 解码问题。#91929 (Daniel Muino) 。
- 在 schema inference 期间,对于通配符中的文件,仅缓存推断出该 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_use_nulls时,包含多个 JOIN 的查询中的逻辑错误。#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). - 相关 issue:#https://github.com/ClickHouse/support-escalation/issues/6365。[#92339](https://github.com/ClickHouse/ClickHouse/pull/92339) (Tuan Pham Anh) 。
- 修复了
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 中执行变更时,继承源数据分片的序列化信息设置。这样可修复在数据类型序列化发生变化后,查询已变更分片时可能返回错误结果的问题。#92419 (Pavel Kruglov) 。
- 修复列与同名子列之间可能存在的冲突,该问题会导致使用错误的序列化方式并引发查询失败。关闭 #90219。关闭 #85161。#92453 (Pavel Kruglov).
- 修复了一个
LOGICAL_ERROR:其原因是在将 outer join 转换为 inner join 时,对查询计划进行了非预期的修改。同时放宽了该优化的适用条件,使其也能用于在 join 过程中对聚合键应用单射函数的情况。#92503 (János Benjamin Antal). - 修复了对空 Tuple 列排序时可能出现的错误
SIZES_OF_COLUMNS_DOESNT_MATCH。关闭了 #92422。#92520 (Pavel Kruglov) 。 - 检查 JSON 类型中不兼容的类型化路径。关闭 #91577。#92539 (Pavel Kruglov) 。
- 修复对 Backup 数据库执行 SHOW CREATE DATABASE 时出现的死锁问题。#92541 (Azat Khuzhin) 。
- 验证 hypothesis 索引时使用正确的错误代码。#92559 (Raúl Marín).
- 修复 analyzer 中列别名里的动态子列解析问题。此前,列别名中的动态子列会被包裹在
getSubcolumn中,因此在某些情况下可能根本无法解析。关闭了 #91434。#92583 (Pavel Kruglov) 。 - 防止 tokens() 在第二个参数为 NULL 时发生崩溃。#92586 (Raúl Marín) 。
- 修复了一个潜在崩溃问题:其原因是底层 const PREWHERE 列被原地变更。这种情况可能发生在列收缩 (
IColumn::shrinkToFit) 或过滤 (IColumn::filter) 时,并且可能被多个线程同时触发。#92588 (Arsen Muk) 。 - 在包含大型 parts (超过 4,294,967,295 行) 的表上创建和物化文本索引的功能已被暂时禁用。此限制可防止查询结果出错,因为当前的索引实现尚不支持如此大的 parts。#92644 (Anton Popov) 。
- 修复了执行 JOIN 时出现的逻辑错误
Too large size (A) passed to allocator。已关闭 #92043。#92667 (Yarik Briukhovetskyi) 。 - 修复了一个问题:当
ngrambf_v1索引的 ngram 长度 (第 1 个参数) > 8 时,会抛出异常。#92672 (Robert Schulze) 。 - 修复在使用 ZooKeeper 存储时,后台重新加载 named collections 期间出现的未捕获异常。关闭 https://github.com/ClickHouse/clickhouse-private/issues/44180。 #92717 (Kseniia Sumarokova) 。
- 修正了通配符授权的访问授权检查中的错误逻辑。此前的尝试 https://github.com/ClickHouse/ClickHouse/pull/90928 虽然修复了一个严重漏洞,但限制过于严格,导致某些通配符
GRANT语句会因无关的REVOKE操作而失败。#92725 (pufit). - 修复了在
WHERE中使用not match(...)时数据跳过逻辑中的一个缺陷,该缺陷会导致结果错误。关闭了 #92492。#92726 (Nihal Z. Miaji) 。 - 如果在只读磁盘上创建了 MergeTree 表,则启动时不要尝试删除临时目录。#92748 (Alexey Milovidov).
- 修复 ALTER TABLE REWRITE PARTS (v2) 中“无法向空的 ExpressionActionsChain 添加操作”的问题。 #92754 (Azat Khuzhin).
- 避免因从已断开的
Connection中读取而崩溃。#92807 (Raufs Dunamalijevs). - 修复了
S3Queue存储在Ordered模式下的逻辑错误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的稀疏列执行变更后,可能出现FILE_DOESNT_EXIST错误的问题。关闭 #92633。#92860 (Pavel Kruglov) 。 - 修复旧版 Parquet 读取器 (默认不使用) 在 JSON 列位于 Tuple 列之后时的 Parquet schema 推断问题。修复旧版 Parquet 读取器 (默认不使用) 在处理空 Tuple 时失败的问题。#92867 (Michael Kolupaev) 。
- 修复在常量条件下进行多个 join 且启用
join_use_nulls时的逻辑错误,关闭 #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(...)时,数据 skipping 逻辑中的缺陷;该问题会导致结果错误。关闭 #88536。#93017 (Nihal Z. Miaji). - 修复因共享 parts 中的 TOCTOU 竞争而可能使用过期分区片段的问题。#93022 (Azat Khuzhin).
- 修复反序列化带有越界偏移量的格式错误
groupConcat聚合状态时发生的崩溃。#93028 (Raufs Dunamalijevs) 。 - 修复了预先取消分布式查询后连接处于异常状态的问题。#93029 (Azat Khuzhin) 。
- 修复了右侧连接键为稀疏列时连接结果出错的问题。此修复解决了 #92920。我只能在
set compatibility='23.3'的情况下复现这个问题。不确定是否应该回移。#93038 (Amos Bird). - 修复
estimateCompressionRatio()中可能出现的Cannot finalize buffer after cancellation错误。修复内容见:#87380。#93068 (Azat Khuzhin). - 修复了基于复杂表达式 (如
concat(col1, col2)) 构建的文本索引在合并时出现的问题。#93073 (Anton Popov). - 修复了过滤器包含子列时无法应用投影的问题。关闭了 #92882。#93141 (Pavel Kruglov)。
- 修复了某些情况下在将 join 运行时过滤器添加到查询计划时触发的逻辑错误。该问题是由于错误地从 join 的一侧返回了重复的 const 列所致。#93144 (Alexander Gololobov) 。
- 用于 join 运行时过滤器的特殊函数
__applyFilter在某些本应有效的情况下会返回 ILLEGAL_TYPE_OF_ARGUMENT。#93187 (Alexander Gololobov) 。 - 当插值列实际上是同一列的别名时,防止不同的插值列在一个块中合并为同一列。#93197 (Yakov Olkhovskiy) 。
- 在与已补齐的右表进行连接时,不要添加运行时过滤器。#93211 (Alexander Gololobov) 。
- 修复 Keeper 在会话失效后未清理持久 watches 的问题。该修复关闭了 #92480。#93213 (Konstantin Vedernikov) 。
- 修复 Iceberg 中 ORDER BY Tuple 的问题。此更改关闭了 #92977。#93225 (Konstantin Vedernikov).
- 修复了 S3Queue 设置
s3queue_migrate_old_metadata_to_buckets中的错误。关闭了 #93392、#93196、#81739。#93232 (Kseniia Sumarokova) 。 - 在合并过程中重建投影时,会移除未使用的列。这可降低内存使用量,并减少临时 parts 的创建。#93233 (Nikolai Kochetov).
- 修复了在存在标量关联子查询时,子查询中未使用列被移除的问题。修复前,如果某一列仅在关联子查询中使用,就可能被误删,从而导致查询报
NOT_FOUND_COLUMN_IN_BLOCK错误而失败。#93273 (Dmitry Novik). - 修复在对源表执行 ALTER 时,MV 中可能缺失子列的问题。关闭 #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).
- 如果使用非常量的分词器参数 (第 2、3、4 个参数) 调用函数
tokens,server 将不再崩溃,例如SELECT tokens(NULL, 1, materialize(1))。 #93383 (Robert Schulze). - 修复了
groupConcat状态反序列化中的整数溢出漏洞;该漏洞可能因精心构造的聚合状态而引发内存安全问题。#93426 (Raufs Dunamalijevs) 。 - 修复了在索引不包含任何标记 (所有数组都为空,或所有标记均被分词器跳过) 时,对数组列进行文本索引分析的问题。#93457 (Anton Popov).
- 当连接字符串中已包含用户名/密码时,避免在 ClickHouse Client 中使用 oauth 登录。#93459 (Krishna Mannem) 。
- 修复 DataLakeCatalog 对 Azure ADLS Gen2 下发凭据的支持:从 Iceberg REST 目录中解析
adls.sas-token.*参数,并修复 ABFSS URL 解析。#93477 (Karun Anantharaman). - 修复了 analyzer 对 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). - 修复了一个问题:通过 ssh 连接时,clickhouse-client 会要求输入两次密码。 #93547 (Isak Ellmer).
- 确保 ZooKeeper 在关闭时能够正常完成清理 (修复了极少数情况下关闭时可能卡住的问题) 。#93602 (Azat Khuzhin) 。
- 修复恢复 ReplicatedMergeTree 时因去重竞争条件导致的 LOGICAL_ERROR。#93612 (Pablo Marcos) 。
- 修复了在某些输入格式中直接反序列化到 Sparse 列时,使用 Sparse 列更新生存时间 (TTL) 的问题。此修复还解决了可能出现的逻辑错误
Unexpected type of result TTL column。#93619 (Pavel Kruglov) 。 - 修复了
h3 index函数在传入无效输入时有时会崩溃或卡死的问题。#93657 (Michael Kolupaev) 。 - 在非 UTF-8 数据上使用
ngram_bf索引会导致读取未初始化的内存,其中的值可能会出现在生成的索引结构中。修复了 #92576。#93663 (Alexey Milovidov) 。 - 验证解压后缓冲区的大小是否符合预期。#93690 (Raúl Marín) 。
- 防止用户通过
merge表引擎在未检查SHOW COLUMNS权限的情况下获取表的列列表。#93695 (János Benjamin Antal). - 修复了基于子列创建的跳过索引的物化问题。#93708 (Anton Popov).
- 我们将 storages 的共享指针保存在
QueryPipeline::resources::storage_holders中,以确保在PipelineExecutor存活期间,IStorage对象不会被销毁。#93746 (Miсhael Stetsyuk) 。 - 修复了重启后 interserver host 发生变化时无法 Attach Replicated 数据库的问题。#93779 (Tuan Pham Anh) 。
- 修复了在启用缓存时,
ReadBufferFromS3中触发的断言!read_until_position。#93809 (Kseniia Sumarokova) 。 - 修复了在极少数情况下,将空元组用于
Map列时出现的逻辑错误。关闭 #93784。#93814 (Nihal Z. Miaji) 。 - 修复了在合并过程中重建 projections 时
_part_offset损坏的问题,并通过避免对_part_offset列进行不必要的读取,以及在 projection 计算中跳过不需要的列,优化了 projection 处理。这延续了 #93233 中引入的优化。#93827 (Amos Bird) 。 - 移除了对 ‘Bad version’ 的处理逻辑。 #93843 (Anton Ivashkin).
- 修复了当键为有符号整数类型时,
optimize_inverse_dictionary_lookup在 Distributed 查询中不生效的问题。关闭 #93259。#93848 (Nihal Z. Miaji) 。 - 修复了分布式
remote()查询中lag/lead不生效的问题。解决 #90014。#93858 (Nihal Z. Miaji) 。 - 修复 system instrument dispatch 中的缺陷。#93937 (Pablo Marcos) 。
- 在 https://github.com/ClickHouse/ClickHouse/pull/89173 中,我们给
TraceSender通过内部管道发送的结构新增了一个字段。然而,buffer 的大小没有同步更新 (这里) ,因此写入 buffer 的数据量超过了buffer_size,从而导致多次刷写。并且由于TraceSender::send会由不同线程调用,不同线程的刷写可能会交错在一起,破坏了接收端 (TraceCollector) 所依赖的不变量。#93966 (Miсhael Stetsyuk) 。 - 修复带有
USING子句的Join存储在执行 join 操作时转换为超类型的类型转换问题。修复了 #91672。修复了 #78572。#94000 (Dmitry Novik) 。 - 修复了在 Merge 表上应用 join 运行时过滤器时,未正确添加 FilterStep 的问题。#94021 (Alexander Gololobov) 。
- 如果某个
SELECT查询包含针对多个列的谓词,使用了 bloom filter 跳过索引,并且同时存在OR和NOT条件,则可能返回不一致的结果。该问题现已修复。#94026 (Shankar Iyer) 。 - 修复对带有依赖索引的列执行 CLEAR 时出现的问题。#94057 (Raúl Marín).
- 修复
ReadWriteBufferFromHTTP中使用未初始化值的问题。#94058 (Alexey Milovidov) 。 - 修复了对 JSON 中类型化路径的不正确检查。该检查是在 https://github.com/ClickHouse/ClickHouse/pull/92842 中引入的,可能会在现有表启动时导致 error。#94070 (Pavel Kruglov) 。
- 修复在存在 OUTER JOIN 的情况下进行过滤器分析时发生的崩溃。修复了 #90979。#94080 (Dmitry Novik) 。
- 修复在并行使用 UInt8 聚合键时
uniqTheta的精度问题 (max_threads> 1,默认值) 。#94095 (Azat Khuzhin) 。 - 修复了在
SCOPE_EXIT内调用socket.setBlocking(true)时抛出异常而导致的崩溃。#94100 (Miсhael Stetsyuk). - 修复了在 ReplicatedMergeTree 中,
DROP PARTITION删除由后续日志条目创建的 parts 时导致的数据丢失问题。#94123 (Tuan Pham Anh). - 已修复 Parquet reader v3 错误处理跨越页面边界的数组的问题。例如,这种情况会出现在由 Arrow 写入且未启用 page statistics 或 page index 的文件中。仅影响 Array 数据类型的列。可能的症状是,大约每 1 MB 数据就会有一个数组被截断。在此修复发布前,可使用以下设置作为临时解决方法:
input_format_parquet_use_native_reader_v3 = 0。#94125 (Michael Kolupaev) 。 - 修复了 ReplicatedMergeTree 在等待日志条目时 watch 数量过多的问题。#94133 (Azat Khuzhin) 。
- 函数
arrayShuffle、arrayPartialShuffle和arrayRandomSample现支持将常量列物化,从而使不同行得到不同的结果。#94134 (Joanna Hulboj) 。 - 修复了在 materialized view 中对表函数求值时的数据竞争问题。#94171 (Alexey Milovidov) 。
- 修复
PostgreSQL数据库引擎中的 nullptr 解引用问题 (当查询有误时会触发) 。关闭 #92887。#94180 (Alexey Milovidov) 。 - 修复了可刷新materialized views在使用包含多个子查询的
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 客户端在连接时的一个隐蔽问题,该问题会导致卡死和崩溃。#94320 (Azat Khuzhin) 。
- 修复“函数到子列”优化未对子列生效的问题。#94323 (Pavel Kruglov) 。
- 修复在启用
enable_lazy_columns_replication时,嵌套 RIGHT JOIN 可能导致结果不正确的问题。该缺陷会导致启用复制的列中的所有行错误地返回相同的值,而不是各不相同的值。关闭 #93891。#94339 (Vladimir Cherkasov) 。 - 修复了在 SEMI JOIN 中使用等价集合进行过滤器下推的问题。如果参数类型发生变化,则不要下推过滤器。修复了 #93264。#94340 (Dmitry Novik) 。
- 修复在 database DataLake 数据库引擎中使用 DeltaLake CDF 的问题 (delta lake catalogs integration) 。关闭 #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).
- 修复从 compact parts 中读取稀疏偏移量的问题。关闭 #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时,代码会按完整主键的大小访问索引列,但未检查索引是否已被截断,从而导致释放后使用或使用未初始化内存。关闭 #85596。#94500 (Alexey Milovidov) 。 - 修复了在为带有 GLOBAL IN 的子查询发送外部表时,若类型为 Nullable,因类型不匹配导致的错误。关闭 #94097。#94511 (Alexey Milovidov) 。
- 在早期版本中,对同一表达式包含多个索引条件的查询可能会误报
Not found column异常。关闭 #60660。#94515 (Alexey Milovidov) 。 - 修复运行时过滤器中对 Nullable join 列处理不当的问题。#94555 (Alexander Gololobov) 。
- 在当前正在使用的另一个工作负载中创建工作负载时,不再会导致崩溃。#94599 (Sergei Trifonov) 。
- 修复了在缺失列上计算
isNotNull时,ANY LEFT JOIN 优化期间发生的崩溃。#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 merge 之后保留固定的索引粒度 (use_const_adaptive_granularity) 。#94725 (Azat Khuzhin) 。
- 修复了变更在处理标量子查询和表依赖项时的缺陷。如果某个表在某一列上存在依赖项 (索引或投影) ,标量子查询可能会在没有数据的情况下被求值并缓存,进而导致错误的变更。#94731 (Raúl Marín).
- 修复 AsynchronousMetrics 中
cpu_pressure在出错时的回退问题。#94827 (Raúl Marín). getURLHostRFC函数在解引用指针前缺少越界检查。当向domainRFC传入空字符串时,它会读取未初始化的内存,从而触发 MSan 错误。#94851 (Alexey Milovidov) 。- 修复加密磁盘只读状态相关的问题。#94852 (Azat Khuzhin) 。
- 修复了在旧 analyzer 中对分布式表使用小数
LIMIT/OFFSET时的逻辑错误。关闭 #94712。#94999 (Ahmed Gouda). - 修复了在默认启用 JOIN 运行时过滤器时,在某些条件下发生崩溃的问题。#95000 (Alexander Gololobov) 。
- 改进表引擎
URL()和表函数url()中所用 URL 里的密码掩码处理。#95006 (Vitaly Baranov) 。 - 函数
toStartOfInterval现在在启用enable_extended_results_for_datetime_functions时,其行为与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的问题。关闭 #91681。#95040 (Nihal Z. Miaji) 。 - 修复文件系统缓存中的数据竞争问题。#95064 (Alexey Milovidov) 。
- 修复了 Parquet 读取器中的一个罕见竞态条件。 #95068 (Alexey Milovidov).
- 修复了
LIMIT为零时 top K 优化中的崩溃问题。关闭了 #93893。#95072 (Alexey Milovidov) 。 - 从 DateTime/整数转换为 Time64 时,会通过
toTime提取时刻部分,而toTime并不是单调函数。ToDateTimeMonotonicity模板此前误将这种转换标记为单调,导致在调试构建中出现 “Invalid binary search result in MergeTreeSetIndex” 异常。#95125 (Alexey Milovidov). - 仅在必要时才重新创建 manifest 文件条目列表 (此前每次迭代都会执行) 。#95162 (Daniil Ivanik).
构建/测试/打包改进
- 新增一组工具,借助 jemalloc 的堆分析能力,对 ClickHouse SQL 解析器中的内存分配进行 profiling。#94072 (Ilya Yatsishin).
- 新增了一个工具,用于简化解析器中内存分配的调试。它会在将查询解析为 AST 表示之前和之后,使用 jemalloc 的
stats.allocated指标来显示分配了哪些内容。此外,它还支持内存 profiling 模式,可在前后分别转储 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).