Skip to main content

向后不兼容的变更

查询与语法变更

  • 窗口函数 RANK 和 DENSE_RANK 现在会拒绝接受参数,并抛出 NUMBER_OF_ARGUMENTS_DOESNT_MATCH,以符合 SQL 标准。此前,诸如 RANK(x) OVER (ORDER BY id) 之类的查询会被静默接受,参数则被忽略,这经常让用户感到困惑。若要恢复此前的宽松行为,请设置 allow_rank_dense_rank_arguments = 1。#104324 (groeneai)。

数据类型变更

  • icebergHash 和 icebergBucket 现在会对 Int128、UInt128、Int256、UInt256 和 Decimal256 参数明确报错并拒绝执行。此前,它们会静默截断较宽的值,从而产生哈希冲突。Iceberg 规范仅定义了 32/64 位整数及精度不超过 38 的 Decimal 的哈希;对于可容纳的值,请转换为 Int64 或 Decimal128,以保持之前的行为。#105866 (Algunenano).
  • toUUID、toUUIDOrNull、toUUIDOrZero、toUUIDOrDefault、CAST 到 UUID 与 Nullable(UUID)、accurateCastOrNull 到 UUID,以及从文本解析 UUID 的输入格式 (Avro、MsgPack、JSONExtract 等) ,现在会拒绝长度正确但包含非十六进制字符的字符串。此前,这类输入会因越过十六进制数字查找表的末尾而被静默转换为一个凭空生成的 UUID。现在 toUUID 会抛出 CANNOT_PARSE_UUID,而 Or* 变体会返回 NULL / 全零 UUID / 所提供的默认值。#104370 (groeneai).
  • Dynamic 和 Variant 类型现在会在窗口的 PARTITION BY 子句中被校验;此前在 allow_suspicious_types_in_group_by 被禁用时并不会进行该检查。对 Dynamic 或 Variant 列进行窗口分区的查询现在会报错,除非设置 allow_suspicious_types_in_group_by = 1。#105450 (Avogar).

存储和索引变更

  • 禁止在 min/max 聚合函数和 minmax 索引中嵌套使用 Dynamic/Variant。此前仅检查顶层的 Dynamic/Variant。#105468 (Avogar)。
  • 服务器设置 insert_deduplication_version 的默认值从 compatible_double_hashes 改为 new_unified_hash。插入去重现在针对整个插入块 (每次插入) ,而非各个分片/分区:重试相同的插入仍会被去重,但产生相同分片的两次不同插入不再相互去重,对相同行重新排序后的插入也不再去重。设置 insert_deduplication_version = compatible_double_hashes 可恢复此前的行为。在 new_unified_hash 下,异步插入去重同样受同步窗口控制:是否启用 (replicated_deduplication_window) 及保留时长 (replicated_deduplication_window_seconds,默认 1 小时) 均遵循同步设置。因此,*_for_async_inserts 属于 legacy,仅适用于 old_separate_hashes / compatible_double_hashes。如果实例直接从默认使用 old_separate_hashes 的版本升级,应先使用 compatible_double_hashes,待最长的相关去重窗口过期后 (如果使用异步插入,还包括 replicated_deduplication_window_for_async_inserts,默认一周) ,再使用 new_unified_hash。从 compatible_double_hashes 切换的异步工作负载应先将 replicated_deduplication_window[_seconds] 提高到异步窗口的值 (并运行完整的异步窗口) 、停止异步插入,或继续使用 compatible_double_hashes,因为 new_unified_hash 不再检查保留时间更长的 async_blocks ID。#107886 (CheSema)。
  • 修复当 needle 包含 separator 时,hasToken 会通过文本索引静默返回结果,而非抛出 BAD_ARGUMENTS 的问题。#108189 (Ergus)。

已移除的功能

  • 你不能再使用已废弃的基于 Arrow 的 Parquet reader 和 writer,系统始终改用 native 实现。用于选择旧实现或对其进行调优的设置现已废弃并被忽略:input_format_parquet_use_native_reader_v3、output_format_parquet_use_custom_encoder、output_format_parquet_version、output_format_parquet_compliant_nested_types 和 output_format_parquet_unsupported_types_as_binary。native 写入器始终以符合规范的嵌套类型写出 Parquet V2.6+,并对不受支持的类型抛出 UNKNOWN_TYPE,而不再将其写为原始二进制数据。#100949 (alexey-milovidov) 。
  • 移除了已废弃的 allow_experimental_query_deduplication 设置及其不受支持的实验性查询去重功能。#99398 (devcrafter) 。
  • 当源表在指定分区中没有 分片 时,ALTER TABLE ... REPLACE PARTITION ... FROM ... 不再静默删除目标分区的数据。此前,此类请求会删除目标分区,但不会写入任何替代数据。现在默认会以 BAD_ARGUMENTS 拒绝此类请求。这是一项向后不兼容的变更:过去从空源执行的 REPLACE PARTITION 可以成功执行并清空目标分区,但升级后将抛出异常。若要恢复此前的静默清空行为,请设置新设置 allow_replace_partition_from_empty_source = 1 (可按查询设置或在 profile 中设置) ,或者将 compatibility 设置为 26.5 或更低版本。若要显式删除目标数据,请使用 ALTER TABLE ... DROP PARTITION ...。#104939 (groeneai) 。
  • 移除了实验性的 KQL (Kusto) 函数 array_sort_asc 和 array_sort_desc,以及其 SQL 后端函数 kql_array_sort_asc 和 kql_array_sort_desc。这些函数仍处于实验阶段,实现质量不佳,且容易引发正确性和解析器 bug。使用这些名称的查询现在会返回 UNKNOWN_FUNCTION。#108101 (groeneai) 。

新功能

函数

  • prometheusQuery 和 prometheusQueryRange 表函数现已支持 PromQL histogram_quantile 函数。借此可基于由 le 标签标识的经典 Prometheus 直方图桶计算分位数。#103477 (Yasumoto).
  • 新增 h3PolygonToCellsWithContainment 函数,支持以中心点为准、完全包含和重叠三种包含模式。#104455 (yousefQadry).
  • 用户现在可以为 formatReadableSize、formatReadableDecimalSize 和 formatReadableQuantity 函数指定可选的 precision 参数,以控制小数点后的位数。默认值为 2,保持此前的行为不变。#104648 (antoniofilipovic).
  • 为 argMin 和 argMax 新增聚合别名 min_by 和 max_by。#105712 (itsjoeoui).

SQL 和查询功能

  • formatReadableTimeDelta 现在接受 Month 和 Year 以外类型的 INTERVAL 表达式作为输入。#64315 (Beetelbrox).
  • 新增 PNG 输出格式支持,可将查询结果直接渲染为 PNG 图像。#74691 (m7kss1).
  • 为工作负载引入内存预留功能。请参阅工作负载调度文档。#82414 (serxa).
  • 为以 IP_ADDRESS 或 FORWARDED_IP_ADDRESS 为键的配额新增 IPV4_PREFIX_BITS 和 IPV6_PREFIX_BITS 选项,使配额限制可按 IP 子网共享,而非分别应用于每个完整 IP 地址。#89270 (adityachopra29).
  • 在 ALTER TABLE 查询中实现 ADD ENUM VALUES,无需再次指定现有 Enum 类型的所有值,即可简化新值的追加操作。#93830 (ilejn).
  • 新增用于读取数据的 GeoJSON 输入格式。#98124 (mneedham).
  • 为文本索引新增后处理器,用于在标记化后转换标记。#98939 (Ergus).
  • 新增可选启用的 ClickHouse Keeper TTL 节点支持。TTL 节点会在配置的生存时间 (TTL) 到期后自动过期,且不能拥有子节点。#100397 (scanhex12).
  • 为文本索引新增标记位置存储,以支持精确的 hasPhrase 搜索。启用 support_phrase_search 索引参数和 allow_experimental_text_index_phrase_search MergeTree 设置。#103172 (ahmadov).
  • 新增函数 arrayTopK 和 arrayBottomK:- arrayTopK(k, array) 按降序返回最大的 K 个元素 - arrayBottomK(k, array) 按升序返回最小的 K 个元素。#104563 (vitlibar).
  • 新增按名称模式选择列的支持,可使用 * LIKE '<pattern>' 和 * ILIKE '<pattern>',包括 table.* LIKE '<pattern>' 和 table.* ILIKE '<pattern>' 等限定形式。LIKE 区分大小写匹配列名,ILIKE 不区分大小写匹配列名。#104569 (niyue).
  • 新增针对 MergeTree 表的持续查询,该功能使用一系列快照读取。#105114 (Michicosun).
  • 新增 RowBinaryWithNamesAndTypesAndDefaults 格式,以增强对模式演进的支持。#105736 (mzitnik).
  • 新增可直接通过 SQL 提供 Mapbox 矢量瓦片的函数:MVTEncodeGeom 将几何对象投影到 slippy-map 瓦片的像素空间并进行裁剪;MVTEncode 将一组投影后的几何对象聚合为单图层瓦片的二进制字节;MVTBoundingBox / MVTBoundingBoxMercator 返回瓦片的边界框,以便将行限制在该范围内。支持 Point、line 和 Polygon 几何对象。还提供 PostGIS 别名 ST_AsMVTGeom 和 ST_AsMVT。 #106107 (saarthak2002).
  • 新增 LOCALTIME 和 LOCALTIMESTAMP (SQL 标准 / PostgreSQL 语法) 。LOCALTIMESTAMP 是 now() 的别名 (返回 DateTime) ;LOCALTIME 以 Time 值返回当前时间。 #106139 (thomas-cabral).
  • 新增两种 load_balancing 策略:hostname_longest_common_prefix 和 hostname_longest_common_suffix。它们会优先选择与发起方主机名具有最长公共前缀 (或后缀) 的副本。当数据中心编码在主机名的前缀或后缀中,且数字分段的长度可变时,这些策略十分有用;现有的 nearest_hostname 和 hostname_levenshtein_distance 策略在这种情况下会选择错误的副本。 #107360 (den-crane).
  • 新增函数 quantizeBFloat16ToInt8 和 dequantizeInt8ToBFloat16:一种标量 codec,使用 256 级高斯 Lloyd-Max 量化器将 embedding 分量压缩为 8 位,并可通过截断比特从中提取 Int4/Int2/二进制编码。 #108102 (alexey-milovidov).

表引擎和存储

设置与配置

  • 新增设置 output_format_always_write_decimal_point_in_float_and_decimal,使浮点数和 Decimal 数值在文本格式中始终输出小数点,即使值为整数也是如此。例如,输出 1. 而不是 1。默认禁用。#62614 (qoega)。
  • 新增不可变的 MergeTree 设置 allow_tuple_element_aggregation,默认禁用。启用后,SummingMergeTree、AggregatingMergeTree 和 CoalescingMergeTree 会递归展平 Tuple 列,并在合并期间分别聚合每个叶子元素,就如同它是顶层列一样:SummingMergeTree 对其求和,AggregatingMergeTree 合并其聚合函数状态,CoalescingMergeTree 保留其最后一个非 NULL 值。必须在创建表时指定此设置,不支持该设置的引擎会将其静默忽略。#98039 (JingYanchao)。
  • 新增 output_format_float_precision 设置,用于控制浮点数文本输出的小数位数。#99721 (phulv94)。
  • 新增 materialize_projections_on_insert 和 materialize_projections_on_merge 两项 MergeTree 表设置。当 materialize_projections_on_insert = 0 时,INSERT 操作会跳过构建投影 分片,从而提高包含大量投影的表的插入吞吐量。当 materialize_projections_on_merge = 1 时,合并操作会重建在其所有源 分片 中均缺失的投影,因此可在合并期间而非插入时构建投影。合并仍仅会组合拥有相同投影集合的 分片。#100993 (cwurm)。
  • 新增 S3Queue 设置 after_processing_move_preserve_path。当此设置与 after_processing=‘move’ 及 after_processing_move_prefix 一同启用时,已处理对象在移动时会保留完整的源路径,并将其置于目标前缀下,而非仅保留文件名。#105354 (asya-ch)。
  • 新增 url_prefix 和 full_url_prefix HTTP 处理器配置元素,用于匹配具有给定前缀的所有路径;同时新增明确的 url_regexp、full_url_regexp 和 headers_regexp 元素。旧版 <url>regex:...</url> 形式仍受支持。#107492 (vitlibar)。

身份验证

  • 为 S3 基于角色的访问新增可选的 external_id 凭据。#106941 (eliangidoni)。
  • 在 system.session_log 表中新增 TLS 客户端证书信息 (subject、序列号、签发方和有效期) ,以增强基于证书的身份验证的可观测性。#107679 (alexey-milovidov)。

系统表

  • 新增 system.iceberg_files 表,用于公开 Iceberg 表的逐文件元数据;每个表当前快照中的每个数据文件或删除文件均对应一行。 #104415 (asya-ch).
  • 新增假设 (what-if) 跳过索引。使用 CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ... 定义会话范围内的虚拟跳过索引,然后使用 EXPLAIN WHATIF SELECT ... 在不将其物化的情况下估算其跳过率和成本。已定义的索引可在新的 system.hypothetical_indexes 表中查看。 #104608 (yariks5s).
  • 新增 system.constraints 表,提供所有表中 CHECK 和 ASSUME 约束的信息,包括约束名称、类型和表达式。 #105337 (PedroTadim).
  • 新增系统表 system.documentation,将系统通用组件 (函数、表引擎、数据类型、设置、格式等) 的嵌入式参考文档汇集到单个表中,文档以 Markdown 格式呈现。 #107463 (alexey-milovidov).

Experimental 功能

  • 新增实验性的 dphyp INNER JOIN 重排序算法,可通过 query_plan_optimize_join_order_algorithm 设置启用;同时新增 query_plan_optimize_join_order_max_searched_plans 设置,用于限制联接顺序搜索,超出限制时会回退到链中的下一个算法。将其设为 0 可保留此前不受限制的搜索行为。 #98798 (davenger).
  • 为文本索引新增惰性倒排列表应用模式。通过 SET allow_experimental_text_index_lazy_apply = 1 和 SET text_index_posting_list_apply_mode = 'lazy' 启用后,倒排列表会采用基于游标的方法,按需以 packed-block 粒度解码,而非完整 materialized 为 Roaring Bitmap,从而降低选择性文本索引查询的内存使用量和 CPU 耗时。 #100035 (fastio).
  • 支持在主 HTTP 端口上配置 prometheus handler,并可选指定前缀。 #104975 (JTCunning).
  • 新增实验性 MergeTree 设置 packed_skip_index_max_bytes,可将较小的跳数索引子流打包到每个分片的单个 skp_idx.packed 归档中,在表中定义大量跳数索引时减少 inode 压力。写入时会按子流决定:序列化大小未超过阈值的子流会进入归档,较大的子流则保留独立的 skp_idx_<name>.idx2 / .mrk2 布局。单个分片可以混合使用两种布局。不支持全文索引,且始终按文件存储。默认值为 0 (禁用打包) 。 #105321 (Algunenano).
  • 支持使用 ABI BUFFERED_V1 为 WebAssembly UDF 进行 Buffers 序列化,并新增 webassembly_udf_enable_fuel 作为持久化的 WASM UDF 函数设置。 #105574 (antonio2368).
  • 多阶段分布式查询执行:规划器将查询计划拆分为多个阶段,这些阶段通过 scatter / 广播 / gather / shuffle exchange 连接,并将计划片段分派到工作节点。阶段间的数据通过 TCP 流式传输,或经由共享对象存储中的临时 File 传递;该执行路径支持分布式 shuffle 和广播哈希联接、shuffle 聚合及分布式排序。该功能仍处于实验阶段,默认禁用。 #106020 (davenger).
  • 实验性分布式查询计划引擎 (make_distributed_plan) 现在可为每个工作线程使用不同的任务分派端口和流式 exchange 端口,这些端口可在 <remote_servers> 中针对每个副本通过 stateless_worker_port 和 streaming_exchange_port 配置。未设置时,将使用此前的服务器级端口 (stateless_worker_client.port 和 distributed_query.streaming_exchange_port) 。这使得在一台主机上运行多个工作线程成为可能。 #107885 (davenger).

性能提升

JOIN 性能

  • 对于 JOIN 后接选择性 LIMIT、TopN 或另一个 JOIN 的场景,实现 selector 索引和复制索引的延迟应用。要控制启用延迟 selector 索引所需的载荷列数,请使用设置 query_plan_min_columns_for_join_lazy_indexing (0 表示禁用此优化) 。要控制应用此优化的 LIMIT 阈值,请使用设置 query_plan_max_limit_for_join_lazy_indexing。 #98883 (m-selmi).
  • 允许 ASOF JOIN 使用 parallel_hash JOIN 算法,在不同的等值键之间并行构建。此前,ASOF 会被无条件排除在 parallel_hash 之外。 #105375 (gregakinman).
  • 在 probe 端将哈希 JOIN 的 FixedHashMap 共享为 JOIN 运行时过滤器。当构建端哈希表为 FixedHashMap (或可转换为 FixedHashMap) 时,会将其发布为运行时过滤器,替代原本由 BuildRuntimeFilterStep 安装的 Set/BloomFilter。由新设置 enable_join_runtime_filter_shared_fixed_hash_table 控制 (默认值为 true) 。 #105640 (wudidapaopao).
  • 现在允许 DP JOIN 重排序与并行副本结合使用。 #105889 (nickitat).
  • 改进了 JOIN 使用运行时过滤器时的查询计划 (默认启用 enable_join_runtime_filters) :JOIN 重排序成本模型现在可穿透右子树中的 WindowTransform (以及其他保留行的查询计划步骤) ,使用底层行数和每列 NDV,而不再回退至无统计信息。 #107229 (UnamedRus).

查询优化

  • 通过优化对罕见标记的处理,提升了多标记搜索的文本索引分析性能。#98226 (CurtizJ).
  • 通过避免在 OpenSSL 3.x 中隐式地逐行查找 OpenSSL 提供商,提升了 encrypt、decrypt 和 halfMD5 函数的性能。#99105 (thevar1able).
  • 在 MATERIALIZE PROJECTION 中,于 projection.calculate() 之前合并源数据块,以减少临时 projection part 的数量和合并开销。在包含 5000 万行的表上速度提升约 3.4 倍。#100047 (amosbird).
  • Approximate Runtime Filters 和 Bloom Filter Indices 的性能得到提升,用户可从中受益。#100201 (cv4g).
  • 当 LIMIT BY 的列是 ORDER BY 的前缀时,通过在 Sort 期间的每个并行排序 stream 中执行 LIMIT BY,加速 ORDER BY ... LIMIT BY 查询。这减少了流经最终排序合并及后续管道步骤的行数。此优化由新设置 query_plan_push_limit_by_into_sort 控制 (默认启用) 。#104000 (nihalzp).
  • 降低简单 SELECT 查询 (解析、分析和规划) 的单次查询开销。例如,单个连接执行 SELECT count() FROM hits 的速度约提升 50%。#104513 (Algunenano).
  • 通过避免在范围检查期间重复调用 rb_max,提升了非 UInt64 groupBitmap 状态下 bitmapContains 的性能。#105960 (niyue).
  • 提升了具有 bloom_filter 索引的 LowCardinality 列的插入性能。#106410 (EmeraldShift).
  • 提升了 QBit 数据类型的 L2DistanceTransposed 和 cosineDistanceTransposed 函数性能。#106701 (rienath).
  • 提升了针对包含大量列的表的查询分析性能:仅在必要时计算列节点哈希值 (其中包含完整的源表表达式) 。现在,分析针对约 1200 列表的嵌套 SELECT * 子查询时,速度约提升 50 倍。#106957 (novikd).
  • 将 encrypt、decrypt、tryDecrypt、aes_encrypt_mysql 和 aes_decrypt_mysql 函数的性能提升最高一个数量级,恢复了从 BoringSSL 迁移至 OpenSSL 3.x (24.4) 时损失的性能。#107339 (thevar1able).
  • 通过避免不必要的字符串物化,改善了 Array(LowCardinality(String)) 上 arrayElement 的执行性能,以及键或值为 LowCardinality(String) 的 map 上 LIKE 函数的性能。#107450 (EmeraldShift).
  • 降低了筛选 DateTime64 列的查询的 CPU 使用率,并提升了 skip-index 的评估性能。#107707 (shankar-iyer).
  • 改进了不区分大小写的子串搜索性能,包括 positionCaseInsensitiveUTF8、ILIKE 和 multiSearchAnyCaseInsensitiveUTF8。#107882 (Algunenano).
  • 修复了 ARM 上 FPC 浮点编解码器约 16% 的吞吐量回归问题,该问题由预测器表开始使用 VectorWithMemoryTracking 引入。#108182 (groeneai).
  • 修复了一项性能回归:一次轻量级 DELETE 会禁用整个表的查询条件缓存。对曾执行过轻量级删除的表反复进行选择性查询时,不再进行粒度剪枝,而会回退为读取每个标记。#112947 (fm4v).
  • 限制了基于列统计信息估算 col IN (...) 选择性的开销,此前这可能会使单个查询的规划时间增加数百毫秒。估算器不再执行 col IN (subquery) 中的子查询来填充集合,因为它只需从中获取一个选择性数值——现在会跳过未构建的集合。对于大于新设置 statistics_max_set_size_for_exact_selectivity_estimation (默认值为 10000) 的集合,现在根据集合大小及其边界范围推导选择性。#114389 (nickitat).

