跳转到主要内容

向后不兼容的变更

查询和语法变更

  • 修复了因错误的别名替换导致的查询格式不一致问题。注意:当 analyzer 被禁用时,某些在 IN 中使用别名引用的 CREATE VIEW 查询可能无法再被处理。为避免这种情况,请确保启用 analyzer (自 24.3 起默认已启用) 。#82838 (Alexey Milovidov).
  • JOIN USING () 中的空列列表现在会被视为语法错误。此前,这类问题会在查询执行时报告为 INVALID_JOIN_ON_EXPRESSION,并且在某些情况下 (例如与 Join 存储连接时) 还可能导致 LOGICAL_ERROR#92371 (Vladimir Cherkasov).
  • ORDER BY 和其他表键表达式中不再允许使用子查询。#96847 (Alexey Milovidov).

数据类型变更

  • 新增了对 Nullable(Tuple) 的支持。要启用该功能,请设置 allow_experimental_nullable_tuple_type = 1#89643 (Nihal Z. Miaji) 。
  • JSON type 的高级 shared data 现已默认启用。由于旧版本无法读取以新 JSON format 写入的数据分区片段,因此将无法降级到 25.8 之前的版本。为确保升级安全,请将 compatibility setting 设为上一版本,或将 MergeTree settings dynamic_serialization_version='v2'object_serialization_version='v2' 设置为相应值。#92511 (Pavel Kruglov) 。
  • JSON type 中的 SKIP REGEXP 现在默认采用部分匹配。#92847 (Pavel Kruglov) 。
  • 修复了 Variant 类型不匹配时出现的逻辑错误。#95811 (Bharat Nallan) 。
  • 来自 PostgreSQL 的 DATE 列现在会在 ClickHouse 中推断为 Date32 (此前会被推断为 Date,对于超出其较小取值范围的值,可能会导致溢出) 。现在也支持将 Date32 值插回 PostgreSQL。#95999 (Alexey Milovidov) 。

存储和索引变更

  • 改进了倒排文本索引的存储布局,可更高效地从对象存储中读取数据,同时还提升了带有倒排文本索引的表的合并性能。如果你在 25.12 之前使用过 Experimental 文本索引,则必须在升级前删除该索引,并在新版本中重新构建。#91518 (Anton Popov).
  • 统计信息的存储格式已更改——现在所有统计信息都存储在单个文件中。#93414 (Anton Popov).
  • 现在会对索引文件名进行转义,以避免 parts 损坏。对于由先前版本创建且名称中包含非 ASCII 字符的索引,ClickHouse 将无法加载。要处理此问题,请使用 MergeTree 设置 escape_index_filenames#94079 (Raúl Marín).

