向后不兼容的变更
查询与语法变更
- 窗口函数
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_blocksID。#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表函数现已支持 PromQLhistogram_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_searchMergeTree设置。#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_prefixHTTP 处理器配置元素,用于匹配具有给定前缀的所有路径;同时新增明确的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 功能
- 新增实验性的
dphypINNER 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_hashJOIN 算法,在不同的等值键之间并行构建。此前,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,提升了非UInt64groupBitmap状态下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编码的 ParquetFLOAT和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错误。现在会在查询计划序列化期间保留ActionsDAGINPUT节点的常量列。#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/arrayAlllambda 表达式。由于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。默认情况下 (启用) ,PostgreSQLdate/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会将其视为不可重试错误 (不同于临时ReplicatedMergeTreeZooKeeper 连接中断时出现的暂时性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_hashDDL 语法一致。#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 错误、HTTP5xx/408/429) 时,以指数退避方式重试 Confluent Schema Registry HTTP 客户端,而不再在首次网络波动时中止 INSERT。新增设置format_avro_schema_registry_max_retries(默认值5) 和format_avro_schema_registry_retry_initial_backoff_ms(默认值100) 用于控制重试策略。schema 验证错误 (HTTP409、格式错误的 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 的 PostgreSQLnumeric(p, 0)列 (例如用于 256 位整数的numeric(78, 0)) 映射为 ClickHouseInt256,不再因 “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 或外部ONJOIN 之下时出现的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引擎表执行ANYJOIN 时的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及其NullableVariant) 时返回错误结果的问题。此类 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定义中使用WASMSQL 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设置时,MergeTreeparts 选择错误压缩编解码器的问题。插入、合并和投影期间写入的 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和CoalescingMergeTreecolumns_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 生成的MergeTreepart 时,可能出现的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 matchlogical 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 … betweenConvertingTransformandRemovingReplicatedColumnsTransform”) :当其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). - 修复了读取物理类型比声明精度所映射类型更宽的
ParquetDECIMAL列时发生的越界写入问题,例如物理类型为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 参数,使每个索引的KeyConditionRPN 与模板的 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). - 修复
Icebergv2 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). - 修复了包含表的
IcebergREST 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). - 修复了在并发替换文件时列出本地磁盘对象存储目录 (例如
localdisk 上的 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/AzureQueueordered 模式:现在会在流式处理期间刷新存储桶锁,以确保生存时间 (TTL) 清理 (persistent_processing_node_ttl_seconds) 不会移除仍在运行的处理器持有的锁。即使锁所有权仍然丢失,系统也会检测并报告该问题 (逻辑错误及ObjectStorageQueueBucketLockLostOwnershipprofile 事件) ,流式处理随后会通过新的文件迭代器恢复。#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 实体≫⃒或≪⃒的字符串时发生的堆缓冲区溢出 (服务器崩溃) 问题。任何拥有一次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 CLUSTERDDL。 #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权限,这与Remoteengine 的现有要求一致。从 DDL queue 重放的CREATE(ON CLUSTER,或Replicated数据库中的CREATE) 不受此修复覆盖。 #113220 (groeneai). - 修复了以下问题:未指定列列表的
CREATE TABLE ... ENGINE = Buffer(...)可能泄露创建用户无权查看的目标表结构。对于由本地服务器自行执行的CREATE,现在会在用户自身的上下文中推断结构,因此需要具备目标端的SHOW COLUMNS权限,与Merge和Remote的要求相同。从 DDL 队列重放的CREATE(ON CLUSTER或在Replicateddatabase 中) 不受此修复影响。 #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). - 修复主体为关联子查询的
MATERIALIZEDCTE 用作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). - 拒绝会导致目录列举无限递归的异常
fileglob 模式。现在最大递归深度限制为 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/J8.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 核心数计算的限制时,无法ATTACHKafka表的问题。#113390 (evillique). - 在使用 projections 时禁用了分布式索引分析,以防止返回错误的查询结果。#115132 (azat).
- 修复了函数
formatRowNoNewline中的一个错误:将行格式化为空结果时,可能产生错误结果或逻辑错误。#115669 (alexey-milovidov). - 对于长度不是 8 的倍数的二进制字符串字面量,以及无主体的压缩块经 LZ4 解压缩后的结果,不再返回未初始化的内存。#115704 (alexey-milovidov).
- 在去重哈希中纳入对象路径,以防止不同对象值被错误地去重。#115866 (Felixoid).