函数和聚合性能

  • 优化长主键和高基数主键的主键索引分析。对于长主键,索引分析的运行时间现在主要取决于查询过滤条件的复杂度 (即实际使用的键列) ,而非主键长度——因此,对于仅过滤其中少数列的查询,扩展排序键几乎不会增加索引分析开销。对于高基数主键,ClickHouse 仅在内存中保留具有选择性的键列前缀,不加载末尾列;索引分析现在仅处理该内存中的前缀,而非整个键。此优化默认启用,可通过新设置 use_lightweight_primary_key_index_analysis 关闭。#91836 (nihalzp).
  • 合并包含大型聚合状态 (例如 groupArray) 的部分两级聚合结果时,通过在合并过程中逐步释放每个桶的源状态,而非在合并完成前一直保留所有状态,降低峰值内存占用。#102330 (yurifedoseev).
  • 针对高基数且均匀分布的键新增 GROUP BY 优化:通过对分组键进行哈希,将行分散到各个线程,使每个线程聚合互不重叠的键子集,无需合并阶段。设置 enable_sharding_aggregator = 1 以启用此功能。#104233 (nihalzp).
  • 通过在每个分区的 stream 内并行执行 LIMIT BY,而非在应用限制前将所有 stream 合并为一个,加速分区 MergeTree 表上的 LIMIT BY 查询。当分区表达式是 LIMIT BY 列的确定性函数时,此优化适用,因此任何 LIMIT BY 组都不会跨越两个分区。由新设置 allow_limit_by_partitions_independently 控制 (默认启用) 。#105126 (nihalzp).
  • 当 <cols> 是表排序键的前缀,或在 WHERE col = const 固定前导列后成为排序键前缀时,加速 SELECT ... LIMIT N BY <cols> 查询。启用后,MergeTree 按主键顺序读取数据,LIMIT BY 会先以流式模式进行过滤,每个已排序 stream 仅使用 O(1) 内存,从而滤除大部分数据;随后再对缩减后的数据正常执行 LIMIT BY,得到最终结果。由新设置 optimize_limit_by_in_order 控制 (默认启用) 。#105135 (nihalzp).
  • 通过移除冗余键表达式来加速 LIMIT BY 查询:作为其他键的确定性函数的键会被移除 (例如,LIMIT 5 BY x, f(x) 变为 LIMIT 5 BY x) ,而键的单射函数会被替换为其参数 (例如,LIMIT 5 BY toString(x) 变为 LIMIT 5 BY x) 。这样可减少每行计算的表达式数量,并降低计算开销。由新设置 optimize_limit_by_function_keys 和 optimize_injective_functions_in_limit_by 控制,二者默认均启用。#106818 (nihalzp).
  • 通过从函数解析缓存中移除冗余的查询树哈希,加速包含大量或深度嵌套函数调用的查询分析。#107516 (novikd).
  • 并行处理递归 CTE 的结果:对大型 WITH RECURSIVE 结果执行的 GROUP BY 或其他操作不再局限于单个线程。#107694 (alexey-milovidov).

存储和 I/O 性能

  • 使用相同端点和存储桶的 S3 客户端会共享缓存,避免重复发现区域。#96802 (zvonand).
  • 通过并行复制 blob,提高了对象存储的复制性能。#105089 (asya-ch).
  • 使用 One 输入格式和 file、s3 等类文件表函数时,不再读取文件内容。#105157 (niyue).
  • MergeTree 主键和跳过索引现在可以针对条件被 ifNull 或 coalesce 包装的过滤器裁剪粒度,例如 ifNull(key = 0, 0) 或 coalesce(key = 0, 0)。这类谓词通常由查询生成器生成,用于将可能为 NULL 的比较转换为确定的布尔值;此前索引分析无法识别这些谓词,因而无法跳过粒度。这扩展了现有的 allow_key_condition_coalesce_rewrite 设置 (默认启用) 。#106272 (andyzzhao).
  • 提高了对使用 BYTE_STREAM_SPLIT 编码的 Parquet FLOAT 和 DOUBLE 列的解码性能。#106376 (Algunenano).
  • 修复了大量访问实体 (行策略、角色、配额、profile) 同时变更时,复制访问存储导致登录和查询启动长时间停滞的问题。现在,每个实体缓存对每批通知只重新计算一次,而不是对每个变更实体重新计算一次,从而消除了可能让访问锁被持有数分钟的二次复杂度工作。#107672 (azat).
  • 修复了一项性能回归:通过 s3 及其他表函数从对象存储读取大量小文件时,预取会停止并回退为同步读取,导致单线程或低并发读取大量小文件的速度显著下降。#108872 (fm4v).
  • 当对象存储读取经过文件系统缓存 (filesystem_cache_name) 时,启用了初始小对象预取。此前,启用文件系统缓存后,读取大量小文件 (例如通过 S3Queue 摄取) 仍会保持同步并受延迟限制。#109478 (fm4v).
  • 在 PREWHERE 优化中考虑 Map 子列的磁盘大小。#110623 (Avogar).
  • 即使没有 ORDER BY,延迟物化现在也适用于带有 FINAL、过滤器和较小 LIMIT 的查询 (针对 ReplacingMergeTree) 。#110722 (KochetovNicolai).
  • 降低了跨多个分区的异步插入刷新操作的去重 CPU 时间。#111150 (valerypetrov).
  • 修复了一项 CPU 性能回归:当表包含 LowCardinality 列时,针对同一 MergeTree 分片执行大量相互独立的小型读取操作的查询会受到影响。用于判断分片是否具有单个共享字典的检查此前会在每个读取任务中扫描整个分片的所有标记;现在改为通过二分搜索查找每段连续的相同标记。自 26.6 起,在 index_granularity 较小的表上,这类查询的速度最多会降低数倍。#116134 (groeneai).

内存优化

  • 对于包含 Enum 列的表,Enum 类型元数据的内存占用最多可减少 10 倍。值到名称的查找性能保持不变或更快,而在解析和反序列化过程中,名称到值的查找可能会变慢。#95668 (qoega).
  • 写入备份条目时不再复制内部文件信息列表,从而降低 BACKUP 的峰值内存占用 (对于包含数百万文件的备份尤为显著) 。#111162 (jkartseva).

改进

查询和 SQL

  • 在查询计划中移除未使用的列时,按位置 (而非名称) 识别列。这样即使存在重复列名,也能移除未使用的列。#100586 (antaljanosbenjamin).
  • 新增 SESSION_USER,作为 currentUser() 的不区分大小写别名,以兼容 PostgreSQL / SQL 标准。#106081 (takumihara).
  • 降低了通过 PostgreSQL wire 协议运行的查询的取消延迟:KILL QUERY 现在可在单个 chunk 内中断输出序列化,无需等待整个 chunk 发送至客户端。#106535 (rvasin).
  • 修复了启用 serialize_query_plan = 1 且包含带常量参数的 lambda (例如 arrayMap(t -> t.2, ...)) 的分布式查询中出现的 ILLEGAL_TYPE_OF_ARGUMENT 错误。现在会在查询计划序列化期间保留 ActionsDAG INPUT 节点的常量列。#107124 (alexey-milovidov).
  • 降低了通过 MySQL wire 协议运行的查询的取消延迟:KILL QUERY 现在可在单个 chunk 内中断输出序列化,无需等待整个 chunk 发送至客户端。#107228 (rvasin).

函数

  • EXPLAIN SYNTAX 现在会在 explain 输出中统一将运算符格式化为函数调用 (例如使用 plus(1, 2) 而非 1 + 2) 。#94681 (1abdelhalim).
  • 现已支持 PostgreSQL 风格的 expr OP SOME(array) / expr OP ALL(array) (右侧不是子查询) ,对于 =/<> 会重写为 has / NOT has,对于其他比较运算符则重写为 arrayExists / arrayAll lambda 表达式。由于 any 同时也是聚合函数,数组形式不接受 ANY;请改用 SOME。ANY/SOME/ALL 的子查询形式仍会转换为 IN / NOT IN。#105129 (alexey-milovidov).
  • 文本索引现已支持函数 multiSearchAny、multiSearchAnyUTF8 和 multiMatchAny。此外,还改进了函数 match 的文本索引分析:包含备选分组的模式现在可跳过更多粒度。#106279 (CurtizJ).
  • 函数 h3PolygonToCells 现在会对 MultiPolygon 中所有多边形的数组总大小强制执行最大限制,验证底层 H3 库的返回码,并拒绝 MultiLineString 参数,而不再静默返回空结果。#106399 (Algunenano).
  • 反序列化聚合函数 contingency、cramersV、cramersVBiasCorrected 和 theilsU 的状态时,现在会验证存储的计数是否构成一致的列联表,否则将抛出 CORRUPTED_DATA 异常。#107185 (nihalzp).
  • 改进查询计划优化器的基数估计:由确定性单参数函数 (例如 toYear(date)) 生成的列现在会将其参数的不同值数量继承为上限,而不再缺少统计信息,从而实现更准确的 join 重排序。#107757 (davenger).

表引擎和存储

  • 修复 Kafka 表引擎消费者在分区分配后仍持续使用较短轮询间隔的问题,使其恢复使用配置的 kafka_poll_timeout_ms,从而避免重新平衡后出现过多空轮询、生成较小的插入 分片 以及额外的合并开销。#100431 (sugaf1204).
  • 数据湖表引擎 (包括 Iceberg 和 DeltaLake) 现在可使用经缓存包装的 S3 和 Azure 磁盘,使重复读取能够利用文件系统缓存。#102017 (RinChanNOWWW).
  • 允许将初始 PREWHERE 选择后引入的过滤器 (谓词下推、运行时过滤器,或显式 PREWHERE 加上规划器设置的 WHERE) 在优化器的第二次执行中合并到现有 PREWHERE,而非保留为 MergeTree 读取操作之上的独立 Filter 步骤。#105445 (yariks5s).
  • 添加了 wait_for_part_commit_in_dependent_materialized_views 设置。启用后,回连源表的级联 materialized view 可以看到当前正在插入的行。#105943 (ahmadov).
  • 新增与 PostgreSQL 兼容的 EXTRACT(TIMEZONE_HOUR FROM dt) 和 EXTRACT(TIMEZONE_MINUTE FROM dt),用于提取时区偏移的小时和分钟部分;以及 EXTRACT(<unit> FROM INTERVAL n <unit>) / date_part('<unit>', INTERVAL n <unit>),用于从时间间隔中提取值。#106227 (vinayakj592).
  • 实现了 SYSTEM RESTART DISK <name>:现在会重新加载磁盘的内存中元数据,并重新扫描该磁盘上 readonly-replica 表的 data 分片。这使共享 plain_rewritable 存储上的表的 readonly 副本可按需看到另一台服务器写入的数据,无需等待 refresh_parts_interval 或重启服务器。#106645 (jrdi).
  • 跳过对 JSON 高级共享数据不必要的标记文件加载。#107051 (Avogar).
  • 为 MaterializedPostgreSQL 数据库引擎添加了创建时设置 materialized_postgresql_use_extended_date_and_time_types。默认情况下 (启用) ,PostgreSQL date/timestamp 列会被推断为 Date32/DateTime64;在 CREATE DATABASE 时将其设为 0,则会推断为范围较窄的 Date/DateTime 类型。该设置不适用于 MaterializedPostgreSQL 表引擎。#107428 (alexey-milovidov).
  • MergeTree 现在可以读取由不同 codec 压缩块组成的压缩流。这是自适应 codec 选择在读取端的前置条件。#108592 (rienath).
  • 当 transform_null_in = 1 且 IN 集合不含 NULL 值时,对直接建立索引的列上的 IN 谓词使用 bloom_filter 跳过索引。此前,此类查询会跳过该索引,导致全表扫描。#111329 (groeneai).

S3 和对象存储

  • 对所有已授予的访问权限检查,均在 system.query_log.used_privileges 中记录所用特权,包括通过不抛出异常的 isGranted 路径 (checkAccessWithFilter) 进行的检查。此前仅记录通过会抛出异常的入口点 (checkAccess / checkGrantOption) 检查的特权,导致在使用 file / s3 / azure / url 表函数的 DESCRIBE、CREATE TABLE AS 及类似查询中,READ ON FILE / READ ON S3 / READ ON AZURE / READ ON URL 不会显示在审计日志中。访问控制行为保持不变。 #104693 (alexbakharew).
  • 通过任务跟踪器异步完成最后一个 S3 分段上传请求,使其可与最后一个分片的上传并行进行,而非在 finalize 阶段串行执行。 #105487 (asya-ch).
  • 将 S3Queue 和 AzureQueue 的 persistent_processing_node_ttl_seconds 默认设置从一小时延长至六小时,避免长时间运行或重启后的处理过程过早丢失 bucket 锁。 #106838 (kssenii).
  • s3_storage_class_name 设置现支持 REDUCED_REDUNDANCY、STANDARD_IA、ONEZONE_IA、GLACIER_IR 和 EXPRESS_ONEZONE 值 (除原有的 STANDARD 和 INTELLIGENT_TIERING 外) 。 #107251 (adityaksolves).
  • 对象存储表 (例如 S3) 的 Hive 分区样本路径将在首次使用该表时解析,而非在 CREATE/ATTACH 时解析,因此无法访问的端点不再阻碍表创建和服务器启动。 #111842 (evillique).

设置与配置

  • 在兼容性设置 file_like_engine_default_partition_strategy 中将 hive 分区策略设为默认值。#86746 (kssenii).
  • 新增四项 MergeTree 表设置,用于控制文本索引的默认参数:text_index_dictionary_block_size、text_index_dictionary_block_frontcoding_compression、text_index_posting_list_block_size 和 text_index_posting_list_codec。这些设置可在表级别调优文本索引行为,无需在每个索引定义中指定参数。索引级别显式指定的参数仍具有更高优先级。#100626 (CurtizJ).
  • 新增设置 output_format_pretty_use_nbsp_for_padding:当 output_format_pretty_grid_charset 为 UTF-8 时,将表格风格 Pretty 格式中用于表格布局的填充空格渲染为 U+00A0 不换行空格。这有助于复制的 Pretty 输出在会合并普通空格的工具中保持表格对齐。该设置默认禁用,ASCII 字符集输出仍使用普通空格。#103559 (ashrithb).
  • 通过设置 analyzer_compatibility_allow_non_aggregate_in_having 支持兼容旧版 analyzer。启用后,非聚合合取条件将从 HAVING 移至 WHERE。#104232 (novikd).
  • 当目标表设置了 table_readonly = 1 时,OPTIMIZE TABLE ... ON CLUSTER 和其他 DDL 不再挂起。该设置现在会抛出新的专用错误代码 TABLE_IS_PERMANENTLY_READ_ONLY,DDLWorker 会将其视为不可重试错误 (不同于临时 ReplicatedMergeTree ZooKeeper 连接中断时出现的暂时性 TABLE_IS_READ_ONLY) 。现在也会明确拒绝对 ReplicatedMergeTree 使用 table_readonly 设置,无论是在创建时还是通过 ALTER MODIFY SETTING。#105109 (alexey-milovidov).
  • MergeTree 排序键中的降序排列 (例如 ORDER BY (time DESC, key)) 现已始终受支持,不再需要现已废弃的 Experimental 设置 allow_experimental_reverse_key。#106440 (nikitamikhaylov).
  • 支持在静态服务器配置 (users.xml) 中为配额定义 keyed_by_normalized_query_hash,与现有的 CREATE QUOTA ... KEYED BY normalized_query_hash DDL 语法一致。#107654 (alexey-milovidov).
  • 兼容性设置不再应用已废弃的设置,因此不会将其标记为已更改,也不会产生已废弃设置警告。#107737 (UberDever).
  • 新增设置 analyzer_compatibility_multiple_joins_qualify_column_names (默认值为 false) 。启用后,当查询的 FROM 子句包含两个或更多 JOIN 时,analyzer 生成的结果列名会模拟旧版 analyzer 对多个 JOIN 的重写行为:从 * 展开的列命名为 <alias-or-table>.<column>,而 SELECT 列表中未使用别名的列引用会保留其原始写法。这使得引用此类限定名称的外层查询 (如 SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...)) 能够像使用旧版 analyzer 时一样正常工作。同时修复了当 group_by_use_nulls 与 ROLLUP、CUBE 或 GROUPING SETS 结合使用时,analyzer 会丢失从 * 展开的列的限定结果列名的问题;该问题会产生重复的结果列名,并导致外层无法引用这些列。#110746 (novikd).
  • 新增设置 analyzer_compatibility_apply_final_to_all_joined_tables,用于恢复旧行为:JOIN 中最左侧表上的 FINAL 修饰符也会应用到其他关联表。该设置已记录在设置变更历史中,因此将 compatibility 设置为 26.6 之前的版本时,会自动恢复旧语义。#111589 (fm4v).
  • 新增 MergeTree 设置 text_index_version,用于控制文本索引的磁盘格式版本:v0_initial、v1_with_codec 或 v2_with_positions。在滚动升级期间或降级前,请将其设置为较早版本,以便较新服务器继续以较旧服务器仍可读取的格式写入文本索引 parts;兼容性设置会自动调整该值。#111803 (CurtizJ).

系统表与监控

  • 通过 DataLakeCatalog 查询表时,使用存储引擎名称填充 system.query_log 中的 used_storages。 #100706 (melvynator).
  • 在 system.merges 中新增 current_projection、current_projection_progress、projections_completed 和 projections_remaining 列,以展示投影合并进度。 #102611 (amosbird).
  • 表引擎现已包含嵌入式文档,可通过 system.table_engines 表新增的 description、syntax、examples、introduced_in 和 related 列查看。 #106177 (alexey-milovidov).
  • 数据库引擎现已包含嵌入式文档,可通过 system.database_engines 表新增的 description、syntax、examples、introduced_in 和 related 列查看。 #106178 (alexey-milovidov).
  • 数据类型现已包含嵌入式文档,可通过 system.data_type_families 表新增的 description、syntax、examples、introduced_in 和 related 列查看。 #106180 (alexey-milovidov).
  • 输入/输出格式现已包含嵌入式文档,可通过 system.formats 表新增的 description、examples、introduced_in 和 related 列查看。 #106181 (alexey-milovidov).
  • 聚合函数组合器现已包含嵌入式文档,可通过 system.aggregate_function_combinators 表新增的 description、syntax、examples、introduced_in 和 related 列查看。 #106185 (alexey-milovidov).
  • 新增 system.data_skipping_index_types 表,列出可用的数据跳过索引类型及其嵌入式文档 (description、syntax、examples、introduced_in、related) 。 #106186 (alexey-milovidov).
  • 新增 system.disk_types 表,列出可用的磁盘类型及其嵌入式文档 (description、syntax、examples、introduced_in、related) 。 #106187 (alexey-milovidov).
  • 新增异步指标 TotalUncompressedBytesOfMergeTreeTables 和 TotalUncompressedBytesOfMergeTreeTablesSystem,用于报告存储在 MergeTree 家族表中的数据未压缩总大小。 #106364 (alexey-milovidov).
  • 新增 GlobalMemoryLimitExceeded 性能分析事件,使运维人员能够监控何时触及服务器全局内存限制。 #106466 (sacheendra).
  • 新增异步指标 ExecutableUserDefinedFunctionMemoryResidentBytes 和 ExecutableUserDefinedFunctionProcesses,用于报告 executable 和 executable_pool 用户自定义函数的常驻内存 (VmRSS) 和存活进程数,其中包括后代进程和空闲池工作进程。 #107300 (HanziJiang).
  • 新增默认启用的 show_remote_databases_in_system_tables,允许用户在 system.tables、system.columns 和 system.completions 中隐藏 MySQL 和 PostgreSQL 数据库。show_data_lake_catalogs_in_system_tables 仍仅用于控制 DataLakeCatalog 的可见性。#104416 (pamarcos)。#109082 (pamarcos)。

