跳转到主内容
跳转到主内容

2026 年变更日志

ClickHouse 26.5 版本发布,2026-05-21。 演示文稿, 视频

不兼容变更

  • date_time_input_formatcast_string_to_date_time_mode 的默认值从 basic 改为 best_effort。此前无法解析非 basic 日期时间字符串 (例如 2024 April 4Apr 15, 2020 10:30:00) 的查询,现在默认可能会成功。若要保留旧的严格解析行为,请将这些设置设为 basic (或使用 compatibility) 。#89334 (Alexey Milovidov).
  • 现在禁止使用 Tuple 元素名 null,因为它会与 Nullable 的 null Map 所使用的子列名冲突,从而导致子列解析出现歧义。#98377 (Alexey Milovidov).
  • 新增设置 dynamic_disk_allow_from_envdynamic_disk_allow_from_zkdynamic_disk_allow_include,用于禁止在动态磁盘中使用 from_envfrom_zkinclude。这属于不兼容变更,因为它现在默认禁止了过去默认允许的行为。#99138 (Kseniia Sumarokova).
  • 你已无法再使用已废弃的基于 Arrow 的 Parquet 读写器,系统将改用原生实现。#100949 (Alexey Milovidov).
  • SHOW CREATE TABLE t 现在在同时存在名为 t 的永久表和临时表且未指定数据库时,会优先选择临时表,这与现有的 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 连接在身份验证前的内存使用。新增了 http_max_request_header_sizehttp_headers_read_timeout 设置。依赖此前更高限制的用户可以通过设置将其恢复。#103285 (Sema Checherinda).
  • system.metric_log 中新增了一个 histograms 嵌套列,用于在每一行中记录所有已注册直方图指标的快照,并新增 system_metric_log_show_zero_values_in_histograms 设置来控制是否输出零值。这也意味着 system.histogram_metric_log 表已被弃用。#103770 (Miсhael Stetsyuk).
  • 在未显式指定时区的情况下,将 CAST 转换为 DateTimeDateTime64 时,现在会保留其源参数的时区 (当源值为带显式时区的 DateTime/DateTime64 时) ,与 toDateTime/toDateTime64 函数的行为一致。修复 #55072#104433 (Alexey Milovidov).
  • 已移除 kql 表函数。使用 SET dialect = 'kusto' 以 KQL 方言运行查询。#105101 (Alexey Milovidov).
  • 窗口函数 RANKDENSE_RANK 现在会拒绝接收参数,并抛出 NUMBER_OF_ARGUMENTS_DOESNT_MATCH,以符合 SQL 标准。此前,诸如 RANK(x) OVER (ORDER BY id) 之类的查询会被静默接受,但其参数会被忽略。若要恢复之前更宽松的行为,请设置 allow_rank_dense_rank_arguments = 1。修复 #49526#104324 (Groene AI).

新特性

  • 新增设置 max_bytes_ratio_before_external_join,与 max_bytes_ratio_before_external_group_bymax_bytes_ratio_before_external_sort 对应。该设置将 hash join 的落盘阈值表示为可用内存的一定比例;与绝对值设置 max_bytes_before_external_join 一起使用时,以最终计算出的较小阈值为准。#103862 (Alexey Milovidov) 。新的 max_bytes_ratio_before_external_join 设置现已默认启用,默认值为 0.5,与 max_bytes_ratio_before_external_group_bymax_bytes_ratio_before_external_sort 保持一致。当右侧数据超过可用系统内存的一半时 (在配置了内存限制的情况下) ,hash join 会自动切换为 grace hash join 并落盘。#104285 (Alexey Milovidov) 。
  • 新增表函数 filesystem。它可将目录结构表示为一张表,并支持使用 SQL 查询文件的元数据和内容。最初由 @perst20 在 #42039 中提出。另见 #42039。另见 #50208#53610 (Alexey Milovidov) 。
  • 允许将纯函数名直接传递给 arrayMaparrayFilter 等高阶函数。例如,arrayMap(negate, [1, 2, 3]) 现在等价于 arrayMap(x -> negate(x), [1, 2, 3])#101033 (Alexey Milovidov) 。
  • 新增 setting send_table_structure_on_insert_with_inline_data 和客户端选项 --inline-insert-data,使服务器能够通过 native protocol 自行解析内联 INSERT 数据,从而避免为获取表结构而进行往返通信,并提升大量小批量插入的性能。#101034 (Alexey Milovidov) 。
  • 新增 tokenizeQueryhighlightQuery 函数,用于 SQL 查询标记化和语法高亮。tokenizeQuery 返回包含字节偏移量和标记类型的词法分析标记;highlightQuery 返回基于解析器的语法高亮范围及高亮类别 (关键字、标识符、函数、数字、字符串等) 。#101054 (Alexey Milovidov) 。
  • 新增 url_base 设置,用于在 url 表函数和 URL 表引擎中按 RFC 3986 语义解析相对 URL。#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 函数以 tuplearray 形式输出,从而提升多 JSON 查询的性能。#78362 (kevinyhzou) 。支持在 JSON_VALUEJSON_EXISTSJSON_QUERY 中使用多路径 Tuple/Array JSONPath 参数,由 @KevinyhZou 提供。#101102 (Alexey Milovidov) 。
  • 引入了新的 kafka_autodetect_client_rack 参数。若已设置,则会通过云基础设施检测可用区,并将其传递给 librdkafkaclient.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 watch。#99277 (Den Kalantaevskii) 。
  • 新增了 Shards profile 事件,用于统计参与分布式查询的分片数量,并对所有表的结果求和。#99470 (Alexey Milovidov).
  • WASM UDFs 可以声明为 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 套接字缓冲区大小,使运维人员能够覆盖内核自动调优,并限制每个连接的内存占用。#100478 (Sema Checherinda).
  • 支持 CREATE OR REPLACE MATERIALIZED VIEW,并具备与 CREATE OR REPLACE TABLE 相同的原子交换语义。适用于内部表、TO 表、POPULATEREFRESHON CLUSTER#100539 (DQ).
  • 新增 s3_read_request_duration_microsecondss3_read_request_bytes 直方图指标,用于观测 S3 GET 请求连接的生命周期及消耗的字节数,可在 system.histogram_metrics 和 Prometheus 端点中查看。#102058 (Sema Checherinda) 。
  • 新增 PaimonPaimonS3PaimonAzurePaimonHDFSPaimonLocal 表引擎,支持基于 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 消息键、时间戳和请求头,并且不会包含在消息负载中。#103243 (Alexey Milovidov) 。
  • 为可刷新materialized view新增了 SYSTEM PAUSE VIEW [db.]nameSYSTEM PAUSE VIEWS 查询。与 SYSTEM STOP VIEW 不同,SYSTEM PAUSE VIEW 不会中断当前正在执行的刷新——正在进行中的刷新会继续完成,仅阻止后续刷新。可通过 SYSTEM START VIEWSYSTEM START VIEWS 恢复,这两个命令现在都会统一清除 stopped 和 paused 状态。#103252 (Nikita Mikhaylov).
  • 新增函数 regexpPosition (以及与 PostgreSQL 兼容的别名 regexpInstrregexp_instr) ,用于返回字符串中第 N 个正则表达式匹配的字节位置。支持起始偏移量、匹配后返回模式、正则标志和捕获组选择。#104172 (Abhinav Agarwal) 。
  • 新增用于质数检测的函数 isPrimeisProbablePrimeisPrime 可对最高至 UInt64 的无符号整数返回精确结果。isProbablePrime 还支持 UInt128UInt256;对于这些更宽位的类型,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 表中添加 deterministichigher_order 列。#104479 (Pedro Ferreira).
  • bech32Encode 新增可选的编码 Variant parameter (bech32 / bech32m) ,并为 bech32Decode 新增原始解码模式,以支持非 SegWit 地址编码 (例如 Cosmos SDK、Injective 和 Osmosis) 。#98986 (Yash ) 。
  • 现在,您可以以 AvroConfluent 格式写入数据,而该格式此前仅支持输入。这使得能够直接从 ClickHouse 生成带有 Confluent Schema Registry 帧的 Avro 消息,例如在写入 Kafka 时。schema 会自动注册到注册表中。使用新的 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 功能

  • /webterminal 新增了一个实验性的 Web 终端界面,可通过 WebSocket 在浏览器中提供交互式 clickhouse-client 会话。默认禁用;可通过 allow_experimental_webterminal 服务器级设置启用。可在此处查看。 #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov).
  • Kafka2 引擎 (实验性,使用基于 Keeper 的 offset 存储) 现已支持直接执行 SELECT 查询以及 kafka_commit_on_select 设置。 #100276 (Alexey Milovidov).
  • WASM UDFs 现在可以强制转换更多数值类型:较小的整数可转换为更宽的整数类型 (例如 Int8UInt64) ,任意整数也可转换为浮点类型 (例如 Int32Float32) 。 #100435 (Vasily Chekalkin).
  • 现已在 DELETE FROM system.webassembly_modules 查询中支持 LIKE 函数。 #104397 (Vladimir Cherkasov).
  • Iceberg 增加对 Geo 类型的支持。 #103113 (Konstantin Vedernikov).
  • 为 ArrowFlight SQL 服务器添加了预处理语句功能。 #103047 (Yakov Olkhovskiy).
  • 通过在 KQL 解析器各阶段之间保留解析器深度和回溯计数器,提升了 KQL 解析器 (用于支持 Kusto 语言) 的健壮性,从而能够对复杂的 KQL 查询一致地跟踪解析器限制。 #103528 (Yakov Olkhovskiy).

性能优化

  • 现在,通过 file / File 表引擎读取单个大型本地 Parquet 文件时,已可在多个源之间并行化处理,每个源负责一部分行组。这样消除了管道中的 Resize 1 → N 瓶颈,并使单文件 ClickBench 的性能接近分区版本——在 96 个 vCPU 上,Q23 从约 1.4 秒降至约 0.55 秒,Q22 从约 0.9 秒降至约 0.48 秒,Q27 从约 1.6 秒降至约 0.54 秒。#104251 (Alexey Milovidov)。
  • 通过 file 表函数或 File 表引擎读取本地 Parquet 文件时,可复用 Parquet footer 元数据缓存。此前,只有对象存储后端会使用该缓存。#104260 (Alexey Milovidov).
  • 当排序键仅引用连接所保留一侧的列时,可将 ORDER BY ... LIMIT n 下推至 LEFT/RIGHT 连接之前,从而限制保留侧输入在连接前需要生成的行数。由新设置 query_plan_top_k_through_join 控制 (默认启用) 。#104268 (Alexey Milovidov) 。
  • 默认启用 use_top_k_dynamic_filteringuse_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) 。现在,用户态页缓存的效果始终优于操作系统页缓存。
  • 通过用户态页缓存 (use_page_cache_for_object_storage = 1) 从对象存储进行冷读现在已显著提速,因为连续的缓存未命中会合并为一次 HTTP 请求,而不再是每个 page_cache_block_size 块各发起一次请求。#104230 (Alexey Milovidov) 。
  • 加快涉及类型转换和函数应用的索引分析。解决了 #55653#100366 (Alexey Milovidov) 。
  • 加速在底层包含大量表的 Merge 表上的大型查询。关闭 #32465#100369 (Alexey Milovidov) 。
  • 从 setting 字段类型中移除 vtable,使 Settings 的拷贝体积缩小约 28 倍,并通过适用于所有 setting 类型的 typed-array 布局提升缓存局部性。#102269 (Raúl Marín) 。
  • 新增 max_threads_min_free_memory_per_threadmax_insert_threads_min_free_memory_per_thread 设置,在服务器空闲内存不足时自动降低查询并行度。#100383 (Alexey Milovidov) 。
  • 降低低内存系统 (< 4 GiB) 的内存占用。#100389 (Alexey Milovidov) 。
  • 新增 OptimizeTrivialGroupByLimitPass。对于简单的 SELECT ... FROM t GROUP BY k LIMIT n 查询 (不含 HAVINGORDER BY 或窗口函数) ,analyzer 现在会将 max_rows_to_group_by = n + offsetgroup_by_overflow_mode = 'any' 设为相应值,因此聚合会在生成 n 个不同键后停止,而不再对整个输入执行分组。该行为由新设置 optimize_trivial_group_by_limit_query 控制 (默认启用) 。#104473 (Alexey Milovidov) 。
  • _part_offset_block_number 虚拟列提供粒度级隐式 min-max 索引,也适用于投影。支持根据虚拟列谓词快速剪枝粒度。#103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko).
  • 对于 prealloc_serialized 聚合方法家族,在批量序列化阶段预先计算每一行的哈希,并将其用于 (a) 在 emplaceKey/findKey 中跳过重新计算哈希,以及 (b) 对下一行的桶进行软件预取。通过隐藏哈希表缓存未命中带来的延迟,加速多键字符串/序列化聚合。#104475 (Alexey Milovidov).
  • 新增了 NullCount 统计信息类型,用于在 Nullable 列中精确统计 NULL 值。这进一步改进了 PREWHERE 优化,并提升了数据分区片段裁剪效果。#102356 (zoomxi)。现在,NullCount 列统计信息也可用于数据分区片段裁剪。对于具有 NullCount 统计信息的 Nullable 列,包含 IS NULL 或 IS NOT NULL 谓词的查询可以跳过整个数据分区片段,因为统计信息能够证明其中不存在匹配的行。#104214 (zoomxi)。
  • Iceberg 表的查询条件缓存。#102115 (Konstantin Vedernikov) 。
  • 优化 cramersVcramersVBiasCorrectedtheilsUcontingency 与 window functions 配合使用时的性能。修复 #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_merge JOIN 的性能。#100945 (Artem Zuikov) 。
  • partial_merge JOIN 中,略微减少了内存过度分配。#100963 (Artem Zuikov) 。
  • 通过缓存采样设置而非遍历整个内存跟踪器层级,优化分配/释放操作。 #101267 (Azat Khuzhin).
  • 通过预先分配内部跟踪容器,减少 S3 分段上传期间的内存分配开销。#101799 (Gagan Dhakrey) 。
  • 在哈希 join 的探测阶段加入软件预取,以降低大型哈希表的内存访问延迟,可通过设置 enable_software_prefetch_in_join 控制。#102444 (Xiaozhe Yu).
  • 优化 MemoryTracker 的布局,性能提升约 25%。#103464 (Azat Khuzhin) 。
  • 在索引分析前重写 coalesce(a, b, ...) <op> constifNull(a, b) <op> const 谓词,以便各参数上的逐列主键和跳过索引都能裁剪粒度。由新设置 allow_key_condition_coalesce_rewrite 控制 (默认启用) 。#103468 (Manuel) 。
  • 通过优化转义斜杠的处理,显著提升了读取包含大型 JSON 元数据文件的 Iceberg catalog 时的查询性能。#103998 (Mohaidoss).
  • 在缓存被禁用时 (服务器设置 index_uncompressed_cache_size = 0,默认即为此值) ,避免了索引未压缩缓存带来的额外开销。#104063 (Michael Kolupaev).
  • 修复了这样一个问题:当 ORDER BY ... LIMIT 查询的 limit 较小时,如果再结合非选择性的 WHERE 过滤器,会读取过多粒度。此前,顺序读取上方的任何过滤器都会禁用按标记范围划分任务,因此管道无法在粒度之间取消处理,并会为每个 stream 读取整个数据分片。#104112 (Vladimir Cherkasov).
  • 修复了在重新排序 JOIN 两侧后未复用哈希表大小缓存的问题。#104131 (Nikita Taranov) 。
  • 当启用 fsync_after_insert 时,现在会使用 IO 线程池并行对各个分片文件执行 fsync,从而加快宽表上的插入完成过程。完整 ClickBench hits 数据集的加载速度提升了约 22%。#104137 (Alexey Milovidov) 。
  • 在 AArch64 上使用 NEON 对 find_first_symbolsfind_first_not_symbolsfind_last_symbols_or_nullfind_last_not_symbols_or_nullsplitInto 进行了向量化。此前,这些辅助函数仅在 x86 (SSE2 / SSE4.2) 上有 SIMD 路径,而在 ARM 上则会回退到标量循环。在 ClickBench 的 hits 数据集上,TSV 解析速度提升约 2 倍,URL 函数和 splitByChar`` 提升约 1.3 倍;对于字段间隔极其密集 (小于 16 字节) 的 JSON 解析,性能会略有下降,这与现有 SSE2 的权衡一致。#104228 (Alexey Milovidov) 。
  • 现在,通过简单的 ALIAS 列读取数据 (例如 some_alias['key'],其中 some_alias ALIAS m) 时,会像直接引用底层列一样,走相同的按 subcolumn 读取路径,从而重新获得 MapArrayTupleNullable 别名列在 I/O 方面的大幅节省。#104245 (Raúl Marín).
  • 通过将每个查询的 AsyncReadCounters 改为无锁实现,降低了异步远程文件系统读取路径上的锁竞争。#104374 (Nikita Mikhaylov) 。
  • 投影顺序扫描的查询计划略有改进。#103723 (Mikhail Artemenko).
  • 扩展 optimizeUseNormalProjections,使其也能处理一种特定情况:即使没有任何内容被过滤,投影的排序键仍可从查询计划中消除排序步骤。#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) 。
  • 通过将数据库级授权检查移出逐表循环,优化了 system.partsSHOW TABLES 的访问检查。#100860 (Shaohua Wang) 。
  • system.tablesSELECT name / SELECT database, name 快速路径中,移除了冗余的逐表 SHOW TABLES 访问检查。#100881 (Shaohua Wang) 。
  • 在 macOS 上启用 JIT 编译。#100947 (Alexey Milovidov) 。
  • 如果 row policy 仅依赖排序键列且具有确定性,则跳过将其延后到 FINAL 之后再应用;在这种情况下,也跳过由该 row policy 强制触发的相应 PREWHERE 延后。 #102884 (Yarik Briukhovetskyi).
  • 新增支持在文本索引中将 hasAnyhasAll 用作过滤谓词。#103266 (Anton Popov) 。
  • 修复了可空列的选择性估算:x IS NULL OR x > 50 OR y IS NULL 以及类似谓词现在能够正确遵循 SQL 三值逻辑,并且在 TRUE 选择性中排除 NULL 行。#103949 (Han Fei) 。
  • 将长期存在的 MergeTree 堆状态 (每个 part 和每张表的元数据) 定向到专用的 jemalloc arena,并通过 jemalloc.mergetree_arena.* 异步指标公开。这样可减少稳态下默认 arena 的碎片化,并避免每个 part 中长期存活的对象占住原本可衰减的页。#104136 (Raúl Marín).
  • 在单个 session 上对大量请求进行流水线处理时,改进了高负载下 ZooKeeper 客户端的超时处理。ZooKeeper 客户端现在采用基于进度的超时机制:只要在 session_timeout_ms 内从服务器接收到任何数据,就会延长等待时间。每个请求仍受 3 * session_timeout_ms 的硬性上限限制,以控制调用方延迟。关闭 #100466#104351 (Antonio Andelic) 。
  • 将每个事件的 trace 标志移到单独的数组中,并在需要时再分配,从而降低 ProfileEvents tracing 的开销。#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 进行匹配的输入格式 (JSONEachRowCSVWithNamesJSONColumnsBSONEachRowRowBinaryWithNames 等) ,现在会先尝试区分大小写的匹配;如果未命中,再回退到不区分大小写的匹配。此前的严格行为在 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 旁显示磁盘临时数据的使用情况 (例如外部排序、聚合或 JOIN) ,还包括分布式查询按主机划分的明细。#105190 (Alexey Milovidov) 。
  • 新增了 system.predicate_statistics_log,这是一个新的采样日志,用于记录每个查询中谓词过滤器的选择性以及 MergeTree 索引粒度裁剪情况。默认禁用;可通过服务器设置 predicate_statistics_sample_rate 启用。自动索引和投影推荐功能需要它。#98727 (Yarik Briukhovetskyi) 。
  • 启用 skip_unavailable_shards 后,可跳过缺少表的本地分片。#100141 (Alexey Milovidov).
  • 当 Linux mdraid 阵列正在重新同步或处于降级状态时,新增启动警告 (可在 system.warnings 中看到) ,因为这两种情况都可能影响磁盘 I/O 性能,或者表明磁盘存在故障。#100941 (Alexey Milovidov).
  • WASM UDFs 现在会显示在 system.functions 中,其正确的 origin (WasmUserDefined) 、syntaxargumentsreturned_value 列也会根据其 ClickHouse 类型元数据正确填充。此前,它们要么缺失,要么以错误的 origin 作为重复项列出。#101053 (Vasily Chekalkin) 。
  • generate_series 表函数现已支持负步长,可用于生成降序序列,例如 SELECT * FROM generate_series(99, 0, -1)#101056 (Alexey Milovidov).
  • 修复某些函数 (dotProductformatRowstructureToCapnProtoSchema/structureToProtobufSchema、用户自定义函数) 在 DEFAULT/MATERIALIZED 表达式和表引擎设置等延迟执行路径中使用时引发的 Context has expired 异常,方法是确保这些函数在需要时持有强引用的 Context。 #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_usermax_network_bandwidth_for_all_users 应用于远程文件系统的读写操作。#103080 (Azat Khuzhin) 。
  • 在可刷新materialized view 持续刷新的情况下,通过依据快照表的状态而非全局状态进行决策,提升备份的韧性。#103384 (Nikita Mikhaylov) 。
  • SELECT * FROM system.databases 现在始终会列出数据湖 catalog 数据库,而不受 show_data_lake_catalogs_in_system_tables 设置的影响。此前,这些数据库默认处于隐藏状态,这与始终显示它们的 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) 。
  • 通过在 getURLScheme 中处理空输入、避免在 Lexer::nextTokenmax_query_size 检查中进行空指针算术运算,并在解码前针对空 haystack 对 UTF-8 子序列求值进行短路处理,提升了解析器和字符串函数边界情况下 Sanitizer 的稳健性。#103489 (Yakov Olkhovskiy) 。
  • 改进了对 divide(0, x)intDiv(0, x) 的单调性推断准确性:此前这些函数会被无条件地视为单调,但在任何包含 0 的区间内,0 / x 都不是单调的,因为 0 / 0 未定义 (对 divide 而言结果为 NaN/Inf,对 intDiv 而言则会抛出除零异常) 。这一错误判断会导致 KeyCondition::applyMonotonicFunctionsChainToRange 生成 left > right 的区间,从而在调试构建中,当主键上的 IN / NOT IN 表达式将键包装为 divide(0, key)intDiv(0, key) 时,触发 LOGICAL_ERROR Invalid binary search result in MergeTreeSetIndex。发布构建不受影响——该断言受 #ifndef NDEBUG 控制。#103621 (Groene AI).
  • 将异步指标 HTTPConnectionPool*TCP{Rcv,Snd}BufBytes_{p50,p75,p90,p95} 替换为 system.histogram_metrics 中基于桶的直方图 http_pool_tcp_buf_bytes (标记为 groupdirection) 。按组汇总的异步指标总量将予以保留。#103704 (Sema Checherinda) 。
  • 服务器设置 {disk,storage,http}_connections_{rcvbuf,sndbuf} 现在在 system.server_settings 中被标记为可在无需重启的情况下更改。它们的值可通过 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) 。
  • 通过在失败时回滚部分已执行的 putNGram 插入操作,并将失败的 needle 切换为后备搜索器,修复了 MultiVolnitsky UTF-8 不区分大小写搜索中的问题,避免进入不一致状态。#103864 (Yakov Olkhovskiy) 。
  • 在兼容 glibc 的 musl 中,通过 rseq TLS 实现 sched_getcpu#104016 (Azat Khuzhin) 。
  • 处于 APPEND 模式的复制型可刷新materialized view,在 refresh 期间如果与 ZooKeeper 的连接短暂中断,将不再刷新两次。#104051 (Michael Kolupaev).
  • 允许未显式指定列列表的分布式表根据推断出的远程表结构来验证分片键。#104111 (Yue).
  • 修复使用 Azure abfss 路径的 REST catalog 问题。#104120 (Konstantin Vedernikov).
  • Keeper S3 快照客户端现已支持 role_arnrole_session_name 身份验证设置,使快照上传可使用基于 STS AssumeRole 的身份验证。#104140 (Alexey Milovidov) 。
  • 修复了运行带有 MATERIALIZED CTE 的查询时出现的内存泄漏问题。#104153 (Alexey Milovidov).
  • 修复在处理大型非 ASCII 数据集 (例如构建文本索引时) 时,lowerUTF8 / upperUTF8 因累计输出缓冲区超过 2 GiB 而抛出异常的问题;对于过长的单行数据,现会直接拒绝并给出明确的错误信息。#104229 (Shaohua Wang).
  • 增强 MergeTree 列统计信息加载对瞬时 I/O 故障的容错能力,防止受影响的 parts 永久失去基于统计信息的优化。#104372 (zoomxi).
  • INSERT INTO ... SELECT FROM input(...) 现已不再需要 CREATE TEMPORARY TABLE 权限。#104470 (Alexey Milovidov) 。
  • 新增了一个 MergeTree setting concurrent_part_removal_threshold_for_remote_disk (默认值为 16) :当待移除的分片中至少有一个存储在远程磁盘上时,将使用该设置而不是 concurrent_part_removal_threshold。此前的阈值 100 可能导致 object storage backend 上的 DROP TABLE 及其他分片移除操作停滞数十秒,因为尽管每次移除都对应一次独立的网络往返,这些移除仍会串行执行。该新设置使远程存储能够更早进入并行移除路径,同时保持本地磁盘上的行为不变。#104676 (Groene AI).
  • 新设置 defer_partition_pruning_after_final (默认值为 1) 使 26.3 引入的在 FINAL 下跳过分区裁剪的行为可以选择禁用。将其设为 0 可恢复 26.3 之前的分区裁剪行为——对于相同 PK 的行不会跨分区的事件日志工作负载,速度会显著提升。compatibility = '26.2' 会自动将其切换为 0#104705 (Nikita Fomichev) 。
  • 修复 intExp2 在输入超出范围时返回错误结果的问题 (包括 JIT 下移位 >= 64 的情况,以及两条代码路径中绝对值超过 INT_MAX 的整数) 。#105054 (Raúl Marín).
  • clickhouse installclickhouse git-import 中,对根据 CLI 选项和已解析输入构建的 shell 参数添加引号,以便正确处理包含空白字符或 shell 元字符的路径、用户/组名以及提交哈希。#105232 (Raúl Marín).
  • Alias 表引擎现已脱离 Experimental 阶段,无需 allow_experimental_alias_table_engine 设置即可使用。#103488 (Alexey Milovidov).
  • clickhouse-benchmark 新增了 --queries-format 选项,以便在默认的制表符转义、每行一个查询的输入格式 (tsv) 和将标准输入解析为以 ; 分隔的多查询脚本 (script) 之间进行选择。#99972 (Aleksandr Musorin).
  • 按元素运算的 Tuple 运算符 tuplePlustupleMinustupleMultiplytupleDividetupleModulotupleIntDivtupleIntDivOrZero 现已支持可变参数,可接受两个或更多个大小相同的元组,并以左折叠方式逐元素应用。此前它们只能接受恰好两个参数。#104659 (Aruj Bansal) 。
  • 新增了一个位于 /processors-profile 的内置 Web UI,可将任意过往 SELECT 查询的管道以热力图形式可视化,数据来自 system.query_logsystem.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.htmljemalloc.htmlmerges.htmlbinary.htmlwebterminal.html) 中的 user 输入框不再预先填入字面值 default。现在它会显示 user 占位提示,且默认为空。留空时,页面不会发送 user= URL 参数 (而 WebTerminal 的身份验证 JSON 会省略 user 字段) ,因此服务器会按通常的回退逻辑使用 default 用户——而且通过其他渠道提供的 HTTP 凭证 (X-ClickHouse-User、HTTP Basic、各 handler 的 <handler><user> 配置) 也不再会被覆盖。#105254 (Alexey Milovidov).
  • ORC 读取器:将基于偏移量的读取 (readBigAt) 与 use_prefetch 解耦,从而即使在 use_prefetch = false 时 (例如由 Gluten 设置) ,也能正确读取 HDFS 上采用 EC 编码的数据。#103348 (zhanglistar).
  • play.html 下载的 CSVWithNames 格式文件现在使用 .csv 文件扩展名。#103737 (JackFielding).
  • 增强了 BigLake 目录的输入验证。#105117 (Konstantin Vedernikov) 。

错误修复(官方稳定版本中用户可见的异常行为)

  • 通过记住表达式是否加了括号,修复格式化不一致的问题。#92340 (Alexey Milovidov).
  • 修复 Decimal 和 Float 类型之间的精确比较问题。#94293 (zoomxi) 。
  • 在分布式查询中允许使用位置参数。#94359 (simonmichal).
  • 修复在删除并重新创建同名 materialized view 时,DatabaseCatalog::updateDependencies 中的断言失败;同时修复在引用依赖为空时,执行 RENAME TABLEEXCHANGE 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 COLUMNRENAME COLUMN 时出现的“找不到列”错误。#100387 (Alexey Milovidov) 。
  • 修复了在 DETACH/ATTACH 或服务器重启后,混用 UNIONINTERSECT/EXCEPT 运算符的视图会返回错误结果的问题。#100390 (Alexey Milovidov).
  • 修复了在使用 AST fuzzer 进行压力测试期间,当 IN 子句中出现相关子查询时,可能触发的 "Trying to execute PLACEHOLDER action" 异常。#100398 (Alexey Milovidov).
  • 修复了向带有 Date 列且按 yearmonthday 转换分区的 Iceberg 表插入数据时触发的逻辑错误异常。#100404 (Alexey Milovidov).
  • 修复了在 ALTER TABLE MODIFY COLUMN 更改列类型后,跳过索引仍用于不兼容数据的问题,该问题可能导致服务器在 sanitizer 构建中崩溃,或返回错误的查询结果。#100526 (Alexey Milovidov) 。
  • 修复 query_logpaimonClusterpaimonS3ClusterpaimonAzureClusterdeltaLakeS3 表函数的凭据泄露。#100529 (JIaQi Tang) 。
  • 修复了一个问题:由于 rd_kafka_consumer_close 中的死锁,对 Kafka 引擎表执行 DROP TABLE 时可能会无限期卡住。#100604 (Alexey Milovidov) 。
  • 将硬编码的 source_table_engines 列表替换为通过 StorageFactoryDatabaseFactory 在运行时查找。向 DatabaseFactory::EngineFeatures 添加 source_access_type,使使用源引擎 (PostgreSQL、MySQL、S3 等) 的 CREATE DATABASECREATE TABLE 一样需要相同的源授权。修复了在 table_engines_require_grant=false 时,GRANT TABLE ENGINE ON * 执行失败的问题。关闭 #71544#100746 (pufit) 。
  • 修复了从某个表读取数据时服务器崩溃的问题:该表的 ALIAS 列包含一个嵌套在函数调用中的相关子查询 (例如 ALIAS toString(intDivOrZero(x, (SELECT ...)))) 。现在,CREATE TABLEALTER TABLE 会对 DEFAULT / ALIAS / MATERIALIZED 列表达式中任意嵌套层级的子查询一律以 THERE_IS_NO_DEFAULT_VALUE 拒绝。此前,浅层校验会放过嵌套子查询,因此相关子查询的情况会在读取时触发崩溃,而嵌套的非相关子查询表面上看似可以工作,但可能导致意外行为;现在这两种情况都会在 DDL 阶段被拒绝。#100753 (Groene AI).
  • 修复了一个可能导致服务器崩溃的问题 (Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode) :在带有 CONSTRAINT ... ASSUME 定义的表上使用包含关联子查询的查询时,如果启用了 optimize_substitute_columnsconvert_query_to_cnf 设置,就可能发生该问题。 #100756 (Groene AI).
  • 修复了一种可能出现的异常:当向 JSON 列插入一行数据时,如果该行在引入新动态字段的同时还包含一个值不兼容的已类型化字段,并且随后该列被用作 GROUP BY 键,就可能触发该异常。 #100758 (Jimmy Aguilar Mena).
  • 修复了通过 DiskObjectStorageTransaction 路径 (用于 s3_with_keeper 磁盘,以及在显式设置 use_fake_transaction=false 时) 进行的 S3/对象存储写入会在无提示的情况下绕过工作负载 IO 调度的问题。此前,向这类磁盘上的 MergeTree 表执行 INSERT 写入时,会忽略 CREATE RESOURCE / CREATE WORKLOAD 限流,因为在事务性写入路径中,资源关联从未注入到 WriteSettings 中。#100777 (JIaQi Tang).
  • 修复了 ProtobufProtobufList 共享 schema 缓存时的冲突问题:先以 FORMAT Protobuf 读取消息,再以 FORMAT ProtobufList 读取时,可能会失败,因为 ProtobufList 会强制将缓存的 schema 设为其 envelope 形式。现在,如果没有可用的 envelope schema,ProtobufList 会回退为使用缓存的消息类型。#100849 (Callum Cooper) 。
  • 修复因 std::exception ABI 不匹配导致的 Rust CXX 桥接层堆缓冲区溢出问题。#100931 (Azat Khuzhin) 。
  • FunctionVariantAdaptor 现在会在所有 Variant 候选类型都与函数不兼容时抛出 ILLEGAL_TYPE_OF_ARGUMENT,而不是静默返回 Nullable(Nothing)。此前,在 WHERE function(variant_col) 谓词中,如果没有任何候选类型兼容,则会在不报错的情况下返回 0 行;而等价的 SELECT 上下文则已经会正确抛出错误。#100939 (Vasily Chekalkin).
  • 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 几何解析器中的两个问题:MULTILINESTRING 几何体会被错误解析为 Polygon (这会导致类型化列抛出异常,并使混合 Geometry 列发生静默数据损坏) ;此外,缺少类型关键字的畸形 WKT 字符串此前会触发未定义行为,而不是返回明确的错误。 #100997 (Vasily Chekalkin).
  • 修复了在仅有单个分片的分布式表上执行 grouping/GROUPING SETS 查询时失败,并报出 "Method executeImpl is not supported for 'grouping' function" 错误的问题。#101030 (Alexey Milovidov).
  • 修复了规划器中的 LOGICAL_ERROR "列标识符已注册" 问题:当同一个表表达式被处理多次时,可能会出现该问题。#101048 (Alexey Milovidov).
  • 修复 additional_result_filter 设置与 UNION 或 EXCEPT 查询同时使用时出现的 LOGICAL_ERROR 异常 "Column identifier is already registered"。#101051 (Alexey Milovidov) 。
  • 修复了一个服务器崩溃问题:在 GROUPING SETS、ROLLUP 或 CUBE 中,将 * APPLY 与聚合函数结合使用,且 group_by_use_nulls=1 时,会触发该问题 (Logical error: Bad cast from ColumnVector to ColumnNullable) 。#101062 (Groene AI).
  • 修复了这样一种问题:当 input_format_csv_skip_first_linesinput_format_tsv_skip_first_lines 大于文件中的行数时,会陷入无限循环。#101111 (Alexey Milovidov) 。
  • 修复惰性物化优化中的越界访问问题,该问题可能会在调试构建中引发异常。#101144 (Alexey Milovidov).
  • 修复递归 CTE 中的类型推断:现在会通过 getLeastSupertypeUNION ALL 的非递归侧和递归侧之间迭代拓宽列类型,直至收敛,从而避免在 x + 1 这类表达式中发生整数溢出。#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 设为极端值时导致服务器崩溃。#101159 (Groene AI) 。
  • 修复了在 ROW POLICY 的 USING 子句中使用标量子查询 (例如 USING (SELECT 1)) 时,QueryAnalyzer::resolve() 中出现的 LOGICAL&#95;ERROR 崩溃。关闭 #100695#101263 (Groene AI) 。
  • 修复了 MergeTreeDataPartWriterCompact::cancel 在 stream 分配失败时的未定义行为。#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 的过滤器 (仅引用外连接的保留侧) 下推到外连接的 ON 子句中而导致的查询结果错误。#101504 (Vladimir Cherkasov) 。
  • 对于包含 arrayJoin 的计划,跳过应用惰性物化,因为这可能导致 limit 无法得到遵守。关闭 #101608#101644 (Vladimir Cherkasov) 。
  • 修复了错误的 JOIN 查询结果:当 mergeFilterIntoJoinCondition 优化在类型不匹配时静默丢弃 WHERE 等值条件时,会导致该问题。#101652 (Xiaozhe Yu).
  • 修复 error 测试提示在语法/解析错误场景下不起作用的问题——此前,对格式错误的查询使用 -- { error SYNTAX_ERROR } 时,会报 "Expected server 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) 。
  • 修复以下问题:在同一服务器运行期间,如果此前未对该表执行过 SELECT 或 INSERT,对 Iceberg 表执行 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 中触发的 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&#95;substreams.txt 损坏的问题。关闭了 #102259#102689 (Pavel Kruglov) 。
  • 修复 JSON 解析期间向 Time 数据类型插入数据的问题。关闭 #102016#102690 (Pavel Kruglov) 。
  • 修复缓存的 schema 文件名中内容样本的十六进制编码问题。关闭 #101904#102703 (Pavel Kruglov) 。
  • 修复了在 SummingMergeTree 合并过程中,当 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).
  • 修复通过 HTTP 接口执行 INSERT SELECT 查询时,input('auto') 表函数失效的问题。#102902 (Miсhael Stetsyuk) 。
  • 对启用行策略/additional_table_filters 的情况禁用简单 LIMIT 优化 (以支持并行索引分析) 。#102921 (Azat Khuzhin) 。
  • HMAC SQL 函数中隐藏密钥。修复了 #102927#102997 (Mikhail f. Shiryaev) 。
  • 修复了在启用 optimize_syntax_fuse_functions 时,分布式 queries 中多次引用同一 quantile 调用 (例如在 SELECTHAVINGORDER BY 中) 时触发的 MULTIPLE_EXPRESSIONS_FOR_ALIAS 异常。#103014 (tanner-bruce).
  • 修复了 CI 发现的一种情况:当过滤器依赖左侧列时,传入了一个尚未就绪的集合。关闭 #102966#103029 (Yarik Briukhovetskyi) 。
  • 修复了在某些情况下将 castOrNull 转换为 JSON 时的问题。关闭了 #101818#103036 (Pavel Kruglov) 。
  • 修复了一个问题:当聚合投影与查询匹配,但表中的某些 parts 没有投影数据时,SELECT DISTINCT 会静默返回不完整的结果 (例如,在已包含数据的表上添加了该投影,但未运行 MATERIALIZE PROJECTION) 。关闭 #102951#103052 (Nihal Z. Miaji) 。
  • 修复了这样一种情况下出现的 TOO_FEW_ARGUMENTS_FOR_FUNCTION 异常:在 analyzer 进行公共表达式提取时,WHERE 谓词 (如 AND(OR(A, A), A)) 会折叠成单个顶层参数。#103072 (Peng).
  • 修复在对包含 QBit 元素的 Tuple、Map 或 Array 求值 if/ifNull 时触发的逻辑错误 Function writeSlice expects same column types for GenericArraySlice and GenericArraySinkColumnQBit::structureEquals 错误地将一个 QBit 列的内部 Tuple 与另一个的外层包装器进行比较,导致结构相同的 QBit 列被误判为不同。#103084 (Groene AI).
  • 使在启用 database_atomic_wait_for_drop_and_detach_synchronously 时执行的 DETACH DATABASE 能够响应 KILL QUERY,而不是在持有表引用时无限期卡住。#103095 (Alexey Milovidov) 。
  • 修复使用非标识符谓词 (如 WHERE 1=1) 删除 WASM 模块时触发的段错误。#103101 (Joe Redfern).
  • 修复向后兼容性被破坏的问题:旧客户端通过 remote() 或分布式表向较新版本服务器插入数据时,会因 processInsertQuery 末尾无条件发送 sendProgress 而报 UNEXPECTED_PACKET_FROM_SERVER 错误。#103148 (Sema Checherinda).
  • 对于第二个参数为非常量元组的 IN,不得将元组元素向下 CAST 为左侧类型,否则可能会发生溢出。已关闭 #103055#103169 (Yarik Briukhovetskyi) 。
  • 修复协议函数中使用未初始化值的问题。#103187 (Pavel Kruglov) 。
  • 修复了在 MergeTree 索引分析期间出现的 LOGICAL_ERROR (Bad cast … to ColumnLowCardinality) :当 WHERE 子句将 LowCardinality 键列与一个被强制转换为包含嵌套 LowCardinality 的类型的常量进行比较时,会触发此错误 (例如 Variant(LowCardinality(Date), String)) 。#103211 (Groene AI) 。
  • 修复 timeSeries*ToGrid 聚合函数家族 (例如 timeSeriesResampleToGridWithStalenesstimeSeriesChangesToGridtimeSeriesResetsToGridtimeSeriesRateToGrid) 在使用会导致桶计数计算中的有符号 64 位运算溢出的极端时间戳参数调用时,出现 Logical error: 'index < bucket_count' 的问题。同时将网格桶总数上限设为 1600 万,以防恶意输入意外触发大规模内存分配。#103223 (Groene AI) 。
  • 修复了在 ReplacingMergeTree 的惰性 FINAL 路径中扩展管道时触发的 Logical error: 'Port is already connected' 异常。该问题会影响设置了 query_plan_optimize_lazy_final = 1 的查询:当 ReadFromMergeTree::initializePipeline 插入内部转换 (例如 Resize) ,并将子管道中的处理器彼此连接起来时,会导致 LazyUnorderedReadFromMergeTreeSource::expandPipeline 试图连接已经连接的输出端口。#103230 (Groene AI).
  • 修复当输入为已排序子查询的 UNION ALL 时,LIMIT BYDISTINCT 返回错误结果的问题。查询计划优化器错误地将此类 UNION ALL 视为全局有序,导致返回了多余的行。#103231 (Nihal Z. Miaji) 。
  • 修复了在启用惰性复制的 Map 类型中计算统计信息时可能发生的崩溃。关闭 #102390#103273 (Pavel Kruglov) 。
  • 修复 ClickHouse、MySQL、PostgreSQL 和 XDBC 字典源中的数据竞争:clone() constisModified() const 分别从同一个 invalidate_query_response 字符串读取和向其写入。#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).
  • 修复了 flattenTupletupleToNameValuePairs 在处理 Nullable(Tuple(...)) 输入时对 NULL 行处理错误的问题。flattenTuple 现在会保留外层 null 映射,因此 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).
  • 修复了一个会导致服务器中止的 LOGICAL_ERROR "Cannot pop N rows from X" (在 debug / sanitizer 构建中) :读取格式错误的 BSON 文档时,如果其中某个值的 BSON 类型与 Nullable(T)Array(Nullable(T)) 列中的目标类型不兼容,就会触发该问题。现在,这种格式错误的行会按预期产生明确的 ILLEGAL_COLUMN 异常。 #103418 (Groene AI).
  • 修复了在将 arrayFillarrayReverseFill 应用于首行为一个空值、且同时使用恒为 false 的 lambda 的 Array(String) 列时,服务器中止的问题。聚合 / 子数组循环中的 size_t 索引发生下溢并变为 SIZE_MAX,随后导致 ColumnString::doInsertManyFrom 内部出现越界读取。与 #12263 属于同一 bug 家族。#103424 (Groene AI) 。
  • 修复了这样一个问题:当上游 REPLACE RMV 的 EXCHANGE 在解析过程中切换目标存储身份时,下游使用 SQL SECURITY DEFINER 的 APPEND RMV 会出现 ACCESS_DENIED / UNKNOWN_TABLE。 #103427 (Alexander Gololobov).
  • url 表函数中填充 _time 列。#103437 (Nikita Taranov) 。
  • 修复在处理位宽值无效的畸形输入时,ALP 编解码器解压路径中潜在的越界读取问题。#103457 (Raufs Dunamalijevs) 。
  • 修复了一个 bug:SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ... 在格式化查询时可能丢失缓存名称,导致远程节点同步所有文件系统缓存,而不是仅同步指定的缓存。#103469 (Asish Kumar).
  • 修复 deltaLakeAzure 中 URL 编码路径的处理问题。关闭 #103509#103525 (Smita Kulkarni) 。
  • 修复将 AggregateFunction 状态乘以整数时出现的堆内存释放后继续使用问题 (例如 quantilesExactState(...) * N) 。平方求幂循环会将该状态与自身合并,而当聚合函数的 merge 重新分配其内部存储时,这种行为是未定义的。关闭 STID 0988-40af。#103536 (Groene AI) 。
  • 修复了一个罕见问题:当磁盘上两个意外的空 parts 的块范围彼此重叠但互不包含时,ReplicatedMergeTree 表在启动时会抛出 LOGICAL_ERROR "Part X intersects previous part Y"。该异常会中止表 attach 线程,导致表无法启动。#103537 (Groene AI).
  • 修复了 Logical error: Incorrect mark rows for part ... (仅在调试版本中触发的断言) 问题:在使用非自适应索引粒度 (index_granularity_bytes = 0) 且最后一个数据标记不完整的 MergeTree 表上执行变更时,会触发该问题 (最可靠的复现方式是先执行 DETACH/ATTACH,再执行轻量级 DELETE) 。#103538 (Groene AI).
  • 修复了 clickhouse-local 通过 file() 表函数读取 /proc/sys 伪文件时静默返回 0 行的问题 (例如 SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')) 。#103548 (Ashrith Bandla).
  • 修复了 GenerateRandom 表引擎中 max_string_length 参数的处理。#103550 (Alex Kuleshov) 。
  • 修复日志中嵌套凭据的脱敏。#103552 (Vitaly Baranov) 。
  • 修复了在 SVE 不可用时仍使用 SVE 指令进行检测的问题。#103568 (Raúl Marín).
  • 修复 GenerateRandom 存储参数的解析问题。#103574 (Konstantin Bogdanov).
  • 修复了在数据以 ±inf 开头时,WITH FILL 导致无限循环的问题。#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) 。
  • 修复将时区字符串作为第 3 个参数调用时,windowIDtumble window view 中的逻辑错误/未定义行为。#103641 (Alexey Milovidov) 。
  • S3 客户端日志现在会将包含非空 x-amz-bucket-region 请求头的 HTTP 400 响应 (SigV4 签名区域错误) 视为信息级的区域错误情况,并记录更清晰的日志,而不再走通用的错误处理路径。只有在配置了 web identity 时,才会将 STS web identity 凭证提供商添加到 S3 凭证链中,从而减少未使用该功能的部署中出现的无关警告。关闭了 #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 会抛出 Arguments of 'plus' have incorrect data types。现在,KeyCondition::getMonotonicityForRange 会在调用内部数值分发前递归剥离 LowCardinality#103701 (Groene AI).
  • 修复 26.1+ 中动态缓存调整大小时的竞争问题。#103702 (Kseniia Sumarokova) 。
  • 修复了一个问题:对于表达式中包含捕获常量的 lambda 的 ALIAS 列,其文本和 bloom_filter 跳过索引 (例如 arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m)))) 之前会被静默忽略。 #103708 (Anton Popov).
  • 修复了 positionpositionCaseInsensitivestart_pos 接近 UINT64_MAX 时,因指针算术溢出而卡死或导致段错误的问题。#103766 (Raúl Marín).
  • 修复了解析带有双重小数部分的 dateTime 时的未定义行为。#103773 (Yarik Briukhovetskyi) 。
  • 修复了 26.x 中一个影响数据正确性的回归问题:当经 JIT 编译的 ifmultiIf 的结果类型为 Decimal,且某个分支中使用了非 Decimal (整数或浮点) 字面量时,会静默返回一个比正确值小 10^scale 倍的结果。慢速 (非 JIT) 路径不受影响。受影响版本的临时规避方法:SET compile_expressions = 0#103809 (Groene AI) 。
  • 修复了将 text index 中的分词器传递给受支持函数的问题。#103826 (Elmi Ahmadov).
  • 修复当 WHERE 子句对一个其元素去重后仅剩单个键列的元组使用 INNOT IN 时,numbersgenerate_series 以及其他类似遵循范围的源返回错误结果的问题 (例如,WHERE tuple(number, number) NOT IN (tuple(1, 2))) 。关闭 #103660#103835 (Groene AI) 。
  • 将自动落盘哈希连接的实际内存峰值控制在 max_bytes_before_external_join 以下。此前,基于统计信息的预分配、原地哈希表翻倍扩容,以及 GraceHashJoin 中不受限制的内存桶,都可能使查询超出配置上限并触发 MEMORY_LIMIT_EXCEEDED#103838 (Alexey Milovidov).
  • 修复了在配置系统日志 (例如 text_logfilesystem_cache_log) 时,clickhouse-local 关闭过程中卡死的问题。SystemLogs::flushImpl 会调用 BaseDaemon::instance().flushTextLogs();而该调用在 clickhouse-server 之外会抛出 std::bad_cast,导致保存线程一直运行,直到 pthread_cond_destroy 阻塞系统日志队列的销毁。 #103874 (Alexey Milovidov).
  • 拒绝其主体在不同引用中被解析为不同推断列类型的 MATERIALIZED CTE 查询,并返回明确的 TYPE_MISMATCH 错误,而不是因 Bad cast LOGICAL_ERROR 导致服务器崩溃。此前,当 CTE 主体引用外部作用域中的标识符 (例如调用方子查询投影中的别名) ,且这些标识符在每次引用时都会被内联为不同的常量时,就会发生这种情况。#103879 (Groene AI).
  • 修复了 JOIN 转换查询计划优化器 (tryConvertAnyOuterJoinToInnerJointryConvertAnyJoinToSemiOrAntiJoin) 中的“使用未初始化值”问题:当 ANY OUTER JOIN 上层的过滤器包含 randnowrowNumberInAllBlocks 等非确定性函数时,就会触发该问题。优化器现在不再尝试对此类过滤器进行常量折叠,而是保持 JOIN 不变,同时也避免了错误地将其转换为 INNER/SEMI/ANTI JOIN,从而静默丢弃行。#103880 (Groene AI) 。
  • 修复了 StorageKafka2 中一个释放后使用问题:当 Keeper session 在消费者持有临时 topic 分区锁期间被替换时,可能导致服务器崩溃。#103890 (Groene AI).
  • 修复了一个问题:当使用 JOIN ... USING (key)EmbeddedRocksDB 表与键列类型 (例如 Nullable(UInt64)Int64Decimal) 与存储主键类型不同的子查询进行连接时,会抛出 LOGICAL_ERROR "Primary key type mismatch"。现在,规划器在类型不匹配时会放弃 DirectKeyValueJoin,并回退到可处理类型转换的 HashJoin#103928 (Groene AI) 。
  • SET max_threads = DEFAULT (max_final_threadsmax_parsing_threads 也是如此) 不再丢失自动状态。此前,重置其中任一设置后,system.settings 会显示解析出的 CPU 核心数 (例如 32) ,而不是 'auto(32)',并且服务器的行为会像该值已被显式固定一样。#103991 (Groene AI).
  • 修复读取 AggregateFunction(topK(N), String) 列时出现的 SIZES_OF_ARRAYS_DONT_MATCH 问题:该问题发生在持久化的 alpha_size 因 pre-25.12 的反序列化+序列化循环而增大时。 #104002 (Raúl Marín).
  • 修复了 PostgreSQL、Cassandra 和 XDBC 字典源中的 SQL 注入漏洞:此前,包含单引号的字符串键使用 \' (反斜杠) 转义,但这些后端会将其视为字面反斜杠,而不是转义序列,因此可将任意 SQL 注入字典查找查询。ExternalQueryBuilder 现在会为这些后端生成符合 SQL 标准的 '' 转义;ClickHouse 和 MySQL 字典源仍继续使用反斜杠转义。#104009 (Shaohua Wang) 。
  • 修复了一种可能的聚合类型不匹配问题:当某列的类型改为或从 LowCardinality 改回,且未重建最小-最大投影时,可能会出现此问题。 #104013 (Nikita Taranov).
  • 修复了一个问题:在合并表达式时,未传递“禁止删除未使用列”的标记,导致查询优化陷入无限循环。 #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 会错误地从内部 DISTINCT 投影中移除未被引用的列,导致原本应保持 distinct 的行 (即投影列中的值相同,但被移除列中的值不同) 被合并为一行。#104114 (Groene AI) 。
  • 修复了设置 optimize_inverse_dictionary_lookup 时若干边界情况下的正确性问题,此前该优化可能会静默丢弃行或屏蔽异常。关闭了 #103270。关闭了 #103085#104133 (Nihal Z. Miaji) 。
  • 修复反序列化 quantileTiming 状态时的越界写入问题。#104141 (Alexey Milovidov).
  • 修复将超出范围的 Float64 值转换为较宽的整数类型 (UInt64Int64Int128UInt128Int256UInt256) 时的未定义行为。此前,等于 Float64(numeric_limits<T>::max()) 的值 (会向上舍入为一个高于实际最大值的数) 会绕过边界检查,并在后续转换中产生 UB。这会影响聚合函数的参数解析 (topKhistogramuniqUpTogroupArrayInsertAt 等) ,以及通过 SET <setting> = <Float64> 设置的整型设置项。关闭 #103817#104154 (Groene AI) 。
  • 修复了将嵌套的 Tuple(Tuple(Nullable(...))) (或更深层嵌套) 与 String 字面量比较时出现的 LOGICAL_ERROR 异常 "Unexpected return type from comparison. Expected UInt8. Got Const(Nullable(UInt8))"。现在,该比较的返回类型会被正确推断为 Nullable(UInt8),与 runtime 行为一致。#104171 (Groene AI) 。
  • 修复了在 query_plan_optimize_lazy_final = 1 时,执行 SELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr> 会导致服务器中止的问题 (UndefinedBehaviorSanitizer: reference binding to null pointer,以及 release 构建中的段错误) 。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) :当针对底层对象存储被文件系统缓存等装饰器包装的磁盘,调用带有 SETTINGS disk = '...' 的数据湖表函数和引擎 (icebergS3deltaLakeS3 等) 时,该错误会导致参数解析中止。关闭 #89300#104258 (Groene AI) 。
  • 修复了对名为 values 的列上带括号的下标表达式 (例如 (values['a'])) 的解析问题,使其不再被解释为 SQL 标准的 VALUES 表表达式。#104312 (Desel72).
  • 修复了文件系统缓存后台驱逐线程 (SLRUFileCachePriority::collectEvictionInfo) 中的服务器中止/LOGICAL_ERROR 问题:当 keep_free_space_size_ratiokeep_free_space_elements_ratio 高到足以触发驱逐,且所有缓存条目都已提升到 SLRU protected 队列中时 (probationary 队列为空) ,就可能触发该问题。#104313 (Groene AI) 。
  • 修复在将投影与 UNION ALL 视图、窗口函数或别名与列名冲突的情况一起使用时出现的异常 (NOT_FOUND_COLUMN_IN_BLOCKLOGICAL_ERRORAMBIGUOUS_COLUMN_NAME) 。这是由 #88798 引入的回归问题。#104317 (Amos Bird) 。
  • 修复了解析 Postgres 数组时可能发生的下溢问题。 #104322 (Grant Holly).
  • 返回非 Nullable 类型 (如 ArrayTupleMap) 的函数现在也接受 Nullable 参数。受影响的函数包括 extractAllextractAllGroupsextractAllGroupsHorizontalextractAllGroupsVerticalextractGroupssplitByCharsplitByStringsplitByRegexpsplitByWhitespacesplitByNonAlphaalphaTokens。对于 NULL 输入行,现在会返回结果类型的默认值 (例如空数组) ,而不再引发 "Nested type is not allowed inside Nullable type"。#104326 (Alexey Milovidov) 。
  • 修复 Iceberg 分区表的统计信息。此更改关闭了 #104321#104329 (Konstantin Vedernikov) 。
  • 修复了 macOS (以及类似的 jemalloc 构建) 上服务器启动时的一个致命逻辑错误:由于可选的 background_thread / max_background_threads mallctl 不存在,Jemalloc::verifySetup 会误报 jemalloc_enable_background_threads 不匹配;现在,当这些 mallctl 不可用时会跳过验证,且 getValue 在失败时也不再使输出保持未初始化状态。关闭 #102183#104330 (SAYON DEEP).
  • 修复了一个正确性回归问题:当 SELECT 查询使用 max_rows_to_read_leafread_overflow_mode_leaf = 'throw' 时,即使跳过索引本可将读取行数降到叶子端上限以下,也可能仍会错误抛出 TOO_MANY_ROWS。对应的非叶子端设置 (max_rows_to_read / read_overflow_mode) 此前已处理。#104331 (Groene AI).
  • toUUIDtoUUIDOrNulltoUUIDOrZerotoUUIDOrDefault、转换为 UUIDNullable(UUID)CAST、转换为 UUIDaccurateCastOrNull,以及从文本中解析 UUID 的输入格式 (AvroMsgPackJSONExtract、...) 现在都会拒绝长度正确但包含非十六进制字符的字符串。此前,这类输入会因越过十六进制数字查找表末尾而被静默转换为伪造的 UUID;现在,toUUID 会抛出 CANNOT_PARSE_UUID,而 Or* 变体则会返回 NULL / 零 UUID / 提供的默认值。#104370 (Groene AI) 。
  • 修复了 caseWithExpression (以及 SQL CASE expr WHEN ... THEN ... ELSE ...) 中的 Bad cast LOGICAL_ERROR:当仅 THEN 分支的 supertype 与 (THEN 分支 + ELSE) 的 supertype 落入不同的 ColumnDecimal 存储类型时,会触发该问题——例如 THEN 值为 (UInt16, Int8),而 ELSE 为 Decimal(9, 2)。关闭 #104335#104378 (Groene AI) 。
  • 通过 logExceptionBeforeStart 报告的内部故障 (异步插入 flush、物化视图 refresh,以及内部查询期间触发的解析错误) ,现在会正确递增 FailedInternalQueryFailedInternalSelectQueryFailedInternalInsertQuery 这些 ProfileEvents,同时也会递增用户可见的 FailedQueryFailedSelectQueryFailedInsertQuery 计数器。此前,对于在查询开始执行前发生的故障,这些内部计数器始终保持为零,导致一大类内部故障被漏计。#104399 (Groene AI) 。
  • 修复了在 BACKUPRESTORE 语句的 base_backup 设置中使用查询参数时抛出的 Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type} 错误 (例如 BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)) 。该回归问题由 PR #9920526.1.5 中引入。关闭 #103324#104413 (Groene AI) 。
  • 修复了 IcebergLocal/IcebergS3 写入场景中的一个服务器异常终止问题:当 ALTER TABLE ... DROP COLUMN 之后执行 INSERT,且 iceberg_metadata_staleness_ms 大于零时,就会触发该问题。现在,ALTER 会使本地 Iceberg 元数据文件缓存失效,因此后续读取和写入都能看到新的 schema。#104419 (Groene AI) 。
  • 修复了 DROP ROLEDROP USERDROP SETTINGS PROFILEDROP ROW POLICYDROP QUOTADROP MASKING POLICY:现在会从所有引用了已删除实体的其他访问控制实体中移除对该实体的引用 (例如用户的 DEFAULT ROLE 列表、settings profile 的 TO 列表、row policy 的被授权方) ,并将清理结果持久化到磁盘。此前,由于 SHOW CREATE 会过滤掉未知 UUID,内存状态看起来是正确的;但磁盘上的 .sql 文件仍保留了悬空的 ID('<dropped-uuid>') 条目,这些引用会在下一次服务器重启时重新出现,并在执行分布式查询期间表现为 ACCESS_ENTITY_NOT_FOUND 错误。#104427 (Groene AI).
  • 修复了一个会导致服务器中止的问题:当 azureBlobStorageAzureBlobStorage 引擎以及 Azure 上的 DeltaLake 使用的 connection string 中,BlobEndpoint URL 的端口为空、非数字或超出范围时 (例如 BlobEndpoint=http://host:abc/) ,就会触发该问题。现在,服务器会返回清晰的 BAD_ARGUMENTS 错误,而不是在 debug/sanitizer 构建中直接中止。#104460 (Groene AI) 。
  • 允许在 remoteremoteSecure 表函数中将未加引号的标识符用作用户名,与数据库和表参数可接受未加引号标识符的方式一致。此前,此类查询会失败,并报出一条具有误导性的身份验证错误信息,指向 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 的一个问题:当第二个参数是空的 uniqTheta 状态时,它原本会返回第一个参数的基数,而不是 0——例如,当谓词排除了所有行时,uniqThetaMergeStateIf(s, predicate) 的结果就会出现这种情况。#104529 (Groene AI).
  • 修复了由 Iceberg REST catalog (iceberg-restonelakebiglake) 作为后端的 DataLakeCatalog 数据库中,SHOW TABLESsystem.tables 会静默截断列表的问题。当 catalog 服务器对 list-tables 或 list-namespaces 响应进行分页时 (例如在 Microsoft Fabric / OneLake 中,单个命名空间下的表超过约 50 个时) ,后续页面中的表不会显示在 SHOW TABLESsystem.tables 的结果中,尽管仍可通过直接 SELECT 查询到。RestCatalog 现在会遵循 Iceberg REST OpenAPI 规范中定义的 next-page-token 延续标记,其行为与现有的 PaimonRestCatalogUnityCatalog 保持一致。#104531 (Groene AI).
  • input 表函数现在会在格式具有固定 schema (LineAsStringRawBLOBJSONAsString 等) 时,根据所在 INSERT 查询的 FORMAT 子句推断其结构,因此用户在这些格式下不再需要重复将结构写成 input('line String')#104532#104533 (Groene AI) 。
  • 将 Iceberg history 中字段的数据类型从 Int32 更新为 Int64。关闭 #94176#104579 (Smita Kulkarni) 。
  • 修复了在解析逗号后紧跟 lambda 的函数调用时出现的 Inconsistent AST formatting LOGICAL_ERROR,例如 SELECT substring(x, `x` -> `x`)。此前,解析器会悄悄将前面的参数合并到 lambda 的左侧,导致生成一个单参数调用,且无法重新解析回相同的 AST。现在会保留函数原始的参数个数。#104626 (Groene AI).
  • CHECK TABLE t 现在在未指定数据库限定符时,会优先选择 TEMPORARY 表,而不是同名的永久表,这与 SHOW CREATE TABLEDESCRIBE TABLEOPTIMIZE TABLEALTER TABLE 已采用的优先级一致。此前,CHECK TABLE t 会完全跳过临时表,因此即使这些引擎支持 CHECK,在临时 LogFile 表上也会因 UNKNOWN_TABLE 而失败。后续跟进见 #100966#104637 (Groene AI) 。
  • 修复了以下问题:当向未配置 <placement> 的 Keeper 发送带有 quorum_reads=trueget /keeper/availability_zone 请求时,Keeper 会终止并陷入重启循环。#104663 (myeongjun).
  • 修复 FutureSetFromTuple::buildOrderedSetInplace 中的 TOCTOU 数据竞争问题,该问题会导致逻辑错误。#104673 (Miсhael Stetsyuk) 。
  • 修复了多个函数的问题:在相同输入下,如果参数是以列或常量形式传入,返回结果可能不同。这些函数包括:bitRotateLeft / bitRotateRight (边界移位计数) 、接受 LowCardinality(Nullable) 输入时的 length(FixedString) / concatWithSeparator、对 NaN 的 roundDown,以及对无效 UTF-8 的 rightUTF8#104710 (Raúl Marín) 。
  • 修复了以下问题:当最常出现的值是列默认值,且数据分布在多个 MergeTree parts 中时,anyHeavy 会返回非高频值 (稀疏列读取路径) 。#104712 (Raúl Marín) 。
  • 修复设置约束处理中的多个缺陷:此前,声明在设置标准名称上的 MergeTreeSettings 约束可通过向该设置的别名写入来绕过;disallowed_values 约束检查在钳制场景 (次级查询、ON CLUSTER 工作线程、SQL SECURITY DEFINER 视图) 下会抛出异常,而不是静默丢弃该变更。#104737 (Raúl Marín).
  • 修复了一个问题:对于采用惰性附加的 Iceberg / IcebergLocal / DeltaLake / Hudi 表,如果其元数据尚未加载 (常见于服务器重启后,或此前一次元数据写入失败并在磁盘上留下损坏的元数据文件后) ,执行 OPTIMIZE TABLEALTER TABLE ... DELETEALTER TABLE ... ADD COLUMN 及其他 ALTER 变体时,会触发 LOGICAL_ERROR 异常 (Metadata is not initialized) 。现在,如果元数据成功加载,操作将正常执行;如果加载失败,则会将底层加载失败作为常规的用户可见异常抛出,而不是在 debug / sanitizer 构建中导致服务器中止。#104738 (Groene AI).
  • 修复了 AvroConfluentRowInputFormat 中因释放后继续使用而导致的段错误。#104751 (Miсhael Stetsyuk) 。
  • numericIndexedVectorPointwiseMultiplynumericIndexedVectorPointwiseDividenumericIndexedVectorPointwiseEqualnumericIndexedVectorPointwiseNotEqual 的标量变体现在在以大于 Int64::maxUInt64 标量作为参数调用时,会抛出 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).
  • 修复另外三个函数在相同输入下会因参数以列或常量形式传入而返回不同结果的问题:transform (以及经由它调用的 caseWithExpression) 在默认值为常量 Date/Date32/Enum/FixedString 时的情况,String 与常量 FixedString 之间的比较运算符,以及在条件为常量且某个分支为 FixedString 时的 if/ifNull/nullIf#104858 (Raúl Marín).
  • 修复了在对 MergeTree 表执行分区裁剪时,如果分区表达式包含会折叠成单个常量值的函数调用链 (例如 floor(NULL, toRelativeYearNum(...))) ,就会因 Bad cast from type DB::ColumnConst to DB::ColumnNullable 而导致服务器异常终止的问题。#104861 (Groene AI).
  • 修复 ContextData 复制构造函数中的一个 ThreadSanitizer 数据竞争:复制 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).
  • 对临时表执行 DETACH TABLE (不带 TEMPORARY 关键字) 时,现在会正确抛出 SYNTAX_ERROR,与 DETACH TEMPORARY TABLE 的行为保持一致。此前,它会静默地设置内部 is_detached 标志,然后直接返回且不报错。要删除临时表,请使用 DROP TEMPORARY TABLEDROP TABLE (后者会通过 Context::ResolveExternal 解析为该临时表) 。关闭 #103475#104943 (Groene AI) 。
  • 使 filesystem 表函数在加载文件内容时遵守 max_memory_usage / max_server_memory_usage 限制。此前,大量或高并发的内容读取可能会超出该限制而不触发 MEMORY_LIMIT_EXCEEDED,最终反而被 OOM Killer 终止。#104956 (Alexey Milovidov).
  • 修复了按 uuid 过滤 system.detached_tables 时触发的 LOGICAL_ERROR (例如 SELECT count() FROM system.detached_tables WHERE uuid = '...') 。该查询现在会返回预期结果,而不再导致服务器中止。#104979 (Groene AI) 。
  • 对嵌套结构仅包含空 Tuple() 叶子节点的元组调用 flattenTuple 时 (例如 Tuple(c0 Array(Tuple()))Tuple(c0 Tuple())) ,将不再抛出 LOGICAL_ERROR。此类输入现在会抛出面向用户的 ILLEGAL_TYPE_OF_ARGUMENT 异常,说明展平结果会是一个空元组。#104989 (Groene AI) 。
  • 修复了在使用 GROUP BY 查询 loop(remote(...)) (或任何由 loop() 包裹且可延迟聚合的存储) 时,可能导致服务器异常终止以及静默返回错误结果的缺陷。此前,外层规划器会根据内层存储报告的处理阶段添加 MergingAggregatedStep,但 LoopSource 总是以 QueryProcessingStage::Complete 将其内部 select 物化,并输出普通列块,因此在 enable_parallel_replicas = 1 时,MergingAggregatedTransform 会触发 LOGICAL_ERROR (Chunk info was not set for chunk in MergingAggregatedTransform) ,而在其他情况下则会静默丢弃外层聚合。#105001 (Groene AI).
  • clickhouse-benchmark --reconnect (不带值的裸写形式) 在 25.4 中因一项变更而意外失效:该变更将 --reconnect 改为整数选项,因此必须提供值。现在,这种不带值的写法已重新生效,且等同于 --reconnect=1 (每次查询都重新连接) 。#105006 (Groene AI).
  • 修复了列名以不完整的 UTF-8 序列结尾时导致的 JSON 输出格式错误。#105012 (Pablo Marcos) 。
  • 修复在 materialized view 的源表执行 EXCHANGE TABLESCREATE OR REPLACE TABLE 后出现的静默数据丢失问题。现在,MV 的源视图依赖关系会保留在原始名称上,因此在执行 insert 时仍会继续触发。该回归由 #98779 引入;现已恢复到回归前的行为。#105029 (Sema Checherinda) 。
  • 修复对将 Float 转换为 UInt128 的 expression 进行 JIT 编译时出现的 CANNOT_COMPILE_CODE Could not find symbol __fixunsdfti 问题,例如 toUInt128(<Float64 expression>)。JIT 符号解析器中缺少用于将无符号 128 位浮点数转换为整数的 compiler-rt 内建函数。关闭 #105031#105048 (Raúl Marín) 。
  • 修复了在设置 send_logs_level 时,clickhouse-local 在查询失败后不输出日志消息的问题。#105067 (Alexey Milovidov).
  • 修复了这样一种错误结果:在同一查询中以不同参数值多次引用同一个参数化视图时,此前 analyzer 会将这些调用合并为一次,悄然丢弃除第一个过滤器外的所有过滤器。#105170 (Alexey Milovidov).
  • 修复 play.html Web UI 中结果表格底部 TOTALS 行重复渲染两次的问题。#103803 (Alexey Milovidov) 。
  • 在向量搜索过程中拒绝非有限向量 (NaN±Inf) (无论是待搜索向量还是参考向量) ;此前它们会导致 usearch 中出现未定义行为。#104079 (Groene AI) 。
  • PromQL:修复空向量情况下的聚合运算符问题。 #104425 (Vitaly Baranov).
  • PromQL:修复 Prometheus 查询 API 中的错误处理问题。#104741 (Vitaly Baranov).
  • 修复了 MergeTreeTransaction::afterCommit 中的竞态条件:如果在将提交 CSN 写入 ZooKeeper 之后、事务完成之前发生连接丢失,COMMIT 响应可能会在新的 creation_csn / removal_csnsystem.parts 中可见之前就到达客户端。#104708 (Tuan Pham Anh) 。
  • 修复 KQL 解析器在转换嵌套数组索引 (arr[arr[arr[...]]]) 时内存呈指数级增长的问题。#105142 (Alexey Milovidov).
  • 修复了 RIGHT ANY JOIN 在右侧表的每个 key 对应多行,且输出块因大小限制被拆分时产生错误结果的问题。关闭 #99431#102064 (Vladimir Cherkasov) 。
  • Avro 读取器添加嵌套类型反序列化期间的栈溢出检查。#102417 (Pavel Kruglov) 。
  • 修复 system.completionsMergeTree 设置项的重复行问题——由于 getMergeTreeSettingsgetReplicatedMergeTreeSettings 的设置名称完全相同,却都被导出了,因此每个设置名称都会出现两次。关闭 #102013#102015 (Groene AI) 。
  • 修复了 StorageObjectStorageQueue (S3QueueAzureQueue) 在关闭时被阻塞的问题:此前如果部分已处理的文件尚未从对象存储中完整读取,就无法完成关闭。现在该 source 会在关闭时立即中止读取;去重机制可确保在关闭前已流式写入目标表的行,不会在下次启动重试该文件时重复写入。#103126 (Tuan Pham Anh) 。
  • 修复了对 Alias 表引擎执行多块插入时配合 insert_deduplication_token 使用的问题,确保所有块都会被保留。#103246 (Enric Calabuig) 。
  • 修复了原生 JSON 列上 JSONHasJSONExtractBool 返回提取值 (转换为 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,而不是常规 insert 的 Keeper 重试预算。#104610 (Pablo Marcos).
  • 修复了 MergeTree 表上 WHERE p AND <LowCardinality(Nullable(int)) constant> 返回错误结果的问题。此前,这类查询会返回零行,因为 part 剪枝会从 LowCardinality(Nullable(...)) 类型推导出默认值 NULL,并合成一个 notEquals(x, NULL) 保护谓词,从而剪掉所有 part。#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).
  • 修复了 hilbertEncodemortonEncode 中一个悄然导致错误结果的缺陷:当第一个参数 (范围掩码) 是非常量 Tuple 时,此前会用第 0 行的值来决定每一行的位移。现在,这些函数会按行计算掩码值,因此结果不再依赖输入是否为常量,也不再依赖块大小。#104992 (Groene AI).
  • 修复了 clickhouse-local 在从 ./clickhouse-local.xml~/.clickhouse-local/config.xml/etc/clickhouse-local/config.xml 自动发现配置文件时,会静默忽略用户级配置 (profilesusersquotas、访问控制设置) 的问题。此前,只有在传入 --config-file 或当前目录存在 ./config.xml 时,这些设置才会生效;现在,所有发现路径的行为已保持一致。#105008 (Groene AI) 。
  • 修复了 BFloat16 列在与字符串字面量比较时会静默返回零条匹配结果的问题 (例如 WHERE bf16_col = '49.9') 。#105042 (Raúl Marín) 。
  • 修复了 SummingMergeTreeAggregatingMergeTreeCoalescingMergeTree 在合并过程中,当合并所需列缺失或已过期时,CLEAR COLUMN 和生存时间 (TTL) 处理的问题。关闭 #101953#105203 (Antonio Andelic).
  • 通过在解引用 shared->clusters_config 之前显式添加空指针保护,修复了 DNSCacheUpdater::runContext::reloadClusterConfig 之间的竞争条件。#105220 (Mikhail f. Shiryaev).
  • 修复 toDateTime64msns 精度下 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 处理,以便 collector 能够正常退出。#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 时的失败问题:当插入值为其文本表示中包含单引号的 EnumJSONAggregateFunction 时,会触发 SQLite 语法错误。output_format_values_escape_quote_with_quote 设置现已在相应的序列化中生效 (此前仅 StringFixedString 会遵循该设置) 。#105285 (Groene AI) 。
  • 修复了以下问题:当 allow_push_predicate_ast_for_distributed_subqueries = 1 (默认值) 时,如果 GLOBAL IN 的元组与一个投影中包含重复列名的子查询匹配,分布式查询会抛出 Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists,例如 (x, y) GLOBAL IN (SELECT number, number FROM numbers(5))#105290 (Groene AI) 。
  • 修复了对 Array(LowCardinality(...)) 使用 reinterpret 时在运行时返回令人困惑的 NOT_IMPLEMENTED error 的问题;现在会在类型检查阶段返回 ILLEGAL_TYPE_OF_ARGUMENT#105301 (Raúl Marín) 。
  • minMap/maxMap (数组形式) 以及 minMappedArrays/maxMappedArrays 现在对 NaN 的处理与 ORDER BY 一致:NaN 被视为排在最后 (仅当所有值均为 NaN 时才返回) 。此前,由于 IEEE 754 的无序比较语义,结果会受 NaN 在数据中位置的影响,并且与已在 #100448 中修复的 minMap/maxMapMap 参数形式不一致。#105331 (Raúl Marín) 。
  • 修复了带有 Nested 列的 MergeTree 家族表中,按表划分的 ColumnsDescription 缓存存在的内存泄漏问题。当 share_nested_offsets = 1 (默认值) 时,在 ALTER ADD COLUMN/DROP COLUMN 循环过程中,这些缓存条目始终不会被驱逐。#105376 (Groene AI).
  • 修复了以下 BAD_ARGUMENTS 异常:当带有 TYPE set(N) 跳过索引的 SELECT 语句中,WHERE 原子表达式的结果类型为 FloatBFloat16 或其他任何非整数类型时,会抛出 "It's a bug! Only integer types are supported by __bitWrapperFunc" (例如 WHERE c0 + 0.1WHERE log(c0)) 。现在在这种情况下,跳过索引会回退到常规过滤路径。#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_compiletry_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 条件编译守卫,使嵌入式客户端和 PTY 描述符类能够在 macOS 和 FreeBSD 上构建。#104436 (Alexey Milovidov).
  • librdkafka 升级到 2.14.1 版本。#105222 (János Benjamin Antal).

ClickHouse 26.4 版本,2026-04-30。演示文稿, 视频

向后不兼容的变更

  • IN 运算符现在对 Bool 类型采用精确值语义:集合中只有 01 会与 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,则会从存储中读取这些列;否则,会在读取步骤之后通过 expression 步骤填充这些列。#101742 (Mikhail Artemenko).
  • IN 运算符现在也会拒绝复合类型 (TupleArrayMap) 内部发生有损的 Decimal 转换,从而使其行为与顶层 scalar 比较保持一致。此前,精度检查仅对顶层 scalar 值生效:例如,CAST('33.3', 'Decimal64(1)') IN (33.33) 会正确返回 0,但 CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33]) 会因为有损转换发生在 Array 内部而错误地返回 1。现在这两种情况都会正确返回 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_sizehttp_headers_read_timeout 设置。依赖此前较高限制的用户可以通过设置将其恢复。#103285 (Sema Checherinda).

新特性

  • 为哈希连接和并行哈希连接增加自动溢写功能:达到内存限制时,会将其转换为 Grace 哈希连接。此行为由 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 函数,轻松对 StringFixedStringArray([Fixed]String)NullableLowCardinalityConst 列中的所有单词/标记进行词干提取。#99137 (Jimmy Aguilar Mena) 。
  • 在兼容性设置 use_strict_insert_block_limits 下,实现 max_insert_block_size_rowsmax_insert_block_size_bytesmin_insert_block_size_rowsmin_insert_block_size_bytes 在块压缩合并中的新行为。#94207 (Kirill Kopnev).
  • 新增函数 arrayAutocorrelation(arr [, max_lag]),用于计算数值数组在各个滞后值下的归一化自相关。支持整数、浮点数和十进制数组类型。#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_levelreplicated_fetches_min_part_level_timeout_seconds——允许副本跳过从其他副本拉取刚插入的 (未合并) parts,从而在高强度摄取期间降低复制开销。#98625 (tanner-bruce) 。
  • 为 MergeTree 新增了对 JSON 列跳过索引的支持,可将 JSONAllPaths 与 bloom_filter、tokenbf_v1、ngrambf_v1 以及 text (倒排) 索引类型配合使用,从而根据每个粒度中存在的 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 语法编写连接查询;该语法会自动匹配所有同名列,并在结果中对这些列进行去重。#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).
  • EXTRACT 操作符新增与 PostgreSQL 兼容的单位:EPOCHDOWDOYISODOWISOYEARWEEKCENTURYDECADEMILLENNIUM。同时修复了此前 EXTRACT(WEEK FROM date) 会报错的问题。#100274 (Alexey Milovidov).
  • 新增对带有 TO 范围限定符的 SQL 标准复合时间间隔字面量的支持,例如 INTERVAL '1:30' HOUR TO MINUTE。在内部会将其拆解为多个时间间隔之和。#100453 (Desel72).
  • 为 HTTP 连接池套接字的内核 TCP 接收和发送缓冲区内存 (sk_rmem_allocsk_wmem_alloc) 新增异步指标,并按连接组报告 p50/p75/p90/p95 分位数及总量。#100575 (Sema Checherinda) 。
  • 为 ClickHouse Keeper 新增了一个 jemalloc 性能分析 Web UI,可通过 HTTP 控制端口上的 /jemalloc 访问。#100606 (murphy-4o).
  • 实现了适用于有序和无序模式的命令 SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'#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 命令,并为 getexistsls 命令添加 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 refresh 设置,以减少跨副本复制延迟导致的数据缺失。#101591 (Seva Potapov) 。
  • 新增了用于短语搜索 (连续标记序列) 的 hasPhrase (别名 matchPhrase) 函数。该搜索通过暴力遍历实现,也就是说目前尚不支持 텍스트 인덱스#101997 (Elmi Ahmadov) 。
  • 添加 s3_read_request_duration_microsecondss3_read_request_bytes 直方图指标,用于观测 S3 GET 请求连接的生命周期和消耗的字节数,可在 system.histogram_metrics 和 Prometheus 端点中查看。#102058 (Sema Checherinda) 。
  • 现在可使用 + 运算符将 DateDate32 值与 TimeTime64 值相加,生成 DateTimeDateTime64 结果。例如,SELECT toDate('2024-01-15') + toTime('14:30:25') 返回 2024-01-15 14:30:25。结果按会话时区计算,超出范围的结果会根据 date_time_overflow_behavior 设置进行处理。关闭 #95914#102421 (Nihal Z. Miaji) 。
  • 文本索引现已达到 GA,并且无论 compatibility 设置为何都会保持启用,从而避免在备份恢复期间或以兼容模式运行时意外被禁用。#101518 (Nikita Fomichev) 。

Experimental 功能

  • 为 Iceberg 表添加 ALTER TABLE ... EXECUTE remove_orphan_files,用于识别并从对象存储中移除未被引用的文件。#99127 (murphy-4o).
  • 添加 query_plan_optimize_join_order_randomize 设置,用于将连接重排序时使用的统计信息随机化,适用于测试。#100643 (Vladimir Cherkasov).
  • 为 ClickHouse 添加 AI 函数支持,允许用户通过 SQL 调用 OpenAI 和 Anthropic 端点。aiGenerate 是首个此类函数。#100831 (George Larionov).
  • 添加 AI 函数:aiClassifyaiExtractaiTranslate,用于在 ClickHouse 中调用 LLM API。#100832 (George Larionov).
  • 新增 system.histogram_metric_log 系统表,用于定期对所有直方图指标生成快照 (例如 S3/Azure 延迟、Keeper 请求处理各阶段的耗时) 。此外,system.histogram_metricsvalue 列修改为 Float64,因为它更灵活,也更兼容 Prometheus 数据模型。#103046 (Miсhael Stetsyuk). 该表结构在未来版本中很可能会发生变化。

性能优化

  • ClickHouse 现在能够在 SELECT 查询中基于最小/最大统计信息剪枝整个数据分区片段。#94140 (zoomxi) 。
  • 减少在带有已完成 mutation 的 ReplicatedMergeTree 表上执行只读操作时的锁竞争。#95771 (Eduard Karacharov).
  • 读取投影时会遵循 optimize_read_in_order 设置。修复了 #89453#95885 (Andrey Zvonov) 。
  • 对哈希连接和并发哈希连接进行了少量改进。#96663 (Yarik Briukhovetskyi) 。
  • 优化 DISTINCT 转换:当输入数据几乎无重复时,禁用 LowCardinality 列优化。#97113 (Nihal Z. Miaji) 。
  • 来自 #97723LIKE 查询性能优化。现在,这些查询也可以使用文本索引。#98149 (Elmi Ahmadov) 。
  • 向量化数学函数 (explogsigmoidtanh) 现已在 AArch64 (使用 NEON/SVE) 以及 FreeBSD/Darwin 上加速;此前这些平台使用的是较慢的标量回退实现。#98230 (Raúl Marín) 。
  • MergeTree 主键列进行过滤,且对字面量字符串使用 regexp 交替 (例如 ^(abc-1|abc-2)) 的查询,现在在这些备选项共享公共前缀时,可以使用主键剪枝。#98988 (Yash ).
  • ORDER BY ... LIMIT top-k 动态过滤扩展为支持 NullableStringCOLLATE 类型。#99033 (murphy-4o)。
  • 通过使用直接索引哈希表,加速了对取值范围较小的 Int32Int64 键的哈希连接。#99275 (Hechem Selmi).
  • 使用单个字典的 LowCardinality 列的非连续查询速度更快。#99285 (Ivan Babrou) 。
  • 通过对内部循环进行去虚拟化,加快 Float64 列上 var*Stablestddev*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) 。
  • 修复多核机器上带聚合的短查询出现负向扩缩容的问题。当查询读取的 marks 很少时,管道在聚合后不再扩展到 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 中的 StringFixedString 列比较新增 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 读取一个块后,都会发出虚拟行边界信息,从而使合并操作能够在流处理中途重新调整源的优先级,适用于数据被 WHERE/PREWHERE/JOIN 完全过滤掉的 parts。关闭 #99945#100603 (Vladimir Cherkasov) 。
  • 通过使用与 dragonbox 兼容的舍入方式扩展 itoa 快速路径,提升了大整数值的 Float-to-String 转换速度。#100649 (Raúl Marín) 。
  • dragonbox 替换为 zmij,使 Float-to-String 转换速度提升 1.5 倍至 3 倍。#100650 (Raúl Marín) 。
  • 通过以 Barrett 约简替代软件除法并展开转换循环,加快了 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).
  • 通过缓存采样设置来优化分配/释放,而不是遍历整个内存跟踪器层级。 #101267 (Azat Khuzhin).
  • 通过将数据哈希计算从合并阶段延后到 sink 端,并使用 updateHashWithValueRange 按批次对列进行哈希,修复了在 deduplicate_insert = 'enable' (自 26.2 起默认为启用) 时 INSERT 性能显著回退的问题,使 22 列 500 万行数据的开销从约 2.5 秒降至约 0.5 秒。#101494 (Sema Checherinda) 。
  • 通过使用 try_lock 避免对无竞争的锁获取进行计时,并移除持锁时间测量,降低锁性能分析的开销。#101502 (Antonio Andelic).
  • arrayDotProduct 中手写的 AVX-512 intrinsic 替换为与平台无关、可自动向量化的循环,并增加对 AVX2 和 ARM NEON 的支持。#101571 (Peng).
  • 当值以转义字符串形式传递时 (例如 '{\'key\':1}') ,优化 INSERT VALUESMapArrayTuple 列的性能,避免不必要地回退到 SQL 表达式解析器。#102119 (Joanna Hulboj).
  • 修复了 RabbitMQ 表引擎 CPU 使用率过高的问题。#102711 (Jaap Elst).
  • JOIN 顺序优化器现在能够根据现有连接条件推断传递性等值连接谓词。例如,给定 A.x = B.x AND B.x = C.x,就能识别出等价关系 A.x = C.x,从而让优化器可以考虑在通过传递关系连接起来的表之间直接进行连接。这可以提升星型和雪花型 schema 的计划质量,因为在这类 schema 中,维度表会通过共享的事实表相连。该功能由新的 enable_join_transitive_predicates 设置控制 (默认关闭) 。#98479 (Alexander Gololobov).
  • 通过并行预先取消合并操作,优化 TRUNCATE DATABASE TABLES LIKE#98597 (Shaohua Wang) 。
  • 为 multiply 增加单调性支持,从而可对 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 时 (例如 DateString) ,会正确跳过此重写,因此此前会报错的查询现在仍可正常运行。关闭 #71431#100944 (Alexey Milovidov) 。

改进

  • 改进了 EXPLAIN PLAN pretty=1 的输出:打印顶层查询的输出列,显示连接关系的标签/符号以及预估结果行数和本地性,并为连接/源步骤包含各步骤的输出列。这些变更涵盖了 #98117 中 Information Deficit 部分的内容。#99462 (Kirill Kopnev).
  • 新增 MergeTree 表设置 share_nested_offsets (默认值为 true) 。将其设为 false 时,带点号名称的 Array 列 (例如 n.an.b) 会被视为相互独立的列,而不再像旧版 Nested 语义那样共享 offset 文件并校验数组大小是否相等。#98416 (Amos Bird) 。
  • 现在,用户可以在 users.xml/yaml 配置中指定多种身份验证方式 (而这在 SQL 中一直都是支持的) 。#91998 (Flip-Liquid) 。
  • 自动重新加载使用 TLS 的 Raft 节点间连接。#93455 (Evgeny) 。
  • cast_keep_nullable 扩展为支持 Dynamic/JSON 类型。启用后,对可为 Nullable 的类型执行 NULL CAST 时将返回 NULL;否则会抛出 CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN 错误。#96504 (Seva Potapov) 。
  • 通过引入对象池,减少了内部数据结构 (ISerialization 对象) 的内存占用。#96563 (Nikita Mikhaylov) 。
  • 在 keeper-client 的 XML 配置中新增了对 passwordidentity 字段的支持。#96800 (Grigorii Sokolik) 。
  • 改进 Unity Catalog 的 Iceberg 写入。#98162 (Konstantin Vedernikov) 。
  • 添加设置 finalize_projection_parts_synchronously,以支持在 INSERT 期间同步完成投影 parts 的最终处理,在默认保留现有异步行为的同时,降低具有大量投影的表的峰值内存占用。#98228 (Amos Bird) 。
  • system.part_log 添加 projections_duration_ms 列,用于记录每个投影合并/重建的耗时 (以毫秒计) 。#98292 (Amos Bird) 。
  • 通过 KILL QUERY 和在 clickhouse-client 中按 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;引入类型级抽象,降低未来混淆路径类型的可能性;为 AzureLocal 添加测试,以验证无需中间上传/下载即可实现跨引擎互操作;修复 position deletes 的使用问题,此前该功能依赖路径推断启发式方法,而这种做法在此场景下并不适用。 #99163 (Daniil Ivanik). #100420 (Daniil Ivanik).
  • 修复了在 https://github.com/ClickHouse/ClickHouse/pull/92844 中引入的 IPartitionStrategy::cached_result 里可能存在的竞争条件。#99400 (Arthur Passos) 。
  • 用户现在可以在 Arrow Format 中使用 ClickHouse 时间间隔数据类型了。#99519 (Peter Nguyen) 。
  • 新增了对 ArrowParquet 格式中导入和导出 UUID 数据类型的原生支持。用户现在可以直接在 ClickHouse 与其他数据工具之间查询和传输 UUID 数据,无需手动进行字符串转换或采用其他变通方法。支持对顶层 UUID 进行自动逻辑推断,也支持为嵌套 UUID 显式提供 schema 提示。#99521 (Ivan).
  • 支持对象存储上的 7z 归档文件。解决了 #70968#99600 (Alexey Milovidov) 。
  • 新增 ObjectStorageListedObjectsObjectStorageGlobFilteredObjectsObjectStoragePredicateFilteredObjectsObjectStorageReadObjects 这几个 ProfileEvents,用于查看对象存储 (S3Azure 等) 文件列出和读取管道的内部信息。#99778 (Sema Checherinda) 。
  • 修复了 merge table function 在查询并非所有底层分布式/远程表都包含的列时因 UNKNOWN_IDENTIFIER 错误而失败的问题。#99833 (Alexey Milovidov).
  • 现在,我们将 commit 时间纳入 ReplicatedMergeTree 的 mutation 总执行时间指标中。在 #96376 之后,这部分时间未被统计在内。#99936 (alesapin).
  • MetadataStorageFromDisk 中待删除的 blob 对象新增预写日志,在删除对象时提高元数据与远程对象存储之间的一致性和持久性。#100019 (Maksim Kita).
  • 在嵌入式客户端 (SSH 和 WebSocket 协议) 中禁用 AI SQL 生成功能 (?? 命令) ,以防止访问服务器环境变量。#100290 (Alexey Milovidov) 。
  • 修改用于通过目录执行 Iceberg 插入的接口。弃用以下设置:storage_catalog_typestorage_aws_access_key_id 等。#100334 (Konstantin Vedernikov) 。
  • 粘贴到 clickhouse-client 时,将制表符显示为 4 个空格。关闭 #100405#100416 (Raúl Marín) 。
  • show_data_lake_catalogs_in_system_tables 被禁用时,避免为“您是否想表达……”表提示而扫描整个远程数据湖目录。#100452 (Alsu Giliazova).
  • 在分区剪枝后应用 distributed_index_analysis_min_indexes_bytes_to_activate#100477 (Azat Khuzhin) 。
  • 修复使用空 IN/NOT IN 子句时 Parquet bloom filter 下推中的断言失败问题。#100543 (zoomxi).
  • MinMax 列统计信息现在将最小值和最大值存储为 Field (带类型) ,而非 Float64。序列化格式在值之外还包含列的 type name。统计信息文件版本已提升到 V2;由旧版本写入的文件需要重新物化 (ALTER TABLE … MATERIALIZE STATISTICS ALL) 。修复 #53140#100605 (Han Fei) 。
  • 更新 cppkafka,纳入了消费者关闭死锁的修复。#100612 (Azat Khuzhin) 。
  • 现在,用于解析 Iceberg 中数据文件的对象信息已包含从 manifest 文件中解析出的文件行数和以字节为单位的文件大小。#100645 (Daniil Ivanik) 。
  • 添加 use_separate_cache_arena 配置参数,以控制是否分离缓存内存 Arena。#100664 (Seva Potapov) 。
  • 新增对将 Apache Arrow 的 StringViewBinaryView 数据类型导入 ClickHouse String 列的原生支持,提升了基于 Arrow 的摄取兼容性。#100762 (Ivan).
  • 如果在运行时修改了配置文件,现在一些 Keeper 服务器设置会热重载:max_requests_batch_size、max_requests_batch_bytes_size、max_request_size、quorum_reads。#100773 (Michael Kolupaev) 。
  • 在发布版构建中递增 profile events MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytes#100899 (Pavel Kruglov) 。
  • Cgroupv2 内存跟踪现已将 slab_reclaimable 排除在内核内存统计之外,因此对不可回收内存使用量的衡量更准确。#100901 (Antonio Andelic).
  • use_partition_pruning = 0 现在除了会禁用基于分区键的剪枝外,还会禁用 MinMax 索引剪枝以及分区键列上的计数优化。#100904 (Nihal Z. Miaji) 。
  • pretty=1 现在会在 EXPLAIN [PLAN] 中以人类可读的格式输出表达式。#100927 (Kirill Kopnev) 。
  • accurateCastOrNullaccurateCastOrDefault 现在支持 Tuple 目标类型,包括元素为 Nullable 的嵌套 Tuple。此前,这些函数会拒绝 Tuple 目标类型,因为 Tuple 不能嵌套在 Nullable 内。已解决 #100820#100942 (Nihal Z. Miaji) 。
  • 修复在浅色和深色主题之间切换时 Play UI 中图表重复显示的问题。#101058 (Alexey Milovidov).
  • 将 chdig 更新到 v26.3.1 (perfetto UI,在摘要中为 CPU/Memory/合并/查询添加迷你图,system.warnings,以及日志中的 regexp 搜索) 。#101092 (Azat Khuzhin) 。将 chdig 更新到 v26.4.3 (perfetto 改进、修复通过 pastila.nl 共享的问题、flamegraph 差异、实时修改设置) 。#103145 (Azat Khuzhin) 。
  • 您现在可以在 WITH 子句中、SELECT 查询之前添加尾随逗号。#101093 (Aruj Bansal).
  • 新增 compress_per_column_in_compact_parts MergeTree 设置,用于控制 Compact parts 中压缩块的组织方式。当为 true (默认值,保留当前行为) 时,每一列都会从一个新的压缩块开始,从而支持按需解压。当为 false 时,一个 granule 内的所有列都会打包到同一个压缩块中,从而提升那些始终读取所有列的工作负载的压缩率和读取性能。#101114 (Amos Bird) 。
  • 仅在鼠标悬停于表名上时才在 Play UI 中显示表信息气泡,而不是悬停于整行时显示。#101118 (Alexey Milovidov) 。
  • 在 Play UI 侧边栏中添加引擎专属图标,并优化表列表的使用体验。#101134 (Alexey Milovidov).
  • 支持 ArrowArrowStreamORC 以及旧版 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 flush 次数的能力。#101396 (Azat Khuzhin).
  • 新增了 Keeper 设置 nuraft_streaming_mode (默认值为 false) 、nuraft_max_log_gap_in_streamnuraft_max_bytes_in_flight_in_stream。解决了 #90743#101427 (Kseniia Sumarokova) 。
  • 新增了异步指标 CGroupMemoryUsedWithoutPageCache,用于报告排除内核 OS 页缓存和 ClickHouse 用户态页缓存后的 cgroup 内存使用量,与 MemoryResidentWithoutPageCache 保持一致。还进一步明确了 CGroupMemoryUsed 指标的描述。#101513 (Francesco Ciocchetti).
  • 为 SQL 标准 OVERLAY 函数语法添加了解析器级别的语法糖。overlay 函数已存在;此次新增了对基于关键字写法的支持,使用 PLACINGFROMFOR 作为分隔关键字。#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](https://github.com/ClickHouse/ClickHouse/pull/102378) (Konstantin Vedernikov) 。
  • restore_replace_external_engines_to_null 设置现在还会跳过恢复使用 external 引擎的数据库 (例如 DataLakeCatalogMySQLPostgreSQLS3) ,而不会报错或发起外部连接。#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).
  • 支持 array 分词器用于 LIKE 优化。#102880 (Elmi Ahmadov) 。
  • 即使在发布版本中,也发送 MemoryAllocatedWithoutCheck。#103064 (Azat Khuzhin) 。
  • 在 system.stack_trace 中暴露每个线程的 untracked_memory。#103065 (Azat Khuzhin) 。

错误修复(官方稳定版本中用户可见的异常行为)

  • 修复了由惰性物化返回不必要的列而导致的 Block structure mismatch in stream 错误。修复 #95191#96682 (Nikolai Kochetov)。
  • 修复了在数据脱敏策略查询中使用 ON CLUSTER 时的逻辑错误。#97594 (Bharat Nallan) 。
  • 修复了在 GCS 上使用 Unity Catalog 时的一个缺陷。#98456 (Melvyn Peignon) 。
  • DataLakeCatalog 现在在校验 auth_header 设置时,会遵循服务器的 http_forbid_headers 配置。 #98827 (Michael Anastasakis).
  • 修复 S3 使用花括号展开的 glob 模式中的 N+1 次 HeadObject 调用问题。 #99219 (Konstantin Bogdanov).
  • 在引擎本身也支持设置的情况下,验证 CREATE 查询中的设置修改。 #99279 (János Benjamin Antal).
  • 修复了在表中存在表达式依赖于 EPHEMERAL 列的 MATERIALIZED 列时,ALTER TABLE UPDATE/DELETEMissing columns 错误而失败的问题。#99281 (Yash ).
  • JDBC、ODBC 和 NATS 连接字符串中的凭据现已在查询日志和 SHOW CREATE 输出中被屏蔽,从而避免敏感信息意外泄露。对于 URI 风格的连接字符串 (例如 {scheme}://{user}:{password}@{host}) ,只有密码部分会被屏蔽,其余部分仍会保留显示,以便于调试。nats_token 设置现也会被屏蔽。#99344 (János Benjamin Antal) 。
  • 修复 parseDateTimeBestEffortDD-month-YYYY 格式下错误解析以月份前缀开头的单词的问题。关闭 #99345#99350 (Pavel Kruglov) 。
  • 修复了在未使用 analyzer 时忽略 TABLE_UUID_MISMATCH 的问题。#99380 (Azat Khuzhin) 。
  • 修复了一个 bug:在同一请求中与 compatibility 一起发送的显式设置,如果其值与服务器默认值相同,可能会被静默忽略。#99402 (Raufs Dunamalijevs).
  • 修复了 Hive 分区路径中带有前导零的数字导致报错的问题。修复 #98801#99458 (Yarik Briukhovetskyi).
  • 修复了表在与正在执行的读取查询并发删除时发生的 heap-use-after-free 问题 (过去 90 天内在 CI 中出现 19 次) 。 #99483 (Alexey Milovidov).
  • 修复了 Keeper 中的一个 bug:如果同一服务器上的另一个无关会话恰好在错误的时机被关闭,读取请求可能会卡住 (导致会话超时) 。#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) 。
  • 修复了对 ColumnReplicated 执行操作的函数中的异常;该异常由 JOIN 生成的未引用行触发。#99564 (Hechem Selmi).
  • 修复 CLEAR COLUMN 不会重建投影,也不会重新计算依赖于被清除列的物化列的问题,否则可能在后续合并过程中导致异常或数据损坏。#99565 (Desel72).
  • 修复了 ConditionSelectivityEstimator 中的一个异常 (Bad get: has Tuple, actual type String) :当查询在启用了 use_statistics 且具有列统计信息的表上,使用带有单个标量查询参数的 IN (例如 WHERE col IN ({p:String})) 时,会触发该异常。#99614 (Ilya Yatsishin).
  • 含有未知投影的数据 part 不应被永久视为已丢失。#99623 (Sema Checherinda) 。
  • 修复了在并发执行 SYSTEM STOP MERGESSYSTEM START MERGES 时,垂直合并过程中偶发的逻辑错误异常。#99628 (Desel72).
  • 修复 injectRequiredColumns 中的悬空引用问题,该问题会在合并过程中导致崩溃。#99679 (Tuan Pham Anh).
  • 修复了 Avro 格式读取器在读取超出目标列类型范围的数值时的未定义行为。现在,查询在发生溢出时会直接失败,而不再静默产生错误的值。#99697 (asyablue22).
  • 修复了 executable 表函数参数中 shell 风格引号的解析问题。#99794 (Nikita Semenov) 。
  • 修复了 NativeReader 在反序列化 Native 格式流、行数不匹配时发生的误判中止:将 LOGICAL_ERROR 修改为 INCORRECT_DATA,使该错误作为数据错误处理,而不是在 sanitizer/调试构建中触发 abort()#99822 (Rahul Nair) 。
  • 修复当二进制流中的序列化类型为 DETACHED 时,Tuple 列在反序列化过程中导致进程异常中止的问题。#99823 (Rahul Nair) 。
  • 修复了在文件系统缓存动态调整大小期间,由于 SLRU 子队列提升中的竞争条件而误报 LOGICAL_ERROR 异常的问题。#99850 (Alexey Milovidov) 。
  • 修复 async insert 查询在 query_log 和客户端输出中将 written_rowsread_rowsresult_rows 错误显示为 0 的问题。#99879 (Sema Checherinda).
  • 修复了 KILL QUERY 中的异常 "Bad cast from type X to Y":当针对系统表的内部查询返回由 ColumnConst 包装的列时,会触发该异常。#99881 (Alexey Milovidov).
  • 修复 untuple 参数中相关子查询的逻辑错误。#99917 (Vladimir Cherkasov) 。
  • 修复了调用 rightrightUTF8 或其他子串函数时将长度设为 INT64_MIN (-9223372036854775808) 所引发的异常;此前由于整数溢出会导致未定义行为。这些函数现在会正确报告 ARGUMENT_OUT_OF_BOUND 错误。#99934 (Jimmy Aguilar Mena).
  • 现在 ClickHouse 应该能够正确处理 Spark 风格的表 (即每个文件都有完整的绝对路径,或使用相对于公共表路径的相对路径) 。修复了 #92348#99935 (alesapin) 。
  • 修复以下异常:当 ALTER TABLE ... MODIFY QUERY 包含带有 SETTINGS 的嵌套子查询,且 ALTER 本身也带有 SETTINGS 时,会触发“Inconsistent AST formatting”异常。#99938 (Nikita Mikhaylov) 。
  • 因疑似出现性能回归,回滚 #97114 "将连接步骤的行数估算提前到检查是否只有 1 个子节点之前"。 #99957 (Alexander Gololobov).
  • 修复了一个 bug:如果文件的 HEAD 请求响应头中缺少 Content-Length 头 (例如,由于 GCS 中的解压缩转码) ,ClickHouse 可能会跳过这些文件。#99971 (Yarik Briukhovetskyi).
  • 修复了这样一个断言失败问题:将 NumericIndexedVector 聚合状态与偶数整数常量相乘时,在调试构建中会抛出异常,在发布构建中会产生错误结果。该问题由 pointwiseAddInplace 中存在别名关系的 Roaring 位图发生自异或所致。#99976 (Desel72) 。
  • 防止在通过链式 JOIN USING 执行旧版过滤器下推时,因连接转换后键类型发生变化而触发 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) 。
  • 修复了以下问题:使用 INSERTVALUES 时,如果数据后的下一行带有尾随 SQL 注释 (--/* */) ,则会导致失败。现在会跳过该注释,而不是将其解析为另一行数据。#100016 (Pratima Patel) 。
  • 修复了在比较包含 NULL 元素的元组时,arrayRemove 中出现的异常。#100017 (Alexey Milovidov).
  • 修复 system.asynchronous_inserts 中的跨用户数据泄漏问题:任何对该表具有 SELECT 权限的用户,都能看到其他用户的待处理异步插入条目。现在,除非用户具有 SHOW_USERS 特权,否则这些条目会按当前用户进行过滤。#100024 (Shaohua Wang) 。
  • 修复了将 Time64 转换为 UInt64 时,值可能被截断到 24 小时的情况。#100025 (Yarik Briukhovetskyi).
  • 修复了在 CREATE DICTIONARY 的定义中,列表值包含不存在的函数时本地服务器崩溃的问题。#100036 (Yakov Olkhovskiy).
  • 修复 CSVMsgPack 格式无法正确解析 Nullable(Tuple) 的问题。Closes #99753#100038 (Nihal Z. Miaji) 。
  • 修复在将 WITH 函数表达式的别名 (例如 tuple(...)) 用作 IN 右侧时,CREATE VIEWUNKNOWN_IDENTIFIER 而失败的问题。#100042 (Peng) 。
  • 修复在并行副本下,将 timeseries 聚合函数 (例如 timeSeriesResampleToGridWithStaleness) 与 initializeAggregationAggregatingMergeTree 一起使用时出现 ILLEGAL_TYPE_OF_ARGUMENT 错误而导致失败的问题。#100053 (Alexey Milovidov) 。
  • 修复 NumericIndexedVectorDataBSI 中负值处理不正确的问题。#100086 (Daniil Ivanik) 。
  • 修复了 accurateCastOrDefaultto*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-clientclickhouse-local 中都能正确报告执行标量子查询期间已读取的行数。与 @YjyJeff 共同完成。#100230 (Raúl Marín).
  • 修复了一个 LOGICAL_ERROR 异常:在涉及 Dynamic 列、交叉连接和运行时过滤器的查询中,ColumnVariant::filterhasOnlyNulls 优化路径下会共享 Variant 列指针,而不是克隆它们,从而导致该问题。关闭 https://github.com/ClickHouse/ClickHouse/pull/100147。 #100234 (Pavel Kruglov).
  • 修复了 Variant 数组中的一个缺陷:调用 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 元数据文件路径设置中包含空字节时引发的异常。#100283 (Alexey Milovidov) 。
  • 修复了在使用 distributed_index_analysis 且谓词中包含 IN 子查询时,执行查询数量出现平方级增长的问题。#100287 (Anton Popov).
  • 修复将 GROUP BY ... WITH TOTALS HAVINGUNION DISTINCT 及可空表达式结合使用时触发的“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).
  • 修复在数据分散到多个 parts 且 그래뉼 边界未对齐时,SELECT count() 查询在使用 max_rows_to_read / force_primary_key 时触发 TOO_MANY_ROWS 异常的问题。#100408 (Alexey Milovidov).
  • 修复 system.completions,使其在所有授权组合下都能根据访问权限正确筛选数据库、表和列:按表授权、按库授权,以及按列撤销。 #100432 (Shaohua Wang).
  • 修复 NuRaft 中由竞争条件引发的 SEGFAULT。#100444 (Pablo Marcos) 。
  • min/max/argMin/argMax 现在对 NaN 的处理方式与 ORDER BY 一致:始终跳过 NaN (仅当所有值均为 NaN 时才返回 NaN) 。此前,由于 IEEE 754 中无序比较的语义,结果会取决于 NaN 在数据中的位置。#100448 (Raúl Marín).
  • 修复了一个复制粘贴导致的错误:在未设置 delta_lake_snapshot_start_version 的情况下设置 delta_lake_snapshot_end_version 时,之前会被静默忽略,而不会报出 BAD_ARGUMENTS 错误。#100454 (Mohammad Lareb Zafar).
  • StorageRabbitMQ::shutdown 不具备幂等性 (它会无条件访问 weak pointers,然后销毁对应的 shared pointers) ,但现在会被调用两次:一次在 StreamingStorageRegistry 中,随后一次在 DatabaseCatalog 中。此修复使该方法具备幂等性,并增加了防御性的空值检查。#100455 (Miсhael Stetsyuk) 。
  • 修复了使用 accurateCastOrNull 时,将目标类型设为 QBit 会触发 LOGICAL_ERROR 异常的问题。#100470 (Raufs Dunamalijevs) 。
  • 修复在 optimize_on_insert=0 的 Wide parts 中,向包含嵌套 Array(JSON) 列的表插入数据时出现的 LOGICAL_ERROR 异常“流 ... 未找到”。 #100475 (Pavel Kruglov).
  • 对备份元数据中的文件条目路径进行验证,在 RESTORE 期间拒绝路径遍历、绝对路径和空名称。#100483 (Pablo Marcos) 。
  • 修复 LIMIT m OFFSET n WITH TIES 语法无法使用的问题。该语法等同于 LIMIT n, m WITH TIES,后者此前已可正常使用。#100491 (Nihal Z. Miaji) 。
  • 修复对带有命名字段且元素为 LowCardinalityNullable(Tuple) 列使用 IN 时出现的异常 "No set is registered for key"。 #100523 (Alexey Milovidov).
  • 修复了 usearch sorted_buffer_gt::insert() 中的堆缓冲区溢出问题,该问题在向量相似性搜索期间可能导致崩溃或悄然破坏内存。#100537 (Dustin Healy).
  • 修复了 EXECUTE AS 会忽略查询中指定的 FORMATINTO OUTFILE 子句的问题。#100538 (pufit).
  • 修复带有查询级 OFFSET 的 SAMPLE 存在的 AST 格式不一致问题。关闭 #100576#100579 (Pavel Kruglov) 。
  • 修复 Polaris 目录与 Azure 的兼容性问题。自 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).
  • 允许在将表函数用作数据源时,向 cluster()clusterAllReplicas() 表函数传入分片键 (例如 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 存储磁盘,但端点暂时不可达 (例如 DNS 故障) 时,服务器启动不再失败。#100701 (Raúl Marín) 。
  • 修复了 positiveModulo 中的未定义行为:当无符号除数无法容纳在有符号结果类型中时,会出现该问题。#100705 (Raúl Marín).
  • 修复在启用 use_top_k_dynamic_filteringORDER BY 列为 DynamicVariant 类型时的服务器崩溃问题 (逻辑错误 "来自 __topKFilter 的返回类型不符合预期") 。#100742 (Groene AI).
  • 修复在包含 LowCardinality 元素的 Tuple 键上,于 PREWHERE/WHERE 中使用 has() 函数时导致的服务器崩溃问题。 #100760 (Groene AI).
  • 修复了在 S3 对象存储上存在并发写入时,从 LogStripeLog 表读取数据会触发 file_offset_of_buffer_end <= getFileSize() 断言失败的问题 (调试构建中的异常) 。#100763 (Alexey Milovidov).
  • 修复了在启用统计信息的表上,当 WHERE 子句包含函数表达式 (如 toDecimal64(col, 3)) 时,统计信息选择率估算器中出现的异常。该估算器现在会跳过此类谓词,而不是尝试进行无效的类型转换。#100764 (Han Fei) 。
  • 修复了一个罕见问题:连接在重排序时可能会产生错误结果。#100790 (Yarik Briukhovetskyi).
  • 修复了优化后的简单计数中 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) 。
  • 修复 IfDistinctDistinctIfIfState 聚合函数组合器在返回类型为 Tuple 且带有一个或多个 Nullable 参数时,在引入 Nullable(Tuple) 后无法读取旧版序列化状态的问题。关闭 #98917#100826 (Nihal Z. Miaji) 。
  • 修复了因连接池释放后仍被使用,导致 s3Cluster 和分布式查询中出现段错误的问题。#100837 (Konstantin Bogdanov).
  • 修复了服务器关闭期间加载字典时因空指针解引用导致的段错误。字典线程会并发调用 Context::getUserDefinedSQLObjectsStorage (该调用会解引用 user_defined_sql_objects_storage) ,与此同时主线程调用 Context::shutdown (将 user_defined_sql_objects_storage 设为 null) 。我们需要确保在执行 Context::shutdown 之前,先在字典加载器中禁用后续更新,终止当前正在运行的字典查询,并等待字典加载线程结束——这与我们处理普通查询的方式类似。#100839 (Miсhael Stetsyuk).
  • 修复了在输入包含非 ASCII 字节时,ULIDStringToDateTime 中的缓冲区溢出问题。#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-clientgetexistsls 命令将重复的 watch_id 错误信息输出到 stdout 而非 stderr 的问题。#100893 (Mohammad Lareb Zafar) 。
  • 修复了 intDiv/intDivOrZero 在处理可空元组数组时出现异常的问题,例如 SELECT intDiv([divide((1, 2), ... AND NULL)], 2)#100895 (Raúl Marín).
  • 在存储 StorageAlias 的定义之前,先对引擎参数求值,以便将 currentDatabase() 之类的表达式在保存到数据库前解析为字面量。#100902 (Nikolay Degterinsky) 。
  • 修复 query_plan_merge_expressions = 0processAndOptimizeTextIndexFunctions 的问题,此时 ExpressionStep 直接位于 ReadFromMergeTree 之上。修复 #100879#100909 (Jimmy Aguilar Mena) 。
  • 更新 replxx,纳入对 do_complete_line 中越界访问问题的修复。#100925 (Azat Khuzhin).
  • 修复在使用 shard-by-PK 优化的 JOIN 且启用查询条件缓存,并且部分 parts 被缓存条件过滤掉时出现的错误结果。#100926 (Groene AI).
  • 修复了在某些情况下,divideintDiv 在索引分析期间用于过滤表达式时会返回 ILLEGAL_DIVISION 的问题。#100928 (Nihal Z. Miaji)。
  • 修复了在异步启动时,因启动依赖顺序不正确而导致带有内部表的 materialized view 报“目标表不存在”错误的问题。#100946 (Nikolay Degterinsky) 。
  • 修复了 parseDateTimeBestEffort 在解析小数秒位数超过 18 位的日期时间字符串时出现的未定义行为 (有符号整数溢出) 。#100948 (Vasily Chekalkin) 。
  • 修复了以下崩溃问题:使用文本搜索索引时,IN 子句中包含元组子查询,例如 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).
  • 修复以下崩溃问题:当惰性列复制 (enable_lazy_columns_replication) 生成的 ColumnReplicated 列流入带有延迟到达输入的归并排序管道时,合并算法会发生崩溃 (Logical error: isConst/isSparse/isReplicated assertTypeEquality) 。#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) 。
  • 修复在启用分析器后,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 和并行副本时,时间序列聚合函数出现“Illegal type Decimal64 of start parameter”错误的问题。#101083 (Groene AI) 。
  • 修复了在带有 PREWHERE 的投影与 ORDER BY ... LIMIT 结合使用时,optimizeLazyMaterialization 中触发的异常。#101115 (Anton Popov).
  • 修复了在启用 aggregate_functions_null_for_empty = 1 设置时,使用带仅供内部使用的 Null 组合器 (例如 sumNullavgNull) 的聚合函数会导致服务器崩溃 (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).
  • 修复了一种情况:远程对象在 listread 之间被覆盖时,先前会导致对象元数据陈旧,并可能进一步触发来自缓存的 Having zero bytes, ... 逻辑错误。#101219 (Kseniia Sumarokova).
  • 修复查询带有 ORDER BY CAST(lc_column, 'Type') 的 MergeTree 表时,若 lc_column 为 LowCardinality 类型导致的服务器崩溃问题 (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) 。#101220 (Groene AI).
  • 修复 S3Queue 中失效处理中状态节点的清理问题。#101230 (Kseniia Sumarokova) 。
  • 修复了 mergeTreeAnalyzeIndexes()optimizations 参数无效时导致的未定义行为。 #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).
  • 修复了从 Delta Lake 集群向 Replicated MergeTree 执行 insert-select 时的问题。 #101299 (Konstantin Vedernikov).
  • 修复了这样一个崩溃问题:当标量子查询引用一组存在依赖链的已物化 CTE 时,会出现 "逻辑错误:在物化完成前从已物化 CTE 读取"。#101305 (Groene AI).
  • 修复 IStorage::getDependentViewsByColumnstorage_id 的数据竞争。#101385 (Nikolay Degterinsky) 。
  • 修复 BACKUP FROM SNAPSHOT AST 的格式化与克隆问题。#101405 (Pablo Marcos).
  • 修复在启用 enforce_keeper_component_tracking 时,查询 system.part_moves_between_shards 因 LOGICAL_ERROR 崩溃并报错 "当前组件为空" 的问题。#101462 (Groene AI).
  • 修复了在模糊测试器生成格式错误的 Dynamic 类型 AST 时,DataTypeDynamic::create() 中出现的段错误。 #101464 (Groene AI).
  • 在未启用 DeltaKernel 的情况下使用 delta_lake_snapshot_version 或 CDF 版本设置时,将抛出错误,而不是静默返回错误数据。#101489 (Desel72).
  • 修复在使用 ARRAY JOIN 和 JOIN USING 并启用 analyzer_compatibility_join_using_top_level_identifier 设置时出现的 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).
  • 修复了调用 intExp10 时传入 NaN 参数后错误消息显示不正确的问题——显示成了 intExp2,而不是 intExp10#101582 (Krishna Chaitanya) 。
  • 修复了在 #100288 中重构后,allow_statistics=0 无法阻止 ALTER TABLE ADD STATISTICSALTER TABLE DROP STATISTICS 的问题。#101585 (Krishna Chaitanya) 。
  • 修复 KeeperMapCREATE TABLE 在 25.1 之前部分删除操作遗留的 ZooKeeper 节点缺少 drop_lock_version 节点时,因 "Cannot create metadata for table" 而失败的问题。#101623 (Antonio Andelic).
  • 修复读取 Map 子列时可能发生的逻辑错误。关闭 #100769。关闭 #101336#101641 (Pavel Kruglov) 。
  • 修复 getSubcolumnData 中精确子列匹配优先于前缀匹配的优先级问题,以避免可能发生的崩溃。关闭 #101271#101645 (Pavel Kruglov) 。
  • 修复以下崩溃问题:在禁用 use_variant_default_implementation_for_comparisons 时,将 LowCardinality 列与 Variant NULL 常量比较会触发崩溃 (LOGICAL_ERROR: "ColumnUnique can't contain null values") 。#101690 (Groene AI) 。
  • 内容:为 Bzip2ReadBuffer 增加了空流保护:当内部流为空时,返回 EOF,而不是抛出 UNEXPECTED_END_OF_FILE。 #101691 (ClickGap AI Bot).
  • 内容:修正了 system.s3_queue_settingssystem.azure_queue_settingsalterable 列说明文本写反的问题——对调了 01 的含义,使其与实际代码行为一致。#101703 (ClickGap AI Bot) 。
  • 修复 positiveModulo(tuple, number) 错误调用除法而非取模的问题。#101709 (ClickGap AI Bot) 。
  • 修复了在带缓存封装的磁盘上配置 thread_pool_size 时发生的崩溃。此前,FileCacheSettings::loadFromConfig() 会将 thread_pool_size 判定为未知设置并拒绝加载,导致服务器无法启动。该设置是有效的 IDisk 参数,用于控制在后台 part 移动期间执行磁盘间复制操作时所使用的线程数。#101712 (Francisco) 。
  • 修复了 RANGE_HASHED 字典在创建时会静默接受不存在的 MAX 范围属性,以及在最小和最大范围属性类型不一致时使用错误类型配置的问题。该缺陷源于 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 Query 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 ADDshouldPatchFunction 的假阴性问题:当搜索字符串首次出现在 demangle 后的符号名模板参数内时,会触发该问题。#101885 (Pablo Marcos) 。
  • 修复了在 ZooKeeper 会话于定期刷新期间过期时 UDF 注册表丢失的问题——在完整刷新成功之前,所有用户自定义函数都可能不可用。#101891 (Nikita Fomichev) 。
  • 修正了 system.codecsAES_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 或分布式表,且组合过滤条件中混用了 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 连接算法一起使用时导致的行排序错误。受影响的查询可能会按错误顺序返回结果,从而在无提示的情况下产生错误输出。#102036 (János Benjamin Antal).
  • 修复了一个 LOGICAL ERROR (索引类型大小异常) :配置了 max_bytes_in_join 设置时,RIGHT JOIN 和 FULL JOIN 查询中可能会出现该错误。#102042 (Jimmy Aguilar Mena) 。
  • 修复了 Time 带有负值时与 DateTime 比较会返回错误结果的问题。关闭了 #101670#102056 (Yarik Briukhovetskyi) 。
  • 修复了 UDF 刷新时的崩溃问题;原因是 ZooKeeperRetriesControl 在未续订的情况下,对陈旧 (已过期) 的 ZooKeeper 会话进行再试行。#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).
  • 修复了因缓存键不匹配,删除 part 后 VectorSimilarityIndexCache 条目始终无法被清除的问题。 #102152 (Seva Potapov).
  • 使用 rabbitmq 存储时,会对损坏的消息发送 NACK。#102157 (Seva Potapov).
  • 修复了解析格式错误的空元组字符串时的逻辑错误。#102289 (Nihal Z. Miaji).
  • 修复在 GROUP BY 列顺序与表的排序键不一致时使用 optimize_aggregation_in_order=1 导致聚合结果错误 (出现重复行) 的问题。#102299 (Groene AI).
  • 修复了在使用 Avro 格式时,IcebergLocal ALTER TABLE ... UPDATE 发生崩溃的问题;原因是在序列化前未先解包 LowCardinality/Nullable 包装类型。#102337 (Desel72).
  • 修复了在没有 expression 的物化列上执行 mutation 时发生的段错误。关闭 #102185#102342 (zoomxi).
  • 修复了 Coalescing MergeTree 对数组类型的处理问题。此修复关闭了 #89509#102384 (Konstantin Vedernikov) 。
  • 修复了在启用 bloom filter 下推且 WHERE 子句包含等值/不等值条件时读取 Parquet 文件会发生段错误 (或在调试构建中出现 LOGICAL_ERROR) 的问题。该崩溃是由于 Parquet 预取器在读取 bloom filter 数据时发生越界内存访问所致,还可能导致非确定性的错误查询结果。#102385 (Groene AI) 。
  • 修复了 SLRU 文件系统缓存动态调整大小期间出现的 LOGICAL_ERROR 中止问题,其原因是各子队列共享淘汰统计信息,以及失败候选项的恢复路径不正确。#102396 (Antonio Andelic).
  • 修复 Replicated 数据库中无目标表的别名表在全新副本上初始化失败的问题。关闭 #101320#102397 (Nikolay Degterinsky) 。
  • 修复了在搜索完全由空字节组成的 needle 时,字符串搜索函数 (countSubstringsposition 等) 发生越界读取的问题。#102401 (Raúl Marín) 。
  • 全文索引设置 (enable_full_text_indexallow_experimental_full_text_indexuse_skip_indexes_on_data_read) 在 compatibility 设置指定为早于 26.1 的版本时,不再会被禁用。此前,这可能会导致 SharedDatabaseCatalog 无法创建带有文本索引的表。#102422 (Nikita Fomichev) 。
  • 修复 printf 在末尾带有 % 时的越界读取问题。#102472 (Raúl Marín) 。
  • 修复了 AsynchronousMetrics 中调试构建里的一个 chassert 异常 ReadBuffer is canceled,原因是 rewind 未重置缓冲区的取消标志。#102524 (Yuri Fedoseev).
  • 修复了在带有文本索引的列上,hasToken / hasTokenOrNull 处理仅包含分隔符的 needle (例如 '()''!!!') 时的问题:此前,索引会静默地跳过所有 granule,而不是抛出 BAD_ARGUMENTS (对 hasToken 而言) 或返回 NULL (对 hasTokenOrNull 而言) 。#102544 (Jimmy Aguilar Mena) 。
  • 修复 Keeper 中超大 multi 请求引发的 OOM。对于 OpenTelemetry 追踪,我们会在 ZooKeeperRequest 对象中无条件为 OpenTelemetry spans 分配 >1 KiB 的内存——这意味着,对于特别大的 multi 请求,我们会尝试额外分配 >10 GiB 的内存。为解决这一问题,我们现在将 shared data 保存在静态内存中,并在 ZooKeeperOpentelemetrySpans 中使用 std::unique_ptr 代替 std::optional#102586 (Miсhael Stetsyuk) 。
  • 修复在现有集合上使用 CREATE NAMED COLLECTION IF NOT EXISTS 时导致 NamedCollection CurrentMetric 虚增,以及启动时从配置或 SQL 存储加载的集合未初始化的问题。关闭 #102507#102598 (Pablo Marcos) 。
  • 修复了在并发 DDL 导致本地分片返回空列时,getStructureOfRemoteTable 抛出的异常。 #102604 (Alexey Milovidov).
  • 修复了在 Shared 数据库上,多个并发执行的 CREATE TABLE IF NOT EXISTS 查询针对同一个 S3Queue 表时触发的 LOGICAL_ERROR 异常。#102610 (Nikita Taranov) 。
  • 修复原生 Parquet V3 读取器在使用 WHERE 过滤条件读取 Nullable 列时出现的 LOGICAL_ERROR 崩溃:“Unexpected number of rows in column subchunk”。 #102628 (Groene AI).
  • 修复 AzureWriteMicroseconds profile 事件描述中将 "write" 误写成 "read" 的问题。#102639 (Miсhael Stetsyuk).
  • 在某些特殊情况下,行级策略会触发 'Not found column in block' 异常的问题。 #102648 (Yarik Briukhovetskyi).
  • 修复了 ClusterDiscovery 中的一个服务器异常:当静态集群 (在配置中定义) 暂时没有可用节点时,会触发该异常。#102661 (Kseniia Sumarokova).
  • 修复了时区调整后发生溢出时,日期数据类型推断错误的问题。关闭 #102601#102674 (Pavel Kruglov).
  • 修复了以下问题:当可刷新materialized view 在等待过程中被删除时,SYSTEM WAIT VIEW 会一直挂起。#102681 (Nikolay Degterinsky).
  • 修复了 CASE 在使用 Dynamic expression 时对所有行都返回 ELSE 的问题。关闭了 #102511#102684 (Pavel Kruglov) 。
  • 修复了使用二进制编码的数据类型时,扁平化后的 Dynamic 类型的序列化问题。关闭 #101911#102692 (Pavel Kruglov) 。
  • 修复了 format_schema_source='query' 会静默忽略多行结果的问题。关闭 #101905#102698 (Pavel Kruglov) 。
  • 通过 SSH 客户端返回实际退出码,而不是将所有错误一律映射为 1。解决了 #101741#102700 (Konstantin Bogdanov) 。
  • 修复动态/预定义查询 handler 丢失 HTTP 请求头的问题。已关闭 #101846#102706 (Konstantin Bogdanov) 。
  • 对折叠后的 jemalloc 堆内存剖析应用泊松采样校正,使其与 jeprof 输出一致。此前,折叠格式因未考虑采样概率而低估了实际分配大小。#102759 (Antonio Andelic).
  • 修复了函数 hasPhrase 在参数为 NULL 时发生崩溃的问题。#102802 (Nikita Taranov) 。
  • 修复了在读取包含循环符号类型引用的递归 schema 的 Avro 文件时服务器崩溃 (SIGSEGV) 的问题。现在会检测并拒绝此类 schema,并返回清晰的错误消息,而不再导致崩溃。#102853 (Groene AI).
  • 修复了一个导致服务器崩溃 (LOGICAL&#95;ERROR 断言) 的问题:在 FunctionVariantAdaptor 中进行结果转换时,如果 Variant 列上的函数达到内存限制或发生其他非类型转换异常,就会触发该问题。现在,此类异常会被正确传播,而不再被误判为内部错误。#102855 (Groene AI) 。
  • 修复在调试/sanitizer 构建中,schema inference 期间抛出 std::length_error 时导致的服务器崩溃问题 (例如,由极端的 input_format_msgpack_number_of_columns 值或格式错误的输入数据引起) 。#102859 (Groene AI) 。
  • 使复制列和稀疏列在序列化时的 null 表示遵循相关设置 (例如 format_tsv_null_representation) 。#102888 (Hechem Selmi) 。
  • 已在 #103499 中回移:修复了 S3 请求失败时未重试、反而报出 ios_base::clear: unspecified iostream_category error 的问题,原因是 Poco BufferedStreamBuf::flushBuffer 未处理来自套接字层的短写入。 #102894 (Sema Checherinda).
  • 修复以下问题:执行轻量级删除后,minmax_count_projection 和简单的 COUNT(*) 优化会被永久禁用,即使所有带有轻量级删除掩码的 parts 都已合并消失。 #102900 (Anton Popov).
  • 修复了因 LTO 导致的 jemalloc 随机崩溃问题。#102913 (Azat Khuzhin) 。
  • 在新分析器中,将行策略中的 OR 链优化为 IN。#102915 (Azat Khuzhin) 。
  • 修复了因 page cache 以错误的对齐方式释放内存而导致的 jemalloc 元数据损坏问题,此问题可能会引发崩溃。#102918 (Azat Khuzhin) 。
  • 不带 materialized views 的普通 INSERT 操作不再请求过多的 ConcurrencyControl 槽位和线程 (使用 max_threads 而不是 max_insert_threads) ,从而避免高 INSERT 处理量集群中出现 CC 槽位饥饿和线程数暴涨。#102961 (Sema Checherinda).
  • 重新引入 ArrowMemoryPool,以便在达到内存限制时抛出 MEMORY_LIMIT_EXCEEDED,从而避免内核 OOM。#102999 (Azat Khuzhin) 。
  • 修复了对 Nullable(DateTime) 执行 CAST 时会忽略 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 更宽的整数时 (例如 256655352147483648,或任意负整数) ,过滤器会错误地丢弃所有行。原因是 splitFilterNodeForAllowedInputs 在将化简后 AND 表达式中剩余的 Nullable 部分转换为布尔值时,错误地使用了 NULL 零值,导致在三值逻辑下比较结果变为 NULL#103077 (Groene AI).
  • 修复了字符串搜索函数 (如 locateposition) 在按调换后的顺序传递参数时 (locate(needle, haystack)function_locate_has_mysql_compatible_argument_order = 1) ,错误消息中将参数类型报告错误的问题。#103102 (Alex Kuleshov).
  • 修复在故障注入点没有线程处于暂停状态时调用 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 指令不可用时仍使用 SVE 指令进行检测的问题。#103568 (Raúl Marín).

构建/测试/打包方面的改进

  • Libstemmer (Snowball) 依赖项现已升级到更新的 v3.0.1 版本。#99256 (Jimmy Aguilar Mena) 。
  • 在 clickhouse-test 中将以下设置随机化:use_skip_indexes_for_top_kuse_top_k_dynamic_filteringquery_plan_max_limit_for_top_k_optimization#91782 (Nikita Fomichev) 。
  • 为函数实现压力测试,以检查其各种性质的正确性。#93543 (Michael Kolupaev).
  • llvm-project 提供自有的 CMake 配置,而非导入上游配置。#97453 (Konstantin Bogdanov) 。
  • 在测试基础设施中进一步随机化更多 optimize_* 设置,以提高查询优化各阶段的覆盖率。#97547 (Alexey Milovidov).
  • 使用 Rust 工具链 nightly-2026-03-22。#98602 (Konstantin Bogdanov) 。
  • 使用 wasmtime v42.0.1。#98603 (Konstantin Bogdanov) 。
  • 使用 llvm-project 22.1.1。#98882 (Konstantin Bogdanov) 。
  • 将用于夜间按测试统计覆盖率管道的 SANITIZE_COVERAGE (自定义 sanitizer 回调、符号级粒度) 替换为基于 LLVM 源代码的覆盖率 (WITH_COVERAGE, -fprofile-instr-generate -fcoverage-mapping) 。服务器现在会在启动时从 ELF 段中读取自身的覆盖率映射,并通过新的 SYSTEM SET COVERAGE TEST 'name' 命令为每个测试收集 (file, line_start, line_end) 元组。定向 CI 检查中的测试选择会对新的 checks_coverage_lines CIDB 表执行行范围查询,并按候选测试覆盖的已修改 diff 行数对其进行排序。#99513 (Nikita Fomichev) 。
  • 修复 -O0 构建下的 llvm-libc 链接错误。#100023 (Zheguang Zhao) 。
  • 修复了容器启动时的两条报错信息:当配置中未包含 logger.loglogger.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-cpp 1.11.771 版本。#100582 (Konstantin Bogdanov) 。
  • 允许性能测试 XML 通过 file 属性引用外部 SQL 查询文件和设置项。#100747 (Raufs Dunamalijevs) 。
  • 通过在 LowerUpperImpl.h 中补充缺失的 TargetSpecific.h 头文件包含,修复了使用 -march=x86-64-v4 时的编译问题。#100932 (Alexey Milovidov).
  • 通过在 cxxflags 中添加 --no-default-config,修复了 Gentoo 上的构建问题。#100973 (Isak Ellmer) 。
  • 新增了 utils/auto-bisect/——一个基于 shell 的二分定位框架,可下载预构建的 CI 二进制文件,并运行用户提供的测试脚本,以找出首次引入回归问题的 commit,无需本地构建。#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_queryCOUNT(*) 的正确性、MATERIALIZED/DEFAULT 列的完整性、ReplicatedMergeTree 标志位恢复、包含已删除行时的 read_in_order、多次删除/合并循环、_row_exists 列隐藏、多种 predicate,以及对 ALTER DELETE 的 RBAC 强制执行。#101792 (Nikita Fomichev).
  • 现已为带标签的发布版本提供基于 ubuntu 和 alpine 的 Distroless Docker 镜像。#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).
  • 使用 wasmtime v43.0.1。 #102603 (Konstantin Bogdanov).
  • 使用 openssl 3.5.6。 #102606 (Konstantin Bogdanov) 。
  • 使用 xz 5.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).

ClickHouse 26.3 LTS 发布,2026-03-26。演示文稿视频

不兼容变更

  • 升级后再降级可能会导致数据丢失。将数据类型的序列化版本传递到嵌套数据类型中。例如,String 的序列化版本 with_size_stream 之前仅应用于顶层 String 列和 Tuple 元素。现在,它会应用于任何嵌套类型 (如 Array/Map/Variant/JSON/etc.) 中的任意 String 类型。这种行为由 MergeTree 设置 propagate_types_serialization_versions_to_nested_types 控制,且该设置现已默认启用。此修改后,新创建的数据分区片段无法被旧版本读取,但旧 parts 仍可在新版本中正常读取。升级是安全的,但降级则不安全——如果您在升级到 26.3 后需要回滚,则 26.3 在包含嵌套类型的列中写入的数据将无法读取! 详情请参见 #101429#94859 (Pavel Kruglov).
  • 移除 hypothesis 跳过索引类型。这是一项冷门的 Experimental 功能,实际用途有限。现在,使用 INDEX ... TYPE hypothesis 创建表会报错。#96874 (Alexey Milovidov) 。
  • 移除处于 Experimental 阶段的 detectProgrammingLanguage 函数。#99567 (Alexey Milovidov) 。
  • 修复 NOT 运算符的优先级以符合 SQL 标准:NOT 现在的优先级低于 IS NULLBETWEENLIKE 和算术运算符。例如,NOT (x) IS NULL 现在会被解析为 NOT (x IS NULL),而不是 (NOT x) IS NULL。这可能会改变依赖此前 (非标准) 行为的查询结果。#97680 (Alexey Milovidov).
  • 修正了普通投影的元数据,使具有多列排序键的投影能够被正确识别。这是在 #90429 的基础上进一步完善的。#91352 (Amos Bird) 。
  • 修复了跳过索引文件未遵循 replace_long_file_name_to_hash 设置的问题;该问题会导致出现 "File name too long" 错误,并使名称较长的索引无法正常读取。现在,当跳过索引文件名超过 max_file_name_length 时,会像列文件一样对文件名进行哈希处理。这一更改向后兼容 (新服务器可读取旧 parts) ,但降级 (或滚动升级期间使用旧服务器) 可能导致名称较长的索引被忽略。#97128 (Raúl Marín).
  • 默认启用异步插入。ClickHouse 现在会默认将所有小型插入按批次处理。此设置在 compatibility 中配置。如果您设置 compatibility=<version less than 26.2>,则默认值将恢复为之前的值,即 false。您可以在多个层级启用或禁用异步插入:在用户 profile 配置中、在会话级别、查询级别,或在 MergeTree 表级别。#97590 (Sema Checherinda)。
  • mysql_datatypes_support_level 的默认值从空改为 decimal,datetime64,date2Date32,默认启用将 MySQL DATE 正确映射到 Date32、将 DECIMAL/NUMERIC 映射到 Decimal,以及将带精度的 DATETIME/TIMESTAMP 映射到 DateTime64。此前,MySQL DATE 列会被映射到 Date,而后者无法表示 1970-01-01 之前的日期,从而导致数据损坏。#97716 (Alexey Milovidov).
  • 由于正则表达式较慢,mergeTreeAnalyzeIndexes{,UUID} 现支持接受 part 名称数组,而不是 regexp (Experimental 功能)。#98474 (Azat Khuzhin).
  • 将可执行用户定义函数的默认 stderr_reactionthrow 修改为 log_last。UDFs 在向 stderr 写入警告且退出代码为 0 时将不再失败。退出代码异常现在会包含 stderr 的内容。#99232 (Xu Jia).

新特性

  • 为 MergeTree 中的 Map 列新增了分桶序列化支持 (map_serialization_version = 'with_buckets') 。键会按哈希拆分到不同的桶中,因此读取单个键 (m['key']) 时只需读取一个桶,而不是整个列,从而根据 Map 大小将单键查找速度提升 2 到 49 倍。桶的数量和分桶策略可通过新的 MergeTree 设置进行控制:map_serialization_versionmax_buckets_in_mapmap_buckets_strategymap_buckets_coefficientmap_buckets_min_avg_size#99200 (Pavel Kruglov) 。
  • 支持物化 CTE。允许在查询执行期间仅计算一次 CTE,并将结果存储在临时表中。关闭 #53449#94849 (Dmitry Novik) 。
  • 允许某些符合 SQL 标准的函数在不加括号时也能使用,以保持兼容性,例如 NOW。关闭 #52102#95949 (Aly Kafoury) 。
  • 您现在可以使用自然排序键函数 naturalSortKey(s)#90322 (Nazarii Piontko) 。
  • 您现在可以为 JSONExtract 函数使用原生的 JSON/Object 输入。修复了 #88370#96711 (Fisnik Kastrati).
  • 如果某个查询参数的类型为 Nullable,且未显式指定,则会假定其值为 NULL#93869 (Vikash Kumar) 。
  • 支持 Replicated 数据库使用辅助 ZooKeeper。#95590 (RinChanNOW) 。
  • 支持对 JSON 类型使用 has 函数来检查路径是否存在,类似于 Map#96927 (DQ).
  • 新增了 mergeTreeTextIndex(database, table, index) 表函数,可直接从文本索引中读取数据。该函数可用于内省,或基于文本索引数据执行聚合。 #97003 (Anton Popov).
  • 新增 table_readonly MergeTree 设置,可将表标记为只读,从而防止插入和修改。#97652 (Alexey Milovidov).
  • 新增设置 use_partition_pruning 及其别名 use_partition_key。将其设为 false 以禁用基于分区键的分区剪枝。#97888 (Nihal Z. Miaji).
  • 支持对 Iceberg 表执行 ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')#97904 (murphy-4o)。#99130
  • 允许 <protocols> 中每个 type=http 条目指定自定义的 <handlers> 键,使其指向单独的 <http_handlers_*> 配置节,从而为各端口启用不同的 HTTP 路由规则。#98414 (Amos Bird).
  • EXPLAIN 添加 pretty=1 设置以输出树状缩进格式,并添加 compact=1 以折叠 Expression 步骤,让查询计划更易读。#98500 (Kirill Kopnev)。
  • 新增 restore_access_entities_with_current_grants 服务器设置。启用后,从备份中恢复的用户/角色,其授权会被限制在执行恢复操作的用户有权授予的范围内 (语义与 GRANT CURRENT GRANTS 相同) ,而不会因 ACCESS_DENIED 而失败。#98795 (pufit).
  • 新增 caseFoldUTF8removeDiacriticsUTF8 函数,用于 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_nummax_skip_unavailable_shards_ratio 设置,用于限制在启用 skip_unavailable_shards 时可静默跳过的分片数。如果不可用分片的数量或占比超过配置的阈值,则会抛出异常,而不是静默返回不完整的结果。#99369 (Alexey Milovidov).
  • 现在,用户可以在子查询表达式中使用 SOME 关键字。其行为与 ANY 完全一致。#99842 (Artem Kytkin).
  • 新增 output_format_trim_fixed_string 设置,用于在文本输出格式中去除 FixedString 值末尾的空字节。#97558 (NeedmeFordev) 。
  • 支持在 FROM 子句中使用加括号的表连接表达式,例如 SELECT * FROM (t1 CROSS JOIN t2)#97650 (Alexey Milovidov) 。
  • 实现函数 toDaysInMonth:返回指定日期所在月份的天数。#99227 (Vitaly Baranov)。

Experimental 功能

  • 新增对基于 WebAssembly 的用户定义函数 (UDF) 的 Experimental 支持,允许在 WebAssembly 中实现自定义函数逻辑,并在 ClickHouse 内执行。特别感谢 Alexey Smirnov 贡献了 Wasmtime 后端支持。#88747 (Vladimir Cherkasov) 。同时还对 WASM UDF 支持进行了增量改进。#99373 (Vasily Chekalkin) 。
  • 新增通过 polyglot 库支持外部 SQL 方言。#99496 (Alexey Milovidov) 。
  • 新增 ALP 浮点压缩编解码器 (对于不可压缩的 double,不使用 ALP_rd 回退) 。#91362 (Nazarii Piontko) 。
  • JSON 列新增 Experimental 惰性类型提示支持。通过 allow_experimental_json_lazy_type_hints 启用后,仅添加或修改类型提示的 ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName) 会作为纯元数据操作立即完成,而无需重写历史数据。对于旧 parts,类型提示会在查询时生效;在 INSERT 和后台合并期间则会被物化。#97412 (tanner-bruce) 。
  • 为 YTsaurus 表引擎启用并行读取。#97343 (MikhailBurdukov) 。

性能优化

  • 提升数据湖性能。在之前的版本中,从对象存储读取时,管道不会根据处理线程数自动调整大小。这在多核机器上可带来数量级的性能提升 (约 40 倍) 。#99548 (Alexey Milovidov) 。
  • 现在,enable_parallel_replicasautomatic_parallel_replicas_mode 之间的关系如下:只有当 enable_parallel_replicas > 0 时,查询才能使用并行副本。此外,如果 automatic_parallel_replicas_mode=1,则是否使用并行副本会在计划阶段根据先前收集的统计信息决定。如果 automatic_parallel_replicas_mode=0,则所有受支持的查询都会使用并行副本,而不考虑任何统计信息。一个值得注意的例外是使用并行副本的分布式 insert-select:在这种情况下,查询始终会像 automatic_parallel_replicas_mode=0 那样执行。#97517 (Nikita Taranov) 。
  • 当谓词包含任意比较运算符 (=, <, >, !=) ,且分区键被包裹在一串决定论函数中时,允许进行分区剪枝 (例如,PARTITION BY x 以及 cityHash64(x) % 5 > 2toYYYYMM(x) < 2026toYYYYMM(x) = 2026toYYYYMM(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 < 1e9number < 1e5 这类过滤条件现在也会下推到 primes()numbers() 表函数中,而不会导致无界执行。关闭 #85167#98516 (Nihal Z. Miaji) 。
  • 新增了用于 Parquet 元数据的 SLRU 缓存,无需仅为读取元数据而重新下载文件,从而提升了读取性能。#98140 (Grant Holly) 。
  • 支持根据优化器统计信息对 ANTI、SEMI 和 FULL 连接的两侧进行互换。#97498 (Hechem Selmi).
  • 优化 pointInPolygon 在大型多边形场景下的 그래뉼 跳过,并修复 pointInPolygon 索引分析在主键剪枝期间抛出异常的问题。 #91633 (Nihal Z. Miaji).
  • 优化 levenshteinDistance 函数的性能。#94543 (Joanna Hulboj) 。
  • 通过避免对每个元素调用函数,优化批次 decimal 类型转换。#95923 (Konstantin Bogdanov).
  • Iceberg 表现已支持通过 iceberg_metadata_async_prefetch_period_ms 表设置进行异步元数据预取,定期预先填充元数据缓存。此外,iceberg_metadata_staleness_ms 查询设置允许 SELECT 查询在缓存的元数据比指定的陈旧阈值更新时使用缓存元数据,从而避免在请求处理过程中调用 Iceberg 目录。#96191 (Arsen Muk) 。
  • S3Queue 有序模式使用 S3 ListObjectsV2 StartAfter,以避免重新列出整个前缀历史,从而减少 ListObjects 调用。#96370 (Venkata Vineel ).
  • 降低插入去重的内存占用。通常,去重需要保留原始块;但对于同步插入,可以省略它,从而显著节省内存。#96661 (Sema Checherinda).
  • 使用与架构对应的缓存行大小值,而不是将其硬编码为 64。 #97357 (Nikita Taranov).
  • 对文本索引字典的读取做了小幅优化,提升了文本索引分析的整体性能。#97519 (Anton Popov) 。
  • 提升 ARM 上 16 字节块的 LZ4 解压缩速度。#97774 (Raúl Marín).
  • 将分词功能重构为新的高性能接口,以替换旧的迭代器风格 API,从而支持 SIMD 和有状态分词器。属于 #90268 的一部分。#97871 (Amos Bird) 。
  • 改进了对同时包含已建立索引列和未建立索引列的组合条件查询进行 텍스트 인덱스 分析时的性能。此前,在这种情况下,索引分析期间的提前退出优化会被错误地禁用。 #98096 (Anton Popov).
  • 提升包含会生成超长数组或 Map 的常量表达式的查询性能。#98287 (Alexey Milovidov) 。
  • 修复了将 DateTime64 主键与整型常量比较时的键条件分析问题;此前这会导致无法进行 그래뉼 剪枝。#98410 (Amos Bird).
  • 设置 optimize_syntax_fuse_functions 默认处于启用状态。#98424 (Alexey Milovidov) 。
  • 通过使用局部累加器,而不是按行经由聚合状态进行存储转发,优化了 avgWeighted 聚合函数;对于 Nullable 输入,性能最高可提升 27%。#98793 (Antonio Andelic) 。
  • 在某些场景下,这项改进可提升并行窗口函数的性能并降低内存占用,对处理大数组的 arrayFold workload 也有帮助。它还可以减轻缺页压力,并在内存限制较紧时提高受影响查询的稳定性。#98892 (filimonov).
  • 提升有序合并的性能。#99013 (Artem Zuikov) 。
  • 优化了 INTERSECT ALLEXCEPT ALL#99097 (Raufs Dunamalijevs) 。
  • 支持在逆序读取中使用 read_in_order_use_virtual_row 优化。#99198 (Vladimir Cherkasov) 。
  • 通过在写入前检查 JoinUsedFlags 是否已设置,减少 RIGHTFULL JOIN 中的缓存竞争。#99274 (Hechem Selmi).
  • 通过将浮点运算替换为纯整数运算,优化 PrefetchingHelper::calcPrefetchLookAhead,从而改进指令缓存布局,并减少聚合循环期间的周期开销。#99327 (Riyane El Qoqui) 。
  • 通过将用于存储节点子节点的 absl::flat_hash_set 替换为 CompactChildrenSet,降低了 Keeper 的内存占用。新容器可内联存储 0–1 个子节点而无需堆分配,这涵盖了绝大多数 Keeper 节点。这样可将 KeeperMemNode 的大小从 144 字节减小到 128 字节。#99860 (Antonio Andelic) 。
  • 现在已在视图中正确支持聚合投影。修复了 #32753#88798 (Amos Bird) 。
  • 支持在启用 join_use_nulls 时,将 OUTER 连接转换为 INNER 连接的优化。关闭 #90978#95968 (Vladimir Cherkasov) 。
  • 通过在读取前正确计算大小,优化了子列读取。这减少了内存占用,并提升了子列读取速度。 #96251 (Pavel Kruglov).
  • 让 mark 缓存、未压缩缓存和页面缓存使用各自独立的 jemalloc arena,以避免短生命周期的内存分配 (即查询和请求的分配) 与缓存所需的长生命周期分配混用时产生内存碎片。 #96812 (Seva Potapov). #98812. #99021
  • 带有 DELETE TTL 规则的表现在也可以使用垂直合并算法。#97332 (murphy-4o).
  • 在分散索引分析过程中应用数据跳过索引。#97767 (Azat Khuzhin) 。
  • 启用 prewarm_mark_cache 设置后,现在会预热辅助索引的标记 (即在拉取数据分区片段以及表启动期间,将其加载到索引标记缓存中) 。#97772 (Anton Popov) 。
  • 减少了访问控制期间的锁争用。#97894 (Nikita Taranov) 。
  • 启用 apply_row_policy_after_final 或 apply_prewhere_after_final 后,现在会分解行策略和 PREWHERE 中由 AND 组合的复合条件,以提取排序键原子条件并用于主键索引分析。此前,如果延后过滤器同时包含排序键和非排序键 프레디케이트 (例如 x > 1 AND y != 'foo') ,则整个表达式都不会纳入索引分析。现在,即使在嵌套的 AND 表达式中,也能提取排序键原子条件 (如 x > 1) ,并将其用于 그래뉼剪枝。#98513 (Yarik Briukhovetskyi) 。
  • 通过让任务资源在无需获取锁的情况下释放,减少 MergeTreeBackgroundExecutor 中的锁竞争。关闭 #93620#98604 (Dmitry Novik) 。
  • 修复了读取非 Arrow 数据时在自动检测格式期间内存占用过高 (约 514 MiB) 的问题 (例如,从 urlfile 读取且未显式指定格式的 JSON) ;原因是 ArrowStream 读取器将起始几个字节误判为超大的元数据长度。#98893 (Konstantin Bogdanov).

改进

  • 现已支持解析同一列中包含不同 Geo 类型的 GeoParquet 文件。#97851 (Mark Needham).
  • 引入 tokensForLikePattern SQL 函数,用于在保留通配符语义的同时对 LIKE 模式进行标记化:%_ 视为通配符,转义后的通配符 (\%\_) 视为字面量,与未转义通配符相邻的标记会被丢弃。#97872 (Amos Bird) 。
  • 为 S3 表引擎新增 {_schema_hash} 占位符,用于将表列定义的哈希值插入到 S3 路径中。#98265 (Miсhael Stetsyuk).
  • SymbolIndexaddressToSymbolsystem.symbolsbuildId 现已可在 macOS 上通过解析 Mach-O 符号表来工作。#99014 (Alexey Milovidov).
  • system.stack_trace 表现在已可在 macOS 上运行,支持检查所有服务器线程的堆栈跟踪。#98982 (Alexey Milovidov).
  • 新增按服务器配置的 LDAP 选项 <follow_referrals> (默认值为 false) ,用于控制 LDAP 客户端是否跟随转介。禁用转介跟随可避免从 Active Directory 域根 base DN 开始搜索时出现超时和卡住的问题。与转介相关的日志消息已从 warn 调整为 trace#96765 (paf91).
  • 我们现在会将查询执行期间使用的所有数据跳过索引记录到 query_log 表新增的 skip_indices 列中。修复了 #78676。原始著者为 @pheepa。#87862 (Grant Holly) 。
  • ACCESS_DENIED 提示不再暴露列名,除非用户有权查看所有必需的列;数据库/表名在提示中仍然可见。#91067 (filimonov).
  • 为 MergeTree 新增一个专用清理线程,以避免在高合并负载下发生清理延迟。此项改动修复了 #86181#91574 (Amos Bird) 。
  • 仅在本地服务器主机名对应的 IP 发生变化时才重新加载集群配置,而不是在任意主机的 IP 发生变化时重新加载。修复了 #81215#70156#65268#93726 (Zhigao Hong) 。
  • 支持 optimize_aggregators_of_group_by_keys 在 GROUPING SETS 查询中正确优化聚合函数。 #93935 (Xiaozhe Yu).
  • Keeper-bench:在指标中报告错误,并为 --input-request-log 模式生成 JSON 指标文件。#95748 (Mohammad Lareb Zafar).
  • 在 CREATE USER 中新增 ROLE 子句。#97074 (Vitaly Baranov) 。
  • 您现在可以为由 Replicated 数据库创建的集群配置 internal_replication 设置。#97228 (Pervakov Grigorii) 。
  • 新设置 allow_nullable_tuple_in_extracted_subcolumns 用于控制从 TupleVariantDynamicJSON 中提取的 Tuple(...) 子列是返回为 Nullable(Tuple(...)) (缺失行返回 NULL) ,还是返回为 Tuple(...) (缺失行返回默认的 tuple 值) 。该设置默认禁用,且只能通过重启服务器进行修改。#97299 (Nihal Z. Miaji) 。
  • 在 EXPLAIN 查询的输出中,将延迟筛选器信息作为单独一项添加进去 (在使用 Row Policies/PREWHERE 和 FINAL 时) 。相关:#91065#97374 (Yarik Briukhovetskyi) 。
  • 默认启用 type_json_allow_duplicated_key_with_literal_and_nested_object。它可避免在解析 {"a" : 42, "a" : {"b" : 42}} 这类 JSON 时因重复键而报错;这类 JSON 可能是 ClickHouse 根据原始 JSON 数据 {"a" : 42, "a.b" : 42} 格式化生成的。#97423 (Pavel Kruglov) 。
  • Keeper 改进:find_super_nodes 是一个非常有用的命令语,可用于调试 Keeper 中节点数量意外增长的问题。遗憾的是,如果存在多个超级节点,几乎不可能找到一个以上,因为该命令语在遍历遇到的第一个超级节点的子节点时会一直卡住。此 PR 禁止遍历超级节点的子节点。#97819 (pufit).
  • 新增对 clickhouse-keeper-client 的初始自动补全支持。#97828 (Konstantin Bogdanov) 。
  • 在发生崩溃时,刷新异步日志缓冲区。#97836 (Azat Khuzhin).
  • 默认启用 impersonate 功能 (参见 EXECUTE AS target_user) 。#97870 (Vitaly Baranov) 。
  • 改进了 SQLite 表引擎对 KILL QUERY 和在 clickhouse-client 中按 Ctrl+C 取消查询的支持。#97944 (Roman Vasin).
  • 新增 server setting jemalloc_profiler_sampling_rate,用于控制 jemalloc 的 lg_prof_sample,并将其作为 jemalloc.prof.lg_sample 异步指标暴露出来。#97945 (Antonio Andelic) 。
  • 为并发有界队列实现增加权重支持。#97962 (Daniil Ivanik) 。
  • 将 sslmode 添加到 PostgreSQL 字典源的允许键列表中。此前,sslmode 不在 PostgreSQLDictionarySource.cpp 的 dictionary_allowed_keys 允许列表内,因此无法为 PostgreSQL 字典连接配置 SSL 模式。这会导致字典无法连接到要求使用 SSL 的 PostgreSQL 服务器 (例如默认强制启用 SSL 的 AWS RDS) ,因为连接会在 TLS 协商阶段失败,服务器也会拒绝回退到未加密连接。#98014 (mcalfin).
  • 当向 clickhouseclickhouse-local 传入不存在的文件路径时,显示清晰的 "no such file" 错误,而不是令人困惑的通用错误消息。#98048 (Raúl Marín).
  • 现在已支持在 Nullable([Fixed]String)Array(Nullable([Fixed]String)) 列上构建文本索引。#98118 (Jimmy Aguilar Mena).
  • 避免删除作为字典源依赖的命名集合。#98127 (Pablo Marcos) 。
  • 为带有 totals 的查询启用 grace_hash 连接算法。#98144 (János Benjamin Antal) 。
  • 在 DROP DATABASE 过程中提前取消 ordinary shared merge tree 的后台合并。#98161 (Shaohua Wang) 。
  • 通过 KILL QUERY 和 clickhouse-client 中的取消查询 (Ctrl+C) ,改进了对 MongoDB 和 MySQL 查询取消的支持。#98187 (Roman Vasin).
  • 移除 NetlinkMetricsProvider,并改为仅使用 procfs 收集每线程 taskstats 指标。基于 Netlink 的收集方式在容器化环境中存在问题,而且在发生争用时尾延迟更高。#98229 (Amos Bird).
  • 重构 Iceberg 清单文件的处理逻辑,以修复清单文件缓存问题。#98231 (Daniil Ivanik) 。
  • 现在我们也会考虑这样一种情况:表的排序键可以是 toDate(time) 这样的表达式;如果这类表达式是筛选条件的一部分,就可以据此决定不延迟对它们的处理。 #98237 (Yarik Briukhovetskyi).
  • 新增 MaxAllocatedEphemeralLockSequentialNumber 指标,用于表示 ZooKeeper 中临时锁 znode 已分配的最大顺序号。#98243 (Miсhael Stetsyuk) 。
  • 将 ClickStack 更新到 2.20.0 版本。#98252 (Aaron Knudtson) 。
  • 新增了一个 profile 事件 KeeperRequestTotalWithSubrequests,会对多重请求中的每个子请求分别计数,从而更清楚地反映 Keeper 的实际工作负载。现有的 KeeperRequestTotal 事件仍会将每个多重请求计为一个请求。#98348 (Antonio Andelic) 。
  • SYSTEM RELOAD DICTIONARIES 现在会按拓扑顺序重新加载字典,因此以其他字典为数据源的字典在重新加载后可以读取到最新数据。#98356 (Alexey Milovidov).
  • 更改 MergeTree 设置后,重启统计信息缓存。#98520 (Han Fei) 。
  • 只有“存活”的副本 (即可以连接的副本) 才会参与分散索引分析。#98521 (Azat Khuzhin) 。
  • 添加设置 access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users (默认禁用/允许) ,用于禁止 SQL 定义的用户使用配置中定义的设置 profile (default profile 除外) 。#98662 (Alexander Tokmakov) 。
  • 将自动并行副本启发式所使用的节点数量上限限定为集群中的实际节点数 (而不是仅受 max_parallel_replicas 设置限制) 。#98668 (Nikita Taranov) 。
  • 为分散索引分析实现对冲请求与异步读取。#98724 (Azat Khuzhin) 。
  • 二进制 AggregateFunction 状态的反序列化现在需要读取完整输入。如果存在多余的尾随冗余字节,ClickHouse 将抛出异常,而不再接受格式错误的状态数据。#98786 (Nihal Z. Miaji).
  • 使 TRUNCATE DATABASE 支持响应查询取消。#98828 (Shaohua Wang) 。
  • 改进了 keeper-bench,新增请求流水线、预热期、单操作统计信息、可复现的随机种子以及更完善的错误处理。#98906 (Antonio Andelic).
  • 支持在分散索引分析中支持 SAMPLE 子句。#98931 (Azat Khuzhin).
  • 即使查询返回空结果或报错,也会在仪表板中显示图表标题。#98975 (Yash ).
  • Analyzer 错误消息不再输出表中的所有列 (这可能会导致异常信息达到 150KB+) 。列列表现已限制为最多 10 项。#99002 (Yash ).
  • 正确返回带有连接的子查询中的列统计信息,以便父查询可利用这些信息对连接顺序进行重排。 #99096 (Alexander Gololobov).
  • 在开始最终化时立即将 ZooKeeper 会话标记为已过期,而不是等待发送线程退出。这样可让其他线程立即建立新会话,无需等待。#99102 (Raúl Marín).
  • 开始更多使用 LLVM-libc 中的数学函数:expexp2expm1fabsfabslfloorfmodlloglog2logfpowscalbnscalbnlcopysignlnannanfnanl,以及 explogxf 共享常量。#99118 (Konstantin Bogdanov) 。
  • 降低 system.jemalloc_profile_text 折叠格式的内存占用,并修复潜在的重复输出问题。#99121 (Antonio Andelic) 。
  • system.aggregated_zookeeper_log 添加 is_subrequest 列,以区分独立请求与 Multi/MultiRead 请求中的子请求。此前,子请求会被聚合到与独立请求相同的桶中,而且由于每个子操作记录的都是整个多请求的总持续时间,平均延迟会产生误导。现在,子请求的延迟为零。#99169 (Miсhael Stetsyuk).
  • 允许在不指定列类型的情况下执行 ALTER TABLE MODIFY COLUMN x TTL ... 命令。 #99208 (Nikolay Degterinsky).
  • 跳过已断开连接会话的过期 Keeper 请求,避免不必要的 Raft 往返。被跟踪的已结束会话数量上限由协调设置 max_finished_sessions_cache_size 限制。#99246 (Antonio Andelic).
  • 支持在基于 mapValues(map) 构建的文本索引中使用 IN 运算符。#99286 (Anton Popov) 。
  • 在 clickhouse keeper-client 中新增类 shell 的补全支持 (支持补全引号中的参数,即 'foo ba';支持转义参数,即 foo\ ba;如果节点包含空白字符,则让 ls 以带引号的形式输出节点) 。#99312 (Azat Khuzhin) 。
  • 防止 Keeper 的 mntr 命令因锁竞争而发生卡顿。#99472 (Antonio Andelic) 。
  • 通过在互斥锁作用域外调用回调并分发读取请求,减少 Keeper 分发器中的锁竞争,并添加带性能剖析的锁保护,以增强可观测性。#99751 (Antonio Andelic) 。
  • 允许 Parquet 文件最后一个块末尾缺少填充。#99857 (Seva Potapov).

错误修复(官方稳定版本中用户可见的异常行为)

  • 修复了当别名表目标未完全限定时,其作为 DDL 依赖项的保存方式:现在会使用别名表所在的数据库,而不是会话数据库来保存。#95175 (Enric Calabuig).
  • 修复读取 ALIAS 列的子列时返回错误结果或抛出异常的问题。#95408 (Pavel Kruglov).
  • 修复在旧分析器中,JOIN 使用非标准标识符别名时出现列缺失的问题。修复了 #25594#47288#53263#95679 (Zhigao Hong) 。
  • 修复了 Kusto 方言函数 bin()bin_at()extract()indexof() 在传入空参数时发生崩溃的问题。#95736 (NeedmeFordev) 。
  • 禁止在 clickhouse-client 中,将 local_object_storage (用于构建基于本地文件系统的数据湖,也可能被 LocalDisk 使用) 挂载到 user_files_path 以外的任何位置。#96201 (Daniil Ivanik).
  • DeltaLake 表引擎中,修复快照版本变化时的逻辑竞态问题,并移除冗余且开销较大的快照重新加载。#96226 (Kseniia Sumarokova) 。
  • 修复了 MergeTree 中在分离与附加之间发生多次链式重命名时附加 part 的逻辑错误。#96351 (Alexey Milovidov) 。
  • 修复了一个问题:在同一请求中与 compatibility 一起发送的显式设置,如果其值恰好与服务器默认值相同,可能会被静默忽略。#97078 (Raufs Dunamalijevs).
  • 修复以下问题:当启用并行解析的 INSERT 遇到无效数据时,客户端会报告 NETWORK_ERROR,而不是实际的解析错误 (并显示正确的行号) 。 #97339 (Alexey Milovidov).
  • 修复了在引入 Nullable(Tuple) 后,sumCount 聚合函数无法读取旧版序列化状态的问题。关闭 #97370#97502 (Nihal Z. Miaji).
  • 修复在结合 GROUPING SETSORDER BY 使用时,涉及 Nothing 类型元素 (例如与 NULL 元组元素比较) 的元组比较中出现的异常。#97509 (Alexey Milovidov) 。
  • 修复在使用多个压缩编解码器时,Compact MergeTree parts 的 uncompressed_hash 计算具有非确定性的问题,这可能导致错误的去重行为。#97522 (Alexey Milovidov) 。
  • 修复了在使用 JSON 和 shared data 中的 buckets 执行 INSERT SELECT 时因缺少流而引发的逻辑错误。关闭了 #97331#97523 (Pavel Kruglov) 。
  • 修复了在 SummingMergeTree 和 CoalescingMergeTree 合并过程中,MEMORY_LIMIT_EXCEEDED 异常被误报为 CORRUPTED_DATA 的问题。#97537 (János Benjamin Antal) 。
  • 修复了包含 url() 等表函数的关联子查询中出现的“Context has expired”异常。#97544 (Alexey Milovidov) 。
  • 修复 optimize_syntax_fuse_functions 在处理聚合投影、Date 类型以及保留列名时出现的异常和错误行为。#97545 (Alexey Milovidov) 。
  • 移除了将 replaceRegexpOne 重写为 extract 的错误查询重写,该重写在正则表达式未匹配时会产生错误结果;同时修复了在 replaceRegexpOneGROUP BY ... WITH CUBEgroup_by_use_nulls=1 一起使用时出现的异常。#97546 (Alexey Milovidov).
  • 修复了在查询被终止时,启用 database_atomic_wait_for_drop_and_detach_synchronouslyDROP DATABASE 无限期卡住的问题。#97586 (Alexey Milovidov).
  • 修复 KILL QUERY 无法终止以下卡住的查询的问题:卡在 WITH FILL 生成过程中、通过 dictGet 加载字典时,或在 ReplicatedMergeTree 上执行带有 mutations_sync=1ALTER DELETE 时。#97589 (Alexey Milovidov).
  • loop 表函数会直接调用 inner_storage->read(),从而绕过解释器层;而行策略、列级授权及其他安全检查正是在这一层执行的。因此,即使直接执行 SELECT 返回零行,受行策略限制的用户仍可通过 loop(table) 读取所有行。#97682 (pufit).
  • 修复了在使用 Unix 纪元前的 DateTime64 配合 toDate() 函数时,分区剪枝不正确的问题。#97746 (Yarik Briukhovetskyi).
  • 应用此补丁后,如果数据分区片段集合中存在另一个分区 ID 更高的分区,hasPartitionId 将返回 false。#97748 (Mikhail Artemenko) 。
  • 修复读取 JSON 中进阶共享数据里的空 granule 时可能出现的崩溃问题。关闭 #97563#97778 (Pavel Kruglov) 。
  • 修复了因 DROPINSERT 之间的竞争条件,向 Distributed 执行 INSERT 时出现 Cannot schedule a file LOGICAL_ERROR 的问题。#97822 (Azat Khuzhin).
  • 修复了在使用 tokenbf_v1 跳过索引调用 mapContainsKey/mapContainsKeyLike 时,ClickHouse 服务端发生崩溃/断言的问题。#97826 (Shankar Iyer).
  • 修复了在 concatWithSeparatorformatIN 子查询、GLOBAL IN 以及带有运行时过滤器的连接中,复合类型 (VariantDynamicTuple) 内的 LowCardinality 引发的 LOGICAL&#95;ERROR 异常。 #97831 (Raúl Marín).
  • 修复了这样一个问题:在多个 Distributed 表上使用 merge() 表函数并配合 GROUP BY 时,若再使用 ARRAY JOIN,会触发 LOGICAL_ERROR 异常 Chunk info was not set for chunk in MergingAggregatedTransform#97838 (Raúl Marín).
  • 修复了在高并发情况下,连接组达到硬限制时,HTTP 连接池析构函数中未捕获异常导致的服务器崩溃 (std::terminate) 问题。将连接回收到连接池时,异常 HTTP_CONNECTION_LIMIT_REACHED 可能会从 ~PooledConnection 中泄漏出来,进而导致 SIGABRT#97850 (Antonio Andelic).
  • 修复了在使用 grace_hash 算法处理非等值连接时,若因连接结果大小受限而无法完整处理左侧块,导致结果错误的问题。#97866 (János Benjamin Antal).
  • 修复了在 #96686 中引入的 DeltaLake 元数据扫描性能问题。#97880 (Kseniia Sumarokova) 。
  • 修复 ZooKeeper 客户端中 sendThread 与 receiveThread 之间的数据竞争问题。#97887 (Pablo Marcos) 。
  • 修复了一个错误:此前无法在分布式 INSERT SELECT 中使用 CTE。这是 https://github.com/ClickHouse/ClickHouse/pull/87789 的后续修复。关闭 #95837#97889 (Yarik Briukhovetskyi) 。
  • 修复 CachedOnDiskReadBufferFromFile::readBigAt 中的异常。关闭了 #97325#97890 (Kseniia Sumarokova) 。
  • 修复 Alias 引擎在使用物化列时因列不匹配引发的 LOGICAL_ERROR 异常。关闭 #97907#97921 (Kai Zhu).
  • 修复了在使用 Azure Blob Storage 且日志存储使用 s3_plain 元数据时,Keeper 重启后数据丢失的问题。#97987 (Antonio Andelic).
  • 修复 sign 函数在宽于 Int8 的整数类型上的 JIT 误编译问题——超出 -128..127 范围的值可能会产生错误的符号。 #98012 (Alexey Milovidov).
  • 修复了在读取使用列映射 "name" 模式且 struct 字段名中包含点号 (例如 STRUCT<`a.foo`: STRING, `b.foo`: STRING>) 的 Delta Lake 表时,出现 DUPLICATE_COLUMN 异常以及无提示返回 NULL 的问题。#98013 (Caio Ishizaka Costa).
  • 修复轻量级更新和二级索引后的 mutation 问题。#98044 (Raúl Marín) 。
  • 修复了在混用主键和非主键跳过索引时,FINAL 查询结果错误的问题。#98097 (Raúl Marín).
  • 对 scalar file() 和 DESCRIBE TABLE file() 强制执行 READ ON FILE 权限检查。#98115 (Nikolay Degterinsky) 。
  • 修复了一处崩溃问题:使用 glob 模式查询文件时 (例如 file('dir/**', 'LineAsString')) ,如果目录中包含悬空符号链接,先前会抛出未处理的文件系统异常 (STD_EXCEPTION) 。现在会静默跳过悬空符号链接,查询将返回所有有效文件的结果。 #98143 (Mark Andreev).
  • 修复了在将外连接转换为内连接时,如果过滤表达式中使用 arrayJoin,查询计划优化期间发生段错误的问题。#98147 (Alexey Milovidov).
  • 修复了 ProtobufList 格式因消息之间未重置读取状态而无法在 Kafka 引擎中正常工作的问题。#98151 (Alexey Milovidov).
  • 修复 analyzer_compatibility_join_using_top_level_identifier 与 ARRAY JOIN 中的逻辑错误,并关闭 #98164#98179 (Vladimir Cherkasov).
  • aggregated_zookeeper_log 中,将监视响应的 Watch 部分设为 Watch,而不是留空。#98202 (Antonio Andelic).
  • 如果排序键未覆盖分区键列,那么分区剪枝可能会错误地跳过某些分区,而这些分区中包含的行本应在 FINAL 去重时"胜出"。#98242 (Yarik Briukhovetskyi).
  • 修复在以常量数组参数调用 kql_array_sort_asc/kql_array_sort_desc 时出现的逻辑错误 "Bad cast from type DB::ColumnConst to DB::ColumnArray"。#98251 (Alexey Milovidov) 。
  • 修复了 ColumnConst::getExtremes 中的越界访问问题;启用 extremes = 1 时,该问题可能导致崩溃。#98263 (Alexey Milovidov) 。
  • 修复两个并发执行的 MOVE PARTITION 操作在以相反方向处理同一对表时可能发生的死锁。#98264 (Alexey Milovidov) 。
  • HTTP 服务器现在会在因标头格式错误而导致的 400 Bad Request 响应中,于响应体内返回错误消息,而不再返回空响应体。#98268 (Alexey Milovidov).
  • 修复使用分散索引分析 (Experimental 功能) 和查询条件缓存时出现的错误结果。#98269 (Azat Khuzhin) 。
  • 修复了在对数据跨过 65535 边界的键列执行 toDate 转换时触发的 LOGICAL_ERROR 异常 "MergeTreeSetIndex 中的二分查找结果无效"。#98276 (Alexey Milovidov) 。
  • 修复在旧版连接步骤代码路径中,当 query_plan_join_swap_table 优化交换包裹在 CROSS JOIN 中的 RIGHT JOIN 的顺序时触发的 LOGICAL_ERROR 异常。#98279 (Alexey Milovidov).
  • DDSketch 反序列化过程中对损坏数据进行校验,防止在读取已损坏的 quantilesDD 聚合函数状态时出现段错误、异常、无限循环和 OOM。#98284 (Alexey Milovidov) 。
  • 修复在 arrayMap 等 lambda 函数中引用外层查询中的关联列时出现的 LOGICAL_ERROR "Trying to execute PLACEHOLDER action" 问题。#98285 (Alexey Milovidov).
  • 修复了当 CASE 表达式涉及 materialize(NULL) 或其他 Nullable(Nothing) 参数时,caseWithExpression 中抛出逻辑错误异常的问题。#98290 (Alexey Milovidov) 。
  • 修复在 merge 表函数中过滤 _table 虚拟列时触发的 bad cast 异常。#98291 (Alexey Milovidov) 。
  • 修复了偶发的去重失效问题:由于 blocks/deduplication_hashes/ ZooKeeper 目录的清理顺序不一致,重新插入的数据会被错误地判定为重复并去重。#98293 (Alexey Milovidov).
  • 修复了同时使用 ORDER BY ... WITH FILLLIMIT BY 时触发的异常。#98361 (Alexey Milovidov) 。
  • 修复了将 Parquet/Arrow Date 列插入 Enum 列时出现的静默数据损坏问题——现在会正确拒绝不兼容的类型转换,而不是存储无效的枚举值。#98364 (Alexey Milovidov).
  • 修复将包含 Array 列的 Arrow 文件读入具有 Nested 列的表时出现的异常。#98365 (Alexey Milovidov).
  • 修复了这样一个问题:如果在 mutation 完成前删除索引或投影,MATERIALIZE INDEXMATERIALIZE PROJECTION mutation 会卡住。#98369 (Alexey Milovidov) 。
  • 修复从 Nullable(Tuple(...)) 读取时的异常:当 Tuple 元素名称与 Nullable 的 null 子列重名时会触发该异常。#98372 (Alexey Milovidov) 。
  • 修复将 Merge 表 (封装 Distributed 表) 与另一张表连接时出现的异常:"Column ... query tree node does not have valid source node"。 #98376 (Alexey Milovidov).
  • 修复原生 V3 读取器中将 Parquet Bool 错误转换为 FixedString 的问题;此前会产生原始字节,而不是字符串形式。 #98378 (Alexey Milovidov).
  • 修复 tryGetColumnDescription,使其按父列类型筛选子列,与其他列查找方法保持一致。#98391 (Alexey Milovidov) 。
  • 在 HTTP Basic Auth 中接受不带填充的 base64 凭据。某些 HTTP 客户端会省略 Authorization: Basic 头中的末尾 = 填充,这此前会导致身份验证失败。#98392 (Amos Bird).
  • 修复了在合并 parts 后,由于 min-max 索引边界错误,导致带有 Nullable 分区键列的分区剪枝结果不正确的问题。 #98405 (Amos Bird).
  • 修复了管道执行器中的一个罕见异常:当管道扩展与查询取消发生竞争时,可能触发 Received signal 6 (仅在调试构建中) 。#98428 (Alexey Milovidov) 。
  • 修复了在同时使用 count_distinct_optimizationQUALIFY 子句时出现的 "Column identifier is already registered" 异常。 #98433 (Alexey Milovidov).
  • 修复将 IN/NOT INLowCardinality 列参数一起使用时出现的异常 "cannot be inside Nullable type" (例如 a NOT IN (b),其中 a 的类型为 LowCardinality(String)) 。#98443 (Alexey Milovidov) 。
  • 修复了 full_sorting_merge 连接中的“管道卡住”异常:当 FilterBySetOnTheFly 优化与 MergeJoinTransform 形成循环依赖时,PingPongProcessor 中会发生死锁。#98454 (Alexey Milovidov).
  • 修复在合并具有会删除所有行的生存时间 (TTL) 的 parts,以及具有常量 GROUP BY 键的聚合投影时出现的 LOGICAL_ERROR 异常 "Projection 无法增加块中的行数"。#98458 (Alexey Milovidov) 。
  • 修复了 CROSS JOININNER JOIN USING 一起使用时触发的逻辑错误异常。#98459 (Alexey Milovidov) 。
  • 修复了当键参数为 Nullable 时,dictGetOrDefault 中空指针解引用的问题。#98460 (Alexey Milovidov).
  • 修复了这样一种情况下 DISTINCT 查询中的异常:使用聚合投影时,materialize 会导致查询与投影之间的 LowCardinality 类型不一致。#98462 (Alexey Milovidov).
  • 修复了在启用 join_use_nulls 时,于包含 OUTER JOIN 的过滤表达式中使用 arrayJoin 会触发的 LOGICAL_ERROR 异常。#98464 (Alexey Milovidov).
  • 修复在使用并行副本和 optimize_aggregation_in_order 时出现的逻辑错误异常 "副本决定以 WithOrder 模式读取,而不是以 ReverseOrder 模式读取"。 #98467 (Alexey Milovidov).
  • 修复了 ClickHouse Keeper 在处理 addWatch 请求后断开 Java ZooKeeper 客户端会话的问题。Java 客户端期望在 addWatch 响应中收到一个 4 字节的 ErrorResponse 响应体,但 Keeper 发送的是空响应体,导致触发 EOFException 并断开会话。这会导致 Apache Curator 的 CuratorCache 以及任何使用持久 watches 的 Java 应用程序无法正常工作。修复了 #98079#98499 (Antonio Andelic).
  • 修复了当跟随者宕机时,zk_followerszk_synced_followers 这两个 Keeper 指标不会减少的问题。向 mntr 四字母命令中新增 zk_learnerszk_synced_non_voting_followers 指标。修复 #54173#98504 (Antonio Andelic) 。
  • 修复了 renameAndCommitEmptyParts 中的 LOGICAL_ERROR 异常:在使用 MergeTree 事务时,TRUNCATE TABLEOPTIMIZE TABLE 并发执行可能会触发该异常。#98508 (Alexey Milovidov) 。
  • 修复了 Keeper 安全 raft 端口忽略 openSSL 配置中 cipherListdhParamsFile 的问题,此前始终使用默认值,而不是用户指定的值。关闭 #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_inquery_plan_merge_expressions = 0 时出现的异常:"Sorting column wasn't found in the ActionsDAG's outputs"。#98526 (Alexey Milovidov) 。
  • 修复了使用命名集合时 MongoDB 字典源失效的问题。解决了 #97840#98528 (Pablo Marcos) 。
  • 修复了参数替换后 Identifier 为空时触发的 LOGICAL_ERROR。#98530 (Pervakov Grigorii) 。
  • 修复在同时使用 sort_overflow_mode = 'break' 和窗口函数时出现的管道死锁问题。#98543 (Alexey Milovidov) 。
  • 修复了 Buffer 引擎在追加新块过程中处理异常时的列回滚问题。旧逻辑可能导致列的内存状态损坏。#98551 (Pavel Kruglov) 。
  • 修复了在使用 const DynamicVariant 列与 NULL 进行空安全比较 (<=> / IS NOT DISTINCT FROM) 时触发的异常 Bad cast from type ColumnConst to ColumnDynamic。同时还修复了 Dynamic/VariantNULL 进行 IS DISTINCT FROM 比较时始终错误地返回 0 的问题。#98553 (Alexey Milovidov).
  • 修复了文本索引与其他跳过索引配合使用时的问题。此前,当查询过滤条件同时使用文本索引和其他常规跳过索引时,可能会抛出诸如 "尝试获取不存在的 mark" 之类的逻辑错误。#98555 (Anton Popov) 。
  • 修复逻辑错误 "TABLE_FUNCTION 不允许出现在表达式上下文中":当带有别名的表函数在同一查询作用域内多次出现时 (例如同时出现在 PREWHEREQUALIFY 子句中) 。#98557 (Alexey Milovidov) 。
  • 修复了 PK 中包含表达式 (而非仅列) 时的分散索引分析问题 (否则会导致无法过滤远程副本上的冗余 granule) 。#98561 (Azat Khuzhin) 。
  • 当某列的子列已在其他列的默认/别名表达式中使用时,禁止删除该列;并在执行 ALTER DROP COLUMN 时,使用分析器处理默认表达式。#98569 (Nikita Mikhaylov) 。
  • 修复了 HTTP 客户端在遇到不可重试错误 (包括 HTTP_CONNECTION_LIMIT_REACHED) 时仍错误重试 S3 请求的问题。 #98598 (Sema Checherinda).
  • 修复了使用 DateTime64 进行分区剪枝时出现的小数溢出问题。#98628 (Yarik Briukhovetskyi) 。
  • 修复 JIT expression 编译中的两个错误:一是 nativeCast 类型检查中的复制粘贴错误,导致整数到整数以及浮点数到浮点数的类型转换分支无法命中;二是向 LLVM PassBuilder 传入了错误的 nullptr TargetMachine,导致无法注册目标特定的优化 Pass。 #98660 (Alexey Milovidov) 。
  • 修复了一个 RBAC 绕过漏洞:用户可通过指向 localhost 的 remote()remoteSecure()cluster()clusterAllReplicas() 对任意表执行 DESCRIBE,且无需 SHOW_COLUMNS 特权。#98669 (pufit).
  • 修复在存在 JOIN 的情况下,当非布尔表达式 (例如 sin(col)) 同时用于 WHERESELECT 时,由于过滤器下推优化破坏共享 DAG 节点而导致的 BAD_GET 异常以及错误的查询结果。#98681 (Alexey Milovidov) 。
  • 修复了在结合并行副本使用 read_in_order_through_join 时出现的 LOGICAL_ERROR "副本决定以 Default 模式读取,而不是 WithOrder" 问题。#98685 (Alexey Milovidov).
  • 修复将 input 表函数用作 remote 参数时出现的异常 "Bad cast from type DB::TableFunctionNode to DB::QueryNode"。#98694 (Alexey Milovidov) 。
  • 修复因错误清理空的覆盖型数据分区片段而导致过期数据分区片段重新出现的问题。#98698 (Shaohua Wang).
  • 修复了在 equals 比较中布尔函数返回 Variant 类型时,LogicalExpressionOptimizerPass 中发生的异常。#98712 (Alexey Milovidov) 。
  • 修复 parseDateTimeBestEffort 将以月份/星期前缀开头的单词错误解析的问题。关闭 #97965#98742 (Pavel Kruglov) 。
  • 修复在启用新 analyzer 时,对包含参数不同的 JSON 列 (例如 SKIP 字段不同) 且带有引用 JSON 子路径的 ALIAS 列的表执行 merge() 表函数或 Merge 引擎查询时出现的 UNKNOWN_IDENTIFIER 异常。关闭 #97812#98753 (Pavel Kruglov) 。
  • 修复了在 View 中使用 Distributed 存储时,分析器对 optimize_skip_unused_shards 优化的相关问题。#98754 (Nikolai Kochetov) 。
  • 修复了通过 clickhouse-client 中的 --external 传递的外部表无法按名称访问元组子列的问题 (例如,对 Tuple(a UUID, b Int32) 使用 SELECT x.a) 。关闭 #96925#98755 (Pavel Kruglov) 。
  • 修复 reverseUTF8 在无效 (截断的) UTF-8 输入时抛出异常的问题。#98770 (Alexey Milovidov) 。
  • 修复了在 OR 条件带有 false 谓词 (即 or(x, 0)) 时,无法正确检测 set 跳过索引是否有用的问题。#98776 (Azat Khuzhin) 。
  • 修复了一个 LOGICAL_ERROR 异常 (removeUnusedColumns 中的块结构不匹配) ;该问题可能会在使用 FINAL + PREWHERE + 常量 WHERE 表达式 + 与列无关的聚合函数 (如 count()) 时发生。#98778 (Alexey Milovidov).
  • 使 ClickHouse 字典自动重载相关的 system.trace_log 条目的查询 ID 不再为空。#98784 (Miсhael Stetsyuk).
  • 修复了一个崩溃问题:在 IDatabaseTablesIterator::table() 调用中对系统表进行快照后,如果在后续迭代期间另一线程修改了这些表,我们可能会对在这期间创建的系统表解引用空指针。 #98792 (Grant Holly).
  • 修复 SYSTEM START REPLICATED VIEW 无法唤醒刷新任务的问题。#98797 (Pablo Marcos) 。
  • 修复在另一个连接中使用内部包含 JOIN 的 view() 表函数时出现的“表名不一致”异常 (仅在使用旧分析器时) 。#98809 (Alexey Milovidov) 。
  • 修复了通过 pending_signals 调整 RLIMIT_SIGPENDING 时的问题。 #98829 (Azat Khuzhin).
  • 修复 loop 与集群表函数组合使用时触发的异常。#98860 (Konstantin Bogdanov).
  • 具有多个连接键列的 LEFT ANTI JOIN 在 enable_join_runtime_filters=1 (默认启用) 时返回了错误结果。#98871 (Alexander Gololobov) 。
  • 修复了在分多个块读取数据时 (例如使用较小的 index_granularity 时) ,WITH FILL STALENESS 会生成多余填充行的问题。#98895 (Alexey Milovidov) 。
  • 修复 "RPNBuilderFunctionTreeNode 有 A 个参数,却尝试获取索引 B 处的参数" LOGICAL_ERROR。#98900 (Azat Khuzhin) 。
  • 修复了因分配失败后未回滚而导致的内存跟踪漂移、nallocx(0) 的未定义行为,以及全局峰值跟踪中的差一错误。将跟踪范围扩展至 io_uring 环形缓冲区。#98915 (Antonio Andelic) 。
  • 禁止将位于用户路径之外的本地数据湖表附加到系统中,而不只是禁止创建这些表。#98936 (Daniil Ivanik).
  • 修复了一个竞态条件:在使用 urlCluster 或类似集群表函数的查询中,该问题可能导致出现 "ReadBuffer is canceled" 异常。#98955 (Alexey Milovidov) 。
  • 修复了在传入 BFloat16 类型参数时,金融函数 (financialNetPresentValuefinancialInternalRateOfReturn 等) 中触发的 LOGICAL_ERROR 异常。#98958 (Alexey Milovidov).
  • 修复在禁用查询计划表达式合并时 (query_plan_merge_expressions = 0 或 query_plan_enable_optimizations = 0) ,跳过索引 (以及主键条件) 未对 ALIAS 列生效的问题。 #98960 (Peng).
  • 在异步插入时递增 InsertQuery ProfileEvent 计数。关闭 #98626#98962 (Narasimha Pakeer) 。
  • 修复在调试构建中、当主键包含 NaN 浮点值时出现的 "Inconsistent KeyCondition behavior" 异常:使 accurateLessaccurateEquals 按照 ClickHouse 排序顺序一致地处理 NaN。关闭 #98075#98964 (Alexey Milovidov) 。
  • SummingMergeTree 不再对 Bool (以及其他域类型) 的列求和。Bool 值会保持原样,而不是进行算术求和。#98976 (Yash ).
  • 修复了在设置 optimize_const_name_sizeenable_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 列修改为 EPHEMERALALIAS 时出现的未定义行为 (空指针解引用) 。现在,这类修改会被正确地拒绝。#98985 (Alexey Milovidov).
  • 修复了一个问题:system.grantsaccess_object 列中遗漏了 URLS3 授权中的正则表达式参数。#98987 (DQ).
  • 修复了 Iceberg BigLake 读取相关问题:现在会将 ADC 凭据转发给 GCS S3 客户端 (修复 403 错误) ;发送前会先对 OAuth2 凭据进行 URL 编码 (修复包含特殊字符的令牌导致的身份验证失败) ;此外,命名空间遍历在遇到 BigLake HTTP 400 响应时也不再中止。#98998 (Nikita Fomichev) 。
  • 修复了在 TZ 环境变量使用 POSIX 文件路径语法时 (例如 TZ=:/etc/localtime) ,clickhouse-client 无法切换时区的问题。#99000 (Yash ).
  • 修复了在 FixedString 列上使用 startsWithLIKENOT LIKE 时出现错误或剪枝不足的问题。此外,当在键列外层包裹从 FixedStringString 的类型转换函数时,现在也可以对 granules 进行剪枝。关闭了 #98940#99001 (Nihal Z. Miaji) 。
  • 修复了 windowFunnel 在遇到重复事件时使用 strict_deduplication 会返回错误级别的问题。#99003 (Yash ) 。
  • 修复了一个 bug:在子查询中,EXISTS 会忽略 LIMIT 和 OFFSET 子句,导致当子查询因 offset 或 limit 为 0 而未返回任何行时,结果不正确。关闭了 #88722#99005 (andriibeee) 。
  • 修复在 GROUPING SETS 中,过滤器下推优化遇到会短路为常量的 AND 表达式时触发的“块结构不匹配”异常。#99010 (Alexey Milovidov).
  • 修复了在查询计划中读取不带 _part_offset 列的补丁分区片段 (轻量级更新) 时触发的异常。 #99023 (Alexey Milovidov).
  • SELECT * FROM table WHERE pk_id = '' 这样的查询,如果 pk_idString 类型的主键,现在会正确使用主键索引来过滤 granules。#99027 (Shankar Iyer) 。
  • 修复了 Kafka 引擎中的 DEPENDENCIES_NOT_FOUND 异常:在后台线程流式传输数据时分离 materialized view 会触发该异常。#99028 (Alexey Milovidov).
  • 修复了创建表时出现的异常:表中包含与虚拟列 (例如 _part_offset) 同名的 EPHEMERAL 列。#99031 (Alexey Milovidov).
  • 修复了通过带有 glob 模式的 url() 表函数读取不存在的压缩文件时,出现具有误导性的 "inflate failed: buffer error" 报错的问题。现在,启用 http_skip_not_found_url_for_globs 后,会按预期返回空结果。#99034 (Alexey Milovidov).
  • 修复在 schema 修改 (例如 ADD COLUMN) 后,对补丁 part 执行 ALTER TABLE ... DROP PART 时触发的服务器崩溃 (std::terminate) 问题。该崩溃是由于空覆盖 part 的元数据中缺少系统列 (_part) ,从而导致在 NOEXCEPT&#95;SCOPE 内部抛出未捕获的异常。#99036 (Peng).
  • 如果在缓存磁盘读取期间因抛出内存限制超出异常,ClickHouse 服务端进程可能会崩溃。该问题现已修复。#99042 (Shankar Iyer) 。
  • 修复了在使用 dictGet 查询同时具有 ROW POLICY 和 ALIAS 列的表时出现的 LOGICAL_ERROR。该问题是由于新 analyzer 在解析 ALIAS 列期间过早访问表表达式而导致的。#99065 (Peng).
  • 修复了这样一种越界错误:当用户尝试仅查询使用 Avro 格式存储数据的 Iceberg 表中的虚拟列时,会触发该错误。这种情况极为罕见,因此未将其标记为严重问题。修复了 #88238#99080 (alesapin) 。
  • 修复递归 CTE 中使用 remote() + view() 时出现的段错误。#99081 (Konstantin Bogdanov) 。
  • 应用按顺序读取优化时,跳过不必要的额外索引分析。#99084 (Vladimir Cherkasov) 。
  • 修复了在应用补丁 part 时因抛出内存限制异常而导致的崩溃。#99086 (Anton Popov).
  • 修复了 DDLWorker 中的调试断言问题:在重新初始化恢复过程中删除 ZooKeeper 条目后,遗留的 first_failed_task_name 会触发该问题。 #99099 (Antonio Andelic).
  • 修复了在带有生存时间 (TTL) 的合并期间重建文本索引的问题。#99107 (Anton Popov).
  • 修复 Iceberg 表引擎执行 ALTER TABLE ... REMOVE SETTINGS 查询时发生崩溃的问题。修复了 #86330#99108 (alesapin) 。
  • 修复了 query_plan_convert_any_join_to_semi_or_anti_join 优化中的一个缺陷,该缺陷会导致不匹配的行返回错误结果。相关:https://github.com/ClickHouse/ClickHouse/pull/95995。 #99112 (Yarik Briukhovetskyi).
  • 修复 ASTColumnsExceptTransformer::transform 中的 LOGICAL_ERROR 异常。#99119 (Pablo Marcos) 。
  • 修复了一个 RBAC 绕过问题:用户可在不具备所需源访问特权的情况下,通过表函数 (mysql()postgresql()sqlite()arrowFlight()jdbc()odbc() 等) 上的 DESCRIBE TABLECREATE TABLE AS 获取表结构。对于会从远程服务器推断 schema 的函数,这还允许在未经授权的情况下触发出站连接 (SSRF) 。#99122 (pufit) 。
  • 修复 Keeper 在动态重配置和领导权移交期间崩溃 (NuRaft 中的段错误) 的问题。 #99133 (JIaQi Tang).
  • 修复了在目标端不支持 SAMPLE 时,使用带有 SAMPLE 的 Buffer 表会发生崩溃的问题。#99141 (Kseniia Sumarokova).
  • 修复了因补丁分区片段列顺序不一致而导致的 LOGICAL_ERROR。 #99164 (Pablo Marcos).
  • 修复了一个极其罕见的崩溃问题:当 Iceberg 表包含混合格式 (ORC 和 Parquet) 的文件时,可能会发生崩溃。修复 #88126#99168 (alesapin) 。
  • 修复在备份/恢复时未应用 max_execution_time 的问题。#99205 (Kseniia Sumarokova) 。
  • 修复了在未使用 ORDER BY ALLINSERT SELECT 查询中,insert_deduplication_token 被静默忽略的问题。此前,对于未排序的 INSERT SELECT,去重会被完全禁用,即使提供了显式的用户标记也不例外。现在,无论是否使用 ORDER BY ALL,只要提供 insert_deduplication_token 就足以启用去重。#99206 (Desel72).
  • 修复了 InverseDictionaryLookupPass 优化期间过多的访问检查:在该 pass 开始前仅检查一次 CREATE_TEMPORARY_TABLE 权限,而不是对每个访问到的节点都进行检查。#99210 (Mikhail Artemenko).
  • 修复 clickhouse format --obfuscate 在混淆跳过索引类型、压缩编解码器名称、数据库引擎名称以及字典布局/来源定义时生成无效 SQL 的问题。#99260 (Raúl Marín) 。
  • 修复了一个问题:在某些情况下,Time[64]DateTime[64] 类型之间的比较行为容易引起混淆;现在,遇到这类情况时,会通过添加日期部分 1970-01-01,将 Time[64] 值提升为 DateTime[64]#99267 (Yarik Briukhovetskyi) 。
  • 收紧 DDL worker 中分布式 DDL 查询的设置约束。#99317 (Pablo Marcos) 。
  • 修复 TOTP 身份验证中的一些小问题:--one-time-password CLI 选项在密码为空时的处理,以及对 <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).
  • 在文本索引分析中,已移除对否定函数 (notEqualsnotLikenotIn) 的支持。这些函数本来就无法跳过任何 granules,因此为它们分析索引只会增加额外开销,而没有任何收益。#99393 (Anton Popov).
  • 修复了在 IN 子查询中使用 Distributed 表时,新分析器无法正确处理 optimize_skip_unused_shards 的问题。#99436 (Nikolai Kochetov) 。
  • 修复了当查询产生重复列名时,INTERSECT/EXCEPT 中的 heap-use-after-free 问题。#99471 (Alexey Milovidov) 。
  • 修复了在将带类型的查询参数作为 part 名称使用时,ALTER TABLE ... DROP PART 中的逻辑错误。#99489 (Alexey Milovidov) 。
  • 修复了在通过别名同时于 SELECTWHERE 子句中引用文本索引谓词 (例如 hasAllTokens) 时触发的 NOT_FOUND_COLUMN_IN_BLOCK 异常。#99504 (Anton Popov) 。
  • 修复在对具有各自独立文本索引的多列跨列使用 OR 时,hasAllTokens 返回错误结果的问题。#99505 (Anton Popov).
  • clickhouse-local 中初始化 page cache,以使 page_cache_max_size 设置生效。#99510 (Alexey Milovidov) 。
  • 修复了一个罕见问题:在执行 DETACH/ATTACH TABLE 查询后,数据分区片段会被误标为损坏,并被分离。 #99529 (Anton Popov).
  • 修复了通过 HTTP 接口使用 Pretty 格式查询空系统表时触发的 std::length_error 异常。 #99541 (Alexey Milovidov).
  • 修复了在使用 ALTER TABLE ADD COLUMN 创建与虚拟列同名的 EPHEMERAL 列 (例如 _part_offset) 时触发的 LOGICAL_ERROR#99549 (Alexey Milovidov).
  • 修复因缓存键不匹配导致 VectorSimilarityIndexCache 条目在 part 移除后始终不会被逐出的问题。#99575 (Seva Potapov).
  • 禁止从本地文件中读取 Google 凭据。此设置存在安全风险,因为一旦知道文件路径,就可能读取其他凭据。#99584 (Konstantin Vedernikov) 。
  • 修复分析器中的性能劣化问题。裁剪 ARRAY JOIN 中未使用的列。#99587 (Dmitry Novik) 。
  • 修复了在已存在轻量级删除和行策略的表中读取텍스트 인덱스时的问题。 #99661 (Anton Popov).
  • 修复 Parquet 读取器中的 nullptr 解引用问题:当解码器中的过滤路径遇到已过滤掉的页面时,会触发该问题。关闭 #99676#99677 (Alexey Milovidov) 。
  • 修复了 AsynchronousReadBufferFromFileDescriptor 在使用 O_DIRECT 时错误的 seek。关闭 #99358#99678 (Pavel Kruglov) 。
  • 修复了解压格式错误的压缩数据时,CompressionCodecT64 中的 heap-buffer-overflow 和 CompressionCodecMultiple 中的进程异常终止问题。这两个问题均由新的 libFuzzer 目标发现。现在这些编解码器会抛出异常,而不是发生崩溃。#99680 (Rahul).
  • 将处理推迟到服务器完成所有表加载之后。#99700 (Seva Potapov) 。
  • 修复 MySQL 字典源在内联 DDL 参数下绕过 RemoteHostFilter 的问题。#99720 (Shaohua Wang) 。
  • 修复遍历 system.tables 中数据湖表时的逻辑错误。#99739 (Konstantin Vedernikov) 。
  • 修复了带有预处理器的文本索引在分析使用 IN 函数的谓词时的问题。修复了文本索引中搜索标记发生冲突的问题,这可能导致结果错误。#99755 (Anton Popov) 。
  • 修复读取形状维度为负数的 Npy 格式文件时出现无限循环的问题。#99812 (Desel72).
  • 修复了在计算查询计划头部信息时,CRC32 函数以零行对 FixedString 参数求值时出现的 global-buffer-overflow。 #99835 (Alexey Milovidov).
  • 修复在 Iceberg 表上执行 ALTER TABLE ... MODIFY COLUMN ... COMMENT 时因空指针解引用导致的崩溃。#99838 (Desel72) 。
  • 修复 aggregate_functions_null_for_empty 设置,使其适用于返回非 Nullable 类型 (如 ArrayMap) 的聚合函数 (例如 groupArraysumMap) 。#99839 (Alexey Milovidov) 。
  • 修复了以混合有符号/无符号整数类型调用 midpoint 函数时触发的 LOGICAL_ERROR 异常。#99867 (Alexey Milovidov).
  • 修复了以下情况下查询中出现的“Block structure mismatch”异常:HAVING 子句的过滤表达式同时包含被会产生 NULL 的函数包裹的聚合以及 materialize(0)#99915 (Alexey Milovidov) 。
  • 修复了 sipHash128Keyed (以及类似的带键哈希函数) 中的断言失败问题:当数据参数为键中包含数组或其他嵌套数组类型的 Map 时,会触发该问题。#99921 (Alexey Milovidov).
  • 修复了使用 convertAnyJoinToSemiOrAntiJoin 优化查询计划时,IN 函数中的 LOGICAL_ERROR 异常 "Not-ready Set"。 #99939 (Alexey Milovidov).

构建/测试/打包改进

  • 通过移除重量级头文件引用,并将高开销的模板实例化移出头文件,缩短编译时间。#97893 (Raúl Marín).
  • 通过缩减模板分派矩阵并移除重量级引用,缩短算术函数及相关头文件的编译时间。#98204 (Raúl Marín).
  • 使用 mongo-c-driver 2.2.2。#98304 (Konstantin Bogdanov).
  • 使用 postgres REL_18_3。#98306 (Konstantin Bogdanov).
  • 为 UBSan 构建启用 jemalloc 分配器,以避免因 glibc malloc 内存回收能力较差而导致 RSS 持续累积。#98444 (Alexey Milovidov).
  • 使用 Rust v0 符号修饰,并从 PRQL 库中剥离内部符号,以减少解析器组合子库导致的符号名膨胀。#98446 (Alexey Milovidov).
  • tests/benchmarks 添加 TPC-H 基准测试套件和 TPC-DS README。#98495 (Raufs Dunamalijevs).
  • 为全部 99 个 TPC-DS 查询添加正确性测试。#99204 (Raufs Dunamalijevs).
  • 添加一个用于复现离线副本 bug 中 DDL CREATE TABLE + ALTER 问题的集成测试 (#44070) ,并将其标记为预期失败。#99259 (Raufs Dunamalijevs).
  • 集成带有 je_ 前缀的 jemalloc,并移除对链接器 --wrap 的使用。#99342 (Azat Khuzhin).

ClickHouse 发布 26.2,2026-02-26。 演示, 视频

不兼容变更

  • 默认情况下,所有插入都会开启去重。此前,异步插入和 MV 默认关闭去重,而同步插入默认开启。此更改的目标是让这两种插入方式使用相同的默认值。如果你在集群上显式禁用了去重,则必须显式设置 deduplicate_insert='backward_compatible_choice' 以保持旧行为。deduplicate_blocks_in_dependent_materialized_views 也是如此。#95970 (Sema Checherinda).
  • 优化了统计信息的存储格式。现在,所有统计信息都存储在单个文件中。#93414 (Anton Popov) 。如果你未显式启用表统计信息,可忽略此项。
  • 限制 S3(Azure)Queue 的内存元数据。系统表已从 azure_queue 重命名为 azure_queue_metadata_cache,并将 system.s3queue 重命名为 s3queue_metadata_cache#95809 (Kseniia Sumarokova) 。
  • 此前,将函数应用于 Variant 列时,如果变体子类型与函数不兼容,会静默返回 NULL;现在则会抛出异常,这可能导致依赖这种静默 NULL 行为的查询失效。#95811 (Bharat Nallan).
  • 来自 PostgreSQL 的 DATE 列现在在 ClickHouse 中会被推断为 Date32 (在之前的版本中会被推断为 Date,这会导致超出较小范围的值发生溢出) 。现已允许将 Date32 值插入回 PostgreSQL。关闭 #73084#95999 (Alexey Milovidov).
  • do_not_merge_across_partitions_select_final 设置的语义现在更加清晰。此前,如果未在配置中显式设置该参数,此功能可能会被自动启用。这一行为反复引发困惑,而且遗憾的是,还导致了生产环境中的一些问题。现在规则更简单了:do_not_merge_across_partitions_select_final=1 会无条件启用该功能。如果 do_not_merge_across_partitions_select_final=0,则仅在新设置 enable_automatic_decision_for_merging_across_partitions_for_final=1 时才会使用自动决策,否则不会使用。为尽可能保留旧行为,默认值设为 do_not_merge_across_partitions_select_final=0enable_automatic_decision_for_merging_across_partitions_for_final=1#96110 (Nikita Taranov) 。
  • 现在,在创建显式指定列的 S3 表时,ClickHouse 会验证这些列名是否确实存在于远程 File 的 schema 中。此前使用不匹配列名时仍可正常运行的查询,现在会在建表时失败。这解决了 #96089#96194 (Konstantin Vedernikov) 。
  • 禁止在 ORDER BY 及其他表键表达式中使用子查询。 #96847 (Alexey Milovidov).
  • 默认启用 apply_row_policy_after_final。最初,当 optimize_move_to_prewhere_if_final=0 时,ROW POLICY 和 PREWHERE 都遵循 FINAL,并在 FINAL 之后应用。这一行为被 #87303 破坏了:该变更在 ROW POLICY 过滤条件中忽略了 optimize_move_to_prewhere_if_final。为修复此问题,此 PR 启用了在 #91065 中引入的设置 apply_row_policy_after_final。启用 apply_row_policy_after_final 后,ROW POLICY 将继续像之前一样默认遵循 FINAL。此 PR 是一项不兼容变更,因为它改变了 optimize_move_to_prewhere_if_final=1 时的行为。现在,若要让 ROW POLICY 在 FINAL 之前应用,应使用 apply_row_policy_after_final,而不是 optimize_move_to_prewhere_if_final#97279 (Nikolai Kochetov) 。
  • Date 类型现在在 Arrow/ArrowStream 格式中会序列化为 Arrow 原生的 date32 类型,而不再是 uint16。PyArrow 等工具现在会正确地将该列识别为日期类型。旧行为可通过 output_format_arrow_date_as_uint16 设置恢复。对于旧版 Arrow File (其中 Date 列使用 uint16) ,仍然支持读取。#96860 (Alexey Milovidov) 。

新特性

  • 用户现在可以直接在 ClickHouse 中使用 ClickStack (一款可观测性 UI) ,这对调试和本地开发很有帮助。#96597 (Aaron Knudtson) 。
  • 支持将基于时间的一次性密码 (TOTP) 作为身份验证方式。#71273 (Vladimir Cherkasov) 。
  • 添加 lazy_load_tables 数据库设置。启用后,表不会在数据库启动时加载——而是改为创建一个轻量级的 StorageTableProxy,并在首次访问时才实例化实际的表引擎。#96283 (xiaohuanlin).
  • 新增了 input_format_max_block_wait_ms 设置,以便在达到超时时间时输出数据块,并允许在 HTTP 连接意外关闭时继续处理剩余数据。#94509 (Mostafa Mohamed Salah).
  • Google BigLake 目录集成。#95339 已关闭。#97104 (Konstantin Vedernikov) 。
  • 新增系统表 system.tokenizers,用于显示所有可用的 tokenizer。#96753 (Robert Schulze) 。
  • 新增系统表 system.user_defined_functions,用于监控 UDF 导入状态及配置。#90340 (Xu Jia) 。
  • 新增了 system.jemalloc_stats 表,通过 malloc_stats_print 暴露 jemalloc 内存分配器的统计信息,用于诊断使用 jemalloc 构建的服务器上的内存使用情况。还在 ClickHouse HTTP 接口中新增了 /jemalloc.html HTTP 端点,用于对这些统计信息进行交互式可视化。#97077 (Antonio Andelic).
  • 新增 system.jemalloc_profile_text 表,用于读取和分析 jemalloc 堆 profile。输出格式由 jemalloc_profile_text_output_format 设置控制 (raw、symbolized 或 collapsed;默认值为 collapsed) 。内联帧解析由 jemalloc_profile_text_symbolize_with_inline 控制 (启用时会包含内联帧,但会降低符号化速度;禁用时会跳过内联帧,以加快输出) 。对于 collapsed 格式,jemalloc_profile_text_collapsed_use_count 控制栈是按存活分配 count (true) 还是按存活字节数 (false,默认值) 加权。这使得对 jemalloc 堆 profile 进行内存分析和火焰图可视化更加方便。修复了 #93248#97218 (Antonio Andelic) 。
  • 添加 default_dictionary_database 设置,使 ClickHouse 能够在指定的默认数据库中解析未带数据库限定符的外部字典引用。这简化了从 XML 定义的全局字典迁移到 SQL 定义的按数据库划分字典的过程,从而使现有的字典查询 (例如 dictGet(&#39;name&#39;, …)) 无需修改即可继续工作。#91412 (Dmitrii Plotnikov) 。
  • 支持为 DatabaseReplicated 配置辅助 ZooKeeper。#91683 (RinChanNOW).
  • 实现新的表函数 primes 和新的系统表 system.primes,其中包含按升序排列的质数。关闭 #90839#92776 (Nihal Z. Miaji) 。
  • 异步插入支持并行 quorum。已插入的数据会复制到 quorum 副本。如果发现重复项,查询会等待先前已插入的数据也完成复制。#93356 (Sema Checherinda).
  • 新增了 functions colorOKLABToSRGBcolorSRGBToOKLAB,用于在 sRGB 与 OKLAB 之间相互转换值。#93361 (Pranav Tiwari) 。
  • 新增 deduplicate_insert 设置,用于覆盖 insert_deduplicateasync_insert_deduplicate#94413 (Sema Checherinda) 。
  • 服务器设置 insert_deduplication_version 支持迁移到统一的去重哈希。#95409 (Sema Checherinda).
  • 新增 xxh3_128 哈希函数。#96055 (Raúl Marín) 。
  • 新增了 OPTIMIZE <table> DRY RUN PARTS <part names> 查询,可在不提交结果 part 的情况下模拟合并。这在测试场景中可能很有用:验证新版本中的合并正确性、确定性复现与合并相关的 bug,以及可靠地对合并性能进行基准测试。#96122 (Anton Popov) 。
  • 新增一项默认启用的检查,可通过设置 check_named_collection_dependencies 防止删除被表使用的命名集合。#96181 (Pablo Marcos) 。
  • 新增了 system.fail_points,用于检查服务器中现有的 failpoint 及其是否已启用。这将有助于实现测试自动化。#96762 (Pedro Ferreira).
  • 为 Glue 目录添加基于角色的访问控制。使用设置 aws_role_arn,并可选使用 aws_role_session_name#90825 (Antonio Andelic).
  • 新增设置 add_minmax_index_for_temporal_columns;启用后,会自动为所有 DateDate32TimeTime64DateTimeDateTime64 列创建 minmax 索引。#93355 (Michael Jarrett) 。
  • 支持 JOIN 的扩展表别名 (例如 SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b 这样的查询) 。已关闭 #95131#95331 (Yarik Briukhovetskyi) 。
  • Iceberg 表新增支持 ALTER TABLE RENAME COLUMN。此前仅支持 ADD COLUMN, DROP COLUMN, and MODIFY COLUMN#97455 (murphy-4o) 。

实验性功能

  • 文本索引现已 GA。#96794 (Robert Schulze).
  • 用于量化位打包向量存储 (用于近似最近邻搜索) 的 QBit 数据类型现已一般可用,且不再需要启用实验性设置。#95358 (Raufs Dunamalijevs).
  • ClickHouse 中的向量搜索现在可以使用集群中的副本来_分担_向量索引 parts 的负载并执行搜索。这使 ClickHouse 能够支持超出单台 VM 内存容量的大型向量索引。#95876 (Shankar Iyer).
  • 新增由 ast_fuzzer_runsast_fuzzer_any_query 设置控制的服务端 AST fuzzer。启用后,服务器会在每个查询正常执行后,对其运行随机变更版本,并丢弃结果。#97568 (Alexey Milovidov).
  • 在实验性的 KQL 方言中新增 iif 函数。#94790 (happyso).
  • schema 推断 现已遵循 allow_experimental_nullable_tuple_type。启用后,它允许推断出的元组类型为 Nullable(Tuple(...)),这样缺失的嵌套对象可以变为 NULL,而不是变成由 NULL 元素组成的元组。#95525 (Nihal Z. Miaji).
  • use_statistics_cache 设置现已默认启用,因此列统计信息会缓存在内存中,以加快查询优化速度,而无需从每个分区片段重新加载。#95950 (Han Fei).

性能优化

  • 允许使用主键中的任意确定性表达式来进行数据跳过 (例如 ORDER BY cityHash64(user_id)/ ORDER BY length(user_id)) 。对于确定性表达式,ClickHouse 可以将该表达式应用到查询中的常量上,并在主键索引中使用结果来处理 =INhas 等谓词。如果该表达式还是单射的 (例如 ORDER BY hex(p)ORDER BY reverse(tuple(reverse(p), hex(p)))) ,则索引也可有效用于其否定形式:!=NOT INNOT has。已关闭 #10685。已关闭 #82161#92952 (Nihal Z. Miaji) 。
  • 优化了统计信息的存储格式。现在,所有统计信息都存储在单个文件中。#93414 (Anton Popov) 。
  • 支持对文件系统缓存中的远程表引擎/函数进行并行读取。 #71781 (Kseniia Sumarokova).
  • 允许在本地 File 和对象存储表函数中使用用户态页面缓存。#77874 (Michael Kolupaev) 。
  • 避免用户态页面缓存中不必要的 memcpy。#77884 (Michael Kolupaev).
  • concurrent_threads_scheduler 的默认值现已由 fair_round_robin 改为 max_min_fair。通过优先处理分配槽位较少的查询,这项更改提升了高负载下的公平性,从而避免短时运行的查询因长时间运行的查询而受到不利影响。#95300 (Sergei Trifonov).
  • 如果 FINAL 查询使用主键条件进行筛选,并对其他条件使用 skip 索引,PrimaryKeyExpand 处理步骤现在将只检查初步筛选出的主键范围是否存在交集。#94903 (Shankar Iyer).
  • 当并行副本与 s3(...) 等表函数配合使用时,若查询中只有一个封装该表函数的子查询,现在也会自动在各副本间并行执行;而此前只有直接引用表函数的查询才会并行执行。关闭 #92264#96332 (phulv94).
  • 支持将 cache 中的数据和系统 File 在缓存中拆分为独立段。#87834 (MikhailBurdukov).
  • 通过为 ColumnVector::replicate 实现动态分派,加速部分哈希连接操作。#79573 (Raúl Marín) 。
  • 复杂谓词场景下并行 hash join 的性能提升。此前,未 join 的行仅由单个线程处理,这并不理想;此次优化旨在将未 join 行的处理并行化到多个线程中。可通过 parallel_non_joined_rows_processing 设置进行切换。默认启用。 #92068 (Yarik Briukhovetskyi).
  • 小幅优化 JSON 类型的解析。#93614 (Pavel Kruglov) 。
  • 优化 AST 的内存占用。在未使用高亮且不进行 VALUES 解析时,此项优化是合理的。#93974 (Ilya Yatsishin).
  • 优化具名 Tuple AST 对象的内存占用。将列名以字符串形式存储在 tuple 对象中,而不是存放在通用 AST 字面量节点中。#94704 (Ilya Yatsishin) 。
  • 通过增加额外的链接器选项,改进了去虚拟化效果。#94737 (Nikita Taranov) 。
  • 通过对 ZooKeeper 请求进行批处理,提升拥有大量 parts 的 ReplicatedMergeTree 表的副本克隆性能。#94847 (c-end) 。
  • 当读取步骤中已有 PREWHERE 过滤器时,就无法再添加新的过滤器。此次变更将 PREWHERE 优化推迟到 JOIN 运行时过滤器优化之后,以便也能将运行时过滤器下推到 PREWHERE。#95838 (Alexander Gololobov) 。
  • 通过在 x86 上使用动态分派,加快 T64 codec 压缩速度。 #95881 (Raúl Marín).
  • 在可能的情况下 (非 null、非 -If、无 GROUP BY、无 IPv6 或 String) ,通过批次插入加快数值类型上 uniq 的执行速度。#95904 (Raúl Marín) 。
  • Keeper 的底层优化:ZooKeeper::observeOperations 已被发现占 ZooKeeper 接收线程 CPU 消耗的 >20%。此变更通过以下方式解决该问题:1. 对于 AggregatedZooKeeperLog::stats,使用 CityHash64 替代 SipHash,前者速度快 >10 倍。2. 对于 Coordination::ErrorCounter,使用 std::array<std::atomic<UInt32>, N> 替代 std::unordered_mapstd::mutex#95962 (Miсhael Stetsyuk) 。
  • 取消 ProfileEvents::Counter 的 64 字节对齐,以节省内存。#96097 (Azat Khuzhin) 。
  • 内存优化:将 CachedOnDiskReadBufferFromFile 结构体大小缩小 50 倍。#96098 (Azat Khuzhin) 。
  • 如果 hash table 为空,扩容时不要复制旧数据。#96180 (Raúl Marín) 。
  • RIGHT OUTER JOIN 提供 JOIN 运行时过滤器支持。#96183 (Hechem Selmi) 。
  • 优化项 enable_join_runtime_filters 现已默认启用。#89314 (Alexey Milovidov) 。
  • 此前,文本索引直接读取优化仅在所有 parts 都具有已物化的文本索引时才会应用。此 PR 增加了部分支持:如果某些 parts 具有已物化的文本索引,这些 parts 将使用它,而没有已物化文本索引的 parts 则会回退到执行原始过滤表达式。#96411 (Anton Popov).
  • 在系统日志表的时间列上添加了 minmax 次级索引,并在 query_id/initial_query_id 列上添加了 bloom_filter 索引,以加快过滤。#96712 (Alexey Milovidov) 。
  • 现在,lazy materialization 优化已应用于 UNION ALL 查询的所有分支,而不再仅限于第一个分支。对于通过 UNION ALL 组合来自不同 MergeTree 表的多个已排序且数量受限的读取操作的查询,现在每个分支都能受益于延迟列读取,从而减少 I/O。#96832 (Federico Ginosa) 。
  • 通过移除一次不必要的数据复制,并为数值列启用向量化的最小/最大值计算,优化了 INSERT 期间 minmax 跳过索引的计算。#97392 (Raúl Marín) 。
  • 存储 DeltaLake 现在会从 delta lake 元数据中获取 count() 的结果,并在 system.tables 中显示正确的表统计信息 (总字节数/总行数) 。#96190 (Kseniia Sumarokova).
  • 如果是从 MergeTree 读取,未使用的列也会在读取步骤中被删除。当过滤条件被下推到 PREWHERE 时,这一优化尤其有用。#89982 (János Benjamin Antal).
  • 优化了 SHOW TABLES 查询的处理:仅获取表名,并改进了 getLightweightTablesIterator,使其返回仅包含表名的结构。解决了 #93835#94467 (Smita Kulkarni) 。
  • 改进 assumeNotNullcoalesceifNull,使得当键列被这些函数包裹时,范围谓词也能启用主键和跳数索引裁剪。关闭 #94689#94754 (Nihal Z. Miaji) 。
  • 为 Keeper 的 getChildren 请求添加 with_data 和 with_stat 扩展。这样一来,一次操作即可不仅获取子节点列表,还能获取其 stat 和/或 data#94826 (Nikolay Degterinsky) 。
  • 无论最终执行的是本地计划还是包含并行副本的计划,索引分析通常都只需执行一次。#94854 (Nikita Taranov) 。
  • 支持根据 parts 的数量 (distributed_index_analysis_min_parts_to_activate) 和索引大小 (distributed_index_analysis_min_indexes_size_to_activate) 启用分布式索引分析。#95216 (Azat Khuzhin).
  • 为 Iceberg 表启用 PREWHERE 优化。#95476 (Konstantin Vedernikov) 。
  • 降低部分 AST 类的内存占用。#95514 (Raúl Marín) 。
  • 限制在启用 split_intersecting_parts_ranges_into_layers 时生成的管道流数量,以避免内存占用过高。#96478 (Nikita Taranov) 。
  • 为多个 join 实现等价 Set 优化。包含多个连续 INNER JOIN 操作的查询现在可受益于改进后的过滤条件下推优化。当表在等价列上进行连接时 (例如,t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10) ,应用于该链中任意表的过滤条件都会自动下推到所有表。关闭 #96550#96596 (Vladimir Cherkasov) 。
  • 优化 delta lake 元数据扫描。采用了 delta-kernel PR https://github.com/delta-io/delta-kernel-rs/pull/1827 中的更改。#96686 (Kseniia Sumarokova) 。
  • 在 Replicated database 中,不要针对每个 dummy 查询都更新已缓存的集群。#96897 (Tuan Pham Anh).
  • 如果前缀仅包含 ASCII 字符,则在使用 startsWithUTF8 进行过滤时可使用主键索引。#97055 (vkcku) 。

改进

  • 为 Keeper 请求添加 OpenTelemetry 追踪。#91332 (Miсhael Stetsyuk) 。
  • 新增配置选项:logger.startup_console_levellogger.shutdown_console_level,分别用于在 ClickHouse 启动和关闭期间覆盖控制台日志级别。#95919 (Garrett Thomas) 。
  • 重新加载配置时,遵循命令行覆盖参数。关闭 #80294#80295 (Alexey Milovidov) 。
  • 允许在 mongodb 表函数中通过键值对覆盖命名集合参数。#89616 (vanchaklar) 。
  • 针对 Iceberg 表的按顺序读取优化现在可与 icebergBucketicebergTruncate 等复杂排序函数配合使用,而不再仅限于简单的列引用。#90256 (Konstantin Vedernikov) 。
  • 在 system.mutations 中新增一个名为 parts_postpone_reasons 的列,以改进诊断,显示 parts 被延后的原因。#92206 (Shaohua Wang) 。
  • 跟踪 DataflowStatisticsCache 中待读取行数的变化 (由插入/删除或查询条件缓存的使用导致) 。 #93636 (Nikita Taranov).
  • 支持 SYSTEM RESET DDL WORKER [ON CLUSTER] 查询。该查询会请求重置 DDLWorker 主线程中的状态。当主机 ID 更新时,这有助于刷新副本的活跃状态。#93780 (Tuan Pham Anh).
  • system.part_log 现已为 MUTATE_PARTMUTATE_PART_START 事件类型支持 mutation_ids#93811 (Shaohua Wang).
  • 后台操作 (Mutate、Merge) 现在可以通过 'background' profile 单独配置。此前,这类操作通过 'default' profile 与常规查询共享 settings。#93905 (Arsen Muk) 。
  • system.crash_log 增加更多信息。#94112 #95857 (Miсhael Stetsyuk) 。
  • 新增了 QueryNonInternal 指标,用于跟踪正在执行的非内部查询数量。该指标以 ClickHouseMetrics_QueryNonInternal 形式暴露,可帮助运维人员针对仅适用于非内部查询的 max_concurrent_queries 限制监控查询并发度。#94284 (Ashwath Singh) 。
  • 支持在 RuntimeDataflowStatisticsCacheUpdater 中收集来自 compact parts 的列输入字节统计信息。#94626 (Nikita Taranov) 。
  • 新增一项检查,用于检测会导致集群组建失败的 Keeper 配置错误。关闭了 #60932#94682 (Konstantin Bogdanov) 。
  • 改进在分区片段导入期间对 JSON 前缀的反序列化处理。#94848 (Pavel Kruglov) 。
  • 使用完整的 INSERT 管道重构写入流程,从而触发目标表上的 materialized views。#94890 (Kai Zhu) 。
  • 仅在搜索列存在索引时,才使用向量相似性搜索的计划优化。#94998 (Eduard Karacharov) 。
  • 在用户身份验证之前检查总内存限制;如果总限制超过允许值,则抛出 (total) memory limit exceeded#95003 (Nikolai Kochetov) 。
  • 新增了 throw_on_unmatched_row_policies 配置选项;启用后,如果用户查询某个表,而该表配置了行策略但没有任何一条适用于该用户,则会抛出异常,从而避免因访问控制配置错误而产生返回所有行这一含义模糊的行为。#95014 (Vitaly Baranov) 。
  • 在使用 Unity Catalog 的长时间运行查询中动态更新 S3 访问 token。此更改关闭了 #93981#95069 (Konstantin Vedernikov) 。
  • 如果 ClickHouse 持续处于内存压力下达 memory_worker_decay_adjustment_period_ms 毫秒,则禁用 jemalloc 的脏页衰减;如果 ClickHouse 在相同时间内恢复到正常工作状态,则重新启用 jemalloc 的脏页衰减。#95145 (Antonio Andelic) 。
  • 支持 S3Queue 使用 s3Queue 的 keeper_path 设置作为辅助 ZooKeeper。#95203 (Diego Nieto).
  • 使 TTL drop part merge 遵循 max_parts_to_merge_at_once#95315 (Kseniia Sumarokova).
  • 向 query_log 中新增 connection_addressconnection_port,以反映实际物理连接 (当通过代理连接且 auth_use_forwarded_address=1 时,addressport 会被替换) 。#95471 (Yakov Olkhovskiy) 。
  • 修复查询条件缓存的内存核算错误。问题的关键在于,此前未将由多个字符串组成的缓存键纳入计算 (例如 part_name、表 id 以及整个 SQL 条件) 。#95478 (Nikita Mikhaylov) 。
  • 使用嵌入式配置启动的服务器将允许操作用户和授权,并像常规配置一样将其保存到 access 目录中。这有助于改进测试。此外,还在嵌入式配置和 clickhouse-local 中启用了所有 access_control_improvements。#95481 (Alexey Milovidov) 。
  • 改进了 S3 身份验证错误消息:在访问被拒绝时,加入了提示以建议检查凭据。#95648 (Gerald Latkovic) 。
  • 启用统计信息 cache,并将 cache 的更新周期设置为 300 秒。#95841 (Han Fei) 。
  • system.aggregated_zookeeper_log 中添加组件名称。#95882 (Antonio Andelic) 。
  • system.tables 查询 DeltaLake 表时,跳过对对象存储的读取。#95899 (Antonio Andelic).
  • 如果 compatibility 设置为 26.2 或更高版本,则默认启用 enable_max_bytes_limit_for_min_age_to_force_merge#95917 (Christoph Wurm) 。
  • Delta Lake 现已可在 macOS 上使用。关闭 #95979。#95985 (Alexey Milovidov) 。
  • 在早期版本中,将相互冲突的 ALTER 表达式与 UPDATE 和 RENAME COLUMN 组合使用时,抛出的是逻辑错误,而不是恰当的异常。修复了 #70678#96022 (Alexey Milovidov) 。
  • 改进所有 ClickHouse 应用的帮助输出,添加 --no-sudo 选项,并进行了一些修复。这是对 Ilya Yatsishin#58244 的延续。#96025 (Alexey Milovidov) 。
  • cosineDistance 新增 distanceCosine 别名,因为其他所有距离函数都已有这种形式的别名。#96065 (Raufs Dunamalijevs) 。
  • 新增对 with_data Keeper 扩展的支持,以改进 Replicated 数据库中的表获取流程。 #96090 (Nikolay Degterinsky).
  • 将 chdig 更新至 v26.2.1 (新增功能并支持 MacOS) 。#96113 (Azat Khuzhin) 。
  • 改进 numbersprimes 的 filter 下推。现在,当无法根据 WHERE 条件推导出精确边界时,ClickHouse 可以推导出保守的取值范围,并据此限制序列生成 (例如,对于 WHERE number % 5 < 2 AND number > 100 AND number < 300,ClickHouse 只会生成 100 到 300 之间的数字,然后再应用该谓词) ,从而避免无界扫描。关闭 #84853。关闭 #93913#96115 (Nihal Z. Miaji) 。
  • 格式化器此前在存在 COMMENT 子句时,会将 SELECT 用括号括起来,以消除解析歧义。现在改为在 AS SELECT 之前输出 COMMENT,这样无需括号即可消除歧义。#96293 (Alexey Milovidov) 。
  • allow_impersonate_user config 设置现已位于 access_control_improvements 部分中,不再是独立的服务器设置。#96451 (Vitaly Baranov) 。
  • 使 core_dump.size_limit 配置项支持热重载,从而避免为使配置更改生效而必须重启服务器。#96524 (Miсhael Stetsyuk) 。
  • 改进了 CPU 分析器与实时分析器在 socket 超时场景下的互操作性。#96601 (Sergei Trifonov) 。
  • 防止在 DROP COLUMN 变更后很快执行 ADD COLUMN 时,已删除的数据重新恢复。#96713 (Alexey Milovidov).
  • system.instrumentationfunction_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 settings) 即使在 DNS cache 被禁用时也会生效。#96810 (c-end).
  • 增强 jemalloc 自省功能。#96840 (Azat Khuzhin) 。
  • 修复了 /play Web UI 在查询系统表时抛出 QUERY_CACHE_USED_WITH_SYSTEM_TABLE 错误的问题。#96869 (Alexey Milovidov) 。
  • 改进 Web UI:更改 favicon 以指示查询正在运行的状态;显示辅助查询 (加载数据库和表) 返回的错误,而不是将其静默忽略。关闭 #85055#96883 (Alexey Milovidov) 。
  • /play UI 中的左侧面板设为可点击,以切换数据库列表。#96884 (Alexey Milovidov).
  • DROP DATABASE 现在会按依赖关系的逆序删除表,从而在数据库包含具有导入依赖关系的表时提升崩溃安全性 (例如使用 joinGetDistributed 表) 。#97057 (Alexey Milovidov) 。
  • 升级 yaml-cpp,以避免跳过无效 YAML。#97333 (Azat Khuzhin) 。
  • 在获取表时,在 play.html 侧边栏中显示加载指示器。#97531 (Alexey Milovidov) 。
  • 在内置 Web UI (play.html) 中新增了用于将原始查询结果复制到剪贴板的按钮。#97532 (Alexey Milovidov) 。
  • 修复查询混淆器 (clickhouse-format --obfuscate) ,使其在更多情况下能够生成可解析的 SQL。#97584 (Alexey Milovidov) 。

错误修复(官方稳定版本中用户可见的异常行为)

  • 在仅涉及元数据的 ALTER (例如扩展 Enums 的元素) 之后,使用 projection 进行聚合优化时可能会抛出异常。#84143 (Alexey Milovidov) 。
  • materialized views 现在使用其创建所在的数据库作为执行上下文,这意味着: - 可以省略在视图的 select query 中引用名称时对数据库的显式限定 - 如果未显式限定数据库,则默认使用创建 materialized view 时所在的同一数据库。 #88193 (Dmitry Kovalev).
  • 修复在使用 ON CLUSTER 时,CREATE USER 认证方法中查询参数的替换问题。此前,认证方法中的查询参数 (例如密码) 不会被替换,导致远程节点上出现 UNKNOWN_QUERY_PARAMETER 错误。#92777 (xiaohuanlin).
  • 修复了 hasmapContainsKeymapContainsValue 函数在文本索引分析中的不一致问题。此前,使用这些函数的查询在表达式使用或不使用文本索引进行求值时,可能会返回不同的结果。#93578 (Anton Popov) 。
  • 修复在将表附加到 MaterializedPostgreSQL 数据库时,若 dropReplicationSlot 在栈展开过程中抛出异常而引发的崩溃。#96871 (Alexey Milovidov).
  • 如果对同一批 File 执行多个相互冲突的并发备份,可能会导致服务器崩溃。#93659 (Alexey Milovidov) 。
  • 修复了使用并行副本以及与非 MT 表进行 JOIN 时的查询问题。关闭了 #92056#93902 (Igor Nikonov) 。
  • 修复了一个问题:名称中带有点号的 Iceberg 列返回值为 NULL。 #94335 (Mikhail Koviazin).
  • 修复了 stringJaccardIndexUTF8 对 UTF8 字符串的处理问题,并提升了性能。#94613 (Joanna Hulboj) 。
  • 修复 WITH FILL STALENESS 中可能出现的溢出问题 (会导致未定义行为和/或无限循环) 。修复因大跨度跳变而可能导致的无限循环。添加对旧版分析器的支持 (主要用于压力测试) 。#94663 (Azat Khuzhin) 。
  • 修复在主机名解析为多个地址且远程副本冻结时,分布式查询可能卡住的问题。#94726 (c-end).
  • 修复了对多个表表达式执行 JOIN 时出现的无效结果问题,当最左侧的表表达式为 -Cluster 表函数时。解决了 #89996#94748 (Konstantin Bogdanov) 。
  • 修复涉及 toWeektoYearWeektoStartOfWeektoLastDayOfWeektoDayOfWeek 的谓词中主键裁剪和跳数索引裁剪不正确的问题,并修复其中某些函数在对 LowCardinality(String) 执行有效查询时引发的异常。#94816 (Nihal Z. Miaji).
  • 移除对启用 SQL Security 的视图执行 ATTACH 查询时不必要的跳过权限检查行为。这样可防止用户在未验证所需访问权限的情况下附加带有 definer 的视图,从而造成潜在的权限提升。 #94865 (pufit).
  • 修复了 ReplicatedMergeTree 启动期间因并发删除 delete_tmp_* 目录导致的崩溃。#94892 (myeongjun).
  • 修复了向带有 materialized views 的 Iceberg 表执行 INSERT 时丢失去重信息并导致异常的问题。#94938 (Daniil Ivanik) 。
  • 修复了一个 bug:SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME> 会清空集群上的整个查询缓存。#94978 (Rory Crispin) 。
  • 在 Vertical 合并后保留固定的索引粒度 (use_const_adaptive_granularity) (v2,修复了 Nested 的问题,并进行了整体改进) 。#95013 (Azat Khuzhin).
  • 修复了 26.1 版本在 [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764) 之后引入的文件系统缓存竞争问题。#95042 (Kseniia Sumarokova) 。
  • 修复在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 中止 postgresql() 表函数时的问题。 #95136 (Roman Vasin).
  • 修复了在使用多个带有 USING 子句的 JOIN 时,对源表中带限定符的列进行类型推断的问题。此前,后续 JOIN 会错误地将底层源列的类型更新为共同超类型,即使该列并未参与该次 JOIN (例如,在 SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a) 中,t2.a 列仅用于第一个 JOIN,因此其类型应为 t1.at2.a 的超类型,不应包含 t3.a) 。当函数预期的列类型与执行计划中实际出现的类型不一致时,这可能会导致逻辑错误或崩溃。#95157 (Vladimir Cherkasov) 。
  • 在获取 manifest .avro 列表和 File 内容时,列转换仅执行一次。#95164 (Daniil Ivanik).
  • 修复了 JSON 列大小计算不正确的问题,此问题可能导致内存占用过高或列统计信息错误。#95207 (Azat Khuzhin).
  • 修复了在轻量级更新后应用大型补丁分区片段时内存核算不准确的问题。此前,应用大型补丁可能导致内存占用过高,并使服务器进程被 OOM 杀手终止。#95231 (Anton Popov).
  • 修复了一处未定义行为:当带有 max_parallel_replicas 的分布式查询在索引分析期间回退到本地副本时,可能会返回错误结果或抛出异常。#95263 (Azat Khuzhin) 。
  • 修复在 group_by_overflow_mode 设置为 any 时,sum 和时间序列对稀疏列进行聚合的问题。#95301 (Mikhail Koviazin).
  • 修复了 plain_rewritable 磁盘策略中的一个可靠性问题:在解除元数据 File 链接的过程中,如果中途发生网络错误,可能导致存储处于不一致状态。#95302 (Mikhail Artemenko) 。
  • 将 Iceberg 中的 Date 替换为 Date32。#95322 (Konstantin Vedernikov) 。
  • redis表函数的 password 参数现在会在日志和系统表中被屏蔽 (例如:query_log) 。#95325 (János Benjamin Antal).
  • 修复了一个 bug:在分布式查询仍在相关表上执行时,这些表仍可能被删除或修改,进而导致异常或错误结果。#95356 (Azat Khuzhin) 。
  • 修复了在某些情况下,分布式查询中使用负数 LIMIT/OFFSET 时出现的逻辑错误。#95357 (Nihal Z. Miaji).
  • 修复了一个 bug:通过 ssh 连接时,clickhouse-client 会提示输入两次密码。#95372 (Isak Ellmer) 。
  • 修复 storage S3(Azure)Queue 中的数据竞争问题。#95385 (Kseniia Sumarokova) 。
  • 修复了由 prewhere 中的 lambda 表达式引起的 prewhere filter 错误。#95395 (Xiaozhe Yu) 。
  • 修复 optimize_syntax_fuse_functions:当聚合 argument 为 Nullable 时,不再将 sum/count/avg Rewrite 为 sumCount()。关闭 #95390#95441 (Nihal Z. Miaji) 。
  • 避免在取消 distributed queries 时可能发生的崩溃。#95466 (Aleksandr Musorin) 。
  • 修复 S3(Azure)Queue 引擎流式传输中的去重问题。#95467 (Kseniia Sumarokova).
  • 修复了在分布式查询中更新分配给初始用户的行级策略时出现的问题。#95469 (Vitaly Baranov) 。
  • 修复对基于 plain_rewritable 的加密磁盘的检查 (修复可能出现的 It is not possible to register multiple plain-rewritable disks with the same object storage prefix 问题) 。#95470 (Azat Khuzhin) 。
  • mergeTreeProjection 表函数此前缺少访问检查,导致没有表 SELECT 权限 (但具有表函数权限) 的用户也可以读取其投影中的数据。此修复增加了与 mergeTreeIndexmergeTreeAnalyzeIndexes 已具备的相同访问检查。#95480 (Alexey Milovidov) 。
  • 修复读取 Dynamic/JSON 类型动态子列中的 size 子列时可能出现的逻辑错误。#95573 (Pavel Kruglov) 。
  • 修复了由 #94262 引入的 (实验性) 零拷贝复制中的回归问题:共享的 parts 可能会在其他副本完成获取这些 parts 之前被删除。#95597 (filimonov) 。
  • 修复对 JSON 数组应用 tupleElement 时发生的崩溃问题。关闭 #95581#95647 (Pavel Kruglov) 。
  • 修复在带有 USING 的 JOIN 中,在 VALUES 子句内的 lambda 函数中使用匹配器 (*) 时触发的逻辑错误异常。关闭 #93675#95661 (Vladimir Cherkasov) 。
  • 修复了在等待分布式 DDL 的同时并发删除 Replicated 数据库时出现的 There was an error: Cannot obtain error message 逻辑错误。修复 #95539#95664 (Alexander Tokmakov) 。
  • 修复了在启用 transform_null_in 时,IN 函数对 NULL 值返回错误结果的问题。关闭 #65776#95674 (Nihal Z. Miaji) 。
  • 启用设置 cast_keep_nullable 时,正确处理 CAST 中的 LowCardinality Nullable 类型。修复 #95670#95747 (Alexey Milovidov) 。
  • 修复合并已分区的 delta lake 数据时的问题。#95773 (Kseniia Sumarokova) 。
  • 修复运行时过滤器中 Nullable join 列的竞态条件。#95775 (Hechem Selmi) 。
  • 修复了在表和选择列表中的 USING 列类型不同时,带有匹配器 (*table.*) 和 analyzer_compatibility_join_using_top_level_identifier 的查询中可能出现的逻辑错误。关闭 #90477#95808 (Vladimir Cherkasov) 。
  • 修复并行线程池操作 (备份、聚合、分布式查询) 中的内存安全问题;当任务调度期间发生错误时,这些问题可能导致异常。#95818 (Raúl Marín) 。
  • 修复了在执行 DROP WORKLOAD、且同时有查询使用正在被删除的 workload 时发生的崩溃。#95856 (Alexey Milovidov).
  • 修复了以下情况下查询 system table 时性能缓慢的问题:使用的 USER 在许多数据库上仅具有有限授权。关闭了 #89371#95874 (pufit) 。
  • 修复了在具有嵌套路径的 JSON 上执行 tupleElement 时的问题,此前这可能会导致错误的查询结果。#95907 (Pavel Kruglov).
  • 修复了一个可能出现的 NOT_SUPPORTED 错误:在空的 MergeTree 表上使用 direct join 算法时,可能会触发该错误。#95935 (Vladimir Cherkasov) 。
  • 修复了客户端不会为 settings 的别名提供建议和自动补全的问题,关闭 #92190#95945 (phulv94).
  • 修复 system.asynchronous_metric_log 中 event_date 的问题。#95947 (Raúl Marín).
  • 修复了 JSON 数据类型中跳过路径的问题。此前使用 JSON(SKIP path) 时,所有以前缀 path 开头的 JSON 键都会被跳过,甚至包括 "pathpath" 这样的键,因此在 insert 期间可能导致这些路径的数据丢失。现在该问题已修复,只有键 "path" 会被跳过。#95948 (Pavel Kruglov).
  • 带有未知 projections 的分区片段不应被永久标记为丢失。#95952 (Mikhail Artemenko) 。
  • 修复 Join 表中使用 Nullable(String) 键时,空字符串变为 NULL 的问题。关闭 #71414#96002 (Alexey Milovidov) 。
  • 现在,PostgreSQL 引擎已可正确读取 BOOLEAN[]。修复了 #72754#96006 (Alexey Milovidov) 。
  • 修复了从空文件读取时 ProtobufList 格式的问题。已关闭 #70059#96007 (Alexey Milovidov) 。
  • 修复 ProtobufList 格式在空表中产生幽灵记录的问题。关闭 #72596#96010 (Alexey Milovidov) 。
  • 修复了在一种涉及分布式查询、PREWHERE 和类型推断的特殊情况下,if function 的 UInt64Int32 type 不匹配问题。关闭了 #70017#96012 (Alexey Milovidov) 。
  • 修复涉及 Bool 类型的 JIT 编译查询问题。#96013 (Alexey Milovidov) 。
  • 修复从 SQLite TEXT 列读取 UUID 列时出现的逻辑错误。关闭 #71263#96016 (Alexey Milovidov) 。
  • 修复 SQLite 引擎对 DateTimeDateUUID 及其他类型的转换问题。关闭 #73481#96017 (Alexey Milovidov) 。
  • 在针对外部数据库 SQLite 和 PostgreSQL 的查询中,FixedString 值被错误地转义。关闭 #73519。与 @jh0x 共同完成。#96019 (Alexey Milovidov) 。
  • 修复 WindowTransform 在 PRECEDING 偏移量较大时触发的断言失败。关闭了 #75852#96026 (Alexey Milovidov) 。
  • 修复了一个可能导致数据损坏的问题:当并发异步插入使用相同的参数名但参数值不同时,可能会发生数据损坏。#96035 (Seva Potapov) 。
  • 修复全局 profiler 的周期 (由 global_profiler_real_time_period_nsglobal_profiler_cpu_time_period_ns 控制) 。此前使用的是截断后的值,而不是设定值,导致 profiler 的唤醒频率高于预期。#96048 (Antonio Andelic).
  • 此前,如果用于 position delete 的 Iceberg manifest File 中,某个 entry 里存在 reference data File 但其值为 null,我们就无法获取对应 data File 的正确边界。此 PR 修复了该 bug。#96061 (Daniil Ivanik).
  • 修复撤销默认角色时的问题。 #96103 (Vitaly Baranov).
  • 修复了一种罕见情况下索引分析中的释放后使用问题:当 use_primary_key 被禁用,且使用索引的条件析取数量非常大时会触发该问题。#96112 (Alexey Milovidov).
  • 修复了 Gorilla codec 中的一个回归问题:当显式指定的大小与数据类型大小不一致,且缓冲区大小过小时,在先前版本中会在解压时抛出异常。关闭了 #78253#96118 (Alexey Milovidov) 。
  • 避免在已加载的字典中出现死锁:当某个字典引用了一个递归引用该字典的 Merge 表时,会发生这种情况。关闭 #78360#96120 (Alexey Milovidov) 。
  • 修复 formatDateTime 在使用非固定宽度 Formatter (如 MySQL 和 JODA 风格) 时读取未初始化值的问题。#96133 (Alexey Milovidov) 。
  • 设置 use_const_adaptive_granularityindex_granularity_bytes 的组合 (即“非自适应粒度”) 导致待读取行数计算错误,并引发异常。#96143 (Alexey Milovidov) 。
  • 在对象存储上的类文件表 (例如 S3 和 Azure) 上执行无效的 ALTER UPDATE 变更,可能会导致 nullptr 解引用。关闭 #92994#96162 (Alexey Milovidov) 。
  • 修复了 AccessRights::contains 在存在部分撤销时返回结果错误的问题。#96170 (pufit) 。
  • 修复了 CTE 折叠常量导致的查询条件缓存哈希冲突问题,该问题可能会导致错误的查询结果。关闭 #96060#96172 (Alexey Milovidov) 。
  • 修复 ProcessList 中可能出现的死锁。当我们向 cancellation checker 添加任务时,如果 memory overcommit tracker 被触发,可能会因潜在的锁顺序反转而导致该问题。#96182 (Antonio Andelic) 。
  • 修复了一个错误:由于非法的 JOIN 重排序,包含外连接 (LEFT、RIGHT 或 FULL) 并结合多个 INNER JOIN 的查询可能返回错误结果。当外连接的 ON 条件引用了多个此前已 JOIN 的表中的列时,优化器未能考虑所有表依赖关系,因此可能错误地对 JOIN 进行重排序,导致结果缺少行。关闭 #95972#96193 (Vladimir Cherkasov) 。
  • 当表未定义统计信息时,ClickHouse 不应尝试导入这些统计信息。这样可避免因检查统计信息 File 是否存在而带来的一些额外开销 (100+ 毫秒) 。 (问题 #96068) 。#96233 (Han Fei) 。
  • 修复 optimize_syntax_fuse_functions:当聚合参数为 LowCardinality(Nullable) 时,不再将 sum/count/avg 重写为 sumCount()。关闭 #95390#96239 (Nihal Z. Miaji) 。
  • 修复了在某些情况下 not INnot has 函数分区裁剪错误的问题。#96241 (Nihal Z. Miaji).
  • 修复向量相似度索引中的 stack-use-after-scope 问题。#96259 (Alexey Milovidov) 。
  • 修复了当查询前有 SQL 注释时,测试运行器无法识别错误提示注释的问题。#96336 (Yakov Olkhovskiy) 。
  • 修复了在以下情况下 KeyCondition 中的逻辑错误:表的主键为 Nullable,且查询使用了coalesce函数,并且其第一个参数为常量。#96340 (Alexey Milovidov) 。
  • GROUPING SETSgroup_by_use_nulls 以及内部包含 LowCardinalityTuple 数据类型之间的相互作用,可能会在查询管道中产生非预期的数据块结构,从而导致逻辑错误。该问题出现在引入 Nullable Tuple 之后。 #96358 (Alexey Milovidov).
  • 此前可以使用空表达式 () 作为索引创建表,从而导致无效的内存访问。#96363 (Alexey Milovidov) 。
  • 修复了旧版分析器在出现 JOIN 和重复别名时崩溃的问题。#96405 (Ilya Golshtein).
  • 修复因针对 Variant 列的错误就地过滤优化而导致的 Nested columns sizes are inconsistent with local_discriminators 错误。#96410 (Alexey Milovidov) 。
  • 修复 CREATE TABLE ... CLONE AS ... 忽略 source 表全限定名的问题。#96415 (Hasyimi Bahrudin) 。
  • 修复了在 clickhouse-client 中无法通过 KILL QUERY 和取消查询 (Ctrl+C) 取消 mysql 表函数的问题。 #96437 (Roman Vasin).
  • 修复了 max_execution_time 值较高的查询中,取消检查线程的活锁问题。#96450 (Sergei Trifonov) 。
  • 修复了在分布式查询中使用非整数 LIMIT/OFFSET 时,在某些情况下出现的逻辑错误。#96475 (Nihal Z. Miaji).
  • 修复某些包含 lambda 函数的表达式中的空指针解引用问题。#96479 (Alexey Milovidov).
  • 修复将 LowCardinality 列转换为 Nullable 时结果错误的问题。#96483 (Nihal Z. Miaji).
  • 修复了创建 Iceberg 表时,ORDER BY 子句引用不存在的列或使用位置参数而导致的崩溃。关闭 #93280#96484 (Konstantin Vedernikov) 。
  • 修复了带有 Nullable 子字段的 Tuple 列上的运行时过滤器异常。#96509 (Alexey Milovidov).
  • 修复了 Parquet V3 原生读取器中的 LOGICAL_ERROR 异常:当 PREWHERE 过滤列包含非布尔型 UInt8 值时会触发该异常。#96594 (Alexey Milovidov) 。
  • 修复复制表在元数据变更期间隐式重新生成索引的问题。#96600 (Raúl Marín).
  • 修复了执行 DROP WORKLOAD 时的数据竞争问题。#96614 (Sergei Trifonov) 。
  • 修复了 Iceberg 表写入中的一个缺陷:分区插入可能会导致数据在各分区 File 之间分布不正确。#96620 (Konstantin Vedernikov) 。
  • 修复了在包含约束的 CREATE TABLE 中出现的 heap-use-after-free 问题。#96669 (Nikita Taranov) 。
  • 验证 bech32 中的 witness version,以避免缓冲区溢出。#96671 (Raúl Marín) 。
  • 修复了在使用无效的 auth_header 设置创建数据湖 REST 目录时,system.tables 报错的问题。#96680 (Han Fei).
  • 修复了以下问题:在 TTL 合并后,如果一个数据块中的所有行都被过滤掉,_minmax_count_projection 会使 min(timestamp) 返回 epoch (1970-01-01) 。#96703 (Raquel Barbadillo).
  • 改进对 iceberg_metadata_file_path 设置项的校验,防止路径遍历,并确保指定的元数据文件位于表目录内。#96754 (Daniil Ivanik).
  • 修复了在 GROUP BY 中使用 Variant 参数时 ifNull 发生崩溃的问题。#96790 (Alexey Milovidov) 。
  • 修复了设置 table_disk=1 的表之间的 cache 键冲突问题。#96818 (Raufs Dunamalijevs).
  • 修复因竞争条件导致 MemoryWorker 的清理线程卡死的问题。#96819 (Antonio Andelic) 。
  • 不要在 Iceberg 目录中记录包含凭证的数据。#96831 (Konstantin Vedernikov) 。
  • 修复服务器发生错误后 clickhouse-client 的退出状态。#96841 (Vitaly Baranov) 。
  • 使用 CROSS JOIN 且启用并行副本的查询可能会返回错误结果。修复了 #74337#96848 (Igor Nikonov) 。
  • 修复了此前在同一列上执行轻量级更新后,ALTER TABLE DROP COLUMN 查询失败的问题。#96861 (Anton Popov) 。
  • 修复了在 plain_rewritable 对象存储磁盘上创建基于归档文件的备份 (.zip.tzst) 时发生堆栈溢出 (崩溃) 的问题。#96872 (Alexey Milovidov) 。
  • 修复了以下问题:当备份因目标文件系统磁盘已满或其他 I/O 错误而失败时,服务器会发生崩溃。 #96873 (Alexey Milovidov).
  • 修复了 EXCEPT ALLINTERSECT ALL 会忽略行的重复次数、表现得与其 DISTINCT 版本相同的问题。#96876 (Alexey Milovidov) 。
  • 修复 indexOfAssumeSorted 在使用不兼容类型调用时触发的 std::terminate 异常 (例如,IPv4 数组搭配整型搜索值) 。#96877 (Alexey Milovidov) 。
  • 修复在使用窗口函数且 group_by_use_nulls = 1 并结合 CUBE/ROLLUP/GROUPING SETS 时出现的异常 Bad cast from type DB::ColumnNullable to DB::ColumnString#96878 (Alexey Milovidov) 。
  • 修复了 JIT 已编译表达式将 DateTime 转换为 DateTime64 时产生的错误结果 (例如,在 CASE/if/multiIf 中混用 DateTime 类型时) 。此前,该值会被重新解释,而不是按正确比例缩放,导致表达式编译生效后生成错误的时间戳。#96879 (Alexey Milovidov).
  • 修复了 CoalescingMergeTree 中的逻辑错误异常:当数据跳过索引表达式生成常量列时 (例如,对整型列上的 ifNotFinite(1, c0) 使用 bloom_filter) 。#96880 (Alexey Milovidov) 。
  • 修复了在误用 HTTP 连接到已启用 TLS 的原生协议端口时,错误信息中端口号显示错误的问题。#96881 (Alexey Milovidov) 。
  • 修复了在 CTE 和子查询中,各子查询的 SETTINGS 未应用于 file 等表函数的问题。#96882 (Alexey Milovidov).
  • 修复读取 X509 证书时 BIO 对象的内存泄漏问题。#96885 (Alexey Milovidov) 。
  • 修复了查询分析器中的 LOGICAL_ERROR 异常:当在应为具体值的位置传入 lambda 表达式时,会触发该异常 (例如,将其作为 arrayFold 的累加器参数时) 。#96892 (Alexey Milovidov) 。
  • 修复对复杂嵌套类型 (包含带有 Nullable Enum 值的 Map 的 Nullable Tuple 数组) 进行类型转换时出现的 ColumnNullable is not compatible with original 异常。#96924 (Alexey Milovidov) 。
  • 修复了分片 HASHED 字典并行导入中的竞争条件,该问题偶尔会导致部分行未能导入。#96953 (Alexey Milovidov).
  • 修复了 REPLACE PARTITION 与后台变更之间的竞争条件,该问题可能导致替换后旧数据和新数据同时可见。#96955 (Alexey Milovidov) 。
  • 修复了 arrayJoin 函数在与 INNER JOIN 和 WHERE 子句一同使用时产生重复行的问题。其原因是部分谓词下推优化错误地将包含 arrayJoin 的过滤条件下推到 JOIN 之下。#96989 (Alexey Milovidov).
  • 修复 clearCaches 中的崩溃 (SEGFAULT) :BlockIO::operator= 未移动 query_metadata_cache,导致缓存的存储快照被提前销毁,并对 MergeTreeData 存储发生释放后使用。 #96995 (Alexey Milovidov).
  • 修复 IfTransformStringsToEnumPass 中的断言失败:当 iftransform 函数返回 Nullable(String) 时会触发该问题 (例如在使用 GROUP BY ... WITH CUBEgroup_by_use_nulls = true 时) 。#97002 (Alexey Milovidov) 。
  • 修复在使用带有 UNION ALLJOININSERT ... SELECT 时写入错误数据的问题:常量字符串列在数据块合并后可能会被赋予错误的值。#97019 (Hasyimi Bahrudin).
  • 修复在 ALTER TABLE MODIFY COLUMN 更改列类型后构建列统计信息时触发的 assert_cast 异常 (或在发布构建中发生静默数据损坏) 问题。#97027 (Alexey Milovidov).
  • 修复 Azure Blob 存储、SSH 协议和 Arrow Flight 接口中读取未初始化内存的问题。#97053 (Alexey Milovidov).
  • 修复了在带有 row policy/PREWHERE 和 FINAL 的查询中,查询结果受索引影响的问题。 #97076 (Yarik Briukhovetskyi).
  • 修复了 MergeTree 表中 REPLACE PARTITION 与后台变更之间仍存在的竞争条件,该问题可能导致旧数据重新出现。#97105 (Alexey Milovidov) 。
  • 修复带有别名列的隐式索引,并在创建前先进行全面验证。 #97115 (Raúl Marín).
  • 修复 FunctionVariantAdaptor 中的逻辑错误,该错误会影响需要常量参数的函数,例如 arrayROCAUC#97116 (Bharat Nallan) 。
  • 修复了这样一个问题:当 PartCheckThread 为已变更的分区片段重新将 GET_PART 入队时,会导致变更卡住,并在 parts_to_do 中留下幽灵条目。#97162 (Alexey Milovidov).
  • 修复了带有 ORDER BY ... LIMIT 的子查询在查询计划中的行数估算问题,否则可能导致优化器选择次优的 join 顺序。#97193 (Alexander Gololobov).
  • 修复了 FunctionVariantAdaptor 中的 LOGICAL_ERROR 异常:当作用于 Variant 列的函数返回 Nothing 类型时,会触发该异常;这种情况可能发生在 UNION ALL 查询中的空数组场景下。#97213 (Alexey Milovidov) 。
  • 修复了 S3 多段复制操作期间的数据竞争问题 (例如向 S3 执行 BACKUP/RESTORE 时) ,该问题在并发访问下可能导致异常。#97227 (Azat Khuzhin) 。
  • 修复了当 WHERE 子句中的 arrayJoin 引用 JOIN 两侧的列时导致的 LOGICAL_ERROR 异常。#97239 (Alexey Milovidov) 。
  • 修复在带 PREWHERE 的 Tuple 中读取稀疏 Nullable(String).size 子列时出现的 LOGICAL_ERROR 异常。#97264 (Alexey Milovidov) 。
  • 修复在使用 ORDER BY ... LIMIT 从采用非自适应索引粒度 (index_granularity_bytes = 0) 的表读取时,LazyMaterializingTransform 中出现的异常:"lazy chunk 中的行数与偏移量数目不一致"。#97270 (Alexey Milovidov) 。
  • 修复 SYSTEM RESTART REPLICA 在因非 ZooKeeper 异常 (例如内存限制) 导致表重建失败时,会使数据库中的表丢失,并导致 DatabaseReplicated 中元数据摘要不匹配的问题。#97276 (Alexey Milovidov) 。
  • system.merge_tree_settings 中的 readonly 字段现在能够正确反映某些 merge tree 设置 (例如 index_granularity) 是无条件只读的。#97277 (Robert Schulze) 。
  • 修复了在 MergeTree 表上对 count() 进行优化时发生的崩溃问题:当 storage snapshot 在无数据的情况下创建时,会触发该问题。#97281 (Pablo Marcos) 。
  • 修复了从调试信息中解析堆栈跟踪的函数名称时可能发生的崩溃。#97294 (Azat Khuzhin) 。
  • 修复 analyzer_compatibility_join_using_top_level_identifier 与 ALIAS 列相关的逻辑错误。关闭 #96228#97297 (Vladimir Cherkasov) 。
  • 修复了在配合 QUALIFY 子句使用带有文本索引的列时,applyOrder 中出现的 LOGICAL_ERROR 异常。#97313 (Alexey Milovidov) 。
  • 系统表 system.functions 现在会将内部函数的 categories 显示为 Internal,而不是空字符串 (categories = '') 。#97315 (Robert Schulze) 。
  • 使用 RIGHT JOIN 链且启用并行副本的查询可能会产生错误结果。修复了 #74341#97316 (Igor Nikonov).
  • 修复在可刷新materialized view 及其他表被重命名的场景下可能出现的误报 TABLE_UUID_MISMATCH 错误。#97323 (Azat Khuzhin).
  • 修复 StorageKeeperMap 备份中的段错误:原因是在惰性备份批次中对悬空的 storage 指针发生了释放后继续使用。#97336 (Alexey Milovidov) 。
  • 修复了在启用 mutations_execute_subqueries_on_initiator 时,ALTER UPDATE/DELETE 中包含标量子查询的 exists 函数的问题。此前,该标量子查询会被错误地求值,可能导致报错,或生成损坏的变更命令,使表在下次服务器重启后无法加载。#97347 (Kirill Kopnev).
  • 修复了在将 NULL 与包含 LowCardinality 类型的 Variant 列进行比较时出现的逻辑异常 Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8)))#97379 (Alexey Milovidov).
  • 修复了在启用分片查询缓存时并行执行 EXCHANGE TABLES 可能导致的竞态条件问题。 #97411 (Konstantin Vedernikov).
  • 修复了将 Array 转换为 QBit 时的 LOGICAL_ERROR 异常:当外层 Tuple 包装器中的 nullable_source 以不匹配的列 type 替换已转换的数组列时,会触发该问题。关闭 #97389#97413 (Alexey Milovidov).
  • 修复括号内带别名的元组字面量在 AST 格式化往返时不一致的问题,例如,(('a', 'b') AS x) 之前会被错误地重新格式化为 tuple(('a', 'b') AS x)#97418 (Alexey Milovidov) 。
  • 修复了启用去重的异步插入过程中出现的异常:当解析失败生成零行的空数据块时,会触发该异常。#97460 (Sema Checherinda).
  • 修复了在使用 ORDER BY ... LIMIT 从采用非自适应索引粒度 (index_granularity_bytes = 0) 的表中读取时,LazyMaterializingTransform 中出现的异常 "Number of rows in lazy chunk does not match number of offsets"。#97482 (Alexey Milovidov).
  • 修复 insert Iceberg 相关设置。为 allow_experimental_insert_into_iceberg 设置添加别名。#97483 (Konstantin Vedernikov) 。
  • 修复了这样一个 ACCESS_DENIED 问题:当 optimize_inverse_dictionary_lookup 优化重写 dictGet(...) 谓词时,没有 CREATE TEMPORARY TABLE 权限的用户会遇到该问题。ClickHouse 现在会跳过该重写并执行原始表达式。关闭 #97269#97484 (Nihal Z. Miaji) 。
  • 修复 SetMergeTreeIndexSet 在处理带有内部稀疏子列的列时出现的断言失败问题 (在 debug/sanitizer 构建中会以异常形式表现出来) ,例如来自具有不同稀疏序列化 profile 的 MergeTree parts 的 Tuple 列。#97493 (Alexey Milovidov) 。
  • 修复 StorageKafka2 中可能出现的释放后使用问题。#97520 (Bharat Nallan) 。
  • 修复当输出路径包含目录时,INTO OUTFILE 配合 TRUNCATEinto_outfile_create_parent_directories 设置使用时出现的问题。#97549 (Alexey Milovidov) 。
  • 修复在启用分析器时,通过 merge() 表函数查询 ALIAS 列中包含 lambda 表达式的表时出现的 BAD_ARGUMENTS 错误。#97551 (Alexey Milovidov) 。
  • 修复 Keeper 的 zxid 为 0 时 system.zookeeper_info 抛出异常的问题。#97553 (Alexey Milovidov) 。
  • 修复了当键类型不是 String 时,ip_trie 字典中可能存在的逻辑错误。#97555 (Bharat Nallan) 。
  • 修复基础 RestCatalog 的 REST 目录 OAuth 身份验证失效问题 (此前仅对派生目录 (如 OneLakeCatalog) 生效) 。BigLake 目录引入后,默认 REST 目录因此损坏。#97561 (Konstantin Vedernikov) 。
  • 几何函数 (perimeterSphericalareaSpherical 等) 现在除 Geometry 变体类型外,还接受单独的几何子类型 (PolygonRingPoint 等) 。#97571 (Alexey Milovidov) 。
  • 修复对 Nullable(Tuple(... Nullable(T) ...)) 类型的子列使用 isNull/isNotNull 时触发的 LOGICAL_ERROR 异常。关闭 #97224#97582 (Alexey Milovidov) 。
  • 修复在轻量级更新期间应用补丁分区片段时发生的空指针解引用问题。#97583 (Alexey Milovidov) 。
  • BaseSettings::readBinaryaccessor.find 返回的索引直接传给 field_infos[],但未检查“未找到”的哨兵值 (即 -1) ,这可能导致 std::vector 越界访问。该问题因 libcxx 的加固机制而被发现。这很可能发生在查询计划反序列化期间:较新的服务器向较旧的服务器发送其无法识别的设置时,就会触发该问题。基于字符串的读取方法已正确处理这种情况;readBinary 只是缺少相同的检查。 #97585 (Miсhael Stetsyuk).
  • 修复 UNION ALL 查询在某个分支包含恒为 false 的谓词时返回错误结果的问题——该分支本应不返回任何结果,却会错误地读取数据。#97620 (Bharat Nallan).
  • 修复了 IN (col) 在仅包含单个列引用时会失败并报 UNSUPPORTED_METHOD 错误的问题。#97646 (Alexey Milovidov) 。
  • 修复在 GROUP BY ... WITH ROLLUP/CUBE 中,当键在 Nullable(Tuple(...)) 内包含 LowCardinality(Nullable(...)) 时引发的逻辑错误异常。#97647 (Alexey Milovidov).
  • 修复 NOT (1, 1, 1) 的 AST 格式不一致问题,该问题可能会在调试构建中导致 LOGICAL_ERROR#97653 (Alexey Milovidov) 。
  • 修复 keeper-converter 在遇到空的 ZooKeeper transaction log File 时抛出异常的问题。#97673 (Alexey Milovidov).

构建/测试/打包方面的改进

  • ClickHouse 现已可使用 clang-23 (master) 进行构建。#95578 (Alexey Milovidov) 。
  • 修复:当配置了 bind_host 时,强制将 is_local 设为 false,并改用集成测试。对 #74741 的后续跟进。#93109 #96018 (Zhigao Hong).
  • 压力测试:修复 CI 中的压力测试和升级测试;忽略 no-{build} 标签;增加兼容性随机化。#94693 (Nikita Fomichev) 。
  • 在构建产物中发布 parser_memory_profiler 二进制文件。该工具可用于分析 AST 的内存占用。#95826 (Ilya Yatsishin) 。
  • parser_memory_profiler 工具添加 --symbolize 标志,用于生成在结果中包含已解析符号的 .heap.sym File。#96477 (Ilya Yatsishin) 。
  • 将 integration tests 中使用的第三方 Docker images 固定为特定版本。#96500 (Alexey Milovidov) 。
  • 重新支持动态链接 OpenSSL。虽然不推荐这样做,而且任何生产构建都不会采用,但这个选项仍然保留,供互联网上的爱好者使用。#96506 (Govind R Nair) 。
  • 通过为 Coordination::OpNum 使用按类型特化,将 magic_enum 的范围从 [-100, 1000] 缩减为默认值 [-128, 127],从而缩短构建时间。#96632 (Alexey Milovidov) 。
  • 从 Function 类中移除不必要的 C++ 模板,以缩短构建时间。#96646 (Alexey Milovidov) 。
  • StorageSystemLicenses 的生成移至 configure 阶段,以提升构建并行性。#96697 (Alexey Milovidov) 。
  • 将许可证扫描并行化。#96727 (Raúl Marín).
  • 新增对 SSH 协议支持的无状态功能测试。#96996 (Alexey Milovidov) 。
  • 将 Kafka 3.9.0 添加到无状态功能测试基础设施中,使其能够使用 ClickHouse Keeper 充当 ZooKeeper,直接测试 Kafka 和 Kafka2 表引擎。六个新的无状态测试涵盖基本的生产/消费、虚拟列、INSERT、多种格式、损坏消息处理以及基于 Keeper 的偏移量存储。#96997 (Alexey Milovidov) 。
  • 新增一个 CI 工作流,用于构建经 PGO+BOLT 优化的 clang 工具链。#96991 (Alexey Milovidov).
  • 在 CI 中使用 PGO 优化的 LLVM/Clang 构建,可将构建速度提升 20..30%。#97031 (Alexey Milovidov) 。
  • 将 glibc 中的数学函数替换为 llvm-libc 的实现。#90151 (Konstantin Bogdanov) 。
  • 将 Boost 从 1.83 升级到 1.90,修复了调试构建中 devector 的断言失败问题。#97037 (Alexey Milovidov).
  • postgres 更新至 REL_18_1。 #95189 (Konstantin Bogdanov).
  • 使用 libexpat 2.7.3。#95218 (Konstantin Bogdanov) 。
  • 使用 OpenSSL 3.5.5。#95345 (Konstantin Bogdanov) 。
  • 使用 simdjson v4.2.4。#97129 (Konstantin Bogdanov) 。
  • 升级至 libarchive 3.8.5。#97131 (Konstantin Bogdanov) 。
  • 升级到 fast_float v8.2.3。#97133 (Konstantin Bogdanov) 。
  • 使用 abseil-cpp 20260107.1,并将 s2geometry 升级至 v0.13.1。#97134 (Konstantin Bogdanov) 。
  • libxml2 升级至 2.15.1。#95574 (Robert Schulze) 。
  • 将 7 个等级 3 集成测试 Docker 镜像从已终止生命周期或已删除的基础镜像升级到当前支持的版本。#97314 (Rahul).
  • 新增 TPC-DS 基准测试查询。#97349 (Raufs Dunamalijevs) 。
  • 将各个 x86 指令集 cmake 选项 (ENABLE_SSSE3ENABLE_AVX2NO_SSE3_OR_HIGHERARCH_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.htypeid_cast.hassert_cast.hContext_fwd.hIDataType.h 等被广泛包含的头文件以及各种 Column 头文件中移除,缩小其包含依赖范围。 #97497 (Raúl Marín).
  • 始终使用随附的 compiler-rt 头文件 (sanitizer 和 XRay 接口) ,而不是主机编译器的头文件,并且默认情况下从源码构建 compiler-rt 库。#97499 (Raúl Marín) 。
  • 在具备足够 long double 支持的平台上,避免在 wide_integer_impl.h 中包含 boost/multiprecision 头文件,以缩短构建时间。#96633 (Alexey Milovidov).
  • 实现 LLVM 代码覆盖率作业,并首先为 master 分支启用该作业。#90952 (Alexey Bakharew) 。
  • 为发布构建启用快速 libcxx 加固。这主要用于越界检查。根据性能测试结果,预计不会带来明显的性能影响。 #94757 (Miсhael Stetsyuk).

ClickHouse 26.1 版本,2026-01-29。演示视频

不兼容变更

  • 修复由于在 formatter 中错误替换别名而导致的格式不一致问题。修复了 #82833 中的问题。修复了 #82832 中的问题。修复了 #68296 中的问题。此更改可能存在向后不兼容性:当 analyzer 被禁用时,某些在 IN 中引用别名的 CREATE VIEW 查询将无法被处理。为避免不兼容,请启用 analyzer(自 24.3 起默认启用)。#82838Alexey Milovidov)。
  • 编解码器 DEFLATE_QPLZSTD_QAT 已被移除。建议用户在升级前,将使用 DEFLATE_QPLZSTD_QAT 压缩的现有数据转换为其他编解码器。请注意,若要使用这些编解码器,必须先启用设置项 enable_deflate_qpl_codecenable_zstd_qat_codec#92150Robert Schulze)。
  • 通过在 system.query_log.exception 中启用对 stderr 的捕获,改进 UDF 调试体验。之前,UDF 的 stderr 只会被写入文件,而不会出现在查询日志中,导致难以调试。现在,stderr 默认会触发异常,并在抛出前被完整累积(最多 1MB),因此完整的 Python 回溯和错误信息会出现在 system.query_log.exception 中,从而便于高效故障排查。#92209Xu Jia)。
  • JOIN USING () 子句中的空列列表现在被视为语法错误。此前预期的行为是在查询执行期间抛出 INVALID_JOIN_ON_EXPRESSION。在某些情况下(例如与 Join 引擎进行连接)这会导致 LOGICAL_ERROR,从而修复了 #82502#92371Vladimir Cherkasov)。
  • 默认在 JSON 类型中对 SKIP REGEXP 使用部分匹配。已关闭 #79250#92847Pavel Kruglov)。
  • 回滚「Allow INSERT into simple ALIAS columns」(回滚 ClickHouse/ClickHouse#84154)。该功能无法与自定义格式配合使用,并且没有受任何设置保护。#92849Azat Khuzhin)。
  • 新增一个设置项,当数据湖目录无法访问对象存储时抛出错误。#93606 (Konstantin Vedernikov)。
  • Lazy 数据库引擎已被移除且不再可用。已关闭 #91231#93627Alexey Milovidov)。
  • 移除 metric_logtransposed_with_wide_view 模式——由于一个缺陷,该模式无法使用。现在不再允许以该模式定义 system.metric_log。这在一定程度上回滚了 #78412#93867Alexey Milovidov)。
  • 工作负载的 CPU 调度现在默认为抢占式。参见 cpu_slot_preemption 服务器设置项。#94060Sergei Trifonov)。
  • 对索引文件名进行转义以防止分区片段损坏。应用此更改后,ClickHouse 将无法加载由先前版本创建且名称中包含非 ASCII 字符的索引。要处理这种情况,可以使用 MergeTree SETTING escape_index_filenames#94079 (Raúl Marín)。
  • 格式设置 exact_rows_before_limitrows_before_aggregationcross_to_inner_join_rewriteregexp_dict_allow_hyperscanregexp_dict_flag_case_insensitiveregexp_dict_flag_dotalldictionary_use_async_executor 现已更改为常规(非格式)设置。这是一次纯粹的内部更改,对用户没有可见的副作用,除非在(不太可能的)情况下,你在 Iceberg、DeltaLake、Kafka、S3、S3Queue、Azure、Hive、RabbitMQ、Set、FileLog 或 NATS 的表引擎定义中指定了上述任一设置。在这些情况下,此前这些设置会被忽略,而现在此类定义会报错。#94106Robert Schulze)。
  • joinGet/joinGetOrNull 函数现在会对底层 Join 表强制要求具备 SELECT 权限。此更改之后,执行 joinGet('db.table', 'column', key) 要求用户同时对 Join 表中定义的键列以及要获取的属性列拥有 SELECT 权限。缺少这些权限的查询将失败,并返回 ACCESS_DENIED。迁移时,可通过 GRANT SELECT ON db.join_table TO user 授予整张表的访问权限,或通过 GRANT SELECT(key_col, attr_col) ON db.join_table TO user 授予列级访问权限。此更改会影响所有依赖 joinGet/joinGetOrNull 且之前未显式配置 SELECT 授权的用户和应用程序。#94307Vladimir Cherkasov)。
  • 针对 CREATE TABLE ... AS ... 查询改为检查 SHOW COLUMNS。之前检查的是 SHOW TABLES,这对于此类权限检查来说是不正确的权限授予。#94556pufit)。
  • 使 Hash 输出格式不再依赖于数据块大小。#94503Alexey Milovidov)。请注意,与之前版本相比,此更改会导致输出的哈希值发生变化。

新特性

  • ClickHouse Keeper 的 HTTP API 和嵌入式 Web UI。 #78181 (pufitspeeedmaster)。
  • 异步插入去重现在可以与依赖它的 materialized view 协同工作。当按 block_id 发生冲突时,会先过滤原始数据块以移除与该 block_id 关联的行,对剩余的行应用所有相关 materialized view 的 SELECT 查询进行转换,从而重建不包含冲突行的原始数据块。#89140 (Sema Checherinda)。当涉及 materialized view 时,现在允许在异步插入中使用去重。#93957 (Sema Checherinda)。
  • 引入了一种新的语法和框架,用于简化并扩展 PROJECTION 索引功能。该变更是对 https://github.com/ClickHouse/ClickHouse/pull/81021 的后续改进。#91844 (Amos Bird)。
  • Array 列添加文本索引功能支持。 #89895 (Jimmy Aguilar Mena).
  • 默认启用 use_variant_as_common_type,从而可以在 Array 中、UNION 查询中以及 if/multiIf/case 分支中使用彼此不兼容的类型。#90677Alexey Milovidov)。
  • 新增系统表 zookeeper_info。实现了 #88014#90809Smita Kulkarni)。
  • 在所有函数中支持 Variant 类型。#90900Bharat Nallan)。
  • 在 Prometheus 的 /metrics 端点中新增一个 ClickHouse_Info 指标,主要包含版本信息,从而可以构建随时间跟踪详细版本信息的图表。#91125Christoph 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#91780Xuewei Wang)。
  • 新增了 max_insert_block_size_bytes 设置,用于更精细地控制插入数据块的形成。#92833Kirill Kopnev)。
  • 如果启用了 ignore_on_cluster_for_replicated_database 配置项,则可以在 Replicated 数据库中执行带有 ON CLUSTER 子句的 DDL 查询。在这种情况下,将忽略集群名称。 #92872 (Kirill).
  • 实现了 mergeTreeAnalyzeIndexes 函数。#92954 (Azat Khuzhin).
  • 新增配置项 use_primary_key。将其设置为 false 以禁用基于主键的 granule 剪枝。#93319Nihal Z. Miaji)。
  • 添加 icebergLocalCluster 表函数。#93323 (Anton Ivashkin).
  • 新增了 cosineDistanceTransposed 函数,用于近似计算两点之间的余弦距离#93621Raufs Dunamalijevs)。
  • 在 system.parts 表中新增 files 列,用于显示每个数据分区片段包含的文件数量。 #94337 (Match).
  • 为并发控制添加了一个 max-min 公平调度器。在严重 oversubscription 场景下(即大量查询争夺有限的 CPU 槽位时),可以提供更好的公平性。短时运行的查询不会因为那些长时间运行并随时间占用更多槽位的查询而受到惩罚。通过将 concurrent_threads_scheduler 服务器 SETTING 的值设置为 max_min_fair 来启用。#94732Sergei Trifonov)。
  • 新增了允许 ClickHouse 客户端在连接服务器时覆盖 TLS SNI 的功能。 #89761 (Matt Klein).
  • joinGet 函数调用中支持使用临时表。#92973Eduard Karacharov)。
  • 支持 DeltaLake 表引擎中的删除向量。 #93852 (Kseniia Sumarokova).
  • deltaLakeCluster 添加对删除向量的支持。 #94365 (Kseniia Sumarokova).
  • 为数据湖增加对 Google Cloud Storage 的支持。 #93866 (Konstantin Vedernikov).

实验特性

性能优化

  • Setting use_skip_indexes_on_data_read is now enabled by default. This setting allows filtering in a streaming fashion, at the same time as reading, improving query performance and startup time. #93407 (Shankar Iyer).
  • 提升在 LowCardinality 列上执行 DISTINCT 时的性能。关闭 #5917#91639 (Nihal Z. Miaji)。
  • 优化 distinctJSONPaths 聚合函数,使其仅从分区片段中读取 JSON 路径,而无需扫描整个 JSON 列。#92196 (Pavel Kruglov)。
  • 将更多过滤条件下推到 JOIN 操作中。#85556 (Nikita Taranov).
  • 在过滤条件仅使用一侧输入时,支持更多从 JOIN 的 ON 条件下推过滤的场景。支持 ANYSEMIANTI JOIN。#92584 (Dmitry Novik)。
  • 允许使用等价 Set 将过滤条件下推到 SEMI JOIN。Closes #85239#92837 (Dmitry Novik)。
  • 当哈希 JOIN 的右侧为空时,跳过读取左侧。此前会一直读取左侧直到遇到第一个非空数据块,在存在大量过滤或聚合时可能会做大量无用工作。#94062 (Alexander Gololobov).
  • 在查询管线内部使用 "fastrange"(Daniel Lemire)方法对数据进行分区。这可以提升并行排序和 JOIN 的性能。#93080 (Alexey Milovidov)。
  • 在 PARTITION BY 子句与排序键完全匹配或为其前缀时,提高窗口函数的性能。#87299 (Nikita Taranov)。
  • 将外层过滤条件下推到视图中,从而可以在本地和远程节点上应用 PREWHERE。解决了 #88189 问题。#88316 (Igor Nikonov)。
  • Implement JIT compilations for more functions. Closes #73509. #88770 (Alexey Milovidov with Taiyang Li).
  • 如果在 FINAL 查询中使用的跳过索引位于主键中的某个列上,那么在其他分区片段中检查主键交集的额外步骤就是多余的,因此现在不会再执行。Resolves #85897#93899 (Shankar Iyer)。
  • Optimize performance and memory usage for fractional LIMIT and OFFSET. #91167 (Ahmed Gouda).
  • 修复在 Parquet Reader V3 预取器中使用更快随机读取逻辑的问题。Closes #90890#91435 (Arsen Muk)。
  • 提升 icebergCluster 的性能。关闭 #91462#91537Yang Jiang)。
  • 不要在常量过滤条件上使用虚拟列进行过滤。 #91588 (c-end).
  • 通过启用自适应写缓冲区 (adaptive write buffers),在针对超宽表使用宽分区片段时降低 INSERT/合并操作的内存占用。为加密磁盘新增对自适应写缓冲区的支持。#92250 (Azat Khuzhin).
  • Improved performance of full text search with text index and sparseGrams tokenizer by reducing the number of searched tokens in the index. #93078 (Anton Popov).
  • Function isValidASCII 已针对正向结果(即输入完全为 ASCII 的情况)进行了优化。#93347Robert Schulze)。
  • 顺序读取优化现在能够识别由于 WHERE 条件导致 ORDER BY 列为常量的情况,从而实现高效的反向顺序读取。这对于类似 WHERE tenant='42' ORDER BY tenant, event_time DESC 的多租户查询非常有益,此类查询现在可以使用 InReverseOrder,而不再需要执行完整排序。#94103 (matanper)。
  • 引入专门的 Enum AST 类,用 (string, integer) 对而非 ASTLiteral 子节点来存储值参数,从而优化内存占用。#94178 (Ilya Yatsishin)。
  • 在多个副本上执行分布式索引分析。对于共享存储以及集群中海量数据场景具有优势。适用于 SharedMergeTree(ClickHouse Cloud),也可能适用于使用共享存储的其他类型 MergeTree 表。#86786 (Azat Khuzhin)。
  • Reduce overhead of join runtime filters by disabling them in the following cases: - too many bits are set in the bloom filter - too few rows are filtered out at runtime. #91578 (Alexander Gololobov).
  • Use an in-memory buffer for correlated subqueries input to avoid evaluating it multiple times. Part of #79890. #91205 (Dmitry Novik).
  • 允许所有副本在并行副本读取时抢占孤立区间。这可以改善负载均衡并减少长尾延迟。#91374 (zoomxi)。
  • 外部聚合/排序/JOIN 现在在所有场景下都会遵循查询设置 temporary_files_codec。修复了 Grace 哈希 JOIN 中缺失 profile 事件的问题。#92388 (Vladimir Cherkasov)。
  • 改进在聚合/排序过程中将数据溢写到磁盘时对查询内存使用情况的检测,使其更加健壮。#92500 (Azat Khuzhin)。
  • 估算聚合键列的总行数和 NDV(不同值数量)统计。#92812 (Alexander Gololobov)。
  • 使用 simdcomp 优化倒排列表压缩。#92871 (Peng Jian)。
  • 通过分桶重构 S3Queue 的 Ordered 模式处理流程。这也应当提升性能,减少 keeper 请求的数量。#92889 (Kseniia Sumarokova)。
  • 函数 mapContainsKeyLikemapContainsValueLike 现在可以分别利用 mapKeys()mapValues() 上的文本索引。#93049 (Michael Jarrett)。
  • Reduce memory usage on non-Linux systems (enable immediate purging of jemalloc dirty pages). #93360 (Eduard Karacharov).
  • 当脏页大小与 max_server_memory_usage 的比值超过 memory_worker_purge_dirty_pages_threshold_ratio 时,强制清理 jemalloc arena。#93500 (Eduard Karacharov)。
  • 降低 AST(抽象语法树)的内存占用。#93601 (Nikolai Kochetov)。
  • In some cases we've seen ClickHouse doesn't respect a memory limit when reading from a table. This behaviour is fixed. #93715 (Nikita Mikhaylov).
  • 默认启用 Keeper 的 CHECK_STATTRY_REMOVE 扩展。#93886 (Mikhail Artemenko)。
  • Parse lower and upper bounds of file names corresponding to position deletes from Iceberg manifest file entries for better selection of corresponding data files. #93980 (Daniil Ivanik).
  • 新增两个设置,用于控制 JSON 列中动态子列的最大数量。第一个是 MergeTree 设置 merge_max_dynamic_subcolumns_in_compact_part(类似于已添加的 merge_max_dynamic_subcolumns_in_wide_part),用于限制在合并为 Compact 分片时创建的动态子列数量。第二个是查询级别设置 max_dynamic_subcolumns_in_json_type_parsing,用于限制在解析 JSON 数据时创建的动态子列数量,从而可以在插入时指定该上限。#94184 (Pavel Kruglov).
  • 在部分场景下对 JSON 列的压缩合并进行了小幅优化。#94247 (Pavel Kruglov)。
  • 根据生产环境经验减小线程池队列大小。在从 MergeTree 读取任何数据之前,添加一次显式的内存使用量检查。#94692 (Nikita Mikhaylov)。
  • 确保在 CPU 资源饥饿时,调度器会优先调度 MemoryWorker 线程,因为它可以保护 ClickHouse 进程免受致命威胁。#94864 (Nikita Mikhaylov)。
  • 在与 MemoryWorker 主线程不同的线程中执行 jemalloc 脏页清理。如果清理较慢,可能会延迟 RSS 使用量的更新,从而导致进程因内存不足而被杀死。引入新的配置项 memory_worker_purge_total_memory_threshold_ratio,用于根据总内存使用量的比例启动脏页清理。#94902 (Antonio Andelic)。

改进

  • system.blob_storage_log 现已可用于 Azure Blob Storage。#93105Alexey Milovidov)。
  • 为 Local 和 HDFS 实现 blob_storage_log。修复 S3Queueblob_storage_log 中记录日志时未使用磁盘名称而导致的错误。为 blob_storage_log 添加 error_code 列。拆分测试配置文件以简化本地测试。#93106Alexey Milovidov)。
  • 在输入时,clickhouse-clientclickhouse-local 会高亮显示数值字面量中的数字分组(千位、百万位等)。此更改修复了 #93100#93108Alexey Milovidov)。
  • clickhouse-client 中新增对在等号两侧包含空格的命令行参数的支持。修复了 #93077#93174Cole Smith)。
  • 在配置 <interactive_history_legacy_keymap>true</interactive_history_legacy_keymap> 后,CLI 客户端现在可以像之前一样回退为使用 Ctrl-R 进行常规搜索,而 Ctrl-T 用于模糊搜索。#87785Larry Snizek)。
  • 用于清理缓存的语句 SYSTEM DROP [...] CACHE 给人一种错误印象,好像该语句会禁用缓存。ClickHouse 现在支持语句 SYSTEM CLEAR [...] CACHE,含义更加清晰。旧的语法仍然可用。#93727Pranav Tiwari)。
  • EmbeddedRocksDB 中支持使用多个列作为主键。修复 #32819#33917usurai)。
  • 现在可以在标量上使用非常量的 IN(例如查询 val1 NOT IN if(cond, val2, val3))。#93495Yarik Briukhovetskyi)。
  • 防止在 HeadObjectUploadPartCompleteMultipartUpload S3 请求中继续传递 x-amz-server-side-encryption 头部,因为这些请求不支持该头部。#64577Francisco J. Jurado Moreno)。
  • 在 S3Queue 中跟踪有序模式下的 Hive 分区。修复了 #71161#81040Anton Ivashkin)。
  • 优化文件系统缓存中的空间预留。FileCache::collectCandidatesForEviction 将在不持有独占锁的情况下执行。#82764 (Kseniia Sumarokova)。
  • 支持服务器日志的复合轮转策略(大小 + 时间)。 #87620 (Jianmei Zhang).
  • CLI 客户端现在可以指定 <warnings>false</warnings> 以替代命令行参数 --no-warnings#87783 (Larry Snizek).
  • avg 聚合函数添加对 Date、DateTime 和 Time 类型参数的支持。修复了 #82267 中的问题。#87845Yarik Briukhovetskyi)。
  • 优化项 use_join_disjunctions_push_down 默认启用。#89313Alexey Milovidov)。
  • 在关联子查询中支持更多表引擎和数据源类型。关闭 Issue #80775#90175Dmitry Novik)。
  • 如果显式指定了参数化视图的 schema,则会显示该 schema。关闭 #88875#81385#90220Grigorii Sokolik)。
  • 如果日志早于最后一次提交的索引,则正确处理 Keeper 日志条目中的间隙。 #90403 (Antonio Andelic)。
  • 改进 min_free_disk_bytes_to_perform_insert 设置项,使其在 JBOD 卷上能正确工作。 #90878 (Aleksandr Musorin).
  • 允许在命名集合中为 S3 表引擎和 s3 表函数指定 storage_class_name 设置。#91926 (János Benjamin Antal)。
  • 支持通过 system.zookeeper 插入辅助 ZooKeeper。 #92092 (RinChanNOW).
  • 为 Keeper 添加新指标:KeeperChangelogWrittenBytesKeeperChangelogFileSyncMicrosecondsKeeperSnapshotWrittenBytesKeeperSnapshotFileSyncMicroseconds profile events,以及 KeeperBatchSizeElementsKeeperBatchSizeBytes 直方图指标。#92149Miсhael Stetsyuk)。
  • 新增一个设置项 trace_profile_events_list,将使用 trace_profile_event 的跟踪限制为指定的事件名称列表。这使得在大规模工作负载下可以进行更精确的数据采集。#92298 (Alexey Milovidov).
  • 为可暂停的 failpoint 新增对 SYSTEM NOTIFY FAILPOINT 的支持;在 SYSTEM WAIT FAILPOINT fp 中新增对 PAUSE/RESUME 的支持。#92368Shaohua Wang)。
  • system.data_skipping_indices 添加 creation(隐式/显式)列。 #92378 (Raúl Marín).
  • 允许将 YTsaurus 动态表的列描述传递给字典数据源。#92391 (MikhailBurdukov)。
  • #63985 中,我们实现了可以按端口粒度指定 TLS 配置所需的全部参数(参见 composable protocols),从而不再需要依赖全局 TLS 配置。然而,该实现仍然隐式要求存在一个全局的 openSSL.server 配置段,这与需要为不同端口使用不同 TLS 配置的场景相冲突。例如,在 keeper-in-server 部署中,我们需要分别为 keeper 之间的通信和 ClickHouse 客户端连接配置独立的 TLS 配置。#92457Miсhael Stetsyuk)。
  • 引入一个新的设置 input_format_binary_max_type_complexity,用于限制在二进制格式中可解码的类型节点总数,以防止恶意载荷。#92519Raufs Dunamalijevs)。
  • system.background_schedule_pool{,_log} 中展示当前正在运行的任务。新增文档。#92587 (Azat Khuzhin).
  • 如果在客户端中使用 Ctrl+R 搜索时在历史记录中未找到匹配项,则执行当前查询。#92749Azat Khuzhin)。
  • 支持 EXPLAIN indices = 1 作为 EXPLAIN indexes = 1 的别名。关闭 #92483#92774Pranav Tiwari)。
  • Parquet 读取器现在允许将 Tuple 或 Map 类型的列以 JSON 形式读取:select x from file(f.parquet, auto, 'x JSON') 即使在 f.parquet 中列 x 的类型是 tuple 或 map 也能正常工作。#92864Michael Kolupaev)。
  • 在 Parquet 读取器中添加对空元组的支持。 #92868 (Michael Kolupaev).
  • 当 Azure Blob Storage 的原生复制因 BadRequest(例如 block 列表无效)失败时,回退到读写复制方式。之前仅在将 blob 复制到不同存储帐户时出现 Unauthorized 错误才会进行此回退。但我们有时也会遇到 “The specified block list is invalid” 错误。因此现在更新了条件,对所有原生复制失败的情况都回退到读写模式。#92888Smita Kulkarni)。
  • 修复在使用 EC2 实例角色凭证运行大量并发 S3 查询时对 EC2 元数据端点访问被限流的问题。之前,每个查询都会创建自己的 AWSInstanceProfileCredentialsProvider,导致对 EC2 元数据服务发起并发请求,从而可能引发超时和 HTTP response code: 403 错误。现在,凭证提供程序会被缓存,并在所有查询之间共享。#92891Sav)。
  • 重构 insert_select_deduplicate 设置,以支持保留向后兼容性。 #92951 (Sema Checherinda).
  • 将耗时超过平均水平的后台任务记录到日志中(background_schedule_pool_log.duration_threshold_milliseconds=30),以避免产生过多的任务日志。#92965Azat Khuzhin)。
  • 在之前的版本中,一些 C++ 函数名在 system.trace_logsystem.symbols 中显示不正确(被“mangled”),并且 demangle 函数无法正确处理它们。解决了 #93074#93075Alexey Milovidov)。
  • 引入了名为 backup_data_from_refreshable_materialized_view_targets 的备份设置,用于在执行备份时跳过可刷新 materialized view。使用 APPEND 刷新策略的 RMV 始终会被备份。#93076 (Julia Kartseva). #93658 (Julia Kartseva)
  • Use minimal debug info instead of no debug info for heavy translation units, such as functions. #93079 (Alexey Milovidov).
  • 通过为 MinIO 特定错误实现错误码映射,为 AWS S3 C++ SDK 添加了对 MinIO 的兼容性支持。此更改使 ClickHouse 在使用 MinIO 部署替代 AWS S3 时,能够正确处理并重试来自 MinIO 服务器的错误,从而提升在自托管 MinIO 集群上运行对象存储场景的可靠性。 #93082 (XiaoBinMu).
  • 写入已符号化的 jemalloc 性能分析文件(在生成堆内存性能分析时无需提供可执行二进制文件)。 #93099 (Azat Khuzhin).
  • 恢复 clickhouse git-import 工具——此前在处理较大或无效的提交时会出错。参见 https://presentations.clickhouse.com/2020-matemarketing/。 #93202 (Alexey Milovidov)。
  • 不在查询日志中显示来自 URL 存储的密码。#93245 (Konstantin Vedernikov).
  • flipCoordinates 添加对 Geometry 类型的支持。 #93303 (Bharat Nallan).
  • 改进 SYSTEM INSTRUMENT ADD/REMOVE 的用户体验:对函数名使用字符串字面量,为所有匹配的函数应用补丁,并允许在 REMOVE 中使用 function_name。 #93345 (Pablo Marcos)。
  • 新增一个名为 materialize_statistics_on_merge 的设置,用于启用或禁用在合并过程中物化统计信息。默认值为 1#93379 (Han Fei).
  • ClickHouse 现在可以解析 DESCRIBE SELECT 查询中不带括号的 SELECT。关闭了 #58382#93429Yarik Briukhovetskyi)。
  • Add randomization of cache correctness checks under probability. #93439 (Kseniia Sumarokova).
  • 添加设置 type_json_allow_duplicated_key_with_literal_and_nested_object,以允许在 JSON 中出现重复路径,其中一个是字面量,另一个是嵌套对象,例如 {"a" : 42, "a" : {"b" : 42}}。在对重复路径的限制于 https://github.com/ClickHouse/ClickHouse/pull/79317 中添加之前,部分数据可能已经被创建,现在对这些数据进行进一步操作可能会导致错误。启用此设置后,此类旧数据仍然可以在无错误的情况下使用。#93604 (Pavel Kruglov)。
  • 在 Pretty JSON 中,不要将简单类型的值打印在单独的行上。#93836Pavel Kruglov)。
  • 当存在大量 alter table ... modify setting ... 语句时,可能在 5 秒内无法获取到锁。此时返回 timeout 比返回 logical error 更合适。#93856Han Fei)。
  • 避免在发生语法错误时产生过多输出。在此更改之前,会输出整个 SQL 脚本,而脚本中可能包含大量查询语句。#93876Alexey Milovidov)。
  • 正确计算 Keeper 中带有统计信息的 check 请求的字节大小。#93907 (Mikhail Artemenko).
  • 新增了 use_hash_table_stats_for_join_reordering 设置,用于控制在 JOIN 重排序时是否使用运行时哈希表大小的统计信息。该设置默认启用,从而保留 collect_hash_table_stats_during_joins 的现有行为。#93912Vladimir Cherkasov)。
  • 用户现在可以在 system.server_settings 表中查看部分嵌套的全局服务器设置(例如 logger.level)。这仅适用于具有固定结构的设置项(不包含列表、枚举、重复等)。#94001Hechem Selmi)。
  • QBit 现在可以进行相等性比较。#94078Raufs Dunamalijevs)。
  • 当 Keeper 检测到快照损坏或变更日志不一致时,将抛出异常,而不是直接中止或自动清理文件。这样可以通过依赖人工干预,使 Keeper 的行为更加安全。#94168 (Antonio Andelic).
  • 修复 CREATE TABLE 失败时可能遗留多余对象的问题。 #94174 (Azat Khuzhin).
  • 修复在使用受密码保护的 TLS 密钥时访问未初始化内存的问题(OpenSSL 中的一个缺陷)。 #94182 (Konstantin Bogdanov)。
  • 将 chdig 升级到 v26.1.1#94290Azat Khuzhin)。
  • 在 S3Queue 有序模式下支持更通用的分区方式。#94321 (Bharat Nallan)。
  • 为设置 allow_statistics_optimize 新增别名 use_statistics。这与现有设置 use_primary_keyuse_skip_indexes 更加一致。#94366Robert Schulze)。
  • 在从 Numbers 转换为 Enums 时启用了 input_format_numbers_enum_on_conversion_error SETTING,以检查元素是否存在。#94384 (Elmi Ahmadov)。
  • 在 S3(Azure)Queue 的有序模式下,通过跟踪限制来清理失败节点(此前该操作仅在无序模式下同时对失败和已处理节点执行,因此现在也会在有序模式下执行,但只针对失败节点)。 #94412 (Kseniia Sumarokova).
  • 在 clickhouse-local 中为 default 用户启用访问管理功能。clickhouse-local 中的默认用户缺少 access_management 权限,这会导致诸如 DROP ROW POLICY IF EXISTS 之类的操作因 ACCESS_DENIED 错误而失败,即使该用户本应不受限制。#94501Alexey Milovidov)。
  • 为 YTsaurus 字典和表启用命名集合。#94582 (MikhailBurdukov)。
  • 为 S3 和 Azure Blob Storage 的 BACKUP/RESTORE 添加对通过 SQL 定义的命名集合的支持。关闭 #94604#94605Pablo Marcos)。
  • 在有序模式下,为 S3Queue 提供基于分区键的分桶支持。#94698 (Bharat Nallan)。
  • 新增一个异步指标,用于记录耗时最长的合并操作的已用时间。 #94825 (Raúl Marín).
  • 在使用 IcebergBitmapPositionDeleteTransform 执行 position delete 操作之前,增加所属文件的检查。 #94897 (Yang Jiang).
  • 现在 view_duration_ms 显示的是该分组处于活跃状态的持续时间,而不再是其中各线程持续时间的总和。#94966Sema Checherinda)。
  • 移除了 hasAnyTokenshasAllTokens 函数中搜索 token 数量上限为 64 的限制。示例:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]); 此前该查询会因为包含 65 个搜索 token 而抛出 BAD_ARGUMENTS 错误。通过此 PR,该限制已被完全移除,相同查询将不再报错。#95152 (Elmi Ahmadov).
  • 添加名为 input_format_numbers_enum_on_conversion_error 的 SETTING,用于在将 Numbers 转换为 Enums 时检查元素是否存在。Closes: #56144#56240Nikolay Degterinsky)。
  • Share format parser resources between data file and position delete file reading in Iceberg tables to reduce memory allocations. #94701 (Yang Jiang).

错误修复(官方稳定版本中用户可见的异常行为)

  • 修复了一个问题:预定义查询处理程序在插入数据时会将末尾的空白字符误解释为数据。#83604Fabian Ponce)。
  • 修复在 Join 存储以及“外连接转内连接”优化生效时出现的 INCOMPATIBLE_TYPE_OF_JOIN 错误。解决了 #80794#84292Vladimir Cherkasov)。
  • 修复在启用 allow_experimental_join_right_table_sorting 并使用哈希连接(hash join)时出现的异常“Invalid number of rows in Chunk”。 #86440 (yanglongwei).
  • 如果文件系统不区分大小写,则在 MergeTree 中始终将文件名替换为哈希值。此前在使用不区分大小写文件系统(如 macOS)的系统上,当多个列/子列名仅在大小写上不同时,可能会导致数据损坏。 #86559 (Pavel Kruglov)。
  • 在创建 materialized view 时,对其中的底层查询执行完整的权限检查。#89180pufit)。
  • 修复了在常量参数上调用 icebergHash 函数时发生的崩溃。#90335 (Michael Kolupaev).
  • 修复了这样一个逻辑错误:在没有事务的情况下执行 mutation 时,会修改处于活动事务中的分区片段,而该活动事务最终会被回滚。 #90469 (Shaohua Wang).
  • 在将普通数据库转换为 Atomic 数据库后,正确更新 system.warnings#90473 (sdk2)。
  • 修复了在从 Parquet 文件读取数据时,如果 prewhere 表达式的一部分在查询的其他位置被使用时出现的断言失败。 #90635 (Max Kainov).
  • 修复了在单节点集群中使用 split-by-buckets 模式从 Iceberg 读取时发生的崩溃问题。此更改关闭了 #90913#91553Konstantin Vedernikov)。
  • 修复 Log 引擎在读取子列时可能出现的逻辑错误。关闭问题 #91710#91711Pavel Kruglov)。
  • 修复在 ATTACH AS REPLICATED 过程中出现的逻辑错误:'Storage does not support transaction'。 #91772 (Shaohua Wang)。
  • 修复在 LEFT ANTI JOIN 带有额外后置条件时运行时过滤器行为异常的问题。#91824Alexander Gololobov)。
  • 修复了一个错误,该错误出现在对 Nothing 类型进行空值安全比较时。关闭了 #91834。关闭了 #84870。关闭了 #91821#91884Yarik Briukhovetskyi)。
  • 修复原生 Parquet 读取器中 DELTA_BYTE_ARRAY 解码缺陷,影响对高度重复字符串数据的处理。#91929Daniel Muino)。
  • 在使用 globs 进行 schema 推断时,仅为其推断来源的那个文件缓存 schema,而不是为所有文件缓存 schema。修复了 #91745#92006Pavel Kruglov)。
  • 修复由于归档条目大小头部不正确而导致的 Couldn't pack tar archive: Failed to write all bytes 错误。修复了 #89075#92122Julia Kartseva)。
  • 在 INSERT SELECT 中释放请求流,以防止关闭 HTTP 连接。 #92175 (Sema Checherinda).
  • 修复在包含多个带有 USING 子句的 JOIN 且启用了 join_use_nulls 的查询中的逻辑错误。#92251 (Vladimir Cherkasov).
  • 修复在启用 join_use_nulls 时进行 JOIN 重排时的逻辑错误,关闭 https://github.com/ClickHouse/ClickHouse/issues/90795。 #92289 (Vladimir Cherkasov).
  • 修复 arrayElement 与带负号字面量组合时 AST 格式不一致的问题。关闭 #92288#92212#91832#91789#91735#88495#92386#92293Pavel Kruglov)。
  • 修复在使用 join_on_disk_max_files_to_merge 设置时可能发生的崩溃。#92335 (Bharat Nallan)。
  • 相关问题 #https://github.com/ClickHouse/support-escalation/issues/6365。[#92339](https://github.com/ClickHouse/ClickHouse/pull/92339)([Tuan Pham Anh](https://github.com/tuanpach))。
  • 修复 SYSTEM SYNC FILE CACHE 中缺失的访问检查。关闭 #92101#92372Kseniia Sumarokova)。
  • 修复 count_distinct_optimization 在处理窗口函数和多参数时的优化过程。#92376 (Raúl Marín).
  • 修复了在将某些聚合函数与窗口函数一起使用时出现的 "Cannot write to finalized buffer" 错误。关闭了 #91415#92395Jimmy Aguilar Mena)。
  • 修复使用 CREATE TABLE ... AS urlCluster() 与数据库引擎 Replicated 时的逻辑错误。解决 #92216 中报告的问题。#92418Kseniia Sumarokova)。
  • 在 MergeTree 中执行变更操作(mutation)时继承源 part 的序列化信息设置。这样可以在更改数据类型序列化方式后,修复对已变更 part 执行查询时可能出现的查询结果不正确的问题。#92419Pavel Kruglov)。
  • 修复具有相同名称的列和子列之间可能发生的冲突,该冲突可能会导致采用错误的序列化方式,从而引发查询失败。修复 #90219。修复 #85161#92453Pavel Kruglov)。
  • 修复由于在将外连接转换为内连接时对查询计划进行非预期修改而导致的 LOGICAL_ERROR。同时放宽该优化的条件,使其也能应用于在 JOIN 过程中对聚合键应用单射函数的情况。#92503 (János Benjamin Antal).
  • 修复在对空元组列进行排序时可能出现的 SIZES_OF_COLUMNS_DOESNT_MATCH 错误。关闭 #92422#92520Pavel Kruglov)。
  • 检查 JSON 类型中的不兼容类型化路径。修复 #91577#92539Pavel Kruglov)。
  • 修复在 Backup 数据库上执行 SHOW CREATE DATABASE 时出现的死锁问题。#92541 (Azat Khuzhin).
  • 在验证假设索引时使用正确的错误代码。 #92559 (Raúl Marín).
  • 修复分析器中列别名的动态子列解析问题。此前,列别名中的动态子列会被包装为 getSubcolumn 调用,在某些情况下可能根本无法解析。关闭 #91434#92583Pavel Kruglov)。
  • 防止在 tokens() 的第二个参数为 NULL 时发生崩溃。#92586 (Raúl Marín)。
  • 修复由于对底层 const PREWHERE 列进行就地修改可能导致的潜在崩溃问题。该问题可能在列收缩(IColumn::shrinkToFit)或过滤(IColumn::filter)时触发,这些操作可能会被多个线程并发执行。#92588 (Arsen Muk).
  • 当前已暂时禁用在包含大型分区片段(超过 4,294,967,295 行)的表上创建和物化文本索引。此限制是为防止出现不正确的查询结果,因为当前的索引实现尚不支持如此大的分区片段。#92644Anton Popov)。
  • 修复在执行 JOIN 时出现的逻辑错误 Too large size (A) passed to allocator。关闭 #92043#92667Yarik Briukhovetskyi)。
  • 修复了一个错误:当 ngrambf_v1 索引的 ngram 长度(第一个参数)大于 8 时会抛出异常的问题。#92672 (Robert Schulze)。
  • 修复在使用 ZooKeeper 存储时后台重新加载命名集合时出现的未捕获异常。修复 https://github.com/ClickHouse/clickhouse-private/issues/44180。 #92717 (Kseniia Sumarokova).
  • 修正了通配符授权的访问权限检查中不正确的逻辑。之前的尝试 https://github.com/ClickHouse/ClickHouse/pull/90928 虽然修复了一个严重漏洞,但最终限制过于严格,导致某些带通配符的 GRANT 语句因无关的撤销操作而失败。#92725pufit)。
  • 修复在 WHERE 子句中使用 not match(...) 时的数据跳过逻辑错误,该错误会导致结果错误。修复 #92492#92726Nihal Z. Miaji)。
  • 如果在只读磁盘上创建了 MergeTree 表,则在启动时不要尝试删除临时目录。#92748 (Alexey Milovidov)。
  • 修复在 ALTER TABLE REWRITE PARTS (v2) 中出现的 "Cannot add action to empty ExpressionActionsChain" 错误。 #92754 (Azat Khuzhin).
  • 避免因为从已断开的 Connection 读取而导致的崩溃。#92807 (Raufs Dunamalijevs)。
  • 修复在 Ordered 模式下存储引擎 S3Queue 中出现的逻辑错误 Failed to set file processing within 100 retries。现在该错误已被改为警告。在 25.10 版本之前,如果 Keeper 会话过期,可能会出现此错误;然而在 25.10+ 版本中,这种情况也只会记录为警告,因为在 Ordered 模式下高并发处理时,从理论上仍有可能出现此错误。 #92814 (Kseniia Sumarokova).
  • 之前,某些使用 PK 分片并带有恒为假条件的查询会失败,现在则不会了。此更改是 https://github.com/ClickHouse/ClickHouse/pull/89313 所需的。#92815Yarik Briukhovetskyi)。
  • 修复了 system.parts 表中文本索引未压缩大小的计算方式。#92832Anton Popov)。
  • 修正了在 WHERE 子句谓词中包含带子查询的 IN 子句时,轻量级更新对主索引的使用。#92838Anton Popov)。
  • 修复在 JSON 中为路径 'skip' 创建类型提示时的问题。关闭 #92731#92842Pavel Kruglov)。
  • 在 S3 表引擎中,如果存在非确定性函数,应避免缓存分区键。 #92844 (Miсhael Stetsyuk).
  • 修复在对带有 ratio_of_defaults_for_sparse_serialization=0.0 的稀疏列进行 mutation 后可能出现的错误 FILE_DOESNT_EXIST。修复 #92633#92860Pavel Kruglov)。
  • 修复旧版 Parquet 读取器(默认不启用)在 JSON 列位于 Tuple 列之后时的 Parquet schema 推断问题。修复旧版 Parquet 读取器(默认不启用)在处理空元组时失败的问题。#92867Michael Kolupaev)。
  • 修复在常量条件下并开启 join_use_nulls 时执行多个 JOIN 的逻辑错误,关闭 #92640#92892Vladimir Cherkasov)。
  • 修复在向分区表达式中包含子列的表插入数据时可能出现的错误 NOT_FOUND_COLUMN_IN_BLOCK。关闭 #93210。关闭 #83406#92905Pavel Kruglov)。
  • 修复在对带有别名的表使用 Merge 引擎时出现的 NO_SUCH_COLUMN_IN_TABLE 错误。关闭 #88665#92910Pavel Kruglov)。
  • 修复在 LowCardinality(Nullable(T)) 列上执行 full_sorting_join 时出现的 NULL != NULL 的情况。#92924Vladimir Cherkasov)。
  • 修复了在 MergeTree 表中执行文本索引合并时出现的多个崩溃问题。 #92925 (Anton Popov).
  • 在进行生存时间 (TTL) 聚合时,如有需要,为 SET 表达式的结果恢复 LowCardinality 包装,以防止在表优化期间抛出异常。#92971 (Seva Potapov).
  • 修复在索引分析中,当在 has 函数中使用空数组时出现的逻辑错误。关闭 #92906#92995Nihal Z. Miaji)。
  • 修复在终止后台调度池时可能发生的卡死问题(可能导致服务器在关闭时挂起)。 #93008 (Azat Khuzhin).
  • 修复在通过 ALTER 将设置项 ratio_of_defaults_for_sparse_serialization 修改为 1.0 之后,执行稀疏列变更时可能出现的 FILE_DOESNT_EXIST 错误。 #93016 (Pavel Kruglov).
  • 修复在 WHERE 子句中使用 not materialize(...)not CAST(...) 时的数据跳过逻辑错误,该错误会导致结果不正确。关闭 #88536#93017Nihal Z. Miaji)。
  • 修复由于共享分区片段上的 TOCTOU 竞态条件,可能会误用已过期分区片段的问题。#93022 (Azat Khuzhin)。
  • 修复在反序列化格式错误且包含越界偏移的 groupConcat 聚合状态时发生的崩溃。#93028Raufs Dunamalijevs)。
  • 修复在提前取消分布式查询后导致连接处于损坏状态的问题。 #93029 (Azat Khuzhin).
  • 修复了在右侧 join 键为稀疏列时的 join 结果问题。这解决了 #92920。我只能在 set compatibility='23.3' 时重现该 bug。不确定是否需要进行回溯(backport)。#93038Amos Bird)。
  • 修复在 estimateCompressionRatio() 中可能出现的 Cannot finalize buffer after cancellation 错误。修复: #87380 #93068 Azat Khuzhin)。
  • 修复了基于复杂表达式(例如 concat(col1, col2))构建的文本索引在合并时的问题。#93073 (Anton Popov)。
  • 修复在过滤条件包含子列时应用 PROJECTION 的问题。解决 #92882#93141Pavel Kruglov)。
  • 修复在将 join 运行时过滤器添加到查询计划时,在某些情况下被触发的逻辑错误。该问题是由于从 join 的一侧错误地返回了重复的常量列而导致的。 #93144 (Alexander Gololobov).
  • 由 join 运行时过滤器使用的特殊函数 __applyFilter 在某些本应合法的情况下错误地返回错误码 ILLEGAL_TYPE_OF_ARGUMENT。 #93187 (Alexander Gololobov)。
  • 防止在插值列实际上是同一列的别名时,不同的插值列在同一数据块中被折叠到同一列上。#93197 (Yakov Olkhovskiy)。
  • 在与已填充的右侧表进行 JOIN 时,不要添加运行时过滤器。#93211 (Alexander Gololobov)。
  • 修复 Keeper 在会话终止后未清理持久化 watch 的问题。此更改关闭了 #92480#93213Konstantin Vedernikov)。
  • 修复 Iceberg 中按元组进行 ORDER BY 时的问题。由此关闭 #92977#93225Konstantin Vedernikov)。
  • 修复 S3Queue 中 s3queue_migrate_old_metadata_to_buckets 设置的 bug。关闭 #93392#93196#81739#93232Kseniia Sumarokova)。
  • 在合并过程中重建投影时移除未使用的列。这样可以减少内存使用并降低临时分区片段的数量。#93233 (Nikolai Kochetov)。
  • 修复在存在标量关联子查询时,从子查询中删除未使用列的问题。在修复之前,如果某列仅在关联子查询中使用,则可能会被删除,从而导致查询以 NOT_FOUND_COLUMN_IN_BLOCK 错误失败。 #93273 (Dmitry Novik).
  • 修复在对源表执行 ALTER 时,物化视图中可能出现的子列缺失问题。关闭 #93231#93276Pavel Kruglov)。
  • 修复在使用 analyzer 为 Merge 表引擎进行查询规划时,在合并本地和远程/Distributed 表的情况下,可能对 hostName() 抛出 ILLEGAL_COLUMN 的问题。关闭 #92059#93286 (Jinlin)。
  • 修复了在使用非常量数组参数时 NOT IN 返回错误结果的问题,并增加了对非常量 Array 函数的支持。关闭 #14980#93314Yarik Briukhovetskyi)。
  • 修复 use_top_k_dynamic_filtering 优化中的 Not found column 错误。修复 #93186#93316Nikolai Kochetov)。
  • 修复了在子列之上创建的文本索引的重建问题。 #93326 (Anton Popov).
  • 修复了在 hasAllTokenshasAnyTokens 函数中将空数组作为第二个参数时的处理逻辑。#93328Anton Popov)。
  • 修复在包含右侧表 totals 且使用运行时过滤器的查询中的逻辑错误。 #93330 (Alexander Gololobov).
  • 当使用非 const 分词器参数(第 2、3、4 个参数)调用函数 tokens 时,例如 SELECT tokens(NULL, 1, materialize(1)),服务器不再崩溃。#93383Robert Schulze)。
  • 修复了 groupConcat 状态反序列化中的整数溢出漏洞,该漏洞可能在处理精心构造的聚合状态时导致内存安全问题。 #93426 (Raufs Dunamalijevs).
  • 修复了在数组列上进行文本索引分析时,如果索引中不包含任何 token(所有数组为空或所有 token 都被分词器跳过)时的处理逻辑。 #93457 (Anton Popov).
  • 如果连接字符串中已包含用户名/密码,则在 ClickHouse Client 中不再使用 OAuth 登录。#93459Krishna Mannem)。
  • 修复 DataLakeCatalog 中对 Azure ADLS Gen2 下发凭据的支持:从 Iceberg REST 目录中解析 adls.sas-token.* 键,并修正 ABFSS URL 解析。#93477Karun Anantharaman)。
  • 修复在使用分析器时对 GLOBAL IN 的支持(此前会在远程节点上再次创建 Set)。 #93507 (Azat Khuzhin).
  • 修复在反序列化期间直接将子列提取到稀疏列时的问题。#93512 (Pavel Kruglov)。
  • 修复了在直接从文本索引读取时处理重复搜索查询时的错误。 #93516 (Anton Popov).
  • 修复在启用运行时过滤器且参与 JOIN 的表中存在相同列被多次返回时(例如 SELECT a, a, a FROM t)出现的 NOT_FOUND_COLUMN_IN_BLOCK 错误。 #93526 (Alexander Gololobov)。
  • 修复一个 bug:使用 SSH 连接时,clickhouse-client 会要求输入两次密码。 #93547 (Isak Ellmer).
  • 确保在关闭时正确完成 ZooKeeper 的终止(修复在极少数情况下可能发生的关闭挂起问题)。 #93602 (Azat Khuzhin).
  • 修复在恢复 ReplicatedMergeTree 时,由去重竞态条件导致的 LOGICAL_ERROR。#93612Pablo Marcos)。
  • 修复在某些输入格式中,直接反序列化到稀疏列时,用稀疏列执行生存时间 (TTL) 更新的方式。该修复解决了可能出现的逻辑错误 Unexpected type of result TTL column#93619 (Pavel Kruglov).
  • 修复 h3 索引函数在使用无效输入调用时偶发崩溃或卡死的问题。#93657 (Michael Kolupaev).
  • 对非 UTF-8 数据使用 ngram_bf 索引会导致未初始化内存读取,读取到的值可能被写入到生成的索引结构中。修复了 #92576#93663Alexey Milovidov)。
  • 验证解压后的缓冲区大小是否符合预期。 #93690 (Raúl Marín).
  • 防止用户在未经过 SHOW COLUMNS 权限检查的情况下,使用 merge 表引擎从表中获取列列表。 #93695 (János Benjamin Antal).
  • 修复了针对子列创建的跳过索引在物化时的问题。 #93708 (Anton Popov).
  • 我们将各存储对象的共享指针保存在 QueryPipeline::resources::storage_holders 中,以确保在 PipelineExecutor 仍然存活时不会销毁 IStorage 对象。 #93746 (Miсhael Stetsyuk).
  • 修复在重启后 interserver 主机发生变化时附加 Replicated 数据库失败的问题。#93779 (Tuan Pham Anh)。
  • 修复在启用缓存时会在 ReadBufferFromS3 中触发的断言 !read_until_position 问题。 #93809 (Kseniia Sumarokova).
  • 修复了在极少数情况下将空元组用于 Map 列时的逻辑错误。关闭了 #93784#93814Nihal Z. Miaji)。
  • 修复了在合并期间重建投影时 _part_offset 出现损坏的问题,并通过避免对 _part_offset 列的不必要读取,以及在投影计算中跳过不需要的列来优化投影处理。此更改延续了在 #93233 中引入的优化。#93827Amos Bird)。
  • 移除对 'Bad version' 的处理逻辑。#93843 (Anton Ivashkin).
  • 修复当键为有符号整数类型时,optimize_inverse_dictionary_lookup 在分布式查询中不生效的问题。修复 #93259#93848Nihal Z. Miaji)。
  • 修复了在分布式 remote() 查询中 lag/lead 无法使用的问题。关闭 #90014#93858Nihal Z. Miaji)。
  • 修复系统监控分发问题。 #93937 (Pablo Marcos).
  • https://github.com/ClickHouse/ClickHouse/pull/89173 中,我们在通过内部管道由 TraceSender 发送的结构体中添加了一个额外字段。但是缓冲区大小并未更新(见这里),因此我们向缓冲区写入了超过 buffer_size 的数据,导致缓冲区被多次 flush。并且由于 TraceSender::send 是在不同线程中被调用的,不同线程的 flush 可能交错,从而破坏接收端(TraceCollector)所依赖的不变式。#93966Miсhael Stetsyuk)。
  • 修复在使用 USING 子句进行连接操作时,存储引擎 Join 执行向超类型类型转换的问题。修复了 #91672。修复了 #78572#94000Dmitry Novik)。
  • 修复在 Merge 表上应用 join 运行时过滤器时未正确添加 FilterStep 的问题。#94021Alexander Gololobov)。
  • 包含在多个列上使用谓词、带有 Bloom 过滤器跳过索引,并同时包含 ORNOT 条件的 SELECT 查询,此前可能会返回不一致的结果。该问题现已修复。#94026 (Shankar Iyer).
  • 修复在存在依赖索引时对 CLEAR 列的处理问题。#94057 (Raúl Marín)。
  • 修复 ReadWriteBufferFromHTTP 中 use-of-uninitialized-value(使用未初始化值)的问题。 #94058 (Alexey Milovidov).
  • 修复对 JSON 中类型化路径的错误检查。该检查在 https://github.com/ClickHouse/ClickHouse/pull/92842 中引入,可能会在启动现有表时导致错误。 #94070 (Pavel Kruglov).
  • 修复在存在 OUTER JOIN 时执行过滤分析时出现的崩溃。解决了 #90979#94080Dmitry Novik)。
  • 修复在并行执行时(max_threads > 1,默认值)使用 UInt8 聚合键时 uniqTheta 的精度问题。#94095 (Azat Khuzhin).
  • 修复由于在 SCOPE_EXIT 中调用 socket.setBlocking(true) 时抛出异常而导致的崩溃。#94100Miсhael Stetsyuk)。
  • 修复在 ReplicatedMergeTree 中,DROP PARTITION 删除由后续日志条目创建的分区片段时导致的数据丢失问题。 #94123 (Tuan Pham Anh)。
  • 修复了 parquet reader v3 在处理跨页面边界的数组时的错误行为。比如,当读取由 Arrow 写出但未启用页面统计或页面索引的文件时会出现这种情况。仅影响 Array 数据类型的列。典型表现是大约每 1 MB 数据就会有一个数组被截断。在此修复之前,可以使用如下设置作为临时解决方案:input_format_parquet_use_native_reader_v3 = 0#94125 (Michael Kolupaev)。
  • 修复 ReplicatedMergeTree 在等待日志记录时产生过多 watch 的问题。#94133Azat Khuzhin)。
  • 函数 arrayShufflearrayPartialShufflearrayRandomSample 用于将 const 列物化,以便不同的行得到不同的结果。#94134 (Joanna Hulboj).
  • 修复在 materialized view 中执行表函数时的数据竞争问题。#94171 (Alexey Milovidov)。
  • 修复在 PostgreSQL 数据库引擎中因查询不正确而导致的 nullptr 解引用问题。关闭 #92887#94180Alexey Milovidov)。
  • 修复了在可刷新materialized view 中使用包含多个子查询的 SELECT 查询时出现的内存泄漏。#94200Antonio Andelic)。
  • 修复了 DataPartStorageOnDiskBase::removesystem.parts 之间的数据竞争问题。关闭 #49076#94262Alexey Milovidov)。
  • 移除 HashTable 复制赋值运算符上错误使用的 noexcept 说明符,该说明符可能在发生内存异常时导致程序崩溃(调用 std::terminate)。#94275Nikita Taranov)。
  • 此前,在 GROUP BY 中使用重复列(例如 GROUP BY c0, c0)创建投影并插入数据时,如果启用了 optimize_row_order,会抛出 std::length_error。修复了 #94065#94277Alexey Milovidov)。
  • 修复 ZooKeeper 客户端在连接时的一个隐蔽 Bug,该问题会导致进程卡死或崩溃。 #94320 (Azat Khuzhin).
  • 修复“函数下推到子列”优化未真正应用于子列的问题。 #94323 (Pavel Kruglov).
  • 修复在启用 enable_lazy_columns_replication 的情况下,嵌套 RIGHT JOIN 中可能出现的不正确结果。该缺陷导致在被复制的列中,所有行错误地返回相同的值,而非各自不同的值。关闭 #93891#94339Vladimir Cherkasov)。
  • 修复基于等价集的 SEMI JOIN 过滤下推。当参数类型发生变化时,不要下推该过滤条件。修复了 #93264#94340Dmitry Novik)。
  • 修复 DeltaLake CDF 与 DataLake 数据库引擎中数据库的配合使用问题(Delta Lake 目录集成)。关闭 #94122#94342Kseniia Sumarokova)。
  • 在使用 SLRU 缓存策略时,修复当前指标 FilesystemCacheSizeLimit 值不正确的问题。#94363Kseniia Sumarokova)。
  • 创建 Backup 数据库引擎时,如果提供的参数少于两个,现在会返回更具描述性的错误消息(Wrong number of arguments,而不是 std::out_of_range: InlinedVector::at(size_type) const failed bounds check.)。#94374 (Robert Schulze)。
  • 在数据库级别撤销带有 GRANT OPTION 的全局授权时,会忽略那些实际上不可能执行的撤销操作。#94386 (pufit).
  • 修复从紧凑分区片段读取稀疏偏移量时的问题。关闭 #94385#94399Pavel Kruglov)。
  • 即使在 alter_column_secondary_index_mode 处于 throw 模式时,也不再阻止对使用隐式索引的列执行 ALTER 操作。#94425 (Raúl Marín).
  • 修复当多次调用 receivePacketsExpectQuery 读取 Protocol::Client::IgnoredPartUUIDsTCPHandler 崩溃的问题。#94434 (Miсhael Stetsyuk)。
  • 修复 system.functions 中敏感数据掩码处理的问题。 #94436 (Vitaly Baranov).
  • 修复在禁用 send_profile_events 时出现的空指针(nullptr)解引用问题。该功能是最近在 ClickHouse Python 驱动中引入的。关闭了 #92488#94466Alexey Milovidov)。
  • 修复在合并过程中出现的文本索引与 .mrk 文件之间的不兼容问题。#94494Peng Jian)。
  • 当启用 read_in_order_use_virtual_row 时,代码在未检查索引是否被截断的情况下,仍按完整主键大小访问索引列,从而导致 use-after-free / 未初始化内存问题。修复了 #85596#94500Alexey Milovidov)。
  • 修复在使用 GLOBAL IN 的子查询发送外部表时,当类型为 Nullable 时产生的类型不匹配错误。关闭 #94097#94511Alexey Milovidov)。
  • 在之前的版本中,对同一表达式具有多个索引条件的查询可能会错误地抛出异常 Not found column。修复了 #60660#94515Alexey Milovidov)。
  • 修复在运行时过滤器中对 Nullable JOIN 列的不正确处理。#94555Alexander Gololobov)。
  • 在一个正在使用的 workload 内创建另一个 workload 时不再会导致崩溃。#94599Sergei Trifonov)。
  • 修复在进行 ANY LEFT JOIN 优化时,对不存在的列计算 isNotNull 会导致的崩溃。#94600Molly)。
  • 修复在默认表达式引用具有计算默认值的其他列时的求值问题。#94615 (Alexey Milovidov).
  • 修复 BACKUP/RESTORE 操作中的权限问题。#94617Pablo Marcos)。
  • 修复在数据类型为 Nullable(DateTime64) 时由于错误的类型转换导致的崩溃。#94627Miс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#94680Vladimir Cherkasov)。
  • 在 Vertical 合并后保留固定索引粒度(use_const_adaptive_granularity)。#94725Azat Khuzhin)。
  • 修复与标量子查询和表依赖相关的 mutation 错误。如果某个表在某列上存在依赖(索引或 PROJECTION),标量子查询可能在没有数据的情况下被求值并缓存,从而导致不正确的变更。#94731 (Raúl Marín).
  • 修复 AsynchronousMetrics 在出错时回退到 cpu_pressure 的逻辑。#94827Raúl Marín)。
  • 在解引用指针之前,getURLHostRFC 函数缺少边界检查。当向 domainRFC 传递空字符串时,它会读取未初始化的内存,从而触发 MSan 错误。#94851Alexey Milovidov)。
  • 修复加密磁盘变为只读的问题。#94852 (Azat Khuzhin).
  • 修复在旧分析器下对分布式表使用分数形式 LIMIT/OFFSET 时的逻辑错误。关闭 #94712#94999Ahmed Gouda)。
  • 修复在默认启用 join 运行时过滤器时,在某些条件下发生的崩溃。#95000 (Alexander Gololobov)。
  • 改进对表引擎 URL() 和表函数 url() 所使用 URL 中的密码的脱敏处理。#95006 (Vitaly Baranov)。
  • enable_extended_results_for_datetime_functions 启用时,toStartOfInterval FUNCTION 的行为现在与 toStartOfX 相同,其中 XDay, Week, Month, Quarter, Year#95011 (Kirill Kopnev).
  • 修复了常量字符串比较未遵循 cast_string_to_date_time_modebool_true_representationbool_false_representationinput_format_null_as_default 等 SETTING 的问题。关闭 #91681#95040Nihal Z. Miaji)。
  • 修复文件系统缓存中的数据竞态问题。#95064 (Alexey Milovidov)。
  • 修复 Parquet 读取器中的一个罕见竞态条件。 #95068 (Alexey Milovidov).
  • 修复在 LIMIT 为零时 top K 优化中发生的崩溃。关闭 #93893#95072Alexey Milovidov)。
  • 从 DateTime/整数转换为 Time64 会使用 toTime 提取一天中的时间部分,但该函数不是单调的。ToDateTimeMonotonicity 模板错误地将此转换标记为单调的,导致在调试构建中出现 "Invalid binary search result in MergeTreeSetIndex" 异常。#95125 (Alexey Milovidov)。
  • 仅在必要时才重新生成清单文件中的条目列表(此前会在每次迭代时都重新生成)。 #95162 (Daniil Ivanik)。

构建 / 测试 / 打包改进