已移除的功能

  • DEFLATE_QPLZSTD_QAT 编解码器已移除。升级前,请先将所有使用这些编解码器压缩的现有数据转换为其他编解码器。请注意,此前使用这些编解码器需要启用 enable_deflate_qpl_codecenable_zstd_qat_codec#92150 (Robert Schulze) 。
  • 不再支持向简单 ALIAS 列执行 INSERT (撤销了 #84154) 。该功能无法与自定义格式配合使用,也没有相应的设置项进行控制。#92849 (Azat Khuzhin) 。
  • Lazy 数据库引擎已移除,不再可用。#93627 (Alexey Milovidov) 。
  • 由于存在使其无法使用的缺陷,metric_logtransposed_with_wide_view 模式已被移除。现在已无法再使用此模式定义 system.metric_log#93867 (Alexey Milovidov) 。

设置和配置变更

  • 新增了一项设置:如果数据湖 catalog 无法访问对象存储,则会报错。#93606 (Konstantin Vedernikov).
  • 工作负载的 CPU 调度现在默认采用抢占式。请参见服务器设置 cpu_slot_preemption#94060 (Sergei Trifonov).
  • 设置 exact_rows_before_limitrows_before_aggregationcross_to_inner_join_rewriteregexp_dict_allow_hyperscanregexp_dict_flag_case_insensitiveregexp_dict_flag_dotalldictionary_use_async_executor 现已从 format settings 重新归类为常规设置。这主要是内部变更,通常不会带来用户可见的副作用;但如果你曾在 Iceberg、DeltaLake、Kafka、S3、S3Queue、Azure、Hive、RabbitMQ、Set、FileLog 或 NATS 表引擎定义中指定了其中任意一项,现在这类定义将报错,而不再是被静默忽略。#94106 (Robert Schulze).
  • do_not_merge_across_partitions_select_final 的语义已简化。此前,即使未显式设置,该功能也可能被自动启用,从而造成困惑并引发生产环境问题。现在:将其设为 1 会无条件启用该功能;将其设为 0 则会交由新设置 enable_automatic_decision_for_merging_across_partitions_for_final (默认值为 1) 决定。#96110 (Nikita Taranov).
  • 新增了 S3 schema 验证。#96194 (Konstantin Vedernikov).
  • 设置 apply_row_policy_after_final 现已默认启用,以确保 ROW POLICY 像最初一样遵循 FINAL。如果你之前依赖 optimize_move_to_prewhere_if_final=1FINAL 之前应用行策略,请改用 apply_row_policy_after_final=0#97279 (Nikolai Kochetov).

安全和访问控制变更

  • joinGet/joinGetOrNull 现在会对底层 Join 表强制检查 SELECT 特权。执行 joinGet('db.table', 'column', key) 时,需要同时对键列和要获取的 attribute 列具有 SELECT 特权。缺少这些特权的查询将因 ACCESS_DENIED 而失败。要适配这一变更,可使用 GRANT SELECT ON db.join_table TO user 授予整表访问权限,或使用 GRANT SELECT(key_col, attr_col) ON db.join_table TO user 授予列级访问权限。 #94307 (Vladimir Cherkasov).
  • CREATE TABLE ... AS ... 查询现在需要 SHOW COLUMNS 特权,而不再是此前被错误检查的 SHOW TABLES#94556 (pufit).

插入与去重变更

  • 现在,所有插入操作默认都会启用去重。此前,异步插入和 materialized view 默认不启用去重,而同步插入默认启用。若要保留旧行为,请显式设置 deduplicate_insert='backward_compatible_choice' (deduplicate_blocks_in_dependent_materialized_views 同样如此) 。#95970 (Sema Checherinda) 。

系统表变更

  • S3Queue 和 AzureQueue 的内存元数据现已受到限制。系统表已重命名:system.s3queue 现为 system.s3queue_metadata_cachesystem.azure_queue 现为 system.azure_queue_metadata_cache#95809 (Kseniia Sumarokova) 。

其他重大变更

  • 修复了 H3 索引 函数在使用无效输入调用时可能发生崩溃或卡死的问题。#93657 (Michael Kolupaev) 。

新功能

身份验证

函数

系统表

  • 新增了 system.user_defined_functions 表,用于监控 UDF 的加载状态和配置。#90340 (Xu Jia).
  • 新增了 system.zookeeper_info 表。#90809 (Smita Kulkarni).
  • 新增了 system.primes 表以及包含按升序排列的质数的 primes 表函数。#92776 (Nihal Z. Miaji).
  • system.parts 中新增了 files 列,用于显示每个数据分区片段中的文件数量。#94337 (Match).
  • 新增了 system.fail_points 表,用于查看现有 failpoint 及其是否已启用。#96762 (Pedro Ferreira).

表引擎和存储

  • Array 列新增了文本索引支持。#89895 (Jimmy Aguilar Mena).
  • 新增了对 Paimon REST catalog 的支持。#92011 (JIaQi Tang).
  • 新增了 icebergLocalCluster 表函数。#93323 (Anton Ivashkin).
  • 新增了 lazy_load_tables 数据库设置。启用后,数据库启动时不会加载表,而是先创建一个轻量级的 StorageTableProxy,并在首次访问时再 materialize 真正的表引擎。#96283 (xiaohuanlin).
  • DatabaseReplicated 新增了 auxiliary ZooKeeper 支持。#91683 (RinChanNOW).
  • 缓存中的数据文件和系统文件现在可以拆分为独立的分段。#87834 (MikhailBurdukov).
  • 新增了一个用于 Parquet 元数据的 SLRU 缓存,可通过避免重复下载文件来提升读取性能。可使用 SYSTEM DROP PARQUET METADATA CACHE 清除此缓存。#89750 (Grant Holly).
  • 数据湖表现已在 Parquet reader v3 中支持 PREWHERE 和多阶段 PREWHERE#93542 (Konstantin Vedernikov).
  • 新增了跨多个副本的分布式索引分析功能,对共享存储和大数据量场景尤为有益。#86786 (Azat Khuzhin).

插入与去重

  • 异步插入去重现已支持依赖的 materialized view。当发生 block_id 冲突时,会先过滤原始块,移除与冲突 block_id 关联的行,然后将剩余行通过所有相关的 materialized view 查询进行转换。#89140 (Sema Checherinda).
  • 异步插入现已支持并行 quorum——插入的数据会复制到 quorum 所需的副本数;如果发现重复项,查询会等待此前插入的数据也完成复制。#93356 (Sema Checherinda).
  • 新增 insert_deduplication_version 服务器设置,用于启用向统一去重哈希的迁移。#95409 (Sema Checherinda).
  • 已开始迁移去重哈希。#97562 (Sema Checherinda).

SQL 和查询功能

  • 新增 SYSTEM CLEAR [...] CACHE 语法,作为现有 SYSTEM DROP [...] CACHE 的更清晰替代方案。旧语法仍然可用。#93727 (Pranav Tiwari) 。
  • 新增 OPTIMIZE <table> DRY RUN PARTS <part names> 查询,可在不提交结果分片的情况下模拟合并操作。适用于验证合并正确性、复现与合并相关的 bug,以及对合并性能进行基准测试。#96122 (Anton Popov) 。
  • 现在,当启用 ignore_on_cluster_for_replicated_database 设置时,可对 Replicated 数据库执行带有 ON CLUSTER 的 DDL 查询。集群名称将被忽略。#92872 (Kirill) 。
  • 引入了新的语法和框架,以简化并扩展投影索引功能。#91844 (Amos Bird) 。

设置与配置

  • 新增 max_insert_block_size_bytes 设置,以更精细地控制插入时块的形成。 #92833 (Kirill Kopnev).
  • 新增 use_primary_key 设置。将其设为 false 可禁用基于主键的粒度剪枝。 #93319 (Nihal Z. Miaji).
  • 新增 default_dictionary_database 设置,允许 ClickHouse 在指定的默认数据库中解析未显式指定数据库的外部字典引用。这简化了从 XML 定义的全局字典迁移到 SQL 定义的按数据库划分字典的过程。 #91412 (Dmitrii Plotnikov).
  • 新增 check_named_collection_dependencies 设置 (默认启用) ,用于防止删除被表使用的命名集合。 #96181 (Pablo Marcos).
  • 新增一种用于并发控制的 max-min 公平调度器,在大量查询竞争有限 CPU 插槽的高过载场景下可提供更好的公平性。concurrent_threads_scheduler 服务器设置 现在默认使用 max_min_fair,而不是 fair_round_robin,因此短时运行的查询不再受长时运行查询的拖累。 #94732 #95300 (Sergei Trifonov).
  • 新增 logger.startup_console_levellogger.shutdown_console_level 配置选项,分别用于在 ClickHouse 启动和关闭期间覆盖控制台日志级别。 #95919 (Garrett Thomas).

监控

  • 在 Prometheus 的 /metrics 端点新增了 ClickHouse_Info 指标,包含版本信息,因此可以构建图表来跟踪详细版本信息随时间的变化。#91125 (Christoph Wurm).

Experimental 功能

  • 向量搜索现在可以将负载分散到集群中的各个副本上,从而支持超过单台 VM 内存容量的大型向量索引。#95876 (Shankar Iyer) 。
  • 新增了一个由 ast_fuzzer_runsast_fuzzer_any_query 设置控制的服务器端 AST fuzzer。启用后,服务器会在每个查询正常执行完毕后,再运行其随机变体并丢弃结果。#97568 (Alexey Milovidov) 。

改进

查询与 SQL

  • 关联子查询现已支持更多表引擎和数据源类型。#90175 (Dmitry Novik) 。
  • 现在已支持用于标量的非常量 IN (例如:val1 NOT IN if(cond, val2, val3)) 。#93495 (Yarik Briukhovetskyi) 。
  • 新增了对 JOIN 扩展表别名的支持 (例如 SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b) 。#95331 (Yarik Briukhovetskyi) 。
  • 现已支持将 EXPLAIN indices = 1 作为 EXPLAIN indexes = 1 的别名。#92774 (Pranav Tiwari) 。
  • 改进了 numbersprimes 表函数的过滤器下推 —— ClickHouse 现在可根据 WHERE 条件推导出保守的值边界,从而限制序列生成,避免无界扫描。#96115 (Nihal Z. Miaji) 。
  • 等价集合优化现已支持跨多个连续的 INNER JOIN 操作,因此在这条连接链中应用于任意表的过滤器都会自动下推到所有相关表。#96596 (Vladimir Cherkasov) 。
  • 现在,对于 FROM 中的单个子查询,会自动使用 cluster 表函数。#96332 (phulv94).
  • 现在,如果前缀仅包含 ASCII 字符,在使用 startsWithUTF8 进行过滤时就会使用主键索引。#97055 (vkcku).
  • assumeNotNullcoalesceifNull 现在支持在键列被这些函数包装时,对范围谓词进行主键和跳过索引裁剪。#94754 (Nihal Z. Miaji).
  • 现在,从 MergeTree 读取数据时,也会在读取阶段移除未使用的列,这在将过滤器下推至 PREWHERE 时尤其有用。#89982 (János Benjamin Antal).
  • use_join_disjunctions_push_down 优化现已默认启用。#89313 (Alexey Milovidov) 。
  • enable_join_runtime_filters 优化现已默认启用。#89314 (Alexey Milovidov) 。
  • JOIN 运行时过滤器的开销现已降低:当 bloom filter 中被置位的位过多,或实际过滤掉的行数过少时,系统会自动禁用过滤器。#91578 (Alexander Gololobov).
  • 新增了 use_hash_table_stats_for_join_reordering 设置 (默认启用) ,用于控制是否使用运行时哈希表大小统计信息进行 join 重排序。#93912 (Vladimir Cherkasov) 。
  • 现在,无论查询是在本地执行还是借助并行副本执行,索引分析都只需进行一次。#94854 (Nikita Taranov) 。
  • 如果 FINAL 查询中的某个跳过索引针对主键中的某一列,则现在会跳过对其他 parts 的额外主键相交检查。#93899 (Shankar Iyer) 。
  • DROP DATABASE 现在会按依赖关系的逆序删除表,从而在数据库包含具有加载依赖关系的表时提升崩溃安全性。#97057 (Alexey Milovidov).
  • 现在,同步等待变更时会遵循查询取消和时间限制。#96756 (Alexey Milovidov).
  • 防止在 DROP COLUMN 变更后紧接着执行 ADD COLUMN 时,已删除的数据重新出现。#96713 (Alexey Milovidov) 。
  • 涉及 UPDATERENAME COLUMN 的冲突 ALTER 表达式现在会抛出正确的异常,而不再是逻辑错误。#96022 (Alexey Milovidov).
  • 现已为聚合键列收集预估总行数和 NDV (不同值数量) 统计信息。#92812 (Alexander Gololobov) 。
  • 现在,在并行副本读取期间,所有副本都可以并行接管无主范围,从而改进负载均衡并降低长尾延迟。 #91374 (zoomxi).
  • 提升了在高选择性 PREWHERE 过滤器条件下自动并行副本的估算准确度。#97231 (Nikita Taranov) 。
  • joinGet 现已支持临时表。#92973 (Eduard Karacharov) 。
  • 外部聚合、排序和 join 现在会在所有上下文中遵循 temporary_files_codec 查询设置。#92388 (Vladimir Cherkasov) 。
  • 向量相似度搜索的执行计划优化现在仅在搜索列存在索引时才会应用。#94998 (Eduard Karacharov) 。

表引擎和存储

  • StorageEmbeddedRocksDB 现在支持使用多列作为主键。#33917 (usurai).
  • 新增 ALTER TABLE <table> ATTACH PART <part_name> FROM <directory_name> 语法,无需手动重命名文件系统中的目录,即可从 detached/ 下任意子目录附加 parts (例如带有 broken-on-startunexpected 前缀的 parts) 。#74816 (Anton Popov).
  • min_free_disk_bytes_to_perform_insert 现在可在 JBOD 卷上正确运行。#90878 (Aleksandr Musorin).
  • max_parts_to_merge_at_once 现在会在生存时间 (TTL) drop-part 合并期间生效。#95315 (Kseniia Sumarokova).
  • 后台操作 (mutate、merge) 现在可以通过 background profile 独立配置,而不再通过 default profile 与常规查询共享设置。#93905 (Arsen Muk).
  • 改进了 subcolumn 读取,能够正确计算大小,从而降低内存使用并提升速度。#96251 (Pavel Kruglov).
  • 现在限制了 split_intersecting_parts_ranges_into_layers 生成的管道流数量,以避免过度占用内存。#96478 (Nikita Taranov).
  • 文本索引 现已 GA。#96794 (Robert Schulze).
  • QBit 现已 GA。#95358 (Raufs Dunamalijevs).
  • QBit 现在支持相等性比较。#94078 (Raufs Dunamalijevs).
  • 使用 enable_positional_arguments_for_projections 保存表 schema 时,现在会替换为 expression 而不是位置 argument,因此即使禁用该设置,服务器也能重启。#96372 (Alexey Milovidov).
  • 在 Replicated 数据库中,缓存的 cluster 不再因每个 dummy 查询而更新。#96897 (Tuan Pham Anh).
  • 新增 SYSTEM RESET DDL WORKER [ON CLUSTER] 查询,用于重置 DDLWorker 状态,在 host ID 更新时可用于刷新副本活动状态。#93780 (Tuan Pham Anh).

数据湖

S3Queue

S3 和对象存储

  • S3 x-amz-server-side-encryption 请求头不再传递到 HeadObjectUploadPartCompleteMultipartUpload 请求中。#64577 (Francisco J. Jurado Moreno).
  • 现在可以在命名集合中为 S3 表引擎和 s3 表函数指定 storage_class_name#91926 (János Benjamin Antal).
  • 修复了在使用实例配置文件凭证运行大量并发 S3 查询时,EC2 元数据端点被限流的问题——现在会缓存凭证提供器,并在所有查询之间共享。#92891 (Sav).
  • 为 AWS S3 C++ SDK 增加了对 MinIO 的兼容性支持,并添加了 MinIO 特有错误的错误码映射,从而提升了自托管 MinIO 集群的可靠性。#93082 (XiaoBinMu).
  • 改进了 S3 身份验证错误消息,并增加了检查凭证的提示。#95648 (Gerald Latkovic).
  • Azure Blob 存储现在会在原生复制因任意错误失败时回退为读写方式复制 (此前仅在 Unauthorized 时如此) 。#92888 (Smita Kulkarni).

函数

  • avg() 现在支持将 DateDateTimeTime 类型的值作为参数。#87845 (Yarik Briukhovetskyi).
  • mapContainsKeyLikemapContainsValueLike 现在可以利用 mapKeys()mapValues() 上的文本索引。#93049 (Michael Jarrett).
  • flipCoordinates 现在支持 Geometry 类型。#93303 (Bharat Nallan).
  • 已移除 hasAnyTokenshasAllTokens 函数的 64 标记限制。#95152 (Elmi Ahmadov).
  • 新增 distanceCosine 作为 cosineDistance 的别名,与其他距离函数保持一致。#96065 (Raufs Dunamalijevs).
  • 已将 iif 函数添加到 ClickHouse KQL 中。#94790 (happyso).
  • use_variant_as_common_type 现已默认启用,允许在 ArrayUNION 查询以及 if/multiIf/case 分支中使用不兼容的类型。#90677 (Alexey Milovidov).

设置与配置

  • use_skip_indexes_on_data_read 现已默认启用。#93407 (Shankar Iyer) 。
  • 新增了 add_minmax_index_for_time_columns 设置——启用后,会自动为所有 DateDate32TimeTime64DateTimeDateTime64 列创建 MinMax 索引。#93355 (Michael Jarrett) 。
  • 新增了 materialize_statistics_on_merge 设置 (默认启用) ,用于控制在合并期间是否将统计信息物化。#93379 (Han Fei) 。
  • 新增了 input_format_binary_max_type_complexity 设置,用于限制在二进制格式中可解码的类型节点总数,以防止恶意载荷。#92519 (Raufs Dunamalijevs) 。
  • 添加了 trace_profile_events_list 设置,用于将 trace_profile_event 的 tracing 限定为特定的事件名称。#92298 (Alexey Milovidov) 。
  • 新增了 type_json_allow_duplicated_key_with_literal_and_nested_object 设置,允许 JSON 中存在重复路径,其中一个是字面量,另一个是嵌套对象,以便与在强制执行路径去重之前创建的数据保持向后兼容。#93604 (Pavel Kruglov) 。
  • 新增了 MergeTree 设置 merge_max_dynamic_subcolumns_in_compact_part 和查询级设置 max_dynamic_subcolumns_in_json_type_parsing,用于限制在合并和解析期间 JSON 列中的动态子列数量。#94184 (Pavel Kruglov).
  • 新增 use_statistics 作为 allow_statistics_optimize 的别名,与 use_primary_keyuse_skip_indexes 一致。#94366 (Robert Schulze) 。
  • 启用 input_format_numbers_enum_on_conversion_error,用于在将数值转换为枚举时检查元素是否存在。#94384 (Elmi Ahmadov).
  • 新增了一个设置:当某个表存在行策略,但没有任何策略适用于当前用户时,将抛出异常,以便发现潜在的配置错误。#95014 (Vitaly Baranov).
  • 对于 26.2 及更高兼容版本,enable_max_bytes_limit_for_min_age_to_force_merge 现已默认启用。#95917 (Christoph Wurm).
  • core_dump.size_limit 现已支持热重载,无需重启服务器。#96524 (Miсhael Stetsyuk) 。
  • 重新加载配置时,现在会正确应用命令行覆盖参数。#80295 (Alexey Milovidov) 。
  • 为服务器日志增加了复合轮转策略 (大小 + 时间) 。#87620 (Jianmei Zhang) 。
  • 现在可以根据 part 数量 (distributed_index_analysis_min_parts_to_activate) 和索引大小 (distributed_index_analysis_min_indexes_size_to_activate) 来启用分布式索引分析。#95216 (Azat Khuzhin) 。
  • 统计信息缓存现已默认启用,更新间隔为 300 秒。#95841 (Han Fei) 。
  • 现在,path configuration parameter 会在启动时按相对于工作目录的方式解析,从而避免将数据目录放置在异常位置。#96305 (Alexey Milovidov).

系统表与监控

  • system.mutations 中新增 parts_postpone_reasons 列,以提升诊断能力。#92206 (Shaohua Wang).
  • system.data_skipping_indices 中新增 creation (implicit/explicit) 列。#92378 (Raúl Marín).
  • 运行中的任务现已反映在 system.background_schedule_pool 及其对应的日志表中。#92587 (Azat Khuzhin).
  • 新增 QueryNonInternal 指标,用于跟踪正在执行的非内部查询数量,帮助监控相对于 max_concurrent_queries 限制的并发情况。#94284 (Ashwath Singh).
  • 新增异步指标,用于记录运行时间最长的 merge 的耗时。#94825 (Raúl Marín).
  • query_log 中新增 connection_addressconnection_port,以反映实际物理连接 (在通过 proxy 连接时特别有用) 。#95471 (Yakov Olkhovskiy).
  • system.crash_log 增加了更多信息。#94112 (Miсhael Stetsyuk).
  • system.aggregated_zookeeper_log 新增 component 名称。#95882 (Antonio Andelic).
  • 新增 system.tokenizers 表,展示所有可用的分词器。#96753 (Robert Schulze).
  • 新增 system.jemalloc_stats 表和 /jemalloc.html HTTP 端点,用于交互式可视化 jemalloc 内存分配器的统计信息。#97077 (Antonio Andelic).
  • 新增 system.jemalloc_profile_text 表,用于读取和分析 jemalloc 堆内存剖析,并支持 raw、symbolized 和 collapsed 输出格式。#97218 (Antonio Andelic).
  • MUTATE_PARTMUTATE_PART_START 事件向 system.part_log 新增 mutation_ids#93811 (Shaohua Wang).
  • 嵌套的全局 server settings (例如 logger.level) 现在可在 system.server_settings 中部分看到。#94001 (Hechem Selmi).
  • view_duration_ms 现在显示的是 group 处于活跃状态的时间,而不是各线程耗时之和。#94966 (Sema Checherinda).
  • system.blob_storage_log 现已可用于 Azure Blob 存储、Local 和 HDFS。新增 error_code 列。#93105 (Alexey Milovidov).
  • 耗时高于平均水平的后台任务现在会按可配置阈值记录到日志中 (background_schedule_pool_log.duration_threshold_milliseconds,默认值为 30ms) 。#92965 (Azat Khuzhin).
  • URL 存储中的密码不再显示在查询日志中。#93245 (Konstantin Vedernikov).

ClickHouse Keeper

  • 如果日志位于最后一个已提交索引之前,现可正确处理 Keeper 日志条目中的空缺。#90403 (Antonio Andelic).
  • 为 Keeper 请求添加了 OpenTelemetry 链路追踪支持。#91332 (Miсhael Stetsyuk).
  • 新增 Keeper 指标:KeeperChangelogWrittenBytesKeeperChangelogFileSyncMicrosecondsKeeperSnapshotWrittenBytesKeeperSnapshotFileSyncMicrosecondsKeeperBatchSizeElementsKeeperBatchSizeBytes#92149 (Miсhael Stetsyuk).
  • CHECK_STATTRY_REMOVE Keeper 扩展现已默认启用。#93886 (Mikhail Artemenko).
  • Keeper 现在在检测到损坏的快照或不一致的更新日志时,会抛出异常而不是直接中止,从而通过要求手动干预来实现更安全的恢复。#94168 (Antonio Andelic).
  • getChildren Keeper 请求添加了 with_datawith_stat 扩展,允许在一次操作中拉取子节点及其数据和统计信息。#94826 (Nikolay Degterinsky).
  • 增加了对 Keeper 配置错误的检查,此类错误可能导致集群组建失败。#94682 (Konstantin Bogdanov).
  • 新增了对 with_data Keeper 扩展的支持,以改进 Database Replicated 中的表拉取。#96090 (Nikolay Degterinsky).
  • 现在可以通过 system.zookeeper 向辅助 ZooKeeper 写入数据。#92092 (RinChanNOW).

内存管理

  • 优化了文件系统缓存空间预留——现在收集淘汰候选项时无需持有独占锁。#82764 (Kseniia Sumarokova) 。
  • 为远程表引擎/函数的文件系统缓存读取缓冲区启用了并行读取。#71781 (Kseniia Sumarokova) 。
  • 通过启用 jemalloc 脏页的即时清理,降低了非 Linux 系统上的内存占用。#93360 (Eduard Karacharov) 。
  • jemalloc 脏页清理现在会在独立于主 MemoryWorker 线程的单独线程中运行。新增了 memory_worker_purge_total_memory_threshold_ratio config,用于根据总内存使用比例执行清理。#94902 (Antonio Andelic) 。
  • 当 ClickHouse 持续处于内存压力下时,现在会动态禁用 jemalloc 脏页衰减。#95145 (Antonio Andelic) 。
  • 在从 MergeTree 读取数据前增加了显式的内存消耗检查,并基于生产环境经验调低了线程池队列大小。#94692 (Nikita Mikhaylov) 。
  • 现在会在用户身份验证前检查总内存限制;如果超出限制,则抛出 memory limit exceeded#95003 (Nikolai Kochetov) 。
  • 修复了查询 conditions 缓存的内存统计错误问题。#95478 (Nikita Mikhaylov) 。
  • 提高了在聚合/排序过程中检测查询内存使用量以进行落盘的稳健性。#92500 (Azat Khuzhin) 。
  • 调度器现在会在 CPU 资源匮乏时优先调度 MemoryWorker 线程,以保护进程。#94864 (Nikita Mikhaylov) 。
  • 修复了 ClickHouse 在某些情况下从表读取时不遵守内存限制的问题。#93715 (Nikita Mikhaylov) 。

数据格式

  • Parquet reader 现在允许将 TupleMap 列读取为 JSON。#92864 (Michael Kolupaev).
  • Parquet reader 现在支持空元组。#92868 (Michael Kolupaev).
  • Date 类型现在在 Arrow/ArrowStream 格式中会被序列化为 Arrow 原生的 date32 类型 (此前为 uint16) 。旧行为可通过 output_format_arrow_date_as_uint16 设置恢复。#96860 (Alexey Milovidov).
  • Hash 输出格式现在不再受块大小影响。#94503 (Alexey Milovidov).
  • Pretty JSON 格式中的简单类型不再单独打印在不同的行上。#93836 (Pavel Kruglov).
  • schema 推断现在会遵循 allow_experimental_nullable_tuple_type——启用后,缺失的嵌套对象可以变为 NULL,而不是变成由 NULL 元素组成的元组。#95525 (Nihal Z. Miaji).
  • SQL 格式化器现在会在 AS SELECT 之前输出 COMMENT,而不是用括号将 SELECT 包裹起来。#96293 (Alexey Milovidov).
  • 使用 simdcomp 优化了倒排列表压缩。#92871 (Peng Jian).

备份与恢复

  • 新增 backup_data_from_refreshable_materialized_view_targets 备份设置,用于控制是否备份可刷新materialized view目标中的数据。采用 APPEND 刷新策略的 RMV 目标始终会被备份。#93658 (Julia Kartseva).
  • 为 S3 和 Azure Blob 存储中的 BACKUP/RESTORE 新增了对通过 SQL 定义的命名集合的支持。#94605 (Pablo Marcos).

命名集合和字典

去重

其他改进

  • 改进了 SYSTEM INSTRUMENT ADD/REMOVE 的使用体验:现在函数名使用字符串字面量,所有匹配的函数都会被修补,且 REMOVE 现已支持 function_name#93345 (Pablo Marcos).
  • 为可暂停的 failpoint 新增了 SYSTEM NOTIFY FAILPOINT,并为 PAUSE/RESUME 新增了 SYSTEM WAIT FAILPOINT#92368 (Shaohua Wang).
  • system.trace_logsystem.symbols 以及 demangle 函数中的 C++ 函数名现在都能正确显示。#93075 (Alexey Milovidov).
  • jemalloc profile 现在会连同符号信息一起写出,因此生成堆内存剖析时不再需要 binary。#93099 (Azat Khuzhin).
  • 修复了将表 Attach 到 MaterializedPostgreSQL database 时,如果 dropReplicationSlot 在栈展开期间 throw 会导致崩溃的问题。#96871 (Alexey Milovidov).
  • 修复了 CREATE TABLE 失败时可能留下残留内容的问题。#94174 (Azat Khuzhin).
  • 修复了使用受密码保护的 TLS key 时访问未初始化内存的问题。#94182 (Konstantin Bogdanov).
  • alter table ... modify setting ... 在获取锁时发生 timeout,现在会返回 timeout error,而不是 logical error。#93856 (Han Fei).
  • 改进了 CPU 和 real-time profiler 在套接字 timeout 场景下的互操作性。#96601 (Sergei Trifonov).
  • 为 release 构建启用了快速 libcxx 加固 (主要是越界检查) ,且没有明显的性能影响。#94757 (Miсhael Stetsyuk).

性能提升

JOIN 性能

  • 通过为 ColumnVector::replicate 实现动态分派,加快了部分哈希 JOIN 操作。 #79573 (Raúl Marín).
  • 现在可将更多过滤器下推到 JOIN 中。 #85556 (Nikita Taranov).
  • 扩展了基于 JOIN ON 条件的过滤器下推:当过滤器仅使用单侧输入时,适用于 ANYSEMIANTI JOIN。 #92584 (Dmitry Novik).
  • 现在可利用等价集为 SEMI JOIN 下推过滤器。 #92837 (Dmitry Novik).
  • ParallelHashJoin 中,对复杂谓词下未匹配行的处理已实现并行化,由 parallel_non_joined_rows_processing 设置控制 (默认启用) 。 #92068 (Yarik Briukhovetskyi).
  • 当右侧为空时,哈希 JOIN 现在会完全跳过读取左侧,从而避免因大量过滤或聚合造成的不必要开销。 #94062 (Alexander Gololobov).
  • RIGHT OUTER JOIN 现已支持 JOIN 运行时过滤器。 #96183 (Hechem Selmi).
  • PREWHERE optimization 现会推迟到 JOIN 运行时过滤器优化之后再执行,从而也能将运行时过滤器下推到 PREWHERE。 #95838 (Alexander Gololobov).

查询优化

  • 当分区键与排序键相同或为其前缀时,已禁用窗口函数的排序顺序优化,以提升并行执行性能。#87299 (Nikita Taranov).
  • 现在会将外层过滤器下推到视图中,使 PREWHERE 可同时应用于本地节点和远程节点。#88316 (Igor Nikonov).
  • 优化了带小数的 LIMITOFFSET 的性能和内存使用。#91167 (Ahmed Gouda).
  • 不再重复计算虚拟列上的常量过滤器。#91588 (c-end).
  • 主键中的任何确定性表达式 (例如 ORDER BY cityHash64(user_id)) 现在都可用于数据跳过。ClickHouse 会将该表达式应用于查询常量,并将结果用于通过 =INhas 进行主键索引查找。对于单射表达式,还支持其取反形式 (!=NOT INNOT has) 。#92952 (Nihal Z. Miaji).
  • 按序读取优化现在可以识别因 WHERE 条件而变为常量的 ORDER BY 列,从而实现高效的逆序读取。这让 WHERE tenant='42' ORDER BY tenant, event_time DESC 这类多租户查询也能从中受益。#94103 (matanper).
  • 对于先使用主键条件、再使用跳过索引的 FINAL 查询,PrimaryKeyExpand 步骤现在只会检查初步筛选出的主键范围。#94903 (Shankar Iyer).
  • 惰性物化优化现已应用于 UNION ALL 查询的所有分支,而不再仅限于第一个分支,从而减少了这类查询的 I/O;这类查询会组合来自不同 MergeTree 表的多次已排序且带限制的读取。#96832 (Federico Ginosa).

函数与聚合性能

  • JIT 编译现已覆盖更多函数。#88770 (Alexey Milovidov).
  • 优化了 distinctJSONPaths 聚合函数,现在只会从数据分区片段中读取 JSON 路径,而不是整个 JSON 列。#92196 (Pavel Kruglov).
  • 在相同元素经常连续出现的情况下,优化了 uniqExact#93268 (Alexey Milovidov).
  • 针对全 ASCII 的输入值优化了 isValidASCII#93347 (Robert Schulze).
  • 在可能的情况下,通过对插入操作进行批处理,加快了 uniq 在数值类型上的执行速度 (非 NULL、非 -If、无 GROUP BY、无 IPv6String) 。#95904 (Raúl Marín).

存储与 I/O 性能

  • 修复了 Parquet Reader V3 Prefetcher,使其采用更快的随机读取逻辑。#91435 (Arsen Muk).
  • 提升了 icebergCluster 的性能。#91537 (Yang Jiang).
  • 通过启用自适应写入缓冲区,降低了带有 Wide parts 的超宽表在 INSERT 和 merge 时的内存使用量。同时还为加密 disk 增加了自适应写入缓冲区支持。#92250 (Azat Khuzhin).
  • 通过减少需要搜索的标记数量,提升了文本索引与 sparseGrams 分词器的全文检索性能。#93078 (Anton Popov).
  • 在 x86 上通过动态分派加速了 T64 codec 压缩。#95881 (Raúl Marín).
  • 加速了 x86 上 32 字节块的 LZ4 解压缩。#96778 (Raúl Marín).
  • 文本索引的直接读取优化现已可部分生效——带有 materialized 文本索引的 parts 将使用该索引,而没有该索引的 parts 则回退到原始过滤表达式。#96411 (Anton Popov).
  • INSERT 期间,通过移除一次不必要的数据拷贝,并为数值列启用向量化的最小/最大值计算,优化了 minmax 跳过索引的计算。#97392 (Raúl Marín).
  • 在系统日志表的时间列上新增了 minmax 次级索引,并在 query_id/initial_query_id 列上新增了 bloom_filter 索引,以加快过滤速度。#96712 (Alexey Milovidov).
  • 避免了在未启用去重时,INSERT 出现内存使用量回归的问题。#96503 (Alexey Milovidov).

内存优化

  • 在未启用高亮和 VALUES 解析时,移除未使用字段,从而降低了 ASTLiteral 的内存占用。#93974 (Ilya Yatsishin) 。
  • 引入了专用的 Enum AST 类,将值参数存储为字符串/整数对,而非通用的 ASTLiteral 子节点,以减少内存占用。#94178 (Ilya Yatsishin) 。
  • 通过将列名直接存储为字符串,而不是存放在通用 AST 字面量节点中,优化了命名元组 AST 对象的内存占用。#94704 (Ilya Yatsishin) 。
  • CachedOnDiskReadBufferFromFile 结构的大小缩小了约 50 倍。#96098 (Azat Khuzhin) 。
  • 当表为空时,HashTable::resize 不再复制旧数据。#96180 (Raúl Marín) 。

内部优化

  • 在查询管道内对数据分区时采用了 “fastrange” (Daniel Lemire) 方法,提升了并行排序和 JOIN 操作的性能。#93080 (Alexey Milovidov) 。
  • 通过添加额外的链接器选项,改进了去虚拟化效果。#94737 (Nikita Taranov) 。
  • 通过对 ZooKeeper 请求进行批次处理,提升了包含大量 parts 的 ReplicatedMergeTree 表的副本克隆性能。#94847 (c-end) 。
  • 通过改用更快的哈希和无锁计数器,将 observeOperations 中 ZooKeeper 接收线程的 CPU 占用降低了 20% 以上。#95962 (Miсhael Stetsyuk) 。

缺陷修复

JOIN 修复

  • 修复了对 Join 存储应用 outer-to-inner join 优化时出现的 INCOMPATIBLE_TYPE_OF_JOIN 错误。#84292 (Vladimir Cherkasov) 。
  • 修复了包含多个 JOIN、USING 子句和 join_use_nulls 的查询中的逻辑错误。#92251 (Vladimir Cherkasov) 。
  • 修复了启用 join_use_nulls 时在 join 重排过程中出现的逻辑错误。#92289 (Vladimir Cherkasov) 。
  • 修复了 join_on_disk_max_files_to_merge 设置可能引发崩溃的问题。#92335 (Bharat Nallan) 。
  • 修复了在将外连接转换为内连接时,因意外修改查询计划而导致的 LOGICAL_ERROR。同时放宽了优化的适用条件,使其在 JOIN 中对聚合键使用单射函数时也能生效。#92503 (János Benjamin Antal).
  • 修复了在常量条件和 join_use_nulls 情况下使用多个 JOIN 时的逻辑错误。#92892 (Vladimir Cherkasov) 。
  • 修复了 full_sorting_joinLowCardinality(Nullable(T)) 列中对 NULL != NULL 情况的处理问题。#92924 (Vladimir Cherkasov) 。
  • 修复了右侧连接键为稀疏列时连接结果的问题。#93038 (Amos Bird).
  • 修复了 LEFT ANTI JOIN 带有额外后置条件时运行时过滤器无法正常工作的问题。#91824 (Alexander Gololobov) 。
  • 修复了在对右侧表计算总计的查询中使用运行时过滤器时的逻辑错误。#93330 (Alexander Gololobov) 。
  • 修复了某些情况下的逻辑错误:由于错误返回了重复的 const 列,在将 join 运行时过滤器添加到查询计划时会触发该错误。#93144 (Alexander Gololobov).
  • 已修复 __applyFilter 函数的问题:由 JOIN 运行时过滤器调用时,该函数在某些有效情况下会返回 ILLEGAL_TYPE_OF_ARGUMENT#93187 (Alexander Gololobov) 。
  • 修复了在与已填充的右侧表进行连接时未添加运行时过滤器的问题。#93211 (Alexander Gololobov) 。
  • 修复了在启用运行时过滤器且连接的表重复返回同一列时出现的 NOT_FOUND_COLUMN_IN_BLOCK 错误。#93526 (Alexander Gololobov).
  • 修复了在 Merge 表上应用 join 运行时过滤器时,FilterStep 未被正确添加的问题。 #94021 (Alexander Gololobov).
  • 修复了 Join 存储在使用 USING 子句执行 join 操作时转换为超类型的类型转换问题。#94000 (Dmitry Novik) 。
  • 修复了并行副本查询以及与非 MergeTree 表进行 JOIN 时的问题。#93902 (Igor Nikonov) 。
  • 修复了运行时过滤器中 Nullable join 列的竞态条件。#95775 (Hechem Selmi).
  • 修复了 Join 表中使用 Nullable(String) 键时空字符串变为 NULL 的问题。#96002 (Alexey Milovidov) 。
  • 修复了对空 MergeTree 表使用 direct join 算法时出现的 NOT_SUPPORTED 错误。#95935 (Vladimir Cherkasov) 。
  • 修复了一个问题:当外连接的 ON 条件引用了多个先前已连接表中的列时,由于非法的连接重排序,包含外连接且结合多个 INNER JOIN 的查询会返回错误结果。#96193 (Vladimir Cherkasov).
  • 修复了 Tuple 列中包含 Nullable 子字段时出现的运行时过滤器异常。#96509 (Alexey Milovidov) 。
  • 修复了在启用并行副本时,带有 CROSS JOIN 的查询返回错误结果的问题。#96848 (Igor Nikonov).
  • 修复了 arrayJoin 在与 INNER JOIN 和 WHERE 子句一起使用时产生重复行的问题。其原因是部分谓词下推错误地将包含 arrayJoin 的过滤条件下推到了 JOIN 之下。#96989 (Alexey Milovidov).
  • 修复了在 WHERE 子句中的 arrayJoin 引用 JOIN 两侧列时触发的 LOGICAL_ERROR#97239 (Alexey Milovidov).
  • 修复了在带有 USING 的 JOIN 中,于 VALUES 子句内的 lambda 函数中使用匹配符 (*) 时的逻辑错误。#95661 (Vladimir Cherkasov).
  • 修复了在 USING 列类型不同时,matcher (*table.*) 和 analyzer_compatibility_join_using_top_level_identifier 可能出现的逻辑错误。#95808 (Vladimir Cherkasov) 。
  • 修复了 analyzer_compatibility_join_using_top_level_identifier 与 ALIAS 列有关的逻辑错误。#97297 (Vladimir Cherkasov) 。
  • 修复了旧版 analyzer 在使用带有重复别名的 JOIN 时发生崩溃的问题。#96405 (Ilya Golshtein).

查询与 analyzer 问题修复

  • 修复了一个 bug:在插入操作期间,预定义查询处理程序中的尾随空白会被解释为数据。#83604 (Fabian Ponce).
  • 修复了在仅修改元数据的 ALTER (例如扩展枚举元素) 后,使用投影的聚合会抛出异常的问题。#84143 (Alexey Milovidov) 。
  • 修复了 count_distinct_optimization 在窗口函数以及多个参数上的处理问题。 #92376 (Raúl Marín).
  • 修复了 arrayElement 在使用取反字面量时 AST 格式不一致的问题。#92293 (Pavel Kruglov) 。
  • 修复了 NOT IN 在使用非常量数组参数时返回错误值的问题。#93314 (Yarik Briukhovetskyi).
  • 修复了涉及 Nothing 类型的 NULL 安全比较错误。#91884 (Yarik Briukhovetskyi) 。
  • 修复了 use_top_k_dynamic_filtering 优化导致的 Not found column 错误。#93316 (Nikolai Kochetov) 。
  • 修复了在存在标量关联子查询时,错误地从子查询中移除未使用列的问题。#93273 (Dmitry Novik) 。
  • 修复了当键为有符号整型时,optimize_inverse_dictionary_lookup 在分布式查询中无法工作的问题。 #93848 (Nihal Z. Miaji).
  • 修复了 lag/lead 在分布式 remote() 查询中不起作用的问题。#93858 (Nihal Z. Miaji).
  • 修复了一个缺陷:在 WHERE 中使用 not match(...) 时,数据跳过逻辑会出错,导致结果不正确。#92726 (Nihal Z. Miaji).
  • 修复了在 WHERE 子句中使用 not materialize(...)not CAST(...) 时,数据跳过逻辑中的一个错误,该错误会导致结果错误。#93017 (Nihal Z. Miaji) 。
  • 修复了在 has 函数中使用空数组时,索引分析过程中的逻辑错误。#92995 (Nihal Z. Miaji) 。
  • 修复了一个罕见情况下的逻辑错误:将空元组用于 Map 列时会触发该错误。#93814 (Nihal Z. Miaji).
  • 修复了使用 PK 分片且条件为 false 的查询失败问题。#92815 (Yarik Briukhovetskyi) 。
  • 已修复 Merge 表引擎查询计划在合并本地表与远程/Distributed 表时,因 hostName() 而抛出 ILLEGAL_COLUMN 的问题。#93286 (Jinlin) 。
  • 修复了 Merge 引擎处理带别名的表时出现的 NO_SUCH_COLUMN_IN_TABLE 错误。#92910 (Pavel Kruglov) 。
  • 修复了在多个列上使用布隆过滤器跳过索引,且谓词包含 ORNOT 条件时,SELECT 查询结果不一致的问题。#94026 (Shankar Iyer) 。
  • 已修复过滤器包含子列时应用投影的问题。#93141 (Pavel Kruglov) 。
  • 修复了在合并过程中重建投影时 _part_offset 损坏的问题,并通过避免不必要的读取操作优化了投影处理。#93827 (Amos Bird).
  • 防止不同的插值列在实际上是同一列的别名时,在一个块中合并为同一列。#93197 (Yakov Olkhovskiy).
  • 在合并过程中重建投影时,会移除未使用的列,从而降低内存使用量并减少临时 parts 的生成。#93233 (Nikolai Kochetov).
  • 修复了某些情况下在 distributed queries 中使用负值 LIMIT/OFFSET 时出现的逻辑错误。#95357 (Nihal Z. Miaji) 。
  • 修复了在某些情况下,分布式查询中使用小数 LIMIT/OFFSET 时出现的逻辑错误。#96475 (Nihal Z. Miaji).
  • 修复了启用 transform_null_in 时,IN 函数在处理 NULL 值时返回错误结果的问题。#95674 (Nihal Z. Miaji) 。
  • 修复了 IN (col) 在仅引用单个列时会失败并报出 UNSUPPORTED_METHOD 错误的问题。#97646 (Alexey Milovidov) 。
  • 修复了这样一个问题:当聚合参数为 LowCardinality(Nullable) 时,optimize_syntax_fuse_functions 会将 sum/count/avg 重写为 sumCount()#96239 (Nihal Z. Miaji).
  • 修复了 not INnot has 函数中分区裁剪错误的问题。#96241 (Nihal Z. Miaji) 。
  • 修复了由 prewhere 中的 lambda 表达式引起的 prewhere 过滤器错误。#95395 (Xiaozhe Yu) 。
  • 修复了查询分析器中的 LOGICAL_ERROR:在应传入具体值的位置传入 lambda 表达式时,会触发该错误。#96892 (Alexey Milovidov).
  • 修复了某些包含 lambda 函数的表达式中的空指针解引用问题。#96479 (Alexey Milovidov) 。
  • 修复了在 CTE 和子查询中,未将每个子查询的 SETTINGS 应用于 file 等表函数的问题。#96882 (Alexey Milovidov) 。
  • 修复了因 CTE 折叠常量引发的查询条件缓存哈希冲突问题,该问题可能导致查询结果错误。 #96172 (Alexey Milovidov).
  • 修复了在启用 analyzer 时,通过 merge() 表函数查询其 ALIAS 列中包含 lambda 表达式的表时出现的 BAD_ARGUMENTS 错误。#97551 (Alexey Milovidov).
  • 修复了 EXCEPT ALLINTERSECT ALL 会忽略行重数、行为与其 DISTINCT 版本相同的问题。#96876 (Alexey Milovidov).
  • 修复了 WindowTransformPRECEDING 偏移量过大时触发的断言失败问题。#96026 (Alexey Milovidov).
  • 修复了将窗口函数与 group_by_use_nulls = 1CUBE/ROLLUP/GROUPING SETS 一同使用时出现的异常。#96878 (Alexey Milovidov) 。
  • 修复了 GROUPING SETSgroup_by_use_nulls 以及带 LowCardinalityTuple 之间的交互问题,该问题会导致意外的块结构。#96358 (Alexey Milovidov) 。
  • 修复了 GROUP BY ... WITH ROLLUP/CUBE 中的一个逻辑错误:当键在 Nullable(Tuple(...)) 内包含 LowCardinality(Nullable(...)) 时会触发该问题。#97647 (Alexey Milovidov) 。
  • 修复了在 iftransform 返回 Nullable(String) 时,IfTransformStringsToEnumPass 中发生断言失败的问题。#97002 (Alexey Milovidov).
  • 修复了在 optimize_inverse_dictionary_lookup 重写 dictGet(...) 谓词时,不具备 CREATE TEMPORARY TABLE 权限的用户遇到 ACCESS_DENIED 的问题。#97484 (Nihal Z. Miaji) 。
  • 修复了一种少见场景下的问题:在带有 PREWHERE 和类型推断的分布式查询中,if 函数在 UInt64Int32 之间会出现类型不匹配。#96012 (Alexey Milovidov) 。
  • 修复了涉及 Bool 类型的 JIT 编译查询的问题。#96013 (Alexey Milovidov).
  • 修复了 JIT 已编译表达式将 DateTime 转换为 DateTime64 时导致结果错误的问题 (例如,在 CASE/if/multiIf 中混用 DateTime 类型时) 。#96879 (Alexey Milovidov) 。
  • 修复了 formatDateTime 在使用非固定宽度格式说明符时出现的 use-of-uninitialized-value 问题。#96133 (Alexey Milovidov).
  • 修复了使用不兼容类型调用 indexOfAssumeSorted 时触发的 std::terminate#96877 (Alexey Milovidov) 。
  • Geometry 函数现在除了接受 Geometry Variant 类型外,也接受各个独立的几何子类型。#97571 (Alexey Milovidov).
  • 修复了在包含 ROW POLICY/PREWHERE 和 FINAL 的查询中,索引会影响结果的问题。#97076 (Yarik Briukhovetskyi).
  • 使 read-in-order 优化能够使用行策略。#97538 (Janos Benjamin Antal) 。
  • 修复了在 QUALIFY 子句中使用带文本索引的列时出现的 LOGICAL_ERROR#97313 (Alexey Milovidov).
  • 修复了一个可能导致崩溃的问题:当 WHERE 子句中包含超过 32 个由 AND/OR 连接的表达式时。#97698 (Shankar Iyer) 。
  • 修复了在带有 FINAL 的表中使用 indexHint 并展开星号时,removeUnusedColumns 优化中的块结构不匹配问题。#97622 (Alexey Milovidov) 。
  • 修复了括号内带别名的 Tuple 字面量在 AST 格式化往返时不一致的问题。#97418 (Alexey Milovidov) 。
  • 修复了 NOT (1, 1, 1) 的 AST 格式化不一致。#97653 (Alexey Milovidov) 。

MergeTree 与存储问题修复

  • 如果文件系统不区分大小写,则始终在 MergeTree 中将文件名替换为哈希值。此前在 macOS 上,如果列名/子列名仅大小写不同,可能会导致数据损坏。#86559 (Pavel Kruglov) 。
  • materialized views 现在将其创建所在的数据库用作执行上下文,因此可以在该视图的 select 查询中省略显式的数据库限定。 #88193 (Dmitry Kovalev).
  • 在创建阶段,针对 materialized view 内部的底层查询补充了完整的权限检查。#89180 (pufit).
  • 修复了一个逻辑错误:无事务的变更会修改处于活动事务中但随后被回滚的 parts。#90469 (Shaohua Wang).
  • 修复了普通数据库转换为 atomic 数据库后,system.warnings 未能正确更新的问题。#90473 (sdk2) 。
  • 修复了在 ATTACH AS REPLICATED 过程中出现的 LOGICAL_ERROR: Storage does not support transaction 问题。#91772 (Shaohua Wang) 。
  • 修复了在对稀疏列执行变更且 ratio_of_defaults_for_sparse_serialization=0.0 时,可能出现的 FILE_DOESNT_EXIST 错误。#92860 (Pavel Kruglov) 。
  • 修复了这样一种可能出现的 FILE_DOESNT_EXIST 错误:通过 ALTER 将 ratio_of_defaults_for_sparse_serialization 改为 1.0 后,稀疏列变更可能会触发该错误。#93016 (Pavel Kruglov).
  • 修复了由于共享 parts 的 TOCTOU 竞争条件而可能使用过期分区片段的问题。#93022 (Azat Khuzhin) 。
  • 在 MergeTree 中执行变更时会继承源 parts 的序列化信息设置,修复了在数据类型序列化发生变化后,查询已变更 parts 时可能返回错误结果的问题。#92419 (Pavel Kruglov) 。
  • 修复了列与同名子列之间可能存在的冲突问题,避免其导致序列化错误和查询失败。#92453 (Pavel Kruglov) 。
  • 修复了向分区表达式中包含子列的表插入数据时出现的 NOT_FOUND_COLUMN_IN_BLOCK#92905 (Pavel Kruglov) 。
  • 修复了在对源表执行 alter 操作时,MV 中子列可能缺失的问题。#93276 (Pavel Kruglov).
  • 修复了恢复 ReplicatedMergeTree 时因去重竞争条件导致的 LOGICAL_ERROR#93612 (Pablo Marcos) 。
  • 修复了在直接反序列化期间使用稀疏列更新生存时间 (TTL) 的问题,从而避免出现 Unexpected type of result TTL column 错误。#93619 (Pavel Kruglov) 。
  • 如有需要,在生存时间 (TTL) 聚合期间恢复 SET 表达式结果上的 LowCardinality 包装器。#92971 (Seva Potapov).
  • 修复了 ALTER TABLE REWRITE PARTS 中的 Cannot add action to empty ExpressionActionsChain 问题。#92754 (Azat Khuzhin) 。
  • 修复了在使用 ON CLUSTER 时,CREATE USER 身份验证方法中查询参数替换的问题。#92777 (xiaohuanlin).
  • 如果 MergeTree 表位于只读磁盘上,启动时将不再尝试删除临时目录。 #92748 (Alexey Milovidov).
  • 修复了在子列上创建的跳过索引的物化问题。#93708 (Anton Popov).
  • 修复了对带有依赖索引的 CLEAR COLUMN 的支持问题。#94057 (Raúl Marín) 。
  • 修复了在重启后服务器间通信主机发生变化时无法附加 Replicated 数据库的问题。#93779 (Tuan Pham Anh).
  • 修复了 CREATE TABLE ... AS urlCluster()Replicated 数据库引擎相关的逻辑错误。#92418 (Kseniia Sumarokova).
  • 修复了 REPLACE PARTITION 与后台变更之间的竞态条件,可能会导致新旧数据同时可见。#96955 (Alexey Milovidov).
  • 修复了 REPLACE PARTITION 与后台变更之间仍然存在的竞态条件,该问题可能导致旧数据重新出现。#97105 (Alexey Milovidov).
  • 修复了当 PartCheckThread 为已应用变更的分片重新将 GET_PART 加入队列时,变更操作卡住的问题。#97162 (Alexey Milovidov) 。
  • 修复了此前对同一列执行过轻量级更新后,ALTER TABLE DROP COLUMN 失败的问题。#96861 (Anton Popov).
  • 修复了在轻量级更新过程中应用补丁分区片段时的空指针解引用问题。#97583 (Alexey Milovidov) 。
  • 带有未知 projections 的 parts 不会再被永久标记为丢失。#95952 (Mikhail Artemenko) 。
  • 修复了 CREATE TABLE ... CLONE AS ... 忽略源表完整限定名的问题。#96415 (Hasyimi Bahrudin) 。
  • 修复了复制表在元数据变更期间隐式重新生成索引的问题。#96600 (Raúl Marín) 。
  • 修复了带别名列的隐式索引问题,并在创建前增加了完整验证。#97115 (Raúl Marín).
  • 修复了一个问题:当所有行都被过滤掉后,在生存时间 (TTL) 合并后,min(timestamp) 会通过 _minmax_count_projection 返回纪元时间 (1970-01-01) 。#96703 (Raquel Barbadillo).
  • 修复了 use_const_adaptive_granularityindex_granularity_bytes (非自适应粒度) 组合使用时导致的计算错误。#96143 (Alexey Milovidov).
  • 修复了在从使用非自适应索引粒度的表中通过 ORDER BY ... LIMIT 读取数据时出现的 Number of rows in lazy chunk does not match number of offsets 异常。#97270 (Alexey Milovidov).
  • 修复了 zero-copy replication 中的一个回归问题:共享 parts 可能会在其他副本完成拉取前被删除。#95597 (filimonov).
  • 修复了 SYSTEM RESTART REPLICA 的一个问题:当因非 ZooKeeper 异常导致重建表失败时,表会从数据库中丢失,并在 DatabaseReplicated 中造成元数据摘要不匹配。#97276 (Alexey Milovidov) 。
  • 修复了在 ALTER TABLE MODIFY COLUMN 更改列类型后,构建列统计信息时出现的 assert_cast 异常。#97027 (Alexey Milovidov).
  • 当表未定义统计信息时,ClickHouse 将不再尝试加载这些信息,从而避免不必要的开销。#96233 (Han Fei) 。
  • 修复了在等待分布式 DDL 的同时并发删除 Replicated 数据库时出现的 There was an error: Cannot obtain error message 逻辑错误。#95664 (Alexander Tokmakov).
  • 修复了 KeyCondition 中的逻辑错误:当表的主键为 Nullable,且查询使用 coalesce 并将常量作为第一个参数时,会出现该错误。#96340 (Alexey Milovidov).

数据类型与序列化问题修复

  • 修复了读取 Dynamic/JSON 类型的 size 子列时可能出现的错误。#95573 (Pavel Kruglov) 。
  • 修复了对 JSON 数组应用 tupleElement 时发生的崩溃。#95647 (Pavel Kruglov) 。
  • 修复了对带有嵌套路径的 JSON 执行 tupleElement 时返回错误结果的问题。#95907 (Pavel Kruglov) 。
  • 修复了 tupleElement 在处理具有类型提示的路径对应的 JSON 时抛出异常的问题。#97728 (Pavel Kruglov).
  • 修复了 JSON 数据类型中的 skipping paths 问题——此前,JSON(SKIP path) 会跳过所有以 path 为前缀的键 (甚至包括 pathpath 这样的键) ,这可能会导致数据丢失。现在只会跳过完全匹配的键。#95948 (Pavel Kruglov).
  • 修复了将 type_json_allow_duplicated_key_with_literal_and_nested_object 应用于 JSON 类型化路径时的问题。#97422 (Pavel Kruglov) 。
  • 修复了 JSON 类型中对不兼容类型化路径的检查问题。#92539 (Pavel Kruglov) 。
  • 修复了在 JSON 中为路径 ‘skip’ 创建类型提示时的问题。#92842 (Pavel Kruglov) 。
  • 修复了 analyzer 中列别名里的动态子列解析问题。#92583 (Pavel Kruglov) 。
  • 修复了因对 Variant 列进行错误的原地过滤优化而引发的 Nested columns sizes are inconsistent with local_discriminators 错误。#96410 (Alexey Milovidov) 。
  • 修复了在 GROUP BY 中使用 Variant 参数时,ifNull 发生崩溃的问题。#96790 (Alexey Milovidov).
  • 修复了 FunctionVariantAdaptor 中的逻辑错误,该错误会影响需要常量参数的函数,例如 arrayROCAUC#97116 (Bharat Nallan) 。
  • 修复了 FunctionVariantAdaptor 中函数返回 Nothing 类型时触发的 LOGICAL_ERROR#97213 (Alexey Milovidov) 。
  • 修复了将 NULL 与包含 LowCardinality 类型的 Variant 列比较时的逻辑异常。#97379 (Alexey Milovidov) 。
  • 修复了 concat 中的 LOGICAL_ERROR:当某个参数包含内部带有 LowCardinalityVariant 类型时,会触发该问题。#97654 (Alexey Milovidov) 。
  • 修复了将 LowCardinality 列转换为 Nullable 时结果错误的问题。#96483 (Nihal Z. Miaji).
  • 启用 cast_keep_nullable 时,已在 CAST 中正确处理 LowCardinality Nullable 类型。#95747 (Alexey Milovidov) 。
  • 修复了对复杂嵌套类型进行类型转换时出现的 ColumnNullable is not compatible with original 异常。#96924 (Alexey Milovidov).
  • 修复了在 Nullable(Tuple(... Nullable(T) ...)) 类型的子列上使用 isNull/isNotNull 时触发的 LOGICAL_ERROR#97582 (Alexey Milovidov).
  • 修复了将 Array 转换为 QBit 时出现的 LOGICAL_ERROR#97413 (Alexey Milovidov).
  • 修复了同时读取稀疏列及其子列时触发的 LOGICAL_ERROR#97515 (Pavel Kruglov) 。
  • 修复了在带有 PREWHERE 的 Tuple 中读取稀疏 Nullable(String).size 子列时出现的 LOGICAL_ERROR#97264 (Alexey Milovidov) 。
  • 修复了 SetMergeTreeIndexSet 在处理带有内部稀疏子列的列时出现的断言失败问题。#97493 (Alexey Milovidov).
  • 修复了对空 Tuple 列排序时可能出现的错误 SIZES_OF_COLUMNS_DOESNT_MATCH#92520 (Pavel Kruglov).
  • 修复了原生 Parquet reader 中 DELTA_BYTE_ARRAY 的解码缺陷,该缺陷会影响高度重复的字符串数据。#91929 (Daniel Muino) 。
  • 修复了从 Parquet 文件读取时的断言错误:当 prewhere 表达式的一部分在查询的其他位置被使用时,会触发该错误。#90635 (Max Kainov).
  • 修复了 Parquet V3 原生读取器中的 LOGICAL_ERROR:当 PREWHERE 过滤器列包含非布尔型 UInt8 值时会触发该问题。#96594 (Alexey Milovidov).
  • 修复了旧版读取器中,当 JSON 列位于 Tuple 列之后时的 Parquet schema 推断问题。#92867 (Michael Kolupaev) 。
  • 修复了在 glob 模式的 schema 推断过程中,会缓存所有文件的 schema,而不只是缓存用于推断的文件这一问题。#92006 (Pavel Kruglov) 。
  • 修复了从空文件读取 ProtobufList 格式时,以及在空表中产生幽灵记录的问题。#96007 (Alexey Milovidov).
  • 修复了 Gorilla codec 的一个回归问题:当显式指定的大小与数据类型的大小不一致时,会出现该问题。#96118 (Alexey Milovidov) 。
  • PostgreSQL 引擎现已可正确读取 BOOLEAN[]#96006 (Alexey Milovidov) 。
  • 修复了从 SQLite 的 TEXT 列读取 UUID 列时的逻辑错误。#96016 (Alexey Milovidov) 。
  • 修复了 SQLite 引擎中 DateTimeDateUUID 等类型的转换问题。#96017 (Alexey Milovidov) 。
  • 修复了向 SQLite 和 PostgreSQL 发送查询时,FixedString 值被错误转义的问题。#96019 (Alexey Milovidov).
  • 新增了 input_format_numbers_enum_on_conversion_error 设置,用于控制从 Numbers 转换为枚举时的错误处理。#56240 (Nikolay Degterinsky) 。

全文索引与跳过索引问题修复

  • 为防止查询结果出错,现已暂时禁用在 parts 超过 4,294,967,295 行的表上创建和物化文本索引。#92644 (Anton Popov).
  • 修复了 MergeTree 表的文本索引在合并过程中发生的多处崩溃。#92925 (Anton Popov).
  • 修复了基于复杂表达式 (如 concat(col1, col2)) 构建的文本索引在合并时出现的问题。#93073 (Anton Popov).
  • 修复了在索引不包含任何标记时,数组列上的文本索引分析问题。#93457 (Anton Popov).
  • 修复了在子列上创建的文本索引重建问题。#93326 (Anton Popov).
  • 修复了在出现重复搜索查询时从文本索引直接读取的问题。#93516 (Anton Popov).
  • 修复了 hasmapContainsKeymapContainsValue 函数在文本索引分析中的不一致问题,此前是否使用文本索引可能会返回不同的结果。#93578 (Anton Popov) 。
  • 修复了 system.parts 中文本索引未压缩大小的计算错误。#92832 (Anton Popov).
  • 修复了 ngrambf_v1 索引在 ngram 长度 > 8 时会抛出异常的问题。#92672 (Robert Schulze) 。
  • 修复了在非 UTF-8 数据上使用 ngram_bf 索引时会导致读取未初始化内存的问题。#93663 (Alexey Milovidov) 。
  • 修复了向量相似度索引中的 stack-use-after-scope 问题。#96259 (Alexey Milovidov) 。
  • 修复了跳过索引表达式产生常量列时的逻辑错误。#96880 (Alexey Milovidov) 。
  • 修复了创建表时将空表达式 () 用作索引而导致无效内存访问的问题。#96363 (Alexey Milovidov).
  • 修复了在禁用 use_primary_key 且析取条件数量极大时,索引分析中的 use-after-free 问题。#96112 (Alexey Milovidov) 。
  • 修复了在 WHERE 中使用 IN 子句子查询时,轻量级更新对主索引的使用。#92838 (Anton Popov) 。
  • 在验证 hypothesis 索引时,使用了正确的错误代码。#92559 (Raúl Marín) 。

数据湖修复

S3/Azure/对象存储修复

S3Queue 修复

安全与访问控制修复

  • 修复了 SYSTEM SYNC FILE CACHE 中缺少的访问检查。#92372 (Kseniia Sumarokova) 。
  • 修复了通配符授权访问检查中过于严格的错误逻辑。#92725 (pufit).
  • 修复了这样一个问题:使用 merge 表引擎时,用户在没有 SHOW COLUMNS 权限的情况下仍可获取表的列列表。#93695 (János Benjamin Antal) 。
  • 修复了 groupConcat 状态反序列化中的整数溢出漏洞,该漏洞可能引发内存安全问题。#93426 (Raufs Dunamalijevs) 。
  • 已验证解压后缓冲区的大小符合预期。#93690 (Raúl Marín) 。
  • 修复了撤销默认角色时的问题。#96103 (Vitaly Baranov) 。
  • 修复了 AccessRights::contains 在部分撤销权限时返回错误结果的问题。#96170 (pufit).
  • 修复了在分布式查询中更新分配给初始用户的行策略的问题。#95469 (Vitaly Baranov) 。
  • redis 表函数的密码参数现在会在日志和系统表中进行脱敏处理。 #95325 (Janos Benjamin Antal).
  • 修复了读取 X509 证书时 BIO 对象发生的内存泄漏问题。#96885 (Alexey Milovidov) 。
  • 对 bech32 中的 witness version 进行了校验,以避免缓冲区溢出。#96671 (Raúl Marín) 。
  • 修复了在许多数据库上仅具有有限授权的用户查询系统表时性能缓慢的问题。#95874 (pufit).

Backup 与恢复问题修复

  • 修复了因归档条目大小头信息错误导致的 Couldn't pack tar archive: Failed to write all bytes 错误。#92122 (Julia Kartseva) 。
  • 修复了大量并发备份争用同一文件时导致服务器崩溃的问题。#93659 (Alexey Milovidov) 。
  • 修复了在 plain_rewritable 对象存储磁盘上创建基于归档的备份 (.zip.tzst) 时发生的栈溢出问题。#96872 (Alexey Milovidov).
  • 修复了当备份因磁盘已满或其他 I/O 错误失败时,server 崩溃的问题。#96873 (Alexey Milovidov) 。
  • 修复了 StorageKeeperMap 备份中因释放后继续使用内存而导致的段错误。#97336 (Alexey Milovidov) 。

崩溃与稳定性修复

  • 修复了因从已断开连接的 Connection 中读取而导致的崩溃。#92807 (Raufs Dunamalijevs).
  • 修复了 tokens() 函数在第二个参数为 NULL 时可能导致崩溃的问题。#92586 (Raúl Marín) 。
  • 修复了使用非常量分词器参数调用 tokens 时的服务器崩溃问题。#93383 (Robert Schulze) 。
  • 修复了在并发进行列缩减或过滤时,原地变更底层 const PREWHERE 列可能引发的潜在崩溃问题。#92588 (Arsen Muk).
  • 修复了终止背景调度池时可能出现的卡死问题,该问题可能导致服务器在关闭时卡死。#93008 (Azat Khuzhin) 。
  • 修复了在提前取消分布式查询后导致连接处于异常状态的问题。#93029 (Azat Khuzhin).
  • 修复了 estimateCompressionRatio() 中可能出现的 Cannot finalize buffer after cancellation 错误。#93068 (Azat Khuzhin).
  • 确保在关闭时完成 ZooKeeper 的终结处理,以修复可能出现的卡顿问题。#93602 (Azat Khuzhin).
  • 修复了在使用 ZooKeeper 存储时,后台重新加载命名集合期间出现的未捕获异常。#92717 (Kseniia Sumarokova) 。
  • 修复了 ReadWriteBufferFromHTTP 中使用未初始化值的问题。#94058 (Alexey Milovidov).
  • 修复了 TraceSender 缓冲区大小未更新的问题,否则会导致不同线程的刷写操作交错发生。#93966 (Miсhael Stetsyuk).
  • QueryPipeline 中保存了存储对象的共享指针,以确保在 PipelineExecutor 存活期间,IStorage 对象不会被销毁。#93746 (Miсhael Stetsyuk) 。
  • 修复了分布式查询在被取消时可能崩溃的问题。#95466 (Aleksandr Musorin) 。
  • 修复了在与查询并发执行时运行 DROP WORKLOAD 导致的崩溃。#95856 (Alexey Milovidov) 。
  • 修复了 DROP WORKLOAD 中的数据竞争问题。#96614 (Sergei Trifonov).
  • 修复了若干个与 ThreadPoolCallbackRunnerLocal 使用相关的严重问题。#95818 (Raúl Marín) 。
  • 修复了 ProcessList 中一个可能出现的死锁问题,该问题由内存 overcommit 跟踪器触发时的锁顺序反转引起。#96182 (Antonio Andelic).
  • 修复了 max_execution_time 较大的查询在取消检查线程中出现的活锁问题。#96450 (Sergei Trifonov) 。
  • 修复了因竞态条件导致 MemoryWorker 的清理线程卡住的问题。#96819 (Antonio Andelic) 。
  • 修复了 clearCaches 中因过早销毁缓存的存储快照而导致的崩溃。#96995 (Alexey Milovidov).
  • 修复了带约束的 CREATE TABLE 中的 heap-use-after-free 问题。#96669 (Nikita Taranov) 。
  • 修复了 StorageKafka2 中可能出现的释放后使用问题。#97520 (Bharat Nallan) 。
  • 修复了 DatabaseMaterializedPostgreSQLshutdown_called 的数据竞争问题。#97554 (Alexey Milovidov) 。
  • 修复了分片 HASHED 字典并行加载中的竞态条件,该问题可能导致某些行未能加载。#96953 (Alexey Milovidov).
  • 修复了字典中的死锁问题:当一个字典引用了一个递归地反向引用该字典的 Merge 表时,会出现该问题。#96120 (Alexey Milovidov).
  • 修复了以下越界访问问题:在查询计划反序列化过程中,较新的服务器发送未知设置时,BaseSettings::readBinary 会发生越界访问。#97585 (Michael Stetsyuk) 。
  • 修复了以下崩溃问题:在将表附加到 MaterializedPostgreSQL 数据库时,如果 dropReplicationSlot 在栈展开过程中抛出异常,就会发生崩溃。#96871 (Alexey Milovidov) 。
  • 在 insert select 中释放请求流,避免 HTTP 连接被关闭。#92175 (Sema Checherinda) 。
  • 修复了在 Backup 数据库上执行 SHOW CREATE DATABASE 时的死锁问题。#92541 (Azat Khuzhin) 。

其他缺陷修复

  • 修复了 hasAllTokenshasAnyTokens 函数中 handleAllTokens 对空数组的处理。#93328 (Anton Popov) 。
  • 修复了全局性能分析器的固定周期——此前误用了截断后的值,而不是设定的值,导致唤醒过于频繁。#96048 (Antonio Andelic).
  • 修复了 system.asynchronous_metric_logevent_date 的问题。#95947 (Raúl Marín) 。
  • 修复了 system.functions 中内部函数显示为空字符串而非 categories = 'Internal' 的问题。#97315 (Robert Schulze) 。
  • 修复了 ip_trie 字典在键类型非 String 时可能存在的逻辑错误。#97555 (Bharat Nallan) 。
  • 通过在 system.query_log.exception 中启用 stderr 捕获,修复了 UDF 调试问题。#92209 (Xu Jia).
  • 修复了 filterPartsByVirtualColumns 在恒为 false 的谓词条件下的问题。#97620 (Bharat Nallan).
  • 修复了在压缩合并前未将 ColumnConst 物化的问题。#97019 (Hasyimi Bahrudin) 。
最后修改于 2026年6月10日