ClickHouse Keeper

  • 对 Keeper 进行了多项改进,使其整体性能提升约 2 倍 (改进批处理、将消息流水线式发送给 leader、流水线式追加日志) 。#101757 (al13n321) 。
  • 为 watches 新增更多 Keeper profile 事件 (服务端和客户端) 。#105336 (scanhex12) 。
  • 新增仅适用于 Keeper 的 system.keeper_snapshots 表,包含本地 ClickHouse Keeper 快照的信息。#105571 (mstetsyuk) 。
  • 新增仅适用于 Keeper 的 system.keeper_changelogs 表,包含本地 ClickHouse Keeper 更新日志 (Raft 日志) 文件的信息。#105617 (mstetsyuk) 。
  • 新增仅适用于 Keeper 的 system.keeper_cluster 表,其中当前 Keeper 看到的每个 Raft 集群成员各占一行。#105646 (mstetsyuk) 。
  • 使用 KeeperMemoryStorage 在 ClickHouse Keeper 中应用收到的快照时,降低峰值内存占用。#105851 (antonio2368) 。
  • 新增 Keeper coordination_settings,用于限制 NuRaft 未提交日志条目的接纳,以及对 append-entries 反向探测进行节流。#106108 (antonio2368) 。

内存管理

  • 修复了 parser 在回溯越过 statement 末尾后,语法错误消息可能包含相邻内存字节的问题。#105086 (groeneai)。
  • 降低了打开备份时的内存占用 (用于 RESTORE,或作为增量 BACKUP 的基础) 。现在以 stream 方式解析 .backup 元数据,而非将其加载为内存中的 XML 文档树;对于大型备份 (尤其是增量备份) ,这可避免分配数 GB 的 DOM 树。#109107 (jkartseva)。
  • 降低了完成 BACKUP 时的峰值内存占用。写入备份 元数据 时,不再将所有文件的信息复制到临时 vector 中 (对于包含数百万个文件的备份,此前会暂时消耗数 GB 内存) ;现在改为原地遍历这些信息。#109861 (jkartseva)。

数据格式

  • 用户现在可以插入适用于 8 位/16 位/32 位/64 位整数 Variant 的 Avro Fixed 字段。#98139 (patrickpichler) 。
  • AvroConfluent 格式现在会在发生瞬时故障 (传输超时、连接被拒绝、DNS 错误、HTTP 5xx/408/429) 时,以指数退避方式重试 Confluent Schema Registry HTTP 客户端,而不再在首次网络波动时中止 INSERT。新增设置 format_avro_schema_registry_max_retries (默认值 5) 和 format_avro_schema_registry_retry_initial_backoff_ms (默认值 100) 用于控制重试策略。schema 验证错误 (HTTP 409、格式错误的 Avro JSON) 仍会导致操作失败。#106661 (groeneai) 。
  • 保留了通过 Apache Arrow 返回的错误所对应的原始 ClickHouse 错误代码。#107267 (azat) 。

命名集合和字典

  • 为 mysql 表函数、MySQL 表引擎、MySQL 数据库引擎、字典 SOURCE(MYSQL) 和命名集合新增 enable_compression 设置。启用后,ClickHouse 会对通过连接传输的所有数据协商使用 MySQL 协议级压缩。#103229 (bernardlim).
  • 新增 system.dictionary_layouts 表,列出可用的字典布局及其嵌入式文档 (description、syntax、examples、introduced_in、related) 。#106182 (alexey-milovidov).
  • 新增 system.dictionary_sources 表,列出可用的字典源及其嵌入式文档 (description、syntax、examples、introduced_in、related) 。#106184 (alexey-milovidov).
  • 现在可在 system.server_settings 中通过 named_collections_storage.type 或 getServerSetting('named_collections_storage_type') 获取实际生效的命名集合存储类型。#111806 (pamarcos).

其他改进

  • 改进错误消息中的表名提示:不再提示完全相同的名称,并会在建议中包含数据库名称 (例如,“你是否想要 other_db.my_table?”) 。#95116 (matt-metivier).
  • 改进了不含 FROM 子句的查询中无法解析标识符时的错误消息,建议添加 FROM 子句。#101769 (Onyx2406).
  • 修复了主键列上使用 IN 子查询的 PREWHERE 未利用主键索引进行粒度剪枝的问题;该问题会导致全表扫描,而非仅读取相关粒度。#102570 (nikitamikhaylov).
  • 现在,可刷新materialized view 在使用 EXCHANGE TABLES 替换目标表并删除旧表后,仍会继续刷新。此前,由于保留了旧表的 UUID,刷新可能会失败并引发 UNKNOWN_TABLE 异常。#102724 (seva-potapov).
  • 默认启用 enable_join_transitive_predicates。#103724 (davenger).
  • 可刷新materialized view 现支持 REFRESH DEPENDS ON,可由另一个 RMV 的刷新触发,而非按时间计划触发。 (REFRESH EVERY ... DEPENDS ON 已存在,但无法可靠地用于此用例。) 请参阅 CREATE MATERIALIZED VIEW 文档。#104440 (al13n321).
  • 添加 EXPLAIN PIPELINE 选项,用于压缩重复的处理器链。#104662 (niyue).
  • 添加 REGEXP_SUBSTR 作为 regexpExtract 的不区分大小写别名,以兼容 Oracle、MySQL 和 Snowflake。#105122 (alexey-milovidov).
  • 添加 date_part('unit', expr),作为 EXTRACT(unit FROM expr) 的语法糖。支持标准时间间隔类型以及 PostgreSQL 扩展项 (epoch、dow、doy、isodow、isoyear、century、decade、millennium) 。#105127 (alexey-milovidov).
  • QueryConditionCache 现在会单独记录读取批次中被过滤掉的粒度,即使该批次仅部分通过 PREWHERE 也是如此,从而减少后续使用相同条件的查询重新读取的标记数量。#105335 (hanfei1991).
  • 为数值谓词函数添加 BFloat16 支持。#105391 (mohhddhassan).
  • 支持基本统计信息:一种紧凑的按列统计信息,可在适用时存储数值最小值/最大值、平均字符串长度和 NULL 计数。#106048 (hanfei1991).
  • 支持在 ALTER TABLE ... ADD/MODIFY COLUMN 中使用尾随 NULL / NOT NULL 修饰符,与 CREATE TABLE 一致。#106150 (takumihara).
  • PREWHERE 优化器现在会先将引用相同列集合的合取条件分组,再估算选择性。因此,a > 2500 AND a < 2502 这类条件会作为组合范围 (选择性约为 0.02%) 统一评估,而不是作为两个独立谓词 (各约 50%) 分别评估。在列统计信息可用时,这能更准确地确定 PREWHERE 条件的顺序。 #106337 (hanfei1991).
  • 当堆栈跟踪实际为空时,不再在异常消息中输出 “Stack trace (when copying this message, always include the lines below):” 前导内容。 #106524 (alexey-milovidov).
  • 修复了加密磁盘上的 CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM) 会复制数据而非创建硬链接的问题。 #106731 (nikitamikhaylov).
  • 修复了 catalog_type = 'onelake' 的 DataLakeCatalog 数据库在读取表数据时默认使用 OneLake Blob 端点 (.blob.fabric.microsoft.com) 的问题。设置 onelake_use_blob_endpoint = false 可保留此前使用 DFS 端点 (.dfs.fabric.microsoft.com) 的行为。 #106843 (scanhex12).
  • 仅在队列从空变为非空时通知日志消费者,而不再针对每条消息通知,从而降低了高日志速率下异步日志的 CPU 开销。 #107352 (nikitamikhaylov).
  • 修复了 MySQL 握手过程中 auth_response 长度的读取问题:由于被当作有符号 char 读取,长度字节 >= 128 会被解释为数 GB 的值。 #107384 (uwezkhan).
  • MaterializedPostgreSQL 现在会将精度大于 76 的 PostgreSQL numeric(p, 0) 列 (例如用于 256 位整数的 numeric(78, 0)) 映射为 ClickHouse Int256,不再因 “Precision too big” 而失败。无法容纳在 Int256 中的值将被拒绝,并返回明确的错误信息。 #107431 (alexey-milovidov).
  • Nullable(Tuple(...)) 现处于 Beta 阶段。默认禁用,设置 enable_nullable_tuple_type = 1 即可使用。 #107754 (nihalzp).
  • 异步插入不再在 trace/debug 级别记录完整的 query_id 列表;自 26.2 起,这可能导致异步插入流量较大的服务中 text_log 急剧膨胀。详细日志现记录在 test 级别。 #107852 (CheSema).
  • 通过及时释放失效的 priority 条目,降低了文件系统缓存的元数据占用。 #107903 (kssenii).
  • Array 列上的 bloom_filter 跳过索引现在也可用于 arrayJoin(column) IN (set)、arrayJoin(column) GLOBAL IN (set) 和 arrayJoin(column) = const,其使用方式与此前已支持的 hasAny(column, set) 和 has(column, const) 相同。此前,这些 arrayJoin ... 形式会回退为全表扫描。 #109536 (groeneai).
  • IS NOT DISTINCT FROM 和 IS TRUE 现在与 = 一样,会利用主键和 minmax 索引跳过粒度。此前,k IS NOT DISTINCT FROM 42 和 (k = 42) IS TRUE 会扫描所有粒度。#110006 (groeneai) 。

缺陷修复

JOIN 修复

  • 修复内部供 ARRAY JOIN 使用的 nested 函数会从列类型中移除 LowCardinality 的问题,该问题导致输出中的 Array(LowCardinality(String)) 变为 Array(String)。#98974 (Onyx2406)。
  • 修复与另一张表进行逗号连接 (交叉连接) 时,join 重排序会静默丢弃 RIGHT/LEFT JOIN 中未匹配行的问题,例如 t1 RIGHT JOIN t2 ON t1.c = t2.c, t3。此前,该查询返回内连接结果而非外连接结果。#101684 (groeneai)。
  • 修复执行涉及 JOIN 中包含聚合的 VIEW 的查询时可能发生的 LOGICAL_ERROR (“Port is not connected”,代码 49) 。#102574 (Ergus)。
  • 修复在新 analyzer 下,GLOBAL IN 和 GLOBAL JOIN 查询会静默忽略 max_rows_to_transfer 和 max_bytes_to_transfer 的问题。当物化外部表超出配置的限制时,这些设置现在会引发 SET_SIZE_LIMIT_EXCEEDED (或根据 transfer_overflow_mode 中断) ,与旧 analyzer 的行为一致。#104119 (groeneai)。
  • 修复当优化重排列查找列时,右侧为 MergeTree 表且使用 join_algorithm = 'direct' 的 JOIN 查询可能产生错误结果或失败的问题。#104174 (groeneai)。
  • 修复在 JOIN 后结合使用 arrayJoin 与 ORDER BY ... LIMIT 的查询可能静默返回零行的问题。当被提升的表达式包含 arrayJoin 时,不再应用将函数求值提升到 SortingStep 之前的查询计划优化,因为 arrayJoin 可能改变行数。#104558 (groeneai)。
  • 修复某些情况下与 ARRAY JOIN 一同使用时,负数 LIMIT BY 出现逻辑错误的问题。#105403 (nihalzp)。
  • 新增兼容性设置 analyzer_compatibility_prefer_alias_over_subcolumn (默认禁用) 。启用后,对于多部分标识符,新 analyzer 会优先将其解释为别名前缀,而非匹配 Tuple 子列或带点的列,从而恢复旧解释器的行为。当查询 join 的表名与 CTE/子查询中使用 SELECT * 对 join 结果进行查询的内部表名相同时,这可避免出现 AMBIGUOUS_IDENTIFIER (及相关) 错误;否则,星号重命名的列 (例如 b.id) 会将内部表标识符泄漏到外部作用域。#105491 (vdimir)。
  • 修复将外连接与后续引用外连接中提供 NULL 一侧的内连接组合使用时,查询可能产生错误结果的问题。join 重排序可能选择将内连接条件纳入外连接的 ON 子句的查询计划。#105992 (vdimir)。
  • 改进与旧 analyzer 的兼容性。如果表包含 x.a Array, x.b Array, x String 这类列,对于 ARRAY JOIN x 会优先使用数组。#106069 (KochetovNicolai)。
  • 修复启用 enable_parallel_replicas、query_plan_use_new_logical_join_step 和 query_plan_optimize_join_order_algorithm = 'greedy' 时,左侧 MergeTree 表为空的 INNER JOIN 查询出现异常的问题。#106338 (KochetovNicolai)。
  • 修复了当 JOIN 图中的两个关系共享列名时,使用并行副本执行 JOIN 可能导致 JOIN 顺序优化器出现的逻辑错误 (Left and right columns have same names) 。#106418 (alexey-milovidov).
  • 修复了在 JoiningTransform 中执行 LEFT JOIN 时出现的 LOGICAL_ERROR (Invalid number of rows in Chunk) ;该 JOIN 的右侧键唯一,包含混合 ON 条件,且 max_joined_block_size_rows 较小。#106928 (groeneai).
  • 修复了当连接键包含嵌套在 Tuple、Array 或 Map 中的 Variant 或 Dynamic 类型,且 JOIN 右侧只有一个不同值时,JOIN 运行时过滤器中出现的异常 (LOGICAL_ERROR) 。#106931 (groeneai).
  • 修复了对由 Dynamic 上的 JOIN 构建的 Dynamic 列执行函数时出现的 LOGICAL_ERROR (Expected the argument N to have X rows, but it has Y) (例如,RIGHT/FULL JOIN 中未连接的行,或被去关联并转换为 JOIN 的关联 EXISTS 子查询) 。#107095 (groeneai).
  • 修复了将 JOIN ... USING 键的限定星号 (t.*) 传递给聚合函数,且外部 JOIN 的另一侧具有 Nullable 键时出现的 Bad cast from type DB::IColumn const* to DB::ColumnNullable const* 逻辑错误异常 (join_use_nulls = 0) 。#107129 (groeneai).
  • 修复了析取 (部分谓词) 下推优化将条件下推至类型被 JOIN 扩宽的 USING 键时出现的逻辑错误 (Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) 。同时修复了 analyzer 在解析 JOIN ... USING 查询中的标识符时发生的服务器崩溃 (分段错误) ;此类查询包含引用未知标识符、可进行常量折叠的 if/multiIf 分支。#107407 (groeneai).
  • 修复了运行时 JOIN 过滤器在处理 JSON 列时产生错误结果的问题。#107663 (Avogar).
  • 修复了限定星号 (t.*) 选择 JOIN USING 键,且该 JOIN 嵌套在 PASTE/CROSS/逗号 JOIN 或外部 ON JOIN 之下时出现的 Bad cast from type DB::ColumnNullable to DB::ColumnVector<...> 逻辑错误异常,其中 join_use_nulls = 0。#108043 (groeneai).
  • 修复了新 analyzer 中的一个错误:对 JOIN 中某个表应用 FINAL (例如 FROM t1 FINAL JOIN t2) 时,FINAL 也会被错误地应用到其他已连接的表,导致此类查询变慢。#108979 (vdimir).
  • 当 analyzer_compatibility_join_using_top_level_identifier = 1 时,JOIN ... USING 中的标识符现在可以解析为 SELECT 列表中子表达式定义的别名 (例如 SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)) ,与旧 analyzer 的行为一致。此前仅考虑顶层投影别名,即使启用了该设置,此类查询仍会因 UNKNOWN_IDENTIFIER 异常而失败。现在,即使匹配的别名位于嵌套表达式中,也会显示建议启用该设置的错误提示。#110739 (novikd).
  • 修复了对 Join 引擎表执行 ANY JOIN 时的 INCOMPATIBLE_TYPE_OF_JOIN 错误:当右侧列上的 WHERE 过滤条件允许查询计划器将 JOIN 重写为 SEMI 或 ANTI 时会触发该错误。Join 引擎表声明的严格性是固定的,无法更改,因此现在不会对此类表进行转换。#111362 (groeneai).
  • 修复了对字典执行 JOIN 时,若连接键使用 Nullable、LowCardinality 或 LowCardinality(Nullable),而字典键未被包装所导致的 TYPE_MISMATCH (“复杂键的键类型……不匹配”) 错误。直接 JOIN 的字典查找现在会将键规范化为字典声明的键类型 (与 dictGet/dictHas 的现有行为一致) ,且 NULL 键永远不会匹配。#111857 (groeneai).
  • 修复了在 join_use_nulls = 1 时,查询在 WHERE 中重复 JOIN ON 条件而导致的 AMBIGUOUS_COLUMN_NAME (块结构不匹配(同名列必须具有相同结构)) 错误。此类查询现在会返回结果,不再失败。#112007 (groeneai).
  • 修复了键使用稀疏序列化的直接字典 JOIN 返回错误结果或导致服务器终止的问题。#112327 (groeneai).
  • 修复了哈希 JOIN 仅有一个 LowCardinality 键且其类型宽度超过 8 字节 (UInt128、Int128、UInt256、Int256 及其 Nullable Variant) 时返回错误结果的问题。此类 JOIN 此前会静默返回键值不相等的行。#113230 (groeneai).
  • 修复了涉及另一侧常量列的 JOIN ON 条件的分片和粒度剪枝问题。#113484 (vdimir).
  • 修复了从由 DirectKeyValueJoin 提供服务的 JOIN 右侧选择 _table 或 _database 等虚拟列时返回错误值的问题。DirectKeyValueJoin 使用 EmbeddedRocksDB、KeeperMap、Redis 或字典等键值存储。该查询此前会返回数据列的内容,或因 LOGICAL_ERROR 而失败。#113698 (groeneai).

查询和 analyzer 修复

  • 修复 splitMultipartQuery 在分号后带有注释的查询中抛出 “Empty query” 错误的问题。 #85491 (yariks5s).
  • 修复 DESCRIBE TABLE 中子查询后的别名无法被解析器接受并导致语法错误的问题。 #100205 (yariks5s).
  • 修复在 EXPLAIN INSERT INTO ... SELECT ... FORMAT ... 中,FORMAT 子句被 INSERT 消耗,而未应用于 EXPLAIN 输出的问题。 #101772 (Onyx2406).
  • 修复并发运行 INSERT 时 SELECT 查询明显变慢的问题。此前,INSERT 管道会在查询开始时预留最多 max_threads 个 CPU 插槽,即使其中大部分从未使用,导致并发 SELECT 缺乏资源。CPU 插槽现改为按需分配:管道仅在实际推送可并行执行的工作时才请求插槽。这同时适用于并发控制和工作负载的抢占式 CPU 调度器。新增服务器设置 concurrent_threads_lazy_allocation (默认值为 true) 可作为回滚开关。 #102928 (seva-potapov).
  • 修复在 EmbeddedRocksDB 表上执行 ALTER TABLE ... MODIFY SETTING 时,即使服务器拒绝该查询,仍可能将无效设置值持久化到表元数据文件的问题。下次服务器重启时,该表会因 CANNOT_PARSE_BOOL (或类似的解析错误) 而无法附加;在加载失败被视为致命错误的数据库中,服务器将拒绝启动。现在会在写入任何元数据前拒绝无效设置值。 #103417 (groeneai).
  • 修复 HTTP 接口和 INSERT SELECT FROM input 中使用 input_format_max_block_wait_ms 的流式 INSERT,以便在请求结束前刷新部分输入块。 #104534 (alexey-milovidov).
  • 修复当表达式和某个 WHEN 值均为 NULL 时,CASE 表达式返回 ELSE 分支而非匹配的 THEN 分支的问题。 #105556 (Algunenano).
  • 修复在 MATERIALIZED VIEW 定义中使用 WASM SQL UDF 的问题。 #106161 (niyue).
  • 修复旧 analyzer 中,当 SELECT 列表里的 ORDER BY 列具有别名时,INTERPOLATE () 抛出 INVALID_WITH_FILL_EXPRESSION 的问题。 #106252 (yakov-olkhovskiy).
  • 函数 base58Encode、base58Decode 和 tryBase58Decode 现在处理大型输入时会遵守 max_execution_time 和查询取消,并会拒绝大于 10 KB 的输入,而不会长时间运行。该限制可通过新增设置 function_base58_max_input_size 配置 (0 表示禁用) 。 #106428 (alexey-milovidov).
  • 修复结果错误的问题:对于具有 ORDER BY f(c0) 的表,当 f(const) 的计算结果为非数字时,WHERE c0 = const 不会返回任何行,例如使用负常量的 ORDER BY sqrt(c0)。主键分析错误地裁剪了所有粒度,并污染了后续查询的查询条件缓存。 #106507 (groeneai).
  • 修复了对具有隐式 _minmax_count_projection、显式聚合投影或普通投影的表执行 SELECT c, count() FROM t WHERE c GROUP BY c 时返回错误结果的问题:此前所有分组都会合并为一行,键为常量,行数则为总行数。 #106590 (groeneai).
  • 现在,即使 SETTINGS 位于 FORMAT 之前,或输出格式为 Values,FORMAT 也会应用于 EXPLAIN ... INSERT ... SELECT ... FORMAT ... 的 EXPLAIN 输出。 #106686 (alexey-milovidov).
  • 修复了罕见的误报 RESOURCE_ACCESS_DENIED 错误 (“Scheduler queue with resource request is about to be destructed”) :查询实际上已获授对工作负载资源的访问权限,但复用的线程本地请求对象保留了先前请求的失败状态,从而触发该错误。 #106690 (alexey-milovidov).
  • 修复了 match、extract、extractAll 和 countMatches 对包含十六进制或八进制转义序列的正则表达式返回错误结果的问题。 #106709 (ofeliacode).
  • 修复了 PostgreSQL wire protocol 解析器中的整数下溢问题:长度字段小于 4 的消息会导致 size - 4 回绕,并使 resize/ignore 的大小过大。 #107485 (uwezkhan).
  • 使用 enable_analyzer = 1 (默认值) 时,若表仅存在于其他数据库中,现在通过未限定名称查询该表会提示正确的表,例如 SELECT * FROM functions 会报告 Maybe you meant system.functions?。此前,新 analyzer 会给出不含提示的 Unknown table expression identifier 错误,而旧 analyzer 已能提供有用的建议。 #107550 (groeneai).
  • 修复了分布式计划查询 (make_distributed_plan = 1) 在清理期间 server 中止的问题 (std::terminate,信号 6) :当工作节点状态检查无法重新调度下一次检查时 (例如关闭期间发生 CANNOT_SCHEDULE_TASK 或出现 MEMORY_LIMIT_EXCEEDED) 。现在查询会正常失败,server 将继续运行。 #107575 (groeneai).
  • 修复了分布式查询选择具有共同子表达式的 ALIAS 列时返回错误结果的问题:列可能错位,值可能显示在错误的列中。 #107675 (vdimir).
  • 修复了 CODEC 或引擎声明中无参数 window function 引发的 Inconsistent AST formatting 逻辑错误 (例如 CODEC(cume_dist() OVER (...))) ;此类函数现在会保留括号,因此查询在格式化/解析往返后仍然有效。 #107806 (alexey-milovidov).
  • getClientHTTPHeader 现在会被正确视为非确定性函数,因此其结果不再被查询结果缓存错误复用。 #108029 (alexey-milovidov).
  • 修复了将 SELECT [...] SAMPLE [...] 与查询条件缓存 (设置 use_query_condition_cache = 1,也是默认值) 结合使用时返回错误结果的问题。 #108488 (groeneai).
  • 修复启用 enable_identifier_resolve_cache (默认启用) 时,复合谓词在 GROUP BY 中使用别名并再次被引用会导致 NOT_FOUND_COLUMN_IN_BLOCK 的问题。optimize_and_compare_chain 优化不具备幂等性,导致共享的已解析节点累积了重复的传递合取条件。#108553 (groeneai).
  • 修复 Distributed 表上的子查询读取两个或更多展开为相同表达式的 ALIAS 列 (例如 a1 String ALIAS toString(x), a2 String ALIAS toString(x)) ,且该子查询作为外层查询的数据源时出现的 NUMBER_OF_COLUMNS_DOESNT_MATCH 错误,例如 SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2)。#108725 (groeneai).
  • 修复执行 ALTER TABLE ... DROP COLUMN 时,如果另一列的 DEFAULT 或 MATERIALIZED 表达式定义并引用了内联别名而导致的 UNKNOWN_IDENTIFIER 错误。#109374 (alexey-milovidov).
  • 修复对于具有按数据库授权的用户,当查询仅读取 name/database 列时,system.tables 静默跳过数据库的问题。于 26.2 引入。#109723 (samay-sharma).
  • 修复启用 analyzer 时,存储在视图中的查询里由 CTE 名称限定的列 (cte_name.column) 出现的 UNKNOWN_IDENTIFIER 错误。#111386 (novikd).
  • 修复当 FINAL 查询按未包含在 SELECT 列表中的排序键列进行过滤,且过滤条件被移至 PREWHERE 时出现的 NOT_FOUND_COLUMN_IN_BLOCK 问题 (例如,在 optimize_move_to_prewhere_if_final = 1 时执行 SELECT s FROM t FINAL WHERE k GROUP BY s) 。#111721 (groeneai).
  • 修复当 enable_analyzer = 0 为服务器默认设置时,包含递归 CTE 的视图会因 WITH RECURSIVE is not supported with the old analyzer 而导致服务器启动和 ATTACH 失败的问题。#112784 (evillique).
  • 修复 accurateCastOrDefault 中查询设置和 NULL 处理未正确传播的问题。#114912 (alexey-milovidov).
  • 修复 system.query_thread_log 中的 read_rows、read_bytes、written_rows 和 written_bytes 报告线程生命周期累计值,而非已记录查询对应值的问题。长期存活的线程池线程,尤其是发起该查询的 HTTPHandler 线程,均受到影响。#115596 (groeneai).

MergeTree 和存储相关修复

  • 现在可以删除带有 tryN 后缀的已分离 parts。#58957 (antaljanosbenjamin).
  • 修复了使用并行副本运行查询时,嵌套子查询中重复的投影别名 (例如 SELECT *, day + 365 AS day) 导致的 MULTIPLE_EXPRESSIONS_FOR_ALIAS 异常。#80310 (alexey-milovidov).
  • 修复了显式配置表级 default_compression_codec 设置时,MergeTree parts 选择错误压缩编解码器的问题。插入、合并和投影期间写入的 parts 使用了服务器级默认编解码器,而非表级设置 (现在也涵盖完全删除变更产生的空 part) 。#101784 (Onyx2406).
  • 修复了在使用并行副本且 parallel_replicas_local_plan = 0 时,运行引用 PREWHERE / WHERE / HAVING / QUALIFY 中投影别名的查询 (例如 SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) ,或对列名重叠的自连接执行 SELECT * 时,远程副本抛出的 MULTIPLE_EXPRESSIONS_FOR_ALIAS 错误。#103806 (groeneai).
  • 修复了执行 ALTER TABLE ... DROP PARTITION ID 'patch-...' 后再执行 DETACH/ATTACH TABLE 时出现的损坏 patch part 问题。此前,空覆盖 part 写入时未包含 partition.dat 和 source_parts.dat,导致下一次 attach 或服务器重启后,system.detached_parts 中出现 broken-on-start_patch-... 条目。#104353 (groeneai).
  • 修复了 ALTER TABLE ... RENAME COLUMN 与 OPTIMIZE TABLE ... FINAL 或其他后台合并并发运行时,数据被默认值静默替换的问题。#104822 (groeneai).
  • 修复了启用 enable_materialized_cte 的查询会抛出的两种 LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized 情况:(1) 对由另一 materialized CTE 的 IN (subquery) 过滤的复用 materialized CTE;(2) materialized CTE 既被直接引用,也在通过嵌套 IN 子查询命中 MergeTree 主键的 WHERE ... IN (...) 过滤器中被引用。对相同查询执行 EXPLAIN 也会受影响,因为这些错误会在计划优化期间触发。#105041 (novikd).
  • 使用 skip_cache_on_disk_failure = 1 时,若 FileCache 无法创建磁盘缓存目录,查询现在仍会继续执行。系统会记录该失败,而不会使查询失败。#105250 (Diskein).
  • 修复了 ALTER TABLE <memory_table> APPLY PATCHES 和 ALTER TABLE <memory_table> APPLY DELETED MASK 引发的逻辑错误异常 Mutation of Memory table produced incomplete output。Memory 表不拥有 patch parts 或删除掩码,因此这两个命令现在都会被正确视为无操作。#105286 (groeneai).
  • 修复了 distributed_group_by_no_merge=1 时,Merge 上的 Merge 上的 Distributed 出现的 CANNOT_CONVERT_TYPE 问题。#105330 (azat).
  • 修复了 singleValueOrNullMerge 在合并已观测到多个不同值的状态时返回具体值而非 NULL 的问题。#105734 (fallintoplace).
  • 修复 collection 名称为空或包含 NUL 字节时,mongodb 表函数、MongoDB 存储及 MongoDB 字典源崩溃的问题。 #105776 (Algunenano).
  • 修复对显式指定的 SummingMergeTree 和 CoalescingMergeTree columns_to_sum 列执行 ALTER TABLE ... CLEAR COLUMN 时被拒绝的问题。 #105785 (antonio2368).
  • 修复创建数据库名称通过查询参数指定的参数化视图时出现的 UNKNOWN_DATABASE 错误。 #105799 (groeneai).
  • 恢复使用分析器时 Merge 表的按序读取优化。 #105867 (KochetovNicolai).
  • 修复通过 catalog 访问的 Iceberg 表上的 UPDATE 和 DELETE 变更,包括不匹配任何行的重复更新和删除。 #106111 (scanhex12).
  • 修复通过 Merge 表或 merge 表函数查询 Distributed 表,且谓词应用于其上层时,optimize_skip_unused_shards 未生效 (以及 force_optimize_skip_unused_shards 错误失败) 的问题。 #106250 (KochetovNicolai).
  • 修复当变更 (DELETE/UPDATE) 谓词包含从嵌套在另一子查询中的默认表表达式读取数据的 IN/EXISTS 子查询时出现的逻辑错误 Column identifier ... is already registered。 #106414 (alexey-milovidov).
  • 修复在 read_in_order_use_virtual_row_per_block = 1 且 max_block_size 较小时,以逆序读取宽格式 parts 时,ORDER BY ... DESC 查询偶发返回错误结果的问题。 #106429 (vdimir).
  • 修复使用 STORAGE_TYPE 'simple'、采用 cache/direct 布局且具有单个字符串 (复杂) 键的 Redis 字典出现的 Bad cast exception;此类字典现已正常工作,而在 simple 存储中使用复合键时会报告明确的错误。 #106501 (vdimir).
  • 修复在 Memory 引擎上执行对逐行数据无影响的 ALTER TABLE <memory_table> 命令时引发的 Mutation of Memory table produced incomplete output 异常,包括 APPLY PATCHES、APPLY DELETED MASK、MATERIALIZE STATISTICS、MATERIALIZE INDEX、MATERIALIZE PROJECTION 和 REWRITE PARTS。Memory 表不包含这些结构,因此这些命令现在被视为无操作。 #106621 (groeneai).
  • 修复当 MergeTree 表的跳数索引分片包含零个粒度、但磁盘上的标记文件非空时,服务器因 Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0) 而无法启动的问题。 #106675 (groeneai).
  • 修复因 UNION 中存在空表而导致并行副本未应用于包含 UNION 的视图的问题。 #106900 (devcrafter).
  • 修复向 ReplicatedMergeTree 表同步插入时可能出现的逻辑错误异常 conflicted_part_name.has_value():当插入块已完全去重,且冲突 part 的去重节点已被移除时 (例如因并发执行 DROP PARTITION) ,可能触发此异常。#107026 (groeneai).
  • 修复通过设置 enable_filesystem_query_cache_limit = 1 创建的文件系统缓存磁盘读取 MergeTree 表时,罕见的 LOGICAL_ERROR “Attempt to release query context that does not exist” 以及随之发生的服务器崩溃问题。#107028 (groeneai).
  • 修复将空 part 移动到 plain_rewritable 磁盘时发生的服务器崩溃问题 (例如,对由 remove_empty_parts = 0 保留的空 part 执行 ALTER TABLE ... MOVE PARTITION ... TO DISK) 。#107040 (groeneai).
  • 修复当 adaptive_write_buffer_initial_size 设置为极大值时,向 MergeTree 表执行 INSERT 出现的 Logical error: Too large size passed to allocator 异常。现在会将自适应写缓冲区的初始大小限制为缓冲区最大值。#107104 (groeneai).
  • 修复混用 MODIFY SETTING/RESET SETTING 与注释修改的 ALTER TABLE ... ON CLUSTER 批处理仅应用于主副本,导致其他副本状态不一致的问题 (例如 MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) 。还修复了位置式或按列指定 SETTINGS 的 MODIFY COLUMN ... COMMENT 被错误识别为本地仅修改注释的元数据变更的问题;该问题会导致列重排未写入复制元数据,并可能在副本重启时引发 INCOMPATIBLE_COLUMNS。#107142 (groeneai).
  • 修复启用 group_by_use_nulls 设置时,使用 grouping 函数的查询出现 Argument ... of GROUPING function is not a part of GROUP BY clause 错误的问题。#107206 (KochetovNicolai).
  • 修复为非复制表 MergeTree 启用旧版并行副本时的轻量级 UPDATE 查询问题。#107246 (groeneai).
  • 修复 SYSTEM SYNC DATABASE REPLICA … STRICT 中可能出现的逻辑错误异常,并使 STRICT 修饰符真正对数据库副本生效。#107344 (PedroTadim).
  • 修复在并行副本场景下,当标量子查询包含读取同一表的嵌套子查询时可能出现的 Logical error: 'Duplicate announcement received for replica number N' 问题。#107381 (groeneai).
  • 修复在仍有未应用的轻量级 UPDATE 补丁的分区上执行 REPLACE PARTITION、MOVE PARTITION、DETACH PARTITION 或 DETACH PART 时,普通 (非复制) MergeTree 表可能静默丢失数据的问题。这些操作现在会拒绝该命令 (与 ReplicatedMergeTree 的现有行为一致) ,并提示使用 ALTER TABLE ... APPLY PATCHES,而非静默回退已提交的更新。#107386 (groeneai).
  • 修复当 PostgreSQL 数据库或表名包含大写字母时,MaterializedPostgreSQL 会静默停止复制变更的问题 (pgoutput 使用者请求了未加引号且转为小写的 publication 名称,无法匹配保留大小写的 publication) 。#107423 (alexey-milovidov).
  • 修复当 optimize_if_transform_strings_to_enum = 1,且优化后的字符串字面量 if/transform 表达式用作 Distributed 表或并行副本的 GROUP BY 或 ORDER BY 键时出现的 THERE_IS_NO_COLUMN 错误。#107455 (groeneai).
  • 修复通过 CREATE TABLE ... CLONE AS、ATTACH PARTITION ... FROM 或 MOVE PARTITION ... TO TABLE 将 parts 从普通 MergeTree 引入 ReplacingMergeTree、SummingMergeTree 或 AggregatingMergeTree 后,SELECT ... FINAL 和 OPTIMIZE TABLE ... FINAL 返回重复行的问题。现在,当源和目标引擎不同时,会将引入的 part 的合并级别重置为 0,以便目标表在下次合并时对其去重。#107481 (groeneai).
  • 改进了 ReplicatedMergeTree 等待法定数量确认期间对查询取消操作的跟踪。#107513 (nickitat).
  • 将 rapidjson 库 (包括 prettyPrintJSON、JSONMergePatch 和 rapidjson JSON 解析器) 使用的内存计入内存跟踪器,使异常输入因触发 MEMORY_LIMIT_EXCEEDED 而被拒绝,避免无限制分配内存。#107555 (Algunenano).
  • 修复合并或读取由包含 Dynamic 列的表 mutation 生成的 MergeTree part 时,可能出现的 Logical error: Stream ... variant_discr ... is not found 错误。#107562 (alexey-milovidov).
  • 修复启用 optimize_prewhere_after_pushdown 时,查询 file()、url() 或对象存储源并同时指定显式 PREWHERE 和 WHERE 所引发的 LOGICAL_ERROR (updateFormatPrewhereInfo called more than once) 。#107568 (groeneai).
  • 修复在 Replicated 数据库中对 TimeSeries 表执行 RENAME TABLE、RENAME DATABASE 或 CREATE OR REPLACE TABLE 时可能发生的服务器异常 (Digest does not match logical error) 。现已支持重命名 TimeSeries 表。#107583 (groeneai).
  • 修复 Replicated 数据库中 TimeSeries 表的 DROP TABLE 问题:此前该操作会遗留内部表,并导致后台删除任务永久重试 (DROP TABLE ... SYNC 会挂起) 。#107604 (groeneai).
  • 修复复制 part 拉取协议中的两个路径遍历漏洞,这些漏洞可能使恶意副本将文件写入 part 目录之外。#107606 (antonio2368).
  • 修复普通 MergeTree 表上的 ALTER TABLE ... REPLACE PARTITION 在服务器重启后重新出现已被替换的 parts 的问题,该问题会导致表同时返回替换后的行和过时的被替换行。#107623 (groeneai).
  • 修复向 materialized view 插入数据时出现的 LOGICAL_ERROR (“Block structure mismatch … between ConvertingTransform and RemovingReplicatedColumnsTransform”) :当其 TO 目标表中声明的列比该视图 SELECT 生成的 Enum 更宽时会触发此错误。现在会在 materialized view 插入路径上应用有效的 Enum 扩展,与直接执行 INSERT ... SELECT 一致。#107648 (groeneai).
  • 修复在查询具有多个展开为同一表达式的 ALIAS 列的 Distributed 表 (或使用并行副本) 时,同时在 ORDER BY/GROUP BY/HAVING 中引用这些列会触发 NUMBER_OF_COLUMNS_DOESNT_MATCH 错误的问题。#107913 (yakov-olkhovskiy).
  • 修复只读表刷新数据 parts 时发生瞬时错误会导致后台刷新任务永久停止的问题。#108034 (alexey-milovidov).
  • 现在会对 AggregateFunction 状态列遵循 index_granularity_bytes 设置。此前,此类列会忽略粒度的字节上限 (例如 AggregatingMergeTree 表和聚合投影中的 uniqExact 状态) ,导致粒度远超配置限制,并增加读取放大和查询时的内存占用。#108297 (groeneai).
  • 修复当存活副本少于多数时,insert_quorum = 'auto' 不会立即拒绝插入的问题。此类插入现在会立即因 TOO_FEW_LIVE_REPLICAS 失败,而不再是写入本地 part 后超时并报 UNKNOWN_STATUS_OF_INSERT。#108800 (gagandhakrey).
  • 修复启用去重的异步插入中,当 optimize_on_insert 使插入块为空时 (例如 SummingMergeTree 中各行之和为零) ,服务器崩溃的问题。#109229 (Diskein).
  • 修复当合并与 ALTER TABLE ... RENAME COLUMN 并发执行,或某列的全部值仅来自轻量级 UPDATE 时,无默认表达式的列会丢失数据的问题。该列可能从合并后的 part 中被移除,导致读取到的所有值均为 NULL。#109356 (groeneai).
  • 修复在使用 GROUPING SETS、ROLLUP 或 CUBE 的同时并行合并 uniqExact 聚合状态时,罕见的服务器终止问题。#109389 (groeneai).
  • 修复 rollup 合并被无限期重新调度的问题。#109410 (Michicosun).
  • 修复包含 materialized 或持久化虚拟列的表执行 GROUP BY 变更时的问题。#109532 (Michicosun).
  • 修复在包含新插入的 (0 级) parts 的表上,对由 add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column 创建的隐式 minmax 索引执行 ALTER TABLE ... MATERIALIZE INDEX 时出现 UNKNOWN_IDENTIFIER: Missing columns: '_block_offset' 错误的问题。现在会为这些 parts 构建索引,而不会失败。#110236 (groeneai).
  • 修复只读对象存储副本 (即配置了 read_only = true 的 disk) 无法通过 refresh_parts_interval 发现新 parts,以及在此类 disk 上设置 table_disk = true 会被拒绝并显示 “table_disk is not supported for non-ObjectStorage disks” 的问题。#110460 (jkartseva).
  • 修复在具有表达式中使用 IN 运算符 (包括通过其他 ALIAS 列间接使用) 的 ALIAS 列的表上,执行 ALTER TABLE … DROP COLUMN、ALTER TABLE … DELETE/UPDATE 变更和轻量级 DELETE 时出现 LOGICAL_ERROR (“No set is registered for key”) 的问题。#111039 (PedroTadim).
  • 修复了查询执行期间未对 MergeTree 投影应用行策略的问题。#112329 (yariks5s).
  • 修复了在启用直接 I/O 的 encrypted 磁盘上读取 Compact 数据分片时出现的 ReadBufferFromEncryptedFile: Wrong file position 逻辑错误,该错误会导致合并操作卡在 system.replication_queue 中。#112943 (alexey-milovidov).
  • 修复了通过 merge 表函数和 Merge 表引擎读取内部 _temporary_and_external_tables 数据库的问题。该问题曾允许一个会话读取其他会话及其他用户的临时表,并会在旧 analyzer 路径中引发异常。现在,数据库正则表达式会跳过该数据库,并且会拒绝显式指定该数据库,与直接访问该数据库的处理方式相同。#113224 (alexey-milovidov).
  • 修复了包含标量子查询的行策略在通过 Merge 表读取后仅被求值一次、随后一直被复用的问题。解析后的策略条件会被缓存并由所有查询共享,而通过 Merge 读取会原地改写缓存的表达式,也会导致同时使用同一策略的并发查询之间发生数据竞争。#113563 (alexey-milovidov).
  • 修复了读取包含使用自定义键并行副本的 Distributed 表的 Merge 表时出现的 CANNOT_CONVERT_TYPE 错误。#113742 (alexey-milovidov).
  • 修复了通过 Merge 表读取数据时出现的 Logical error: No set is registered for key ... 错误;该 Merge 表的子表声明了包含 IN 的 ALIAS 列,且各子表对该列的默认值不一致。#113757 (groeneai).
  • 修复了行策略绕过问题:mergeTreeIndex 表函数会暴露源表中被 SELECT 行策略隐藏的行的主键和 minmax 索引值;现在禁止读取具有行策略的表的 mergeTreeIndex。#115304 (yariks5s).

数据类型和序列化修复

  • 修复了使用 LowCardinality 数值类型时 ARRAY JOIN 中发生的异常。 #91784 (Ergus).
  • 修复了当 data_type_default_nullable = 1 且表在 Replicated 数据库中或通过 ON CLUSTER 创建时,NOT NULL 列被静默创建为 Nullable 的问题。 #97572 (xiaohuanlin).
  • 修复了当视图将 integer 列映射为 Bool 列时,query_plan_enable_optimizations = 0 的 MaterializedView 查询返回错误行数的问题。 #100692 (Maximus5).
  • 修复了对使用非默认序列化的列执行变更后,数据分片元数据不一致的问题。 #102817 (korowa).
  • 修复了读取从 Nullable(Tuple(...)) 列中提取的子列时 NULL 传播不正确的问题。例如,对于 tup Nullable(Tuple(s Nullable(String))),SELECT tup.s 现在会在外层元组为 NULL 的行中正确返回 NULL,而非垃圾值。这涵盖所有可表示 NULL 的元素类型:Nullable、Dynamic、Variant 和 LowCardinality(Nullable(...))。 #102942 (nihalzp).
  • 修复了 recursiveRemoveLowCardinality 会删除自定义几何类型名称 (例如 LineString 与 Ring、MultiLineString 与 Polygon) 的问题,此问题会导致几何类型被错误解读。 #103041 (jh0x).
  • 修复了使用字典中不存在的值作为 Nullable 键列调用 dictGetOrNull 时,函数会以 NULL 静默覆盖 SELECT 投影中其他列的问题。该函数此前会原地修改带输入别名的空值映射;现在会在修改前深度克隆结果列。 #104327 (groeneai).
  • 修复了启用 optimize_skip_unused_shards_rewrite_in 时,分布式查询的分片键中包含空 IN 元组而导致的异常。 #104966 (alexey-milovidov).
  • 修复了 Float32 列的 count-min 统计信息对 PREWHERE 选择性的估算问题,包括与 Float64 字面量进行比较的情况。 #105047 (hanfei1991).
  • 修复了将 quantileExactWeightedInterpolated、quantileDD 或 quantilePrometheusHistogram 聚合状态与其复数形式的 quantilesXxxMerge 对应函数 (以及反向操作) 合并时出现的 ILLEGAL_TYPE_OF_ARGUMENT。这三个分位数函数族的单数和复数变体共享相同的内部聚合状态,但此前未列入内部名称映射表,因此跨函数合并状态以及这些函数族的函数融合优化都会被拒绝。 #105189 (groeneai).
  • 修复 Date32 和 DateTime64 参数的结果超出 Date 范围时,toStartOfWeek、toLastDayOfWeek、toMonday、toStartOfMonth、toLastDayOfMonth、toStartOfQuarter 和 toStartOfYear 返回错误结果的问题:此前结果会溢出到任意日期,现在早于 1970-01-01 的结果会被限制为 1970-01-01,晚于 2149-06-06 的结果会被限制为 2149-06-06。同时还修复了在包含超出范围值的 Date32 或 DateTime64 键上,在 WHERE 中使用此类函数时产生错误查询结果的问题 (错误地剪枝数据部分和粒度) 。#105244 (yariks5s).
  • 修复当第一个参数为 Variant 数组、其所有备选类型均与第二个参数类型不兼容且禁用 variant_throw_on_type_mismatch 时,arrayRemove 中的逻辑错误。该函数现在会将比较视为 “永不相等”,并原样返回数组,而不再触发服务端 assertTypeEquality 失败。#105248 (groeneai).
  • 修复对 Dynamic 使用 toFloat64/toUInt32/toString 等函数时忽略 cast_keep_nullable 的问题。#105467 (Avogar).
  • 修复对 Nullable 参数结合 GROUP BY ... WITH ROLLUP、WITH CUBE 或 WITH TOTALS 使用 uniqStateOrNull / uniqStateOrDefault / uniqOrNullState (以及 uniq 上类似的组合器链) 时发生的服务器段错误。#105470 (groeneai).
  • 修复 toStartOfMillisecond 和 toStartOfMicrosecond 对负值 (epoch 之前) DateTime64 返回的结果偏差接近一秒的问题,并修复 DateTime64 输入接近 INT64_MIN 时,toStartOfSecond、toStartOfMillisecond 和 toStartOfMicrosecond 中由 UndefinedBehaviorSanitizer 检测到的有符号整数溢出问题。#105482 (groeneai).
  • 修复反序列化 JSON 的 singleValueOrNull 状态时服务器终止的问题。#105535 (Avogar).
  • 修复向 JSON 中的共享数据插入数据时忽略 input_format_try_infer_datetimes 的问题。#105544 (Avogar).
  • 修复 JSONExtract 和文本反序列化中超出范围的值导致 DateTime 回绕的问题。#105551 (Avogar).
  • 修复将同一 VALUES 子句中大小不同的元组插入 String 列时发生崩溃的问题。#105582 (Avogar).
  • 修复从包含 NULL 值的 Timezone 的 DateTime 调用 toString 时出现的 NOT_IMPLEMENTED 错误。#105587 (yariks5s).
  • 为 Native 输入中格式错误的扁平化 Dynamic 列添加验证。#105666 (Avogar).
  • 修复查询计划期间出现的 LOGICAL_ERROR (Unexpected return type from if) 。该错误发生在结果类型为 Variant 的 if 表达式中,且其第二或第三个分支是基于可容纳于 Int64 的 UInt64 字面量的常量条件 if。#105680 (groeneai).
  • 修复了聚合状态序列化时 (例如并行副本、通过二进制状态格式说明符使用 sumMapState、外部聚合) ,对 Nested(... Nullable(Decimal(P, S))) 列执行 sumMap 和 sumMapWithOverflow 导致的 Bad get: has Decimal32, requested Decimal128 问题。#105816 (groeneai).
  • 修复了在表上使用 apply_mutations_on_fly = 1 时出现的 Expected ColumnLowCardinality, got String / Bad cast from type DB::ColumnString to DB::ColumnLowCardinality 错误:该表存在在 ALTER MODIFY COLUMN ... LowCardinality(...) 变更前排队的待处理即时 UPDATE/DELETE 变更。#105847 (Algunenano).
  • 修复了新 analyzer 对包含 IN Array(...) 过滤条件的分布式查询报出 Cannot find column 错误的问题。#105894 (KochetovNicolai).
  • 修复了一个服务器终止问题:当一个 ALTER 并发删除带有 STATISTICS 的列时,另一个 ALTER 将该列修改为 Nullable。#105917 (groeneai).
  • 在 RowBinaryWithNamesAndTypes 类型解码期间 (input_format_binary_decode_types_in_binary_format = 1) ,拒绝超出范围的 IntervalKind 字节,并报出明确的 INCORRECT_DATA 错误,而非构造具有无效 kind 的 DataTypeInterval;后者可能会在哈希路径中触发未定义行为。#106261 (groeneai).
  • 在 Nullable(JSON) 中,将 ‘null’ 子列作为 JSON 路径读取,而非 null-map。#106295 (Avogar).
  • 修复了对数组均为空且键非常量的列进行哈希计算时,sipHash64Keyed、sipHash128Keyed 和 sipHash128ReferenceKeyed 中的越界读取问题。#106355 (Algunenano).
  • 修复了当 IN 的第二个参数为非常量元组时,无法在第一个参数中使用标量子查询的问题。#106610 (yariks5s).
  • 修复了将 LowCardinality(DateTime) 列序列化为文本格式 (CSV、TSV、JSONEachRow 等) 时忽略 session_timezone 的问题。此前,服务器首次写入 LowCardinality(DateTime) 列后,后续每个写入此类列的查询都会使用首次见到的时区渲染本地时间字符串,而忽略 session_timezone。#106634 (groeneai).
  • 修复了当条件为常量 Nullable(Nothing) 值时,if 和 multiIf 中的服务器终止问题。#106678 (groeneai).
  • 回退了一项更改:该更改导致 sumMap / -Map 组合器拒绝自定义命名的数值值类型 (例如 SimpleAggregateFunction(sum, T) 和 Bool) ,并报出 ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed,从而破坏了此前可正常执行的聚合操作。#106729 (fm4v).
  • 修复了当键列为 LowCardinality 且谓词常量为 LowCardinality(Nullable(...)) 时,按 MinMax 统计信息对数据片段进行剪枝期间出现的 Bad cast 异常。#106793 (groeneai).
  • 修复 parseDateTime 处理包含非 ASCII 字节的输入时的逻辑错误。 #106856 (Avogar).
  • 修复聚合函数参数需要转换为 Nullable 类型时,涉及 optimize_rewrite_aggregate_function_with_if 优化的分布式查询触发 THERE_IS_NO_COLUMN 异常的问题。 #106908 (yakov-olkhovskiy).
  • 修复当权重数组包含较大整数值时,arrayLevenshteinDistanceWeighted 和 arraySimilarity 中发生的有符号整数溢出 (未定义行为) 。对于整数权重,加权距离现使用更宽的整数类型累积,因此较大的整数权重不再溢出,并可保持精确。 #106934 (groeneai).
  • 修复合并已排序的数据块时发生的崩溃 (Source column is not Map / SIGSEGV) :当数据块包含 Variant 列,且其中 Map 变体的本地存储顺序与全局顺序不一致时会触发该问题。 #107011 (groeneai).
  • 修复 ORDER BY <numeric column> ... LIMIT n 查询中,当惰性物化将另一列置于排序列之前时出现的 TYPE_MISMATCH 错误 (“Cannot convert string … to type …”) 。现在会从正确的排序列读取 top-K 阈值。 #107060 (groeneai).
  • 修复复合 ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a 操作在不同类型的列之间复用已释放列名 (即“交换”) 时的问题。物化分片记录了错误的列类型,导致后续 SELECT 因 Conversion between numeric types and IPv6 is not supported 而失败 (或在调试构建中加载分片时中止) 。 #107064 (groeneai).
  • 修复边界数组包含 NaN 时,roundDown 函数产生非确定性结果的问题。相同的输入值可能会因批次中相邻行的不同而返回有限边界或 NaN。现在会忽略 NaN 边界,因此结果仅取决于有限边界。 #107065 (groeneai).
  • 修复插值分位数为小数但仍在范围内时,quantileTDigest 和 quantileTDigestWeighted 对 Date 和 DateTime 参数抛出 DECIMAL_OVERFLOW 的问题 (例如,所有值均可容纳于该类型时的 quantileTDigestWeighted(date, weight)) 。现在会将小数结果截断为结果类型,与 quantilesTDigestWeighted 的行为一致;确实超出范围的值仍会引发错误。 #107066 (groeneai).
  • 修复 Enum8/Enum16 类型定义中静默截断超出范围的整数值的问题。Enum8('a' = 200) 现在会抛出 ARGUMENT_OUT_OF_BOUND,而不是静默创建 Enum8('a' = -56)。 #107081 (groeneai).
  • 修复多列 ORDER BY ... LIMIT 查询按 Nullable 列排序时出现的行顺序错误问题 (以及调试构建中的 LOGICAL_ERROR “Rows are not sorted with permutation”) ;该问题会在多行的前导列值相同时出现。 #107094 (groeneai).
  • 修复读取由默认值填充的 Array(Tuple(...)) 列时出现的 Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple',例如执行 ALTER TABLE ... ADD COLUMN 后,或动态应用未完成的 ALTER TABLE ... CLEAR COLUMN 变更后。 #107232 (groeneai).
  • 在 CREATE TABLE 时拒绝在生存时间 (TTL) 表达式中以不受支持的方式使用 AggregateFunction 列 (例如 TTL toDateTime(state)) ,避免在后续执行 TTL 时因 ILLEGAL_TYPE_OF_ARGUMENT 失败。这也包括 Variant 替代类型和 Dynamic 值中携带的状态。仍支持 finalizeAggregation 等可处理状态的有效函数。 #107366 (Ria-K912).
  • 修复将 Decimal 用作大小参数时 arrayResize 的行为:现在会按其实际值解释大小参数 (例如,arrayResize([1, 2, 3], 1.5::Decimal(2, 1)) 返回一个元素) ,而非原始的未缩放表示。 #107389 (alexey-milovidov).
  • 修复在表上使用 apply_mutations_on_fly = 1 时出现的 LOGICAL_ERROR: Unexpected return type from materialize (及类似的类型不匹配错误) :在 ALTER MODIFY COLUMN ... LowCardinality(...) 变更之前,表中存在待动态应用的 UPDATE,且其目标列也被更早的动态 UPDATE 作为函数输入读取。 #107475 (groeneai).
  • 修复向 LowCardinality(Nullable(...)) 列插入 Arrow/ORC 数据时,NULL 值被静默转换为空字符串的问题。这是 26.5 中引入的回归。 #107532 (Ergus).
  • 修复当启用 make_distributed_plan = 1 的查询基于函数包装的键进行连接,且两侧没有公共类型时出现的 LOGICAL_ERROR (“Input nodes size mismatch in dag”) (例如右侧键为 UInt64 时,ON intDiv(-1, t1.key) = t2.key) 。 #107701 (groeneai).
  • 修复在服务器设置 insert_deduplication_version = new_unified_hash 下,插入去重为 String 和 Array 列计算错误哈希的问题:由于去重哈希取决于行在插入块中的位置,相同的插入可能无法去重。 #107915 (CheSema).
  • 修复使用 LowCardinality 参数搜索具有 Dynamic 键的 Map 时,has 函数导致服务器终止的问题。 #107956 (groeneai).
  • 修复在 PREWHERE 中使用 Map 子列时的性能回归问题。 #107988 (Avogar).
  • 修复使用 accurateCastOrNull 或 accurateCastOrDefault 将嵌套在 Tuple 中的 Dynamic 或 Variant 列转换为非 Nullable 元素类型时发生的逻辑错误。 #108061 (alexey-milovidov).
  • 修复当 LIKE 查询通过直接读取回退路径访问稀疏存储列上的 text 索引时出现的 Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t> 逻辑错误异常。 #108068 (groeneai).
  • 修复在非恒定或为 false 的条件下执行 ALTER UPDATE col = ... WHERE <cond>,再执行 ALTER MODIFY COLUMN col <new type> 后,apply_mutations_on_fly = 1 时读取列会出现 LOGICAL_ERROR (“Unexpected return type from if”) 的问题。#108128 (groeneai).
  • 修复 dateDiff 使用 hour 和 minute 单位处理接近 Int64 范围极限的极端 DateTime64 值时出现的 signed integer overflow (未定义行为) 。#108229 (groeneai).
  • 修复使用 accurateCastOrNull 将 Array(Dynamic) 或 Array(Variant) 转换为 QBit 时出现的服务器异常 (IColumn::insertFrom 中的 Logical error) ,例如 accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)')。#108288 (groeneai).
  • 修复带时区的 parseDateTimeBestEffort 在 toString(Nullable(DateTime64)) 的 NULL 行上抛出 CANNOT_PARSE_DATETIME 的问题。#108310 (yariks5s).
  • 修复当 max_parser_depth 设为较大值时,[[[ ... ]]] 或 array(array( ... )) 等深度嵌套表达式导致的服务器崩溃 (栈溢出) 。#108493 (Algunenano).
  • 修复在创建投影后通过 ALTER TABLE ... ADD COLUMN ... DEFAULT 添加列时,SELECT * 投影读取该列会返回列类型的默认值 (如 0) ,而非其 DEFAULT 值 (如 -1) 的问题。从基础表读取原本是正确的;在重建投影前,只有由投影响应的读取会受影响。#108569 (tiandiwonder).
  • 修复当 LowCardinality(FixedString) (或 LowCardinality(Nullable(FixedString))) 键列在键表达式中被函数包装时,分区和主键剪枝会被静默禁用的问题,例如 PARTITION BY sipHash64(k) % N 配合 WHERE k = 'literal'。此类查询会扫描所有分区,而不会进行剪枝。#108777 (groeneai).
  • 在分桶 Map 序列化中保留原始键顺序,以修复依赖该顺序的比较操作。#109178 (Avogar).
  • 修复 Arrow、ArrowStream、Avro 格式以及旧版 ORC 和 Parquet 读取器的 schema 推断问题:对于可为 NULL 的 struct 列,在不允许 Nullable(Tuple) 类型时 (allow_experimental_nullable_tuple_type 已禁用) 仍返回 Nullable(Tuple)。DESCRIBE 返回的类型会被 CREATE TABLE 拒绝,因此使用推断出的 schema 创建表或插入数据会因 Nullable Tuple type is not allowed 错误而失败。#109185 (nihalzp).
  • 修复当服务器自行解析内联数据 (send_table_structure_on_insert_with_inline_data = 0) 时,带内联 VALUES 数据的 INSERT INTO TABLE FUNCTION (如 remote(...) 或 file(...)) 不会应用列 DEFAULT 值的问题。向带有 DEFAULT 的非 Nullable 列显式插入 NULL 时,会变为 0 而非声明的默认值。现在其行为与普通表 INSERT 及 HTTP protocol 一致。#109258 (groeneai).
  • 修复 groupArrayLastMerge 中的 segfault。现在会验证聚合函数状态的反序列化,因此损坏的状态不会导致 OOB。 #109485 (mstetsyuk).
  • 通过在反序列化阶段拒绝损坏的聚合函数状态,修复 largestTriangleThreeBuckets 聚合函数中的 segfault。 #109492 (mstetsyuk).
  • 修复请求的 ClickHouse 类型将非 Nullable Tuple 包装为 Nullable 时读取 Parquet 列的问题 (例如 Nullable(Tuple(...))) ;此前会因 TYPE_MISMATCH 失败。 #109615 (groeneai).
  • Parquet v3 原生读取器现在可以将物理上可为 NULL 的 struct 列 (Parquet OPTIONAL group) 读取为 Nullable(Tuple(...))。此前会抛出 TYPE_MISMATCH。 #109898 (groeneai).
  • 修复复制或销毁深度嵌套的 Array/Tuple/Map/Object 字面量时的 server 崩溃 (原生栈溢出) ,例如在增大的 max_parser_depth 下,查询中包含非常深度嵌套的字面量时。 #110393 (Algunenano).
  • 修复通过仅修改元数据的 ALTER MODIFY COLUMN T 将列变更为 Nullable(T) 后,在该列上启用 optimize_functions_to_subcolumns 时 IS NULL / IS NOT NULL / count() 结果错误的问题。对于转换前写入的分片,.null 子列由存储类型的默认值 (NULL) 填充,而非从物理存在的父列派生,因此原本非 NULL 的行被错误地报告为 NULL。 #110584 (groeneai).
  • 修复主键索引分析期间的 LOGICAL_ERROR (“Bad cast from ColumnString to ColumnLowCardinality”) :当 LowCardinality 键列被嵌套的 CAST 链包装,且该链重新引入 LowCardinality 时会发生此问题,例如 WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'。在 debug 和 sanitizer 构建中,这会中止 server;在 release 构建中,会导致查询失败。 #111050 (groeneai).
  • 修复读取由 19.0.0 之前的 Apache Arrow Java (与 Apache Spark 捆绑) 生成的、包含空嵌套 Array 或 Map 列的 Arrow 和 ArrowStream 数据时的问题;此前会因偏移量缓冲区过小而被 INCORRECT_DATA 错误拒绝。 #111101 (Algunenano).
  • 修复对嵌套在 Tuple、Array、Map、Nullable 或 Variant 等容器列中的兼容聚合状态列 (例如 quantileState 和 quantilesState(0.9)) 执行集合操作时出现的逻辑错误 Block structure mismatch (在 debug 和 sanitizer 构建中) 以及 Illegal types of arguments 错误。 #111191 (alexey-milovidov).
  • 为通过 native protocol 接收的损坏 replicated-index 数据添加验证。 #112331 (Avogar).
  • 修复 insert deduplication 期间的越界读取问题:当 INSERT 经由 materialized view,并在写入分区目标表前改变行数时会触发该问题。 #112649 (CheSema).
  • 修复了读取物理类型比声明精度所映射类型更宽的 Parquet DECIMAL 列时发生的越界写入问题,例如物理类型为 INT64 的 DECIMAL(9, 2)。此类文件是有效的 Parquet 文件,其他写入器也会生成这类文件;但读取器会根据声明精度确定目标列大小,而解码器则按物理宽度写入,导致内存损坏。现在读取此类文件时,如果值不符合声明精度,将引发 DECIMAL_OVERFLOW,而不再返回损坏的数据;如果类型提示的宽度至少与物理类型相同,则可无损读取。 #113046 (groeneai).
  • 修复了对于定义中包含冗余括号的表 (例如 PARTITION BY (a)、ORDER BY (b)、INDEX ix (b * c) TYPE minmax、PROJECTION p (SELECT (b) ...)、CONSTRAINT c CHECK (a > 0)、TTL (d + INTERVAL 10 YEAR) 或 DEFAULT (a + 1)) ,执行 ATTACH PARTITION FROM、REPLACE PARTITION、MOVE PARTITION TO TABLE 或添加 ReplicatedMergeTree 副本时因 Tables have different ...、METADATA_MISMATCH 或 INCOMPATIBLE_COLUMNS 而失败的问题。 #114188 (alexey-milovidov).
  • 修复了携带 Map 值设置的访问实体 (例如包含 http_response_headers 或 additional_table_filters 的设置配置文件) 以 ClickHouse 无法重新读取的形式存储的问题,这会导致该实体在重启后永久无法加载。 #114620 (groeneai).
  • 修复了当常量 LowCardinality 查找值等于元素类型的默认值 (例如空 String 或零值) 时,has、indexOf、countEqual、mapContainsKey、mapContainsValue 和 Map 下标操作返回 “未找到” 的问题。 #114624 (groeneai).
  • 修复了投影中包含 DISTINCT、QUALIFY、窗口函数或 arrayJoin 的查询中,简单 GROUP BY ... LIMIT 优化 (设置 optimize_trivial_group_by_limit_query) 产生错误结果的问题:这些操作会在聚合后消耗或过滤分组,因此将聚合限制为 LIMIT + OFFSET 个键可能导致返回的行数过少或值错误。该优化不再应用于此类查询。 #114695 (alexey-milovidov).
  • 修复了在默认 optimize_trivial_count_query = 1 下,SELECT count(arrayJoin(arr)) 返回错误结果的问题。此前返回的是存储的行数而非数组元素数量;对于 file() 和 url(),该查询会返回 0。 #115227 (groeneai).
  • 修复了当参数被包装在会隐藏可空性的单射函数中时,uniq、uniqExact、uniqHLL12 和 uniqTheta 返回错误结果的问题,例如对 Nullable 列执行 uniqExact(tuple(x))。optimize_injective_functions_inside_uniq 优化会移除包装函数,导致 NULL 行被跳过而非计入统计。 #115466 (vdimir).
  • 允许 KeeperMap 读取器在等效主键仅因冗余的外层括号而不同时接受共享元数据。 #115642 (skuznetsov-clickhouse).

文本索引和跳过索引修复

  • 修复了在具有多个 minmax 跳过索引且 use_skip_indexes_for_disjunctions = 1 的 MergeTree 表上,查询使用嵌套 coalesce/ifNull 比较 (例如 WHERE coalesce(a, b, coalesce(c, d), e) = const) 时服务器中止的问题。现在会将 <op>(coalesce(...), const) 的跳过索引重写递归应用于内部 coalesce 参数,使每个索引的 KeyCondition RPN 与模板的 RPN 一致,符合析取跟踪代码的既有假设。#103929 (groeneai).
  • 修复了对创建于 25.8、且包含通过单独的 ALTER TABLE ... ADD COLUMN 添加的列之跳过索引的 parts 执行 ALTER TABLE ... MATERIALIZE INDEX 时抛出的 NOT_FOUND_COLUMN_IN_BLOCK。现在,变更会在强制重新计算期间正确读取该 part 上所有既有跳过索引和投影所需的每一列。#105039 (groeneai).
  • 修复了 use_query_condition_cache = 1 (默认值) 时 SELECT 查询结果静默少计的问题。对于具有 bloom-filter 跳过索引的列,形如 PREWHERE pk_prefix = X WHERE non_pk IN (...) 的查询会污染 pk_prefix = X 谓词的 QueryConditionCache,导致后续正常的 SELECT count() ... WHERE pk_prefix = X 返回不正确的少计结果。影响所有 26.x 发行版。#105686 (groeneai).
  • 修复了向量搜索查询同时使用向量索引、另一个如 minmax 的跳过索引以及 use_skip_indexes_on_data_read = 1 时发生的异常。#106473 (shankar-iyer).
  • 修复了空合并 part 的文本索引出现“标记过多”错误的问题。#106867 (azat).
  • 修复了启用 query_plan_optimize_lazy_final 时,使用 FINAL 查询带有文本索引过滤器的 ReplacingMergeTree 表返回错误结果的问题。惰性 FINAL 优化构建的读取步骤未能复现从文本索引直接读取的行为,导致过滤器丢弃所有匹配行。#106894 (Ergus).
  • 修复了包含 LowCardinality 成员的 Variant 常量与键表达式为非单调确定性函数的键列进行比较时出现的 LOGICAL ERROR (Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) 问题 (例如 sipHash64(col) 上的 minmax 跳过索引) 。#107111 (groeneai).
  • 修复了启用 use_skip_indexes_for_top_k 优化时,如果排序列上具有 minmax 跳过索引的 part 中部分行已被轻量级 DELETE 删除,ORDER BY <col> LIMIT n 会返回错误结果 (通常为空) 的问题。该优化不再将经轻量级删除后 minmax 已过期的 parts 排在包含实际前 N 行的 parts 之前。#107320 (groeneai).
  • 修复了 Set 跳过索引无法对 LowCardinality 列上的 granules 进行剪枝的问题。#107868 (thevar1able).
  • 现在可通过 compatibility 设置将 use_skip_indexes_on_data_read 还原为 26.1 之前的默认值 (false) ,为 on-data-read 路径阻碍 minmax/set/bloom_filter 跳过索引进行标记范围剪枝所导致的性能回归提供规避方式。#108330 (egor-click).
  • 修复从多个部分 materialized 的文本索引直接读取时的问题。#108607 (CurtizJ)。
  • 修复启用 analyzer 后,通过 Distributed 引擎表查询时,定义在 mapValues(map) 或 mapKeys(map) 上的文本索引被静默忽略的问题。该索引在本地表及通过 cluster()/remote() 查询时均可使用,但通过 Distributed 引擎表查询时会被跳过 (且在启用 force_data_skipping_indices 时会因 INDEX_NOT_USED 而失败) 。#109188 (groeneai)。
  • 修复省略必需索引参数时,执行 CREATE HYPOTHETICAL INDEX ... TYPE set (以及 ngrambf_v1/tokenbf_v1) 导致 server 崩溃的问题。此类语句现在会被拒绝,并返回明确的错误信息。#109294 (groeneai)。
  • 修复存在文本索引时,函数 has、mapContainsKey 和 mapContainsValue 使用空 needle 会返回错误结果的问题。#110246 (rschu1ze)。
  • 修复合并带有文本索引的 parts 时,如果其中一个待合并的 part 为空 (例如变更删除了该 part 的所有行后) ,会出现 ATTEMPT_TO_READ_AFTER_EOF 错误的问题。#112490 (CurtizJ)。
  • 修复当 WHERE 子句包含带有大量点的大型字符串常量,且表具有 bloom_filter、tokenbf_v1、ngrambf_v1 或 text 跳过索引时,查询计划优化停滞的问题。将过滤器列名与 JSONAllPaths(...) 索引列匹配时,会枚举该名称按点拆分的所有结果,导致跳过索引条件的构建复杂度相对于常量长度呈二次增长。#113289 (groeneai)。
  • 修复当行策略是查询中唯一的过滤器且排序列具有 minmax 跳过索引时,ORDER BY ... LIMIT 返回的行数少于请求数量,甚至可能不返回任何行的问题。top-K 优化在应用行策略之前缩小了读取范围。#114073 (alexey-milovidov)。

数据湖修复

  • 修复读取由外部工具 (如 Spark) 升级格式版本的 Iceberg 表时发生的逻辑错误异常。 #100407 (alexey-milovidov).
  • 修复启用 PREWHERE 优化时,读取包含 ORC 数据文件的 Iceberg 表所发生的异常 (LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') 。 #101206 (groeneai).
  • 修复通过可能在未固定 datalake_table_state 的情况下进入读取管道的路径读取 Iceberg 或 DeltaLake 数据湖表时发生的 LOGICAL_ERROR 异常,例如并发更新 Iceberg 元数据,或对 DeltaLake 表执行 merge 读取。 #102033 (groeneai).
  • 修复异步加载元数据期间,在常规数据库中加载 Iceberg 引擎表时,DataLakeConfiguration::getCatalog 偶发的 Logical error: 'Database <name> not found' 错误。 #103775 (groeneai).
  • 修复启用 show_data_lake_catalogs_in_system_tables 时,INSERT 或 DDL 语句在 DataLake 目录数据库中引用不存在的表而导致过多读取目录/S3 元数据的问题。此前,拼写提示建议路径会加载整个目录中每张表的完整 Iceberg 元数据,可能耗尽大型目录的内存。 #104124 (il9ue).
  • 修复读取 Parquet 文件时被高估的 read_bytes (以及在 system.query_log、进度条等中显示的派生 bytes/s) 。此前的实现会在每个数据块中报告行组的总压缩大小,因此读取 N 列中的 K 列时会多计 N / K 倍。现在仅对选定列求和。还修复了 Iceberg 表的文件级进度跟踪,此前该功能从不报告数据文件大小。 #105413 (groeneai).
  • 修复使用 iceberg_use_version_hint = 1 读取 Iceberg 表时可能返回错误结果的问题:此前,其他未启用该设置的写入器 (如 icebergLocal/icebergS3 表函数) 推进表版本后会触发此问题。现在,文件一旦存在,每个写入器都会保持 version-hint.text 同步,因此后续使用该提示的读取器可看到最新快照。 #105682 (groeneai).
  • Iceberg 写入现在会保留 Nullable(T) 分区列中的 NULL 值。此前,ClickHouse 写入的 NULL 由 Spark 或其他 Iceberg 读取器读回时,会显示为内部类型的默认值 (int 为 0) 。 #105862 (groeneai).
  • 修复 Iceberg v2 merge-on-read 位置删除返回错误行的问题:当单个删除文件引用多个数据文件,且多个删除文件应用于同一数据文件时会发生此问题。现在会根据所引用的文件路径筛选删除条目。 #105888 (groeneai).
  • 修复 IcebergLocal 表引擎在经历 DETACH + ATTACH 周期或服务器重启后变为只读的问题,该问题会导致后续每次 INSERT 都因 Local object storage Local is readonly. (READONLY) 而失败。 #106016 (groeneai).
  • 修复因对象元数据不包含 blob ETag,导致 Azure Blob 存储 (如 Azure 上的 Delta Lake 表) 的文件系统缓存被静默禁用的问题。 #106091 (thewisenerd).
  • 为 Delta Lake 表增加了路径验证,防止元数据访问配置的存储位置之外的对象。#106115 (scanhex12).
  • Iceberg 分区裁剪现在可正确处理 WHERE partition_col = (SELECT ... FROM ...) 过滤条件:当分析器将标量子查询结果包装为源类型和目标类型相同的内部 _CAST(Const, 'TargetType') 时,也能正常裁剪。此前,此类过滤条件会禁用分区裁剪并触发全表扫描。#106204 (groeneai).
  • 修复了包含表的 Iceberg REST catalog 被错误报告为空的问题。#106301 (LefterisXefteris).
  • 修复了使用 Parquet V3 原生读取器查询 Iceberg 或 S3 表时,复合 WHERE 条件对未包含在 SELECT 列表中的列使用 IS NOT NULL 会导致 NOT_FOUND_COLUMN_IN_BLOCK 异常的问题。#106443 (tiandiwonder).
  • 修复了从使用 _file 或 _path 过滤器的 Iceberg 表读取时进度报告虚高的问题。此前,无论过滤条件如何,total_bytes_to_read 进度都会包含 manifest 中的所有文件。#106491 (PedroTadim).
  • 修复了向 Iceberg 表插入数据时的服务器异常 (std::out_of_range 逻辑错误) :当写入块的列名与最新 schema 的字段 ID 不匹配时会发生该异常 (例如,并发写入器在 iceberg_metadata_staleness_ms 时间窗口内重命名列后) 。现在插入操作会返回明确的查询错误,而不会中止服务器。#107279 (groeneai).
  • 修复了读取 MsgPack、BSON、ORC、Parquet、JSON、DeltaLake、Iceberg 和 Paimon 格式中深度嵌套的 schema 或值时,可能导致服务器栈溢出 (崩溃) 的问题。现在会通过异常拒绝此类深度嵌套的输入。#107341 (Algunenano).
  • 修复了读取 Iceberg 表时的问题:如果其元数据在不同版本之间将现有 schema-id 重新绑定到不同的 schema,调试构建会崩溃 (LOGICAL_ERROR) ,发布构建则会静默返回错误结果。现在会以 ICEBERG_SPECIFICATION_VIOLATION 拒绝此类元数据。#107370 (groeneai).
  • 修复了读取 Parquet 数据文件包含保留行沿袭列 (如 _row_id) 的 Iceberg v3 表时的问题;原生 Parquet 读取器不再针对不属于表 schema 的保留字段 ID 抛出 ICEBERG_SPECIFICATION_VIOLATION。#107377 (gregakinman).
  • 修复了在并发替换文件时列出本地磁盘对象存储目录 (例如 local disk 上的 Iceberg 表) 会错误抛出 filesystem error: in last_write_time: No such file or directory 异常的问题。现在会从列表中省略被并发删除的条目,而不是中止列出操作。#107432 (groeneai).
  • 修复了通过 Azure 读取 Delta Lake 表时出现 ‘必须指定帐户’ 错误的问题。#107620 (SmitaRKulkarni).
  • 修复读取含有相等性删除文件的 Iceberg 表时发生的崩溃问题。如果相等性删除文件中的列为 Nullable,而表 schema 中对应列为非 Nullable (或反之) ,从删除文件读取的值会经由未经检查的类型转换 (列类型混淆) 插入不同类型的列中,导致列损坏并使服务器崩溃。 #109551 (mstetsyuk).
  • 修复读取 Iceberg 表时错误触发 ICEBERG_SPECIFICATION_VIOLATION 的问题:当十进制类型 (或其他参数化基本类型) 在不同元数据文件中以不同的空白格式序列化时,例如表元数据中为 decimal(20,0),而清单中为 decimal(20, 0)。现在比较这类在规范上等效的类型字符串时会忽略空白。 #109676 (groeneai).
  • 修复读取默认排序顺序引用需要加引号的列 (例如 @timestamp) 的 Iceberg 表时的问题。此前,此类表无法读取,因为生成的存储 ORDER BY 由原始列名构建,导致解析失败并报出 SYNTAX_ERROR。 #110233 (groeneai).
  • 修复读取包含 Nullable ARRAY 或 MAP 列的 Paimon 表时的问题。此前此类表完全无法读取,因为 schema 映射器将复合类型包装在 Nullable 中,而 ClickHouse 不允许这样做,因此 DESC 和 SELECT 均会因 Nested type Array(Nullable(Int32)) cannot be inside Nullable type 而失败。现在,Nullable 复合列会映射为非 Nullable 复合类型,NULL 值则会读取为空复合值。 #113450 (groeneai).
  • 在写入表文件前,先在 catalog 中注册 Iceberg 命名空间 (SeaweedFS 所需) 。 #114285 (azat).

S3/Azure/对象存储修复

  • 修复在启用并行副本的查询中使用 url、s3 或类似表函数时出现的“Distributed task iterator is not initialized”异常。 #100146 (alexey-milovidov).
  • 修复 planner 生成带有 recursive_with 标志但不含 WITH 表达式的 SELECT 时,cluster 表函数 (s3Cluster、urlCluster、fileCluster 等) 可能导致服务器发生 segfault 的问题。 #105433 (groeneai).
  • 修复 IN (subquery) 谓词的 Parquet 和 ORC 过滤器下推,使行组、页面和布隆过滤器剪枝可用于 file、url、s3 及对象存储读取。 #105863 (arsenmuk).
  • 修复在列出对象与读取对象之间远程 S3 对象被较短内容覆盖时,缓存预下载期间发生的 LOGICAL_ERROR 异常。 #106375 (fm4v).
  • 修复 s3 表函数静默忽略小写位置参数 partition_strategy (例如 hive) 的问题。 #107297 (jkartseva).
  • 修复一项回归问题:设置 compatibility = '26.6' (会隐式启用 hive 分区策略) 时,S3 和对象存储表路径会静默接受 {_partition_id},而不是引发 BAD_ARGUMENTS。 #107437 (LefterisXefteris).
  • 修复键值参数重复时,s3 和其他对象存储表函数抛出 LOGICAL_ERROR 而非 BAD_ARGUMENTS 的问题,例如 s3('http://...', format = 'CSV', format = 'TSV')。 #107670 (groeneai).
  • 修复格式化混用 s3/gcs 表函数的位置参数和命名 secret 参数形式的畸形查询时发生的服务器异常 (Logical error: 'index >= result.start') ,例如 s3('url', 'a', 'b', secret_access_key = 'c')。 #107818 (groeneai).
  • 修复 S3 设置的优先次序,使 URL 范围的 <s3> 端点块优先于顶层 <s3> 默认设置。 #109251 (bharatnc).
  • 修复 Azure 服务返回的 411 Length Required 错误:基于 Poco 的 Azure HTTP 传输现在会根据请求体为未自行设置该请求头的 SDK 客户端 (例如 Azure Key Vault) 设置 Content-Length。 #110299 (thevar1able).

S3Queue 修复

  • 修复 S3Queue/AzureQueue 在 enable_hash_ring_filtering = 1 时的服务器崩溃问题 (越界访问) :当某个批次包含无法处理的文件,同时将该批次标记为处理中状态的 Keeper 请求失败时,会触发此问题。#108977 (groeneai).
  • 修复 SHOW CREATE、system.query_log、服务器日志和 EXPLAIN 输出中的凭据泄露问题。现在,所有 S3 定位器形式都会掩码处理 session_token 和 Google ADC 密钥、任意参数位置的 extra_credentials/headers 值、重复或由表达式构造的密钥、无效的位置参数形式 (默认拒绝) ,以及嵌入 S3 URL 的凭据;涵盖使用显式 URL 和命名集合的 s3/s3Cluster 表函数、基于 S3 的表引擎 (S3、GCS、数据湖引擎、S3Queue) 、S3 数据库引擎、BACKUP ... TO S3 以及 Backup 数据库引擎。此外,由表达式构造的 encrypt/decrypt/HMAC 密钥参数 (包括从 SQL UDF 内联而来的参数) 现也会在投影名称、EXPLAIN QUERY TREE 和 EXPLAIN actions 中隐藏。#109768 (Algunenano).
  • 修复使用持久化处理节点的 S3Queue/AzureQueue ordered 模式:现在会在流式处理期间刷新存储桶锁,以确保生存时间 (TTL) 清理 (persistent_processing_node_ttl_seconds) 不会移除仍在运行的处理器持有的锁。即使锁所有权仍然丢失,系统也会检测并报告该问题 (逻辑错误及 ObjectStorageQueueBucketLockLostOwnership profile 事件) ,流式处理随后会通过新的文件迭代器恢复。#110292 (kssenii).

安全与访问控制修复

  • 修复了任何拥有 CREATE TABLE 权限的用户通过 HTTP 或原生协议发送不含 ENGINE 子句的 CREATE TABLE ... TO INNER UUID '...' 时可触发的服务器崩溃 (SIGSEGV) 。同一问题也会导致客户端崩溃。解析器现在会报告正确的 BAD_ARGUMENTS 错误,而不会解引用空指针。#105579 (groeneai).
  • 修复了启用 allow_experimental_delta_kernel_rs 时,查询凭据或选项中包含无效字节的 DeltaLake 表会导致服务器崩溃的问题 (Rust FFI 在跨越 extern "C" 边界时发生 panic) 。#106109 (Algunenano).
  • 修复了 Arrow IPC 格式读取器 (ArrowColumnToCHColumn) 中的多个堆越界读取漏洞。恶意构造的 Arrow 文件可能声明的行数多于其缓冲区包含的行数、声明与父级长度不一致的 list/struct/map 子级长度、提供非单调的列表偏移量,或截断子级有效性 bitmap,从而导致读取越过堆分配内存的末尾。任何拥有 SELECT 特权的用户均可通过 file()、format()、表函数或 ArrowFlight 输入触发此问题。现在会在访问任何原始指针前验证所有数据、偏移量、view-struct 和有效性 bitmap 缓冲区,并检查 list/struct/map 的形状和偏移量是否一致。#106395 (Algunenano).
  • 修复了一个问题:system.query_log 的 used_privileges 和 missing_privileges 列可能包含从其他用户、数据库或会话的无关早期查询中泄漏的特权字符串。#106425 (alexey-milovidov).
  • 修复了 decodeHTMLComponent 在解码包含会展开的 HTML 实体 &nGt; 或 &nLt; 的字符串时发生的堆缓冲区溢出 (服务器崩溃) 问题。任何拥有一次 SELECT 权限的用户均可触发此问题。#106741 (Algunenano).
  • 修复了即时变更 (apply_mutations_on_fly) 或补丁分区片段在 PREWHERE 之前过滤行时,查询条件缓存导致查询结果错误的问题。使用 apply_mutations_on_fly = 1 读取的查询可能污染缓存,导致后续使用 apply_mutations_on_fly = 0 且具有相同谓词的查询跳过本应读取的标记,并返回过少的行。此修复同样涵盖行级安全策略;此类策略会作为过滤器添加在 PREWHERE 之前:在限制性行策略下运行的查询可能污染缓存,影响后续使用相同谓词但未应用该策略的查询。#107145 (groeneai).
  • 修复了 windowFunnel 在完成包含超出范围事件类型的恶意构造聚合函数状态时发生的堆缓冲区溢出 (服务器崩溃) 问题。任何拥有一次 SELECT 权限的用户均可触发此问题。#107412 (uwezkhan).
  • 修复了 currentUser()、user()、SESSION_USER 和 authenticatedUser() 在异步插入刷新路径中 (使用 async_insert = 1) 计算结果为空字符串的问题。这会影响引用这些函数的 DEFAULT/MATERIALIZED 列表达式和 materialized view,导致其静默存储空字符串而非执行插入操作的用户。#107541 (groeneai).
  • 当为同一用户或角色分配多个配额时,现在会同时强制执行所有配额 (若超出其中任一配额,查询将被拒绝) ,而非仅以非确定性方式选择并强制执行其中一个配额。SHOW QUOTA 和 system.quota_usage 现在会显示对当前用户强制执行的所有配额。#107664 (alexey-milovidov).
  • SYSTEM RESET DDL WORKER 现需具备新的 SYSTEM RESET DDL WORKER 权限。此前,任何已通过身份验证的用户 (包括 readonly 用户) 都可执行该命令并反复重置 DDL 工作线程状态,从而阻塞 ON CLUSTER DDL。 #108460 (groeneai).
  • 修复了 ssl_certificate 用户识别机制:单个 * 通配符现在仅匹配一个名称组件 (RFC 6125 6.4.3) 。此前,CN 或 DNS: SAN 主题中的通配符 (例如 *.corp.example.com) 也会匹配多标签名称,例如 evil.deep.corp.example.com,使持有更深层子域名证书的用户能够以通配符用户身份通过验证。URI: SAN 匹配行为未变。 #108472 (groeneai).
  • MySQL wire 协议命令 COM_FIELD_LIST (mysql_list_fields) 和 COM_INIT_DB (USE database) 现在实施与其等效 SQL 命令 (SHOW COLUMNS/DESCRIBE 和 USE) 相同的访问控制。此前,它们可能泄露用户仅拥有部分列权限的表的列名,并可在没有 SHOW DATABASES 权限的情况下切换当前数据库。 #108508 (groeneai).
  • 以不区分大小写的方式匹配 http_forbid_headers。HTTP 请求头名称不区分大小写,因此禁止 Authorization 现在也会阻止 authorization、AUTHORIZATION 及其他大小写变体。已配置的 header_regexp 模式现在也会以不区分大小写的方式匹配,无需显式指定 (?i) 标志。 #108509 (groeneai).
  • 修复了元数据泄露问题:DESCRIBE loop('db', 'table') 和 DESCRIBE loop(<inner table function>) 会绕过 SHOW COLUMNS / 源访问检查,使无权限用户能够读取表的列结构。 #108624 (groeneai).
  • 修复了启动失败问题:由旧版本 (25.12 或更早版本) 创建且包含格式错误的 auth_header 的 DataLakeCatalog 数据库,在升级到 26.2 或更高版本后无法 ATTACH,导致服务器无法启动。现在仅在 CREATE 时验证 auth_header;在 ATTACH 时,目录会在首次使用时惰性构建,而非在启动期间构建。因此,单个配置错误或不可达的目录数据库不再阻止服务器启动。 #108674 (groeneai).
  • 增强了 RabbitMQ 连接对恶意超大 AMQP 帧的防护,并将 remote_url_allow_hosts 检查一致应用于 rabbitmq_address。 #112479 (kssenii).
  • 修复了一种可能泄露信息的情况:未指定列列表的 CREATE TABLE ... ENGINE = Distributed(...) 可能会泄露创建用户无权查看的本地表结构。对于由本地服务器自行执行的 CREATE,现在会在该用户自身的上下文中推断结构,因此需要对目标表拥有 SHOW COLUMNS 权限,这与 Remote engine 的现有要求一致。从 DDL queue 重放的 CREATE (ON CLUSTER,或 Replicated 数据库中的 CREATE) 不受此修复覆盖。 #113220 (groeneai).
  • 修复了以下问题:未指定列列表的 CREATE TABLE ... ENGINE = Buffer(...) 可能泄露创建用户无权查看的目标表结构。对于由本地服务器自行执行的 CREATE,现在会在用户自身的上下文中推断结构,因此需要具备目标端的 SHOW COLUMNS 权限,与 Merge 和 Remote 的要求相同。从 DDL 队列重放的 CREATE (ON CLUSTER 或在 Replicated database 中) 不受此修复影响。 #113372 (groeneai).
  • 限制了在身份验证前读取的 PostgreSQL wire protocol 启动消息大小。 #115708 (alexey-milovidov).

备份与恢复修复

  • 修复了对包含存在循环依赖关系的表的备份执行 RESTORE 时服务器中止的问题。#103824 (thevar1able).
  • 修复了通过 S3 磁盘和对象存储进行分段上传时,写入对象会忽略 S3 存储类别 (s3_storage_class / s3_storage_class_name)的问题;此前大型对象会使用默认的 STANDARD 类别创建。现在,磁盘、对象存储和备份均可使用 s3_storage_class 或 s3_storage_class_name 作为该选项名称。#106214 (alexey-milovidov).
  • 修复了 SYSTEM RELOAD CONFIG 会丢弃各端点的 Azure Blob 存储设置 (如 use_native_copy) 的问题;此前,在服务器重启前,BACKUP/RESTORE 会忽略磁盘中配置的设置。#106357 (jkartseva).
  • 修复了在 Replicated 或 Shared 数据库中收集可刷新materialized view 的 REPLACE 目标时,如果该 materialized view 尚未在发起备份的副本上实例化,备份会因 FILE_DOESNT_EXIST 失败的问题。#106411 (jkartseva).
  • 修复了 Azure BACKUP/RESTORE 会忽略旧格式 azure_blob_storage 磁盘端点设置的问题。#106784 (jkartseva).
  • 修复了向 AzureBlobStorage 执行 BACKUP 时的问题:复制备份中的数据文件会将目标对象写入备份目录之外。S3 目标端的备份对象存在性检查现在使用精确的 HeadObject 请求,而非列出前缀,从而避免与前缀相似的键发生误匹配。#107153 (pamarcos).
  • 增量备份不再将 S3 凭据存储在 .backup 元数据文件的 <base_backup> 定位器中。使用 use_same_s3_credentials_for_base_backup = 1 创建的备份,或显式指定的基础备份凭据与该备份定位器相匹配的备份,会存储非敏感标记,恢复时无需额外设置;对于使用不同的显式基础备份凭据或额外基础身份验证参数创建的备份,请通过 base_backup 设置将这些参数传递给 RESTORE。旧版本创建的、包含嵌入式凭据的备份仍可恢复。#107357 (pamarcos).
  • 修复了对 ReplicatedMergeTree 表执行 RESTORE 时的问题:备份中内容重复的分片会被保留,不再被静默去重。#107652 (pamarcos).
  • 如果文件类引擎 (S3、AzureBlobStorage、URL 等) 的路径中包含 {_partition_id} 占位符,且未显式指定 partition_strategy,则会再次采用 wildcard 策略,而不受 file_like_engine_default_partition_strategy 影响。这恢复了 26.6 之前 DDL 的向后兼容性;此前这些 DDL 会因 BAD_ARGUMENTS 失败 (“Partition strategy hive can not be used with a ‘_partition_id’ wildcard in the path”) 。#111279 (fm4v).

ClickHouse Keeper 修复

  • 修复 Keeper 写入失败后的快照清理问题,确保安全清理不完整的快照,并且可重试失败的写入而不推进 latest_snapshot_meta。#105779 (antonio2368).
  • 修复新的请求调度器响应队列可能在响应线程启动前填满时,Keeper 在 follower 追赶期间发生故障的问题。#106049 (antonio2368).
  • 修复当 nuraft_max_log_gap_in_stream 设置为非默认值时,Keeper 有时会在启动过程中卡住的问题 (默认值为 0,即禁用 append_entries 请求的流水线处理) 。#106220 (al13n321).
  • Keeper 的内部 Raft TLS 现在会遵循 openSSL.client.verificationMode 设置。此前,无论该设置为何值,Keeper 间的 Raft 通信始终启用对 peer 证书的验证,因此会静默忽略 none。现在,none 会显式禁用 Raft peer 证书验证;未设置时则保持此前默认安全的行为。升级后,显式设置 none 的配置将不再验证 Raft peer 证书,符合配置意图。#106726 (antonio2368).
  • 修复重新加载配置时意外重建 ZooKeeper session 的问题。#107096 (azat).
  • 修复 ClickHouse Keeper 中的一个问题:安装过期或重复的快照后,通过 last_snapshot (以及 mntr 中的 zk_latest_snapshot_size) 报告的快照 元数据 可能会倒退;这还可能导致索引相同的本地快照在仍流式传输给 peer 或上传至 S3 时,原地覆盖已注册的 snapshot file。#107321 (antonio2368).
  • 修复在不恰当的时机丢失 ZooKeeper connection 时,可刷新materialized view 卡住的问题。#108234 (al13n321).
  • 修复将 query parameter 用作分区的变更 (ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}) 问题:替换后的分区值会以无法重新解析的形式序列化到变更条目中,导致表无法加载 (对于复制表,则会在每个副本上发生) 。现在还会在将变更命令写入 ZooKeeper 或磁盘前验证其能否重新解析,因此类似的不匹配将导致 ALTER 查询失败,而不会破坏表。#111518 (al13n321).
  • 修复解析 system.zookeeper_info 数据时的数值溢出问题。#111629 (kssenii).

崩溃和稳定性修复

  • 修复在新 analyzer 中将 LIMIT BY 与常量列、DISTINCT 和 ORDER BY 结合使用时出现的 NOT_FOUND_COLUMN_IN_BLOCK 异常。 #93195 (ashrithb).
  • 通过增加自动重试和重连逻辑,修复与 Hive Metastore 通信时处理 TTransportException 错误的 HiveCatalog 连接稳定性问题。 #98471 (otselnik).
  • 修复短路函数 (if、multiIf、and、or 等) 在 analyzer 分析阶段的常量折叠问题,静态不可达的分支不再在分析期间引发异常。例如,WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n)) 现在会正确返回 0,而不会因除零错误失败。 #103157 (fastio).
  • 修复对返回自身状态的聚合函数调用 runningAccumulate 时导致 server 终止的问题。 #105085 (antaljanosbenjamin).
  • 修复 getServerSetting,使其针对可在运行时修改的服务器设置 (如 max_server_memory_usage、mark_cache_size、max_concurrent_queries、线程池大小等) 返回当前实际生效的值,与 system.server_settings 报告的值一致。 #105172 (alexey-milovidov).
  • 修复启用 analyzer 时同时使用 ORDER BY ... WITH FILL INTERPOLATE 和 LIMIT N BY 导致的 NOT_FOUND_COLUMN_IN_BLOCK 异常。 #105481 (yakov-olkhovskiy).
  • 修复主体为关联子查询的 MATERIALIZED CTE 用作 IN 右侧时出现的 server 异常 (逻辑错误:Trying to execute PLACEHOLDER action) 。此类 CTE 现在会在分析阶段被拒绝,与直接在 FROM 中引用该 CTE 时对相同模式的处理一致。 #105518 (groeneai).
  • 修复 variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false 无法捕获函数执行期间异常的问题。 #105543 (Avogar).
  • 修复 TTL 表达式引用子列时出现的 NOT_FOUND_COLUMN_IN_BLOCK 异常。 #105578 (Avogar).
  • 修复以下情况下可能发生的 server 崩溃:通过 postgresql 表函数、PostgreSQL 表引擎,或使用 PostgreSQL 源的字典从 PostgreSQL 读取数据的查询被取消 (例如使用 KILL QUERY) ,且取消远程 PostgreSQL 查询失败。 #105949 (rorylshanks).
  • 修复查询中包含过大字符串字面量时可能导致的崩溃。 #105996 (nickitat).
  • 修复在 ORDER BY 中使用排序前缀并启用 use_with_fill_by_sorting_prefix 时,使用空的 INTERPOLATE () 所导致的 INVALID_WITH_FILL_EXPRESSION 异常。现在会将排序前缀列正确排除在隐式插值集合之外,与显式指定的 INTERPOLATE (col) 行为一致。 #106001 (yakov-olkhovskiy).
  • 现在会拒绝来自 RowBinary 输入或查询参数的格式错误 AggregateFunction(uniqTheta, ...) 状态,并返回 CORRUPTED_DATA,而不会导致服务器终止。 #106260 (groeneai).
  • 修复将基于约束的优化 (optimize_using_constraints) 与相关子查询配合使用时发生的崩溃及可能出现的 NOT_FOUND_COLUMN_IN_BLOCK 错误。 #106349 (Algunenano).
  • 修复查询 Distributed 表时的 NUMBER_OF_COLUMNS_DOESNT_MATCH 异常:该表包含两个或更多展开为同一表达式的 ALIAS 列 (例如均定义为 toString(x)) ,或者同一表达式既作为 ALIAS 列引用,又直接写在带有 ORDER BY 子句的 SELECT 列表中。 #106404 (yakov-olkhovskiy).
  • 修复在 multiIf 中将星号传递给表函数参数的查询所引发的 LOGICAL_ERROR “Trying to get name of not a column: ExpressionList”,例如 numbers(multiIf(*, ...), 2)。现在会以 UNSUPPORTED_METHOD 拒绝包含无法解析匹配器的查询。 #106647 (groeneai).
  • 拒绝会导致目录列举无限递归的异常 file glob 模式。现在最大递归深度限制为 1000;超过该深度的查询会引发 TOO_DEEP_RECURSION,而不会因栈溢出导致服务器中止。 #106676 (groeneai).
  • 修复当表函数 input 被包装在非 MATERIALIZED CTE 中,且该 CTE 在查询中被多处引用时引发的 'Trying to read from input() twice.' 异常。现在会在查询计划阶段以明确的 INVALID_USAGE_OF_INPUT 错误拒绝该查询。input 是一次性的客户端 stream,只能由查询计划中的单个源使用。 #106682 (groeneai).
  • 修复解析期间发生异常 (例如 MEMORY_LIMIT_EXCEEDED) 时产生的不一致列,该问题随后会导致 LOGICAL_ERROR。 #106802 (azat).
  • 修复使用 input_format_allow_errors_num > 0 读取截断的 Protobuf 数据时发生的服务器崩溃 (SIGSEGV) 。 #106905 (atsarevskiy).
  • 修复对 RocksDB 句柄已释放的 EmbeddedRocksDB 表执行 TRUNCATE 或 DROP 时发生的服务器崩溃 (空指针解引用) ,例如此前通过 TRUNCATE 清空数据目录的 read_only 表。 #106940 (groeneai).
  • 修复使用极大的 max_streams_for_files_processing_in_cluster_functions 设置从 urlCluster 等 *Cluster 表函数读取时出现的异常 (以 LOGICAL_ERROR 形式报告的 std::length_error) 。现在会将 stream 数量限制在合理范围内。 #106946 (groeneai).
  • 修复分布式查询在发送到分片前立即被取消时导致的服务器终止。 #106950 (groeneai).
  • 修复了启用 materialized_views_squash_parallel_inserts 时,同一源表上的两个 materialized view 写入同一目标表且依赖视图读取该目标表时,执行 INSERT 会引发服务器异常 (逻辑错误 this->visited_views == right->visited_views) 的问题。#107027 (groeneai).
  • 修复了向列与写入模式不匹配的 DeltaLake 表插入数据时出现的 LOGICAL_ERROR 异常 (例如展平为子列的 Nested 列,或指定了显式列子集的表函数) 。此类插入现在会改为返回面向用户的 INCOMPATIBLE_COLUMNS 错误。#107058 (groeneai).
  • 修复了限定星号匹配器 (例如 x.*) 在自身的递归项中通过名称引用递归 CTE 时引发的 LOGICAL_ERROR (“Table expression … data must be initialized”) 。此类匹配器现在会展开递归表的列,行为与该位置的限定列 (x.a) 或非限定匹配器 (*) 一致。#107144 (groeneai).
  • 修复了可刷新 materialized view 的 REFRESH ... DEPENDS ON <name> 依赖项中未限定的名称与临时表或 CTE 名称相同时,服务器重启后可能陷入崩溃循环的 LOGICAL_ERROR (“Unexpected exception in refresh scheduling”) 。#107156 (groeneai).
  • 修复了将 toString 或 concat 等函数应用于包含单个非空变体和 NULL 值的 Variant 或 Dynamic 列,且函数原样返回输入列时出现的 LOGICAL_ERROR (Variant N (T) has size X, but expected Y) 。#107374 (groeneai).
  • 修复了启用 use_strict_insert_block_limits 时,异步向 Alias 表执行 INSERT 引发的 LOGICAL_ERROR (block.rows() == getRows()) 。#107400 (groeneai).
  • 修复了键表达式 (ORDER BY、PRIMARY KEY、PARTITION BY 或跳数 INDEX) 包含右侧为表的 IN 运算符时出现的服务器异常 (Logical error: Not-ready Set is passed as the second argument for function 'in') ,例如 ORDER BY (x IN some_table)。现在会在创建表时拒绝此类键表达式。#107424 (groeneai).
  • 修复了在初始化去重键集合期间发生分配失败 (例如达到内存限制) 时,DISTINCT 处理过程中可能发生的罕见服务器崩溃。#107467 (groeneai).
  • 修复了临时 S3 凭据过期后 DeltaLake 操作失败的问题:现在会在下一次操作前刷新缓存的凭据。STS assume-role 凭据也会在身份验证失败后刷新。#107480 (ahmadov).
  • 修复了查询带有 PARTITION BY 键的表时,包含在较大表达式中的 IN/NOT IN 子查询引发的 Not-ready Set is passed as the second argument for function 'in' (LOGICAL_ERROR) ,例如 WHERE (c0 IN (SELECT ...)) != 0。#107515 (groeneai).
  • 修复了在本地执行分布式查询计划 (make_distributed_plan + distributed_plan_execute_locally) 且 log_formatted_queries = 1 时可能发生的崩溃 (空指针解引用) 。#107570 (groeneai).
  • 修复了在以 enable_analyzer = 0 运行查询时,读取目标为 Distributed 表的 materialized view 会导致 server 崩溃的问题。#107653 (groeneai).
  • 修复了读取 Protobuf 数据时的 server 崩溃 (SIGSEGV) 问题:当 input_format_allow_errors_num > 0,且同一块中有效消息位于错误 (可跳过) 消息之前时会触发该问题。#107739 (atsarevskiy).
  • 修复了在推断远程表结构时,如果 bridge 无响应,odbc 和 jdbc 表函数会挂起数分钟并忽略查询取消请求 (KILL QUERY、max_execution_time) 的问题。#107809 (alexey-milovidov).
  • 修复了传递给 remote()/remoteSecure() 的 named collection 的 database/db 覆盖项不是常量数据库名称时可能发生的崩溃 (空指针解引用) ,例如 remote(nc, database = (SELECT 1))。现在该查询会返回明确的错误,而不会崩溃。#108271 (groeneai).
  • 从 _distance 列 SELECT 的向量搜索查询现在会返回恰当的错误,而不是以 LOGICAL_ERROR 失败。#108423 (rschu1ze).
  • 修复了当 quantileTDigest 系列聚合函数状态列被用作 GROUP BY 键,并由多个线程并发序列化时可能发生的崩溃 (堆缓冲区溢出) 。#110263 (groeneai).
  • 修复了对具有反向 (降序) 排序键 (ORDER BY (g, r DESC)) 的表进行主键索引分析时出现的错误裁剪问题。跨越前导键列变化、后接降序键列的 granule 可能被错误裁剪,导致丢失匹配行。#111059 (nihalzp).
  • 修复了以下情况下的逻辑错误 block.rows() == getRows() (在发布构建中会导致越界读取和插入去重失效) :INSERT 流经依赖的 materialized view,其目标为 Alias,内部查询会改变行数,并且别名跳转之后可访问支持去重的表。#111103 (alexey-milovidov).
  • 修复了解析包含 String 值的格式错误聚合函数状态时,因越界内存访问导致的 segfault。现在会验证并拒绝此类状态,不再导致 segfault。#111606 (mstetsyuk).
  • 修复了读取 bloom filter 元数据不一致的 Parquet 文件时发生的崩溃。此前,此类文件还可能在不报错的情况下返回少于应有数量的行。#112498 (tiandiwonder).
  • 修复了向非空文件追加数据时的 segfault 和静默数据损坏问题:当对 File 表引擎或 file 表函数执行 INSERT,且文件格式不支持追加 (如 Avro) 时会触发该问题。通过文件描述符或分区路径写入会绕过现有检查,导致格式前缀被跳过,并在原有字节之后写入第二个文件头,使文件无法读取。现在,此类 INSERT 将被拒绝并返回 CANNOT_APPEND_TO_FILE,与普通路径的行为一致。 #112839 (groeneai).
  • 修复了可刷新 materialized view 在规划刷新查询时被阻塞,导致 DROP TABLE 和 SYSTEM STOP VIEW 挂起的问题。 #113188 (evillique).
  • 修复了异步插入队列条目具有相同截止时间时罕见的服务器终止问题。 #113363 (mstetsyuk).
  • 修复了通过自行管理读取缓冲区的输入格式读取 Parquet 时发生的堆内存损坏问题,例如使用 SOURCE(FILE(... format 'Parquet')) 的字典。管道释放缓冲区后,后台预取和解码任务仍可能通过该缓冲区读写,从而导致服务器中止。 #114668 (groeneai).
  • 修复了删除名称按字典序排在其内部表名称之前的 TimeSeries 表时发生的挂起问题,例如名为 -ts 的表;删除以 ENGINE = TimeSeries 声明的 materialized view 时也会出现此问题。删除操作会在 DDL 守卫上发生自死锁,且无法通过 KILL QUERY 取消。 #114953 (groeneai).

其他缺陷修复

  • 函数 like、ilike、notLike、notILike 和 match 现已支持常量 haystack 和非常量 needle (例如 'foo' LIKE pattern_column) ,此前会抛出 ILLEGAL_COLUMN。 #100479 (Onyx2406).
  • 修复从基于具有普通投影的表的 VIEW 中查询时出现 NOT_FOUND_COLUMN_IN_BLOCK 错误的问题。 #101218 (amosbird).
  • 拒绝在 max_bytes_per_second、max_cpus 等工作负载设置中使用负 Float64 值 (例如 -100.5) 。此前仅校验负整数,导致负浮点数能够在不报错的情况下创建损坏的调度器节点。 #101842 (groeneai).
  • 对象存储读取操作现可及时响应查询取消。 #103016 (SmitaRKulkarni).
  • 修复当 max_insert_block_size_bytes 为 0 (默认值) 时,INSERT 解析过程中 input_format_max_block_size_bytes 被静默忽略的问题。该设置现在可正确限制行输入格式生成的块大小。 #103068 (Fgrtue).
  • 修复 ClickHouse 因错误删除尾随空字节而偶尔生成无效 GSSAPI 令牌的问题。 #103114 (EmeraldShift).
  • EXPLAIN SYNTAX 现可展开参数化视图。 #103263 (jrdi).
  • 修复通过 INSERT INTO FUNCTION hdfs(...) 向 HDFS 写入 Parquet (以及 ORC、Arrow 等其他带尾部信息的格式) 时的数据损坏问题。自 26.1 起,WriteBufferFromHDFS 未在 finalize() 时刷新其工作缓冲区,导致每个文件末尾最多 DBMS_DEFAULT_BUFFER_SIZE 字节被静默丢失,其中包括 Parquet 的 PAR1 页脚。读取此类文件会返回 Not a Parquet file (wrong magic bytes at the end of file)。 #103268 (groeneai).
  • 修复设置 join 大小限制 (max_rows_in_join / max_bytes_in_join) 并同时设置 join_overflow_mode = 'break' 时,关联子查询可能产生错误结果或逻辑错误的问题。现在,内部为评估关联子查询而创建的 join 会忽略这些用户限制,因此不会再提前停止并丢弃行。 #103322 (groeneai).
  • 修复聚合投影包含多个具有不同 IN (...) 条件的 sumIf 聚合时,可能产生错误结果或遗漏投影的问题。 #104765 (Ergus).
  • 修复 deltaSumTimestamp 对跨越零点的有符号整数类型返回错误结果的问题。 #104830 (thevar1able).
  • 修复对元数据文件已损坏或无法加载的新附加 Iceberg、DeltaLake 或 Hudi 表执行 DELETE FROM 时引发 Logical error: 'Metadata is not initialized' 的问题。现在会改为报告常规的用户可见异常,服务器可继续运行。 #104917 (groeneai).
  • 现在,ATTACH TABLE name <clauses>; 查询若指定了存储子句 (ORDER BY、PARTITION BY、PRIMARY KEY、SAMPLE BY、TTL、UNIQUE KEY 或引擎 SETTINGS) 但未指定 ENGINE,将抛出 BAD_ARGUMENTS,而不再静默地按已存储的定义重新附加表并忽略用户提供的子句。查询级别的会话 SETTINGS (如 log_comment) 仍会生效。使用 ATTACH TABLE t; 可按已存储的元数据重新附加表,或在 ATTACH 后使用 ALTER TABLE t MODIFY SETTING ... 修改设置。#105068 (groeneai).
  • 修复了读取二进制或字符串列中含有损坏的中间偏移量的 Arrow 或 ArrowStream 文件时发生的堆缓冲区溢出,以及读取带地理标记的 Arrow 列时发生的空指针解引用问题。#105449 (Algunenano).
  • 修复了执行 ALTER 后从压缩的 Memory 表读取 Dynamic 子列时服务器终止的问题。#105464 (Avogar).
  • 将 skip_first_lines 纳入 WithNames 格式的模式缓存键。#105469 (Avogar).
  • 修复了 histogram 对较小的未排序输入产生错误结果的问题。#105548 (Avogar).
  • 修复了启用 optimize_trivial_insert_select 时表函数使用插入表的问题。#105555 (Avogar).
  • 修复了 estimateCompressionRatio 窗口函数在行之间丢失累积数据的问题。#105581 (Avogar).
  • Hive 分区值提取现在会遵循 cast_string_to_date_time_mode 设置,并且默认接受分区键中带有时区后缀 (例如 +0000、+00:00、Z) 的 ISO 8601 时间戳。#105584 (alexey-milovidov).
  • 修复了 Template 输入格式在遇到格式错误的行后进行错误恢复时的问题。#105735 (niyue).
  • 修复了 SYSTEM INSTRUMENT ADD 的格式化问题,确保处理程序参数之间仅以一个空格分隔;同时拒绝无效的 SLEEP 插桩参数列表,包括包含两个以上值的列表,或最小值大于最大值的范围。#105984 (pamarcos).
  • 修复了 Bool 分区键的 ALTER TABLE 分区操作静默失败的问题。#106004 (Avogar).
  • 修复了带有默认值的类型化 JSON 路径中 JSONExtractRaw 和 JSONHas 的问题。#106005 (Avogar).
  • 修复了数据湖配置中空基础路径被错误添加 / 前缀的问题。#106013 (thewisenerd).
  • 修复了部分撤销 SHOW DICTIONARIES 权限时,system.dictionaries 返回 0 行的问题。#106105 (Avogar).
  • 修复了对 ORDER BY 包含单调递减函数 (如 (c0 / -42) 或 intDiv(c0, -42)) 的表执行查询时结果错误的问题。对底层列的谓词 (例如 c0 < 0) 可能会错误地跳过包含匹配行的粒度,导致结果缺失。#106136 (nihalzp).
  • 新增了对插入过程中格式错误的 DDSketch 聚合状态的验证。#106236 (yariks5s).
  • 修复了 SLRU 降级失败后的文件系统缓存一致性问题,防止条目一直处于驱逐状态。还修复了 System/Data 分离缓存的大小调整和可用空间清理问题,使限制能够原子更新,并可从两个缓存分段回收空间。#106286 (kssenii).
  • 修复了因尾数移位差一而导致次正规 Float16 值错误转换为 Float32 的问题 (例如从 Numpy .npy 文件读取这些值时) 。#106343 (jh0x).
  • 修复 regexpExtract(haystack, pattern):不含捕获组的模式现在会返回完整匹配结果,而非抛出 INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE。#106374 (groeneai).
  • 修复了从包含 NaN 或无限点坐标的源数据构建多边形字典时发生的逻辑错误。现在会拒绝此类坐标,并返回清晰的错误信息。#106423 (alexey-milovidov).
  • HTTP 字典现在可通过命名集合指定请求头。#106459 (ZelvaMan).
  • 现在会验证格式错误的 Avro 枚举值,并通过抛出异常将其拒绝,避免导致越界内存访问和服务器终止。#106476 (mstetsyuk).
  • 修复了 LIMIT WITH TIES 和带小数的 LIMIT WITH TIES 在确定并列项时未遵循 ORDER BY ... COLLATE 中排序规则的问题。按排序规则相等的行 (例如数值排序规则下的 '1' 和 '01') 此前会按字节比较,因此部分并列行被错误地从结果中排除。#106539 (nihalzp).
  • 修复了输入按排序规则 (ORDER BY ... COLLATE) 排序时,按顺序执行的 DISTINCT 和 LIMIT BY 优化 (包括负数 LIMIT BY) 会返回错误结果的问题。按排序规则相等的行 (例如不区分大小写的排序规则下的 'a' 和 'A') 会按排序规则键排序,但其值并不相邻,因此现在使用排序器时会跳过按顺序优化。#106564 (nihalzp).
  • 修复了 NATS 消费者关闭期间可能导致服务器终止的竞争问题。#106692 (mstetsyuk).
  • 修复了可通过不受信任输入触发的格式读取器中的多个内存安全和资源耗尽问题:原生 Parquet 读取器处理 DataPageV2 定义级别/重复级别长度时的堆越界读取漏洞、深度嵌套模式的 Parquet 文件导致的栈溢出,以及解析 GeoParquet WKB/WKT 几何数据和 Avro 字符串/字节时忽略 max_memory_usage 的内存分配问题。#106739 (Algunenano).
  • 修复 keeper_server.http_control.secure_port 向 HTTPS 客户端返回明文 HTTP 响应的问题。该安全端口现在可正确提供 HTTPS 服务。#106822 (linjiayu1025-collab).
  • 修复 SHOW CREATE ROW POLICY 将 restrictive/permissive 输出为小写而非大写,导致与其他关键字不一致的问题。#106865 (valerypetrov).
  • 修复分区键包含 LowCardinality(Nullable(...)) 列的表在重新加载 parts 时 (如服务器重启、DETACH 或 ATTACH) ,parts 会被标记为损坏并分离的问题。自 26.5 起,此类列的最小值和最大值均为 NULL 时,不会写入每个 part 的 minmax 索引文件,但 part 一致性检查仍要求该文件。受影响版本写入的 parts 缺少 minmax 索引文件,仍需手动重新附加。#106945 (PedroTadim).
  • 修复异步插入 flush (AsyncInsertFlush) 查询在 system.processors_profile_log 和 system.query_log 中 elapsed_us 始终为零,以及 read_rows/read_bytes 被低估的问题。#106982 (cwurm).
  • 修复 Block structure mismatch in UnionStep stream 逻辑错误:当 UNION/INTERSECT/EXCEPT 的一个分支读取 Sparse 序列化的列,而同级分支将同一列作为完整列读取时 (例如写入 materialized view 时) ,会发生此错误 (调试版/消毒器构建中服务器会中止,发布构建中显示为 Code: 49) 。#107041 (groeneai).
  • 修复启用 optimize_read_in_order 和 read_in_order_use_virtual_row 时,对 UNION ALL 执行 ORDER BY 查询的行顺序不正确的问题。#107053 (vdimir).
  • 修复在 SHOW ROW POLICIES 或 SHOW MASKING POLICIES 后跟 FORMAT、SETTINGS 或 INTO OUTFILE 子句时出现语法错误的问题 (例如 SHOW ROW POLICIES FORMAT TabSeparated) 。#107061 (groeneai).
  • 修复自定义修剪字符集超过 16 个字符时,trimLeft、trimRight 和 trimBoth (及其别名 ltrim、rtrim、trim) 抛出 TOO_LARGE_STRING_SIZE 的问题。现在再次支持任意长度的修剪字符集。#107071 (fm4v).
  • 修复 quantileExactExclusive、quantilesExactExclusive、quantileExactInclusive 和 quantilesExactInclusive 中的有符号整数溢出问题,该问题可能导致取值范围较大的 Int64 输入产生错误结果。#107154 (groeneai).
  • 配置重新加载不再重新执行启动脚本,避免一次性启动操作再次运行。#107187 (mstetsyuk).
  • 修复启用 optimize_read_in_order 时,如果因 max_streams_for_union_step 设置而缩窄 UNION 管道,UNION ALL 上 ORDER BY 的结果顺序不正确的问题;当执行计划依赖已排序的 UNION 输出流时,现在会跳过缩窄操作。#107208 (vdimir).
  • 修复服务器关闭后期解析代理配置时可能发生的空指针解引用问题。#107231 (PedroTadim).
  • 修复当前置 ORDER BY 列使用 COLLATE 排序规则时,ORDER BY ... WITH FILL 生成额外行的问题。现在会根据该排序规则按排序前缀对行分组,使其与排序顺序一致。#107365 (groeneai).
  • 修复将非有限浮点值 (如 nan 或 inf) 作为 prometheusQuery / prometheusQueryRange 表函数的时间戳/耗时参数传入时的未定义行为。此类参数现在会引发 BAD_ARGUMENTS,而不会生成无意义的时间戳。#107417 (groeneai).
  • 修复 optimize_rewrite_aggregate_function_with_if 优化对保留 NULL 负载值的聚合函数 (*_respect_nulls 系列:anyRespectNulls、first_value_respect_nulls、anyLast_respect_nulls、last_value_respect_nulls) 产生错误结果的问题。该优化不再将此类函数的 f(if(cond, x, NULL)) 重写为 -If 形式。#107430 (groeneai).
  • 添加对 ORC 输入中格式错误边界的验证。#107580 (al13n321).
  • 修复 MySQL 协议端口上无需身份验证即可触发内存耗尽的拒绝服务漏洞。#107599 (tiandiwonder).
  • 修复 MySQL 接口无法与 MySQL Connector/J 8.2.0 及更高版本 (包括 9.x) 配合使用的问题。OK 数据包的 info 字段现在采用长度编码,与 MySQL 服务器保持一致,因此 JDBC 驱动可以连接。#107693 (alexey-milovidov).
  • 修复 Block structure mismatch in UnionStep stream 逻辑错误 (调试/sanitizer 构建中服务器会中止,发布构建中显示 Code: 49) 。当 UNION/INTERSECT/EXCEPT 的同级分支仅 WHERE 谓词不同,且其中一个分支的谓词经常量折叠后变为 Const 列时,会发生此错误。#107719 (groeneai).
  • 读取由 Apache Arrow Java 19.0.0 之前版本 (包括 Apache Spark) 生成的、含有空 String 或 Binary 列的 Arrow 和 ArrowStream 数据时,不再抛出 INCORRECT_DATA。#107764 (Algunenano).
  • 现在会安全地拒绝判别值引用不存在 Variant 的格式错误 Native 块。#107991 (uwezkhan).
  • 修复多线程读取 Dynamic 列时的性能回归问题。#107997 (Avogar).
  • 已弃用的数据湖设置 storage_catalog_url 现在会被 catalog guard 正确拒绝 (此前仅检查 storage_catalog_type 和 storage_aws_access_key_id) ,错误消息也会列出所有已弃用设置。#108040 (alexey-milovidov).
  • 修复 ArrowFlight 表函数/引擎在命名集合省略可选 dataset 键时拒绝该集合并报出 No such key 'dataset' 错误的问题。#108041 (alexey-milovidov).
  • 现在会在 system.query_views_log.view_query 中对 secret 和凭据进行脱敏,而不再将其暴露在记录的视图 SQL 中。 #108214 (Fidelaggio).
  • 修复 type_json_allow_duplicated_key_with_literal_and_nested_object 无法与 JSON 中的类型化路径配合使用的问题。 #108218 (Avogar).
  • 修复当输入字符串大于 32768 字节且无法检测到字符集时,detectCharset 和 detectLanguageUnknown 函数中的未定义行为 (向 memcpy 传入空指针) 。 #108250 (groeneai).
  • 修复在 WHERE 子句中结合使用 _part_starting_offset/_part_offset 虚拟列和延迟物化的查询出现 NOT_FOUND_COLUMN_IN_BLOCK 错误的问题。 #108287 (vdimir).
  • 当禁用 format_display_secrets_in_show_and_select (默认值) 时,在 EXPLAIN actions、EXPLAIN header 和 EXPLAIN PIPELINE 的输出中隐藏 encrypt、decrypt 和 HMAC 等函数的 secret 参数。 #108386 (Algunenano).
  • 当可刷新materialized view 的 TO 目标已归同一视图所有时,CREATE OR REPLACE 现在可以成功执行。仍会拒绝归其他视图所有的目标。 #108392 (evillique).
  • 将 catboostEvaluate 的模型路径限制在 user_files 目录内,与 file() 和字典源一致。此前,该函数可接受任意 filesystem 路径且不进行边界检查,因此可探测 user_files 外文件是否存在并触发读取。现在模型必须位于 user_files 内。 #108463 (groeneai).
  • 修复 CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE 导致新视图未订阅源表的问题;该问题会静默丢弃替换后插入的所有行。 #108728 (alexey-milovidov).
  • 修复在使用 GROUPING SETS、ROLLUP 或 CUBE 且 max_threads > 1 时,合并 uniqExact 聚合状态导致的段错误。 #108928 (Algunenano).
  • 修复提升兼容性设置期间可能出现的逻辑错误 “列 … 出现异常子流 …”。 #109496 (Avogar).
  • 根据 RFC 9110,getClientHTTPHeader 函数现在将请求头名称视为不区分大小写;尤其是,无论大小写如何,都会过滤掉 authorization 请求头。 #109791 (Felixoid).
  • 修复异步插入和去重 (async_insert=1、async_insert_deduplicate=1) 可能导致的静默数据丢失。当具有不同 insert_deduplication_token 值的多个异步插入条目合并为一次写入不相交分区的刷写操作时,每个标记都会登记到该次刷写涉及的每个分区的去重日志中,而非仅登记到其对应行实际写入的分区。之后,若在该标记从未写入过的分区中复用该标记进行插入,数据便会被静默去重。现在,标记仅会登记到其对应行实际写入的分区中。 #111049 (groeneai).
  • 修复了异步 Native 格式插入问题:ALTER ... MODIFY COLUMN 后变得不兼容的单个缓冲条目不再导致整个批次失败。#111108 (Felixoid).
  • 修复了使用其他类型的对象对字典执行 CREATE OR REPLACE 时的问题:替换操作提交后会因 CANNOT_DETACH_DICTIONARY_AS_TABLE 失败,并遗留孤立的 _tmp_replace_* 表。#111142 (evillique).
  • 修复了启用证书验证时 TLS 握手过程中对等方证书的内存泄漏问题。#111425 (thevar1able).
  • 修复了逻辑错误 Block structure mismatch in IntersectOrExceptStep stream: different number of columns:当过滤器拆分优化 (query_plan_split_filter) 应用于过滤器列名同时也是输入列名的 WHERE 条件时,可能发生此错误。该优化会在分支输出头中遗留内部列 __split_filter,导致其与 INTERSECT 或 UNION 等集合操作中的同级分支不一致。#111930 (groeneai).
  • 修复了在夏令时时区中,对 Time、Time64 或 DateTime 值使用 toString 的过滤器或 ORDER BY 表达式产生错误结果的问题。同时恢复了对表排序键前缀执行 ORDER BY 以及从 String 转换为 Nullable(String) 时的按序读取优化。#113291 (vdimir).
  • 修复了当 kafka_num_consumers 超出根据 CPU 核心数计算的限制时,无法 ATTACH Kafka 表的问题。#113390 (evillique).
  • 在使用 projections 时禁用了分布式索引分析,以防止返回错误的查询结果。#115132 (azat).
  • 修复了函数 formatRowNoNewline 中的一个错误:将行格式化为空结果时,可能产生错误结果或逻辑错误。#115669 (alexey-milovidov).
  • 对于长度不是 8 的倍数的二进制字符串字面量,以及无主体的压缩块经 LZ4 解压缩后的结果,不再返回未初始化的内存。#115704 (alexey-milovidov).
  • 在去重哈希中纳入对象路径,以防止不同对象值被错误地去重。#115866 (Felixoid).
最后修改于 2026年9月26日