跳到主要内容
跳到主要内容

2025 更新日志

目录

ClickHouse 发行版 v25.12,2025-12-18
ClickHouse 发行版 v25.11,2025-11-27
ClickHouse 发行版 v25.10,2025-10-30
ClickHouse 发行版 v25.9,2025-09-25
ClickHouse 发行版 v25.8 LTS,2025-08-28
ClickHouse 发行版 v25.7,2025-07-24
ClickHouse 发行版 v25.6,2025-06-26
ClickHouse 发行版 v25.5,2025-05-22
ClickHouse 发行版 v25.4,2025-04-22
ClickHouse 发行版 v25.3 LTS,2025-03-20
ClickHouse 发行版 v25.2,2025-02-27
ClickHouse 发行版 v25.1,2025-01-28
2024 年更新日志
2023 年更新日志
2022 年更新日志
2021 年更新日志
2020 年更新日志
2019 年更新日志
2018 年更新日志
2017 年更新日志

ClickHouse 发行版 25.12,2025-12-18

不向后兼容的变更

  • 在将可空列转换为非空类型时,ALTER MODIFY COLUMN 现在需要显式指定 DEFAULT。此前这类 ALTER 操作可能会因 cannot convert null to not null 错误而卡住,现在会将 NULL 替换为该列的默认表达式。修复了 #5985#84770Vladimir Cherkasov)。
  • Ngram tokenizer 将不再返回长度小于其配置的 N 的 ngram。当搜索 token 为空时,Text Search 将不再返回任何行。#89757 (George Larionov)。
  • 当将列从 String 修改为 Nullable(String) 时,我们不会对数据执行 mutation 操作。但对于 uniq 聚合函数,它使用了不同的数据结构:对于可为空列,会使用带有嵌套 uniq 聚合器的 AggregateFunctionNullAggregateFunctionNull 在序列化时会额外写入一个布尔标记。这会导致统计文件不兼容。修复方案是在序列化时添加一个标记,用于记录该列是否为可为空列。由于统计信息的格式已发生变化,如果仍存在旧格式的统计信息,服务器可能会出错。PR #90904 将修复崩溃问题,并在现有统计信息使用旧格式时抛出异常。为避免异常,应运行 ALTER TABLE table MATERIALIZE STATISTICS ALL 重新生成统计信息以修复该问题。#90311 (Han Fei)。
  • 移除设置项 allow_not_comparable_types_in_order_byallow_not_comparable_types_in_comparison_functions。允许在 ORDER BY 或比较函数中使用不可比较类型可能会导致逻辑错误和意外结果。解决了 #90028#90527Pavel Kruglov)。
  • check_query_single_value_result 的默认值从 true 更改为 false。因此,CHECK TABLE 会返回每个 part 的详细结果,而不是汇总结果(1 = 正常,0 = 发现错误)。与之前的行为相比,这更符合用户的预期。#91009 (Robert Schulze)。
  • 围绕隐式索引进行了多项修复。展示的 schema 或 keeper 中存储的元数据将不再包含隐式索引,例如通过设置项 add_minmax_index_for_numeric_columnsadd_minmax_index_for_string_columns 创建的索引。这可能会在使用新版本创建或更新 ReplicatedMergeTree 表而集群中仍然存在旧版本副本时导致元数据错误。对于这些情况,请将 DDL 语句发送到旧副本,直至整个集群完全升级。#91429Raúl Marín)。
  • 将 clickhouse-client 更新为:当查询因 receive_timeout 超时时返回非零退出码(159 - TIMEOUT_EXCEEDED)。此前,超时会返回退出码 0(成功),这使得脚本和自动化流程难以及时检测超时失败。 #91432 (Sav).
  • 现在禁止创建在 ORDER BY 键为空的情况下的特殊 MergeTree 表(例如 ReplacingMergeTreeCollapsingMergeTree 等),因为这类表的合并行为未定义。如果仍然需要创建这样的表,请启用 allow_suspicious_primary_key 设置。#91569 (Anton Popov)。
  • 修复函数 bitShiftLeftbitShiftRight,使其在移位量恰好等于类型大小时返回 0 或空值。 #91943 (Pablo Marcos).
  • #88380 的后续更新。本次 PR 将在投影中禁用位置参数视为一项向后不兼容的更改。此外,它引入了 enable_positional_arguments_for_projections 设置,用于在投影中存在位置参数时,支持安全地升级 ClickHouse 集群。#92007Dmitry Novik)。

新功能

  • 用户现在可以为 S3/Azure Queue 表配置在处理完成后将文件移动或打标签,此前仅支持选择保留或删除文件。解决了 #72944#86907Murat Khairulin)。
  • 在 S3/Azure Queue 存储中新增 commit_on_select 设置(用于定义是否需要提交已处理的数据,以及是否应用 after_processing 操作)。默认值为 false,并修复了在 SELECT 时对已附加物化视图的检查。#91450Kseniia Sumarokova)。
  • 在运行时使用 XRay 添加埋点,以在生产环境中调试问题并进行确定性性能分析。解决了 #74249#89173Pablo Marcos)。
  • 允许在 IN 中使用非常量的第二参数,并且也支持将元组作为第二参数。#77906Yarik Briukhovetskyi)。
  • geometry 类型新增用于计算面积和周长的函数。 #89047 (Konstantin Vedernikov).
  • 实现 dictGetKeys 函数,用于返回属性等于指定值的字典键(一个或多个)。该函数使用按查询粒度维护的反向查找缓存(通过 max_reverse_dictionary_lookup_cache_size_bytes SETTING 进行调优)来加速重复查找。 #89197 (Nihal Z. Miaji)。
  • 添加设置项 type_json_skip_invalid_typed_paths,在输入 JSON 无法转换为 JSON 类型中显式声明的类型化路径(typed path)时,禁用针对插入/类型转换为 JSON 类型而抛出的异常。此时将回退为该类型化路径的 null/零值。#89886 (Max Justus Spransy)。
  • 为 MergeTree 表新增对 direct(嵌套循环)连接的支持。要使用它,请在设置中将其作为唯一选项指定:join_algorithm = 'direct'#89920Vladimir Cherkasov)。
  • 在 Iceberg 表的 CREATE 操作中支持 ORDER BY,并在 INSERT 中支持排序。解决了 #89916#90141Konstantin Vedernikov)。
  • 引入投影级别的设置,这些设置通过 ALTER TABLE ... ADD PROJECTION 中新增的 WITH SETTINGS 子句对外暴露。借助这些设置,各个投影可以在自身范围内覆盖某些 MergeTree 存储参数(例如 index_granularityindex_granularity_bytes)。#90158Amos Bird)。
  • 新增 HMAC(algorithm, message, key) SQL 函数,作为 #73900#38775 的一部分。#90837Mikhail f. Shiryaev)。
  • has 函数添加支持:当第一个参数是常量数组时,可以利用主键和数据跳过索引。解决 #90980#91023Nihal Z. Miaji)。
  • 实现新的输入/输出格式 Buffers。该格式类似于 Native,但与 Native 不同的是,它不存储列名、列类型或任何额外的元数据。关闭 #84017#91156Nihal Z. Miaji)。
  • 新增设置项 max_streams_for_files_processing_in_cluster_functions,用于控制 Cluster 表函数中并行读取文件时的流数量。修复了 #90223#91323Pavel Kruglov)。
  • 用于行级安全的数据掩码功能(仅在 ClickHouse Cloud 中可用)。在 clickhouse-client 中添加数据掩码策略解析器,以支持该功能。#90552 (pufit).
  • windowFunnel 聚合函数添加 allow_reentry 选项。与 strict_order 一同启用时,它会忽略违反顺序的事件,而不是终止漏斗分析。这使在处理包含刷新(A->A->B)或回退导航(A->B->A->C)的用户路径时,不会低估转化率。#86916 (Lee ChaeRok)。
  • Keeper 与 ZooKeeper 的兼容性:支持带统计信息的创建。 #88797 (Konstantin Vedernikov).
  • 在 ClickHouse Keeper 中支持 ZooKeeper 持久监听(persistent watches)。续篇第 2 部分:https://github.com/ClickHouse/ClickHouse/pull/78207#88813Konstantin Vedernikov)。
  • 添加一个 MergeTree 设置 alter_column_secondary_index_mode,用于控制在执行 mutation 时如何处理二级索引。可能取值为:throw、drop、rebuild 和 compatibility。关闭了 #77797#89335Raúl Marín)。
  • 由于 TimeTime64 数据类型已可用于生产环境,enable_time_time64_type 设置现已默认启用。#89345Yarik Briukhovetskyi)。
  • 支持通过 deltaLake 表函数,并结合 delta_lake_snapshot_start_versiondelta_lake_snapshot_end_version 这两个设置来读取 DeltaLake 的 CDF。CDF(Change Data Feed,一项可在 Delta 表不同版本之间自动捕获并查询行级数据变更(例如插入、更新和删除)的功能)在 DeltaLake 中通过 delta.enableChangeDataFeed 启用。与数据一同提供的列包括 _change_type_commit_version_commit_timestamp#90431Kseniia Sumarokova)。
  • 在访问元组元素时支持使用负索引(例如 tuple.-1)。 #91665 (Amos Bird).

实验特性

  • TODO:引入 Text 索引格式 v3 并将其提升为 Beta 状态。
  • 引入了新的逻辑,用于在 automatic_parallel_replicas_mode 设置的控制下自动使用并行副本执行查询。在正常的单节点执行期间,ClickHouse 会收集统计信息,并在后续的计划阶段加以考虑。如果统计信息表明启用并行副本可能带来收益,ClickHouse 将自动使用并行副本执行该查询。目前支持的查询类型仍然相当有限。#87541 (Nikita Taranov)。
  • 使用 Cloud 凭证配合 --login 访问 ClickHouse Cloud 实例。#89261 (Krishna Mannem)。
  • 新增会话级设置 aggregate_function_input_format,用于改进对包含 AggregateFunction 列的表执行 INSERT 查询,允许以序列化状态、原始值或数组的形式插入数据。#88088 (Punith Nandyappa Subashchandra)。

性能优化

  • 通过结合使用跳过索引和动态阈值过滤器来优化 ORDER BY...LIMIT N 查询,从而显著减少处理的行数。#89835 (Shankar Iyer).
  • ClickHouse 现在使用 skip 索引对带有 ANDOR 混合连接过滤条件的 WHERE 子句执行索引分析。此前,要利用 skip 索引,WHERE 子句必须是由过滤条件构成的合取(AND)。新增设置项 use_skip_indexes_for_disjunctions(默认:开启)用于控制该功能。(issue #75228)。#87781Shankar Iyer)。
  • 支持在 LEFT/INNER JOIN 操作中保持从左表按顺序读取,供后续阶段利用。可通过设置 query_plan_read_in_order_through_join 禁用。在 LEFT/INNER JOIN 中支持读取优化中的虚拟行(参见设置 read_in_order_use_virtual_row)。#89815Vladimir Cherkasov)。
  • 使用更大的限制值来提升惰性物化列的性能。 #90309 (Nikolai Kochetov).
  • 当存在大型 minmax 索引(包含数百万个 granule)时,用户在执行索引分析时应该会看到更低的延迟。#90428Shankar Iyer)。
  • 为 INNER JOIN 实现了简单的 DPsize 连接重排算法。新增了一个实验性设置用于控制按什么顺序使用哪些算法,例如,query_plan_optimize_join_order_algorithm='dpsize,greedy' 表示先尝试 DPsize,不适用时回退到 greedy。#91002Alexander Gololobov)。
  • 当查询达到行数限制时立即失败。解决了 #61872#62804Sean Haynes)。
  • #84477 为可在 insert select from s3Cluster(...) 中使用的 SELECT 查询添加了约束,以支持并行分布式执行。该更改现在也允许使用 WHERE 子句(此前不支持)。 #84611 (Igor Nikonov).
  • 在哈希表迭代过程中预取键,以减少缓存未命中次数。 #84708 (lgbo).
  • 通过仅对 points 数组的末尾部分进行排序,并在输入为单调时跳过排序来优化 histogram 聚合函数,从而实现约 10% 的性能提升。 #85760 (MakarDev)。
  • 通过利用由文本索引构建的额外预过滤条件,改进了针对包含 likeequalshas 等函数的谓词的过滤性能。此优化可通过 query_plan_text_index_add_hint 设置启用。改进了在 Map 数据类型列上使用文本索引的方式。#88550Anton Popov)。
  • 通过对预先计算的可能键值集合执行更快速查找,优化重复的逆向字典查找。关闭 #7968#88971Nihal Z. Miaji)。
  • 改进 topK 聚合函数的性能和行为。#90091Raúl Marín)。
  • 改进了 Decimal 类型比较运算的性能。修复了 #28192#90153Konstantin Bogdanov)。
  • 为 Apache Paimon 函数添加分区裁剪支持,延续自 https://github.com/ClickHouse/ClickHouse/pull/84423#90253 (JIaQi)。
  • 通过动态派发在逻辑函数中使用高级 SIMD 操作。#90432Raúl Marín)。
  • 避免不必要地将结果列初始化为零,从而提升 JIT 函数的执行性能。#90449 (Raúl Marín).
  • 通过动态分派加速 T64 解压缩。#90610Raúl Marín)。
  • 优化 MergeTree 读取器的就地过滤。解决了 #87119#90630Xiaozhe Yu)。
  • 引入一个额外的启发式方法,以减小所选合并方案的宽度。执行更窄范围的合并会增加写放大,但同时可以帮助避免出现 TOO_MANY_PARTS 错误。#91163 (Mikhail Artemenko)。
  • 通过下推 _path 过滤条件,提升使用通配符模式创建的 S3 表的查询性能,从而可以避免执行 S3 列表操作。由 s3_path_filter_limit 设置项控制。#91165 (Eduard Karacharov)。
  • 通过动态分派加速在 WHERE 子句中将列转换为 bool 类型的过程。 #91203 (Raúl Marín).
  • 借助动态分派加速单个数值块的排序。#91213Raúl Marín)。
  • 新增优化,在查询计划中移除未使用的列。解决了 #75152#76487János Benjamin Antal)。
  • query_plan_optimize_join_order_limit 的默认值已修改为 10#89312Alexey Milovidov)。
  • 默认启用 allow_statistics_optimize 设置,使 JOIN 优化器可以使用列统计信息。#89332Alexey Milovidov)。
  • ANTI JOIN 提供 JOIN 运行时过滤器支持。同时重构运行时过滤器的实现,以减少锁竞争。#89710 (Dmitry Novik)。
  • system.metric_log 表(默认启用)中合并数据时,通过将 min_bytes_for_wide_partvertical_merge_algorithm_min_bytes_to_activate 设置为 128MB,降低内存占用。#89811filimonov)。
  • PREWHERE 中启用倒排索引。解决 #89975#89977Peng Jian)。
  • 在使用 GCP OAuth 时,不要配置 S3 providers,从而提升在 GCS 上的性能。 #91706 (Antonio Andelic).

改进

  • 新增了一个名为 apply_row_policy_after_final 的新 SETTING,它允许查询仅在执行 FINAL 之后才应用 ROW POLICY,从而使带有 ROW POLICY 的 ReplacingMergeTree 表的行为更加合理。修复了 #90986#91065Yarik Briukhovetskyi)。
  • Pretty 格式中,命名元组现在以 Pretty JSON 的形式显示。此更改修复了 #65022#91779Mostafa Mohamed Salah)。
  • system.error_log 表中添加了 last_error_timelast_error_messagelast_error_query_idlast_error_trace 字段。#89879Narasimha Pakeer)。
  • CLI 客户端现在可以通过指定 --no-server-client-version-messagefalse 来屏蔽 “ClickHouse server version is older than ClickHouse client. It may indicate that the server is out of date and can be upgraded” 这一消息。#87784 (Larry Snizek)。
  • 添加错误信息,用于指明该 part 已被去重。 #80264 (Aleksandr Musorin).
  • system.kafka_consumers 新增了 dependenciesmissing_dependencies 列,用于报告 Kafka 表的 materialized view 目标表。新增 KafkaMVNotReady 计数器。#85346 (Ilya Golshtein)。
  • 现在,表的默认表达式在通过 remote 和原生协议插入数据时能够正确生效。修复了 #87972#88540Pervakov Grigorii)。
  • 支持禁用 PSI_*_* 异步指标收集。#88557 (MikhailBurdukov)。
  • Nullable 类型列新增了对稀疏序列化的支持。该改动延续了 #44539#88999 (Amos Bird)。
  • plain-rewritable 磁盘有其独立的实现和布局,不再基于常规 plain 磁盘实现。#89807 (Mikhail Artemenko).
  • HTTP 中的任何异常都不应包含末尾的零长度分块。 #89998 (Kaviraj Kanagaraj).
  • 在握手期间在 keeper 服务器端添加检查,当 last_zxid_seen (provided by the client) > last_processed_zxid 时拒绝客户端连接。这样可以在客户端重新连接到滞后副本时防止发生陈旧读。#90016 (Miсhael Stetsyuk).
  • kafka_consumer_reschedule_ms 添加为可调的 Kafka 表引擎 SETTING,用于调整消费者在等待新数据时的休眠时长。解决 #89204#90112Jeremy Aguilon)。
  • system.mutations 新增列 parts_in_progress_names,以改进诊断能力。 #90155 (Shaohua Wang)。
  • 在 S3 库解析 XML 响应时,对网络错误进行重试。#90216 (Sema Checherinda).
  • 我们将把 keeper 运行在单独的服务器进程中,并且为避免在大规模区域中对 Prometheus 造成过大压力,将继续只暴露与 keeper 相关的指标。#90244 (Miсhael Stetsyuk)。
  • 除了旧的 ~/.clickhouse-client/ 路径外,新增支持从 XDG Base Directory 路径(例如 ~/.config/clickhouse/config.xml)加载 ClickHouse Client 配置。修复 #89882#90306Wujun Jiang)。
  • 在 Keeper 中为追加请求批次新增了字节大小限制。该限制由 keeper_server.coordination_settings.max_requests_append_bytes_size 控制。#90342Antonio Andelic)。
  • 为 Iceberg 添加一个设置,用于防止分区数量过多。 #90365 (Konstantin Vedernikov).
  • 在接近 guardrails 限制时更新警告信息:显示当前值和抛出异常阈值。 #90438 (Nikita Fomichev).
  • system.filesystem_cache 表中以流式方式分块处理,而不是创建一个包含所有缓存状态的单一块。对于大型缓存,读取文件系统缓存状态可能耗时很长且会消耗大量内存,因此对于大型部署来说,流式处理是不可或缺的。#90508 (Kseniia Sumarokova).
  • 修复 Hive 分区中的异常信息:之前缺少一个空格。#90685 (Alexey Milovidov).
  • 当表的分区片段被删除或被新的分区片段替换时,向量相似度索引缓存中的条目现在会被移除。在此之前,这些条目仅会在缓存逐出时被惰性清理。#90750 (Shankar Iyer).
  • 将 chdig(命令行 ClickHouse 诊断工具)更新到 v25.12.1#91394Azat Khuzhin)。
  • 现在已支持在 S3 中使用预签名 URL。解决了 #65032#90827Yarik Briukhovetskyi)。
  • 文本索引现已支持用于 ReplacingMergeTree 表。#90908Elmi Ahmadov)。
  • 避免在身份验证之前返回的 HTTP 错误响应中暴露 ClickHouse 服务器版本信息。#91003 (filimonov)。
  • 现在,当 HTTP 客户端连接数达到 hard_limit 时,将抛出 HTTP_CONNECTION_LIMIT_REACHED 异常。对于磁盘连接,该值被设置为 20000#91016 (Sema Checherinda)。
  • 引入 system.background_schedule_pool{,_log},以改进对后台作业的观测与分析。 #91157 (Azat Khuzhin).
  • 现在可以在 Web UI 的查询编辑器中使用 Ctrl+/(在 Mac 上为 Cmd+/)快速对当前选中的行进行注释或取消注释,从而更方便地在测试时临时禁用查询中的部分内容。#91160 (Samuel K.)。
  • system.completions 添加到始终可访问的表列表中。 #91166 (Yakov Olkhovskiy)。
  • 新增 profile event FailedInitialQueryFailedInitialSelectQuery#91172 (RinChanNOW)。
  • 通过遵循 merge_tree_use_prefixes_deserialization_thread_pool 设置而非无条件使用线程池,修复了在读取包含大量子列的 JSON 列样本数据时可能出现的线程池资源耗尽问题。#91208 (Raufs Dunamalijevs)。
  • tupleElement 增加对 JSON 类型的支持。关闭 #81630#91327Pavel Kruglov)。
  • 修复了在启用用户空间页面缓存时出现的误报内存限制错误。#91361 (Michael Kolupaev).
  • Ngrams 分词器现在可以在 ngram_length = 1 时构建。 #91529 (George Larionov).
  • INSERT INTO FUNCTION 中支持在函数内指定存储设置,其方式与当前在 SELECT 中的支持一致。关闭 #89386#91707Kseniia Sumarokova)。
  • 针对数据湖的 truncate 查询,不再静默忽略该操作,而是抛出 “not implemented” 异常。修复了 #86604#91713 (Kseniia Sumarokova)。
  • 为 Parquet v3 读取器设置最大消息大小限制,以避免触发 DB::Exception: apache::thrift::transport::TTransportException: MaxMessageSize reached#91737Arthur Passos)。
  • 添加了一个 insert_select_deduplicate 设置项,使得在执行 INSERT SELECT 时如何处理插入去重更加清晰。总体来说,这类查询通常无法进行去重,但如果目标表没有发生变化且结果是有序的,那么在重试时就有可能进行去重。我们无法跟踪数据源是否相同,但可以检查 SELECT 查询的结果是否已排序。实际上结果表明,在一般情况下要检查这一点非常困难,但对于使用 ORDER BY ALL 的简单场景则很容易。目前这一逻辑实际上是有问题的:我们尝试做去重,但在大多数情况下,它根本无法在数据块之间发现重复,因为 SELECT 返回了不同的数据。#91830Sema Checherinda)。
  • 在将 Array 转换为 QBit 时允许隐式类型转换。现在可以将整数数组和浮点数数组直接插入到 QBit 列中,而无需显式类型转换。 #91846 (Raufs Dunamalijevs).
  • 新增 CapnProto 消息大小限制。可通过 format_capn_proto_max_message_size 进行修改。#91888 (Antonio Andelic).
  • 优化 mark 缓存指标,使其仅跟踪查询(在 #83415 中将 MarkCacheHits/MarkCacheMisses 扩展为同时统计合并后,本 PR 将把该行为恢复为原状)。#91910Azat Khuzhin)。
  • 修复本地连接的 client_info.interface 被设置为 TCP 的问题。 #91933 (Konstantin Bogdanov).
  • ACME 客户端配置中的 refresh_certificates_task_interval 参数现在需要以秒为单位的值。#92211Konstantin Bogdanov)。
  • system.*_log 的分区片段事件记录到 system.part_log 中。 #92217 (Azat Khuzhin).

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复了在 PREWHERE 中处理 TimeTime64 数据类型的超类型时的一些错误。解决了 #84544#84715Yarik Briukhovetskyi)。
  • 在使用前初始化 DNSResolver,以使其遵循自定义设置。修复了 #76296#81302Zhigao Hong)。
  • 修复在某些情况下从列名包含点号的列中读取子列的问题。解决了 #81261#82058#88169#87205Pavel Kruglov)。
  • 修复 GenerateRandom 引擎在使用非字面量参数时崩溃的问题:改为返回带有清晰错误信息的 BAD_ARGUMENTS,而不是 LOGICAL_ERROR。 #88157 (Shafi Ahmed).
  • 修复在包含 UNION 时删除未使用 PROJECTION 列的问题。修复了 #88180#88350Sema Checherinda)。
  • 修复了在主键按降序排序时 JOIN 优化中的错误分片问题。解决了 #88512#88794Amos Bird)。
  • 重新启用 s3queue_keeper_fault_injection_probablility,并修复相关问题。 #88800 (Kseniia Sumarokova).
  • 修复了多个由于在生存时间(TTL)中提前删除列而引发的问题。解决了 #88002#88860Amos Bird)。
  • 当将 temporary_files_buffer_size 设置为 0 时抛出异常。解决了 #88900#88917Vladimir Cherkasov)。
  • 修复在进行 Set 索引分析时,当谓词包含 NULL 常量时会发生的 Bad get 错误。修复了 #84856#82974#89429Nikolai Kochetov)。
  • 修复 Cannot add subcolumn X.Y: column with this name already exists 错误。解决了 #89599#89602Azat Khuzhin)。
  • 修复了 theilsUcontingency 函数中的缺陷,这些缺陷会导致结果不正确。#89760 (Nihal Z. Miaji).
  • 修复 Alias 稳定性问题:修复 SharedDatabaseCatalog 中的 StrictnessLevel,禁止目标也是别名,并实现附加接口(getSerializationHints、supportsReplication、getStoragePolicy、totalBytesUncompressed、lifetimeRows、lifetimeBytes、storesDataOnDisk、tryLockForShare、lockForShare)。解决 #89106#89812Kai Zhu)。
  • 修复了在启用 enable_lazy_columns_replication 时,远程查询中在 IN 子句内使用 ARRAY JOIN 可能导致的崩溃。解决了 #90361#89997Pavel Kruglov)。
  • 修复在使用 analyzer_compatibility_join_using_top_level_identifier 执行多个 JOIN 操作时可能出现的逻辑错误。#90010 (Vladimir Cherkasov)。
  • 修复了在某些情况下从文本格式的字符串中错误推断出无效 DateTime64 值的问题。修复了 #89368#90013Pavel Kruglov)。
  • 在从聚合状态和其他来源反序列化数据时进行大小检查。 #90031 (Raúl Marín)。
  • 根据卷的容量特性拆分分区片段范围,以在冷存储卷上启用基于生存时间 (TTL) 的删除合并。应用此补丁后,最大 TTL 小于当前时间的分区片段将会从冷存储中移除。该算法只会调度单个分区片段删除操作。#90059 (Mikhail Artemenko)。
  • 在使用 kafka_handle_error_mode = 'dead_letter_queue' 配置创建 Kafka 表且未配置 system.dead_letter_queue 表的情况下,服务器可能会发生崩溃。该问题已修复。解决了 #87573#90064Nikita Mikhaylov)。
  • 修复在使用 ARRAY JOIN 插入数据且启用 enable_lazy_columns_replication 设置时可能出现的错误 Column with Array type is not represented by ColumnArray column: Replicated#90066 (Pavel Kruglov).
  • 修复了在服务器正常关闭过程中由于错误的销毁顺序导致的崩溃。解决了 #82420#90076Nikita Mikhaylov)。
  • 修复在使用较大步长时 numbers 系统表中的逻辑错误和模运算 bug。关闭 #83398#90123Nihal Z. Miaji)。
  • 修复在使用原生 writer 进行单线程写入时,Parquet 写入未能保留原始顺序的问题。部分回退了 https://github.com/ClickHouse/ClickHouse/pull/64424/files#90126 (Arthur Passos)。
  • 不再对 LIMIT/OFFSET 表达式应用常量节点优化。修复了 #89607#90156Yakov Olkhovskiy)。
  • 修复 Hive 分区不兼容问题,避免在 25.8 中升级受阻(修复升级期间出现的错误 All hive partitioning columns must be present in the schema)。#90202Kseniia Sumarokova)。
  • 修复在使用 Glue catalog 时,Iceberg 表中 timestamp 列导致的 JSON 异常。解决了 #90210#90209Alsu Giliazova)。
  • 修复当某个 part 所含的行数少于 index_granularity 时,MergeTreeReaderIndex 中行数不匹配的问题。修复了 #89691#90254Peng Jian)。
  • 修复在 WITH FILL 查询中处理无限 nan/inf 的问题。解决了 #69261#90255Konstantin Bogdanov)。
  • 修复在 query_plan_use_logical_join_step=0 且 JOIN ON 子句中存在剩余条件时出现的 'column not found' 错误。修复了 #88635#90279Vladimir Cherkasov)。
  • 修复了一些使用聚合 PROJECTION 优化的查询问题。#90288 (János Benjamin Antal).
  • 修复在紧凑分区片段中从 JSON 读取子列时的一个错误,该错误可能导致 CANNOT_READ_ALL_DATA 报错。解决了 #90264#90302Pavel Kruglov)。
  • 现在,如果 manifest 文件中未指定排序顺序,或者与表中的 default_sort_order 不一致,ClickHouse 将不会对 Iceberg 表使用按顺序读取的优化。修复了 #89178#90304alesapin)。
  • Time 和 Time64 现在在从 DateTime 和 DateTime64 转换时会正确尊重时区(必须显示与作为 DateTime[64] 向用户显示时相同的时区时间)。修复了 #89896#90310Yarik Briukhovetskyi)。
  • 修复了一个缺陷:SELECT CAST(CAST(now(), 'Time'), 'Time64') 会产生不正确的结果。关闭 #88349#90324Yarik Briukhovetskyi)。
  • 修复了因 randomStringUTF8 中的整数溢出导致的崩溃。 #90326 (Michael Kolupaev).
  • 修复了在使用 multicluster_root_path 的多集群环境中集群发现更新的处理方式,防止出现延迟或遗漏 ZooKeeper 更新。#90341 (RinChanNOW)。
  • 修复在不存在的 JSON 路径上使用 prewhereindex_granularity_bytes=0 时可能出现的逻辑错误。解决了 #86924#90375Pavel Kruglov)。
  • 修复了 L2DistanceTransposed 中的一个错误,该错误在精度参数超出有效范围时会导致崩溃。关闭了 #90401#90405Raufs Dunamalijevs)。
  • 修复在将 Array(Dynamic) 作为参数使用时 arrayUnion 中可能出现的逻辑错误。解决了 #90270#90409Pavel Kruglov)。
  • 修复在一次 ALTER 操作中对同一个 Nested 列同时进行重命名和修改时可能出现的逻辑错误。解决了 #90406#90412Pavel Kruglov)。
  • 修复从 HTTP 参数解析 JSON/Dynamic/Variant 值的错误,解决了 #88925#90430Pavel Kruglov)。
  • 修复了 Hive 分区中的一个竞争条件,其中静态的 KeyValuePairExtractor 在并发读取文件时可能导致数据损坏或崩溃。#90474Paresh Joshi)。
  • 修复了在使用数组引用向量(默认类型为 Array(Float64)))与元素类型非 Float64(如 Float32BFloat16)的 QBit 列时,L2DistanceTransposed 中错误的距离计算问题。该函数现在会自动将引用向量转换为与 QBit 元素类型匹配的类型。修复了 #89976#90485Raufs Dunamalijevs)。
  • 修复了一个问题:对负参数调用 toDateTimeOrNull 会返回 NULL。 #90490 (Yarik Briukhovetskyi)。
  • 修复在以 Arrow 格式输出 LowCardinality(Bool/Date32) 时可能存在的逻辑错误。解决了 #83883#90505Pavel Kruglov)。
  • 修复了 IPv4 解析函数(例如 IPv4StringToNumOrDefault)在某些无效输入时返回异常值的问题。修复了 #90544。修复了 #87583#90545Michael Kolupaev)。
  • 在进行本地主机检查时如解析地址失败,则重试执行 markReplicasActive:在 DDLTask 中进行自身主机检查时,如发生异常则打印警告日志。在 DDLWorker::markReplicasActive 中,如果未找到本地主机但在集群中存在主机 ID,则抛出异常以触发重试。 #90556 (Tuan Pham Anh).
  • 修复了在极少数情况下由 equals 函数引发的逻辑错误。关闭 #88142#90557Nihal Z. Miaji)。
  • 有望修复 test_ssh/test.py::test_paramiko_password 中由 ThreadSanitizer 引发的崩溃。#90612Govind R Nair)。
  • 修复了在 concatWithSeparator 函数中使用常量非字符串列时的逻辑错误。关闭 #90596#90655Nihal Z. Miaji)。
  • 修复 INTO OUTFILE 的格式问题。解决了 #90207#90656Azat Khuzhin)。
  • 修复在执行包含子查询且 allow_statistics_optimize=1 的 mutation 时可能发生的崩溃。解决了 #90626#90664Azat Khuzhin)。
  • 修复了在同时使用 LIMIT BYGROUP BY 时的分析器校验逻辑:当 LIMIT BY 使用了不在 GROUP BY 中的列时,现在会正确报告 NOT_AN_AGGREGATE 错误,而不再是 NOT_FOUND_COLUMN_IN_BLOCK。修复 #89713#90665xiaohuanlin)。
  • 修复了在分区键中使用 LowCardinality 列时出现的类型转换错误。关闭 #89412#90666xiaohuanlin)。
  • 修复了这样的问题:当查询的过滤谓词中包含由非确定性函数(例如 shardNum()) 常量折叠得到的常量时,可能会被错误地使用查询条件缓存。#90692 (Eduard Karacharov)。
  • 修复在 JOIN ON 子句中使用 EXISTS 函数的查询触发的段错误。现在该查询会直接返回 INVALID_JOIN_ON_EXPRESSION 错误。关闭 #90698#90719Vladimir Cherkasov)。
  • 修复在使用默认数据库且没有任何表时,AccessRightsElement 出现的逻辑错误:'Inconsistent AST formatting'。#90742 (Pablo Marcos)。
  • 修复在使用 remote 表函数且将目标主机设置为 localhost 时,对 ALTER UPDATE 查询的访问权限检查问题。 #90761 (pufit).
  • 修复 named collections 中隐藏机密信息的行为,使其由 display_secrets_in_show_and_selectformat_display_secrets_in_show_and_select 控制。#90765Pablo Marcos)。
  • 禁用 enable_shared_storage_snapshot_in_query(否则会导致内存泄漏)。#90770 (Azat Khuzhin).
  • 修复在启用并行副本且使用分布式表进行 RIGHT JOIN 时出现的重复数据问题。 #90806 (zoomxi).
  • 修复 JSON 中共享数据和动态路径可能出现的潜在不一致状态,该问题可能导致逻辑错误和意外结果。#90816Pavel Kruglov)。
  • 修复在 SharedCatalog(仅 Cloud 可用功能)中,ALTER MODIFY QUERY 在 CSE 中处理 dictGet() 和字典名称时的问题。 #90860 (Azat Khuzhin).
  • 修复 String 聚合状态在内存序列化中的兼容性问题。如果在不同版本的实例上执行聚合查询,采用不同的序列化方式可能会导致重复结果。可以通过 serialize_string_in_memory_with_zero_byte 启用新的序列化方式。 #90880 (Antonio Andelic).
  • 修复在频繁 INSERT 时 Buffer 的后台刷新问题。#90892 (Azat Khuzhin).
  • 不要在 system.licenses 中列出 contrib/ 的上级目录。 #90901 (Raúl Marín).
  • 修复在读取 JSON/Dynamic/Variant 列时内存占用过高的问题。 #90907 (Pavel Kruglov)。
  • 修复 base58Decode 函数的缓冲区分配问题。#90909 (Antonio Andelic)。
  • 修复了在发送带有 finish=true 标志的响应后,从副本再次收到读取请求时可能出现的逻辑错误。该问题是由于 MergeTreeReadPoolParallelReplicas 内部的逻辑竞态条件导致的,尽管实际发生的可能性极低。#90921Nikita Taranov)。
  • 修复在部分撤销时对通配符授权的检查。添加了更多测试。#90922 (pufit)。
  • 修复了 SummingMergeTreeNested 类型 LowCardinality 列的聚合。 #90927 (Ivan Babrou).
  • 修复在处理通配符撤销时的全局权限逻辑,解决撤销通配符授权时可能会误撤销某些全局级别权限(例如 CREATE USER)的问题。#90928 (pufit).
  • 修复使用 Azure 列举 blob 时可能出现的无限循环问题。 #90947 (Julia Kartseva).
  • 修复 Buffer 过于频繁刷写(消耗大量 CPU 资源并产生海量日志)。 #91000 (Azat Khuzhin).
  • ... 不再允许将 adaptive_write_buffer_initial_size 设置为 0。 #91001 (Pedro Ferreira).
  • 修复了 JSON 中的一个错误:在 Compact 分区片段中读取子对象时,如果某个路径既可能位于共享数据中,也可能位于动态路径中,而此时禁用了 write_marks_for_substreams_in_compact_parts,会导致问题。 #91014 (Pavel Kruglov)。
  • 修复在不带参数的 dictGet 的 CTE 中发生的 std::out_of_range 异常。关闭 #91027#91022Pavel Kruglov)。
  • 修复在变更操作中从物化列读取动态子列的问题。解决 #90653#91040Pavel Kruglov)。
  • 修复了在与空数组和 isNull 函数一起使用时 arrayFilter 函数不起作用的问题。关闭 #73849#91105Nihal Z. Miaji)。
  • 修复在表中某一列为空元组列时 ARRAY JOIN 的逻辑错误。关闭 #90801#91123Nihal Z. Miaji)。
  • 修复在旧分区片段中通过 ALTER ADD COLUMN 新增的列的惰性物化问题。#91142Pavel Kruglov)。
  • 修复在 Summing/Aggregating/Coalescing MergeTree 中合并 JSON 列的问题。此前在写入分区片段时,可能会导致出现意外的动态路径。#91151 (Pavel Kruglov).
  • 修复在向紧凑分区片段写入时可能出现的动态结构不一致问题,该问题可能导致段错误(segfault)。 #91152 (Pavel Kruglov).
  • 修复对科学计数法表示的次正规浮点数值的解析。关闭 #78903#91162Nihal Z. Miaji)。
  • 修复在对来源为具有隐式 schema 的数据源的子查询执行 INSERT SELECT 时出现的错误 schema 推断问题。 #91204 (Pervakov Grigorii).
  • 修复 https://github.com/clickhouse/clickhouse/issues/91206:当我们创建带有 statistics 的表、写入一些数据并删除其中一个 statistics 后,再次读取时会发生崩溃。这是因为我们假定序列化和反序列化时 statistics 的类型集合保持一致。在此修复中,我们会检查当前元数据中是否包含已序列化的 statistics;如果不包含,则构造一个 mock statistics,并仅为了跳过它而进行反序列化。#91227 (Han Fei)。
  • 修复了向 CoalescingMergeTree 中包含 JSON/Dynamic 和 LowCardinality 的 Tuple 列插入数据的问题。关闭 #91215#91270Pavel Kruglov)。
  • 修复 SYSTEM DROP FILESYSTEM CACHE ON CLUSTER 命令。 #91304 (Anton Ivashkin).
  • 修复可能的逻辑错误 "Bad cast from type DB::ColumnSparse to DB::ColumnNullable"。关闭 #91284#91309Pavel Kruglov)。
  • 修复了一个崩溃问题:当恶意构造的字节流被反序列化为嵌套的 QBit 类型时会导致崩溃,这在理论上本不应发生,但可能被利用来使服务器崩溃。 #91313 (Raufs Dunamalijevs)。
  • 修复 Replicated 数据库中带有空参数的 Alias 表问题。已解决 #91378#91382Kai Zhu)。
  • 当前该 setting 为 false,因此当异步插入队列刷新到远程服务器时,插入始终以同步方式执行。即使对某个用户将该 setting 设为 True 也是如此。#91386 (Mikhail f. Shiryaev)。
  • 从合并算法的头部移除稀疏列。修复了 #91377#91396Pavel Kruglov)。
  • 修复 25.8 版本中的 Hive 分区 bug,该问题可能会错误地抛出异常 A hive partitioned file can't contain only partition columns#91403 (Kseniia Sumarokova).
  • 修复在字典类型支持 Hierarchy 但没有任何列为 HIERARCHICAL 时,由 NULL 导致的 dictGetDescendants 崩溃。修复 #92026。修复 #92121#91420Nihal Z. Miaji)。
  • 修复在 IN 函数中使用 lambda 表达式和非 const 元组参数时发生崩溃的问题。关闭 #91379#91446Nihal Z. Miaji)。
  • 修复了由 MaterializedView 向不支持并行写入的存储执行插入操作时触发的并行写入问题。#91449 (Pervakov Grigorii)。
  • 处理 Ytsaurus XML 字典中的 NULL 值。 #91465 (MikhailBurdukov).
  • 修复了在使用类似 SET param_q=[1,2,3,4]; SELECT {q:QBit(Float32,4)} 的查询参数时会导致 QBit 类型出错的问题。#91488Raufs Dunamalijevs)。
  • 修复在常量表达式中使用 untuple 时触发的 LOGICAL_ERROR。 #91507 (Pervakov Grigorii).
  • 修复 librdkafka 中可能存在的数据竞争。 #91521 (János Benjamin Antal).
  • 修复因在 remote 函数中使用星号参数而引起的逻辑错误。关闭 #90568#91524Nihal Z. Miaji)。
  • 修复了在从 ORC 格式读取 Date 和 DateTime64 类型数据时可能发生的溢出问题,关闭了 #70976#91572Yarik Briukhovetskyi)。
  • 禁止对 Object Storage 表引擎执行 ALTER 操作。例如,执行 ALTER ADD PROJECTION 可能会导致无法重启服务器,因为 Object Storage 引擎不支持 PROJECTION。 #91573 (Nikolay Degterinsky)。
  • 修复了在使用非常量参考向量(例如来自表的向量)时,L2DistanceTransposed 返回错误结果的问题。#91517#91593Raufs Dunamalijevs)。
  • 修复了在调度阶段,JOIN 条件为 FALSE 时会返回 LOGICAL_ERROR 的问题。关闭 #91173#91598Yarik Briukhovetskyi)。
  • 修复在使用“额外过滤条件”的 join 中出现的内存占用升高问题,关闭 #91011#91664Vladimir Cherkasov)。
  • 修复了在使用视图且启用并行副本时的 JOIN 查询。#91813 (Igor Nikonov)。
  • 修复了 Delta Lake 设置项 delta_lake_snapshot_version 的问题:在此前已经使用过快照版本的情况下,如果与表引擎(而非表函数)一起使用并将其值设为 -1(禁用),可能会产生不正确的结果。关闭 #87676#91818Kseniia Sumarokova)。
  • 修复 RecursiveCTEChunkGenerator 中的 LOGICAL_ERROR。 #91827 (Pablo Marcos).
  • 修复在使用 FINAL 和 PREWHERE 的查询中出现的块结构不匹配问题。 #91847 (Antonio Andelic).
  • 修复在启用 join_use_nulls 时,多个 join 与 cross join 同时使用所导致的逻辑错误。#91853Vladimir Cherkasov)。
  • 为共享数据和动态路径中可能因 https://github.com/ClickHouse/ClickHouse/pull/90816 中已修复的 bug 而出现重复路径的 JSON 添加修复机制。#91886Pavel Kruglov)。
  • 修复 ORC 读取器在读取使用 DICTIONARY_V2 编码且仅包含 NULL 值的字符串列时出现的错误。 #91889 (Peng Jian).
  • 修复了 Tuple 列中稀疏和 Nullable 子流之间的序列化不一致问题,该问题可能导致分区片段损坏或在读取期间发生崩溃。此修复对应 https://github.com/ClickHouse/ClickHouse/pull/91851。@Algunenano 能否请你帮忙检查一下这是否可以修复私有仓库中的压力测试?@CurtizJ 也能否请你帮忙看一下?谢谢!#91932 (Amos Bird)。
  • 修复了在 plain-rewritable 类型磁盘上创建备份时出现的 Directory '{}' does not exist (LOGICAL_ERROR) 错误。 #91935 (Julia Kartseva)。
  • 修复在连接具有命名集合的 MongoDB 时可能发生的崩溃。 #91959 (Antonio Andelic).
  • 修复在对紧凑分区片段执行某些 ALTER 查询后可能出现的 "TOO_MANY_MARKS" 错误。#91980 (alesapin).
  • 关闭 https://github.com/clickhouse/clickhouse/issues/87417:修复 v1 格式写入 schema 中的错误:字段 "added_snapshot_id" 的类型应该是 "long" 而不是 "null, long",因为这是必填字段。该 bug 会导致与 Spark 等其他系统不兼容。当我们混用这些系统的 manifest 文件时,就会触发该 bug。 #92078 (Han Fei)。
  • 修正了 readWKTreadWKB 的名称,这两个函数在之前的版本中使用了错误的命名风格。 #92094 (Alexey Milovidov).
  • 修复 midpoint 函数中的多处逻辑错误、溢出问题和功能性缺陷。关闭 #91816#92102Nihal Z. Miaji)。
  • 修复了在使用稀疏编码读取某些子列(例如字符串长度)时可能出现的错误结果。#92156Pavel Kruglov)。
  • 修复 system.view_refreshes 失败并报错 No macro 'replica' in config 的问题。 #92203 (Michael Kolupaev).
  • 修复在 format 中进行 UDF 替换时的问题。 #92210 (Raúl Marín).
  • ddlworker::markreplicasactive 中,如果未找到任何活跃主机,但 remote_servers 中存在一些 host_id,我们会记录一条警告日志而不是抛出异常。 #92223 (Tuan Pham Anh)。
  • 为运算符 INNOT IN 添加括号包裹。修复了 #85075#92225Mikhail f. Shiryaev)。
  • 修复 KeeperMap 和 Memory 表的备份问题。使用这两种引擎之一并将 max_compress_block_size 设置为 0 时创建这些表的备份可能会导致崩溃。 #92237 (Antonio Andelic)。
  • 修复了在从 Log 引擎中同时读取 String 数据和 .size 子列时发生的崩溃。修复了 #89909。其中包含了 #92290 中的一些提交。#92341Amos Bird)。
  • 修复在 caseWithExpression 函数参数中使用 Nothing 类型时产生的逻辑错误。关闭 #85354#92351Nihal Z. Miaji)。
  • 修复在出现 MEMORY_LIMIT_EXCEEDED 后聚合函数可能崩溃的问题。 #92390 (Azat Khuzhin).

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

ClickHouse 25.11 版本,2025-11-27

向后不兼容的变更

  • 移除已弃用的 Object 类型。#85718Pavel Kruglov)。
  • 移除已过时的 LIVE VIEW 功能。如果你正在使用 LIVE VIEW,将无法升级到新版本。#88706Alexey Milovidov)。
  • 在之前的版本中,Geometry 类型是 String 的别名,但现在它是一个完整的独立类型。#83344scanhex12)。
  • 对 MergeTree 表的 Wide 数据部分中为 Variant 类型子列创建的文件名进行转义。此更改会破坏与旧的 Variant/Dynamic/JSON 数据类型表的兼容性。它修复了在 Variant 中存储包含特殊符号的数据类型的问题(例如带有包含 \ 的特定时区的 DateTime)。可以通过修改 MergeTree 设置 escape_variant_subcolumn_filenames 来禁用转义(如果要保持兼容性,请在 MergeTree 的配置中禁用此设置,或者在升级前将 compatibility 设置为之前的版本)。解决了 #69590#87300Pavel Kruglov)。
  • 默认为 String 数据类型启用 with_size_stream 序列化格式。此更改向后兼容,但新的序列化格式仅从 25.10 版本开始支持,这意味着无法降级到 25.10 之前的版本。如果你希望保留降级到 25.9 及更早版本的可能性,请在服务器配置的 merge_tree 部分中将 serialization_info_version 配置为 basic,并将 string_serialization_version 配置为 single_stream#89329Alexey Milovidov)。
  • 为 HTTP 结果响应增加异常标记支持,以便客户端能够更可靠地解析异常。解决了 #75175。为了在不同格式之间保持一致,设置 http_write_exception_in_output_format 默认是禁用的。#88818Kaviraj Kanagaraj)。虽然理论上不应该破坏任何现有行为(最坏情况下,只是在异常消息中添加了一段奇怪的字符串),但仍然有理由在变更日志中将其归类为“向后不兼容的变更”,以提醒注意(因为很难预料某些脚本会如何解析异常消息)。
  • 禁止在共享对象存储路径之上创建多个 plain-rewritable 磁盘,因为在不同元数据存储事务发生冲突时,这可能导致未定义行为。#89038Mikhail Artemenko)。
  • 修复 Kafka 存储 SASL 设置的优先级。现在,在 CREATE TABLE 查询中指定的表级 SASL 设置会正确覆盖配置文件中指定的 consumer/producer 级别的设置。#89401János Benjamin Antal)。
  • 现在会将 Parquet 中无时区的时间戳(isAdjustedToUTC=false)读取为 DateTime64(..., 'UTC'),而不是 DateTime64(...)。这样虽然仍不完全正确,但在将此类 UTC 时间戳转换为字符串时,可以得到对应正确本地时间的表示。使用 input_format_parquet_local_time_as_utc = 0 可获得旧行为。解决了 #87469#87872Michael Kolupaev)。
  • T64 codec 做了一个小改进:它不再接受与压缩元素大小未对齐的数据类型,否则会触发一个 bug。解决了 #89282#89432yanglongwei)。

新功能

  • 引入 Geometry 类型,并支持以 WKBWKT 格式读取该类型。在之前的版本中,Geometry 类型是 String 的别名,但现在它是一个功能完备的独立类型。#83344 (scanhex12)。
  • 新增了 SQL 语句 EXECUTE AS 以支持用户身份模拟。修复了 #39048#70775Shankar)。
  • 添加 naiveBayesClassifier FUNCTION,用于基于 n‑gram 的朴素贝叶斯对文本进行分类。 #88677 (Nihal Z. Miaji)。
  • LIMITOFFSET 添加对小数值的支持,用于按比例选择表的一部分数据。关闭 #81892#88755Ahmed Gouda)。
  • ClickHouse 的 Microsoft OneLake 目录子系统。 #89366 (scanhex12).
  • 新增 flipCoordinates 函数,用于在数组中展开指定数量的维度,并在 Tuple 列内部交换指针。解决 #79469#79634Sachin Kumar Singh)。
  • 新增 system.unicode 表,其中包含 Unicode 字符及其属性列表。关闭 #80055#80857wxybear)。
  • 新增 MergeTree 设置项 merge_max_dynamic_subcolumns_in_wide_part,用于在合并后限制 Wide 部分中的动态子列数量,而不受数据类型中指定参数的影响。#87646 (Pavel Kruglov)。
  • 新增对 cume_dist 窗口函数的支持。修复了 #86920#88102 (Manuel)。
  • 现在,在构建文本索引时,用户可以添加一个新的参数 preprocessor。该参数可以是任意表达式,用于在分词之前对每个文档进行预处理。#88272 (Jimmy Aguilar Mena)。
  • X-ClickHouse-ProgressX-ClickHouse-Summary 中新增 memory_usage 字段。该字段可用于在客户端实时收集查询的内存使用情况。#88393Christoph Wurm)。
  • 添加 into_outfile_create_parent_directories 设置,用于在执行 INTO OUTFILE 时自动创建父目录,从而避免因输出路径不存在而报错。这简化了查询将结果写入多级目录时的工作流。修复了 #88610#88795Saksham)。
  • 支持在临时表中使用 CREATE OR REPLACE 语法。关闭 #35888#89450Aleksandr Musorin)。
  • 支持 arrayRemove FUNCTION,用于从数组 arr 中移除所有等于 elem 的元素。该功能仅为与 Postgres 的兼容性而提供,因为 ClickHouse 已经提供了功能更强大的 arrayFilter FUNCTION。解决 #52099#89585tiwarysaurav)。
  • 新增标量函数 midpoint,用于计算平均值。解决 #89029#89679simonmichal)。
  • Web UI 现在提供了一个下载按钮。即使 UI 只显示部分结果,也会下载完整结果。#89768 (Alexey Milovidov)。
  • 添加 arrow_flight_request_descriptor_type 设置,以支持 Dremio 和其他需要 command 样式 descriptor 的 Arrow Flight 服务器。实现了 #89523#89826Shreyas Ganesh)。
  • 新增聚合函数 argAndMinargAndMax,用于返回参数及其对应的极值。在之前的版本中,也可以通过使用元组作为参数来实现这一点。 #89884 (AbdAlRahman Gad)。
  • 用于写入和校验 Parquet 校验和的设置。#79012 (Michael Kolupaev).
  • 为 Kafka 表引擎新增 kafka_schema_registry_skip_bytes 设置,用于在解析消息负载前跳过封装头部字节(例如 AWS Glue Schema Registry 的 19 字节前缀)。这使 ClickHouse 能够消费来自在消息中添加元数据头的 schema registry 的消息。#89621 (Taras Polishchuk).
  • 新增 h3PolygonToCells 函数,可使用 h3 六边形填充几何区域。解决 #33991#66262Zacharias Knudsen)。
  • 新增虚拟列 _tagsMap(String, String)),其中包含 S3 中该 blob 关联的所有标签(注意,如果该 blob 没有任何标签,则不会产生额外请求)。解决 #72945#77773Zicong Qu)。

实验特性

  • 支持根据 RFC 8555 从 ACME 提供商(如 Let's Encrypt)获取 TLS 证书。这使得可以在分布式集群上自动配置 TLS。#66315 (Konstantin Bogdanov)。
  • 支持 Prometheus HTTP Query API 的部分功能。要启用它,请在配置文件的 <prometheus> 部分添加一个类型为 query_api 的规则。已支持的处理程序为 /api/v1/query_range/api/v1/query#86132 (Nikita Mikhaylov)。
  • 全文搜索现已进入 beta 阶段(此前为实验阶段)。#88928 (Robert Schulze)。
  • Alias 标记为实验特性,可通过 allow_experimental_alias_table_engine = 1 启用。#89712 (Kai Zhu)。

性能优化

  • Parquet Reader v3 现已默认启用。 #88827 (Michael Kolupaev).
  • 分布式执行:将任务按行组 ID 拆分比按文件拆分更合适。#87508 (scanhex12).
  • RIGHTFULL JOIN 现在使用 ConcurrentHashJoin;这意味着这些类型的 JOIN 现在可以以更高的并行度运行。在多种场景下,RIGHT 和 FULL JOIN 的性能最多可提升两倍。修复了 #78027#78462Yarik Briukhovetskyi)。
  • 针对查询中含有大值的常量表达式进行了优化。修复了 #72880#81104Yakov Olkhovskiy)。
  • 在具有超过 10K 分区片段的表上进行大量分区裁剪时,SELECT 查询性能最高可提升 8 倍。#85535James Morrison)。
  • 当查询使用固定哈希映射来存储聚合状态(按小整数分组)时,ClickHouse 会并行合并这些聚合状态,从而加速查询。#87366Jianfei Hu)。
  • 允许将使用 _part_offset 的 SELECT 且带有不同 ORDER BY 的投影用作二级索引。启用后,可以针对某些查询谓词,通过读取投影分区片段并生成位图,在 PREWHERE 阶段高效过滤行。这是实现投影索引的第三步,继 #80343 之后。#81021Amos Bird)。
  • 在一些少见的 Aarch64 系统以及可能的其他架构/内核组合上修复 VDSO。#86096 (Tomas Hulata)。
  • 通过简化代码并微调选择算法,提升 LZ4 解压速度。#88360Raúl Marín)。
  • S3 在内部基于键名前缀对对象进行分区,并会自动扩展,以支持每个分区上的高请求速率。此更改引入了两个新的 BACKUP 设置项:data_file_name_generator 和 data_file_name_prefix_length。当 data_file_name_generator=checksum 时,备份数据文件会使用其内容的哈希值来命名。示例:对于 checksum = abcd1234ef567890abcd1234ef567890data_file_name_prefix_length = 3,生成的路径为:abc/d1234ef567890abcd1234ef567890。由此得到的键分布改进了在 S3 分区之间的负载均衡,并降低了被限流的风险。 #88418 (Julia Kartseva)。
  • 通过缓存字典块并使用哈希表进行 token 查找(替代二分查找),提升了文本索引的性能。 #88786 (Elmi Ahmadov).
  • 查询现在可以同时利用 optimize_read_in_orderquery_plan_optimize_lazy_materialization。已解决 #88767 中的问题。#88866Manuel)。
  • 为包含 DISTINCT 的查询使用聚合 PROJECTION。修复 #86925#88894Nihal Z. Miaji)。
  • 缓存倒排列表(posting lists),以提升连续多次运行时的性能。 #88912 (Elmi Ahmadov).
  • 当输入的排序顺序与 LIMIT BY 键一致时,以流式方式执行 LIMIT BY 转换。 #88969 (Eduard Karacharov).
  • 在某些情况下允许将 ANY LEFT JOINANY RIGHT JOIN 重写为 ALL INNER JOIN#89403Dmitry Novik)。
  • 降低日志记录的开销:为每条日志记录使用更少的原子操作。#89651 (Sergei Trifonov).
  • 当在具有多个 JOIN 的查询中启用运行时过滤器并添加多个运行时过滤器时,将新添加的过滤步骤也进行下推,并使其优先于其他过滤步骤。#89725Alexander Gololobov)。
  • 通过减少合并哈希表的开销,略微提升某些 uniqExact 操作的速度。#89727 (Raúl Marín)。
  • 将延迟物化的行数上限从 10 提升到 100。#89772Alexey Milovidov)。
  • 默认开启 allow_special_serialization_kinds_in_output_formats 设置。这将减少内存占用,并在某些行输出格式中提升 Sparse/Replicated 列输出的查询性能。 #89402 (Pavel Kruglov).
  • ALTER TABLE ... FREEZE 查询增加了并行化支持。 #71743 (Kirill)。
  • 为基于 bcrypt 的认证添加缓存。 #87115 (Nikolay Degterinsky).
  • 如果在带有 FINAL 的查询中使用的跳过索引建立在主键列上,则无需再执行检查其他分区片段中主键交集的额外步骤,该步骤现已不再执行。修复了 #85897#88368Shankar Iyer)。
  • 优化项 enable_lazy_columns_replication 现已默认启用,可在 JOIN 操作中节省内存占用。 #89316 (Alexey Milovidov)。
  • 为每个表引入按表维护的基于 ColumnsDescription 的分区片段缓存,当表包含大量分区片段和大量列时可减少内存使用。#89352 (Azat Khuzhin)。
  • 为文本索引的反序列化头部引入了缓存,以减少 I/O 并提升查询性能。可以通过新的服务器设置项进行配置:- text_index_header_cache_policy - text_index_header_cache_size - text_index_header_cache_max_entries - text_index_header_cache_size_ratio#89513Elmi Ahmadov)。

改进

  • 当启用 use_variant_as_common_type 时,如有需要,UNION 应将类型统一为 Variant。解决了 #82772#83246Mithun p)。
  • 现在可以将 SQL 中定义的角色授予在 users.xml 中定义的用户。 #88139 (c-end).
  • 记录内部查询(例如由字典、可刷新materialized view 等在内部执行的查询),并在 system.query_log 中新增 is_internal 列。 #83277 (Miсhael Stetsyuk)。
  • 增强了 IS NOT DISTINCT FROM (<=>) 运算符:增加对反向运算符 IS DISTINCT FROM 的支持,并支持不同类型但数值兼容的操作数(例如 Nullable(UInt32)Nullable(Int64))。解决了 #86763#87581yanglongwei)。
  • 在交互模式下,clickhouse-clientclickhouse-local 会在命令行中高亮显示与光标下当前标识符同名的其他标识符。#89689 (Alexey Milovidov).
  • 与输出格式相关的设置现在不再影响查询缓存。此外,查询缓存会忽略 http_response_headers 设置。这样可以支持诸如在 Web UI 中从缓存下载查询结果等功能。#89756Alexey Milovidov)。
  • 当使用查询结果缓存时,HTTP 接口会提供 AgeExpires 响应头。Age 头的存在表明结果是否来自缓存,而 Expires 则会在首次写入时设置。引入新的 profile events:QueryCacheAgeSecondsQueryCacheReadRowsQueryCacheReadBytesQueryCacheWrittenRowsQueryCacheWrittenBytes#89759 (Alexey Milovidov)。
  • 即使启用了 disable_insertion_and_mutation(即在 ClickHouse Cloud 中的只读仓库),也允许向 remote 和数据湖表插入数据。#88549Alexander Tokmakov)。
  • 新增查询语句 SYSTEM DROP TEXT INDEX CACHES#90287 (Anton Popov)。
  • 默认启用 enable_shared_storage_snapshot_in_query 以提供更好的一致性保证。预期不会带来任何负面影响。#82634 (Alexey Milovidov)。
  • 新增了 send_profile_events 设置,使客户端在未使用 profile events 时可以减少网络流量。#89588Kaviraj Kanagaraj)。
  • 允许在每个查询级别禁用邻近段的后台下载。修复 #89524#89668tanner-bruce)。
  • 在 ReplicatedMergeTree 表存在损坏磁盘的情况下,允许执行 FETCH PARTITION#58663 (Duc Canh Le).
  • 修复在 MySQL 数据库引擎中获取 MySQL 表结构时出现的未捕获异常。#69358Duc Canh Le)。
  • 所有 DDL ON CLUSTER 查询现在都会在原始发起查询的 USER 上下文中执行,从而实现更精确的访问权限校验。#71334 (pufit).
  • Parquet 中,当 UUID 以逻辑类型为 UUIDFixedString(16) 表示时,现已支持该表示方式。 #74484 (alekseev-maksim).
  • 在非服务端二进制可执行文件中默认禁用 ThreadFuzzer。 #89115 (Raúl Marín).
  • 通过推迟对其进行物化,使查询计划中的优化对关联子查询的输入子计划可见。属于 #79890 的一部分。 #85455 (Dmitry Novik)。
  • 现在可以在 clickhouse-client 中查看带有 SELECTCREATE OR REPLACE TABLE 查询的进度条、日志和性能统计信息。即使该 SELECT 非常耗时,此查询也不会再导致超时。已解决 #38416#87247Diskein)。
  • 在哈希函数中支持 JSONDynamic 类型。解决了 #87734#87791Pavel Kruglov)。
  • 实现 ArrowFlight 服务器中缺失的部分功能。 #88013 (Vitaly Baranov).
  • 为 server 和 keeper 添加多个直方图指标,用于监控 keeper 请求执行各阶段的耗时。将向 server 添加以下指标:keeper_client_queue_duration_millisecondskeeper_client_send_duration_millisecondskeeper_client_roundtrip_duration_milliseconds。将向 keeper 添加以下指标:keeper_server_preprocess_request_duration_millisecondskeeper_server_process_request_duration_millisecondskeeper_server_queue_duration_millisecondskeeper_server_send_duration_milliseconds#88158Miсhael Stetsyuk)。
  • EXPLAIN 查询新增 input_headers 选项,将输入头部信息添加到各个步骤中。 #88311 (János Benjamin Antal)。
  • 新增了 profile events,用于统计被限流器延迟的 S3 和 AzureBlobStorage 请求数量。修复了与磁盘相关和与非磁盘相关的 ThrottlerCount profile events 之间的不一致问题。现在 AzureBlobStorage 的 HTTP DELETE 请求不会再被限流。#88535 (Sergei Trifonov)。
  • 缓存表级统计信息,新增两个设置:MergeTree 表设置 refresh_statistics_interval 表示刷新统计信息缓存的时间间隔,0 表示不创建缓存。会话设置 use_statistics_cache 表示在查询中是否使用表级统计信息。有时我们希望获得更精确的统计信息,因此可以选择不使用缓存。#88670 (Han Fei).
  • 修复了 ArrayMap 的二进制反序列化逻辑,在校验大小限制时改为使用 max_binary_array_size 设置而不是 max_binary_string_size。这确保在读取 RowBinary 格式时会应用正确的限制。#88744 (Raufs Dunamalijevs)。
  • 引入了 LockGuardWithStopWatch 类,并在后台线程池中用于执行合并操作。如果某个互斥量被持有超过一秒,或者某个线程在一秒内始终无法获取该互斥量,将打印一条警告信息。将 MergeMutateSelectedEntry 析构函数中开销较大的代码移动到 finalize 方法中,以避免在 MergeTreeBackground 执行器中持有锁的时间过长。#88898Nikita Mikhaylov)。
  • 当在 endpoint 中未指定 region 时,自动允许对 S3 使用需显式启用的 AWS 区域。参考:opt-in AWS regions#88930Andrey Zvonov)。
  • 用户现在可以在分页器运行时,通过在 clickhouse-client 中按下 Ctrl-C 来取消当前查询。解决了 #80778#88935Grigorii)。
  • 即使值为负,Web UI 也会在表格中显示条形。由此可以显示正负两侧采用不同颜色的双向条形图。#89016Alexey Milovidov)。
  • 禁用 shared_merge_tree_create_per_replica_metadata_nodes,以减少 SharedMergeTree 在 Keeper 中的元数据存储量。 #89036 (Alexander Tokmakov)。
  • 使 S3Queue 遵循 disable_insertion_and_mutation 服务器设置。 #89048 (Raúl Marín).
  • 将 25.6 版本中的默认 s3_retry_attempts 设置为 500,以确保在发生 S3 重新分区且 S3 持续超过 10 分钟返回 SlowDown(减速)错误时,备份仍能成功完成。 #89051 (Nikita Mikhaylov).
  • 现在可以通过 kafka_compression_codeckafka_compression_level 设置,为两个 Kafka 引擎中的 Kafka 生产者指定压缩算法和压缩级别。#89073 (János Benjamin Antal)。
  • system.columns 中新增一列 statistics,用于指示为该表构建的统计信息类型。如果某种类型的统计信息是自动创建的,则会在后缀中标记为 (auto)。#89086 (Han Fei)。
  • 在向 *Cluster 表函数传递泛型展开而非集群名称时,优化错误信息。#89093 (Konstantin Bogdanov)。
  • YTsaurus:允许将 replicated_table 用作数据源。#89107 (MikhailBurdukov)。
  • 在 CLI 中,以空白字符开头的查询将不再保存到历史记录中。#89116 (Konstantin Bogdanov)。
  • 支持将字符串数组作为 hasAnyTokenshasAllTokens 函数的输入。#89124 (Elmi Ahmadov)。
  • 修改 plain-rewritable 磁盘在内存中存储元数据的方式,修复了与目录嵌套及其相关的大量 bug。#89125 (Mikhail Artemenko).
  • 在查询 Iceberg 表时,IN 表达式中的子查询现在会在分区裁剪分析之前被正确预先计算。 #89177 (Daniil Ivanik)。
  • 默认启用 create_table_empty_primary_key_by_default。这可以提高易用性。 #89333 (Alexey Milovidov).
  • 修复 Backup 数据库引擎中的错误,该错误可能导致在使用 SHOW CREATE DATABASE 或从 system.databases 中查询 engine_full 时生成无效查询。修复 #89477#89341Alexey Milovidov)。
  • 在之前的版本中,如果在 CREATE TABLE 查询中未指定表引擎,设置 create_table_empty_primary_key_by_default 将不会生效。#89342Alexey Milovidov)。
  • chdig 更新至 v25.11.1,包含对日志记录的重大改进和其他多项增强(25.11 的发行说明)。#89957Azat Khuzhin)。(25.10 的发行说明)。#89452Azat Khuzhin)。
  • 将 Web UI 中查询文本区域的调整大小控件改为全宽,这样使用起来会稍微方便一些。另外,此前在 iPad 上的 Safari 浏览器中无法使用浏览器原生的调整控件,应用此更改后,至少可以通过拖动文本区域的底部来调整大小。#89457 (Alexey Milovidov)。
  • 改进了哈希连接生成结果过程中的内存跟踪。此前,在生成连接结果时的临时内存分配未被正确跟踪,可能导致内存使用超出限制。 #89560 (Azat Khuzhin).
  • 异步服务器日志:提前刷新并增大默认队列大小。 #89597 (Raúl Marín).
  • 修复 system.asynchronous_metrics 中错误的 FilesystemCacheBytes(以及其他相关指标)值。仅对文件系统缓存执行一次 SYSTEM 查询。为缓存提供一个原子视图,该视图在 system.filesystem_caches 中指向同一路径。#89640 (Azat Khuzhin)。
  • system.view_refreshes 中部分列的说明进行了澄清。#89701 (Tuan Pham Anh).
  • 与 STS 端点交互时缓存 S3 凭据,从而可以在不同的函数调用之间复用这些凭据。可通过 s3_credentials_provider_max_cache_size 控制缓存的凭据数量。#89734Antonio Andelic)。
  • 修复在其下方存在多个表达式步骤时运行时过滤器下推的问题。 #89741 (Alexander Gololobov).
  • 如果系统内存低于 5GB,默认不对可执行文件执行 mlock 操作。 #89751 (Alexey Milovidov).
  • Web UI 中的类型提示不再溢出到表头区域。同时修复了工具提示的显示问题——它们不再被表头遮挡。 #89753 (Alexey Milovidov).
  • 在 Web UI 中显示表属性。点击行数或字节数会打开一个来自 system.tables 的查询。点击表引擎会打开 SHOW TABLES#89771 (Alexey Milovidov)。
  • 为使用不支持追加写入的磁盘的表提供对 non_replicated_deduplication_window 的支持。解决 #87281#89796Tuan Pham Anh)。
  • 在命令 SYSTEM FLUSH ASYNC INSERT QUEUE 中新增了可指定要刷新的表列表的功能。 #89915 (Sema Checherinda).
  • system.part_log 中存储去重块的 ID。#89928Sema Checherinda)。
  • 将文件系统缓存设置 keep_free_space_remove_batch 的默认值从 10 更改为 100,因为这样在实践中更优。#90030 (Kseniia Sumarokova)。
  • 引入 TTL DROP 类型的合并,并且在执行此类合并之后,不再更新后续的删除 TTL 合并计划。#90077 (Mikhail Artemenko)。
  • 在 S3Queue 清理过程中,对 RemoveRecursive Keeper 请求使用更低的节点数量上限。#90201Antonio Andelic)。
  • 使 SYSTEM FLUSH LOGS 查询即使在日志为空时也会等待表创建完成。#89408 (János Benjamin Antal)。
  • 修复在分布式合并聚合中涉及多个远程分片,或存在 IN 子查询时 rows_before_limit_at_least 不正确的问题。此更改修复了 #63280#63511 (Amos Bird)。
  • 修复了在执行 INSERT INTO ... SELECT 查询后会出现 0 rows in set 的问题。关闭了 #47800#79462Engel Danila)。

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复 multiIf 在常量参数和短路求值场景下的问题。关闭 #72714#84546Yakov Olkhovskiy)。
  • 修复在对带有子查询约束的表执行 SELECT 时出现的逻辑错误。解决了 #84190#85575Pervakov Grigorii)。
  • 修复了在使用带问号的 URI 执行特殊查询时出现的一个错误。 #85663 (Yarik Briukhovetskyi).
  • 修复了在 EXPLAIN indexes = 1 输出中有时会缺少列的问题。已解决 #86696#87083Michael Kolupaev)。
  • 修复在使用并行副本时可能出现的错误:Cannot add subcolumn with parallel replicas。关闭 #84888#87514Pavel Kruglov)。
  • 在 parquet 写入器中,以正确格式输出 created_by 字符串,例如使用 ClickHouse version 25.10.1 (build 5b1dfb14925db8901a4e9202cd5d63c11ecfbb9f),而不是 ClickHouse v25.9.1.1-testing。修复 parquet 读取器与由旧版 parquet-mr 写出的不规范文件的兼容性。#87735Michael Kolupaev)。
  • 修复 cramersVcramersVBiasCorrectedtheilsUcontingency 中 phi-squared 计算错误从而导致结果不正确的问题。 #87831 (Nihal Z. Miaji).
  • 修复在 JSON 中读取由 Float 和 Bool 混合组成的数组的问题。此前插入此类数据会抛出异常。#88008Pavel Kruglov)。
  • 在 TCPHandler 中使用 shared_ptr 管理 QueryState,以便在 setProgressCallback、setFileProgressCallback 和 setBlockMarshallingCallback 中检测该状态是否无效。 #88201 (Tuan Pham Anh)。
  • 修复在 query_plan_optimize_join_order_limit &gt; 1 时对 CROSS JOIN 重排的逻辑错误,关闭 #89409#88286 (Vladimir Cherkasov)。
  • 修复 #88426 1. 禁止在 Alias 中显式定义列,列会自动从目标表中加载,以确保别名始终与目标表的表结构匹配。2. 通过 IStorage 代理更多方法。#88552 (Kai Zhu)。
  • 在恢复后,Replicated 数据库的副本可能会长时间卡住,并持续打印类似 Failed to marked query-0004647339 as finished (finished=No node, synced=No node) 的消息,现已修复。#88671 (Alexander Tokmakov)。
  • 修复在使用支持子查询的新分析器时可能出现的“Context has expired”错误。 #88694 (Azat Khuzhin).
  • 修复了当 input_format_parquet_local_file_min_bytes_for_seek 设置为 0 时 Parquet 读取器中的段错误。解决了 #78456#88784Animesh)。
  • 修复当主键为逆序(降序)时 min(PK)/max(PK) 结果不正确的问题。从而修复了 #83619#88796Amos Bird)。
  • 修复在对内部表执行 DROP 时,max_table_size_to_dropmax_partition_size_to_drop 设置的大小限制未正确传递的问题。#88812 (Nikolay Degterinsky).
  • 修复 top_k 在仅使用单个参数调用时不遵守阈值参数的问题,解决了 #88757#88867Manuel)。
  • 需要通过 SSL 建立连接的 ArrowFlight endpoint 源(例如位于 AWS ALB 之后)现在可以正确请求特定的数据集。#88868 (alex-shchetkov)。
  • 修复对通过 ALTER 语句添加的非物化 Nested(Tuple(...)) 的处理。修复 #83133#88879Azat Khuzhin)。
  • 修复函数 reverseUTF8 中的错误。在早期版本中,它会错误地反转长度为 4 的 UTF-8 代码点的字节顺序。这修复了 #88913#88914Alexey Milovidov)。
  • 修复 icebergS3Cluster 协议实现。在 iceberg 集群 FUNCTION 中开始支持 schema 演进、按位置删除和按等值删除。修复 #88287#88919Yang Jiang)。
  • 对在分布式表上使用并行副本的查询禁用 parallel_replicas_support_projection。修复了 #88899 中的问题。#88922zoomxi)。
  • 在内部类型转换中传播上下文。修复了多个未能正确传播类型转换设置的问题。关闭 #88873。关闭 #78025#88929Manuel)。
  • 修复 file() FUNCTION 中通过 glob 模式获取文件格式的问题。解决了 #88920#88947Vitaly Baranov)。
  • 在使用 SQL SECURITY DEFINER 创建视图时,不再检查对 SET DEFINER <current_user>:definer 的访问权限。#88968pufit)。
  • 修复了 L2DistanceTransposed(vec1, vec2, p) 中的 LOGICAL_ERROR,其中用于部分读取 QBit 的优化在 pNullable 时错误地从返回类型中移除了 Nullable#88974 (Raufs Dunamalijevs)。
  • 修复未知目录类型导致的崩溃。解决了 #88819#88987scanhex12)。
  • 已解决 #88081#88988scanhex12)。
  • 修复了分析跳过索引时的性能下降问题。 #89004 (Anton Popov).
  • 修复当使用带有不存在角色的用户尝试执行 clusterAllReplicas 时出现的 ACCESS_ENTITY_NOT_FOUND 错误。解决了 #87670#89068pufit)。
  • 修复 CHECK 约束对稀疏列的处理。关闭 #88637#89076Eduard Karacharov)。
  • 修复了在 MergeTreeReaderTextIndex 中填充虚拟列时的行数统计错误,该错误会触发 LOGICAL_ERROR 并导致系统崩溃。#89095Peng Jian)。
  • 在合并准备阶段出现异常时,防止生存时间 (TTL) 合并计数器泄漏。修复了 #89019 中的问题。#89127save-my-heart)。
  • 修正 base32/base58 编码和解码操作所需缓冲区大小的计算。#89133 (Antonio Andelic)。
  • 修复 Distributed 中由于关闭过程与后台 INSERT 之间的竞态条件导致的 use-after-free 问题。解决了 #88640#89136Azat Khuzhin)。
  • 在解析 Parquet 时,避免由于可变异常对象导致的潜在数据竞争问题。修复了 #88385#89174Azat Khuzhin)。
  • 可刷新materialized view:修复了在刷新过程中,如果源表被完全删除时可能发生的罕见服务器崩溃问题。#89203 (Michael Kolupaev)。
  • 在 HTTP 接口中,当在压缩流中途发送错误时刷新缓冲区。#89256 (Alexander Tokmakov)。
  • 防止查询脱敏规则被错误地应用于 DDL 语句。#89272MikhailBurdukov)。
  • 修复了在 MergeTreeReaderTextIndex 中填充虚拟列时行数统计不正确的问题,该问题会导致触发 LOGICAL_ERROR 并使程序崩溃。重新打开 #89095#89303Jimmy Aguilar Mena)。
  • 修复 Statistics 中,当 countmin 不支持 LowCardinality(Nullable(String)) 的 estimate 数据类型时出现的 LOGICAL_ERROR。#89343 (Han Fei).
  • IN 函数中,当主键列类型与 IN 函数右侧的列类型不同时,可能导致崩溃或未定义行为。示例:SELECT string_column, int_column FROM test_table WHERE (string_column, int_column) IN (SELECT '5', 'not a number')。当选中了大量行且其中存在类型不兼容的行时,该问题可能出现。#89367 (Ilya Golshtein)。
  • 修复 countIf(*) 参数截断的问题。关闭 #89372#89373Manuel)。
  • 防止在 mutation 统计信息中丢失未压缩校验和。#89381 (Azat Khuzhin)。
  • 修复了在 L2DistanceTransposed(vec1, vec2, p) 中出现的 LOGICAL_ERROR,该错误是由于针对部分 QBit 读取的优化在 p 的类型为 LowCardinality(Nullable(T)) 时错误地从返回类型中移除了 Nullable。解决了 #88362#89397Raufs Dunamalijevs)。
  • 修复了加载由旧版本 ClickHouse 写入、tuple 本身使用了不正确稀疏序列化格式的表时的问题。 #89405 (Azat Khuzhin).
  • 修复了在使用 deduplicate_merge_projection_mode='ignore' 时,对已被生存时间 (TTL) 清空但仍包含非空 PROJECTION 的分区片段进行合并时的错误处理。解决了 #89430#89458Amos Bird)。
  • 修复在带有重复列的 full_sorting_merge JOIN 中的逻辑错误。解决了 #86957#89495Vladimir Cherkasov)。
  • 修复了 Keeper 启动时读取变更日志的逻辑,以处理在轮转过程中某个变更日志未被正确重命名的情况。#89496Antonio Andelic)。
  • 修复在右表键唯一时使用 OR 条件导致的 JOIN 结果不正确的问题,解决了 #89391#89512Vladimir Cherkasov)。
  • 修复在使用 analyzer 且主键使用 PK IN (subquery) 时可能出现的 "Context has expired" 错误(v2)。对应修复了 #89433#89527Azat Khuzhin)。
  • 修复 MaterializedPostgreSQL 在包含大写列名的表上的复制问题。解决了 #72363#89530Danylo Osipchuk)。
  • 修复当聚合函数状态中包含 LowCardinality(String) 列的序列化值时发生的崩溃。 #89550 (Pavel Kruglov).
  • 修复在启用 enable_lazy_columns_replication 设置项时,在 JOIN 右表上使用 ARRAY JOIN 会导致崩溃的问题。 #89551 (Pavel Kruglov).
  • 修复 query_plan_convert_join_to_in 的逻辑错误,解决了 #89066#89554Vladimir Cherkasov)。
  • 修复了统计估算器在尝试估算列与常量类型不匹配且无法转换的条件时抛出的异常。 #89596 (Han Fei).
  • 仅对受支持的 join 算法(如哈希 join)添加运行时过滤器。只有当 join 算法先完整读取右侧,再读取左侧时,才能构建过滤器,而例如 FullSortingMergeJoin 会同时读取两侧。修复 #89220#89652Alexander Gololobov)。
  • 修复了在使用 sparseGrams 分词器时并发执行 hasAnyTokenshasAllTokenstokens 函数的问题。解决了 #89605#89665Elmi Ahmadov)。
  • 修复在某些情况下使用 JOIN 运行时过滤器时可能出现的逻辑错误或崩溃。修复了 #89062#89666Alexander Gololobov)。
  • 修复在启用 enable_lazy_columns_replication 时,对 Map 列执行 ARRAY JOIN 时可能出现的逻辑错误。解决 #89705 中的问题。#89717Pavel Kruglov)。
  • 避免在取消远程查询时因在断开连接后仍从远程服务器读取而导致崩溃。修复了 #89468#89740Azat Khuzhin)。
  • 修复 PROJECTION 索引读取路径中的竞争条件。解决了 #89497#89762Peng Jian)。
  • 修复在读取 PROJECTION 索引时可能引发竞态条件的 bug,解决了 #89497#89775Amos Bird)。
  • 修复了 Paimon 表函数在处理无分区表时的行为。解决了 #89690#89793JIaQi)。
  • 修复在高级 JSON 共享数据序列化中读取路径及其子列时可能出现的逻辑错误。解决了 #89805 中报告的问题。#89819Pavel Kruglov)。
  • 修复了数据类型二进制反序列化过程中可能出现的栈溢出问题。关闭了 #88710#89822Pavel Kruglov)。
  • 修复 IN 函数中空元组的逻辑错误。关闭了 #88343#89850Nihal Z. Miaji)。
  • 在旧版分析器中,为了保持兼容性,无论 optimize_injective_functions_in_group_by 的设置如何,都从 GROUP BY 子句中移除单射函数。修复了 #89854#89870Raufs Dunamalijevs)。
  • 如果合并例如由于内存限制而被中断,merge mutate 后台执行器会在没有加锁的情况下对合并任务调用 cancel,但在这种情况下,部分创建的结果分片不会被删除(因为它尚未完成,并且在该阶段还不可见)。之后,合并任务将被销毁,从而触发对结果分片的销毁。这会回滚磁盘事务并导致数据从 S3 中被移除。最后,这一垃圾清理是在持有 merge mutate 后台执行器锁的情况下执行的。#89875Mikhail Artemenko)。
  • 修复了在 reverseCAST FUNCTION 中处理空元组时的逻辑错误。关闭 #89137#89908Nihal Z. Miaji)。
  • 现在,ClickHouse 默认会在 SHOW DATABASES 查询结果中显示数据湖目录数据库。#89914 (alesapin)。
  • 修复在 GCS 上用于备份的原生复制功能。由于错误的客户端克隆实现,GCS 原生复制总是失败,并退回到效率较低的手动读写数据方式。#89923 (Antonio Andelic)。
  • 修复 base32Encode 的缓冲区大小计算。对长度小于 5 的字符串列执行 base32Encode 编码可能会导致崩溃。修复了 #89911#89929Antonio Andelic)。
  • 修复 SHOW COLUMNSSHOW FUNCTIONS 查询的错误转义处理。#89942 (alesapin)。
  • 修复 MongoDB 引擎中用户名包含 '@' 字符时的 URL 验证问题。此前,由于编码不正确,包含 '@' 的用户名会导致错误。#89970 (Kai Zhu)。
  • 已在 #90592 中回溯修复:修复在启用 enable_lazy_columns_replication 设置时,远程查询在 IN 子句中使用 ARRAY JOIN 时可能发生的崩溃。解决了 #90361#89997Pavel Kruglov)。
  • 已在 #90448 中回溯:修复了在某些情况下,从文本格式的字符串推断 DateTime64 值时得到错误结果的问题。修复了 #89368#90013Pavel Kruglov)。
  • 修复 BSONEachRowMsgPack 中由空元组列导致的逻辑错误。关闭 #89814。关闭 #71536#90018Nihal Z. Miaji)。
  • 已在 #90457 中回溯修复:在从聚合状态及其他来源反序列化数据时进行大小检查。#90031Raúl Marín)。
  • 修复在包含重复列的 JOIN 中可能出现的 'Invalid number of rows in Chunk' 错误。解决了 #89411#90053Vladimir Cherkasov)。
  • 已在 #90588 中回溯移植:修复在使用 ARRAY JOIN 且启用 enable_lazy_columns_replication 设置执行插入时,可能出现的错误 Column with Array type is not represented by ColumnArray column: Replicated#90066Pavel Kruglov)。
  • 允许 user_files 中包含以点开头的文件。修复 #89662#90079Raúl Marín)。
  • 已在 #90647 中回溯修复:在使用较大步长时,修复 numbers 系统表中的逻辑错误和取模 bug。关闭 #83398#90123Nihal Z. Miaji)。
  • 修复了字典参数解析中的整数溢出问题。关闭了 #78506#90171Raúl Marín)。
  • 已在 #90468 中回溯:修复 Hive 分区不兼容问题,避免在 25.8 中无法平滑升级(修复升级过程中出现的错误 All hive partitioning columns must be present in the schema)。#90202Kseniia Sumarokova)。
  • 修复了在启用了查询条件缓存的情况下,执行轻量级更新后 SELECT 查询可能返回不正确结果的问题。修复了 #90176。修复了 #90054#90204Anton Popov)。
  • 修复在解析格式不正确的分片目录名称时 StorageDistributed 中发生的崩溃问题。 #90243 (Aleksandr Musorin).
  • LogicalExpressionOptimizerPass 中处理字符串到整数或布尔值的隐式转换问题。解决了 #89803#90245Elmi Ahmadov)。
  • 修复表定义中某些 skip 索引格式错误的问题,该问题会导致 METADATA_MISMATCH,并阻止在复制数据库中创建新副本。#90251 (Nikolay Degterinsky).
  • 已在 #90381 中回溯:修复当某个 part 中唯一的 granule 行数小于 index_granularity 时,MergeTreeReaderIndex 中行数不匹配的问题。修复 #89691#90254Peng Jian)。
  • 已在 #90608 中回溯:修复在紧凑分区片段中从 JSON 读取子列时的缺陷,该问题可能导致 CANNOT_READ_ALL_DATA 错误。修复了 #90264#90302Pavel Kruglov)。
  • 修复 trimltrimrtrim 函数在传入两个参数时不起作用的问题。关闭 #90170#90305Nihal Z. Miaji)。
  • 已在 #90625 中回溯移植:修复在 index_granularity_bytes=0 时,对不存在的 JSON 路径的 PREWHERE 条件可能出现的逻辑错误。解决 #86924#90375Pavel Kruglov)。
  • 已在 #90484 中回溯:修复了 L2DistanceTransposed 中的一个缺陷,该缺陷会在精度参数超出有效范围时导致崩溃。已关闭 #90401#90405Raufs Dunamalijevs)。
  • 已在 #90577 中回溯修复:修复了在 L2DistanceTransposed 中使用数组形式的参考向量(默认为 Array(Float64)))配合元素类型为非 Float64Float32BFloat16)的 QBit 列时,距离计算不正确的问题。该函数现在会自动将参考向量的元素类型转换为与 QBit 的元素类型一致。解决了 #89976#90485Raufs Dunamalijevs)。
  • 已在 #90601 中回溯:修复 equals 函数在罕见情况下导致的逻辑错误。已关闭 #88142#90557Nihal Z. Miaji)。
  • 修复 CoalescingMergeTreeTuple 类型的支持。 #88828 (scanhex12).

构建/测试/打包改进

ClickHouse 25.10 版本发布,2025-10-31

不向后兼容的变更

  • 更改了默认的 schema_inference_make_columns_nullable 设置,使其根据 Parquet/ORC/Arrow 元数据中的列 Nullable 信息进行处理,而不是将所有列都设为 Nullable。文本格式保持不变。#71499Michael Kolupaev)。
  • 查询结果缓存现在会忽略 log_comment setting,因此仅在查询中更改 log_comment 将不再强制触发缓存未命中。极少数情况下,用户可能是有意通过调整 log_comment 来对缓存进行分段。此更改会改变该行为,因此与之前的版本不兼容。请改用 setting query_cache_tag 来实现这一目的。#79878 (filimonov).
  • 在之前的版本中,包含与运算符实现函数同名的表函数的查询,其格式化行为不一致。修复了 #81601。修复了 #81977。修复了 #82834。修复了 #82835。EXPLAIN SYNTAX 查询将不再总是对运算符进行格式化输出——新的行为更好地体现了解释语法这一操作的目的。clickhouse-formatformatQuery 以及类似工具,如果查询中以函数形式使用这些函数,将不会再把它们格式化为运算符。#82825Alexey Milovidov)。
  • 禁止在 JOIN 键中使用 Dynamic 类型。当 Dynamic 类型的值与非 Dynamic 类型的值进行比较时,可能会导致意外结果。最好将 Dynamic 列显式转换为所需类型。 #86358 (Pavel Kruglov).
  • storage_metadata_write_full_object_key 服务器选项现在默认开启,当前无法关闭。这是一个向后兼容的变更,请注意。此变更仅与 25.x 版本系列保持前向兼容。这意味着如果你需要回滚新版本,只能降级到任意 25.x 版本。 #87335 (Sema Checherinda).
  • replicated_deduplication_window_seconds 从一周减少为一小时,以在插入速率较低时减少 ZooKeeper 中存储的 znode 数量。#87414 (Sema Checherinda)。
  • 将设置项 query_plan_use_new_logical_join_step 重命名为 query_plan_use_logical_join_step#87679 (Vladimir Cherkasov)。
  • 新的语法使文本索引的 tokenizer 参数更加灵活且表达力更强。#87997 (Elmi Ahmadov)。
  • 将函数 searchAnysearchAll 重命名为 hasAnyTokenshasAllTokens,以便与现有函数 hasToken 的命名保持更好的一致性。#88109Robert Schulze)。
  • 从文件系统缓存中移除 cache_hits_threshold。该功能由外部贡献者在我们引入 SLRU 缓存策略之前添加,如今既然已经有了 SLRU,就没有必要同时支持二者。#88344Kseniia Sumarokova)。
  • min_free_disk_ratio_to_perform_insertmin_free_disk_bytes_to_perform_insert 设置的工作方式做了两点小改动: - 使用未保留(unreserved)而不是可用(available)字节来决定是否应拒绝一次插入操作。这在后台合并和变更的预留空间相对于配置的阈值较小时可能不那么关键,但这样做更正确。 - 不再将这些设置应用于 system 表。其理由是我们仍希望像 query_log 这样的表能够被更新,这对调试非常有帮助。写入到 system 表的数据通常相较于实际数据要小得多,因此在配置一个合理的 min_free_disk_ratio_to_perform_insert 阈值时,它们应能继续运行更长时间。
  • 为 Keeper 的内部复制启用异步模式。Keeper 在保持与之前行为一致的情况下,可能带来性能提升。如果您是从早于 23.9 的版本升级,则需要先升级到 23.9+,然后再升级到 25.10+。您也可以在升级前将 keeper_server.coordination_settings.async_replication 设置为 0,并在升级完成后再将其启用。#88515Antonio Andelic)。

新功能

  • 新增对负 LIMIT 和负 OFFSET 的支持。修复了 #28913#88411Nihal Z. Miaji)。
  • Alias 引擎会创建指向另一张表的代理。所有读写操作都会被转发到目标表,而该别名本身不存储任何数据,只维护对目标表的引用。#87965Kai Zhu)。
  • 完全支持运算符 IS NOT DISTINCT FROM (<=>)。 #88155 (simonmichal)。
  • 新增了在所有适用的 MergeTree 表列上自动创建统计信息的功能。新增了表级设置 auto_statistics_types,用于存储要创建的统计信息类型(逗号分隔,例如:auto_statistics_types = 'minmax, uniq, countmin')。#87241Anton Popov)。
  • 新的文本布隆过滤器索引 sparse_gram#79985 (scanhex12)。
  • 一个用于在不同进制之间转换数字的新 conv 函数,目前支持 2 到 36 进制。#83058 (hp)。
  • 新增对 LIMIT BY ALL 语法的支持。类似于 GROUP BY ALLORDER BY ALLLIMIT BY ALL 会自动展开为将 SELECT 子句中所有非聚合表达式用作 LIMIT BY 键。例如,SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY ALL 等价于 SELECT id, name, count(*) FROM table GROUP BY id LIMIT 1 BY id, name。当需要对所有已选择的非聚合列进行限制且不想显式列出它们时,此特性能简化查询。解决了 #59152#84079Surya Kant Ranjan)。
  • 在 ClickHouse 中新增对 Apache Paimon 查询的支持。通过这一集成,ClickHouse 用户可以直接访问并操作 Paimon 的数据湖存储。#84423 (JIaQi)。
  • 新增了 studentTTestOneSample 聚合函数。 #85436 (Dylan).
  • 聚合函数 quantilePrometheusHistogram,以直方图桶的上界和累积值作为参数,并在包含目标分位数位置的桶的下界与上界之间执行线性插值。行为与 PromQL 中针对经典直方图的 histogram_quantile 函数类似。#86294Stephen Chi)。
  • 新增一个用于 Delta Lake 元数据文件的系统表。#87263 (scanhex12).
  • 新增 ALTER TABLE REWRITE PARTS —— 从头重写表的分区片段,使用所有新的设置(因为有些设置,如 use_const_adaptive_granularity,只会应用于新生成的分区片段)。 #87774 (Azat Khuzhin).
  • 添加 SYSTEM RECONNECT ZOOKEEPER 命令,以强制与 ZooKeeper 断开并重新建立连接(https://github.com/ClickHouse/ClickHouse/issues/87317)。#87318Pradeep Chhetri)。
  • 通过设置 max_named_collection_num_to_warnmax_named_collection_num_to_throw 来限制命名集合的数量。新增度量指标 NamedCollection 和错误码 TOO_MANY_NAMED_COLLECTIONS#87343 (Pablo Marcos).
  • 新增经过优化的不区分大小写版 startsWithendsWith 函数:startsWithCaseInsensitiveendsWithCaseInsensitivestartsWithCaseInsensitiveUTF8endsWithCaseInsensitiveUTF8#87374 (Guang Zhao)。
  • 增加了一种方式,可在 SQL 中通过服务器配置中的 resources_and_workloads 部分定义 WORKLOADRESOURCE#87430 (Sergei Trifonov)。
  • 新增表设置项 min_level_for_wide_part,用于指定将数据片段创建为 wide part 所需的最小 level。 #88179 (Christoph Wurm).
  • 在 Keeper 客户端中新增 cp/cprmv/mvr 命令的递归版本。#88570 (Mikhail Artemenko)。
  • 添加了会话设置,用于指定在插入时要从物化中排除的 skip 索引列表(exclude_materialize_skip_indexes_on_insert)。添加了 MergeTree 表设置,用于指定在合并期间要从物化中排除的 skip 索引列表(exclude_materialize_skip_indexes_on_merge)。#87252George Larionov)。

实验特性

  • 实现了 QBit 数据类型,用于以按位切片格式存储向量,以及 L2DistanceTransposed 函数,用于执行近似向量搜索,并可通过一个参数在精度与速度之间进行权衡。#87922 (Raufs Dunamalijevs).
  • 函数 searchAllsearchAny 现在也可以用于不包含文本列的场景。在这些情况下,它们会使用默认的 tokenizer。#87722 (Jimmy Aguilar Mena).

性能优化

  • 在 JOIN 和 ARRAY JOIN 中实现惰性列复制。避免在某些输出格式中将 Sparse 和 Replicated 等特殊列表示转换为完整列,从而避免在内存中进行不必要的数据复制。#88752Pavel Kruglov)。
  • 为 MergeTree 表中的顶层 String 列添加可选的 .size 子列序列化,以提升压缩率并实现高效的子列访问。引入新的 MergeTree 设置项,用于序列化版本控制以及空字符串表达式的优化。#82850 (Amos Bird)。
  • 支持 Iceberg 的有序读取。 #88454 (scanhex12).
  • 通过在运行时从右子树构建 Bloom 过滤器,并将该过滤器传递给左子树中的扫描操作,加速部分 JOIN 查询。对于类似 SELECT avg(o_totalprice) FROM orders, customer, nation WHERE c_custkey = o_custkey AND c_nationkey=n_nationkey AND n_name = 'FRANCE' 的查询,这种方式可以提升性能。#84772Alexander Gololobov)。
  • 通过重构 Query Condition Cache (QCC) 与索引分析的顺序和集成方式,提升了查询性能。现在会在主键和跳过索引分析之前先应用 QCC 过滤,从而减少不必要的索引计算。索引分析现已扩展为支持多个范围过滤条件,其过滤结果现在也会写回 QCC。这显著加速了执行时间主要花费在索引分析上的查询,特别是依赖跳过索引(例如向量或倒排索引)的查询。#82380Amos Bird)。
  • 对小型查询进行了一系列微优化,以加快执行速度。#83096Raúl Marín)。
  • 在原生协议中压缩日志和 profile 事件。在具有 100 个以上副本的集群上,未压缩的 profile 事件会占用 1~10 MB/秒,并且在较慢的网络连接下进度条会变得很卡顿。此更改修复了 #82533#83586Alexey Milovidov)。
  • 通过使用 StringZilla 库,在可用时利用 SIMD CPU 指令,提升区分大小写字符串搜索(例如在执行 WHERE URL LIKE '%google%' 这样的过滤操作时)的性能。#84161Raúl Marín)。
  • 在对包含 SimpleAggregateFunction(anyLast) 类型列的 AggregatingMergeTree 表执行带 FINAL 的 SELECT 查询时,减少内存分配和内存复制。#84428 (Duc Canh Le).
  • 实现了下推析取 JOIN 谓词的相关逻辑。例如,在 TPC-H Q7 中,对于两个表 n1 和 n2 的条件 (n1.n_name = 'FRANCE' AND n2.n_name = 'GERMANY') OR (n1.n_name = 'GERMANY' AND n2.n_name = 'FRANCE'),我们为每个表提取独立的局部过滤条件:对 n1 提取 n1.n_name = 'FRANCE' OR n1.n_name = 'GERMANY',对 n2 提取 n2.n_name = 'GERMANY' OR n2.n_name = 'FRANCE'#84735 (Yarik Briukhovetskyi)。
  • 通过使用新的默认设置 optimize_rewrite_like_perfect_affix,提升了带前缀或后缀的 LIKE 查询的性能。 #85920 (Guang Zhao).
  • 修复在按多个字符串/数字列进行分组时,由于序列化键过大而导致的性能下降问题。此变更是对 #83884 的后续跟进。#85924李扬)。
  • 新增 joined_block_split_single_row 配置项,用于在每个键存在大量匹配项的哈希连接中减少内存使用。该配置允许哈希连接结果即便在单个左表行的匹配结果内部,也可以被拆分成多个数据块,这在左表中的一行能匹配右表中成千上万甚至数百万行时尤其有用。之前,所有匹配结果必须一次性在内存中物化。此更改可降低峰值内存占用,但可能增加 CPU 使用率。 #87913 (Vladimir Cherkasov).
  • 改进了 SharedMutex(提升在大量并发查询场景下的性能)。#87491 (Raúl Marín).
  • 提升了为以低频 token 为主的文档构建文本索引时的性能。#87546 (Anton Popov)。
  • 加速 Field 析构函数在常见场景下的执行(提升大量小查询场景下的性能)。 #87631 (Raúl Marín).
  • 在 JOIN 优化阶段跳过对运行时哈希表统计信息的重新计算(提升所有包含 JOIN 的查询性能)。新增 profile 事件 JoinOptimizeMicrosecondsQueryPlanOptimizeMicroseconds#87683Vladimir Cherkasov)。
  • 为 MergeTreeLazy 读取器启用在缓存中保存标记,并避免直接 IO 操作,从而提升包含 ORDER BY 且 LIMIT 很小的查询的性能。#87989Nikita Taranov)。
  • 在带有 is_deleted 列的 ReplacingMergeTree 表上执行带有 FINAL 子句的 SELECT 查询现在运行得更快,这是由于对两个现有优化的并行化进行了改进:1. 对于仅有单个 part 的表分区,应用 do_not_merge_across_partitions_select_final 优化;2. 将表中其他选定范围拆分为 intersecting / non-intersecting,且只有相交范围需要经过 FINAL 合并变换阶段。#88090 (Shankar Iyer).
  • 降低在未使用 fail point(调试未启用时的默认代码路径)情况下的影响。 #88196 (Raúl Marín).
  • 避免在按 uuid 过滤查询 system.tables 时触发全表扫描(当你只有从日志或 ZooKeeper 路径获取的 UUID 时非常有用)。 #88379 (Azat Khuzhin).
  • 改进了 tokenshasAllTokenshasAnyTokens 函数的性能。#88416Anton Popov)。
  • AddedColumns::appendFromBlock 内联化,在某些情况下可略微提高 JOIN 性能。#88455 (Nikita Taranov)。
  • 客户端自动补全通过使用 system.completions,而不是对系统表执行多条查询,变得更快且更一致。#84694 (|2ustam)。
  • 新增 dictionary_block_frontcoding_compression 文本索引参数,用于控制字典压缩。默认情况下会启用该参数,使用 front-coding 压缩。#87175 (Elmi Ahmadov)。
  • 在插入到 materialized view 之前,先将所有线程的数据进行合并压缩,具体行为由 min_insert_block_size_rows_for_materialized_viewsmin_insert_block_size_bytes_for_materialized_views 这两个设置决定。此前,如果启用了 parallel_view_processing,则每个向某个特定 materialized view 插入数据的线程都会独立进行合并压缩插入,这可能会导致生成的分区片段数量增多。 #87280 (Antonio Andelic)。
  • 添加 temporary_files_buffer_size 设置,用于控制临时文件写入器的缓冲区大小。* 优化 scatter 操作(例如在 Grace 哈希连接中使用)对 LowCardinality 列的内存消耗。#88237 (Vladimir Cherkasov)。
  • 新增对使用并行副本直接读取文本索引的支持。提升了从对象存储读取文本索引的性能。 #88262 (Anton Popov).
  • 针对数据湖目录中表的查询,在分布式处理时将使用并行副本。#88273 (scanhex12).
  • 用于调优后台合并算法的内部启发式规则(名为 "to_remove_small_parts_at_right")现在会在计算合并区间得分之前执行。在此之前,合并选择器会先选择一个宽范围的合并,然后再过滤其尾部区间。修复内容:#85374#88736Mikhail Artemenko)。

改进

  • 现在,函数 generateSerialID 支持将序列名称作为非常量参数。解决了 #83750#88270Alexey Milovidov)。
  • generateSerialID 函数新增可选的 start_value 参数,用于为新序列设置自定义起始值。#88085 (Manuel).
  • clickhouse-format 中添加 --semicolons_inline 选项,用于将查询格式化为在最后一行放置分号,而不是另起一行。#88018Jan Rada)。
  • 允许在 Keeper 中覆盖配置时进行服务器级别的限流配置。关闭 #73964#74066JIaQi)。
  • 当两个样本都只包含相同的值时,mannWhitneyUTest 不再抛出异常。现在会返回一个与 SciPy 保持一致的有效结果。修复问题:#79814#80009DeanNeaht)。
  • 在重写磁盘对象存储的事务中,如果元数据事务已提交,则会删除之前的远程 blob。 #81787 (Sema Checherinda).
  • 修复了当优化前后结果类型的 LowCardinality 不同时,对冗余相等表达式的优化过程。#82651 (Yakov Olkhovskiy)。
  • 当 HTTP 客户端在设置 Expect: 100-continue 的同时额外设置头 X-ClickHouse-100-Continue: defer 时,ClickHouse 在配额验证通过之前不会向客户端发送 100 Continue 响应,从而避免为那些最终会被丢弃的请求体浪费网络带宽。这对 INSERT 查询尤为相关,因为查询本身可以通过 URL 查询字符串发送,而数据则在请求体中发送。在未发送完整请求体的情况下中止请求会导致在 HTTP/1.1 中无法复用连接,但为建立新连接而引入的额外延迟,相比在大量数据场景下 INSERT 的总耗时通常可以忽略不计。#84304 (c-end)。
  • 在使用 DATABASE ENGINE = Backup 并采用 S3 存储时,对日志中的 S3 凭据进行脱敏处理。 #85336 (Kenny Sun).
  • 通过推迟其物化,使查询计划中的优化对关联子查询的输入子计划可见。属于 #79890 的一部分。#85455Dmitry Novik)。
  • SYSTEM DROP DATABASE REPLICA 的更改: - 当通过 DROP DATABASE 或删除整个副本的方式进行删除时:还会为该数据库中的每个表删除副本 - 如果提供了 WITH TABLES:则为每个存储删除副本 - 否则,逻辑保持不变,只在数据库级别删除副本 - 当使用 Keeper 路径删除数据库副本时: - 如果提供了 WITH TABLES: - 将数据库恢复为 Atomic - 从 Keeper 中的语句恢复 RMT 表 - 删除该数据库(恢复的表也会被删除) - 否则,只在提供的 Keeper 路径上删除副本。#85637 (Tuan Pham Anh).
  • 修复包含 materialize 函数的生存时间 (TTL) 表达式格式不一致的问题。关闭 #82828#85749Alexey Milovidov)。
  • Iceberg 表状态不再存储在单个存储对象中。这应当使 ClickHouse 中的 Iceberg 能够支持并发查询。 #86062 (Daniil Ivanik)。
  • 将 S3Queue 的有序模式下的 bucket 锁改为持久化模式,类似于在 use_persistent_processing_nodes = 1 时的 processing 节点。在测试中添加 keeper 故障注入。#86628 (Kseniia Sumarokova)。
  • 当用户在格式名称里有拼写错误时提供提示。修复了 #86761#87092 (flynn)。
  • 如果没有 PROJECTION,远程副本将跳过索引分析。#87096 (zoomxi).
  • 允许对 YTsaurus 表禁用 UTF-8 编码。#87150 (MikhailBurdukov)。
  • 默认将 s3_slow_all_threads_after_retryable_error 禁用。#87198 (Nikita Mikhaylov).
  • 将表函数 arrowflight 重命名为 arrowFlight#87249 (Vitaly Baranov)。
  • 更新了 clickhouse-benchmark,现在其命令行选项中可以使用 - 来替代 _#87251 (Ahmed Gouda)。
  • 在信号处理时,将对 system.crash_log 的刷新改为同步执行。 #87253 (Miсhael Stetsyuk).
  • 新增了一个名为 inject_random_order_for_select_without_order_by 的设置项,用于在顶层不带 ORDER BY 子句的 SELECT 查询中自动注入 ORDER BY rand()#87261 (Rui Zhang)。
  • 改进 joinGet 错误信息,使其能够正确提示 join_keys 的数量与 right_table_keys 的数量不一致。 #87279 (Isak Ellmer).
  • 在写事务期间新增检查任意 Keeper 节点 stat 的功能,有助于检测 ABA 问题。#87282Mikhail Artemenko)。
  • 将高负载的 ytsaurus 请求重定向到高负载代理。 #87342 (MikhailBurdukov).
  • 修复了在各种可能的工作负载下,对基于磁盘事务的元数据执行 unlink/rename/removeRecursive/removeDirectory 等操作及其硬链接计数时的回滚问题,并简化接口使其更加通用,以便在其他元存储中复用。#87358 (Mikhail Artemenko).
  • 新增 keeper_server.tcp_nodelay 配置参数,用于在 Keeper 中禁用 TCP_NODELAY#87363 (Copilot)。
  • clickhouse-benchmarks 中支持 --connection。其行为与 clickhouse-client 中的相同,你可以在客户端 config.xml/config.yamlconnections_credentials 配置项下指定预定义连接,以避免通过命令行参数显式指定用户名/密码。为 clickhouse-benchmark 新增对 --accept-invalid-certificate 的支持。#87370 (Azat Khuzhin)。
  • 现在,设置 max_insert_threads 也会对 Iceberg 表生效。#87407 (alesapin).
  • 将直方图和多维指标添加到 PrometheusMetricsWriter。这样,PrometheusRequestHandler 处理程序就具备所有关键指标,可用于在 Cloud 中进行可靠、低开销的指标采集。#87521 (Miсhael Stetsyuk)。
  • hasToken 函数现在对于空 token 返回零个匹配结果(此前这种情况下会抛出异常)。 #87564 (Jimmy Aguilar Mena).
  • ArrayMapmapKeysmapValues)类型的值增加文本索引支持。支持的函数包括 mapContainsKeyhas#87602 (Elmi Ahmadov)。
  • 新增一个 ZooKeeperSessionExpired 指标,用于表示已过期的全局 ZooKeeper 会话数量。#87613 (Miсhael Stetsyuk)。
  • 在执行到备份目标的服务器端(原生)复制时,使用带有备份专用设置的 S3 存储客户端(例如 backup_slow_all_threads_after_retryable_s3_error)。将 s3_slow_all_threads_after_retryable_error 废弃。 #87660 (Julia Kartseva).
  • 修复在使用实验性功能 make_distributed_plan 进行查询计划序列化时,对 max_joined_block_size_rowsmax_joined_block_size_bytes 这两个设置项处理不正确的问题。#87675 (Vladimir Cherkasov).
  • enable_http_compression 设置现已默认启用。这意味着如果客户端接受 HTTP 压缩,服务端将会使用它。不过,此变更也有一些缺点。客户端可以请求一种资源开销很大的压缩方式,例如 bzip2,这是不合理的,并且会增加服务端的资源消耗(但只有在传输大型结果时才会明显)。客户端也可以请求 gzip,这并不算太糟,但与 zstd 相比并非最优。关闭 #71591#87703Alexey Milovidov)。
  • system.server_settings 中新增了一个条目 keeper_hosts,用于展示 ClickHouse 可以连接的 [Zoo]Keeper 主机列表。 #87718 (Nikita Mikhaylov).
  • 在系统仪表板中添加 fromto 值,以便更方便地进行历史排查。#87823Mikhail f. Shiryaev)。
  • 在 Iceberg 的 SELECT 查询中添加更多用于性能跟踪的信息。#87903 (Daniil Ivanik).
  • 文件系统缓存改进:在并发为缓存预留空间的多个线程之间复用缓存优先级迭代器。#87914Kseniia Sumarokova)。
  • 新增用于限制 Keeper 请求大小的功能(max_request_size SETTING,与 ZooKeeperjute.maxbuffer 相同,默认为 OFF 以保持向后兼容,默认值将在后续版本中调整)。 #87952 (Azat Khuzhin).
  • clickhouse-benchmark 调整为默认不在错误信息中包含堆栈跟踪。#87954 (Ahmed Gouda)。
  • 当标记已在缓存中时,避免使用线程池进行异步标记加载(load_marks_asynchronously=1),因为线程池可能处于高负载状态,即使标记已在缓存中,查询仍会因此付出额外开销。 #87967 (Azat Khuzhin)。
  • Ytsaurus:允许仅指定部分列来创建表、表函数和字典。#87982MikhailBurdukov)。
  • system.zookeeper_connection_log 现已默认启用,可用于获取 Keeper 会话的信息。#88011 (János Benjamin Antal)。
  • 当传入重复的外部表时,使 TCP 和 HTTP 的行为保持一致。HTTP 允许同一个临时表被多次传入。#88032 (Sema Checherinda).
  • 移除用于读取 Arrow/ORC/Parquet 的自定义 MemoryPools。在 #84082 之后,该组件似乎已不再需要,因为现在我们在任何情况下都会跟踪所有的内存分配。#88035Nikita Mikhaylov)。
  • 允许在不带参数的情况下创建 Replicated 数据库。#88044 (Pervakov Grigorii)。
  • clickhouse-keeper-client:增加了对通过 TLS 端口连接 clickhouse-keeper 的支持,命令行参数名称保持与 clickhouse-client 中一致。#88065Pradeep Chhetri)。
  • 新增了一个 profile event,用于统计后台合并因超出内存限制而被拒绝的次数。#88084Grant Holly)。
  • CREATE/ALTER TABLE 语句中的列默认表达式验证启用 analyzer。 #88087 (Max Justus Spransy).
  • 内部查询计划改进:对 CROSS JOIN 使用 JoinStepLogical。 #88151 (Vladimir Cherkasov).
  • hasAnyTokenshasAnyToken)和 hasAllTokenshasAllToken)函数添加了别名。 #88162 (George Larionov).
  • 默认启用全局采样性能分析器(也就是说,即使是与查询无关的服务器线程也会被采样):每 10 秒的 CPU 时间和实时时间,为所有线程采集一次栈跟踪(stacktrace)。 #88209 (Alexander Tokmakov).
  • 更新 Azure SDK,以修复在复制和创建容器功能中出现的 'Content-Length' 问题。#88278 (Smita Kulkarni)。
  • 使 lag 函数大小写不敏感,以兼容 MySQL。 #88322 (Lonny Kapelushnik).
  • 允许从 clickhouse-server 目录启动 clickhouse-local。在之前的版本中,这会导致错误 Cannot parse UUID: .。现在可以在不启动 clickhouse-server 的情况下启动 clickhouse-local 并操作该服务器的数据库。#88383 (Alexey Milovidov)。
  • 添加配置项 keeper_server.coordination_settings.check_node_acl_on_remove。如果启用,在每次删除节点之前,会同时验证该节点自身及其父节点的 ACL。否则,只会验证父节点的 ACL。#88513 (Antonio Andelic)。
  • 在使用 Vertical 格式时,JSON 列现在会以更易读的格式输出。修复了 #81794#88524Frank Rosner)。
  • clickhouse-client 文件(例如查询历史)存储在 XDG Base Directories 规范所描述的位置,而不是用户主目录的根路径下。如果 ~/.clickhouse-client-history 已经存在,则仍会继续使用该文件。#88538 (Konstantin Bogdanov)。
  • 修复因 GLOBAL IN 导致的内存泄漏(https://github.com/ClickHouse/ClickHouse/issues/88615)。#88617pranavmehta94)。
  • 为 hasAny/hasAllTokens 添加了可接受字符串参数的重载版本。 #88679 (George Larionov).
  • clickhouse-keeper 的 postinstall 脚本中添加一个步骤,以启用开机时自动启动。#88746 (YenchangChan).
  • 仅在将凭证粘贴到 Web UI 时才进行检查,而不是在每次按键时检查。这样可以避免配置错误的 LDAP 服务器导致的问题。此更改关闭了 #85777#88769Alexey Milovidov)。
  • 在违反约束时限制异常信息的长度。在早期版本中,当插入一个非常长的字符串时,可能会产生一条非常长的异常信息,并最终写入 query_log。修复了 #87032#88801Alexey Milovidov)。
  • 修复了在创建表时向 ArrowFlight 服务器请求数据集结构的逻辑。 #87542 (Vitaly Baranov)。

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复了由 GeoParquet 导致的客户端协议错误。 #84020 (Michael Kolupaev).
  • 修复在发起节点上对子查询中诸如 shardNum() 等主机相关函数的解析问题。 #84409 (Eduard Karacharov).
  • 修复了在多个与日期时间相关的函数(如 parseDateTime64BestEffortchange{Year,Month,Day}makeDateTime64)中对 Unix 纪元之前日期且带小数秒的处理错误。此前会错误地将小数秒部分从秒数中减去,而不是将其相加。例如,parseDateTime64BestEffort('1969-01-01 00:00:00.468') 会返回 1968-12-31 23:59:59.532,而不是 1969-01-01 00:00:00.468#85396 (xiaohuanlin).
  • 修复了在同一条 ALTER 语句内列的状态发生变化时,ALTER COLUMN IF EXISTS 命令会失败的问题。现在,例如 DROP COLUMN IF EXISTS、MODIFY COLUMN IF EXISTS、COMMENT COLUMN IF EXISTS 和 RENAME COLUMN IF EXISTS 等命令,可以正确处理同一语句中前一个命令已删除该列的情况。#86046xiaohuanlin)。
  • 修复在日期超出支持范围时对 Date/DateTime/DateTime64 类型的推断。 #86184 (Pavel Kruglov)。
  • 修复了一个问题:某些有效的用户提交数据在写入 AggregateFunction(quantileDD) 列时,可能导致合并阶段出现无限递归并引发崩溃。 #86560 (Raphaël Thériault).
  • 在使用 cluster 表函数创建的表中支持 JSON/Dynamic 类型。#86821 (Pavel Kruglov).
  • 修复在查询中通过 CTE 计算得到的函数结果具有非确定性的问题。 #86967 (Yakov Olkhovskiy).
  • 修复在主键列上使用 pointInPolygon 时,EXPLAIN 中出现的 LOGICAL_ERROR。 #86971 (Michael Kolupaev).
  • 修复名称中包含百分号编码序列的数据湖表的问题。关闭了 #86626#87020Anton Ivashkin)。
  • 修复在启用 optimize_functions_to_subcolumns 时,OUTER JOIN 中在 Nullable 列上使用 IS NULL 行为不正确的问题,关闭 #78625#87058Vladimir Cherkasov)。
  • 修复了在 max_temporary_data_on_disk_size 限制跟踪中对临时数据释放的错误统计问题,关闭 #87118#87140 (JIaQi)。
  • 函数 checkHeaders 现在可以正确校验提供的请求头,并拒绝不允许使用的请求头。原始作者:Michael Anastasakis (@michael-anastasakis)。#87172 (Raúl Marín)。
  • 使 toDatetoDate32 在所有数值类型上具有相同的行为。修复了从 int16 类型转换时对 Date32 的下溢检查问题。 #87176 (Pervakov Grigorii).
  • 修复在使用并行副本执行包含多个 JOIN 的查询时的逻辑错误,尤其是当在 LEFT/INNER JOIN 之后使用 RIGHT JOIN 时。 #87178 (Igor Nikonov).
  • 模式推断缓存现在会遵从 input_format_try_infer_variants 设置。#87180 (Pavel Kruglov)。
  • 使 pathStartsWith 只匹配指定前缀下的路径。#87181 (Raúl Marín)。
  • 修复了 _row_number 虚拟列和 Iceberg 定位删除中的逻辑错误。#87220Michael Kolupaev)。
  • 修复在 JOIN 中由于混用常量和非常量数据块导致的 LOGICAL_ERROR,错误信息为“Too large size passed to allocator”。#87231Azat Khuzhin)。
  • 修复了轻量级更新在包含从其他 MergeTree 表读取的子查询时的问题。#87285 (Anton Popov)。
  • 修复了在启用 ROW POLICY 时无法正常工作的 move-to-prewhere 优化。这是对 #85118 的后续改进。修复了 #69777。修复了 #83748#87303Nikolai Kochetov)。
  • 修复了在对数据分区片段中缺失但具有默认表达式的列应用补丁时出现的问题。 #87347 (Anton Popov).
  • 修复了在 MergeTree 表中使用重复的分区字段名时出现的段错误。 #87365 (xiaohuanlin).
  • 修复 EmbeddedRocksDB 的升级问题。 #87392 (Raúl Marín).
  • 修复了在对象存储中直接读取文本索引的问题。#87399 (Anton Popov).
  • 防止创建针对不存在引擎的权限。 #87419 (Jitendra).
  • 仅对 s3_plain_rewritable 忽略“未找到”错误,否则可能引发各种问题。#87426 (Azat Khuzhin).
  • 修复使用 YTSaurus 作为源且采用 *range_hashed 布局的字典。#87490 (MikhailBurdukov).
  • 修复在创建空元组数组时出现的问题。 #87520 (Pavel Kruglov).
  • 在创建临时表时检查不合法的列。#87524 (Pavel Kruglov).
  • 不要将 Hive 分区列放入格式头部。修复了 #87515#87528Arthur Passos)。
  • 修复在 DeltaLake 中使用文本格式时的 format 读取准备过程。#87529Pavel Kruglov)。
  • 修复了对 Buffer 表执行 SELECT 和 INSERT 操作时的访问权限验证问题。#87545 (pufit).
  • 不允许为 S3 表创建 data skipping 索引。 #87554 (Bharat Nallan).
  • 避免异步日志记录中的已跟踪内存泄漏(10 小时内可能产生约 100GiB 的显著偏差),以及 text_log 中的泄漏(也可能出现几乎相同的偏差)。 #87584 (Azat Khuzhin).
  • 修复了一个 Bug:如果某个 View 或 materialized view 被异步删除,而在后台清理完成之前服务器重启,可能会导致该 View 的 SELECT 查询 settings 覆盖全局服务器 settings。 #87603 (Alexander Tokmakov)。
  • 在计算内存过载告警时,如有可能,排除用户态页面缓存字节数。#87610Bharat Nallan)。
  • 修复了一个问题:在 CSV 反序列化期间,由于字段类型顺序不正确而触发 LOGICAL_ERROR#87622 (Yarik Briukhovetskyi).
  • 修复在可执行字典中对 command_read_timeout 的错误处理。#87627Azat Khuzhin)。
  • 修复了在新分析器下,当在 WHERE 子句中对被替换列进行过滤时,SELECT * REPLACE 行为不正确的问题。 #87630 (xiaohuanlin).
  • 修复了在 Distributed 表上使用 Merge 时的两级聚合问题。#87687 (c-end).
  • 修复在 HashJoin 算法中未使用右侧行列表时输出块的生成。修复了 #87401#87699Dmitry Novik)。
  • 在应用索引分析后,如无可读数据,可能会错误地选择并行副本读取模式。修复了 #87653#87700zoomxi)。
  • 修复 Glue 中对 timestamp / timestamptz 列的处理问题。#87733Andrey Zvonov)。
  • 已关闭 #86587#87761scanhex12)。
  • 修复在 PostgreSQL 接口中写入布尔值的问题。#87762 (Artem Yurov).
  • 修复在带有 CTE 的 INSERT SELECT 查询中出现的未知表错误,#85368#87789Guang Zhao)。
  • 修复从不能位于 Nullable 的 Variant 类型中读取 null map 子列的问题。 #87798 (Pavel Kruglov)。
  • 修复在集群从节点上未能彻底删除数据库时的错误处理问题。 #87802 (Tuan Pham Anh)。
  • 修复了若干 skip 索引相关缺陷。#87817Raúl Marín)。
  • 在 AzureBlobStorage 中,更新为先尝试使用原生复制,若出现 'Unauthroized' 错误,则回退为读写方式(在 AzureBlobStorage 中,如果源和目标使用不同的存储账号,会出现 'Unauthorized' 错误)。并修复了在配置中定义了 endpoint 时应用 "use_native_copy" 的问题。#87826Smita Kulkarni)。
  • 如果 ArrowStream 文件包含非唯一的字典,ClickHouse 会崩溃。#87863 (Ilya Golshtein)。
  • 修复使用 approx_top_kfinalizeAggregation 时导致的致命错误。 #87892 (Jitendra)。
  • 修复当最后一个数据块为空时与 PROJECTION 的合并。 #87928 (Raúl Marín).
  • 当参数类型不被允许用于 GROUP BY 时,不再从 GROUP BY 中移除单射函数。 #87958 (Pavel Kruglov)。
  • 修复在查询中使用 session_timezone 设置时,对基于 datetime 的键进行 granule/分区裁剪不正确的问题。 #87987 (Eduard Karacharov).
  • PostgreSQL 接口现在会在查询执行后返回受影响的行数。 #87990 (Artem Yurov).
  • 限制在 PASTE JOIN 中启用过滤下推,以避免产生错误结果。#88078 (Yarik Briukhovetskyi).
  • 在对 https://github.com/ClickHouse/ClickHouse/pull/84503 引入的权限检查进行评估之前,先应用 URI 规范化处理。#88089pufit)。
  • 修复在新分析器中,当 ARRAY JOIN COLUMNS() 未匹配到任何列时的逻辑错误。#88091 (xiaohuanlin)。
  • 修复“ClickHouse 内存使用率过高”警告(不包括页面缓存 page cache)。 #88092 (Azat Khuzhin).
  • 修复了在具有 Set 列生存时间 (TTL) 的 MergeTree 表中可能出现的数据损坏问题。#88095 (Anton Popov)。
  • 修复在附加包含无效数据表的外部数据库(PostgreSQL/SQLite/...)时读取 system.tables 可能出现的未捕获异常。#88105 (Azat Khuzhin)。
  • 修复了在以空元组作为参数调用 mortonEncodehilbertEncode 函数时发生崩溃的问题。#88110 (xiaohuanlin).
  • 现在,在集群中存在非活动副本时,ON CLUSTER 查询的执行时间将缩短。#88153 (alesapin).
  • 现在 DDL worker 会从副本集中清理过期的主机记录,从而减少存储在 ZooKeeper 中的元数据量。#88154 (alesapin).
  • 修复在未使用 cgroups 的情况下运行 ClickHouse 的问题(之前由于异步指标,cgroups 被意外地设成了必需条件)。#88164 (Azat Khuzhin).
  • 在出现错误时对移动目录操作进行正确回滚。我们需要重写执行期间更改的所有 prefix.path 对象,而不仅仅是根对象。 #88198 (Mikhail Artemenko)。
  • 修复了在 ColumnLowCardinality 中传播 is_shared 标志的问题。如果在哈希值已经预先计算并缓存在 ReverseIndex 中之后,又在某列中插入了新值,可能会导致错误的 GROUP BY 结果。 #88213 (Nikita Taranov).
  • 修复了工作负载配置 max_cpu_share 的问题。现在即使未设置工作负载配置 max_cpus,也可以使用该配置。#88217 (Neerav).
  • 修复了一个 bug:开销很大的、带有子查询的 mutation 可能会卡在准备阶段。现在可以通过 SYSTEM STOP MERGES 来停止这些 mutation。#88241 (alesapin)。
  • 现在,可以在对象存储上使用相关子查询。#88290 (alesapin)。
  • 避免在访问 system.projectionssystem.data_skipping_indices 时尝试初始化 DataLake 数据库。#88330 (Azat Khuzhin).
  • 现在,只有在显式启用 show_data_lake_catalogs_in_system_tables 时,数据湖目录才会在系统自省表中显示。#88341alesapin)。
  • 已修复 DatabaseReplicated,使其遵循 interserver_http_host 配置。#88378xiaohuanlin)。
  • 在定义 PROJECTION 时,现在已在语义上明确禁用位置参数,因为在该内部查询阶段使用它们并不合理。此更改修复了 #48604#88380Amos Bird)。
  • 修复了 countMatches FUNCTION 中的平方级时间复杂度问题。关闭了 #88400#88401Alexey Milovidov)。
  • 使针对 KeeperMap 表的 ALTER COLUMN ... COMMENT 命令也会被复制,从而提交到 Replicated 数据库元数据并传播到所有副本。修复了 #88077#88408Eduard Karacharov)。
  • 修复了 Database Replicated 中与 Materialized Views 相关的一处伪循环依赖问题,该问题会导致无法向数据库添加新的副本。 #88423 (Nikolay Degterinsky).
  • 修复在将 group_by_overflow_mode 设置为 any 时对稀疏列聚合时的错误。 #88440 (Eduard Karacharov).
  • 修复在将 query_plan_use_logical_join_step 设为 0 且包含多个 FULL JOIN USING 子句时触发的 “column not found” 错误。关闭 #88103#88473Vladimir Cherkasov)。
  • 节点数量 > 10 的大型集群在执行恢复时,很大概率会失败,并出现错误 [941] 67c45db4-4df4-4879-87c5-25b8d1e0d414 &lt;Trace&gt;: RestoreCoordinationOnCluster The version of node /clickhouse/backups/restore-7c551a77-bd76-404c-bad0-3213618ac58e/stage/num_hosts changed (attempt #9), will try againnum_hosts 节点会被许多主机同时写入覆写。该修复将用于控制重试次数的设置改为可动态调整。修复 #87721#88484 (Mikhail f. Shiryaev)。
  • 本 PR 仅用于与 23.8 及更早版本保持兼容;该兼容性问题由此 PR 引入:https://github.com/ClickHouse/ClickHouse/pull/54240。在 enable_analyzer=0 时,此 SQL 将会失败(在 23.8 之前则可以正常执行)。#88491JIaQi)。
  • 修复在将较大数值转换为 DateTime 时,accurateCast 错误消息中的 UBSAN 整数溢出问题。#88520xiaohuanlin)。
  • 修复 Tuple 类型的 coalescing merge tree,从而关闭了 #88469#88526scanhex12)。
  • 不再允许对 iceberg_format_version=1 执行删除操作。该修改关闭了 #88444#88532scanhex12)。
  • 此补丁修复了 plain-rewritable 磁盘在任意深度文件夹中的移动操作问题。#88586 (Mikhail Artemenko)。
  • 修复 SQL SECURITY DEFINER 与 *cluster 函数配合使用时的问题。 #88588 (Julian Maicher)。
  • 修复由于对底层 const PREWHERE 列的并发修改导致的潜在崩溃问题。 #88605 (Azat Khuzhin).
  • 修复了从文本索引读取的功能,并在启用 use_skip_indexes_on_data_readuse_query_condition_cache 设置时启用了查询条件缓存。#88660 (Anton Popov).
  • Poco::Net::HTTPChunkedStreamBuf::readFromDevice 抛出的 Poco::TimeoutException 异常会导致进程因 SIGABRT 而崩溃。#88668 (Miсhael Stetsyuk)。
  • 已在 #88910 中回溯修复:在恢复后,Replicated 数据库的副本可能会长时间卡住,并不断打印类似 Failed to marked query-0004647339 as finished (finished=No node, synced=No node) 的日志消息,现已修复。#88671 (Alexander Tokmakov)。
  • 修复在重新加载配置后,ClickHouse 首次建立连接时向 system.zookeeper_connection_log 追加数据的问题。 #88728 (Antonio Andelic)。
  • 修复了一个错误:在使用 date_time_overflow_behavior = 'saturate' 处理时区时,将 DateTime64 转换为 Date,可能会对超出范围的值产生不正确的结果。 #88737 (Manuel).
  • 第 N 次尝试修复在启用缓存的 S3 表引擎中出现的 "having zero bytes" 错误。 #88740 (Kseniia Sumarokova).
  • 修复了在 SELECT 中使用表函数 loop 时的访问校验问题。#88802pufit)。
  • 当异步日志记录失败时捕获异常,防止程序中止。#88814Raúl Marín)。
  • 已在 #89060 中回溯修复:修复在仅以单个参数调用 top_k 时未正确遵守阈值参数的问题。关闭 #88757#88867Manuel)。
  • 已在 #88944 中回溯修复:修复函数 reverseUTF8 中的一个错误。在之前的版本中,它会错误地反转长度为 4 的 UTF-8 码点的字节顺序。此修复关闭了 #88913#88914Alexey Milovidov)。
  • 已在 #88980 中回溯修复:在使用 SQL SECURITY DEFINER 创建视图时,不再检查 SET DEFINER &lt;current_user&gt;:definer 的访问权限。#88968 (pufit)。
  • 已在 #89058 中向后移植:修复了 L2DistanceTransposed(vec1, vec2, p) 中的 LOGICAL_ERROR,该错误是因为针对部分 QBit 读取的优化在 pNullable 时错误地从返回类型中移除了 Nullable#88974Raufs Dunamalijevs)。
  • 已在 #89167 中回溯:修复未知目录类型时的崩溃。修复 #88819#88987scanhex12)。
  • 已在 #89028 中回溯修复:修复了在分析跳过索引时出现的性能下降问题。#89004Anton Popov)。

构建/测试/打包改进

  • 使用 postgres 库 18.0 版本。#87647 (Konstantin Bogdanov)。
  • 在 FreeBSD 上启用 ICU 支持。#87891 (Raúl Marín)。
  • 当使用动态分发到 SSE 4.2 时,使用 SSE 4.2 而不是 SSE 4。#88029 (Raúl Marín)。
  • 如果 Speculative Store Bypass Safe 不可用,则不再要求设置 NO_ARMV81_OR_HIGHER 标志。#88051 (Konstantin Bogdanov)。
  • 当 ClickHouse 以 ENABLE_LIBFIU=OFF 构建时,与 failpoint 相关的函数将变成空操作(no-op),不再影响性能。在这种情况下,SYSTEM ENABLE/DISABLE FAILPOINT 查询会返回 SUPPORT_IS_DISABLED 错误。#88184 (c-end)。

ClickHouse 版本 25.9,2025-09-25

向后不兼容的变更

  • 禁用对 IPv4/IPv6 进行无意义的二元运算:对 IPv4/IPv6 与非整数类型执行加法/减法运算被禁用。此前允许与浮点类型进行运算,并且在某些其他类型(例如 DateTime)上会抛出逻辑错误。#86336 (Raúl Marín).
  • 弃用 allow_dynamic_metadata_for_data_lakes 设置。现在所有 Iceberg 表都会在执行每个查询之前尝试从存储中获取最新的表模式。#86366 (Daniil Ivanik).
  • 更改了对 OUTER JOIN ... USING 子句中合并列的解析方式,使其更加一致:此前,当在 OUTER JOIN 中同时选择 USING 列和限定列(a, t1.a, t2.a)时,USING 列会被错误地解析为 t1.a,从而对右表中没有左表匹配的行显示为 0/NULL。现在,来自 USING 子句的标识符始终解析为合并列,而限定标识符解析为未合并的列,而不再依赖查询中存在的其他标识符。例如:sql SELECT a, t1.a, t2.a FROM (SELECT 1 as a WHERE 0) t1 FULL JOIN (SELECT 2 as a) t2 USING (a) -- 之前: a=0, t1.a=0, t2.a=2(不正确——'a' 被解析为 t1.a) -- 之后: a=2, t1.a=0, t2.a=2(正确——'a' 是合并列)。#80848 (Vladimir Cherkasov).
  • 将副本表的去重窗口上限增加到 10000。此更改完全兼容,但在存在大量表的情况下,我们可以预见这一变更可能导致较高的资源消耗。#86820 (Sema Checherinda).

新功能

  • 现在,您可以通过在 NATS 引擎中指定新的 nats_streamnats_consumer 设置来使用 NATS JetStream 消费消息。#84799 (Dmitry Novikov)。
  • arrowFlight 表函数中增加了对身份验证和 SSL 的支持。#87120Vitaly Baranov)。
  • S3 表引擎和 s3 表函数新增名为 storage_class_name 的参数,用于指定 AWS 支持的 S3 Intelligent-Tiering 存储类。该参数同时支持键值格式以及位置参数(已弃用)格式。#87122 (alesapin)。
  • 为 Iceberg 表引擎添加 ALTER UPDATE 支持。 #86059 (scanhex12).
  • 添加系统表 iceberg_metadata_log,以便在执行 SELECT 语句时检索 Iceberg 元数据文件。#86152 (scanhex12)。
  • IcebergDeltaLake 表现在通过存储层级设置项 disk 支持自定义磁盘配置。#86778scanhex12)。
  • 为数据湖磁盘增加对 Azure 的支持。#87173 (scanhex12).
  • 支持在 Azure Blob Storage 上使用 Unity catalog。 #80013 (Smita Kulkarni)。
  • Iceberg 写入中支持更多格式(ORCAvro),从而关闭了 #86179#87277scanhex12)。
  • 新增系统表 database_replicas,用于提供数据库副本相关信息。 #83408 (Konstantin Morozov).
  • 新增函数 arrayExcept,用于将一个数组从另一个数组中按集合语义做差运算。 #82368 (Joanna Hulboj)。
  • 新增了一个 system.aggregated_zookeeper_log 表。该表包含 ZooKeeper 操作的统计信息(例如操作次数、平均延迟、错误数),按会话 ID、父路径及操作类型分组,并定期刷新到磁盘。#85102 #87208 (Miсhael Stetsyuk)。
  • 新增函数 isValidASCII。如果输入字符串或 FixedString 仅包含 ASCII 字节(0x00–0x7F),则返回 1,否则返回 0。关闭 #85377。... #85786rajat mohan)。
  • 布尔类型设置项可以在不带参数的情况下指定,例如 SET use_query_cache;,这等价于将其设置为 true。#85800 (thraeka)。
  • 新的配置选项:logger.startupLevellogger.shutdownLevel 允许分别在 ClickHouse 启动和关闭期间覆盖日志级别。#85967Lennard Eijsackers)。
  • 聚合函数 timeSeriesChangesToGridtimeSeriesResetsToGrid。其行为与 timeSeriesRateToGrid 类似,接受起始时间戳、结束时间戳、步长和回溯窗口等参数,以及用于时间戳和值的两个参数,但要求每个窗口至少有 1 个样本而不是 2 个。计算 PromQL 中的 changes/resets,在参数定义的时间网格中,对每个时间戳统计在指定窗口内样本值发生变化或减少的次数。返回类型为 Array(Nullable(Float64))#86010 (Stephen Chi)。
  • 允许用户使用与临时表类似的语法(CREATE TEMPORARY VIEW)创建临时视图。#86432Aly Kafoury)。
  • system.warnings 表中新增 CPU 和内存使用情况的警告。#86838 (Bharat Nallan)。
  • Protobuf 输入中支持 oneof 标识。可以使用一个特殊列来指示 oneof 中某部分的存在。如果消息包含 oneof 并且设置了 input_format_protobuf_oneof_presence,ClickHouse 会填充该列,用于指示 oneof 中具体是哪一个字段被设置。#82885Ilya Golshtein)。
  • 基于 jemalloc 的内部工具改进内存分配分析。现在可以通过配置 jemalloc_enable_global_profiler 启用全局 jemalloc 分析器。通过启用配置 jemalloc_collect_global_profile_samples_in_trace_log,采样得到的全局内存分配和释放信息可以以 JemallocSample 类型存储在 system.trace_log 中。现在可以通过设置 jemalloc_enable_profiler,为每个查询单独启用 jemalloc 分析。是否将采样数据存储到 system.trace_log 中可以通过设置 jemalloc_collect_profile_samples_in_trace_log 在查询粒度上进行控制。将 jemalloc 更新到较新版本。#85438 (Antonio Andelic)。
  • 新增一项用于在删除 Iceberg 表时删除文件的设置。修复了 #86211#86501scanhex12)。

实验性功能

  • 倒排文本索引从零开始重构,现在可以扩展到无法完全放入 RAM 的数据集。#86485 (Anton Popov)。
  • Join 重排序现在会使用统计信息。可通过设置 allow_statistics_optimize = 1query_plan_optimize_join_order_limit = 10 启用该功能。#86822 (Han Fei)。
  • 新增对 alter table ... materialize statistics all 的支持,可物化一个表的所有统计信息。#87197 (Han Fei)。

性能优化

  • 在读取数据时支持使用 skip 索引过滤数据分区片段,从而减少不必要的索引读取。由新的 use_skip_indexes_on_data_read 设置控制(默认禁用)。该改动解决了 #75774,并包含与 #81021 共享的一些通用基础工作。#81526Amos Bird)。
  • 添加了 JOIN 顺序优化功能,可以自动重新排序 JOIN 以获得更好的性能(由参数 query_plan_optimize_join_order_limit 控制)。请注意,当前 JOIN 顺序优化对统计信息的支持仍然有限,主要依赖于存储引擎中的行数估算——未来版本中将会加入更完善的统计信息收集和基数估算功能。如果在升级后遇到 JOIN 查询问题,可以通过设置 SET query_plan_use_new_logical_join_step = 0 临时禁用新的实现,并反馈问题以便进行排查。关于 USING 子句中标识符解析的说明:对 OUTER JOIN ... USING 子句中合并列(coalesced column)的解析方式进行了修改,使其更加一致:之前,在一个 OUTER JOIN 中同时选择 USING 列和带限定前缀的列(a, t1.a, t2.a)时,USING 列会被错误地解析为 t1.a,从而对右表中没有匹配左表的行显示为 0/NULL。现在,来自 USING 子句的标识符始终解析为合并列,而带限定前缀的标识符始终解析为未合并的列,而不再取决于查询中还选择了哪些其他标识符。例如:
  • 用于数据湖的分布式 INSERT SELECT#86783 (scanhex12)。
  • 改进对 func(primary_column) = 'xx'column in (xxx) 等条件的 PREWHERE 优化。#85529李扬)。
  • 实现了对 JOIN 的重写:1. 当匹配或未匹配行的过滤条件始终为 false 时,将 LEFT ANY JOINRIGHT ANY JOIN 转换为 SEMI/ANTI JOIN。该优化由新的设置 query_plan_convert_any_join_to_semi_or_anti_join 控制。2. 当来自一侧的未匹配行的过滤条件始终为 false 时,将 FULL ALL JOIN 转换为 LEFT ALLRIGHT ALL JOIN。 #86028 (Dmitry Novik)。
  • 在执行轻量级删除后,垂直合并的性能得到提升。 #86169 (Anton Popov).
  • LEFT/RIGHT join 包含大量未匹配行的情况下,对 HashJoin 的性能进行了小幅优化。#86312 (Nikita Taranov)。
  • 基数排序:帮助编译器使用 SIMD,以便更好地进行预取。使用动态派发,仅在 Intel CPU 上启用软件预取。延续了 @taiyang-li 在 https://github.com/ClickHouse/ClickHouse/pull/77029 中的工作。#86378Raúl Marín)。
  • 通过将 MarkRanges 从基于 deque 优化为基于 devector 的实现,提升了在包含大量分区片段的表上执行的短查询的性能。 #86933 (Azat Khuzhin).
  • 提升了在 join 模式下应用补丁分区片段时的性能。#87094 (Anton Popov)。
  • 添加了名为 query_condition_cache_selectivity_threshold 的设置(默认值:1.0),用于将选择性较低的谓词扫描结果排除在插入查询条件缓存之外。这样可以在以较低缓存命中率为代价的情况下,降低查询条件缓存的内存消耗。#86076 (zhongyuankai).
  • 降低 Iceberg 写入的内存占用。#86544 (scanhex12).

改进

  • 支持在一次插入操作中向 Iceberg 写入多个数据文件。新增 iceberg_insert_max_rows_in_data_fileiceberg_insert_max_bytes_in_data_file 两个设置,用于控制相应的限制。#86275 (scanhex12).
  • 为 Delta Lake 中插入的数据文件添加行数/字节数限制。由设置项 delta_lake_insert_max_rows_in_data_filedelta_lake_insert_max_bytes_in_data_file 控制。#86357 (Kseniia Sumarokova).
  • 在 Iceberg 写入操作中支持更多类型的分区。已关闭 #86206#86298scanhex12)。
  • 使 S3 重试策略可配置,并支持在修改配置 XML 文件后热加载 S3 磁盘的设置。 #82642 (RinChanNOW).
  • 改进了 S3(Azure)Queue 表引擎,使其在 ZooKeeper 连接丢失时也能继续运行,并避免潜在的重复数据。需要启用 S3Queue 设置 use_persistent_processing_nodes(可通过 ALTER TABLE MODIFY SETTING 更改)。#85995Kseniia Sumarokova)。
  • 在创建 materialized view 时,可以在 TO 之后使用查询参数,例如:CREATE MATERIALIZED VIEW mv TO {to_table:Identifier} AS SELECT * FROM src_table#84899Diskein)。
  • 当为 Kafka2 表引擎指定错误设置时,为用户提供更清晰的指导信息。 #83701 (János Benjamin Antal).
  • Time 类型已经不再支持指定时区(这本来就没有意义)。 #84689 (Yarik Briukhovetskyi).
  • best_effort 模式下,简化了解析 Time/Time64 的相关逻辑,并避免了一些错误。#84730 (Yarik Briukhovetskyi)。
  • 新增 deltaLakeAzureCluster 函数(类似于集群模式下的 deltaLakeAzure)以及 deltaLakeS3Cluster 函数(为 deltaLakeCluster 的别名)。解决了 #85358#85547Smita Kulkarni)。
  • 以与备份相同的方式,将 azure_max_single_part_copy_size 设置应用于普通拷贝操作。#85767 (Ilya Golshtein)。
  • 在 S3 对象存储中,当出现可重试错误时放缓 S3 客户端线程的速度。此更改将之前的设置 backup_slow_all_threads_after_retryable_s3_error 扩展到 S3 磁盘,并将其重命名为更通用的 s3_slow_all_threads_after_retryable_error#85918 (Julia Kartseva)。
  • 将设置项 allow_experimental_variant/dynamic/jsonenable_variant/dynamic/json 标记为弃用。现在这三种类型都会被无条件启用。#85934 (Pavel Kruglov).
  • 支持在 http_handlers 中基于完整 URL 字符串(通过 full_url 指令,包含 schema 和 host:port)进行过滤。 #86155 (Azat Khuzhin).
  • 新增一个新的配置项 allow_experimental_delta_lake_writes#86180 (Kseniia Sumarokova).
  • 修复 init.d 脚本中对 systemd 的检测(修正对 “Install packages” 检查的影响)。 #86187 (Azat Khuzhin).
  • 新增一个名为 startup_scripts_failure_reason 的维度指标。该指标用于区分导致启动脚本失败的不同错误类型。尤其是为了告警,我们需要区分瞬时错误(例如 MEMORY_LIMIT_EXCEEDEDKEEPER_EXCEPTION)和非瞬时错误。#86202 (Miсhael Stetsyuk)。
  • 允许在 Iceberg 表中为分区省略 identity 函数。#86314 (scanhex12)。
  • 新增支持仅为特定通道启用 JSON 日志记录;为此,将 logger.formatting.channel 设置为 syslog/console/errorlog/log 之一即可。#86331 (Azat Khuzhin)。
  • 允许在 WHERE 中使用原生数值。它们已经可以作为逻辑函数的参数使用。这有助于简化 filter push-down 和 move-to-prewhere 优化。#86390 (Nikolai Kochetov)。
  • 修复了在针对元数据损坏的 Catalog 执行 SYSTEM DROP REPLICA 时出现的错误。 #86391 (Nikita Mikhaylov)。
  • 在 Azure 中为磁盘访问检查(skip_access_check = 0)增加额外的重试次数,因为 Azure 在开通访问权限时可能需要相当长的时间。#86419Alexander Tokmakov)。
  • timeSeries*() 函数中的过期窗口改为左开右闭区间。#86588 (Vitaly Baranov)。
  • 添加 FailedInternal*Query ProfileEvents。 #86627 (Shane Andrade)。
  • 修复了通过配置文件添加名称中包含句点 (.) 的用户时的处理逻辑。 #86633 (Mikhail Koviazin)。
  • 添加查询内存使用的异步指标(QueriesMemoryUsageQueriesPeakMemoryUsage)。 #86669 (Azat Khuzhin).
  • 你可以使用 clickhouse-benchmark --precise 参数,更精确地报告 QPS 和其他按时间区间统计的指标。当查询持续时间与报告间隔 --delay D 相当时,它有助于获得稳定一致的 QPS 结果。#86684 (Sergei Trifonov)。
  • 使 Linux 线程的 nice 值可配置,以便为某些线程(合并/变更、查询、materialized view、ZooKeeper 客户端)分配更高或更低的优先级。#86703Miсhael Stetsyuk)。
  • 修复具有误导性的“specified upload does not exist”错误,该错误会在分片上传过程中由于竞态条件导致原始异常丢失时出现。 #86725 (Julia Kartseva)。
  • 限制 EXPLAIN 查询中的查询计划描述长度,不再为非 EXPLAIN 查询计算该描述。新增设置 query_plan_max_step_description_length#86741 (Nikolai Kochetov)。
  • 新增支持调节待处理信号的能力,以尝试避免出现 CANNOT_CREATE_TIMER 错误(用于 query profiler,query_profiler_real_time_period_ns/query_profiler_cpu_time_period_ns)。同时从 /proc/self/status 收集 SigQ 以便自检(如果 ProcessSignalQueueSize 接近 ProcessSignalQueueLimit,则很可能会出现 CANNOT_CREATE_TIMER 错误)。 #86760 (Azat Khuzhin).
  • 提升 Keeper 中 RemoveRecursive 请求的性能。 #86789 (Antonio Andelic).
  • 在输出 JSON 类型数据时,移除 PrettyJSONEachRow 中多余的空白字符。#86819 (Pavel Kruglov)。
  • 现在会在删除普通可重写磁盘上的目录时记录 prefix.path 的 blob 大小。#86908 (alesapin)。
  • 支持对远程 ClickHouse 实例(包括 ClickHouse Cloud)进行性能测试。使用示例:tests/performance/scripts/perf.py tests/performance/math.xml --runs 10 --user <username> --password <password> --host <hostname> --port <port> --secure#86995Raufs Dunamalijevs)。
  • 在已知会大量分配(>16MiB)内存的某些位置(如排序、异步插入、file log)中遵守内存限制。#87035 (Azat Khuzhin)。
  • 如果将 network_compression_method 设置为不受支持的通用编解码器,则抛出异常。 #87097 (Robert Schulze).
  • 系统表 system.query_cache 现在会返回所有查询结果缓存条目,而之前只返回共享条目,或同一用户和角色的非共享条目。这是合理的,因为非共享条目本就不应该泄露查询结果,而 system.query_cache 返回的是查询字符串。这使得该系统表的行为更接近 system.query_log#87104 (Robert Schulze).
  • parseDateTime 函数启用短路求值机制。 #87184 (Pavel Kruglov).
  • system.parts_columns 中新增一个名为 statistics 的列。 #87259 (Han Fei)。

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 对于副本数据库和内部复制表,ALTER 查询的结果现在只在发起节点上进行验证。此更改修复了某些情况下已经提交的 ALTER 查询会在其他节点上卡住的问题。 #83849 (János Benjamin Antal)。
  • 限制 BackgroundSchedulePool 中每种类型任务的数量,防止出现所有槽位都被某一类型任务占满,导致其他任务饥饿的情况,同时避免任务之间相互等待而引发的死锁。此行为由服务器 SETTING background_schedule_pool_max_parallel_tasks_per_type_ratio 控制。#84008 (Alexander Tokmakov)。
  • 在恢复数据库副本时要正确关闭表。不正确的关闭方式会在数据库副本恢复期间导致某些表引擎出现 LOGICAL_ERROR。 #84744 (Antonio Andelic).
  • 在为数据库名称生成拼写更正提示时检查访问权限。 #85371 (Dmitry Novik).
    1. 为 hive 列使用 LowCardinality 2. 在虚拟列之前填充 hive 列(这是 https://github.com/ClickHouse/ClickHouse/pull/81040 所需)3. 在 hive 的空格式上触发 LOGICAL_ERROR #85528 4. 修复对 “hive 分区列是仅有列” 情况的检查 5. 断言 schema 中指定了所有 hive 列 6. 部分修复使用 hive 的 parallel_replicas_cluster 7. 在 hive 工具的 extractKeyValuePairs 中使用有序容器(这是 https://github.com/ClickHouse/ClickHouse/pull/81040 所需)。#85538Arthur Passos)。
  • 在使用数组映射时,禁止对 IN 函数的第一个参数进行不必要的优化,以避免偶发错误。 #85546 (Yakov Olkhovskiy).
  • 在写入 Parquet 文件时,未根据 schema 调整 Iceberg 源 ID 与 Parquet 名称之间的映射。此 PR 会针对每个 Iceberg 数据文件处理其对应的 schema,而不是使用当前的 schema。#85829 (Daniil Ivanik)。
  • 修复了将读取文件大小与打开文件分离的处理方式。与 https://github.com/ClickHouse/ClickHouse/pull/33372 相关,该变更最初是为了解决 5.10 版本发布之前的 Linux 内核中的一个 bug 而引入的。#85837Konstantin Bogdanov)。
  • 在内核级别禁用 IPv6 的系统上(例如在 RHEL 中设置 ipv6.disable=1),ClickHouse Keeper 不再出现无法启动的问题。现在,当初始 IPv6 监听失败时,它会尝试退回到 IPv4 监听。#85901 (jskong1124)。
  • 此 PR 解决了 #77990。在 globalJoin 中为并行副本添加 TableFunctionRemote 支持。#85929zoomxi)。
  • 修复 orcschemareader::initializeifneeded() 中的空指针问题。此 PR 解决了以下 issue:#85292 ### 面向用户可见更改的文档条目。#85951 (yanglongwei)。
  • 添加检查,仅当 FROM 子句中的相关子查询使用外部查询的列时才允许它们。修复 #85469。修复 #85402#85966Dmitry Novik)。
  • 修复了在执行 ALTER UPDATE 时,如果某列的子列被其他列的物化表达式引用,该列更新不正确的问题。此前,表达式中包含子列的物化列无法被正确更新。#85985Pavel Kruglov)。
  • 禁止修改其子列被用作主键或分区表达式的列。#86005 (Pavel Kruglov)。
  • 修复在 DeltaLake 存储中使用非默认列映射模式读取子列的问题。#86064 (Kseniia Sumarokova).
  • 修复了在 JSON 中针对带有 Enum 提示的路径错误使用默认值的问题。 #86065 (Pavel Kruglov).
  • 为 DataLake Hive catalog URL 解析添加输入净化处理。解决 #86018#86092rajat mohan)。
  • 修复文件系统缓存动态调整大小时的逻辑错误。关闭 #86122。关闭 https://github.com/ClickHouse/clickhouse-core-incidents/issues/473#86130Kseniia Sumarokova)。
  • 在 DatabaseReplicatedSettings 中将 logs_to_keep 设置为 NonZeroUInt64 类型。#86142 (Tuan Pham Anh)。
  • 如果表(例如 ReplacingMergeTree)在创建时将 setting index_granularity_bytes 设为 0,则带有 skip 索引的 FINAL 查询会抛出异常。该异常现已修复。 #86147 (Shankar Iyer).
  • 移除了未定义行为(UB),并修复了 Iceberg 分区表达式的解析问题。#86166Daniil Ivanik)。
  • 修复在单个 INSERT 语句中同时包含 const 和非 const 块时出现的崩溃问题。 #86230 (Azat Khuzhin).
  • 在通过 SQL 创建磁盘时,默认处理来自 /etc/metrika.xml 的 include 指令。#86232 (alekar).
  • 修复 accurateCastOrNull/accurateCastOrDefault 在从 String 转换为 JSON 时的行为。#86240Pavel Kruglov)。
  • 在 Iceberg 引擎中支持不含 '/' 的目录。#86249 (scanhex12)。
  • 修复在 replaceRegex 使用 FixedString 类型的 haystack 且 needle 为空时发生的崩溃问题。#86270 (Raúl Marín)。
  • 修复在执行 ALTER UPDATE Nullable(JSON) 时发生的崩溃。#86281 (Pavel Kruglov).
  • 修复 system.tables 中缺失的列定义信息。 #86295 (Raúl Marín)。
  • 修复从 LowCardinality(Nullable(T)) 到 Dynamic 的类型转换。#86365 (Pavel Kruglov)。
  • 修复了在向 DeltaLake 写入数据时出现的逻辑错误。关闭 #86175#86367Kseniia Sumarokova)。
  • 修复在针对 plain_rewritable 磁盘从 Azure Blob Storage 读取空 blob 时出现的 416 The range specified is invalid for the current size of the resource. The range specified is invalid for the current size of the resource 错误。#86400Julia Kartseva)。
  • 修复在 Nullable(JSON) 上使用 GROUP BY 时的问题。 #86410 (Pavel Kruglov)。
  • 修复了一个 Materialized Views 的问题:当某个 MV 被创建、删除后,再以相同名称重新创建时,可能无法正常工作。 #86413 (Alexander Tokmakov)。
  • 在从 *cluster 函数读取时,如果所有副本都不可用,则使查询失败。 #86414 (Julian Maicher).
  • 修复由于 Buffer 表导致的 MergesMutationsMemoryTracking 内存泄漏问题,并修复 query_views_log 在从 Kafka(及其他)进行流式读取时的问题。 #86422 (Azat Khuzhin).
  • 修复在删除别名存储所引用的表后执行 show tables 时的行为。 #86433 (RinChanNOW).
  • 修复在启用 send_chunk_header 时,通过 HTTP 协议调用 UDF 会缺失 chunk header 的问题。#86469 (Vladimir Cherkasov).
  • 修复在启用 jemalloc profile flush 时可能出现的死锁问题。#86473Azat Khuzhin)。
  • 修复了 DeltaLake 表引擎中读取子列的问题。解决了 #86204#86477Kseniia Sumarokova)。
  • 正确处理环回主机 ID,以在处理 DDL 任务时避免发生冲突。#86479 (Tuan Pham Anh)。
  • 修复了对 Postgres 数据库引擎中包含 numeric/decimal 列的表执行 DETACH/ATTACH 时的问题。 #86480 (Julian Maicher).
  • 修复在 getSubcolumnType 中使用未初始化内存的问题。#86498Raúl Marín)。
  • 当以空 needles 作为参数调用 searchAnysearchAll 函数时,现在会返回 true(即“匹配所有”)。之前,它们会返回 false。(issue #86300)。#86500Elmi Ahmadov)。
  • 修复函数 timeSeriesResampleToGridWithStaleness() 在第一个桶没有值时的行为。#86507Vitaly Baranov)。
  • 修复由于将 merge_tree_min_read_task_size 设置为 0 而导致的崩溃。 #86527 (yanglongwei).
  • 在读取时,现在会为每个数据文件从 Iceberg 元数据中获取格式(此前是从表参数中获取)。#86529 (Daniil Ivanik)。
  • 在关闭时刷新日志的过程中忽略异常,使关闭过程更安全(避免 SIGSEGV)。#86546 (Azat Khuzhin).
  • 修复了 Backup 数据库引擎在处理包含零大小 part 文件的查询时抛出异常的问题。 #86563 (Max Justus Spransy).
  • 修复在启用 send_chunk_header 且通过 HTTP 协议调用 UDF 时丢失分块头的问题。 #86606 (Vladimir Cherkasov).
  • 修复了 S3Queue 中由于 Keeper 会话过期导致的逻辑错误 "Expected current processor to be equal to "。#86615Kseniia Sumarokova)。
  • 修复了插入和剪枝中的可空性相关错误。这关闭了 #86407#86630scanhex12)。
  • 在 Iceberg 元数据缓存被禁用时,不要禁用文件系统缓存。#86635 (Daniil Ivanik)。
  • 修复了 Parquet 读取器 v3 中的 'Deadlock in Parquet::ReadManager (single-threaded)' 错误。#86644 (Michael Kolupaev).
  • 修复 ArrowFlight 中 listen_host 的 IPv6 支持。#86664Vitaly Baranov)。
  • 修复 ArrowFlight 处理器中的关闭过程。本 PR 修复了 #86596#86665Vitaly Baranov)。
  • 修复在设置 describe_compact_output=1 时的分布式查询问题。#86676Azat Khuzhin)。
  • 修复窗口定义解析和查询参数应用。#86720 (Azat Khuzhin).
  • 修复在使用 PARTITION BY 创建表但未使用分区通配符时,错误抛出异常 Partition strategy wildcard can not be used without a '_partition_id' wildcard. 的问题;在 25.8 之前的版本中这种用法是可以工作的。关闭了 https://github.com/ClickHouse/clickhouse-private/issues/37567#86748Kseniia Sumarokova)。
  • 修复当并行查询尝试获取同一把锁时触发的 LogicalError。 #86751 (Pervakov Grigorii).
  • 修复了在 RowBinary 输入格式中向共享 JSON 数据写入 NULL 的问题,并在 ColumnObject 中增加了一些额外的校验。#86812 (Pavel Kruglov)。
  • 修复在使用 LIMIT 子句时空 Tuple 的排列问题。 #86828 (Pavel Kruglov).
  • 不要为持久化处理节点使用单独的 keeper 节点。修复了 https://github.com/ClickHouse/ClickHouse/pull/85995。关闭了 #86406#86841Kseniia Sumarokova)。
  • 修复 TimeSeries 引擎表在 Replicated Database 中导致无法创建新副本的问题。#86845Nikolay Degterinsky)。
  • 修复在任务缺少某些 Keeper 节点时对 system.distributed_ddl_queue 的查询问题。 #86848 (Antonio Andelic).
  • 修复在解压后数据块末尾进行定位的问题。 #86906 (Pavel Kruglov).
  • 处理 Iceberg 迭代器异步执行期间抛出的异常。 #86932 (Daniil Ivanik).
  • 修复保存大型预处理 XML 配置时的问题。 #86934 (c-end).
  • 修复 system.iceberg_metadata_log 表中日期字段写入的问题。 #86961 (Daniil Ivanik).
  • 修复了在使用 WHERETTL 无限重复计算的问题。#86965 (Anton Popov).
  • 修复了在使用 ROLLUPCUBE 修饰符时,uniqExact 函数可能产生错误结果的问题。#87014 (Nikita Taranov).
  • 修复在 parallel_replicas_for_cluster_functions 设置为 1 时,使用 url() 表函数解析表结构的问题。 #87029 (Konstantin Bogdanov)。
  • 修正在将 PREWHERE 的输出拆分为多个步骤后对其进行类型转换的逻辑。 #87040 (Antonio Andelic).
  • 修复了在使用 ON CLUSTER 子句时的轻量级更新问题。#87043 (Anton Popov).
  • 修复部分聚合函数状态在处理 String 参数时的兼容性问题。#87049 (Pavel Kruglov)。
  • 修复了一个来自 OpenAI 的模型名称未被正确传递的问题。 #87100 (Kaushik Iska).
  • EmbeddedRocksDB:路径必须位于 user_files 目录内。#87109 (Raúl Marín)。
  • 修复在 25.1 之前创建的 KeeperMap 表在执行 DROP 查询后仍会在 ZooKeeper 中遗留数据的问题。#87112 (Nikolay Degterinsky).
  • 修复在读取 Parquet 时 maps 和 arrays 字段 ID 读取错误的问题。#87136 (scanhex12).
  • 修复在惰性物化中读取带有数组大小子列的数组时的问题。#87139 (Pavel Kruglov)。
  • 修复使用 Dynamic 参数的 CASE 函数的问题。#87177 (Pavel Kruglov)。
  • 修复了在 CSV 中将空字符串解析为空数组的问题。 #87182 (Pavel Kruglov).
  • 修复非关联的 EXISTS 可能产生错误结果的问题。当启用 execute_exists_as_scalar_subquery=1 时会触发该问题,该设置在 https://github.com/ClickHouse/ClickHouse/pull/85481 中被引入,并影响 25.8 版本。修复了 #86415#87207Nikolai Kochetov)。
  • 当未配置 iceberg_metadata_log 时,若用户尝试获取 iceberg 元数据调试信息则抛出错误,修复了空指针访问问题。 #87250 (Daniil Ivanik).

构建/测试/打包改进

ClickHouse 25.8 LTS 版本发布,2025-08-28

向后不兼容的变更

  • 对 JSON 中包含不同类型值的数组,现在推断为 Array(Dynamic),而不是未命名的 Tuple。如需使用之前的行为,请禁用设置 input_format_json_infer_array_of_dynamic_from_array_of_different_types#80859 (Pavel Kruglov)。
  • 将 S3 延迟指标迁移到直方图,以提高一致性并简化指标体系。#82305 (Miсhael Stetsyuk)。
  • 要求在默认表达式中,对包含点号的标识符使用反引号,以防止其被解析为复合标识符。#83162 (Pervakov Grigorii)。
  • 惰性物化仅在启用了 analyzer 时(这是默认行为)才会开启,以避免在未使用 analyzer 时的维护开销——根据我们的经验,未使用 analyzer 时会出现一些问题(例如在条件中使用 indexHint() 时)。#83791 (Igor Nikonov)。
  • 在 Parquet 输出格式中,默认将 Enum 类型的值写为具有 ENUM 逻辑类型的 BYTE_ARRAY#84169 (Pavel Kruglov)。
  • 默认启用 MergeTree 设置 write_marks_for_substreams_in_compact_parts。这可以显著提升从新创建的 Compact 分区片段中读取子列的性能。版本低于 25.5 的服务器将无法读取新的 Compact 分区片段。#84171 (Pavel Kruglov)。
  • 之前 concurrent_threads_scheduler 的默认值为 round_robin,在存在大量单线程查询(例如 INSERT)时被证明是不公平的。此更改将更安全的替代方案 fair_round_robin 调度器设为默认值。#84747 (Sergei Trifonov)。
  • ClickHouse 支持 PostgreSQL 风格的 heredoc 语法:$tag$ string contents... $tag$,也称为美元符号引号字符串字面量。在之前的版本中,对 tag 的限制较少:它们可以包含任意字符,包括标点和空白字符。这会与同样可以以美元符号开头的标识符产生解析歧义。与此同时,PostgreSQL 只允许在 tag 中使用单词字符。为解决该问题,我们现在限制 heredoc tag 只能包含单词字符。修复 #84731#84846 (Alexey Milovidov)。
  • 函数 azureBlobStoragedeltaLakeAzureicebergAzure 已更新,以正确校验 AZURE 权限。所有集群变体函数(-Cluster 函数)现在会针对其对应的非集群变体函数验证权限。此外,icebergLocaldeltaLakeLocal 函数现在会强制执行 FILE 权限检查。#84938 (Nikita Mikhaylov)。
  • 默认启用 allow_dynamic_metadata_for_data_lakes 设置(表引擎级别设置)。#85044 (Daniil Ivanik)。
  • 默认在 JSON 格式中不再为 64 位整数加引号。#74079 (Pavel Kruglov)。

新功能

  • 添加了对 PromQL 方言的基础支持。要使用它,可以在 clickhouse-client 中设置 dialect='promql',并通过设置 promql_table_name='X' 将其指向 TimeSeries 表,然后执行类似 rate(ClickHouseProfileEvents_ReadCompressedBytes[1m])[5m:1m] 的查询。此外,也可以将 PromQL 查询包装在 SQL 中:SELECT * FROM prometheusQuery('up', ...);。目前仅支持 ratedeltaincrease 这几个函数。不支持一元/二元运算符。暂不提供 HTTP API。#75036Vitaly Baranov)。
  • AI 驱动的 SQL 生成现在可以在已设置环境变量 ANTHROPIC_API_KEY 和 OPENAI_API_KEY 时自动推断所需信息,从而实现以零配置方式使用此功能。 #83787 (Kaushik Iska).
  • 通过新增表函数 arrowflight 实现对 ArrowFlight RPC 协议的支持。 #74184 (zakr600)。
  • 现在所有表都支持 _table 虚拟列(不仅是使用 Merge 引擎的表),这在使用 UNION ALL 的查询中尤其有用。 #63665 (Xiaozhe Yu)。
  • 允许在外部聚合/排序中使用任意存储策略(包括对象存储,如 S3)。 #84734 (Azat Khuzhin).
  • 使用显式指定的 IAM 角色实现 AWS S3 身份验证。为 GCS 实现 OAuth。这些特性此前仅在 ClickHouse Cloud 中可用,现在已开源。对部分接口进行了统一处理,例如对象存储连接参数的序列化。#84011 (Alexey Milovidov)。
  • 为 Iceberg TableEngine 增加对 position delete 的支持。#83094 (Daniil Ivanik)。
  • 支持 Iceberg 等值删除(Equality Deletes)。 #85843 (Han Fei)。
  • CREATE 语句提供 Iceberg 写入支持。Closes #83927#83983 (Konstantin Vedernikov)。
  • 支持使用 Glue catalog 进行写入。 #84136 (Konstantin Vedernikov).
  • 支持通过 Iceberg REST 目录进行写入。#84684 (Konstantin Vedernikov).
  • 将所有 Iceberg 位置删除文件合并到数据文件中。这将减少 Iceberg 存储中的 Parquet 文件数量和大小。语法:OPTIMIZE TABLE table_name#85250Konstantin Vedernikov)。
  • 支持对 Iceberg 执行 drop table(从 REST/Glue 目录中移除并删除该表的元数据)。#85395 (Konstantin Vedernikov)。
  • 在 merge-on-read 格式的 Iceberg 表中,支持 ALTER DELETE 变更操作。 #85549 (Konstantin Vedernikov).
  • 支持写入 Delta Lake。解决 #79603#85564Kseniia Sumarokova)。
  • 新增了 delta_lake_snapshot_version 设置,用于在 DeltaLake 表引擎中读取指定的快照版本。#85295 (Kseniia Sumarokova)。
  • 在元数据(manifest 条目)中写入更多 Iceberg 统计信息(列大小、下界和上界),以改进 min-max 剪枝。 #85746 (Konstantin Vedernikov).
  • 在 Iceberg 中支持对简单类型列执行新增/删除/修改操作。 #85769 (Konstantin Vedernikov).
  • Iceberg:支持写入 version-hint 文件,从而关闭 #85097#85130Konstantin Vedernikov)。
  • 由临时用户创建的视图现在会存储对应实际用户的副本,并且在删除该临时用户后也不会再失效。 #84763 (pufit).
  • 向量相似性索引现在支持二值量化。二值量化显著降低了内存消耗,并加快了构建向量索引的过程(由于距离计算更快)。此外,现有的 vector_search_postfilter_multiplier 设置已废弃,并由更通用的设置 vector_search_index_fetch_multiplier 取代。#85024 (Shankar Iyer).
  • 允许在 s3s3Cluster 表引擎/函数中使用键值对形式的参数,例如:s3('url', CSV, structure = 'a Int32', compression_method = 'gzip')#85134 (Kseniia Sumarokova)。
  • 新增系统表,用于保留来自 Kafka 等引擎的错误入站消息(“死信队列”)。 #68873 (Ilya Golshtein).
  • 为 Replicated 数据库新增了 SYSTEM RESTORE DATABASE REPLICA,类似于 ReplicatedMergeTree 中现有的恢复功能。#73100 (Konstantin Morozov)。
  • PostgreSQL 协议现已支持 COPY 命令。#74344Konstantin Vedernikov)。
  • 新增对 MySQL 协议的 C# 客户端支持。解决了 #83992#84397Konstantin Vedernikov)。
  • 添加对 Hive 分区风格的读写支持。#76802 (Arthur Passos)。
  • 添加 zookeeper_connection_log 系统表,用于存储 ZooKeeper 连接的历史信息。#79494 (János Benjamin Antal)。
  • 服务端设置 cpu_slot_preemption 为工作负载启用了抢占式 CPU 调度,并确保在各个工作负载之间实现 max-min 公平的 CPU 时间分配。新增了用于 CPU 限流的工作负载设置:max_cpusmax_cpu_sharemax_burst_cpu_seconds。更多详情请参见:[https://clickhouse.com/docs/operations/workload-scheduling#cpu_scheduling。#80879](https://github.com/ClickHouse/ClickHouse/pull/80879) (Sergei Trifonov)。
  • 在达到配置的查询次数或时间阈值后断开 TCP 连接。这样可以在负载均衡器后方的集群节点之间实现更加均匀的连接分布。解决了 #68000#81472Kenny Sun)。
  • 并行副本现在在查询时也支持使用投影。 #82659#82807 (zoomxi)。
  • 在现有 DESCRIBE (SELECT ...) 的基础上,现在还支持 DESCRIBE SELECT#82947 (Yarik Briukhovetskyi).
  • mysql_portpostgresql_port 强制使用安全连接。 #82962 (tiandiwonder).
  • 现在可以使用 JSONExtractCaseInsensitive(以及 JSONExtract 的其他变体)进行不区分大小写的 JSON 键查找。#83770 (Alistair Evans)。
  • 新增 system.completions 表。关闭 #81889#83833 (|2ustam)。
  • 新增函数 nowInBlock64。示例:SELECT nowInBlock64(6) 返回 2025-07-29 17:09:37.775725#84178Halersson Paris)。
  • 向 AzureBlobStorage 添加 extra_credentials,以便使用 client_id 和 tenant_id 进行身份验证。#84235 (Pablo Marcos)。
  • 新增函数 dateTimeToUUIDv7,用于将 DateTime 值转换为 UUIDv7。示例:SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56')) 返回 0198af18-8320-7a7d-abd3-358db23b9d5c#84319samradovich)。
  • timeSeriesDerivToGridtimeSeriesPredictLinearToGrid 聚合函数,用于将数据重新采样并对齐到由指定起始时间戳、结束时间戳和步长定义的时间栅格上;分别计算类似 PromQL 的 derivpredict_linear#84328 (Stephen Chi)。
  • 新增两个 TimeSeries 函数:- timeSeriesRange(start_timestamp, end_timestamp, step),- timeSeriesFromGrid(start_timestamp, end_timestamp, step, values)#85435 (Vitaly Baranov)。
  • 新增语法:GRANT READ ON S3('s3://foo/.*') TO user#84503pufit)。
  • 新增 Hash 作为新的输出格式。它会为结果中的所有列和行计算一个单一的哈希值。这在需要计算结果“指纹”的场景中非常有用,例如当数据传输成为瓶颈时。示例:SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash 返回 e5f9e676db098fdb9530d2059d8c23ef#84607Robert Schulze)。
  • 为 Keeper Multi 查询新增设置任意 watch 的能力。 #84964 (Mikhail Artemenko).
  • clickhouse-benchmark 工具新增选项 --max-concurrency,用于启用一种模式,该模式下并行查询数量会逐步增加。#85623Sergei Trifonov)。
  • 支持部分聚合指标。#85328 (Mikhail Artemenko)。

实验特性

  • 默认启用相关子查询支持,它们不再是实验性特性。#85107 (Dmitry Novik).
  • Unity、Glue、REST 和 Hive Metastore 数据湖目录从实验性升级为 Beta 版。#85848 (Melvyn Peignon).
  • 轻量级更新和删除从实验性升级为 Beta 版。
  • 使用向量相似度索引的近似向量搜索现已正式发布(GA)。#85888 (Robert Schulze).
  • Ytsaurus 表引擎和表函数。#77606 (MikhailBurdukov).
  • 之前,文本索引数据会被拆分为多个段(每个段的默认大小为 256 MiB)。这可能在构建文本索引时降低内存消耗,但会增加磁盘空间占用并延长查询响应时间。#84590 (Elmi Ahmadov).

性能优化

  • 新的 Parquet 读取器实现。通常更快,并支持页级过滤下推和 PREWHERE。目前为实验性功能。使用设置 input_format_parquet_use_native_reader_v3 来启用。#82789 (Michael Kolupaev).
  • 用我们自行实现的 HTTP 客户端替换了 Azure 库中官方的 HTTP 传输层,用于访问 Azure Blob Storage。为这些客户端引入了多项配置选项,其行为与 S3 的相关设置保持一致。为 Azure 和 S3 都引入了更为激进的连接超时设置。改进了对 Azure profile events 和指标的观测与分析能力。新的客户端默认启用,在基于 Azure Blob Storage 的冷查询场景下显著降低了延迟。旧的 Curl 客户端可以通过设置 azure_sdk_use_native_client=false 恢复使用。#83294alesapin)。此前官方提供的 Azure 客户端实现由于存在极其严重的延迟抖动(从 5 秒到数分钟不等),完全不适合在生产环境中使用。我们已经彻底弃用这一糟糕的实现,并对此感到非常自豪。
  • 按文件大小递增顺序处理索引。总体索引排序策略优先处理 minmax 和向量索引(分别由于其简单性和选择性),然后再处理其他较小的索引。在 minmax/向量索引中,也优先选择更小的索引。#84094 (Maruth Goyal)。
  • 默认启用 MergeTree 的 write_marks_for_substreams_in_compact_parts 设置。该设置可显著提升从新创建的 Compact 分区片段中读取子列时的性能。版本低于 25.5 的服务器将无法读取新的 Compact 分区片段。#84171 (Pavel Kruglov)。
  • azureBlobStorage 表引擎:在可能的情况下缓存并重用托管身份的认证令牌,以避免被限流。 #79860 (Nick Blakely)。
  • 如果右侧表由连接键列函数依赖唯一确定(所有行的连接键值唯一),则 ALL LEFT/INNER JOIN 会自动转换为 RightAny#84010 (Nikita Taranov)。
  • 新增 max_joined_block_size_bytes,与 max_joined_block_size_rows 搭配使用,以限制包含大数据量列的 JOIN 的内存使用。#83869Nikolai Kochetov)。
  • 添加了新的逻辑(由 enable_producing_buckets_out_of_order_in_aggregation 设置控制,默认启用),允许在内存高效聚合期间无序发送部分 bucket。当某些聚合 bucket 的合并耗时明显长于其他 bucket 时,这一逻辑通过允许发起方在此期间先行合并 bucket ID 更大的 bucket 来提升性能。缺点是可能会增加内存占用(预计不会显著)。#80179Nikita Taranov)。
  • 引入了 optimize_rewrite_regexp_functions 设置(默认启用),当检测到特定正则表达式模式时,允许优化器将某些 replaceRegexpAllreplaceRegexpOneextract 调用重写为更简单、更高效的形式。(问题 #81981)。#81992Amos Bird)。
  • 在哈希 JOIN 主循环之外处理 max_joined_block_rows,略微提升 ALL JOIN 的性能。#83216 (Nikolai Kochetov)。
  • 优先处理更高粒度的 min-max 索引。已关闭 #75381#83798Maruth Goyal)。
  • 使 DISTINCT 窗口聚合在线性时间内运行,并修复 sumDistinct 中的一个缺陷。解决了 #79792。解决了 #52253#79859Nihal Z. Miaji)。
  • 使用向量相似度索引的向量搜索查询,通过减少存储读取和 CPU 使用,实现了更低的延迟。#83803 (Shankar Iyer).
  • 使用 Rendezvous 哈希以提升工作负载在并行副本之间分布时的缓存局部性。 #82511 (Anton Ivashkin).
  • 为 If 组合子实现了 addManyDefaults,从而使带有 If 组合子的聚合函数执行得更快。#83870 (Raúl Marín)。
  • 在对多个字符串或数值列进行 GROUP BY 时,以列式方式计算序列化键。 #83884 (李扬).
  • 在并行副本读取场景中,当索引分析得到的范围为空时,消除了全表扫描。 #84971 (Eduard Karacharov).
  • 尝试使用 -falign-functions=64,以获得更稳定的性能测试结果。#83920 (Azat Khuzhin).
  • 现在,布隆过滤器(Bloom filter)索引也会用于类似 has([c1, c2, ...], column) 的条件,其中 column 不是 Array 类型。这样可以提升此类查询的性能,使其效率与使用 IN 运算符相当。#83945 (Doron David)。
  • 减少在 CompressedReadBufferBase::readCompressedData 中不必要的 memcpy 调用。#83986 (Raúl Marín)。
  • 通过移除临时数据以优化 largestTriangleThreeBuckets#84479 (Alexey Milovidov).
  • 通过简化代码优化字符串反序列化。修复 #38564#84561Alexey Milovidov)。
  • 修正了并行副本场景下最小任务大小的计算。#84752 (Nikita Taranov)。
  • 提高了在 Join 模式下应用补丁分区片段的性能。#85040 (Anton Popov)。
  • 移除零字节。关闭 #85062。修复了一些小错误。函数 structureToProtobufSchemastructureToCapnProtoSchema 未正确写入以零结尾的终止字节,而是使用了换行符。这样会导致输出中缺少换行符,并且在使用依赖零字节的其他函数(例如 logTracedemangleextractURLParametertoStringCutToZero 以及 encrypt/decrypt)时,可能导致缓冲区溢出。regexp_tree 字典布局不支持处理包含零字节的字符串。formatRowNoNewline 函数在使用 Values 格式或任何行尾不带换行符的其他格式调用时,会错误地截断输出的最后一个字符。函数 stem 存在异常安全性问题,在极其罕见的场景下可能导致内存泄漏。initcap 函数在处理 FixedString 参数时行为不正确:如果前一个字符串块以单词字符结束,它不会将字符串开头识别为单词的起始位置。修复了 Apache ORC 格式中的安全漏洞,该漏洞可能导致未初始化内存的暴露。更改了函数 replaceRegexpAll 及其别名 REGEXP_REPLACE 的行为:现在即使前一次匹配已经处理了整个字符串,它仍可以在字符串末尾进行一次空匹配,例如在 ^a*|a*$^|.* 这样的场景中——这与 JavaScript、Perl、Python、PHP、Ruby 的语义一致,但与 PostgreSQL 的语义不同。简化并优化了许多函数的实现。修正了若干函数错误的文档说明。请注意,byteSize 对于 String 列以及由 String 列组成的复杂类型的输出已经发生变化(每个空字符串从 9 字节变为 8 字节),这是预期行为。#85063Alexey Milovidov)。
  • 在仅为了返回单行而进行常量物化的场景下,优化常量物化过程。#85071 (Alexey Milovidov)。
  • 通过 delta-kernel-rs 后端提升并行文件处理性能。 #85642 (Azat Khuzhin).
  • 引入了一个新的设置:enable_add_distinct_to_in_subqueries。启用后,ClickHouse 会在分布式查询的 IN 子句中自动为子查询添加 DISTINCT。这样可以显著减少在分片之间传输的临时表大小并提升网络效率。注意:这是一种权衡——虽然减少了网络传输,但每个节点上需要进行额外的合并(去重)工作。当网络传输成为瓶颈且可以接受额外的合并开销时,建议启用此设置。#81908 (fhw12345)。
  • 降低可执行用户自定义函数的查询内存跟踪开销。#83929 (Eduard Karacharov).
  • 在存储 DeltaLake 中实现基于 delta-kernel-rs 的内部过滤(统计信息和分区裁剪)。 #84006 (Kseniia Sumarokova).
  • 更精细地禁用依赖于实时更新或通过补丁分区片段进行更新的列的跳过索引。现在,仅在受到实时变更或补丁分区片段影响的分区片段中不会使用跳过索引;此前,这些索引会在所有分区片段中被禁用。#84241 (Anton Popov)。
  • 仅为加密命名集合的 encrypted_buffer 分配所需的最小内存。#84432 (Pablo Marcos)。
  • 改进了对 Bloom 过滤器索引(常规、ngram 和 token)的支持,使其在第一个参数为常量数组(集合)、第二个参数为被索引列(子集)时也能发挥作用,从而实现更高效的查询执行。#84700Doron David)。
  • 减少 Keeper 中存储锁上的争用。#84732 (Antonio Andelic)。
  • WHERE 子句补充对 read_in_order_use_virtual_row 的缺失支持。这样可以在过滤条件未完全下推到 PREWHERE 的查询中跳过读取更多分区片段。 #84835 (Nikolai Kochetov).
  • 允许对 Iceberg 表中的对象进行异步迭代,而无需为每个数据文件显式存储这些对象。#85369 (Daniil Ivanik)。
  • 将非关联的 EXISTS 表达式作为标量子查询来执行。这样可以使用标量子查询缓存,并对结果进行常量折叠优化,这对索引很有帮助。为保持兼容性,新增了设置 execute_exists_as_scalar_subquery=1#85481 (Nikolai Kochetov)。

改进

  • 添加 database_replicated 设置,用于定义 DatabaseReplicatedSettings 的默认值。如果在创建 Replicated 数据库时使用的查询中未指定该设置,则会使用此处设置的值。#85127 (Tuan Pham Anh)。
  • 在 Web UI(play)中支持调整表格列宽。 #84012 (Doron David).
  • 现在可通过 iceberg_metadata_compression_method 设置项使用压缩的 .metadata.json 文件。该设置支持 ClickHouse 提供的所有压缩方法。修复了 #84895#85196Konstantin Vedernikov)。
  • EXPLAIN indexes = 1 的输出中显示需要读取的范围数量。 #79938 (Christoph Wurm).
  • 引入用于配置 ORC 压缩块大小的设置项,并将其默认值从 64KB 调整为 256KB,以与 Spark 或 Hive 保持一致。 #80602 (李扬).
  • 在宽分区片段中新增 columns_substreams.txt 文件,用于跟踪分区片段中存储的所有子流。这有助于跟踪 JSON 和 Dynamic 类型中的动态流,从而避免为了获取动态流列表(例如用于计算列大小)而读取这些列的数据样本。此外,现在所有动态流都会体现在 system.parts_columns 中。#81091 (Pavel Kruglov)。
  • clickhouse format 添加 CLI 标志 --show_secrets,用于在默认情况下隐藏敏感数据。#81524Nikolai Ryzhov)。
  • 在 HTTP 套接字层面而不是在整个 S3 请求层面对 S3 读写请求进行限流,以避免与 max_remote_read_network_bandwidth_for_servermax_remote_write_network_bandwidth_for_server 限流相关的问题。 #81837 (Sergei Trifonov).
  • 允许在窗口函数的不同窗口中为同一列混合使用不同的排序规则。 #82877 (Yakov Olkhovskiy).
  • 添加一个用于模拟、可视化和比较合并选择器的工具。#71496 (Sergei Trifonov).
  • 当在 address_expression 参数中指定集群时,为使用并行副本的 remote* 表函数增加支持。同时修复了 #73295#82904Igor Nikonov)。
  • 将所有与写入备份文件相关的日志消息级别设置为 TRACE。 #82907 (Hans Krutzer).
  • 具有非常规名称和编解码器的用户自定义函数在经过 SQL 格式化后,可能会得到不一致的结果。此更改关闭了 #83092#83644Alexey Milovidov)。
  • 现在可以在 JSON 类型中使用 Time 和 Time64 数据类型了。#83784 (Yarik Briukhovetskyi)。
  • 现在,并行副本上的 JOIN 已经使用新的 JOIN 逻辑步骤。若在使用并行副本的 JOIN 查询时遇到任何问题,请尝试执行 SET query_plan_use_new_logical_join_step=0 并报告问题。 #83801 (Vladimir Cherkasov)。
  • 修复 cluster_function_process_archive_on_multiple_nodes 的兼容性问题。 #83968 (Kseniia Sumarokova).
  • 支持在 S3Queue 表级别修改物化视图(MV)插入设置。新增 S3Queue 级别的设置:min_insert_block_size_rows_for_materialized_viewsmin_insert_block_size_bytes_for_materialized_views。默认情况下会使用 profile 级别的设置,而 S3Queue 级别的设置将覆盖它们。#83971 (Kseniia Sumarokova)。
  • 新增了 profile 事件 MutationAffectedRowsUpperBound,用于显示一次变更操作中受影响的行数(例如,在 ALTER UPDATEALTER DELETE 查询中满足条件的行的总数)。#83978 (Anton Popov).
  • 使用 cgroup 中的信息(如果适用,即启用了 memory_worker_use_cgroup 且 cgroup 可用)来调整内存跟踪器(memory_worker_correct_memory_tracker)。#83981Azat Khuzhin)。
  • MongoDB:字符串到数值类型的隐式解析。此前,如果从 MongoDB 源为 ClickHouse 表中的数值列接收到字符串值,就会抛出异常。现在,引擎会尝试自动将字符串解析为数值。已关闭 #81167#84069Kirill Nikiforov)。
  • Pretty 格式中为 Nullable 数值高亮显示数字分组。#84070 (Alexey Milovidov).
  • Dashboard:工具提示在顶部显示时不会溢出其容器边界。#84072 (Alexey Milovidov)。
  • 仪表板上的点现在看起来稍微更好看了一些。#84074 (Alexey Milovidov)。
  • Dashboard 现在有了略有改进的 favicon。 #84076 (Alexey Milovidov).
  • Web UI:让浏览器有机会保存密码,同时也会记住 URL 的值。#84087Alexey Milovidov)。
  • 添加支持使用 apply_to_children 配置在特定 Keeper 节点上应用额外的 ACL。#84137Antonio Andelic)。
  • 修复在 MergeTree 中使用 "compact" Variant 判别器序列化的方式。之前在某些本可以使用的场景下并未启用它。#84141 (Pavel Kruglov)。
  • 在复制数据库的设置中新增了一个服务器设置项 logs_to_keep,用于修改复制数据库默认的 logs_to_keep 参数。较低的取值会减少 ZNode 的数量(尤其是在存在大量数据库的情况下),而较高的取值则允许缺失的副本在更长时间后仍能完成追赶同步。 #84183 (Alexey Khatskevich).
  • 新增 json_type_escape_dots_in_keys 设置,用于在解析 JSON 类型时转义 JSON 键中的点。该设置默认关闭。 #84207 (Pavel Kruglov)。
  • 在检查 EOF 之前先检查连接是否已被取消,防止从已关闭的连接中读取。修复 #83893#84227Raufs Dunamalijevs)。
  • 略微优化了 Web UI 中文本选区的配色。改动在暗色模式下被选中的表格单元格中差异最为明显。在之前的版本中,文本与选区背景之间的对比度不足。#84258Alexey Milovidov)。
  • 通过简化内部检查,改进了服务器关闭期间对客户端连接的处理。#84312 (Raufs Dunamalijevs)。
  • 添加了一个 delta_lake_enable_expression_visitor_logging 设置,用于关闭表达式访问器日志,因为在调试问题时,即使在测试日志级别,这些日志也可能过于冗长。 #84315 (Kseniia Sumarokova)。
  • 现在会同时上报 cgroup 级和系统级的指标。cgroup 级的指标名称为 CGroup&lt;Metric&gt;,而 OS 级的指标(从 procfs 收集)名称为 OS&lt;Metric&gt;#84317Nikita Taranov)。
  • Web UI 中的图表略有改进。虽然提升不大,但还是更好了些。#84326 (Alexey Milovidov).
  • 将 Replicated 数据库设置 max_retries_before_automatic_recovery 的默认值更改为 10,从而在某些情况下可以更快完成恢复。#84369 (Alexander Tokmakov)。
  • 修复在使用查询参数时 CREATE USER 语句的格式(例如 CREATE USER {username:Identifier} IDENTIFIED WITH no_password)。#84376Azat Khuzhin)。
  • 引入 backup_restore_s3_retry_initial_backoff_msbackup_restore_s3_retry_max_backoff_msbackup_restore_s3_retry_jitter_factor,用于配置在备份和恢复操作期间使用的 S3 重试退避策略。#84421 (Julia Kartseva)。
  • S3Queue 有序模式修复:在已调用关闭时更早退出。 #84463 (Kseniia Sumarokova)。
  • 为 Iceberg 写入提供通过 pyiceberg 读取的支持。 #84466 (Konstantin Vedernikov).
  • 在将 IN / GLOBAL IN 过滤条件下推到 KeyValue 存储的主键(例如 EmbeddedRocksDB、KeeperMap)时,允许对 Set 值进行类型转换。 #84515 (Eduard Karacharov).
  • 将 chdig 升级至 25.7.1#84521Azat Khuzhin)。
  • 在执行 UDF 期间发生的底层错误现在会统一返回错误码 UDF_EXECUTION_FAILED,而之前可能会返回不同的错误码。#84547 (Xu Jia)。
  • 为 KeeperClient 添加 get_acl 命令。 #84641 (Antonio Andelic).
  • 为数据湖表引擎添加了快照版本支持。 #84659 (Pete Hampton).
  • ConcurrentBoundedQueue 的大小添加一个指标,并使用队列类型(即队列的用途)和队列 ID(即当前队列实例的随机生成 ID)作为标签。#84675 (Miсhael Stetsyuk)。
  • system.columns 表现在新增了 column 作为现有 name 列的别名。#84695Yunchi Pang)。
  • 新增 MergeTree 设置项 search_orphaned_parts_drives,用于限制查找分区片段的范围,例如仅根据具有本地元数据的磁盘进行查找。 #84710 (Ilya Golshtein).
  • 在 Keeper 中新增 4LW 命令 lgrq,用于开启或关闭对已接收请求的日志记录。#84719 (Antonio Andelic)。
  • 以大小写不敏感的方式匹配外部认证的 forward_headers#84737 (ingodwerust).
  • encrypt_decrypt 工具现在支持 ZooKeeper 加密连接。#84764Roman Vasin)。
  • system.errors 中添加格式字符串列。该列用于在告警规则中按相同错误类型进行分组。#84776 (Miсhael Stetsyuk)。
  • clickhouse-format 更新为支持将 --highlight 作为 --hilite 的别名。- 将 clickhouse-client 更新为支持将 --hilite 作为 --highlight 的别名。- 更新 clickhouse-format 文档以反映此更改。#84806 (Rishabh Bhardwaj).
  • 修复按字段 ID 读取 Iceberg 复杂类型时的问题。#84821 (Konstantin Vedernikov).
  • 引入新的 backup_slow_all_threads_after_retryable_s3_error 设置,以便在出现 SlowDown 等错误引发的大量重试时,通过在检测到首个可重试错误后放慢所有线程,从而降低对 S3 的压力。 #84854 (Julia Kartseva)。
  • 在 Replicated 数据库中,对非追加的 RMV DDL 语句,跳过创建并重命名旧临时表。#84858Tuan Pham Anh)。
  • 通过 keeper_server.coordination_settings.latest_logs_cache_entry_count_thresholdkeeper_server.coordination_settings.commit_logs_cache_entry_count_threshold 按条目数量限制 Keeper 日志缓存大小。#84877 (Antonio Andelic).
  • 允许在原本不受支持的架构上使用 simdjson(此前会导致 CANNOT_ALLOCATE_MEMORY 错误)。 #84966 (Azat Khuzhin)。
  • 异步日志记录:使各项限制可配置,并添加内省能力。 #85105 (Raúl Marín).
  • 收集所有要删除的对象,通过一次对象存储删除操作统一执行。#85316 (Mikhail Artemenko).
  • Iceberg 目前对 positional delete 文件的实现会将所有数据保留在内存中。如果 positional delete 文件很大(这在实践中很常见),内存开销会非常高。我的实现只在内存中保留 Parquet delete 文件的最后一个 row group,大大降低了内存成本。#85329Konstantin Vedernikov)。
  • chdig:修复屏幕残留问题、修复在编辑器中编辑查询后发生的崩溃、在 PATH 中搜索 editor,更新到 25.8.1#85341Azat Khuzhin)。
  • 向 Azure 配置添加遗漏的 partition_columns_in_data_file#85373 (Arthur Passos)。
  • 在函数 timeSeries*ToGrid 中允许使用步长为 0。这是 #75036 的一部分。#85390Vitaly Baranov)。
  • 添加 show_data_lake_catalogs_in_system_tables 标志,用于控制是否在 system.tables 中包含数据湖表。解决 #85384#85411Smita Kulkarni)。
  • remote_fs_zero_copy_zookeeper_path 中新增了对宏展开的支持。#85437Mikhail Koviazin)。
  • clickhouse-client 中的 AI 展示效果将略有提升。 #85447 (Alexey Milovidov)。
  • 默认对旧部署启用 trace_log.symbolize。 #85456 (Azat Khuzhin).
  • 支持解析更多复合标识符的场景。特别是改进了 ARRAY JOIN 与旧版分析器的兼容性。引入新设置 analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested,以保留旧有行为。#85492Nikolai Kochetov)。
  • 在通过 system.columns 获取表列大小时,忽略 UNKNOWN_DATABASE。 #85632 (Azat Khuzhin).
  • 新增了用于限制补丁分区片段中未压缩字节总量的表设置 max_uncompressed_bytes_in_patches。这样可以避免在执行轻量级更新后 SELECT 查询出现明显变慢,并防止轻量级更新被滥用的情况。 #85641 (Anton Popov).
  • system.grants 中添加一个 parameter 列,以确定 GRANT READ/WRITE 的源类型,以及 GRANT TABLE ENGINE 的表引擎。#85643 (MikhailBurdukov).
  • 修复在 CREATE DICTIONARY 查询的列列表中,当带参数的列(例如 Decimal(8))后面存在末尾逗号时的解析问题。关闭 #85586#85653Nikolay Degterinsky)。
  • nested 函数添加对内部数组的支持。 #85719 (Nikolai Kochetov).
  • 现在,所有由外部库执行的内存分配都会被 ClickHouse 的内存跟踪器感知并正确计入。这可能会导致某些查询的报告内存使用量看起来“增加”,或者出现 MEMORY_LIMIT_EXCEEDED 错误。 #84082 (Nikita Mikhaylov).

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 此 PR 修复了通过 REST 目录查询 Iceberg 表时的元数据解析问题。... #80562 (Saurabh Kumar Ojha).
  • 修复 DDLWorker 和 DatabaseReplicatedDDLWorker 中对 markReplicasActive 的处理。 #81395 (Tuan Pham Anh).
  • 修复在解析失败时对 Dynamic 列的回滚机制。#82169Pavel Kruglov)。
  • 当以全部为常量的输入调用函数 trim 时,现在会生成常量输出字符串。(缺陷 #78796)。#82900Robert Schulze)。
  • 修复在启用 optimize_syntax_fuse_functions 时导致的重复子查询逻辑错误,关闭 #75511#83300Vladimir Cherkasov)。
  • 修复了在启用查询条件缓存(use_query_condition_cache 设置)时,带有 WHERE ... IN (<subquery>) 子句的查询返回结果不正确的问题。 #83445 (LB7666)。
  • 此前,gcs 函数在使用时不需要任何权限。现在在使用时会检查是否具有 GRANT READ ON S3 权限。修复了 #70567#83503pufit)。
  • 在通过 INSERT SELECT 从 s3Cluster() 向副本 MergeTree 写入时跳过不可用节点。 #83676 (Igor Nikonov)。
  • 修复在用于实验性事务的 MergeTree 中,使用 plain_rewritable/plain 元数据类型时的追加写入行为,此前这些类型会被直接忽略。 #83695 (Tuan Pham Anh).
  • 对 Avro schema registry 的认证信息进行掩码处理,使其对用户不可见且不会出现在日志中。 #83713 (János Benjamin Antal).
  • 修复了这样一个问题:当使用 add_minmax_index_for_numeric_columns=1add_minmax_index_for_string_columns=1 创建 MergeTree 表,并在之后的 ALTER 操作中将该索引物化时,会导致 Replicated 数据库在新的副本上无法正确初始化。#83751Nikolay Degterinsky)。
  • 修复了 Parquet 写入器为 Decimal 类型输出的统计信息(最小值/最大值)不正确的问题。 #83754 (Michael Kolupaev).
  • 修复了在 LowCardinality(Float32|Float64|BFloat16) 类型中 NaN 值的排序问题。#83786Pervakov Grigorii)。
  • 从备份中恢复时,definer 用户可能未被备份,从而导致整个备份失效。为了解决这个问题,我们将还原时对目标表创建操作的权限检查延后,只在运行时执行该检查。 #83818 (pufit).
  • 修复在一次失败的 INSERT 后连接被遗留在断开状态,从而导致客户端崩溃的问题。 #83842 (Azat Khuzhin).
  • 在启用 analyzer 的情况下,允许在 remote 表函数的 view(...) 参数中引用任何表。修复 #78717。修复 #79377#83844Dmitry Novik)。
  • jsoneachrowwithprogress 中的 onProgress 回调与最终处理过程同步执行。#83879Sema Checherinda)。
  • 修复了 #81303#83892Konstantin Vedernikov)。
  • 修复在同时使用 const 与非 const 参数时 colorSRGBToOKLCH/colorOKLCHToSRGB 的行为。#83906Azat Khuzhin)。
  • 修复在 RowBinary 格式中写入包含 NULL 值的 JSON 路径时的错误。 #83923 (Pavel Kruglov).
  • 修复了从 Date 转换为 DateTime64 时,大于 2106-02-07 的日期值发生溢出的问题。#83982 (Yarik Briukhovetskyi)。
  • 始终应用 filesystem_prefetches_limit(而不是仅在 MergeTreePrefetchedReadPool 中生效)。#83999 (Azat Khuzhin).
  • 修复了一个罕见的错误:执行 MATERIALIZE COLUMN 查询时,可能会导致 checksums.txt 中出现意外文件记录,并最终导致分区片段被分离。 #84007 (alesapin).
  • 修复在基于不等式条件执行 JOIN 时,当一列为 LowCardinality 类型而另一列为常量时出现的逻辑错误 Expected single dictionary argument for function。关闭 #81779#84019Alexey Milovidov)。
  • 修复在交互模式下启用语法高亮时 ClickHouse 客户端崩溃的问题。#84025Bharat Nallan)。
  • 修复了在将查询条件缓存与递归 CTE 结合使用时导致查询结果错误的问题(issue #81506)。#84026zhongyuankai)。
  • 在周期性刷新分区片段时正确处理异常。 #84083 (Azat Khuzhin).
  • 修复在等式两侧操作数类型不同或涉及常量时,将过滤条件错误合并到 JOIN 条件中的问题。修复了 #83432#84145Dmitry Novik)。
  • 修复在以下罕见情况下出现的 ClickHouse 崩溃:当表具有 PROJECTION、lightweight_mutation_projection_mode = 'rebuild',并且用户执行轻量级删除操作且该操作会从表中的某个数据块删除其所有行时,会触发崩溃。 #84158 (alesapin).
  • 修复由后台取消检查器线程引发的死锁。#84203 (Antonio Andelic).
  • 修复在分析无效 WINDOW 定义时出现的无限递归问题。修复了 #83131#84242Dmitry Novik)。
  • 修复了导致 Bech32 编码和解码结果不正确的缺陷。该缺陷之所以最初未被发现,是因为用于测试的在线算法实现也存在相同的问题。#84257George Larionov)。
  • 修复了 array() 函数中空元组构造不正确的问题。从而修复了 #84202#84297Amos Bird)。
  • 修复在使用并行副本且包含多个 INNER JOIN,后面跟随 RIGHT JOIN 的查询中出现的 LOGICAL_ERROR。对于此类查询请勿使用并行副本。#84299Vladimir Cherkasov)。
  • 此前,set 索引在检查数据粒度是否满足过滤条件时,没有考虑 Nullable 列(问题 #75485)。#84305Elmi Ahmadov)。
  • 现在 ClickHouse 可以从 Glue Catalog 中读取表类型以小写形式指定的表。#84316 (alesapin)。
  • 在有 JOIN 或子查询时,不要尝试将表函数替换为对应的 cluster 版本。#84335 (Konstantin Bogdanov)。
  • 修复 IAccessStorage 中日志记录器的使用。 #84365 (Konstantin Bogdanov).
  • 修复了在对表的所有列执行轻量级更新时的逻辑错误。 #84380 (Anton Popov).
  • 编解码器 DoubleDelta 现在只能应用于数值类型的列。具体来说,FixedString 列不再可以使用 DoubleDelta 进行压缩。(修复 #80220)。#84383Jimmy Aguilar Mena)。
  • 在进行 MinMax 索引评估时,与 NaN 值的比较未使用正确的范围。#84386 (Elmi Ahmadov).
  • 修复在惰性物化时读取 Variant 列的错误。 #84400 (Pavel Kruglov).
  • zoutofmemory 归类为硬件错误,否则会抛出逻辑错误。参见 https://github.com/clickhouse/clickhouse-core-incidents/issues/877#84420Han Fei)。
  • 修复了当使用 no_password 创建的用户在服务器设置项 allow_no_password 被修改为 0 之后尝试登录时导致服务器崩溃的问题。#84426 (Shankar Iyer)。
  • 修复 Keeper 变更日志的乱序写入问题。此前,在变更日志存在进行中的写入操作时,回滚可能会并发修改目标文件,从而导致日志不一致,甚至造成数据丢失。#84434 (Antonio Andelic)。
  • 现在,如果从表中移除了所有生存时间 (TTL) 设置,MergeTree 将不会再执行任何与 TTL 相关的操作。 #84441 (alesapin).
  • 之前允许使用带有 LIMIT 的并行分布式 INSERT SELECT,这是不正确的,因为会导致目标表中的数据重复。 #84477 (Igor Nikonov)。
  • 修复在数据湖中按虚拟列剪枝文件的问题。 #84520 (Kseniia Sumarokova).
  • 修复 Keeper 在使用 RocksDB 存储时的资源泄漏问题(迭代器未被销毁)。 #84523 (Azat Khuzhin).
  • 修复 ALTER MODIFY ORDER BY 在排序键中未对 TTL 列进行验证的问题。现在,在 ALTER 操作中,如果在 ORDER BY 子句里使用 TTL 列,将会被正确拒绝,从而避免潜在的表损坏。 #84536 (xiaohuanlin).
  • 将 25.5 之前版本中 allow_experimental_delta_kernel_rs 的值更改为 false,以保证兼容性。#84587Kseniia Sumarokova)。
  • 不再从 manifest 文件读取 schema,而是为每个快照单独存储相关的 schema。对于每个数据文件,从其对应的快照推断出相应的 schema。此前对于 manifest 文件中状态为 existing 的条目,其行为不符合 Iceberg 规范。#84588 (Daniil Ivanik)。
  • 修复了 Keeper 中将 rotate_log_storage_interval = 0 时会导致 ClickHouse 崩溃的问题(相关 issue #83975)。#84637George Larionov)。
  • 修复 S3Queue 中 “Table is already registered” 的逻辑错误。修复了 #84433 中报告的问题。该问题在合并 https://github.com/ClickHouse/ClickHouse/pull/83530 后出现。#84677Kseniia Sumarokova)。
  • 在 RefreshTask 中,从 'view' 获取 zookeeper 时对 'mutex' 加锁。 #84699 (Tuan Pham Anh)。
  • 修复在将惰性列与外部排序一起使用时出现的 CORRUPTED_DATA 错误。#84738 (János Benjamin Antal)。
  • 修复了在 DeltaLake 存储中使用 delta-kernel 时的列裁剪问题。关闭 #84543#84745Kseniia Sumarokova)。
  • 在 DeltaLake 存储中的 delta-kernel 中刷新凭证。 #84751 (Kseniia Sumarokova).
  • 修复在发生连接问题后会启动多余内部备份的情况。#84755Vitaly Baranov)。
  • 修复了在远程数据源存在延迟时执行查询,可能导致向量越界的问题。#84820George Larionov)。
  • ngramno_op tokenizer 在处理空输入 token 时,不再导致实验性文本索引崩溃。#84849 (Robert Schulze).
  • 修复了在使用 ReplacingMergeTreeCollapsingMergeTree 引擎的表上执行轻量级更新时出现的问题。#84851 (Anton Popov).
  • 对使用 object queue 引擎的表,将所有设置正确存储在表元数据中。 #84860 (Antonio Andelic).
  • 修复 Keeper 返回的 watch 总数。 #84890 (Antonio Andelic).
  • 修复了在版本低于 25.7 的服务器上创建的 ReplicatedMergeTree 引擎表的轻量级更新问题。 #84933 (Anton Popov).
  • 修复了在执行 ALTER TABLE ... REPLACE PARTITION 查询后,针对使用非复制 MergeTree 引擎的表执行轻量级更新时的问题。#84941 (Anton Popov)。
  • 修复了布尔字面量列名的生成逻辑,使其使用 "true"/"false" 而不是 "1"/"0",以避免在查询中布尔字面量与整数字面量之间的列名冲突。 #84945 (xiaohuanlin).
  • 修复由后台调度池和执行器导致的内存跟踪偏差。#84946 (Azat Khuzhin)。
  • 修复 Merge 表引擎中潜在的排序不准确问题。#85025Xiaozhe Yu)。
  • 补全 DiskEncrypted 缺失的 API 实现。 #85028 (Azat Khuzhin).
  • 在分布式上下文中使用关联子查询时添加检查,以避免崩溃。修复了 #82205#85030Dmitry Novik)。
  • 现在 Iceberg 不会再在多次 SELECT 查询之间尝试缓存相关的快照版本,而是始终在每次查询时按实际情况解析应使用的快照。之前尝试缓存 Iceberg 快照会在使用带时间旅行功能的 Iceberg 表时导致问题。#85038 (Daniil Ivanik)。
  • 修复了 AzureIteratorAsync 中的 double-free 错误。#85064 (Nikita Taranov).
  • 改进在尝试创建使用 JWT 标识的用户时的错误消息。 #85072 (Konstantin Bogdanov)。
  • 修复了 ReplicatedMergeTree 中补丁分区片段的清理问题。此前,轻量级更新的结果可能会在一段时间内在副本上不可见,直到将这些补丁分区片段实体化的已合并或已变更分区片段从另一个副本下载完成。#85121 (Anton Popov)。
  • 修复在类型不一致时 mv 中出现的 illegal_type_of_argument 错误。#85135 (Sema Checherinda).
  • 修复 delta-kernel 实现中的段错误(segfault)。 #85160 (Kseniia Sumarokova).
  • 修复了在移动元数据文件耗时较长时恢复副本数据库的问题。#85177Tuan Pham Anh)。
  • 修复在 additional_table_filters expression 设置中,IN (subquery) 中出现的 Not-ready Set 问题。#85210 (Nikolai Kochetov)。
  • 在执行 SYSTEM DROP REPLICA 查询时去除不必要的 getStatus() 调用。修复了当在后台删除表时会抛出 Shutdown for storage is called 异常的问题。#85220Nikolay Degterinsky)。
  • 修复 DeltaLake 引擎 delta-kernel 实现中的竞态条件问题。 #85221 (Kseniia Sumarokova).
  • 修复在 DeltaLake 引擎中禁用 delta-kernel 后读取分区数据的问题。该问题在 25.7 中被引入(https://github.com/ClickHouse/ClickHouse/pull/81136)。#85223Kseniia Sumarokova)。
  • CREATE OR REPLACERENAME 查询中补充了此前缺失的表名长度检查。 #85326 (Michael Kolupaev).
  • 修复在 Replicated 数据库的新副本上创建 RMV 时,DEFINER 被删除导致的问题。#85327Nikolay Degterinsky)。
  • 修复 Iceberg 复杂类型的写入问题。#85330Konstantin Vedernikov)。
  • 对于复杂类型,不支持写入上下界。 #85332 (Konstantin Vedernikov).
  • 修复在通过分布式表或远程表函数从对象存储函数读取数据时出现的逻辑错误。修复:#84658#85173#52022#85359alesapin)。
  • 修复包含损坏的 PROJECTION 的分区片段的备份。 #85362 (Antonio Andelic).
  • 在其稳定之前,禁止在 PROJECTION 中使用 _part_offset 列。 #85372 (Sema Checherinda).
  • 修复在对 JSON 数据执行 ALTER UPDATE 时发生的崩溃和数据损坏问题。 #85383 (Pavel Kruglov).
  • 使用并行副本且启用了反向顺序读取优化的查询可能会返回不正确的结果。#85406 (Igor Nikonov).
  • 修复在字符串反序列化过程中发生 MEMORY_LIMIT_EXCEEDED 时可能导致的未定义行为(崩溃)。 #85440 (Azat Khuzhin).
  • 修复指标 KafkaAssignedPartitions 和 KafkaConsumersWithAssignment 的错误。 #85494 (Ilya Golshtein).
  • 修复了在使用 PREWHERE(显式或自动)时已处理字节统计值被低估的问题。#85495Michael Kolupaev)。
  • 修复 S3 请求速率减慢的提前返回条件:当由于可重试错误导致所有线程暂停时,现在只需 s3_slow_all_threads_after_network_errorbackup_slow_all_threads_after_retryable_s3_error 中任意一个为 true 即可启用减速行为,而不再要求两者同时为 true。 #85505 (Julia Kartseva)。
  • 此 PR 修复了通过 REST catalog 查询 Iceberg 表时的元数据解析问题。... #85531 (Saurabh Kumar Ojha).
  • 修复了在异步插入时更改 log_commentinsert_deduplication_token 设置时偶发的崩溃问题。 #85540 (Anton Popov).
  • 在通过 HTTP 使用 multipart/form-data 时,像 date_time_input_format 这样的参数会被忽略。#85570 (Sema Checherinda).
  • 修复 icebergS3Cluster 和 icebergAzureCluster 表函数中的机密信息屏蔽。 #85658 (MikhailBurdukov).
  • 修复在将 JSON 数值转换为 Decimal 类型时 JSONExtract 中的精度丢失问题。现在 JSON 数值能够保留其精确的小数表示,避免浮点数舍入误差。#85665 (ssive7b)。
  • 修复了在同一条 ALTER 语句中先执行 DROP COLUMN 再使用 COMMENT COLUMN IF EXISTS 时出现的 LOGICAL_ERROR。现在,当列已在同一语句中被删除时,IF EXISTS 子句会正确跳过注释操作。#85688xiaohuanlin)。
  • 修复 Delta Lake 从缓存读取计数时的问题。 #85704 (Kseniia Sumarokova).
  • 修复在处理大字符串时 CoalescingMergeTree 出现的段错误。关闭 #84582#85709Konstantin Vedernikov)。
  • 在 Iceberg 写入操作中更新元数据时间戳。#85711 (Konstantin Vedernikov).
  • distributed_depth 用作 Cluster 函数的标志是不正确的,可能会导致数据重复;请改为使用 client_info.collaborate_with_initiator#85734 (Konstantin Bogdanov)。
  • Spark 无法读取位置删除文件。#85762Konstantin Vedernikov)。
  • 修复 send_logs_source_regexp(在 #85105 中的异步日志重构之后)。#85797Azat Khuzhin)。
  • 修复在出现 MEMORY_LIMIT_EXCEEDED 错误时,使用 update_field 的字典可能出现的不一致。#85807 (Azat Khuzhin)。
  • 为目标表为 Distributed 的并行分布式 INSERT SELECT 支持来自 WITH 子句的全局常量。此前,该查询可能会抛出 Unknown expression identifier 错误。#85811 (Nikolai Kochetov)。
  • deltaLakeAzuredeltaLakeClustericebergS3ClustericebergAzureCluster 的凭证进行脱敏处理。 #85889 (Julian Maicher).
  • 修复在使用 DatabaseReplicated 时尝试执行 CREATE ... AS (SELECT * FROM s3Cluster(...)) 所导致的逻辑错误。#85904Konstantin Bogdanov)。
  • 修复了由 url() 表函数发起的 HTTP 请求在访问非标准端口时未在 Host 头部中正确包含端口号的问题。这解决了在使用带有 S3 兼容服务(例如运行在自定义端口上的 MinIO)的预签名 URL 时出现的身份验证失败情况,这在开发环境中很常见。(修复 #85898)。 #85921Tom Quist)。
  • 现在,针对非 Delta 表,Unity Catalog 将忽略包含异常数据类型的 schema。修复了 #85699#85950alesapin)。
  • 修复 Iceberg 中字段的可空设置。 #85977 (Konstantin Vedernikov).
  • 修复了 Replicated 数据库恢复中的一个问题:如果表名包含 % 符号,在恢复过程中可能会使用不同的名称重新创建该表。#85987 (Alexander Tokmakov)。
  • 修复在还原空的 Memory 表时出现 BACKUP_ENTRY_NOT_FOUND 错误而导致备份恢复失败的问题。#86012Julia Kartseva)。
  • 在对分布式表执行 ALTER 时增加对 sharding_key 的检查。此前,不正确的 ALTER 会破坏表定义并需要重启服务器。#86015 (Nikolay Degterinsky)。
  • 不再创建空的 Iceberg 删除文件。 #86061 (Konstantin Vedernikov).
  • 修复由于 setting 值过大导致 S3Queue 表和副本重启失败的问题。 #86074 (Nikolay Degterinsky)。

构建/测试/打包改进

ClickHouse 25.7 发行版,2025-07-24

向后不兼容的变更

  • extractKeyValuePairs 函数的更改:引入一个新的参数 unexpected_quoting_character_strategy,用于控制在读取未加引号的键或值时,意外遇到 quoting_character 时的处理方式。该参数的取值可以是:invalidacceptpromoteinvalid 会丢弃该键并回到等待键状态;accept 会将其视为键的一部分;promote 会丢弃前一个字符并开始将其解析为带引号的键。此外,在解析完带引号的值之后,仅在找到键值对分隔符时才解析下一个键。#80657 (Arthur Passos)。
  • countMatches 函数中支持零长度匹配。希望保留旧行为的用户可以启用设置 count_matches_stop_at_empty_match#81676 (Elmi Ahmadov)。
  • 在生成 BACKUP 时,对本地(max_local_read_bandwidth_for_servermax_local_write_bandwidth_for_server)和远程(max_remote_read_network_bandwidth_for_servermax_remote_write_network_bandwidth_for_server)操作使用服务器范围的限流器,作为对其专用服务器设置(max_backup_bandwidth_for_servermax_mutations_bandwidth_for_servermax_merges_bandwidth_for_server)的补充。#81753 (Sergei Trifonov)。
  • 禁止创建没有可写入列的表。#81835 (Pervakov Grigorii)。
  • 在归档内部按文件对集群函数进行并行化。在先前的版本中,整个归档(如 zip、tar 或 7z)是一个工作单元。新增设置 cluster_function_process_archive_on_multiple_nodes,默认值为 true。如果设为 true,可提升在集群函数中处理归档时的性能。如果在早期版本中使用带归档的集群函数,为了兼容性以及避免在升级到 25.7+ 期间出现错误,应将其设为 false#82355 (Kseniia Sumarokova)。
  • SYSTEM RESTART REPLICAS 查询会导致 Lazy 数据库中的表被唤醒,即使对该数据库没有访问权限,而且可能在这些表被并发删除时发生。注意:现在 SYSTEM RESTART REPLICAS 只会重启那些你在其中拥有 SHOW TABLES 权限的数据库里的副本,这是一种更自然的行为。#83321 (Alexey Milovidov)。

新功能

  • MergeTree 系列表新增了轻量级更新支持。轻量级更新可以通过以下新语法使用:UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>。通过轻量级更新实现了轻量级删除,可通过设置 lightweight_delete_mode = 'lightweight_update' 启用。#82004 (Anton Popov)。
  • 在 Iceberg 的 schema 演进中增加对复杂类型的支持。#73714 (Konstantin Vedernikov)。
  • 新增对 Iceberg 表执行 INSERT 的支持。#82692 (Konstantin Vedernikov)。
  • 基于字段 ID 读取 Iceberg 数据文件。这样可以提高与 Iceberg 的兼容性:可以在元数据中重命名字段,同时将其映射到底层 Parquet 文件中的不同名称。修复了 #83065#83653Konstantin Vedernikov)。
  • ClickHouse 现已支持用于 Iceberg 的压缩 metadata.json 文件。修复了 #70874#81451alesapin)。
  • 在 Glue catalog 中支持 TimestampTZ,修复了 #81654#83132Konstantin Vedernikov)。
  • 在 ClickHouse 客户端中新增 AI 驱动的 SQL 生成能力。现在,只需在查询前加上前缀 ??,即可根据自然语言描述生成 SQL 查询。支持 OpenAI 和 Anthropic 服务提供商,并具备自动 schema 发现能力。#83314 (Kaushik Iska)。
  • 新增一个用于将 Geo 类型写入 WKB 格式的函数。 #82935 (Konstantin Vedernikov)。
  • 为数据源引入了两种新的访问类型:READWRITE,并弃用了之前所有与数据源相关的访问类型。原先为 GRANT S3 ON *.* TO user,现在改为:GRANT READ, WRITE ON S3 TO user。这也允许对数据源分别授予 READWRITE 权限,例如:GRANT READ ON * TO userGRANT WRITE ON S3 TO user。该特性由设置 access_control_improvements.enable_read_write_grants 控制,默认禁用。#73659 (pufit)。
  • NumericIndexedVector:一种新的向量数据结构,基于按位切片(bit-sliced)的 Roaring bitmap 压缩,并提供 20 多个用于构建、分析和逐点算术运算的函数。在处理稀疏数据时,可减少存储占用并加速 JOIN、过滤和聚合操作。实现了 #70582 以及 T. Xiong 和 Y. Wang 在 VLDB 2024 上发表的 “Large-Scale Metric Computation in Online Controlled Experiment Platform” 论文#74193FriendLey)。
  • 现在支持工作负载配置项 max_waiting_queries。它可用于限制查询队列的长度。如果达到该限制,后续的所有查询都会以 SERVER_OVERLOADED 错误被终止。#81250 (Oleg Doronin)。
  • 新增财务函数:financialInternalRateOfReturnExtended (XIRR)、financialInternalRateOfReturn (IRR)、financialNetPresentValueExtended (XNPV)、financialNetPresentValue (NPV)。#81599Joanna Hulboj)。
  • 新增地理空间函数 polygonsIntersectCartesianpolygonsIntersectSpherical,用于检查两个多边形是否相交。 #81882 (Paul Lamb).
  • 在 MergeTree 系列表中支持 _part_granule_offset 虚拟列。该列表示每一行在其数据 part 中所属 granule/mark 的从 0 开始的索引。此改动解决了 #79572#82341 (Amos Bird). #82341 (Amos Bird)
  • 新增 SQL 函数 colorSRGBToOkLCHcolorOkLCHToSRGB,用于在 sRGB 和 OkLCH 颜色空间之间进行颜色转换。#83679 (Fgrtue)。
  • 允许在 CREATE USER 查询中将用户名设为参数。 #81387 (Diskein).
  • system.formats 表现在包含有关各格式的更多信息,例如 HTTP 内容类型、是否支持 schema 推断等。#81505Alexey Milovidov)。

实验特性

  • 新增函数 searchAnysearchAll,作为搜索文本索引的通用工具。#80641 (Elmi Ahmadov)。
  • 文本索引现在支持新的 split 分词器。#81752 (Elmi Ahmadov)。
  • text 索引的默认索引粒度调整为 64。这样可以提升内部基准测试中典型测试查询的预期性能。#82162 (Jimmy Aguilar Mena)。
  • 256 位位图按顺序存储状态的输出标签,但输出状态在磁盘上是按照它们在哈希表中出现的顺序保存。因此,从磁盘读取时,某个标签可能会指向错误的下一个状态。#82783 (Elmi Ahmadov)。
  • 为文本索引中的 FST 树 blob 启用 zstd 压缩。#83093 (Elmi Ahmadov)。
  • 将向量相似度索引提升到 beta 阶段。引入了别名 SETTING enable_vector_similarity_index,必须启用该 SETTING 才能使用向量相似度索引。#83459 (Robert Schulze)。
  • 移除了与实验性零拷贝复制相关的实验性 send_metadata 逻辑。它从未被实际使用,也没有人维护这段代码。由于甚至没有相关的测试,很有可能它早就已经失效。#82508 (alesapin)。
  • StorageKafka2 集成到 system.kafka_consumers 中。#82652 (János Benjamin Antal)。
  • 基于统计信息估算复杂的 CNF/DNF 表达式,例如 (a < 1 and a > 0) or b = 3#82663 (Han Fei)。

性能优化

  • 引入异步日志记录。当日志输出到慢速设备时,将不再阻塞查询。#82516Raúl Marín)。限制队列中保留的条目数量上限。#83214Raúl Marín)。
  • 默认启用并行分布式 INSERT SELECT,其工作模式为:在每个分片上独立执行 INSERT SELECT,详见 parallel_distributed_insert_select 设置。 #83040 (Igor Nikonov).
  • 当聚合查询只包含一个作用于非 Nullable 列的 count() 函数时,聚合逻辑会在哈希表探测过程中被完全内联。这样可以避免分配和维护任何聚合状态,从而显著降低内存占用和 CPU 开销。此更改部分解决了 #81982#82104Amos Bird)。
  • 在仅有一个键列这一典型场景下,通过移除对哈希映射的额外遍历优化了 HashJoin 的性能;同时,当 null_mapjoin_mask 始终为 true/false 时,省略了对它们的检查。 #82308 (Nikita Taranov)。
  • -If 组合器进行了小幅优化。#78454李扬)。
  • 使用向量相似度索引的向量搜索查询,由于减少了存储读取次数和 CPU 占用,能够以更低的延迟完成。#79103 (Shankar Iyer).
  • filterPartsByQueryConditionCache 中遵循 merge_tree_min_{rows,bytes}_for_seek,使其与其他按索引过滤的方法保持一致。#80312 (李扬).
  • TOTALS 步骤之后的 pipeline 改为多线程执行。 #80331 (UnamedRus).
  • 修复 RedisKeeperMap 存储的按键过滤问题。#81833Pervakov Grigorii)。
  • 添加新的设置项 min_joined_block_size_rows(类似于 min_joined_block_size_bytes,默认值为 65409),用于控制 JOIN 输入和输出数据块的最小块大小(以行数计,前提是 JOIN 算法支持)。较小的数据块会被合并。 #81886 (Nikita Taranov)。
  • ATTACH PARTITION 不再会导致所有缓存被清空。#82377 (Alexey Milovidov)。
  • 通过利用等价类移除冗余的 JOIN 操作,以优化针对关联子查询生成的执行计划。如果对于所有关联列都存在等价表达式,并且启用了 query_plan_correlated_subqueries_use_substitution 设置,则不会生成 CROSS JOIN#82435Dmitry Novik)。
  • 当相关子查询看起来是函数 EXISTS 的参数时,仅读取所需的列。 #82443 (Dmitry Novik).
  • 在查询分析阶段略微加快了查询树比较的速度。#82617Nikolai Kochetov)。
  • ProfileEventsCounter 添加内存对齐以减少伪共享。#82697 (Jiebin Sun)。
  • #82308 中引入的对 null_mapJoinMask 的优化已应用于包含多个析取条件的 JOIN 场景。同时,对 KnownRowsHolder 数据结构也进行了优化。#83041Nikita Taranov)。
  • 使用普通的 std::vector<std::atomic_bool> 作为 JOIN 标志,以避免在每次访问这些标志时计算哈希值。#83043 (Nikita Taranov)。
  • HashJoin 使用 lazy 输出模式时,不要事先为结果列预分配内存。这样做效率不高,尤其是在匹配数量较少时。此外,在连接完成后我们可以准确获知匹配数量,从而能够更精确地进行预分配。 #83304 (Nikita Taranov)。
  • 在构建 pipeline 时,尽量减少端口头信息中的内存拷贝。最初的 PRheymind 提交。#83381Raúl Marín)。
  • 在使用 RocksDB 存储时改进 clickhouse-keeper 的启动性能。 #83390 (Antonio Andelic)。
  • 在创建存储快照数据时尽量不持有锁,以减少在高并发负载下的锁竞争。#83510 (Duc Canh Le)。
  • 通过在没有解析错误时复用序列化器,提升了 ProtobufSingle 输入格式的性能。 #83613 (Eduard Karacharov).
  • 改进管道构建性能,从而提升短查询性能。 #83631 (Raúl Marín).
  • 优化 MergeTreeReadersChain::getSampleBlock,以加速短查询。 #83875 (Raúl Marín).
  • 通过异步请求加速数据目录中的表列出操作。 #81084 (alesapin).
  • 在启用 s3_slow_all_threads_after_network_error 配置时,为 S3 重试机制引入抖动。#81849 (zoomxi)。

改进

  • 使用多种颜色显示括号,以提升可读性。 #82538 (Konstantin Bogdanov).
  • 在输入 LIKE/REGEXP 模式时高亮显示元字符。我们已经在 clickhouse-formatclickhouse-client 的回显中支持了这一点,现在在命令提示符中也实现了。#82871Alexey Milovidov)。
  • clickhouse-format 和客户端 echo 输出中的高亮显示方式将与命令行提示符中的高亮相同。#82874 (Alexey Milovidov)。
  • 现在允许将 plain_rewritable 磁盘用作数据库元数据磁盘。在 plain_rewritable 中实现了 moveFilereplaceFile 方法,从而支持将其用作数据库磁盘。#79424 (Tuan Pham Anh)。
  • 允许为 PostgreSQLMySQLDataLake 数据库创建备份。此类数据库的备份只会保存其定义,而不会包含其中的数据。#79982 (Nikolay Degterinsky)。
  • allow_experimental_join_condition 设置标记为已废弃,因为相关功能现在始终处于启用状态。#80566 (Vladimir Cherkasov)。
  • 将压力相关指标添加到 ClickHouse 异步指标中。 #80779 (Xander Garbett).
  • 新增了用于跟踪标记缓存驱逐情况的指标 MarkCacheEvictedBytesMarkCacheEvictedMarksMarkCacheEvictedFiles。(issue #60989)。#80799Shivji Kumar Jha)。
  • 支持按照规范的要求,将 Parquet 枚举类型写为字节数组。#81090Arthur Passos)。
  • DeltaLake 表引擎的改进:delta-kernel-rs 提供了 ExpressionVisitor API,本 PR 对其进行了实现,并将其用于分区列表达式的转换(它将替换我们之前代码中使用、且在 delta-kernel-rs 中已废弃的旧方案)。未来,这个 ExpressionVisitor 还将支持基于统计信息的剪枝以及一些 Delta Lake 的专有特性。此外,此变更的另一目的在于支持在 DeltaLakeCluster 表引擎中进行分区剪枝(解析后的表达式结果——ActionsDAG——将被序列化,并与数据路径一起从发起方(initiator)发送出去,因为这类剪枝所需的信息只在数据文件列表的元信息中可用,而该列表仅由发起方生成,但剪枝必须在每个读取服务器上应用于数据)。#81136Kseniia Sumarokova)。
  • 在为具名元组推导超类型时保留字段名。#81345 (lgbo).
  • 在 StorageKafka2 中手动统计已消费的消息,以避免依赖先前提交的 offset。#81662 (János Benjamin Antal).
  • 新增了 clickhouse-keeper-utils,这是一款用于管理和分析 ClickHouse Keeper 数据的全新命令行工具。该工具支持从快照和变更日志中转储状态、分析变更日志文件,以及提取特定日志范围。#81677 (Antonio Andelic)。
  • 全局和按用户的网络限流器永不重置,从而确保 max_network_bandwidth_for_all_usersmax_network_bandwidth_for_all_users 限制值永远不会被超出。#81729 (Sergei Trifonov)。
  • 支持将数据写出为 GeoParquet 输出格式。 #81784 (Konstantin Vedernikov).
  • 如果某个 RENAME COLUMN 变更会重命名当前正受未完成数据变更影响的列,则禁止启动该变更。 #81823 (Mikhail Artemenko).
  • Connection 首部会在所有其他首部之后发送,此时已经可以确定是否需要保留连接。 #81951 (Sema Checherinda)。
  • 根据 listen_backlog(默认 4096)调整 TCP 服务器队列长度(默认 64)。 #82045 (Azat Khuzhin).
  • 新增支持在不重启服务器的情况下动态重新加载 max_local_read_bandwidth_for_servermax_local_write_bandwidth_for_server#82083 (Kai Zhu).
  • 新增支持通过 TRUNCATE TABLE system.warnings 清空 system.warnings 表中的所有警告。 #82087 (Vladimir Cherkasov)。
  • 修复数据湖集群函数中的分区裁剪问题。#82131Kseniia Sumarokova)。
  • 修复在 DeltaLakeCluster 表函数中读取分区数据的问题。在此 PR 中,集群函数的协议版本已提升,允许从发起节点向各个副本发送额外信息。该额外信息包含 delta-kernel 转换表达式,用于解析分区列(以及未来的一些其他内容,例如生成列等)。 #82132 (Kseniia Sumarokova).
  • reinterpret FUNCTION 现在支持转换为 Array(T),其中 T 是固定长度数据类型(issue #82621)。#83399Shankar Iyer)。
  • 现在,Datalake 数据库抛出的异常信息更加清晰易懂。修复了 #81211#82304 (alesapin)。
  • 通过使 HashJoin::needUsedFlagsForPerRightTableRow 返回 false 来改进 CROSS JOIN。 #82379 (lgbo)。
  • 允许以 Array of Tuples 的形式写入和读取 Map 类型列。 #82408 (MikhailBurdukov).
  • system.licenses 中列出 Rust crates 的许可证。 #82440 (Raúl Marín)。
  • 现在可以在 S3Queue 表引擎的 keeper_path 设置项中使用 {uuid} 等宏。#82463Nikolay Degterinsky)。
  • Keeper 改进:在后台线程中在不同磁盘之间移动 changelog 文件。此前,将 changelog 移动到不同磁盘会全局阻塞 Keeper,直到移动完成。如果移动操作耗时较长(例如移动到 S3 磁盘),会导致性能下降。 #82485 (Antonio Andelic).
  • Keeper 改进:新增配置项 keeper_server.cleanup_old_and_ignore_new_acl。启用后,所有节点上的 ACL 都会被清除,同时新请求的 ACL 将被忽略。如果目标是从节点上彻底移除 ACL,则必须在生成新的快照之前始终保持该配置为启用状态。#82496 (Antonio Andelic)。
  • 新增了一个服务器设置 s3queue_disable_streaming,用于在使用 S3Queue 表引擎的表中禁用流式处理。该设置可在无需重启服务器的情况下更改。#82515 (Kseniia Sumarokova)。
  • 重构了文件系统缓存的动态扩缩容功能。增加了更多日志,便于排查和分析。 #82556 (Kseniia Sumarokova).
  • 当未提供配置文件时,clickhouse-server 也会像使用默认配置时一样监听 PostgreSQL 端口 9005。#82633Alexey Milovidov)。
  • ReplicatedMergeTree::executeMetadataAlter 中,我们获取 StorageID,并且在不获取 DDLGuard 的情况下尝试调用 IDatabase::alterTable。在这段时间内,理论上我们可能已经将相关表替换为另一张表,因此当我们获取表定义时,拿到的可能是错误的定义。为避免这种情况,我们在尝试调用 IDatabase::alterTable 时添加了单独的 UUID 匹配检查。#82666Nikolay Degterinsky)。
  • 在附加使用只读远程磁盘的数据库时,需要手动将表 UUID 添加到 DatabaseCatalog 中。#82670Tuan Pham Anh)。
  • 防止用户在 NumericIndexedVector 中使用 naninf。修复了 #82239 并做了一些额外改进。#82681Raufs Dunamalijevs)。
  • X-ClickHouse-ProgressX-ClickHouse-Summary HTTP 头部格式中不要省略零值。#82727Nikita Mikhaylov)。
  • Keeper 改进:支持为 world:anyone ACL 配置特定权限。#82755 (Antonio Andelic).
  • 不允许在 SummingMergeTree 中对显式指定为参与求和的列执行 RENAME COLUMNDROP COLUMN 操作。修复了 #81836#82821Alexey Milovidov)。
  • 提升从 DecimalFloat32 转换的精度,实现从 DecimalBFloat16 的转换。关闭 #82660#82823 (Alexey Milovidov)。
  • Web UI 中的滚动条看起来会稍微更美观一些。 #82869 (Alexey Milovidov).
  • 启用嵌入式配置的 clickhouse-server 将通过返回 HTTP OPTIONS 响应来允许使用 Web UI。#82870 (Alexey Milovidov)。
  • 在配置中新增了为路径指定额外 Keeper ACL 的支持。如果你想为某个特定路径添加额外 ACL,可以在配置项 zookeeper.path_acls 下进行定义。#82898Antonio Andelic)。
  • 现在,变更快照将基于可见的分区片段快照构建。同时,快照中使用的变更计数器将根据所包含的变更重新计算。#82945 (Mikhail Artemenko)。
  • 在 Keeper 因软内存限制而拒绝写入时添加 ProfileEvent。 #82963 (Xander Garbett)。
  • system.s3queue_log 中新增列 commit_timecommit_id#83016 (Kseniia Sumarokova).
  • 在某些情况下,我们需要为指标引入多个维度。例如,与其使用单一计数器,不如按错误码统计失败的 merge 或 mutation 次数。为此引入了 system.dimensional_metrics,它正是用来解决这个问题的,并新增了首个维度指标,名为 failed_merges#83030Miсhael Stetsyuk)。
  • 在 clickhouse client 中对未知设置警告进行汇总,并以摘要形式写入日志。#83042 (Bharat Nallan)。
  • ClickHouse 客户端现在在发生连接错误时会报告本地端口。#83050 (Jianfei Hu)。
  • AsynchronousMetrics 中略微改进了错误处理。如果 /sys/block 目录存在但不可访问,服务器将会在不监控块设备的情况下启动。关闭了 #79229#83115Alexey Milovidov)。
  • 将 SystemLogs 的关闭时机调整为在普通表之后、系统表之前(而不是在普通表之前)。 #83134 (Kseniia Sumarokova).
  • S3Queue 的关闭过程添加日志记录。#83163 (Kseniia Sumarokova).
  • 支持将 TimeTime64MM:SSM:SSSSS 格式进行解析。 #83299 (Yarik Briukhovetskyi)。
  • distributed_ddl_output_mode='*_only_active' 时,将不再等待复制延迟大于 max_replication_lag_to_enqueue 的新建或已恢复副本。这样可以避免在某个新副本完成初始化或恢复后变为活跃状态、但在初始化期间累计了大量待处理复制日志时出现 DDL task is not finished on some hosts。另外,实现了 SYSTEM SYNC DATABASE REPLICA STRICT 查询,它会等待复制日志积压降到 max_replication_lag_to_enqueue 以下。#83302 (Alexander Tokmakov)。
  • 不要在异常消息中输出过长的表达式求值操作描述。关闭了 #83164#83350Alexey Milovidov)。
  • 添加对解析 part 的前缀和后缀的支持,并检查非常量列的覆盖情况。#83377 (Mikhail Artemenko)。
  • 在使用命名集合时统一 ODBC 和 JDBC 的参数名。#83410Andrey Zvonov)。
  • 在存储关闭过程中,getStatus 会抛出 ErrorCodes::ABORTED 异常。此前,这会导致 SELECT 查询失败。现在我们会捕获 ErrorCodes::ABORTED 异常并显式地忽略它们。#83435 (Miсhael Stetsyuk)。
  • MergeParts 条目的 part_log profile events 添加进程资源使用指标(例如 UserTimeMicrosecondsSystemTimeMicrosecondsRealTimeMicroseconds)。 #83460 (Vladimir Cherkasov)。
  • 在 Keeper 中默认启用 create_if_not_existscheck_not_existsremove_recursive 功能开关,以支持新的请求类型。#83488 (Antonio Andelic)。
  • 在关闭服务器前,先停止 S3(Azure 等)Queue 流式处理,再关闭任意表。#83530 (Kseniia Sumarokova)。
  • JSON 输入格式中支持将 Date/Date32 作为整数。#83597 (MikhailBurdukov)。
  • 改进了在某些情况下加载和添加 PROJECTION 时的异常消息的可读性。 #83728 (Robert Schulze).
  • clickhouse-server 新增一个配置选项,可跳过对二进制文件的校验和完整性检查。修复 #83637#83749Rafael Roquetto)。

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复 clickhouse-benchmark--reconnect 选项错误的默认值。它在 #79465 中被误改。#82677Alexey Milovidov)。
  • 修复 CREATE DICTIONARY 语句格式不一致的问题。关闭 #82105#82829Alexey Milovidov)。
  • 修复当生存时间 (TTL) 包含 materialize 函数时的格式不一致问题。修复 #82828#82831Alexey Milovidov)。
  • 修复在子查询中对 EXPLAIN AST 的格式化在包含 INTO OUTFILE 等输出选项时不一致的问题。关闭 #82826#82840Alexey Milovidov)。
  • 修复在不允许使用别名的上下文中出现的带别名括号表达式格式不一致的问题。修复 #82836。修复 #82837#82867Alexey Milovidov)。
  • 在将聚合函数状态与 IPv4 相乘时使用正确的错误码。修复 #82817#82818Alexey Milovidov)。
  • 修复文件系统缓存中的逻辑错误:"Having zero bytes but range is not finished"。 #81868 (Kseniia Sumarokova)。
  • 当生存时间 (TTL) 机制删除行时,重新计算 min-max 索引,以确保依赖该索引的算法(例如 minmax_count_projection)的正确性。修复了 #77091#77166Amos Bird)。
  • 对于包含 ORDER BY ... LIMIT BY ... LIMIT N 组合的查询中,当 ORDER BY 以 PartialSorting 方式执行时,计数器 rows_before_limit_at_least 现在反映的是被 LIMIT 子句处理的行数,而不是在排序转换阶段处理的行数。#78999Eduard Karacharov)。
  • 修复在使用包含交替分支且首个分支为非字面量的正则表达式,通过 token/ngram 索引进行过滤时可能出现的过度跳过 granule 的问题。 #79373 (Eduard Karacharov).
  • 修复了与 <=> 运算符和 Join 表引擎相关的逻辑错误,现在查询会返回正确的错误代码。#80165 (Vladimir Cherkasov)。
  • 修复在与 remote 函数族联用时 loop 函数发生崩溃的问题。确保在 loop(remote(...)) 中正确应用 LIMIT 子句。#80299Julia Kartseva)。
  • 修复了 to_utc_timestampfrom_utc_timestamp 函数在处理 Unix 纪元(1970-01-01)之前以及最大日期(2106-02-07 06:28:15)之后的日期时的错误行为。现在,这些函数会分别将值正确地限制在纪元起始时间和最大日期范围内。#80498 (Surya Kant Ranjan)。
  • 对于某些使用并行副本执行的查询,顺序读取优化可以在 initiator 端应用,但无法在远程节点上应用。这会导致并行副本协调器(在 initiator 上)与远程节点使用不同的读取模式,从而产生逻辑错误。#80652Igor Nikonov)。
  • 修复在物化 PROJECTION 时,当列类型被更改为 Nullable 所导致的逻辑错误。#80741Pavel Kruglov)。
  • 修复在更新 TTL 时,TTL GROUP BY 中错误的 TTL 重新计算问题。#81222Evgeniy Ulasik)。
  • 修复了 Parquet 布隆过滤器错误地将类似 WHERE function(key) IN (...) 的条件当作 WHERE key IN (...) 进行处理的问题。 #81255 (Michael Kolupaev).
  • 修复在合并过程中发生异常时,Aggregator 可能出现的崩溃问题。#81450Nikita Taranov)。
  • 修复了 InterpreterInsertQuery::extendQueryLogElemImpl,使其在需要时为数据库和表名添加反引号(例如,当名称包含 - 等特殊字符时)。#81528Ilia Shvyrialkin)。
  • 修复在 transform_null_in=1 且左侧参数为 NULL、子查询结果为非 Nullable 时 IN 的执行行为。 #81584 (Pavel Kruglov).
  • 在从已有表读取数据时,不在 default/materialize 表达式执行期间校验实验性/可疑类型。#81618 (Pavel Kruglov)。
  • 修复在合并期间,当在 TTL 表达式中使用字典时触发的 "Context has expired" 错误。#81690 (Azat Khuzhin)。
  • 修复 cast 函数的单调性。#81722zoomxi)。
  • 修复了在处理标量关联子查询时未读取所需列的问题。修复了 #81716#81805Dmitry Novik)。
  • 在早期版本中,服务器在处理对 /js 的请求时返回了过多的内容。此更改解决了 #61890#81895Alexey Milovidov)。
  • 之前,MongoDB 表引擎定义中可以在 host:port 参数里包含路径部分,但该部分会被静默忽略。MongoDB 集成会拒绝加载这类表。通过此修复,我们允许加载这类表并忽略路径部分,前提是 MongoDB 引擎有五个参数,并使用参数中的数据库名。注意: 此修复不会应用于新建的表、使用 mongo table function 的查询,以及字典来源和命名集合。 #81942 (Vladimir Cherkasov)。
  • 修复在合并过程中发生异常时可能导致 Aggregator 崩溃的问题。 #82022 (Nikita Taranov).
  • 修复了当查询中仅使用常量别名列时的过滤条件分析问题。修复 #79448#82037Dmitry Novik)。
  • 修复在 GROUP BY 和 SET 的生存时间 (TTL) 中使用同一列时出现的 LOGICAL_ERROR 以及随之产生的崩溃。#82054 (Pablo Marcos)。
  • 修复在机密信息屏蔽中 S3 表函数参数校验的问题,防止可能出现的 LOGICAL_ERROR,并关闭 #80620#82056Vladimir Cherkasov)。
  • 修复 Iceberg 中的数据竞争。 #82088 (Azat Khuzhin)。
  • 修复 DatabaseReplicated::getClusterImpl。如果 hosts 的第一个元素(或前几个元素)满足 id == DROPPED_MARK,且同一分片不存在其他元素,则 shards 的第一个元素将是空向量,从而触发 std::out_of_range#82093 (Miсhael Stetsyuk)。
  • 修复 arraySimilarity 中因复制粘贴导致的错误,禁止将 UInt32Int32 用作权重类型,并更新测试和文档。#82103Mikhail f. Shiryaev)。
  • 修复在包含 arrayJoin 且带有 WHERE 条件和 IndexSet 的查询中出现的 Not found column 错误。 #82113 (Nikolai Kochetov).
  • 修复 Glue Catalog 集成中的一个缺陷。现在 ClickHouse 可以读取包含嵌套数据类型的表,其中某些子列为 Decimal 类型,例如:map&lt;string, decimal(9, 2)&gt;。修复了 #81301#82114alesapin)。
  • 修复了在 25.5 版本中于 https://github.com/ClickHouse/ClickHouse/pull/79051 中引入的 SummingMergeTree 性能退化问题。#82130Pavel Kruglov)。
  • 通过 URI 传递设置参数时,将以最后一个值为准。 #82137 (Sema Checherinda).
  • 修复 Iceberg 中 “Context has expired” 的问题。 #82146 (Azat Khuzhin).
  • 在服务器内存紧张时,修复可能导致远程查询死锁的问题。#82160 (Kirill)。
  • 修复了在将 numericIndexedVectorPointwiseAddnumericIndexedVectorPointwiseSubtractnumericIndexedVectorPointwiseMultiplynumericIndexedVectorPointwiseDivide 函数应用于大数值时出现的溢出问题。 #82165Raufs Dunamalijevs)。
  • 修复了表依赖中的一个 bug,该 bug 会导致 Materialized Views 无法处理 INSERT 查询。#82222Nikolay Degterinsky)。
  • 修复 suggestion 线程与主客户端线程之间可能存在的数据竞争。 #82233 (Azat Khuzhin).
  • 现在,ClickHouse 在模式演进后可以从 Glue catalog 中读取 Iceberg 表。修复了 #81272#82301alesapin)。
  • 修复异步指标设置 asynchronous_metrics_update_period_sasynchronous_heavy_metrics_update_period_s 的校验。#82310Bharat Nallan)。
  • 修复在包含多个 JOIN 的查询中解析匹配器时出现的逻辑错误,关闭 #81969#82421Vladimir Cherkasov)。
  • 为 AWS ECS 令牌添加过期时间,使其可以被重新加载。#82422 (Konstantin Bogdanov)。
  • 修复了 CASE 函数在处理 NULL 参数时的错误。#82436Yarik Briukhovetskyi)。
  • 修复了客户端中的数据竞争问题(通过不再使用全局上下文)以及 session_timezone 的覆盖行为(此前,如果在 users.xml/客户端选项中将 session_timezone 设置为非空,而在查询上下文中设置为空,则会错误地采用 users.xml 中的值;现在,查询上下文将始终优先于全局上下文)。 #82444 (Azat Khuzhin)。
  • 修复外部表引擎中缓存缓冲区禁用边界对齐的功能,该功能在 https://github.com/ClickHouse/ClickHouse/pull/81868 中被破坏。#82493Kseniia Sumarokova)。
  • 修复当键值存储与经过类型转换的键进行 JOIN 时会崩溃的问题。#82497 (Pervakov Grigorii).
  • 修复在 logs/query_log 中隐藏命名集合值的逻辑。关闭 #82405#82510Kseniia Sumarokova)。
  • 修复在终止会话时的日志记录过程中可能发生的崩溃问题,原因是 user_id 有时可能为空。#82513Bharat Nallan)。
  • 修复了在解析 Time 时可能引发 msan 问题的情况。此修复关联:#82477#82514Yarik Briukhovetskyi)。
  • 禁止将 threadpool_writer_pool_size 设置为 0,以防止服务器操作发生卡死。 #82532 (Bharat Nallan)。
  • 修复在对关联列进行 ROW POLICY 表达式分析时出现的 LOGICAL_ERROR#82618 (Dmitry Novik)。
  • 修复在 enable_shared_storage_snapshot_in_query = 1 时,mergeTreeProjection 表函数中对父级元数据使用不当的问题。对应 #82634#82638Amos Bird)。
  • 函数 trim{Left,Right,Both} 现在支持类型为 “FixedString(N)” 的输入字符串。例如,SELECT trimBoth(toFixedString('abc', 3), 'ac') 现在可以使用。#82691 (Robert Schulze)。
  • 在 AzureBlobStorage 中,对于原生复制,我们会比较不同的认证方式;在比较过程中如果出现异常,现在会回退为先读取再复制的方式(即非原生复制)。 #82693 (Smita Kulkarni)。
  • 修复在元素为空时 groupArraySample/groupArrayLast 的反序列化问题(当输入为空时,反序列化可能会跳过部分二进制数据,从而在读取数据期间导致数据损坏,并在 TCP 协议中出现 UNKNOWN_PACKET_FROM_SERVER)。这不会影响数字和日期时间类型。#82763 (Pedro Ferreira)。
  • 修复对空 Memory 表进行备份时的问题,该问题会导致恢复备份失败并报错 BACKUP_ENTRY_NOT_FOUND#82791 (Julia Kartseva).
  • 修复 union/intersect/except_default_mode 重写过程中的异常安全性。关闭 #82664#82820Alexey Milovidov)。
  • 跟踪异步表加载作业的数量。如果存在正在运行的作业,则不要在 TransactionLog::removeOldEntries 中更新 tail_ptr#82824 (Tuan Pham Anh)。
  • 修复 Iceberg 中的数据竞态问题。 #82841 (Azat Khuzhin).
  • use_skip_indexes_if_final_exact_mode 优化(在 25.6 中引入)在某些情况下可能无法根据 MergeTree 引擎设置/数据分布选择合适的候选范围。该问题现已修复。 #82879 (Shankar Iyer).
  • 在从 AST 解析类型为 SCRAM_SHA256_PASSWORD 的认证数据时设置 salt。 #82888 (Tuan Pham Anh)。
  • 当使用非缓存型 Database 实现时,对应表的元数据会在返回列并使引用失效后被删除。 #82939 (buyval01).
  • 修复了在对使用 Merge 存储引擎的表进行 JOIN 的查询中修改过滤条件时的问题。修复了 #82092#82950Dmitry Novik)。
  • 修复 QueryMetricLog 中的 LOGICAL_ERROR:互斥量(Mutex)不能为 NULL。 #82979 (Pablo Marcos).
  • 修复了在将格式说明符 %f 与可变长度格式说明符(例如 %M)一起使用时,函数 formatDateTime 输出结果不正确的问题。 #83020 (Robert Schulze)。
  • 修复在启用 analyzer 时,当二级查询总是从 VIEW 中读取所有列时出现的性能下降问题。修复了 #81718#83036Dmitry Novik)。
  • 修复在只读磁盘上恢复备份时出现的具有误导性的错误信息。#83051 (Julia Kartseva).
  • 在创建不包含依赖关系的表时不再执行循环依赖检查。这修复了在创建成千上万张表的用例中出现的、由 https://github.com/ClickHouse/ClickHouse/pull/65405 引入的性能下降问题。#83077Pavel Kruglov)。
  • 修复了将 Time 负值隐式读取到表中的问题,并避免文档表述产生歧义。#83091 (Yarik Briukhovetskyi)。
  • 不要在 lowCardinalityKeys 函数中使用共享字典中无关的部分。#83118 (Alexey Milovidov).
  • 修复在 materialized view 中使用子列时出现的回归问题。此更改修复了:#82784#83221 (Nikita Mikhaylov)。
  • 修复在错误的 INSERT 操作后连接被遗留为断开状态而导致客户端崩溃的问题。#83253 (Azat Khuzhin)。
  • 修复在计算包含空列的块大小时发生的崩溃。#83271Raúl Marín)。
  • 修复在 UNIONVariant 类型可能导致的崩溃问题。#83295 (Pavel Kruglov)。
  • 修复在 clickhouse-local 中执行不支持的 SYSTEM 查询时出现的 LOGICAL_ERROR。 #83333 (Surya Kant Ranjan).
  • 修复 S3 客户端中的 no_sign_request。该选项可用于显式避免对 S3 请求进行签名。它也可以通过基于 endpoint 的设置,为特定 endpoint 单独配置。#83379Antonio Andelic)。
  • 修复了在启用 CPU 调度的情况下,负载下执行且设置为 'max_threads=1' 的查询可能发生的崩溃。 #83387 (Fan Ziqi).
  • 修复当 CTE 定义引用另一个同名表表达式时触发的 TOO_DEEP_SUBQUERIES 异常。#83413Dmitry Novik)。
  • 修复在执行 REVOKE S3 ON system.* 时会错误地撤销 *.* 上 S3 权限的问题。修复了 #83417#83420pufit)。
  • 不要在不同查询之间共享 async_read_counters。#83423Azat Khuzhin)。
  • 如果子查询包含 FINAL,则禁用并行副本。 #83455 (zoomxi).
  • 修复在配置设置项 role_cache_expiration_time_seconds 时出现的轻微整数溢出问题(issue #83374)。#83461wushap)。
  • 修复了在 https://github.com/ClickHouse/ClickHouse/pull/79963 中引入的一个 bug。在向带有 definer 的 MV 插入数据时,权限检查应当基于该 definer 的权限进行。此修复解决了 #79951#83502pufit)。
  • 对 Iceberg 数组元素和 Iceberg 映射值(包括其所有嵌套子字段)禁用基于范围的文件剪枝。 #83520 (Daniil Ivanik)
  • 修复在将文件缓存用作临时数据存储时可能出现的“文件缓存未初始化”错误。 #83539 (Bharat Nallan)。
  • Keeper 修复:在会话关闭时删除临时节点后,正确更新 watch 总数。 #83583 (Antonio Andelic)。
  • 修复与 max_untracked_memory 相关的不正确内存处理。 #83607 (Azat Khuzhin).
  • 在某些边缘情况下,带有 UNION ALL 的 INSERT SELECT 可能导致空指针解引用。修复了 #83618#83643Alexey Milovidov)。
  • 禁止为 max_insert_block_size 使用零值,以免导致逻辑错误。#83688Bharat Nallan)。
  • 修复在 block_size_bytes=0estimateCompressionRatio() 中出现的无限循环。 #83704 (Azat Khuzhin)。
  • 修复 IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles 指标(此前这些指标被计入对应的不带 Cache 前缀的指标中)。#83730 (Azat Khuzhin)。
  • 修复在 BackgroundSchedulePool 关闭期间可能发生的异常终止(由于从任务中 join 线程),并且(希望也一并修复了)在单元测试中可能出现的挂起问题。 #83769 (Azat Khuzhin).
  • 引入一个向后兼容的设置,在名称冲突的情况下,允许新的分析器在 WITH 子句中引用外层别名。修复 #82700#83797Dmitry Novik)。
  • 修复在关闭过程中,由于在清理库桥接组件时对上下文进行递归加锁而导致的死锁问题。#83824Azat Khuzhin)。

构建 / 测试 / 打包改进

  • 为 ClickHouse 词法分析器构建一个精简的 C 库(10 KB),用于 #80977#81347Alexey Milovidov)。为独立词法分析器添加测试,并添加测试标签 fasttest-only#82472Yakov Olkhovskiy)。
  • 为 Nix 子模块输入项添加检查。#81691Konstantin Bogdanov)。
  • 修复在尝试在本地主机上运行集成测试时可能出现的一系列问题。#82135Oleg Doronin)。
  • 在 Mac 和 FreeBSD 上编译 SymbolIndex。(但它只会在基于 ELF 的系统上工作,例如 Linux 和 FreeBSD)。#82347Alexey Milovidov)。
  • 将 Azure SDK 升级到 v1.15.0。#82747Smita Kulkarni)。
  • 将 google-cloud-cpp 的存储模块添加到构建系统中。#82881Pablo Marcos)。
  • 更改 clickhouse-server 的 Dockerfile.ubuntu 以满足 Docker Official Library 的要求。#83039Mikhail f. Shiryaev)。
  • 针对 #83158 的后续更改,用于修复通过 curl clickhouse.com 上传构建产物的问题。#83463Mikhail f. Shiryaev)。
  • clickhouse/clickhouse-server 和官方 clickhouse 镜像中添加 busybox 二进制文件,并安装相关工具。#83735Mikhail f. Shiryaev)。
  • 新增对 CLICKHOUSE_HOST 环境变量的支持,用于指定 ClickHouse 服务器主机地址,与现有的 CLICKHOUSE_USERCLICKHOUSE_PASSWORD 环境变量保持一致。这使得在无需直接修改客户端或配置文件的情况下,更容易完成配置。#83659Doron David)。

ClickHouse 25.6 版本,2025-06-26

向后不兼容的变更

  • 之前,countMatches 函数在遇到第一个空匹配时就会停止计数,即便模式允许空匹配。为了解决这个问题,现在在发生空匹配时,countMatches 会通过前进一个字符来继续执行。希望保留旧行为的用户可以启用设置项 count_matches_stop_at_empty_match#81676 (Elmi Ahmadov)
  • 次要变更:强制 backup_threadsrestore_threads 服务器设置为非零值。#80224 (Raúl Marín)
  • 次要变更:修复 bitNot 在处理 String 时的行为,使其在内部内存表示中返回以零结尾的字符串。这不应影响任何对用户可见的行为,不过作者希望强调这一改动。#80791 (Azat Khuzhin)

新功能

  • 新的数据类型:Time ([H]HH:MM:SS) 和 Time64 ([H]HH:MM
    .fractional
    ),以及一些基本的类型转换函数和用于与其他数据类型交互的函数。新增了与现有函数 toTime 兼容的相关设置。目前通过设置 use_legacy_to_time 来保持旧有行为。#81217Yarik Briukhovetskyi)。支持 Time/Time64 之间的比较。#80327Yarik Briukhovetskyi)。
  • 新的 CLI 工具 chdig —— ClickHouse 的 TUI 界面(类似 top),作为 ClickHouse 的一部分。#79666Azat Khuzhin)。
  • AtomicOrdinary 数据库引擎中支持 disk 设置,用于指定存储表元数据文件的磁盘。#80546Tuan Pham Anh)。这使得可以从外部来源附加数据库。
  • 新增一种 MergeTree 引擎类型 CoalescingMergeTree —— 该引擎在后台合并时会取第一个非 Null 值。此更改解决了 #78869#79344scanhex12)。
  • 新增对读取 WKB(“Well-Known Binary”,一种在 GIS 应用中用于对各种几何类型进行二进制编码的格式)的函数支持。参见 #43941#80139scanhex12)。
  • 新增了针对工作负载的查询槽调度功能,详情参见 workload scheduling#78415 (Sergei Trifonov)。
  • timeSeries* 辅助函数可在处理时序数据时加速某些场景:- 将数据按指定的起始时间戳、结束时间戳和步长重新采样到相应的时间网格上 - 计算类似 PromQL 的 deltarateideltairate#80590 (Alexander Gololobov).
  • 添加 mapContainsValuesLike/mapContainsValues/mapExtractValuesLike 函数,用于基于 Map 的值进行过滤,并在基于 Bloom filter 的索引中提供对它们的支持。#78171 (UnamedRus)。
  • 现在,设置项约束可以指定一组不允许的值。#78499 (Bharat Nallan)。
  • 新增设置项 enable_shared_storage_snapshot_in_query,用于在单个查询内让所有子查询共享同一个存储快照。这样可以保证即使在同一个查询中多次引用同一张表,也始终能够从该表获得一致的读取结果。#79471 (Amos Bird)。
  • 支持直接将 JSON 列写入 Parquet,并从 Parquet 中直接读取 JSON 列。 #79649 (Nihal Z. Miaji).
  • pointInPolygon 函数添加对 MultiPolygon 的支持。 #79773 (Nihal Z. Miaji).
  • 添加对通过 deltaLakeLocal 表函数查询本地文件系统挂载的 Delta 表的支持。#79781 (roykim98)。
  • 新增 cast_string_to_date_time_mode 设置,用于在将 String 转换为 DateTime 时选择解析模式。 #80210 (Pavel Kruglov)。例如,你可以将其设置为 best effort 模式。
  • 新增 bech32Encodebech32Decode 函数,用于处理 Bitcoin 的 Bech 算法(issue #40381)。 #80239 (George Larionov)。
  • 添加用于分析 MergeTree 分区片段名称的 SQL 函数。 #80573 (Mikhail Artemenko).
  • 通过引入新的虚拟列 _disk_name,允许根据分区片段所在的磁盘来过滤参与查询的分区片段。 #80650 (tanner-bruce)。
  • 添加一个包含嵌入式 Web 工具列表的着陆页。当由类浏览器的用户代理发起请求时,将会打开该页面。#81129 (Alexey Milovidov)。
  • 函数 arrayFirstarrayFirstIndexarrayLastarrayLastIndex 会忽略由过滤表达式返回的 NULL 值。在之前的版本中,不支持 Nullable 类型的过滤结果。修复了 #81113#81197Lennard Eijsackers)。
  • 现在可以使用 USE DATABASE name 来代替 USE name#81307 (Yarik Briukhovetskyi)。
  • 新增系统表 system.codecs,用于查看可用的编解码器。(issue #81525)。#81600Jimmy Aguilar Mena)。
  • 支持 laglead 窗口函数。已关闭 #9887#82108Dmitry Novik)。
  • 函数 tokens 现在支持一个名为 split 的新分词器,非常适合处理日志数据。#80195 (Robert Schulze)。
  • clickhouse-local 中新增对 --database 参数的支持,你可以切换到之前创建的数据库。由此关闭了 #44115#81465Alexey Milovidov)。

实验特性

  • 基于 ClickHouse Keeper 为 Kafka2 实现了类似 Kafka 再平衡的逻辑。对于每个副本,我们支持两种类型的分区锁:永久锁和临时锁。副本会尽可能长时间持有永久锁,在任意时刻,一个副本上的永久锁数量不超过 all_topic_partitions / active_replicas_count(其中 all_topic_partitions 是所有分区的数量,active_replicas_count 是活动副本的数量),如果超过这个数量,则该副本会释放部分分区。一些分区会被副本以临时锁的方式持有。副本上的临时锁最大数量会动态变化,以便给其他副本有机会将部分分区获取为永久锁。在更新临时锁时,副本会释放所有临时锁并尝试重新获取其他分区。#78726Daria Fomina)。
  • 对实验性的文本索引进行了改进:现在支持通过键值对传递显式参数。目前支持的参数包括一个必需的 tokenizer,以及两个可选参数 max_rows_per_postings_listngram_size#80262Elmi Ahmadov)。
  • 之前,packed 存储不支持全文索引,因为段 ID 是通过在磁盘上读写(.gin_sid)文件进行实时更新的。在使用 packed 存储的情况下,不支持从未提交的文件读取值,这会导致问题。现在这一点已经修复。#80852Elmi Ahmadov)。
  • 类型为 gin 的实验性索引(我并不喜欢这个名字,因为它是 PostgreSQL 黑客的内部玩笑)已重命名为 text。现有的 gin 类型索引仍然可以加载,但当尝试在搜索中使用它们时,会抛出异常(并建议改用 text 索引)。#80855Robert Schulze)。

性能优化

  • 启用多 PROJECTION 过滤的支持,使得在 Part 级过滤中可以使用多个 PROJECTION。此更改解决了 #55525。这是实现 PROJECTION 索引的第二步,延续自 #78429#80343Amos Bird)。
  • 在文件系统缓存中默认使用 SLRU 缓存策略。#75072 (Kseniia Sumarokova).
  • 消除查询管线中 Resize 步骤的争用。 #77562 (Zhiguo Zhou).
  • 引入了一个选项,可将数据块的(解)压缩和(反)序列化从与网络连接关联的单个线程卸载到流水线线程中。通过设置 enable_parallel_blocks_marshalling 进行控制。对于在发起节点与远程节点之间传输大量数据的分布式查询,这应当能够加速执行。#78694Nikita Taranov)。
  • 提升了所有 Bloom 过滤器类型的性能。来自 OpenHouse 大会的视频 #79800Delyan Kratunov)。
  • UniqExactSet::merge 中引入了当其中一个 Set 为空时的快速处理路径。此外,现在如果左侧的 Set 是两级结构而右侧是单级结构,将不再把右侧转换为两级结构。#79971Nikita Taranov)。
  • 在使用两级哈希表时提高内存重用效率并减少缺页中断,从而加速 GROUP BY 操作。 #80245 (Jiebin Sun).
  • 避免不必要的更新,降低查询条件缓存中的锁竞争。#80247Jiebin Sun)。
  • concatenateBlocks 进行了小幅优化。此改进很可能有利于并行哈希连接的性能。 #80328 (李扬).
  • 在从主键范围中选择标记区间时,如果主键被函数包裹,则无法使用二分查找。此 PR 改进了这一限制:当主键被一串始终单调的函数链包裹,或者 RPN 中包含一个恒为真的元素时,仍然可以使用二分查找。修复了 #45536#80597zoomxi)。
  • 提高 Kafka 引擎的关闭速度(在有多个 Kafka 表时去除额外的 3 秒延迟)。#80796 (Azat Khuzhin).
  • 异步插入:减少内存占用并提升插入查询性能。 #80972 (Raúl Marín).
  • 当日志表被禁用时,不要对处理器进行性能分析。 #81256 (Raúl Marín)。这可以加快非常短的查询的执行速度。
  • 当源字符串长度与所请求的长度完全一致时,加速 toFixedString#81257 (Raúl Marín).
  • 如果用户不受 QUOTA 限制,则不处理 QUOTA 值。#81549 (Raúl Marín)。从而加速非常短的查询。
  • 修复了内存跟踪中的性能回归问题。 #81694 (Michael Kolupaev).
  • 改进分布式查询的分片键优化。#78452 (fhw12345)。
  • 并行副本:如果所有读取任务都已分配给其他副本,则不再等待那些未参与读取且较慢的副本。 #80199 (Igor Nikonov).
  • 并行副本使用单独的连接超时时间,请参阅 parallel_replicas_connect_timeout_ms 设置。此前,并行副本查询使用 connect_timeout_with_failover_ms/connect_timeout_with_failover_secure_ms 设置作为连接超时值(默认 1 秒)。#80421Igor Nikonov)。
  • 在带日志功能的文件系统中,mkdir 会写入该文件系统的 journal,并持久化到磁盘上。如果磁盘较慢,这个过程可能会花费较长时间。将其移出 reserve 锁的作用域。 #81371 (Kseniia Sumarokova)。
  • 将 Iceberg manifest 文件的读取推迟到首次执行读查询时才进行。#81619 (Daniil Ivanik).
  • 在适用时,允许将 GLOBAL [NOT] IN 谓词下推到 PREWHERE 子句。#79996 (Eduard Karacharov)。

改进

  • EXPLAIN SYNTAX 现在使用新的 analyzer。它返回从 query tree 构建的 AST。新增选项 query_tree_passes,用于控制在将 query tree 转换为 AST 之前要执行的遍数。#74536 (Vladimir Cherkasov)。
  • 在 Native 格式中为 Dynamic 和 JSON 实现扁平化序列化,使其能够在无需使用 Dynamic 的 shared variant、JSON 的 shared data 等特殊结构的情况下对 Dynamic 和 JSON 数据进行序列化/反序列化。可以通过设置 output_format_native_use_flattened_dynamic_and_json_serialization 启用此序列化方式。此序列化方式可用于在不同语言的客户端中更方便地支持基于 TCP 协议的 Dynamic 和 JSON。#80499Pavel Kruglov)。
  • 在发生 AuthenticationRequired 错误后刷新 S3 凭证。 #77353 (Vitaly Baranov).
  • 将字典相关指标添加到 system.asynchronous_metrics 中:DictionaryMaxUpdateDelay —— 字典更新的最大延迟(秒);DictionaryTotalFailedUpdates —— 自上次成功加载以来,在所有字典中发生的错误总次数。#78175 (Vlad)。
  • 新增关于可能为保存已损坏表而创建的数据库的警告。#78841János Benjamin Antal)。
  • S3QueueAzureQueue 引擎中添加 _time 虚拟列。 #78926 (Anton Ivashkin).
  • 使控制 CPU 过载时是否断开连接的设置项支持热重载。 #79052 (Alexey Katsman).
  • 为 Azure Blob Storage 中的普通磁盘在 system.tables 中上报的数据路径添加容器名称前缀,使上报方式与 S3 和 GCP 保持一致。 #79241 (Julia Kartseva)。
  • 现在,clickhouse-client 和 local 在原本支持 param_<name>(下划线)形式的基础上,也支持使用 param-<name>(短横线)形式的查询参数。这解决了 #63093#79429Engel Danila)。
  • 在启用校验和的情况下,从本地复制数据到远程 S3 时,针对带宽折扣提供了更详细的警告信息。#79464 (VicoWu).
  • 之前,当 input_format_parquet_max_block_size = 0(无效值)时,ClickHouse 会卡住。现在这一行为已被修正。修复了 #79394,对应的修改为 #79601abashkeev)。
  • startup_scripts 添加 throw_on_error 设置:当 throw_on_error 为 true 时,除非所有查询都成功完成,否则服务器将不会启动。默认情况下,throw_on_error 为 false,以保留之前的行为。#79732 (Aleksandr Musorin)。
  • 支持在任意类型的 http_handlers 中添加 http_response_headers#79975 (Andrey Zvonov)。
  • 函数 reverse 现已支持 Tuple 数据类型。关闭了 #80053#80083flynn)。
  • 解决 #75817:允许从 system.zookeeper 表中获取 auxiliary_zookeepers 数据。#80146Nikolay Govorov)。
  • 为服务器 TCP 套接字添加异步指标,以提升可观测性。关闭问题 #80187#80188Alexey Milovidov)。
  • 支持将 anyLast_respect_nullsany_respect_nulls 作为 SimpleAggregateFunction#80219 (Diskein)。
  • 移除在副本数据库中不必要的 adjustCreateQueryForBackup 调用。#80282 (Vitaly Baranov)。
  • 允许在 clickhouse-local 中使用额外选项(跟在 -- 之后,例如 -- --config.value='abc')时省略等号。修复 #80292#80293Alexey Milovidov)。
  • SHOW ... LIKE 查询中高亮显示元字符。解决了 #80275#80297Alexey Milovidov)。
  • clickhouse-local 中使 SQL UDF 持久化。之前创建的 FUNCTION 会在启动时自动加载。修复了 #80085#80300Alexey Milovidov)。
  • 修正 EXPLAIN PLAN 中对 preliminary DISTINCT 步骤的描述。 #80330 (UnamedRus).
  • 允许在 ODBC/JDBC 中使用命名集合。 #80334 (Andrey Zvonov).
  • 用于统计只读磁盘和损坏磁盘数量的指标。在 DiskLocalCheckThread 启动时记录相应的指示性日志。 #80391 (VicoWu).
  • 实现对与 PROJECTION 联用的 s3_plain_rewritable 存储的支持。在之前的版本中,S3 中引用 PROJECTION 的元数据对象在移动时不会更新。修复 #70258#80393Sav)。
  • SYSTEM UNFREEZE 命令将不再尝试在只读和只写一次磁盘上查找分区片段。修复了 #80430#80432Alexey Milovidov)。
  • 降低了已合并分区片段相关消息的日志级别。#80476 (Hans Krutzer).
  • 更改 Iceberg 表的分区裁剪默认行为。#80583 (Melvyn Peignon)。
  • 新增两个用于观测索引搜索算法的 ProfileEvents:IndexBinarySearchAlgorithmIndexGenericExclusionSearchAlgorithm#80679Pablo Marcos)。
  • 在旧版本内核上,不再在日志中输出关于不支持 MADV_POPULATE_WRITE 的报错信息(以避免日志被污染)。 #80704 (Robert Schulze).
  • TTL 表达式中添加了对 Date32DateTime64 的支持。#80710Andrey Zvonov)。
  • 调整 max_merge_delayed_streams_for_parallel_write 的兼容性参数值。 #80760 (Azat Khuzhin).
  • 修复崩溃问题:如果在析构函数中尝试删除临时文件(用于在磁盘上暂存溢出的临时数据)时抛出异常,程序可能会终止。#80776 (Alexey Milovidov)。
  • SYSTEM SYNC REPLICA 添加了 IF EXISTS 修饰符。 #80810 (Raúl Marín).
  • 扩展异常消息 “Having zero bytes, but read range is not finished...”,并在 system.filesystem_cache 中添加 finished_download_time 列。#80849 (Kseniia Sumarokova).
  • 在将 EXPLAINindexes = 1 一起使用时,为其输出添加搜索算法部分。会显示 “binary search” 或 “generic exclusion search” 之一。#80881 (Pablo Marcos)。
  • 在 2024 年年初,由于新的 analyzer 尚未默认启用,MySQL handler 中将 prefer_column_name_to_alias 硬编码为 true。现在,可以移除该硬编码。#80916 (Yarik Briukhovetskyi)。
  • 现在,system.iceberg_history 会显示如 Glue 或 Iceberg REST 等 catalog 数据库的历史记录。同时,为保持一致性,将 system.iceberg_history 中的 table_namedatabase_name 列重命名为 tabledatabase#80975 (alesapin)。
  • 允许以只读模式使用 merge 表函数,从而在使用它时不再需要 CREATE TEMPORARY TABLE 授权。#80981 (Miсhael Stetsyuk)。
  • 改进对内存缓存的自省能力(在 system.metrics 中暴露缓存信息,以弥补 system.asynchronouse_metrics 中信息的不完整)。在 dashboard.html 中新增显示内存缓存大小(以字节为单位)。VectorSimilarityIndexCacheSize/IcebergMetadataFilesCacheSize 已重命名为 VectorSimilarityIndexCacheBytes/IcebergMetadataFilesCacheBytes#81023 (Azat Khuzhin)。
  • 在从 system.rocksdb 读取时,忽略那些其引擎不支持包含 RocksDB 表的数据库。#81083 (Pervakov Grigorii).
  • clickhouse-local 配置文件中允许配置 filesystem_cachesnamed_collections#81105 (Alexey Milovidov)。
  • 修复 INSERT 查询中 PARTITION BY 的高亮显示。在之前的版本中,PARTITION BY 未被作为关键字高亮显示。#81106Alexey Milovidov)。
  • Web UI 中的两个小改进:- 正确处理无输出结果的查询,例如 CREATEINSERT(直到最近,这类查询都会导致加载指示器一直转动);- 双击表时自动滚动到顶部。#81131 (Alexey Milovidov)。
  • MemoryResidentWithoutPageCache 指标表示服务器进程实际使用的物理内存(不包括用户空间页缓存),单位为字节。在启用用户空间页缓存时,它能更准确地反映实际内存使用情况;当用户空间页缓存被禁用时,该值等于 MemoryResident#81233Jayme Bird)。
  • 将客户端、本地服务器、keeper 客户端以及 disks 应用中手动记录的异常标记为已记录,以避免重复记录。 #81271 (Miсhael Stetsyuk).
  • use_skip_indexes_if_finaluse_skip_indexes_if_final_exact_mode 这两个 Setting 现在默认值为 True。带有 FINAL 子句的查询现在会使用 skip indexes(如果适用)来预筛选 granule,并且还会读取与匹配主键范围对应的任何额外 granule。需要沿用之前近似/不精确结果行为的用户,可以在充分评估后将 use_skip_indexes_if_final_exact_mode 设置为 False#81331 (Shankar Iyer).
  • 当在 Web UI 中存在多个查询时,将执行光标所在位置的那个查询。延续了 #80977#81354Alexey Milovidov)。
  • 此 PR 解决了转换函数单调性检查中 is_strict 实现存在的问题。目前,一些转换函数(例如 toFloat64(UInt32)toDate(UInt8))在本应返回 is_strict 为 true 时错误地返回为 false。#81359zoomxi)。
  • 在检查 KeyCondition 是否匹配连续区间时,如果键被一串非严格函数包裹,则可能需要将 Constraint::POINT 转换为 Constraint::RANGE。例如:toDate(event_time) = '2025-06-03' 隐含了 event_time 的取值区间:['2025-06-03 00:00:00', '2025-06-04 00:00:00')。此 PR 修复了这一行为。#81400 (zoomxi)。
  • 当指定 --host--port 时,clickhouse/ch 别名将调用 clickhouse-client 而不是 clickhouse-local。这是对 #79422 的延续,从而关闭了 #65252#81509Alexey Milovidov)。
  • 既然我们已经获得了 keeper 响应时间分布数据,就可以针对指标的直方图桶进行调优。 #81516 (Miсhael Stetsyuk)。
  • 新增 profile event PageCacheReadBytes#81742 (Kseniia Sumarokova)。
  • 修复文件系统缓存中的逻辑错误:“Having zero bytes but range is not finished”。 #81868 (Kseniia Sumarokova).

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复参数化视图在使用 SELECT EXCEPT 查询时的问题。解决 #49447#57380Nikolay Degterinsky)。
  • Analyzer:修复在 join 中进行列类型提升后列投影名称不正确的问题。关闭 #63345#63519 (Dmitry Novik)。
  • 在启用 analyzer_compatibility_join_using_top_level_identifier 的情况下,修复了列名冲突时的逻辑错误。#75676 (Vladimir Cherkasov)。
  • 修复在启用 allow_push_predicate_ast_for_distributed_subqueries 时谓词下推中的 CTE 使用问题。修复 #75647。修复 #79672#77316Dmitry Novik)。
  • 修复了一个问题:即使指定的副本不存在,命令 SYSTEM SYNC REPLICA LIGHTWEIGHT 'foo' 也会报告成功。该命令现在会在尝试同步之前,先在 Keeper 中正确验证该副本是否存在。 #78405 (Jayme Bird)。
  • 修复了一个极其特定场景下的崩溃问题:当在 ON CLUSTER 查询的 CONSTRAINT 部分中使用 currentDatabase 函数时会导致崩溃。关闭 #78100#79070pufit)。
  • 修复在服务器间查询中外部角色传递的问题。 #79099 (Andrey Zvonov).
  • 请在 SingleValueDataGeneric 中使用 IColumn 来代替 Field。这修复了某些聚合函数(例如针对 Dynamic/Variant/JSON 类型的 argMax)返回值不正确的问题。#79166 (Pavel Kruglov).
  • 修复了在 Azure Blob Storage 上应用 use_native_copyallow_azure_native_copy 设置的问题,并改为仅在凭证匹配时才使用原生复制,解决了 #78964#79561Smita Kulkarni)。
  • 修复在检查某列是否已关联时,对其来源作用域未知所产生的逻辑错误。修复了 #78183。修复了 #79451#79727Dmitry Novik)。
  • 修复在使用 ColumnConst 和 Analyzer 的 GROUPING SETS 查询时产生错误结果的问题。 #79743 (Andrey Zvonov).
  • 修复从分布式表读取时,当本地副本已过期会导致本地分片结果重复的问题。#79761 (Eduard Karacharov).
  • 修复符号位为负的 NaN 的排序顺序。#79847Pervakov Grigorii)。
  • 现在,GROUP BY ALL 不再考虑 GROUPING 子句。#79915 (Yarik Briukhovetskyi)。
  • 修复了 TopK / TopKWeighted 函数的状态合并不正确的问题,该问题会在容量尚未用尽时仍可能导致误差过大。 #79939 (Joel Höner)。
  • 使 azure_blob_storage 对象存储遵从 readonly 设置。#79954 (Julia Kartseva).
  • 修复了在使用 match(column, '^…') 并包含反斜杠转义字符时出现的查询结果错误和内存不足崩溃的问题。#79969 (filimonov)。
  • 禁用用于数据湖的 Hive 分区功能。部分解决了 https://github.com/issues/assigned?issue=ClickHouse%7CClickHouse%7C79937#80005Daniil Ivanik)。
  • 包含 lambda 表达式的 skip 索引无法被应用。修复了当索引定义中的高阶函数与查询中的完全相同时未能应用的问题。 #80025 (Nikolai Kochetov).
  • 在副本上根据复制日志执行 ATTACH_PART 命令时,修正附加 part 过程中的元数据版本。 #80038 (Aleksei Filatov).
  • 可执行用户自定义函数(Executable User Defined Functions,eUDF)的名称不会像其他函数那样被添加到 system.query_log 表的 used_functions 列中。此 PR 实现了在查询中使用 eUDF 时,将其名称添加到该列中。 #80073 (Kyamran)。
  • 修复 Arrow 格式中 LowCardinality(FixedString) 的逻辑错误。 #80156 (Pavel Kruglov).
  • 修复 Merge 引擎读取子列时的问题。 #80158 (Pavel Kruglov).
  • 修复了 KeyCondition 中数值类型之间比较的相关错误。 #80207 (Yarik Briukhovetskyi).
  • 修复在对包含投影的表使用惰性物化时出现的 AMBIGUOUS_COLUMN_NAME 错误。#80251 (Igor Nikonov)。
  • 修复在使用隐式投影时,对字符串前缀过滤条件(如 LIKE 'ab_c%')进行计数优化时的错误。修复了 #80250#80261Amos Bird)。
  • 修复在 MongoDB 文档中将嵌套数值字段错误地序列化为字符串的问题。移除对 MongoDB 文档的最大深度限制。#80289 (Kirill Nikiforov).
  • 在 Replicated 数据库中对 RMT 的元数据检查放宽限制。Closes #80296#80298Nikolay Degterinsky)。
  • 修复用于 PostgreSQL 存储的 DateTime 和 DateTime64 的文本表示。#80301Yakov Olkhovskiy)。
  • 允许在 StripeLog 表中使用带时区的 DateTime。修复了 #44120#80304Alexey Milovidov)。
  • 如果查询计划步骤会改变行数,则禁用对含非确定性函数谓词的过滤下推。修复了 #40273#80329Nikolai Kochetov)。
  • 修复在包含子列的投影中可能出现的逻辑错误和崩溃。#80333Pavel Kruglov)。
  • 修复在 ON 表达式不是简单等值条件时,由逻辑 JOIN sep 的过滤下推优化导致的 NOT_FOUND_COLUMN_IN_BLOCK 错误。修复 #79647#77848#80360Nikolai Kochetov)。
  • 修复在分区表中按逆序读取键时产生错误结果的问题。修复了 #79987#80448Amos Bird)。
  • 修复了在包含 Nullable 键且启用了 optimize_read_in_order 的表中的错误排序。 #80515 (Pervakov Grigorii)。
  • 修复了当使用 SYSTEM STOP REPLICATED VIEW 暂停可刷新materialized view 时,DROP 操作会卡住的问题。 #80543 (Michael Kolupaev).
  • 修复在分布式查询中使用常量元组时导致出现 'Cannot find column' 错误的问题。 #80596 (Yakov Olkhovskiy).
  • 修复在启用 join_use_nulls 时分布式表中 shardNum 函数的问题。#80612 (János Benjamin Antal)。
  • 修复在 Merge 引擎中读取仅存在于部分表中的列时得到错误结果的问题。 #80643 (Pavel Kruglov).
  • 修复可能出现的 SSH 协议问题(由 replxx 卡死引起)。 #80688 (Azat Khuzhin).
  • iceberg_history 表中的时间戳现在应该是正确的。 #80711 (Melvyn Peignon)。
  • 修复在字典注册失败时可能发生的崩溃(当 CREATE DICTIONARYCANNOT_SCHEDULE_TASK 失败时,可能会在字典注册表中留下悬空指针,之后可能导致崩溃)。 #80714 (Azat Khuzhin).
  • 修复在对象存储表函数中处理仅包含单个元素的枚举 glob 模式的问题。#80716Konstantin Bogdanov)。
  • 修复了 Tuple(Dynamic)String 比较函数的错误结果类型问题,该问题会导致逻辑错误。#80728Pavel Kruglov)。
  • 为 Unity Catalog 添加对缺失的数据类型 timestamp_ntz 的支持。修复了 #79535#79875#80740alesapin)。
  • 修复在包含 IN cte 的分布式查询中出现的 THERE_IS_NO_COLUMN 错误。修复了 #75032#80757 (Nikolai Kochetov)。
  • 修复外部 ORDER BY 产生的过多文件问题(会导致内存占用过高)。#80777 (Azat Khuzhin)。
  • 此 PR 可能会关闭 #80742#80783zoomxi)。
  • 修复了 Kafka 中由于 get_member_id() 尝试从 NULL 创建 std::string 而导致的崩溃(这很可能只会在连接 broker 失败的情况下出现)。 #80793 (Azat Khuzhin).
  • 在关闭 Kafka 引擎前正确等待所有 consumer 退出(关机后仍处于活动状态的 consumer 可能触发各种调试断言失败,并且在表已被 DROP/DETACH 后仍可能在后台从 broker 读取数据)。 #80795 (Azat Khuzhin).
  • 修复 NOT_FOUND_COLUMN_IN_BLOCK 错误,该错误由 predicate-push-down 优化引起。修复了 #80443#80834Nikolai Kochetov)。
  • 修复在带 USING 子句的 JOIN 中解析表函数中星号(*)通配符时的逻辑错误。#80894Vladimir Cherkasov)。
  • 修复 Iceberg 元数据文件缓存的内存记账。 #80904 (Azat Khuzhin).
  • 修复在使用 Nullable 分区键时出现的错误分区行为。 #80913 (Pervakov Grigorii).
  • 修复在启用谓词下推(allow_push_predicate_ast_for_distributed_subqueries=1)的分布式查询中,当发起查询的节点上不存在源表时出现的 Table does not exist 错误。修复了 #77281#80915Nikolai Kochetov)。
  • 修复使用命名窗口的嵌套函数中的逻辑错误。#80926 (Pervakov Grigorii)。
  • 修复 Nullable 列和浮点列的 extremes 处理逻辑。 #80970 (Pervakov Grigorii)。
  • 修复在从 system.tables 查询时可能发生的崩溃问题(很可能出现在内存紧张时)。 #80976 (Azat Khuzhin).
  • 修复了对于压缩方式由文件扩展名推断的文件,在执行带截断的原子重命名时出现的问题。 #80979 (Pablo Marcos).
  • 修复 ErrorCodes::getName。 #81032 (RinChanNOW).
  • 修复了一个问题:当用户没有所有表的访问权限时,无法在 Unity Catalog 中列出表。现在所有表都会被正确列出,尝试读取受限表时将抛出异常。#81044alesapin)。
  • 现在,ClickHouse 在执行 SHOW TABLES 查询时将忽略来自数据湖目录的错误和意外响应。修复了 #79725#81046alesapin)。
  • 修复在 JSONExtract 和 JSON 类型解析中,将整数解析为 DateTime64 时的问题。#81050Pavel Kruglov)。
  • 在 schema 推断缓存中反映 date_time_input_format 设置。#81052 (Pavel Kruglov).
  • 修复在执行 INSERT 时,如果在查询开始之后但在发送列之前表被 DROP 而导致的崩溃问题。#81053 (Azat Khuzhin).
  • 修复 quantileDeterministic 中 use-of-uninitialized-value 的问题。#81062 (Azat Khuzhin)。
  • 修复 metadatastoragefromdisk 磁盘事务的硬链接计数管理,并添加测试。 #81066 (Sema Checherinda).
  • 与其他函数不同,User Defined Functions (UDF) 的名称不会被写入 system.query_log 表。本 PR 实现了在请求中使用了 UDF 时,将 UDF 名称添加到 used_executable_user_defined_functionsused_sql_user_defined_functions 这两列之一中。#81101 (Kyamran)。
  • 修复了通过 http 协议使用文本格式(JSONValues 等)插入数据且省略 Enum 字段时,可能出现的 Too large size ... passed to allocator 错误或崩溃问题。 #81145 (Anton Popov).
  • 修复在将包含稀疏列的 INSERT 块推送到非 MT 的物化视图(MV)时触发的 LOGICAL_ERROR。#81161 (Azat Khuzhin)。
  • 修复在使用 distributed_product_mode_local=local 且启用跨复制时出现的 Unknown table expression identifier 错误。#81162 (Nikolai Kochetov)。
  • 修复了在过滤后对 Parquet 文件行数的错误缓存问题。#81184Michael Kolupaev)。
  • 修复在使用相对缓存路径时 fs cache max_size_to_total_space 设置的问题。#81237Kseniia Sumarokova)。
  • 修复了当以 Parquet 格式输出常量元组或映射时会导致 clickhouse-local 崩溃的问题。#81249 (Michael Kolupaev).
  • 对通过网络接收的数组偏移量进行验证。#81269 (Azat Khuzhin)。
  • 修复了在对空表进行 JOIN 且使用窗口函数的查询中的一些边界情况。该缺陷会导致并行流数量急剧增长,从而引发 OOM。 #81299 (Alexander Gololobov).
  • 针对数据湖 Cluster 函数(deltaLakeClustericebergCluster 等)的修复:(1) 修复在使用旧分析器配合 Cluster 函数时,DataLakeConfiguration 中可能出现的段错误;(2) 移除重复的数据湖元数据更新(会导致额外的对象存储请求);(3) 修复在未显式指定格式时对对象存储进行的多余列举操作(此前已对非 Cluster 数据湖引擎完成该修复)。#81300 (Kseniia Sumarokova)。
  • 使 force_restore_data 标志位可以恢复丢失的 keeper 元数据。#81324 (Raúl Marín).
  • 修复了 delta-kernel 中的 region 错误。已修复问题 #79914#81353Kseniia Sumarokova)。
  • 禁用 divideOrNull 的错误 JIT 优化。#81370Raúl Marín)。
  • 修复在 MergeTree 表中分区列名过长时出现的插入错误。#81390 (hy123q)。
  • 已在 #81957 中回溯修复:修复了在合并过程中发生异常时,Aggregator 可能崩溃的问题。#81450Nikita Taranov)。
  • 避免在内存中存储多个 manifest 文件的内容。#81470 (Daniil Ivanik).
  • 修复在关闭后台线程池(background_.*pool_size)期间可能出现的崩溃。#81473 (Azat Khuzhin).
  • 修复在使用 URL 引擎向表写入时 Npy 格式中发生的越界读取问题,关闭了 #81356#81502Alexey Milovidov)。
  • 有可能出现 Web UI 显示 NaN% 的情况(典型的 JavaScript 问题)。#81507Alexey Milovidov)。
  • 修复当 database_replicated_enforce_synchronous_settings=1DatabaseReplicated 的问题。 #81564 (Azat Khuzhin).
  • 修复 LowCardinality(Nullable(...)) 类型的排序顺序。#81583Pervakov Grigorii)。
  • 如果尚未从套接字中完整读取请求,服务器不应保留该 HTTP 连接。#81595 (Sema Checherinda)。
  • 使标量关联子查询返回其投影表达式的 Nullable 结果。修复关联子查询返回空结果集时的行为。#81632 (Dmitry Novik)。
  • 修复在对 ReplicatedMergeTree 执行 ATTACH 时出现的 Unexpected relative path for a deduplicated part 错误。#81647Azat Khuzhin)。
  • 查询设置 use_iceberg_partition_pruning 对 Iceberg 存储不会生效,因为它使用的是全局上下文而不是查询上下文。由于其默认值为 true,因此问题不严重。此 PR 修复了该问题。#81673 (Han Fei)。
  • 已在 #82128 中回溯:修复在合并过程中,当在生存时间 (TTL) 表达式中使用字典时出现的“Context has expired”问题。#81690Azat Khuzhin)。
  • 为 MergeTree 设置项 merge_max_block_size 添加校验,以确保其值非零。#81693 (Bharat Nallan)。
  • 修复 clickhouse-local 中导致 DROP VIEW 查询卡住的问题。 #81705 (Bharat Nallan).
  • 修复在某些情况下的 StorageRedis join 问题。 #81736 (Pervakov Grigorii)。
  • 修复在启用旧版分析器且使用空 USING () 时出现的 ConcurrentHashJoin 崩溃问题。#81754 (Nikita Taranov)。
  • Keeper 修复:当日志中存在无效条目时,阻止提交新日志。之前,如果 leader 错误地应用了某些日志,仍会继续提交新日志,即便 follower 检测到摘要不匹配并中止。#81780 (Antonio Andelic).
  • 修复在处理标量关联子查询时未读取所需列的问题。修复 #81716#81805Dmitry Novik)。
  • 有人在我们的代码里到处塞了 Kusto。已清理。关闭 #81643#81885Alexey Milovidov)。
  • 在此前的版本中,服务器在响应对 /js 的请求时返回了过多的内容。已修复该问题,关闭了 #61890#81895Alexey Milovidov)。
  • 之前,MongoDB 表引擎定义可以在 host:port 参数中包含路径部分,但该部分会被静默忽略。MongoDB 集成会拒绝加载此类表。通过此修复,如果 MongoDB 引擎具有五个参数,则允许加载此类表,并忽略路径部分,并使用参数中的数据库名。注意: 该修复不适用于新创建的表、使用 mongo 表函数的查询,以及字典源和命名集合。#81942 (Vladimir Cherkasov)。
  • 修复在合并过程中抛出异常时可能导致 Aggregator 崩溃的问题。 #82022 (Nikita Taranov).
  • 修复 arraySimilarity 中的复制粘贴错误,禁止在权重中使用 UInt32Int32 类型。更新测试和文档。#82103Mikhail f. Shiryaev)。
  • 修复 suggestion 线程与主客户端线程之间可能存在的数据竞争。 #82233 (Azat Khuzhin)。

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

ClickHouse 25.5 版本,2025-05-22

不向后兼容的变更

  • geoToH3 函数现在按照 (lat, lon, res) 的顺序接收输入(这与其他几何函数的惯例一致)。希望保留之前结果顺序 (lon, lat, res) 的用户,可以将设置 geotoh3_argument_order = 'lon_lat'#78852 (Pratima Patel).
  • 新增文件系统缓存设置 allow_dynamic_cache_resize,默认值为 false,用于允许动态调整文件系统缓存大小。原因:在某些环境(如 ClickHouse Cloud)中,所有扩缩容事件都是通过重启进程来完成的,我们希望显式禁用此特性,以便更好地控制行为,并作为安全防护措施。此 PR 被标记为不向后兼容,因为在旧版本中,动态缓存调整在默认情况下是启用的且不需要特殊设置。#79148 (Kseniia Sumarokova).
  • 移除了对旧版索引类型 annoyusearch 的支持。它们已经长期仅作为存根存在,即任何尝试使用这些旧索引的操作都会返回错误。如果你仍然有 annoyusearch 索引,请将其删除。#79802 (Robert Schulze).
  • 移除服务器设置 format_alter_commands_with_parentheses。该设置在 24.2 中被引入且默认禁用,在 25.2 中默认启用。由于不存在不支持新格式的 LTS 版本,我们可以移除此设置。#79970 (János Benjamin Antal).
  • 默认启用 DeltaLake 存储的 delta-kernel-rs 实现。#79541 (Kseniia Sumarokova).
  • 如果从 URL 读取数据涉及多次重定向,设置 enable_url_encoding 将在重定向链中的所有重定向上被正确应用。#79563 (Shankar Iyer). 设置 enble_url_encoding 的默认值现在被设为 false#80088 (Shankar Iyer).

新功能

  • WHERE 子句中支持标量关联子查询。修复 #6697#79600Dmitry Novik)。在简单场景中支持在投影列表中使用关联子查询。#79925Dmitry Novik)。#76078Dmitry Novik)。现在已覆盖 TPC-H 测试套件的 100%。
  • 使用向量相似度索引的向量搜索现已进入 beta 阶段(此前为实验性阶段)。#80164 (Robert Schulze)。
  • Parquet 格式中支持地理数据类型。解决了 #75317 中的问题。#79777scanhex12)。
  • 新增函数 sparseGramssparseGramsHashessparseGramsHashesUTF8sparseGramsUTF8,用于计算“sparse-ngrams”——一种稳健的子串提取算法,可用于索引与搜索。 #79517 (scanhex12).
  • clickhouse-local(及其简写别名 ch)现在在有输入数据需要处理时,会隐式添加 FROM table 子句。这解决了 #65023。同时在 clickhouse-local 中启用了格式推断功能:如果未指定 --input-format 且处理的是普通文件,则会自动推断格式。#79085Alexey Milovidov)。
  • 添加 stringBytesUniqstringBytesEntropy 函数,用于搜索可能是随机或加密的数据。#79350Sachin Kumar Singh)。
  • 新增 Base32 编码和解码函数。#79809 (Joanna Hulboj).
  • 新增 getServerSettinggetMergeTreeSetting 函数,修复 #78318。#78439 (NamNguyenHoai)。
  • 添加新的 iceberg_enable_version_hint 设置以利用 version-hint.text 文件。#78594Arnaud Briche)。
  • 支持使用 LIKE 关键字进行过滤,从数据库中截断特定表。 #78597 (Yarik Briukhovetskyi)。
  • MergeTree 系列表中支持 _part_starting_offset 虚拟列。该列表示所有之前分区片段的累积行数,在查询时根据当前分区片段列表计算得出。累积值在整个查询执行过程中都会保留,并且在分区片段裁剪后仍然有效。为支持此行为,相关内部逻辑已完成重构。#79417Amos Bird)。
  • 添加函数 divideOrNullmoduloOrNullintDivOrNullpositiveModuloOrNull,在右侧参数为零时返回 NULL。 #78276 (kevinyhzou).
  • ClickHouse 向量搜索现在同时支持预过滤和后过滤,并提供相关设置以进行更精细的控制。(issue #78161)。#79854Shankar Iyer)。
  • 新增 icebergHashicebergBucket 函数。支持在使用 bucket transfom 进行分区的 Iceberg 表中进行数据文件剪枝。#79262 (Daniil Ivanik)。

实验特性

  • 新增 Time/Time64 数据类型:Time(HHH:MM:SS)和 Time64(HHH:MM:SS.&lt;fractional&gt;),以及一些基础的类型转换(cast)函数和用于与其他数据类型交互的函数。同时,将已有函数名称从 toTime 修改为 toTimeWithFixedDate,因为类型转换函数需要使用 toTime#75735 (Yarik Briukhovetskyi)
  • 用于 Iceberg 数据湖的 Hive metastore catalog。#77677 (scanhex12)
  • full_text 类型的索引重命名为 gin。这与 PostgreSQL 和其他数据库中更常见的术语保持一致。现有的 full_text 类型索引仍然可以加载,但在尝试在搜索中使用它们时会抛出异常(并建议改用 gin 索引)。#79024 (Robert Schulze)

性能优化

  • 将 Compact 分区片段格式更改为为每个子流保存标记,从而可以单独读取子列。旧的 Compact 格式在读取时仍然受支持,并且可以通过 MergeTree SETTING write_marks_for_substreams_in_compact_parts 在写入时启用。为了更安全地进行升级,默认情况下该选项是禁用的,因为这会改变 Compact 分区片段的存储方式。它将在后续的某个版本中默认启用。#77940 (Pavel Kruglov)。
  • 允许将包含子列的条件下推到 PREWHERE#79489 (Pavel Kruglov).
  • 通过在多个粒度上并行计算索引表达式来加速二级索引。#64109Alexey Milovidov)。
  • 默认启用 compile_expressions(用于普通表达式片段的 JIT 编译器)。从而解决了 #51264#56386#66486 等问题。#79907Alexey Milovidov)。
  • 新增设置:use_skip_indexes_in_final_exact_mode。如果对 ReplacingMergeTree 表的查询带有 FINAL 子句,而仅根据跳过索引来确定要读取的表范围,可能会产生不正确的结果。此设置可通过扫描与跳过索引返回的主键范围有重叠关系的较新分区片段,确保返回正确结果。设置为 0 表示禁用,为 1 表示启用。#78350Shankar Iyer)。
  • 对象存储集群表函数(例如 s3Cluster)现在在读取时会基于一致性哈希将文件分配到各个副本,以提升缓存局部性。#77326 (Andrej Hoos)。
  • 通过允许并行执行 INSERT(可通过队列设置 parallel_inserts=true 启用),提升 S3Queue/AzureQueue 的性能。之前 S3Queue/AzureQueue 只能在流水线的第一阶段(下载、解析)并行执行,INSERT 是单线程的,而且 INSERT 几乎总是瓶颈。现在性能将几乎可以随 processing_threads_num 线性扩展。#77671Azat Khuzhin)。在 S3Queue/AzureQueue 中实现更公平的 max&#95;processed&#95;files&#95;before&#95;commit 设置。#79363Azat Khuzhin)。
  • 引入阈值(由设置项 parallel_hash_join_threshold 控制),当右表大小低于该阈值时会回退到 hash 算法。#76185 (Nikita Taranov)。
  • 现在,在启用并行副本读取时,我们会根据副本数量来确定读取任务的大小。这样在需要读取的数据量不大时,可以在副本之间实现更好的工作分配。#78695Nikita Taranov)。
  • 允许在分布式聚合的最终阶段并行合并 uniqExact 状态。#78703 (Nikita Taranov)。
  • 修复在带键聚合中并行合并 uniqExact 状态时可能出现的性能下降。#78724Nikita Taranov)。
  • 减少对 Azure 存储执行的 List Blobs API 调用次数。#78860 (Julia Kartseva).
  • 修复带并行副本的分布式 INSERT SELECT 的性能问题。#79441 (Azat Khuzhin)。
  • 避免 LogSeriesLimiter 在每次实例化时执行清理操作,以避免在高并发场景下的锁竞争和性能退化。#79864 (filimonov)。
  • 通过简单 COUNT 优化加速查询。 #79945 (Raúl Marín).
  • 对部分 Decimal 操作的内联进行了优化。#79999 (Konstantin Bogdanov)。
  • input_format_parquet_bloom_filter_push_down 的默认值设为 true,并修复设置变更历史中的一个错误。#80058 (Alexey Milovidov).
  • 针对所有行都应被删除的分区片段优化了 ALTER ... DELETE 变更操作。现在,在这种情况下会直接创建一个空的分区片段来替代原始分区片段,而无需执行变更操作。 #79307 (Anton Popov).
  • 在可能的情况下,避免在插入 Compact part 时对数据块进行额外拷贝。#79536 (Pavel Kruglov)。
  • 新增 input_format_max_block_size_bytes 设置,用于按字节数限制在输入格式中创建的 block 大小。这有助于在导入包含大值的行时避免高内存占用。#79495 (Pavel Kruglov)。
  • 移除线程和 async_socket_for_remote/use_hedge_requests 的保护页(guard pages)。将 FiberStack 中的内存分配方式从 mmap 更改为 aligned_alloc。由于这会导致 VMA 被拆分,在高负载下可能会触及 vm.max_map_count 限制。#79147 (Sema Checherinda)。
  • 支持并行副本的惰性物化。 #79401 (Igor Nikonov).

改进

  • 新增支持实时应用轻量级删除(通过设置 lightweight_deletes_sync = 0apply_mutations_on_fly = 1)。#79281 (Anton Popov).
  • 如果在终端中显示的数据为 Pretty 格式,并且后续的数据块具有相同的列宽,则可以通过上移光标,将其接续到前一个数据块之后并与之拼接。由此关闭了 #79333。该功能由新的设置 output_format_pretty_glue_chunks 控制。#79339Alexey Milovidov)。
  • isIPAddressInRange FUNCTION 扩展为支持 StringIPv4IPv6Nullable(String)Nullable(IPv4)Nullable(IPv6) 数据类型。#78364YjyJeff)。
  • 允许动态修改 PostgreSQL 引擎的连接池配置。#78414 (Samay Sharma)。
  • 允许在常规投影中指定 _part_offset。这是构建投影索引的第一步。它可以与 #58224 配合使用,并有助于改进 #63207。#78429Amos Bird)。
  • system.named_collections 新增 create_querysource 列。关闭 #78179#78582MikhailBurdukov)。
  • 在系统表 system.query_condition_cache 中新增了字段 condition。该字段存储明文条件,其哈希值用作查询条件缓存中的键。 #78671 (Robert Schulze).
  • 现在可以在 BFloat16 列上创建向量相似度索引。#78850 (Robert Schulze)。
  • DateTime64 的最佳努力解析模式下,支持带小数部分的 Unix 时间戳。#78908 (Pavel Kruglov)。
  • DeltaLake 存储的 delta-kernel 实现中,修复列映射模式的问题,并为模式演进添加测试。#78921 (Kseniia Sumarokova)。
  • 通过改进值转换,优化以 Values 格式向 Variant 列插入数据的操作。 #78923 (Pavel Kruglov).
  • tokens 函数现已扩展,可接受一个额外的 “tokenizer” 参数,以及更多该 tokenizer 特定的参数。#79001 (Elmi Ahmadov)。
  • SHOW CLUSTER 语句现在会展开其参数中的宏(如果有的话)。#79006 (arf42)。
  • 哈希函数现在支持数组、元组和映射中包含 NULL 值。(issues #48365#48623)。#79008 (Michael Kolupaev)。
  • 将 cctz 更新到 2025a。 #79043 (Raúl Marín).
  • 将 UDF 的默认 stderr 处理方式更改为 "log_last",有利于提高易用性。#79066 (Alexey Milovidov)。
  • 使 Web UI 中的选项卡支持撤销操作。关闭 #71284#79084Alexey Milovidov)。
  • recoverLostReplica 过程中移除相关设置,与此前在此变更中的处理方式保持一致:https://github.com/ClickHouse/ClickHouse/pull/78637#79113Nikita Mikhaylov)。
  • 添加 profile 事件:ParquetReadRowGroupsParquetPrunedRowGroups,用于对 Parquet 索引裁剪进行性能分析。 #79180 (flynn).
  • 支持在集群上对数据库执行 ALTER 操作。#79242Tuan Pham Anh)。
  • 显式跳过在为 QueryMetricLog 收集统计信息时错过的运行,否则日志需要很长时间才能追上当前时间。#79257 (Mikhail Artemenko)。
  • 对基于 Arrow 的格式的读取进行了小幅优化。#79308Bharat Nallan)。
  • allow_archive_path_syntax 设置被误标记为实验性特性。新增一个测试,防止实验性设置在默认情况下被启用。#79320 (Alexey Milovidov)。
  • 使页缓存设置可以在单个查询层面进行调整。这样可以更快速地进行实验,并可以针对高吞吐量和低延迟查询进行精细调优。 #79337 (Alexey Milovidov).
  • 在 Pretty 输出格式中,对于看起来像典型 64 位哈希值的数字,将不再打印数字提示。此更改修复了 #79334#79338Alexey Milovidov)。
  • 高级仪表板上图表的颜色现在将根据对应查询的哈希值计算得出。这有助于在滚动浏览仪表板时更容易记住并定位某个图表。#79341 (Alexey Milovidov)。
  • 新增异步指标 FilesystemCacheCapacity,表示 cache 虚拟文件系统的总容量。这对于全局基础设施监控非常有用。#79348 (Alexey Milovidov)。
  • 优化对 system.parts 的访问(仅在需要时读取列/索引的大小)。 #79352 (Azat Khuzhin).
  • 对查询 'SHOW CLUSTER <name>' 仅计算相关字段,而不是计算所有字段。#79368Tuan Pham Anh)。
  • 允许为 DatabaseCatalog 指定存储配置。 #79407 (Kseniia Sumarokova).
  • 支持在 DeltaLake 中使用本地存储。 #79416 (Kseniia Sumarokova).
  • 添加一个查询级别设置以启用 delta-kernel-rs:allow_experimental_delta_kernel_rs#79418 (Kseniia Sumarokova)。
  • 修复从 Azure/S3 Blob 存储中列出 Blob 时可能出现的无限循环问题。#79425 (Alexander Gololobov)。
  • 新增文件系统缓存设置项 max_size_ratio_to_total_space#79460 (Kseniia Sumarokova).
  • 针对 clickhouse-benchmark,将 reconnect 选项重新配置为可接受 0、1 或 N 作为取值,并据此执行重连。 #79465 (Sachin Kumar Singh).
  • 允许在不同 plain_rewritable 磁盘上的表上执行 ALTER TABLE ... MOVE|REPLACE PARTITION#79566 (Julia Kartseva)。
  • 现在,如果参考向量的类型为 Array(BFloat16),也会使用向量相似度索引。 #79745 (Shankar Iyer).
  • 在 system.error_log 表中添加 last_error_message、last_error_trace 和 query_id。相关 issue #75816#79836Andrei Tinikov)。
  • 默认启用崩溃报告发送。可在服务器配置文件中关闭该功能。 #79838 (Alexey Milovidov).
  • 系统表 system.functions 现在会显示各个函数首次引入的 ClickHouse 版本信息。#79839Robert Schulze)。
  • 新增 access_control_improvements.enable_user_name_access_type 设置项。此设置允许启用或禁用针对用户/角色的精确授权控制,该功能最初在 https://github.com/ClickHouse/ClickHouse/pull/72246 中引入。如果你的集群中存在版本早于 25.1 的副本,建议关闭此设置。#79842 (pufit)。
  • 在对 ASTSelectWithUnionQuery::clone() 方法的正确实现中,现在也会考虑到 is_normalized 字段。这可能有助于解决 #77569#79909Nikita Mikhaylov)。
  • 修复了使用 EXCEPT 运算符的某些查询在格式化时不一致的问题。如果 EXCEPT 运算符左侧以 * 结尾,格式化后的查询会丢失括号,从而被解析为带有 EXCEPT 修饰符的 *。这些查询是通过模糊测试工具(fuzzer)发现的,在实际使用中不太可能遇到。本次修改关闭了 #79950#79952Alexey Milovidov)。
  • 通过使用变体反序列化顺序缓存,对 JSON 类型的解析进行了小幅改进。#79984 (Pavel Kruglov)。
  • 新增 s3_slow_all_threads_after_network_error 设置。 #80035 (Vitaly Baranov).
  • 关于所选分区片段合并的日志级别设置错误(应为 Information)。修复了 #80061#80062Alexey Milovidov)。
  • trace-visualizer:在工具提示和状态信息中添加 runtime/share。 #79040 (Sergei Trifonov)。
  • trace-visualizer:支持从 ClickHouse 服务器加载数据。 #79042 (Sergei Trifonov).
  • 为失败的合并操作添加指标。 #79228 (Miсhael Stetsyuk).
  • 如果指定了最大迭代次数,clickhouse-benchmark 将根据该最大迭代次数显示进度百分比。#79346Alexey Milovidov)。
  • 添加 system.parts 表可视化功能。 #79437 (Sergei Trifonov).
  • 新增用于分析查询延迟的工具。 #79978 (Sergei Trifonov)。

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复在数据片段中缺失列的重命名问题。#76346 (Anton Popov).
  • materialized view 可能启动得太晚,例如在为其提供流式数据的 Kafka 表之后才开始运行。#72123Ilya Golshtein)。
  • 修复了在启用 analyzer 的情况下创建 VIEW 时对 SELECT 查询的重写问题。修复了 #75956#76356Dmitry Novik)。
  • 修复从服务器应用 async_insert 设置(通过 apply_settings_from_server)(此前会在客户端导致 Unknown packet 11 from server 错误)。#77578 (Azat Khuzhin)。
  • 修复了可刷新materialized view在 Replicated 数据库中新添加的副本上无法工作的问题。 #77774 (Michael Kolupaev).
  • 修复了可刷新materialized view 会破坏备份的问题。 #77893 (Michael Kolupaev).
  • 修复 transform 旧触发逻辑中的错误。 #78247 (Yarik Briukhovetskyi).
  • 修复了一些在使用 analyzer 时未应用二级索引的情况。修复了 #65607#69373#78485Nikolai Kochetov)。
  • 修复在启用压缩的 HTTP 协议下导出 profile events(NetworkSendElapsedMicroseconds / NetworkSendBytes)时的问题(误差不应大于缓冲区大小,通常约为 1MiB)。#78516 (Azat Khuzhin)。
  • 修复 analyzer 在 JOIN ... USING 中涉及 ALIAS 列时产生 LOGICAL_ERROR 的问题——现在会抛出更合适的错误。 #78618 (Yakov Olkhovskiy).
  • 修复 analyzer:当 SELECT 包含位置参数时,CREATE VIEW ... ON CLUSTER 会失败的问题。 #78663 (Yakov Olkhovskiy).
  • 修复在执行 INSERT SELECT 向使用模式推断的表函数插入数据且 SELECT 中包含标量子查询时出现的 Block structure mismatch 错误。#78677Pervakov Grigorii)。
  • 修复 analyzer:在分布式表上使用 prefer_global_in_and_join=1 时,SELECT 查询中的 in 函数应被替换为 globalIn#78749 (Yakov Olkhovskiy).
  • 修复了多种类型的 SELECT 查询,这些查询从使用 MongoDB 引擎的表或 mongodb 表函数中读取数据:在 WHERE 子句中对常量值进行隐式类型转换的查询(例如 WHERE datetime = '2025-03-10 00:00:00');以及带有 LIMITGROUP BY 的查询。此前,这些查询可能会返回错误的结果。#78777Anton Popov)。
  • 修复不同 JSON 类型之间的转换。现在通过先与 String 之间互相转换,再进行简单的 cast 来完成。这样效率较低,但可以保证 100% 的准确性。#78807 (Pavel Kruglov)。
  • 修复在将 Dynamic 类型转换为 Interval 类型时的逻辑错误。 #78813 (Pavel Kruglov)。
  • 修复在 JSON 解析出错时的列回滚问题。#78836 (Pavel Kruglov)。
  • 修复在使用常量别名列进行 JOIN 时导致的“bad cast”错误。#78848 (Vladimir Cherkasov)。
  • 禁止在 materialized view 中,对在视图与目标表中数据类型不一致的列使用 prewhere#78889 (Pavel Kruglov)。
  • 修复在解析 Variant 列中异常二进制数据时的逻辑错误。 #78982 (Pavel Kruglov).
  • 当 parquet 批处理大小被设置为 0 时抛出异常。此前当 output_format_parquet_batch_size = 0 时,ClickHouse 会陷入挂起状态。现在这一问题已被修复。 #78991 (daryawessely).
  • 修复在紧凑分区片段中使用 basic 格式时,variant 判别符的反序列化问题。该问题是在 https://github.com/ClickHouse/ClickHouse/pull/55518 中引入的。#79000Pavel Kruglov)。
  • 现在,类型为 complex_key_ssd_cache 的字典会拒绝 block_sizewrite_buffer_size 参数为 0 或负值的配置(issue #78314)。#79028Elmi Ahmadov)。
  • 避免在 SummingMergeTree 中对未参与聚合的列使用 Field。这样可能会在 SummingMergeTree 中使用 Dynamic/Variant 类型时导致意外错误。 #79051 (Pavel Kruglov)。
  • 修复在 analyzer 中从目标表为 Distributed 且表头不同的 materialized view 读取数据时的问题。#79059 (Pavel Kruglov)。
  • 修复了在对表进行批量插入时,arrayUnion() 会返回多余(错误)值的问题。修复 #75057#79079Peter Nguyen)。
  • 修复 OpenSSLInitializer 中的段错误。关闭 Issue #79092#79097Konstantin Bogdanov)。
  • 始终为 S3 的 ListObject 操作设置前缀。 #79114 (Azat Khuzhin).
  • 修复了一个 bug:在使用批量插入的表上,arrayUnion() 会返回多余(错误)的值。修复 #79157#79158Peter Nguyen)。
  • 修复在执行过滤下推后出现的逻辑错误。 #79164 (Pervakov Grigorii).
  • 修复在通过 HTTP 端点使用 delta-kernel 实现时的 DeltaLake 表引擎问题,并修复 NOSIGN。关闭 #78124#79203Kseniia Sumarokova)。
  • Keeper 修复:避免因 multi 请求失败而触发 watch。#79247 (Antonio Andelic)。
  • 禁止在 IN 中使用 Dynamic 和 JSON 类型。以当前 IN 的实现方式,可能会导致结果不正确。在 IN 中对这些类型提供完备支持较为复杂,可能会在未来实现。#79282 (Pavel Kruglov)。
  • 修复在 JSON 类型解析过程中对重复路径的检查。#79317Pavel Kruglov)。
  • 修复了 SecureStreamSocket 连接问题。 #79383 (Konstantin Bogdanov).
  • 修复加载包含数据的 plain_rewritable 磁盘的问题。#79439Julia Kartseva)。
  • 修复在 MergeTree 的 Wide 分区片段上进行动态子列发现时可能发生的崩溃。#79466 (Pavel Kruglov).
  • 仅在初次建表查询时检查表名长度。对于后续创建操作不要进行此检查,以避免向后兼容性问题。#79488 (Miсhael Stetsyuk)。
  • 修复了在多种情况下包含稀疏列的表出现 Block structure mismatch 错误的问题。 #79491 (Anton Popov).
  • 修复了两个会触发 “Logical Error: Can't set alias of * of Asterisk on alias” 的问题。#79505Raúl Marín)。
  • 修复在重命名 Atomic 数据库时使用了错误路径的问题。#79569Tuan Pham Anh)。
  • 修复在与其他列一起进行 ORDER BY 时涉及 JSON 列的问题。 #79591 (Pavel Kruglov).
  • 修复在同时禁用 use_hedged_requestsallow_experimental_parallel_reading_from_replicas 时,从远程读取时会出现结果重复的问题。 #79599 (Eduard Karacharov).
  • 修复在使用 Unity Catalog 时 delta-kernel 实现中的崩溃。 #79677 (Kseniia Sumarokova).
  • 修复 autodiscovery 集群中的宏解析问题。 #79696 (Anton Ivashkin).
  • 合理处理配置错误的 page_cache_limits#79805 (Bharat Nallan).
  • 修复了当可变长度格式说明符(例如 %W,即星期几名称 MondayTuesday 等)后紧跟复合格式说明符(一次输出多个组件的格式说明符,例如 %D,即美国日期格式 05/04/25)时,SQL 函数 formatDateTime 的结果不正确的问题。 #79835 (Robert Schulze)。
  • IcebergS3 支持 COUNT 优化,但 IcebergS3Cluster 不支持。因此,在集群模式下返回的 count() 结果可能是副本数量的倍数。#79844 (wxybear)。
  • 修复了在延迟物化(lazy materialization)场景下,如果在投影(projection)之前的查询执行阶段未使用任何列时会触发的 AMBIGUOUS_COLUMN_NAME 错误。例如:SELECT * FROM t ORDER BY rand() LIMIT 5。#79926Igor Nikonov)。
  • 对查询 CREATE DATABASE datalake ENGINE = DataLakeCatalog(\'http://catalog:8181\', \'admin\', \'password\') 中的密码进行隐藏。 #79941 (Han Fei).
  • 允许在 JOIN USING 中指定别名。如果列被重命名(例如由于 ARRAY JOIN),请通过指定该别名来引用它。修复了 #73707#79942Nikolai Kochetov)。
  • 使包含 UNION 的 materialized view 能在新副本上正常工作。#80037Samay Sharma)。
  • SQL 函数 parseDateTime 中的格式说明符 %e 现在可以识别个位数的日期(例如 3),而此前需要使用空格填充(例如 3)。这使其行为与 MySQL 兼容。若要保留之前的行为,请将 setting parsedatetime_e_requires_space_padding 设为 1。(issue #78243)。#80057Robert Schulze)。
  • 修复 ClickHouse 日志中的警告 Cannot find 'kernel' in '[...]/memory.stat'(问题 #77410)。#80129Robert Schulze)。
  • FunctionComparison 中检查栈大小,以避免因栈溢出而崩溃。#78208 (Julia Kartseva)。
  • 修复从 system.workloads 表执行 SELECT 时的数据竞争问题。 #78743 (Sergei Trifonov).
  • 修复:分布式查询中的惰性物化。 #78815 (Igor Nikonov).
  • 修复 Array(Bool)Array(FixedString) 的转换问题。#78863Nikita Taranov)。
  • 让 Parquet 版本选择更清晰。#78818 (Michael Kolupaev).
  • 修复 ReservoirSampler 的自我合并问题。#79031 (Nikita Taranov).
  • 修复客户端上下文中插入表存储的问题。 #79046 (Pervakov Grigorii).
  • 修正 AggregatingSortedAlgorithmSummingSortedAlgorithm 的数据成员析构顺序。#79056Nikita Taranov)。
  • enable_user_name_access_type 不应影响 DEFINER 访问类型。#80026 (pufit)。
  • system 数据库的元数据存放在 keeper 中时,对该数据库的查询可能会发生挂起。 #79304 (Mikhail Artemenko).

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

ClickHouse 25.4 版本发布,2025-04-22

向后不兼容的变更

  • allow_materialized_view_with_bad_selectfalse 时,检查 materialized view 中的所有列是否与目标表匹配。#74481Christoph Wurm
  • 修复在使用负的 Date/DateTime 参数调用 dateTrunc 时的某些情况。#77622Yarik Briukhovetskyi
  • 已移除旧版 MongoDB 集成。服务器设置 use_legacy_mongodb_integration 已废弃,现在不再产生任何效果。#77895Robert Schulze
  • 增强 SummingMergeTree 校验逻辑,跳过对用作分区键或排序键的列进行聚合。#78022Pervakov Grigorii

新功能

  • 为工作负载添加了 CPU 插槽调度支持,详细信息请参见文档#77595Sergei Trifonov)。
  • 如果指定 --path 命令行参数,clickhouse-local 在重启后将保留其数据库。从而关闭了 #50647#49947#71722Alexey Milovidov)。
  • 当服务器过载时,会拒绝查询。该决策依据等待时间(OSCPUWaitMicroseconds)与忙碌时间(OSCPUVirtualTimeMicroseconds)的比值做出。当该比值处于 min_os_cpu_wait_time_ratio_to_throwmax_os_cpu_wait_time_ratio_to_throw 之间时(这些是查询级别的设置),会以一定概率丢弃查询。#63206Alexey Katsman)。
  • Iceberg 中支持时间旅行:新增一个设置,用于在特定时间点查询 Iceberg 表。#71072 (Brett Hoerner)。#77439 (Daniil Ivanik)。
  • 用于 Iceberg 元数据的内存缓存,存储 manifest 文件及列表和 metadata.json,以加速查询。#77156 (Han Fei)。
  • 支持在 Azure Blob Storage 上使用 DeltaLake 表引擎。修复 #68043#74541Smita Kulkarni)。
  • 为反序列化的向量相似度索引新增了内存缓存,这应当能加快重复执行的近似最近邻(ANN)搜索查询。新缓存的大小由服务器设置 vector_similarity_index_cache_sizevector_similarity_index_cache_max_entries 控制。该功能取代了早期版本中的跳过索引缓存功能。#77905Shankar Iyer)。
  • 支持在 Delta Lake 中进行分区剪枝。 #78486 (Kseniia Sumarokova).
  • 在只读的 MergeTree 表中增加对后台刷新机制(background refresh)的支持,从而可以通过无限数量的分布式读取节点(ClickHouse 原生数据湖)来查询可更新表。#76467Alexey Milovidov)。
  • 支持使用自定义磁盘存储数据库元数据文件。目前仅支持在服务器全局级别进行配置。#77365Tuan Pham Anh)。
  • 在 plain_rewritable 磁盘上支持 ALTER TABLE ... ATTACH|DETACH|MOVE|REPLACE PARTITION。#77406Julia Kartseva)。
  • Kafka 表引擎添加用于 SASL 配置和凭证的表级设置。这样可以在 CREATE TABLE 语句中直接配置面向 Kafka 及 Kafka 兼容系统的基于 SASL 的认证,而无需使用配置文件或命名集合。#78810Christoph Wurm)。
  • 允许为 MergeTree 表设置 default_compression_codec:当 CREATE 查询未为给定列显式指定压缩编解码器时,将使用该设置。修复了 #42005#66394gvoelfin)。
  • 在集群配置中添加 bind_host 配置项,使 ClickHouse 能够在分布式连接中使用特定网络。#74741Todd Yocum)。
  • system.tables 中新增列 parametrized_view_parameters。关闭 https://github.com/clickhouse/clickhouse/issues/66756#75112NamNguyenHoai)。
  • 允许修改数据库注释。修复 #73351 ### 面向用户变更的文档条目。#75622 (NamNguyenHoai).
  • 在 PostgreSQL 兼容协议中增加对 SCRAM-SHA-256 认证的支持。#76839 (scanhex12)。
  • 新增函数 arrayLevenshteinDistancearrayLevenshteinDistanceWeightedarraySimilarity#77187Mikhail f. Shiryaev)。
  • parallel_distributed_insert_select 设置现在也对 ReplicatedMergeTree 表上的 INSERT SELECT 生效(此前仅支持通过 Distributed 表)。#78041 (Igor Nikonov)。
  • 引入 toInterval 函数。该函数接受 2 个参数(valueunit),并将该值转换为特定的 Interval 类型。 #78723 (Andrew Davis)。
  • 为 iceberg 表 FUNCTION 和引擎新增多种便捷方式,用于解析根目录下的 metadata.json 文件。修复 #78455#78475Daniil Ivanik)。
  • 在 ClickHouse 的 SSH 协议中支持基于密码的身份验证。#78586 (Nikita Mikhaylov)。

实验特性

  • 支持在 WHERE 子句中将相关子查询作为 EXISTS 表达式的参数。修复 #72459#76078Dmitry Novik)。
  • 新增 sparseGramssparseGramsHashes 函数的 ASCII 与 UTF8 版本。作者:scanhex12#78176Pervakov Grigorii)。请勿使用:其实现将在后续版本中更改。

性能优化

  • 使用 lazy 列在 ORDER BY 和 LIMIT 之后再读取数据,以优化性能。 #55518 (Xiaozhe Yu)。
  • 默认开启查询条件缓存。 #79080 (Alexey Milovidov).
  • 通过对 col->insertFrom() 的调用去虚拟化,加速构建 JOIN 结果。#77350 (Alexander Gololobov).
  • 如果可能,将来自过滤查询计划步骤的相等条件合并到 JOIN 条件中,以便可以将它们用作哈希表的键。#78877 (Dmitry Novik)。
  • 当 JOIN 键同时是 JOIN 双方表主键(PK)的前缀时,对 JOIN 使用动态分片。可以通过 query_plan_join_shard_by_pk_ranges 设置启用该优化(默认禁用)。#74733 (Nikolai Kochetov)。
  • 支持基于列的上下边界值进行 Iceberg 数据剪枝。修复 #77638#78242 (alesapin)。
  • Iceberg 实现了针对 count() 的简单优化。现在对于不带任何过滤条件的 count() 查询应当更快。关闭 #77639#78090alesapin)。
  • 添加了通过 max_merge_delayed_streams_for_parallel_write 配置合并时可并行刷新的列数的能力(预计可将向 S3 执行纵向合并时的内存占用减少约 25 倍)。 #77922 (Azat Khuzhin).
  • 当缓存处于被动使用状态时(例如用于合并操作),禁用 filesystem_cache_prefer_bigger_buffer_size。这可以降低合并过程中的内存消耗。 #77898 (Kseniia Sumarokova).
  • 现在,在启用并行副本读取时,我们会根据副本数量来确定读取任务的规模。这样可以在待读取数据量不大的情况下,在副本之间实现更优的负载分配。 #78695 (Nikita Taranov).
  • ORC 格式添加异步 I/O 预取支持,通过隐藏远程 I/O 延迟来提升整体性能。#70534 (李扬)。
  • 预先分配用于异步插入的内存以提升性能。#74945 (Ilya Golshtein)。
  • 通过在可用 multiRead 的地方避免使用单个 get 请求,从而减少 Keeper 请求数量;在副本数量增加的情况下,单个 get 请求可能会给 Keeper 带来显著负载。 #56862 (Nikolay Degterinsky).
  • 对在 Nullable 参数上的函数执行进行了小幅优化。#76489 (李扬)。
  • 优化了 arraySort#76850 (李扬).
  • 将同一部分的标记合并后,一次性写入查询条件缓存,以减少锁的开销。 #77377 (zhongyuankai).
  • 为包含单个括号展开的查询优化 s3Cluster 的性能。#77686 (Tomáš Hromada)。
  • 优化对单个 Nullable 或 LowCardinality 列的 ORDER BY。 #77789 (李扬).
  • 优化 Native 格式的内存占用。 #78442 (Azat Khuzhin).
  • 小幅优化:如果需要进行类型转换,则不要将 count(if(...)) 重写为 countIf。关闭 #78564#78565李扬)。
  • hasAll 函数现在可以利用 tokenbf_v1ngrambf_v1 全文跳过索引。#77662UnamedRus)。
  • 向量相似度索引可能会最多多分配一倍主内存。本次修复重新设计了内存分配策略,从而降低内存消耗并提升向量相似度索引缓存的有效性。(issue #78056)。#78394Shankar Iyer)。
  • system.metric_log 表引入一个带有 schema 类型的 schema_type 设置。允许的 schema 有三种:wide —— 当前使用的 schema,每个 metric/event 存储在独立的列中(对按列读取最为高效);transposed —— 类似于 system.asynchronous_metric_log,metrics/events 以行的形式存储;以及最值得关注的 transposed_with_wide_view —— 使用 transposed schema 创建底层表,同时再提供一个采用 wide schema 的视图,用于将对视图的查询转换为对底层表的查询。在 transposed_with_wide_view 中,不支持视图的亚秒级时间精度,event_time_microseconds 仅作为向后兼容的别名。#78412 (alesapin)。

改进

  • Distributed 查询序列化查询计划。新增了一个名为 serialize_query_plan 的 SETTING。启用后,来自 Distributed 表的查询在远程执行时将使用序列化的查询计划。这为 TCP 协议引入了一种新的数据包类型,需要在服务器配置中添加 <process_query_plan_packet>true</process_query_plan_packet> 以允许处理该数据包。#69652 (Nikolai Kochetov)。
  • 支持从视图中读取 JSON 类型及其子列。#76903 (Pavel Kruglov)。
  • 已支持 ALTER DATABASE ... ON CLUSTER#79242 (Tuan Pham Anh)。
  • 可刷新materialized view 的刷新操作现已记录在 system.query_log 中。#71333Michael Kolupaev)。
  • 用户定义函数(UDF)现在可以通过其配置中的一个新设置标记为确定性(deterministic)。另外,查询缓存现在会检查查询中被调用的 UDF 是否为确定性函数;如果是,则会缓存该查询结果。(问题 #59988)。#77769Jimmy Aguilar Mena)。
  • 为所有类型的副本任务启用了退避逻辑。这样可以降低 CPU 使用率、内存使用量以及日志文件大小。新增了 max_postpone_time_for_failed_replicated_fetches_msmax_postpone_time_for_failed_replicated_merges_msmax_postpone_time_for_failed_replicated_tasks_ms 这几个与 max_postpone_time_for_failed_mutations_ms 类似的设置。 #74576 (MikhailBurdukov).
  • system.errors 中添加了 query_id。关闭 #75815#76581Vladimir Baikov)。
  • 新增支持将 UInt128 转换为 IPv6。从而可以对 IPv6 执行 bitAnd 运算及算术运算,并将结果转换回 IPv6。解决 #76752。同样也允许将对 IPv6 执行 bitAnd 运算的结果再转换回 IPv6。另见 #57707#76928 (Muzammil Abdul Rehman)。
  • 默认情况下,在 Variant 类型的文本格式中不会解析特殊的 Bool 值。可以通过设置 allow_special_bool_values_inside_variant 来启用此行为。#76974 (Pavel Kruglov).
  • 支持在会话级和服务器级配置低 priority 查询的按任务等待时间。#77013 (VicoWu).
  • 为 JSON 数据类型的值实现了比较功能。现在可以像比较 Map 一样比较 JSON 对象。 #77397 (Pavel Kruglov).
  • 通过 system.kafka_consumers 提升了权限支持。转发内部的 librdkafka 错误(值得一提的是,这个库本身问题很多)。 #77700 (Ilya Golshtein).
  • 增加了对 Buffer 表引擎设置的校验。 #77840 (Pervakov Grigorii)。
  • 添加配置项 enable_hdfs_pread,用于启用或禁用 HDFS 中的 pread 功能。 #77885 (kevinyhzou).
  • 增加用于统计 ZooKeeper multi 读写请求次数的 profile events。 #77888 (JackyWoo).
  • 在启用 disable_insertion_and_mutation 时,允许创建临时表并向其中插入数据。#77901 (Xu Jia).
  • max_insert_delayed_streams_for_parallel_write 降低至 100。 #77919 (Azat Khuzhin).
  • 修复了 Joda 语法中的年份解析问题(如果你想知道的话,这是来自 Java 世界),例如 yyy#77973 (李扬).
  • 附加 MergeTree 表的分区片段时将按照其数据块顺序执行,这对于诸如 ReplacingMergeTree 之类的特殊合并算法来说非常重要。此更改修复了 #71009#77976Alexey Milovidov)。
  • 现在,查询掩码规则在发生匹配时可以抛出 LOGICAL_ERROR。这有助于检查预定义的密码是否在日志中的任何位置泄露。#78094 (Nikita Mikhaylov).
  • information_schema.tables 添加了列 index_length_column,以更好地兼容 MySQL。 #78119 (Paweł Zakrzewski).
  • 引入两个新指标:TotalMergeFailuresNonAbortedMergeFailures。这些指标用于检测在短时间内出现过多合并失败的情况。 #78150 (Miсhael Stetsyuk)。
  • 修复在使用 path-style 模式且未在路径中指定 key 时对 S3 URL 的错误解析。#78185 (Arthur Passos)。
  • 修复异步指标 BlockActiveTimeBlockDiscardTimeBlockWriteTimeBlockQueueTimeBlockReadTime 的错误取值(修改前 1 秒错误地被报告为 0.001)。#78211filimonov)。
  • 在向基于 StorageS3(Azure)Queue 的 materialized view 推送数据时,对发生的错误遵守 loading_retries 重试次数限制。此前此类错误会被无限次重试。 #78313 (Kseniia Sumarokova).
  • 在使用 delta-kernel-rs 实现的 Delta Lake 中,优化性能并修复进度条。#78368 (Kseniia Sumarokova).
  • 为 runtime 磁盘新增对 includefrom_envfrom_zk 的支持。关闭 #78177#78470 (Kseniia Sumarokova)。
  • 为运行时间较长的 mutation 在 system.warnings 表中添加动态警告。#78658Bharat Nallan)。
  • 在系统表 system.query_condition_cache 中添加字段 condition。该字段存储明文条件,其哈希值被用作查询条件缓存中的键。#78671Robert Schulze)。
  • 允许 Hive 分区键为空值。#78816 (Arthur Passos).
  • 修复 IN 子句中对 BFloat16 的类型转换(即 SELECT toBFloat16(1) IN [1, 2, 3]; 现在返回 1)。解决了 #78754#78839Raufs Dunamalijevs)。
  • 在为 MergeTree 设置了 disk = ... 时,不再在其他磁盘上检查分区片段。#78855 (Azat Khuzhin)。
  • 使 system.query_logused_data_type_families 的数据类型被记录为规范名称。#78972 (Kseniia Sumarokova).
  • recoverLostReplica 过程中清理 settings,与此前在 #78637 中的处理方式相同。#79113Nikita Mikhaylov)。
  • 在 INFILE 的 schema 推断中使用插入列。 #78490 (Pervakov Grigorii).

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修正了在聚合 PROJECTION 中使用 count(Nullable) 时对 PROJECTION 的错误分析,从而修复了 #74495。此 PR 还在 PROJECTION 分析相关位置增加了一些日志,以澄清为什么会使用某个 PROJECTION 或者为什么不会使用。#74498 (Amos Bird)。
  • 修复在执行 DETACH PART 时可能出现的 Part <...> does not contain in snapshot of previous virtual parts. (PART_IS_TEMPORARILY_LOCKED) 错误。 #76039 (Aleksei Filatov).
  • 修复在分析器中包含常量表达式的 skip 索引不起作用的问题,并在索引分析期间移除多余的简单类型转换。 #77229 (Pavel Kruglov).
  • 修复了一个错误:close_session 查询参数之前不起作用,导致命名会话只有在 session_timeout 到期后才会被关闭。 #77336 (Alexey Katsman).
  • 修复了在未附加任何 materialized view 的情况下从 NATS 服务器接收消息的问题。 #77392 (Dmitry Novikov).
  • 修复在通过 merge 表函数从空的 FileLog 读取时出现的逻辑错误;关闭 #75575#77441Vladimir Cherkasov)。
  • 在共享 variant 中的 Dynamic 序列化中使用默认格式设置。#77572 (Pavel Kruglov).
  • 修复在本地磁盘上检查表数据路径是否存在的逻辑。 #77608 (Tuan Pham Anh).
  • 修复了在某些类型上向远程发送常量值的问题。#77634 (Pavel Kruglov).
  • 修复了在 S3/AzureQueue 中因上下文过期引发的崩溃。#77720Kseniia Sumarokova)。
  • 在 RabbitMQ、NATS、Redis、AzureQueue 表引擎中隐藏凭证。 #77755 (Kseniia Sumarokova).
  • 修复 argMin/argMaxNaN 比较的未定义行为。 #77756 (Raúl Marín).
  • 即使在某次操作不会产生任何待写入的数据块时,也要定期检查合并和变更是否已被取消。#77766 (János Benjamin Antal)。
  • 修复了在 Replicated 数据库中新添加的副本上无法工作的可刷新materialized view。 #77774 (Michael Kolupaev).
  • 修复在出现 NOT_FOUND_COLUMN_IN_BLOCK 错误时可能发生的崩溃。#77854 (Vladimir Cherkasov)。
  • 修复在向 S3/AzureQueue 填充数据时发生的崩溃问题。 #77878 (Bharat Nallan).
  • 在 SSH 服务器中禁用对历史记录的模糊搜索功能(因为其依赖 skim 库)。#78002Azat Khuzhin)。
  • 修复了一个错误:当在未建立索引的列上执行向量搜索查询时,如果表中还有另一列向量列并为其定义了向量相似度索引,则会返回不正确的结果。(Issue #77978)。#78069Shankar Iyer)。
  • 修复提示信息 "The requested output format is binary... Do you want to output it anyway? [y/N]" 中的一个细微错误。 #78095 (Azat Khuzhin).
  • 修复了在 toStartOfInterval 的原点参数为 0 时出现的错误。#78096 (Yarik Briukhovetskyi)。
  • 不允许在 HTTP 接口中指定空的 session_id 查询参数。#78098 (Alexey Katsman)。
  • 修复 Replicated 数据库中可能出现的元数据被覆盖的问题,该问题可能在执行 ALTER 查询后紧接着执行 RENAME 查询时发生。 #78107 (Nikolay Degterinsky).
  • 修复 NATS 引擎中的崩溃问题。#78108Dmitry Novikov)。
  • 不要在用于 SSH 的嵌入式客户端中尝试创建 history_file(在之前的版本中,该创建操作始终失败,但仍会被尝试)。 #78112 (Azat Khuzhin).
  • 修复在执行 RENAME DATABASEDROP TABLE 查询后,system.detached_tables 显示不正确信息的问题。#78126 (Nikolay Degterinsky)。
  • 修复在 #77274 之后对 Replicated 数据库中过多表的检查逻辑。同时,将该检查提前到创建存储之前执行,以避免在使用 ReplicatedMergeTreeKeeperMap 时在 Keeper 中创建未被统计的节点。 #78127 (Nikolay Degterinsky)。
  • 修复了在并发初始化 S3Queue 元数据时可能导致的崩溃。#78131 (Azat Khuzhin)。
  • groupArray* 函数现在对于 max_size 参数为 Int 类型且值为 0 的情况,会像对 UInt 类型一样抛出 BAD_ARGUMENTS 错误,而不再尝试在该参数下执行。 #78140 (Eduard Karacharov)。
  • 在恢复丢失副本时,如果本地表在分离之前已被移除,防止发生崩溃。#78173 (Raúl Marín)。
  • 修复 system.s3_queue_settings 中 "alterable" 列始终返回 false 的问题。 #78187 (Kseniia Sumarokova).
  • 对 Azure 访问签名进行掩码处理,使其不会展示给用户,也不会出现在日志中。#78189 (Kseniia Sumarokova).
  • 修复在 Wide 分区片段中对带前缀子流的预取问题。 #78205 (Pavel Kruglov).
  • 修复了在键数组为 LowCardinality(Nullable) 类型时,mapFromArrays 导致的崩溃或错误结果的问题。#78240Eduard Karacharov)。
  • 修复 delta-kernel-rs 的认证选项。#78255 (Kseniia Sumarokova).
  • 当某个副本的 disable_insertion_and_mutation 为 true 时,不再调度可刷新 materialized view 的任务。该任务本质上是一次插入操作,如果 disable_insertion_and_mutation 为 true,则会失败。 #78277 (Xu Jia).
  • 验证对 Merge 引擎所依赖底层表的访问权限。#78339 (Pervakov Grigorii).
  • 在查询 Distributed 表时,FINAL 修饰符可能会被忽略。#78428Yakov Olkhovskiy)。
  • 当位图为空时,bitmapMin 会返回 uint32_max(当输入类型为更大范围时则返回 uint64_max),这与空 roaring_bitmap 的最小值行为一致。 #78444 (wxybear)。
  • 在启用 distributed_aggregation_memory_efficient 时,禁止在读取 FROM 之后对查询处理进行并行化,否则可能会导致逻辑错误。修复 #76934#78500flynn)。
  • 在应用 max_streams_to_max_threads_ratio SETTING 后,如果计划的 stream 数为零,则确保至少有一个用于读取的 stream。#78505 (Eduard Karacharov)。
  • 在存储 S3Queue 中修复逻辑错误 "Cannot unregister: table uuid is not registered"。关闭 #78285#78541Kseniia Sumarokova)。
  • 在同时启用了 cgroups v1 和 v2 的系统上,ClickHouse 现在能够正确识别自身的 cgroup v2。#78566Grigory Korolev)。
  • 在与表级设置配合使用时,-Cluster 表函数会出错。#78587 (Daniil Ivanik)。
  • ReplicatedMergeTree 不支持事务的情况下执行 INSERT 时,提供了更完善的检查。 #78633 (Azat Khuzhin).
  • 在执行 ATTACH 时清理查询设置。 #78637 (Raúl Marín).
  • 修复了在 iceberg_metadata_file_path 中指定无效路径时导致的崩溃。#78688 (alesapin).
  • 在使用基于 delta-kernel-s 实现的 DeltaLake 表引擎时,修复了在读取 schema 与表的 schema 不一致且同时存在分区列时,会导致 “not found column” 错误的问题。 #78690 (Kseniia Sumarokova).
  • 修复了这样一个问题:在为一个具名会话安排关闭之后(但尚未达到超时时间),如果创建了一个同名的新具名会话,那么这个新会话会在第一个会话原计划关闭的时间点被关闭。 #78698 (Alexey Katsman)。
  • 修复了多种类型的 SELECT 查询,这些查询从使用 MongoDB 引擎的表或 mongodb 表函数中读取数据:在 WHERE 子句中对常量值进行隐式类型转换的查询(例如 WHERE datetime = '2025-03-10 00:00:00'),以及带有 LIMITGROUP BY 的查询。此前,这些查询可能会返回错误的结果。#78777Anton Popov)。
  • 在运行 CHECK TABLE 时不要阻塞表的关闭。#78782 (Raúl Marín).
  • Keeper 修复:在所有情况下修正临时节点计数。#78799 (Antonio Andelic).
  • 修复在 StorageDistributed 中使用除 view 之外的其他表函数时的错误类型转换。关闭 #78464#78828Konstantin Bogdanov)。
  • 修复 tupleElement(*, 1) 的格式不一致问题。关闭了 #78639#78832Konstantin Bogdanov)。
  • 类型为 ssd_cache 的字典现在会拒绝 block_sizewrite_buffer_size 为零或负数的参数(问题 #78314)。#78854Elmi Ahmadov)。
  • 修复在异常关闭之后执行 ALTER 时,可刷新 MATERIALIZED VIEW 崩溃的问题。#78858 (Azat Khuzhin).
  • 修复在 CSV 格式中对无效 DateTime 值的解析。 #78919 (Pavel Kruglov).
  • Keeper 修复:避免在 multi 请求失败时触发 watch。#79247 (Antonio Andelic).
  • 修复在显式指定的 min-max 值为 NULL 时读取 Iceberg 表失败的问题。已注意到 Go Iceberg 库会生成这种极其糟糕的文件。修复 #78740#78764flynn)。

构建/测试/打包改进

  • 在 Rust 中考虑 CPU 目标特性,并在所有 crate 中启用 LTO。#78590 (Raúl Marín)。

ClickHouse 25.3 LTS 发布,2025-03-20

不向后兼容的变更

新功能

  • JSON 数据类型现已可用于生产环境。参见 https://jsonbench.com/DynamicVariant 数据类型现已可用于生产环境。#77785 (Alexey Milovidov)。
  • 为 clickhouse-server 引入了 SSH 协议。现在可以使用任何 SSH 客户端连接到 ClickHouse。解决了以下问题:#74340#74989George Gamezardashvili)。
  • 如果启用了并行副本,请将表函数替换为对应的 -Cluster 变体。修复了 #65024#70659Konstantin Bogdanov)。
  • 全新的 Userspace Page Cache 实现,允许将数据缓存在进程内存中,而不是依赖操作系统的页面缓存,这在数据存储于远程虚拟文件系统且没有本地文件系统缓存支撑时非常有用。 #70509 (Michael Kolupaev).
  • 新增了 concurrent_threads_scheduler 服务器设置,用于控制并发查询之间如何分配 CPU 槽位。可以设置为 round_robin(与之前的行为一致)或 fair_round_robin,以解决 INSERT 和 SELECT 之间 CPU 分配不公平的问题。#75949 (Sergei Trifonov)。
  • 新增 estimateCompressionRatio 聚合函数 #70801#76661Tariq Almawash)。
  • 新增函数 arraySymmetricDifference。它返回多个数组参数中未在所有参数中都出现的所有元素。示例:SELECT arraySymmetricDifference([1, 2], [2, 3]) 返回 [1, 3](issue #61673#76231Filipp Abapolov)。
  • 允许通过存储/表函数的 SETTING iceberg_metadata_file_path 显式指定 Iceberg 要读取的元数据文件。修复了 #47412#77318alesapin)。
  • 新增了 keccak256 哈希函数,该函数在区块链实现中被广泛使用,尤其是在基于 EVM 的系统中。#76669Arnaud Briche)。
  • 新增三个函数:icebergTruncate(符合规范:https://iceberg.apache.org/spec/#truncate-transform-details)、toYearNumSinceEpochtoMonthNumSinceEpoch。在 Iceberg 引擎中为分区剪枝新增对 truncate transform 的支持。#77403 (alesapin)。
  • 增加对 LowCardinality(Decimal) 数据类型的支持 #72256#72833 (zhanglistar)。
  • FilterTransformPassedRowsFilterTransformPassedBytes 分析事件(profile events)将显示查询执行期间被过滤的行数和字节数。#76662 (Onkar Deshpande).
  • 支持直方图指标类型。该接口与 Prometheus 客户端非常相似,只需调用 observe(value) 即可将值所在桶对应的计数器加一。直方图指标通过 system.histogram_metrics 暴露。#75736 (Miсhael Stetsyuk)。
  • 新增对使用显式非常量值进行 CASE 分支的支持。 #77399 (Yarik Briukhovetskyi).

实验性特性

  • 为存储在 AWS S3 或本地文件系统上的 Delta Lake 表添加对 Unity Catalog 的支持。#76988 (alesapin)。
  • 引入与 AWS Glue 服务目录的实验性集成,用于 Iceberg 表。#77257 (alesapin)。
  • 增加对动态集群自动发现的支持。这扩展了现有的 node 自动发现功能。ClickHouse 现在可以使用 <multicluster_root_path> 在公共的 ZooKeeper 路径下自动发现并注册新的 clusters#76001 (Anton Ivashkin)。
  • 通过新增设置 enable_replacing_merge_with_cleanup_for_min_age_to_force_merge,允许在可配置的超时时间之后,对整个分区执行自动清理合并。#76440 (Christoph Wurm)。

性能改进

  • 实现查询条件缓存,以提升包含重复条件的查询性能。不满足条件的数据范围会被记录为内存中的临时索引,后续查询会使用该索引。修复 #67768 #69236zhongyuankai)。
  • 在删除分区片段时主动从缓存中驱逐数据。如果数据量更少,则不要让缓存增长到最大容量。#76641Alexey Milovidov)。
  • 在算术计算中用 clang 内建的 i256 替换 Int256 和 UInt256,从而带来性能提升 #70502#73658李扬)。
  • 在某些情况下(例如空数组列),数据分区片段中可能包含空文件。当表位于元数据和对象存储分离的磁盘上时,我们可以跳过向 ObjectStorage 写入空的 blob,仅存储此类文件的元数据。#75860Alexander Gololobov)。
  • 提升 Decimal32/Decimal64/DateTime64 的最小值/最大值计算性能。#76570李扬)。
  • 查询编译(compile_expressions 设置)现在会考虑机器类型。这显著加速了此类查询。#76753ZhangLiStar)。
  • 优化 arraySort#76850李扬)。
  • 当缓存处于被动使用场景时(例如用于合并),禁用 filesystem_cache_prefer_bigger_buffer_size#77898Kseniia Sumarokova)。
  • 在代码中的部分位置应用 preserve_most 属性,从而实现略微更好的代码生成。#67778Nikita Taranov)。
  • 加速 ClickHouse 服务器关闭(消除 2.5 秒的延迟)。#76550Azat Khuzhin)。
  • 避免在 ReadBufferFromS3 和其他远程读取缓冲区中出现多余的内存分配,将其内存消耗减少一半。#76692Sema Checherinda)。
  • 将 zstd 从 1.5.5 升级到 1.5.7,这可能带来一些性能提升#77137Pradeep Chhetri)。
  • 在 Wide 格式分区片段中预取 JSON 列时降低内存使用量。当 ClickHouse 运行在共享存储之上(例如在 ClickHouse Cloud 中)时,这一点尤为相关。#77640Pavel Kruglov)。

改进

  • 在将 TRUNCATEINTO OUTFILE 一起使用时支持执行原子重命名。解决了 #70323#77181Onkar Deshpande)。
  • 不再允许将 NaNinf 用作浮点型设置项的取值。反正之前那样也没有什么意义。#77546 (Yarik Briukhovetskyi)。
  • 当 analyzer 被禁用时,默认禁用并行副本,而不受 compatibility 设置影响。仍然可以通过将 parallel_replicas_only_with_analyzer 显式设置为 false 来更改此行为。#77115 (Igor Nikonov)。
  • 新增支持定义从客户端请求头转发到外部 HTTP 认证器的请求头列表。#77054 (inv2004)。
  • 对元组列中的字段遵循不区分大小写的列匹配规则。关闭 https://github.com/apache/incubator-gluten/issues/8324#73780 (李扬)。
  • Gorilla 编解码器的参数现将始终保存在 .sql 文件中的表元数据里。这修复了: #70072#74814Nikita Mikhaylov)。
  • 为某些数据湖实现了解析增强(Sequence ID 解析:新增在 manifest 文件中解析序列标识符的功能;Avro 元数据解析:重新设计了 Avro 元数据解析器,使其便于在未来进行扩展和增强)。 #75010 (Daniil Ivanik).
  • system.opentelemetry_span_log 的默认 ORDER BY 中移除 trace_id。 #75907 (Azat Khuzhin).
  • 现在可以将加密(通过属性 encrypted_by)应用到任意配置文件(config.xml、users.xml 以及嵌套的配置文件)。此前,它仅适用于顶层的 config.xml 文件。#75911Mikhail Gorshkov)。
  • 改进 system.warnings 表,并添加一些支持动态添加、更新或删除的警告消息。#76029Bharat Nallan)。
  • 该 PR 使查询 ALTER USER user1 ADD PROFILES a, DROP ALL PROFILES 无法执行,因为所有 DROP 操作在语句中必须排在前面。#76242 (pufit).
  • 对 SYNC REPLICA 进行了多项改进(更完善的错误信息、更完善的测试、合理性检查)。#76307 (Azat Khuzhin).
  • 在备份到 S3 时,如果因 Access Denied 导致分段复制失败,则使用正确的回退机制。当在使用不同凭据的存储桶之间执行备份时,分段复制可能会产生 Access Denied 错误。 #76515 (Antonio Andelic)。
  • 将 librdkafka(质量很差的实现)升级到 2.8.0 版本(但质量并没有明显改善),并改进了 Kafka 表的关闭过程,从而减少删除表和重启服务器期间的延迟。engine=Kafka 在表被删除时不再显式地离开 consumer group,而是让 consumer 继续留在 group 中,直到在无活动状态下经过 session_timeout_ms(默认:45 秒)后被自动移除。#76621filimonov)。
  • 修复 S3 请求设置的验证。#76658 (Vitaly Baranov).
  • 类似 server_settingssettings 的系统表都带有一个用于默认值的 default 列,这非常方便。现已在 merge_tree_settingsreplicated_merge_tree_settings 中也提供该列。 #76942 (Diego Nieto).
  • 添加了 ProfileEvents::QueryPreempted,其逻辑与 CurrentMetrics::QueryPreempted 类似。#77015 (VicoWu)。
  • 此前,Replicated 数据库可能会将查询中指定的凭证记录到日志中。此行为已被修复。相关问题关闭:#77123#77133Nikita Mikhaylov)。
  • 允许在 plain_rewritable 磁盘上执行 ALTER TABLE DROP PARTITION。 #77138 (Julia Kartseva).
  • 备份/恢复设置 allow_s3_native_copy 现在支持三个取值:- False:不使用 S3 原生复制;- True(旧默认值):ClickHouse 将优先尝试使用 S3 原生复制,如果失败则回退到读写方案;- 'auto'(新默认值):ClickHouse 会先比较源端和目标端的凭证。如果相同,ClickHouse 将尝试使用 S3 原生复制,失败时可回退到读写方案;如果不同,ClickHouse 将直接采用读写方案。#77401Vitaly Baranov)。
  • 在 DeltaLake 表引擎的 delta kernel 中增加对 AWS 会话令牌和环境凭证的支持。 #77661 (Kseniia Sumarokova).

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复异步分布式 INSERT 在处理待处理批次时卡住的问题(例如由于 No such file or directory)。 #72939 (Azat Khuzhin).
  • 通过在索引分析期间对隐式的 Date 到 DateTime 转换强制使用饱和处理,改进了 datetime 转换。这解决了由于 datetime 范围限制导致的索引分析结果可能不准确的问题。修复了 #73307。同时也修复了在 date_time_overflow_behavior = 'ignore'(默认值)时显式调用 toDateTime 的转换行为。#73326Amos Bird)。
  • 修复了由 UUID 和表名之间竞争条件导致的各种问题(例如,修复了 RENAMERESTART REPLICA 之间的竞争情况,在并发执行 RENAMESYSTEM RESTART REPLICA 时,可能会导致重启了错误的副本,和/或使其中一张表停留在 Table X is being restarted 状态)。 #76308 (Azat Khuzhin).
  • 修复在启用 async insert 并使用 insert into ... from file ... 且块大小不相等时导致的数据丢失问题:如果第一个块大小 < async_max_size 而第二个块 > async_max_size,则第二个块不会被插入,这些数据会滞留在 squashing 中。#76343 (Han Fei)。
  • system.data_skipping_indices 中,将字段 'marks' 重命名为 'marks_bytes'。#76374Robert Schulze)。
  • 修复动态文件系统缓存调整大小时,在淘汰过程中对意外错误处理不当的问题。#76466 (Kseniia Sumarokova).
  • 修复了在并行哈希中对 used_flag 的初始化问题,该问题可能导致服务器崩溃。#76580Nikita Taranov)。
  • 修复在 projection 中调用 defaultProfiles 函数时的逻辑错误。 #76627 (pufit).
  • 在 Web UI 中不再通过浏览器请求交互式基本身份验证。关闭 #76319#76637Alexey Milovidov)。
  • 修复从分布式表中查询布尔字面量时触发的 THERE_IS_NO_COLUMN 异常。#76656 (Yakov Olkhovskiy).
  • 表目录中的子路径现在采用了更合理的选择方式。#76681 (Daniil Ivanik)。
  • 修复在对主键中包含子列的表执行 ALTER 后出现的错误 Not found column in block。在 https://github.com/ClickHouse/ClickHouse/pull/72644 之后,需要配合 https://github.com/ClickHouse/ClickHouse/pull/74403#76686Nikolai Kochetov)。
  • 为 NULL 短路逻辑添加性能测试并修复相关 bug。#76708 (李扬).
  • 在结束输出写入缓冲区前先刷新它们。修复在对某些输出格式(例如 JSONEachRowWithProgressRowOutputFormat)进行结束处理时产生的 LOGICAL_ERROR#76726 (Antonio Andelic)。
  • 添加了对 MongoDB 二进制 UUID 的支持(#74452) - 修复了在使用表函数时对 MongoDB 的 WHERE 下推(#72210) - 修改了 MongoDB - ClickHouse 类型映射,使得 MongoDB 的二进制 UUID 只能被解析为 ClickHouse 的 UUID。这样应当可以避免今后出现歧义和意外行为。 - 修复了 OID 映射,同时保持向后兼容性。#76762Kirill Nikiforov)。
  • 修复 JSON 子列并行前缀反序列化中的异常处理。#76809 (Pavel Kruglov)。
  • 修复 lgamma 函数在负整数情况下的行为。#76840Ilya Kataev)。
  • 为显式定义的主键修复反向键分析。类似于 #76654#76846Amos Bird)。
  • 修复 JSON 格式中 Bool 值的美化输出。 #76905 (Pavel Kruglov).
  • 修复在异步插入期间出错时,对 JSON 列进行错误回滚可能导致崩溃的问题。 #76908 (Pavel Kruglov).
  • 此前,multiIf 在计划阶段和实际执行阶段可能返回不同类型的列。这会导致从 C++ 的角度来看,代码产生未定义行为。#76914 (Nikita Taranov)。
  • 修复了 MergeTree 中常量 Nullable 键序列化错误的问题。该修复解决了 #76939#76985Amos Bird)。
  • 修复 BFloat16 值的排序问题。已解决 #75487。已解决 #75669#77000Alexey Milovidov)。
  • 修复了 JSON 中包含 Variant 子列时的 Bug,通过在 part 一致性检查中添加逻辑以跳过临时子列。 #72187#77034 (Smita Kulkarni)。
  • 修复在 Values 格式中解析模板时由于类型不匹配导致的崩溃。#77071 (Pavel Kruglov)。
  • 不再允许创建在主键中包含子列的 EmbeddedRocksDB 表。此前可以创建此类表,但在执行 select 查询时会失败。#77074 (Pavel Kruglov).
  • 修复分布式查询中的非法比较问题,原因是在向远端下推谓词时没有正确保留字面量的类型。 #77093 (Duc Canh Le).
  • 修复在创建 Kafka 表时抛出异常导致的崩溃。 #77121 (Pavel Kruglov).
  • Kafka 和 RabbitMQ 引擎现已支持 JSON 和子列。#77122 (Pavel Kruglov)。
  • 修复在 macOS 上异常栈展开的问题。#77126 (Eduard Karacharov).
  • 修复 getSubcolumn 函数中读取 null 子列时的问题。#77163 (Pavel Kruglov).
  • 修复 bloom filter 索引在与 Array 及不受支持函数一起使用时的问题。 #77271 (Pavel Kruglov).
  • 我们只应在初始的 CREATE 查询时检查对表数量的限制。#77274 (Nikolay Degterinsky)。
  • 不是一个 bug:SELECT toBFloat16(-0.0) == toBFloat16(0.0) 现在会正确返回 true(之前为 false)。这使得该行为与 Float32Float64 保持一致。#77290 (Shankar Iyer).
  • 修复了可能错误引用未初始化 key_index 变量的问题,该问题可能导致调试版本崩溃(在发布版本中,该未初始化引用不会造成问题,因为后续代码很可能会抛出错误)。### 面向用户更改的文档条目。#77305 (wxybear)。
  • 修复了包含 Bool 值时的分区名称。该问题引入于 https://github.com/ClickHouse/ClickHouse/pull/74533#77319Pavel Kruglov)。
  • 修复了在包含 Nullable 元素的 Tuple 与字符串之间进行比较时的问题。比如,在此变更之前,Tuple (1, null) 与 String '(1,null)' 之间的比较会导致错误。另一个例子是将 Tuple (1, a)(其中 a 是 Nullable 列)与 String '(1, 2)' 进行比较。此变更解决了这些问题。 #77323 (Alexey Katsman)。
  • 修复 ObjectStorageQueueSource 中的崩溃。该问题是在 https://github.com/ClickHouse/ClickHouse/pull/76358 中引入的。#77325Pavel Kruglov)。
  • 修复 async_insertinput 搭配使用时的问题。#77340 (Azat Khuzhin)。
  • 修复:当排序列被查询计划器移除时,WITH FILL 可能会因 NOT_FOUND_COLUMN_IN_BLOCK 而失败。修复了一个与为 INTERPOLATE 表达式计算得到的不一致 DAG 相关的类似问题。#77343 (Yakov Olkhovskiy)。
  • 修复了若干与为无效 AST 节点设置别名相关的 LOGICAL_ERROR。 #77445 (Raúl Marín).
  • 在 filesystem cache 的实现中修复了写入文件段时的错误处理问题。#77471 (Kseniia Sumarokova).
  • 使 DatabaseIceberg 使用由目录提供的正确元数据文件。修复 #75187#77486Kseniia Sumarokova)。
  • 查询缓存现在假定 UDF 为非确定性函数。因此,包含 UDF 的查询结果将不再被缓存。此前,用户可以定义非确定性的 UDF,其结果会被错误地缓存(问题 #77553)。#77633Jimmy Aguilar Mena)。
  • 修复 system.filesystem_cache_log 仅在启用设置项 enable_filesystem_cache_log 时才生效的问题。#77650 (Kseniia Sumarokova).
  • 修复在 PROJECTION 中调用 defaultRoles FUNCTION 时存在的逻辑错误。#76627 的后续修复。#77667pufit)。
  • 现在不再允许将 Nullable 类型用作 arrayResize 函数的第二个参数。此前,当第二个参数为 Nullable 时,可能会出现从报错到结果错误等各种问题(issue #48398)。#77724Manish Gill)。
  • 即使操作不会产生任何要写入的数据块,也会定期检查合并和变更是否被取消。 #77766 (János Benjamin Antal).

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

ClickHouse 25.2 版本发布,2025-02-27

向后不兼容的变更

  • 默认完全启用 async_load_databases(即便对于未升级 config.xml 的部署)。#74772 (Azat Khuzhin).
  • 新增 JSONCompactEachRowWithProgressJSONCompactStringsEachRowWithProgress 格式,作为 #69989 的延续。JSONCompactWithNamesJSONCompactWithNamesAndTypes 不再输出 “totals”——显然这是实现中的一个错误。#75037 (Alexey Milovidov).
  • format_alter_operations_with_parentheses 的默认值改为 true,以消除 ALTER 命令列表的歧义(见 https://github.com/ClickHouse/ClickHouse/pull/59532)。此变更会导致与 24.3 之前版本集群的复制不兼容。如果你正在升级使用旧版本的集群,请在服务器配置中关闭该设置,或者先升级到 24.3。#75302 (Raúl Marín).
  • 移除使用正则表达式过滤日志消息的功能。该实现引入了数据竞争,因此必须移除。#75577 (János Benjamin Antal).
  • 设置 min_chunk_bytes_for_parallel_parsing 不再允许为零。此变更修复了:#71110#75239 (Nikita Mikhaylov).
  • 在缓存配置中校验设置项。之前不存在的设置项会被忽略,现在会抛出错误,需要将其移除。#75452 (Kseniia Sumarokova).

新功能

  • 支持 Nullable(JSON) 类型。#73556 (Pavel Kruglov)。
  • 在 DEFAULT 和 MATERIALIZED 表达式中支持子列。#74403 (Pavel Kruglov)。
  • 支持使用 output_format_parquet_write_bloom_filter 设置(默认启用)写入 Parquet bloom filter。#71681 (Michael Kolupaev)。
  • Web UI 现在支持交互式数据库导航。#75777 (Alexey Milovidov)。
  • 允许在 storage policy 中组合只读和读写磁盘(作为多个 volume 或多个 disk)。这允许从整个卷读取数据,而插入操作会优先使用可写磁盘(即 Copy-on-Write 存储策略)。#75862 (Azat Khuzhin)。
  • 新增一个 Database 引擎 DatabaseBackup,用于从备份中即时挂载表/数据库。#75725 (Maksim Kita)。
  • 在 Postgres wire protocol 中支持预处理语句(prepared statements)。#75035 (scanhex12)。
  • 新增无需 database 层即可 ATTACH 表的能力,对位于 Web、S3 等外部虚拟文件系统上的 MergeTree 表非常有用。#75788 (Azat Khuzhin)。
  • 新增字符串比较函数 compareSubstrings,用于比较两个字符串的部分内容。示例:SELECT compareSubstrings('Saxony', 'Anglo-Saxon', 0, 6, 5) AS result 的含义是:“按字典序比较字符串 'Saxon' 和 'Anglo-Saxon' 的 6 个字节,从第一个字符串的偏移量 0 和第二个字符串的偏移量 5 开始”。#74070 (lgbo)。
  • 新增函数 initialQueryStartTime。它返回当前查询的开始时间。在分布式查询中,该值在所有分片上都相同。#75087 (Roman Lomonosov)。
  • 为 MySQL 的 named collections 增加对 SSL 身份验证的支持。修复了 #59111 中的问题。#59452 (Nikolay Degterinsky)。

实验性功能

  • 新增设置项 enable_adaptive_memory_spill_scheduler,允许同一查询中的多个 Grace JOIN 监控其总内存占用,并自适应地触发向外部存储溢写,以防止 MEMORY_LIMIT_EXCEEDED。#72728 (lgbo)。
  • 使新的实验性 Kafka 表引擎能够完全遵从 Keeper 功能开关。#76004 (János Benjamin Antal)。
  • 恢复 (Intel) QPL 编解码器,该编解码器曾因许可问题在 v24.10 中被移除。#76021 (Konstantin Bogdanov)。
  • 为 HDFS 集成新增对配置项 dfs.client.use.datanode.hostname 的支持。#74635 (Mikhail Tiukavkin)。

性能改进

  • 提升从 S3 读取 Wide 分区片段中整个 JSON 列的性能。通过为子列前缀反序列化添加预取、缓存已反序列化的前缀,以及并行反序列化子列前缀来实现。在类似 SELECT data FROM table 的查询中,从 S3 读取 JSON 列的性能提升约 4 倍,在类似 SELECT data FROM table LIMIT 10 的查询中提升约 10 倍。#74827 (Pavel Kruglov).
  • 修复了在 max_rows_in_join = max_bytes_in_join = 0parallel_hash 中不必要的争用。#75155 (Nikita Taranov).
  • 修复了在优化器交换 join 两端时,ConcurrentHashJoin 中重复预分配的问题。#75149 (Nikita Taranov).
  • 在某些 join 场景中略微提升性能:预先计算输出行数并为其预留内存。#75376 (Alexander Gololobov).
  • 对于类似 WHERE a < b AND b < c AND c < 5 的查询,可以推断新的比较条件(a < 5 AND b < 5),以提高过滤能力。#73164 (Shichao Jin).
  • Keeper 改进:在提交到内存存储时禁用摘要计算以提升性能。可以通过配置 keeper_server.digest_enabled_on_commit 启用。在预处理请求时仍会计算摘要。#75490 (Antonio Andelic).
  • 在可能的情况下,从 JOIN ON 中下推过滤表达式。#75536 (Vladimir Cherkasov).
  • 在 MergeTree 中按需(惰性)计算列和索引大小。#75938 (Pavel Kruglov).
  • 重新在 MATERIALIZE TTL 中支持 ttl_only_drop_parts;仅读取必要的列来重新计算生存时间 (TTL),并通过将其替换为空分区片段来删除相应的分区片段。#72751 (Andrey Zvonov).
  • 减小 plain_rewritable 元数据文件的写缓冲区大小。#75758 (Julia Kartseva).
  • 降低某些窗口函数的内存使用。#65647 (lgbo).
  • 同时评估 Parquet 布隆过滤器和最小/最大索引。对于类似 x = 3 or x > 5 且数据为 [1, 2, 4, 5] 的情况,这是正确支持所必需的。#71383 (Arthur Passos).
  • 传递给 Executable 存储的查询不再仅限于单线程执行。#70084 (yawnt).
  • 在执行 ALTER TABLE FETCH PARTITION 时并行拉取分区片段(线程池大小由 max_fetch_partition_thread_pool_size 控制)。#74978 (Azat Khuzhin).
  • 允许将包含 indexHint 函数的谓词移动到 PREWHERE#74987 (Anton Popov).

改进

  • 修正了对 LowCardinality 列内存占用大小的计算。#74688 (Nikita Taranov).
  • processors_profile_log 表现已具有默认配置,生存时间 (TTL) 为 30 天。#66139 (Ilya Yatsishin)。
  • 支持在集群配置中为分片命名。#72276 (MikhailBurdukov).
  • 将 Prometheus 远程写入成功响应的状态码从 200/OK 更改为 204/NoContent。#74170 (Michael Dempsey)。
  • 增加支持在无需重启服务器的情况下,动态重新加载 max_remote_read_network_bandwidth_for_servemax_remote_write_network_bandwidth_for_server#74206 (Kai Zhu).
  • 允许在创建备份时使用 blob 路径计算校验和。#74729 (Vitaly Baranov)。
  • system.query_cache 添加了查询 ID 列(修复 #68205)。#74982NamHoaiNguyen)。
  • 现在可以通过 KILL QUERY 命令或在达到超时时间(max_execution_time)后自动取消 ALTER TABLE ... FREEZE ... 查询。#75016 (Kirill)。
  • 新增对将 groupUniqArrayArrayMap 用作 SimpleAggregateFunction 的支持。 #75034 (Miel Donkers).
  • Iceberg 数据库引擎中隐藏目录凭证配置。修复了 #74559#75080Kseniia Sumarokova)。
  • intExp2 / intExp10:明确此前未定义的行为:对于过小的参数返回 0,对于过大的参数返回 18446744073709551615,如果为 nan 则抛出异常。#75312Vitaly Baranov)。
  • DatabaseIceberg 中的 catalog 配置里原生支持 s3.endpoint。解决了 #74558#75375Kseniia Sumarokova)。
  • 当用户执行 SYSTEM DROP REPLICA 但权限不足时,不再静默失败。 #75377 (Bharat Nallan).
  • 添加一个用于统计任意系统日志刷新失败次数的 ProfileEvent。 #75466 (Alexey Milovidov)。
  • 为解密和解压缩过程添加检查和额外日志。 #75471 (Vitaly Baranov).
  • parseTimeDelta 函数中新增了对微符号(U+00B5)的支持。现在微符号(U+00B5)和希腊字母 mu(U+03BC)都可被识别为微秒的有效表示,使 ClickHouse 的行为与 Go 的实现保持一致(参见 time.gotime/format.go)。#75472Vitaly Orlov)。
  • 将服务器端设置(send_settings_to_client)替换为客户端设置(apply_settings_from_server),用于控制客户端代码(例如解析 INSERT 数据和格式化查询输出)是否应当使用来自服务器 users.xml 和用户配置文件中的设置。否则,将只使用来自客户端命令行、会话和查询本身的设置。请注意,这仅适用于原生客户端(不适用于例如 HTTP),且不适用于大多数查询处理逻辑(该部分在服务器端执行)。#75478Michael Kolupaev)。
  • 改进语法错误的错误消息。之前,如果查询过大,并且长度超过限制的 token 是一个非常长的字符串字面量,用于说明原因的消息会被夹在该超长 token 的两个示例之间而丢失。修复在错误消息中,包含 UTF-8 字符的查询被错误截断的问题。修复查询片段被过度加引号的问题。关闭问题 #75473#75561Alexey Milovidov)。
  • S3(Azure)Queue 存储添加 profile 事件。 #75618 (Kseniia Sumarokova).
  • 为兼容性起见,禁用从服务器向客户端发送设置(send_settings_to_client=false)(该功能稍后将作为客户端设置重新实现,以提高易用性)。#75648 (Michael Kolupaev).
  • 新增配置项 memory_worker_correct_memory_tracker,用于启用后台线程定期从不同来源读取信息,以纠正内部内存跟踪器的数据。#75714 (Antonio Andelic)。
  • system.processes 中添加列 normalized_query_hash。注意:虽然可以通过 normalizedQueryHash 函数实时轻松计算该值,但仍需要该列以便为后续更改做准备。#75756 (Alexey Milovidov)。
  • 即使存在一个构建在已删除数据库之上的 Merge 表,查询 system.tables 也不会抛出异常。移除 Hive 表中的 getTotalRows 方法,因为不允许该方法执行复杂操作。#75772Alexey Milovidov)。
  • 备份的 start_time/end_time 现在以微秒精度存储。 #75929 (Aleksandr Musorin).
  • 新增 MemoryTrackingUncorrected 指标,用于显示未经过 RSS 校正的内部全局内存跟踪器的值。 #75935 (Antonio Andelic).
  • 允许在 PostgreSQLMySQL 表函数中解析类似 localhost:1234/handle 的端点。修复了在 https://github.com/ClickHouse/ClickHouse/pull/52503 中引入的回归。#75944Nikita Mikhaylov)。
  • 新增了一个服务器设置 throw_on_unknown_workload,用于在带有 workload 设置但其值为未知时的查询中选择处理方式:要么允许无限制访问(默认),要么抛出 RESOURCE_ACCESS_DENIED 错误。这对于强制所有查询使用 workload 调度非常有用。#75999 (Sergei Trifonov).
  • 如非必要,不要在 ARRAY JOIN 中将子列重写为 getSubcolumn#76018 (Pavel Kruglov).
  • 在加载表时遇到协调错误会进行重试。#76020 (Alexander Tokmakov)。
  • SYSTEM FLUSH LOGS 中支持刷新单个日志。#76132 (Raúl Marín).
  • 改进了服务器的 /binary 页面。使用 Hilbert 曲线替代 Morton 曲线。在方形区域中显示 512 MB 范围内的地址,使方形区域填充更充分(在之前的版本中,地址只填满方形的一半)。将地址的着色更偏向库名称而非函数名称。允许在区域边界之外多滚动一些。 #76192 (Alexey Milovidov)。
  • 在遇到 TOO_MANY_SIMULTANEOUS_QUERIES 错误时重试 ON CLUSTER 查询。#76352 (Patrick Galbraith).
  • 添加 CPUOverload 异步指标,用于计算服务器 CPU 的相对资源缺口。#76404 (Alexey Milovidov)。
  • output_format_pretty_max_rows 的默认值从 10000 调整为 1000,以提高易用性。#76407Alexey Milovidov)。

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 修复在查询解析期间出现异常时,未按查询中指定的自定义格式进行格式化的问题。此前版本中,异常始终使用默认格式,而非查询中指定的格式。修复了 #55422#74994Alexey Milovidov)。
  • 修复 SQLite 的类型映射(将整数类型映射为 int64,将浮点数映射为 float64)。 #73853 (Joanna Hulboj).
  • 修复父作用域中的标识符解析问题。允许在 WITH 子句中为表达式使用别名。修复 #58994。修复 #62946。修复 #63239。修复 #65233。修复 #71659。修复 #71828。修复 #68749#66143Dmitry Novik)。
  • 修复 negate 函数的单调性问题。在之前的版本中,当 x 为主键时,查询 select * from a where -x = -42; 可能会返回错误结果。#71440 (Michael Kolupaev).
  • 修复了 arrayIntersect 中对空元组的处理。这解决了 #72578#72581Amos Bird)。
  • 修复读取带有错误前缀的 JSON 子对象子列时的问题。 #73182 (Pavel Kruglov).
  • 在客户端与服务器之间通信时,正确传递 Native 格式的设置。 #73924 (Pavel Kruglov).
  • 对某些存储增加对不支持类型的检查。#74218 (Pavel Kruglov)。
  • 修复在 macOS 上通过 PostgreSQL 接口执行 INSERT INTO SELECT 查询时导致的崩溃(issue #72938)。#74231Artem Yurov)。
  • 修复了复制数据库中未初始化的 max_log_ptr。 #74336 (Konstantin Morozov).
  • 修复在插入 interval 时发生的崩溃(issue #74299)。#74478NamHoaiNguyen)。
  • 修复格式化常量 JSON 字面量时的问题。此前在将查询发送到另一台服务器时,可能导致语法错误。#74533 (Pavel Kruglov)。
  • 修复在启用隐式 PROJECTION 且使用常量分区表达式时生成错误 CREATE 查询的问题。修复了 #74596#74634 (Amos Bird)。
  • 避免在 INSERT 因异常结束后让连接处于异常状态。 #74740 (Azat Khuzhin).
  • 避免重用处于中间状态的遗留连接。#74749Azat Khuzhin)。
  • 修复在解析 JSON 类型声明时,当类型名称不是大写时发生的崩溃。 #74784 (Pavel Kruglov).
  • Keeper:修复当连接在建立之前就已被终止时触发的 logical_error。 #74844 (Michael Kolupaev).
  • 修复了在存在使用 AzureBlobStorage 的表时服务器无法启动的问题。现在会在不向 Azure 发送任何请求的情况下加载这些表。#74880 (Alexey Katsman)。
  • 修复 BACKUP 和 RESTORE 操作的 query_log 中缺少 used_privilegesmissing_privileges 字段的问题。 #74887 (Alexey Katsman).
  • 如果在执行 HDFS select 请求时出现 SASL 错误,则刷新 HDFS Kerberos 票据。 #74930 (inv2004).
  • 修复 startup_scripts 中针对 Replicated 数据库的查询。#74942 (Azat Khuzhin).
  • 修复在 JOIN ON 子句中,对表达式使用类型别名并进行空安全比较时产生的问题。 #74970 (Vladimir Cherkasov).
  • remove 操作失败时,将 part 的状态从 deleting 恢复为 outdated#74985Sema Checherinda)。
  • 在先前版本中,当存在标量子查询时,我们会在数据格式初始化期间开始写入进度信息(从处理该子查询中累积的进度),而这一步发生在写入 HTTP 头部之前。这样会导致 HTTP 头部丢失,例如 X-ClickHouse-QueryId 和 X-ClickHouse-Format,以及 Content-Type。 #74991 (Alexey Milovidov).
  • 修复在 database_replicated_allow_replicated_engine_arguments=0 时对 CREATE TABLE AS... 查询的处理。#75000 (Bharat Nallan).
  • 修复在发生 INSERT 异常后导致客户端连接处于错误状态的问题。 #75030 (Azat Khuzhin).
  • 修复由于 PSQL 复制过程中未捕获的异常导致的崩溃问题。#75062 (Azat Khuzhin).
  • SASL 可能会导致任意 RPC 调用失败,此修复可以在 krb5 票据过期时重试该调用。 #75063 (inv2004).
  • 在启用了 optimize_function_to_subcolumns 设置的情况下,修复了对 ArrayMapNullable(..) 列使用索引(主索引和二级索引)时的行为。此前,这些列的索引可能会被忽略。#75081Anton Popov)。
  • 在为具有内部表的 materialized view 创建时禁用 flatten_nested,因为将无法使用此类展平后的列。#75085Christoph Wurm)。
  • 修复了在 forwarded_for 字段中错误解析某些 IPv6 地址(例如 ::ffff:1.1.1.1)的问题,该问题会导致客户端抛出异常并断开连接。#75133 (Yakov Olkhovskiy).
  • 修复了针对 LowCardinality Nullable 数据类型的空值安全(null-safe)JOIN 处理。此前,在 JOIN ON 中使用空值安全比较(例如 IS NOT DISTINCT FROM<=>a IS NULL AND b IS NULL OR a == b)时,对 LowCardinality 列的处理不正确。#75143 (Vladimir Cherkasov)。
  • 检查在为 NumRowsCache 统计 total_number_of_rows 时不指定 key_condition。#75164 (Daniil Ivanik).
  • 使用新的分析器修复包含未使用插值的查询。#75173János Benjamin Antal)。
  • 修复了在使用 CTE 配合 INSERT 时导致崩溃的问题。 #75188 (Shichao Jin).
  • Keeper 修复:在回滚日志时避免向损坏的变更日志写入数据。 #75197 (Antonio Andelic).
  • 在合适的场景下将 BFloat16 用作超类型。修复:#74404#75236Nikita Mikhaylov)。
  • 修复在使用 any_join_distinct_right_table_keys 且在 JOIN ON 中包含 OR 时,连接结果中出现的意外的默认值问题。 #75262 (Vladimir Cherkasov).
  • 对 azureblobstorage 表引擎的凭据进行脱敏处理。 #75319 (Garrett Thomas).
  • 修复了 ClickHouse 在某些情况下可能会错误地将过滤条件下推到 PostgreSQL、MySQL 或 SQLite 等外部数据库的问题。修复关联 issue:#71423#75320Nikita Mikhaylov)。
  • 修复了在以 Protobuf 格式输出的同时并行执行查询 SYSTEM DROP FORMAT SCHEMA CACHE 时,可能发生的 Protobuf schema 缓存崩溃问题。 #75357 (Pavel Kruglov).
  • 修复了在使用并行副本时,将 HAVING 子句中的过滤条件下推可能导致的逻辑错误或未初始化内存问题。 #75363 (Vladimir Cherkasov).
  • icebergS3icebergAzure 表函数和表引擎中的敏感信息进行隐藏处理。#75378 (Kseniia Sumarokova).
  • 现在可以正确处理修剪字符通过计算得到且结果为空的函数 TRIM。示例:SELECT TRIM(LEADING concat('') FROM 'foo')(Issue #69922)。#75399Manish Gill)。
  • 修复 IOutputFormat 中的数据竞争。 #75448 (Pavel Kruglov)。
  • 修复在分布式表上的 JOIN 中使用 Array 类型的 JSON 子列时,可能出现的错误 Elements ... and ... of Nested data structure ... (Array columns) have different array sizes#75512 (Pavel Kruglov)。
  • 修复在使用 CODEC(ZSTD, DoubleDelta) 时可能出现的数据损坏问题。关闭 #70031#75548Konstantin Bogdanov)。
  • 修复 allow_feature_tier 与 MergeTree 的兼容性 SETTING 之间的交互问题。 #75635 (Raúl Marín).
  • 修复当文件被重试处理时,system.s3queue_logprocessed_rows 值不正确的问题。 #75666 (Kseniia Sumarokova).
  • 当 materialized view 向 URL 引擎写入且存在连接问题时,会遵循 materialized_views_ignore_errors 设置。 #75679 (Christoph Wurm)。
  • 修复了在执行多个异步 RENAME 查询(alter_sync = 0),在不同类型的列之间进行重命名后,从 MergeTree 表读取数据时可能发生的罕见崩溃问题。#75693Anton Popov)。
  • 修复部分使用 UNION ALL 的查询会出现 Block structure mismatch in QueryPipeline stream 错误的问题。#75715Nikolai Kochetov)。
  • 在对其主键列执行 ALTER MODIFY 时重建投影。之前,在对用于投影主键的列执行 ALTER MODIFY 后进行查询时,可能会导致 CANNOT_READ_ALL_DATA 错误。 #75720 (Pavel Kruglov).
  • 修复在使用 analyzer 的情况下,标量子查询中 ARRAY JOIN 结果不正确的问题。 #75732 (Nikolai Kochetov).
  • 修复 DistinctSortedStreamTransform 中的空指针解引用。#75734Nikita Taranov)。
  • 修复 allow_suspicious_ttl_expressions 设置的行为。#75771 (Aleksei Filatov)。
  • 修复函数 translate 中未初始化内存读取的问题,从而关闭 #75592#75794Alexey Milovidov)。
  • 在 Native 格式中,将格式设置作为字符串格式化选项传递给 JSON 输出。#75832 (Pavel Kruglov)。
  • 在设置变更历史中记录了:从 v24.12 起,默认启用并行哈希 JOIN 算法。这意味着,如果配置的兼容性级别早于 v24.12,ClickHouse 将继续使用非并行哈希进行 JOIN#75870Robert Schulze)。
  • 修复了一个问题:带有隐式添加的 min-max 索引的表无法复制到新表中(问题 #75677)。#75877Smita Kulkarni)。
  • clickhouse-library-bridge 允许从文件系统中加载任意库,因此只有在隔离环境中运行才是安全的。为防止其在与 clickhouse-server 同一环境中运行时产生漏洞,我们将把可加载库的路径限制在配置中指定的位置。此漏洞由 Arseniy Dugin 通过 ClickHouse Bug Bounty Program 发现。#75954Alexey Milovidov)。
  • 我们之前对某些元数据使用了 JSON 序列化,这是一个错误,因为 JSON 不支持在字符串字面量中包含二进制数据(包括零字节)。SQL 查询可以包含二进制数据和无效的 UTF-8,因此我们的元数据文件也必须支持这一点。与此同时,ClickHouse 的 JSONEachRow 以及类似格式通过偏离 JSON 标准来实现对二进制数据的无损往返。相关动机说明参见:https://github.com/ClickHouse/ClickHouse/pull/73668#issuecomment-2560501790。解决方案是让 Poco::JSON 库与 ClickHouse 中的 JSON 格式序列化方式保持一致。此变更关闭了 #73668#75963Alexey Milovidov)。
  • 修复存储 S3Queue 中提交上限检查。 #76104 (Kseniia Sumarokova).
  • 修复在附加具有自动索引的 MergeTree 表时的问题(add_minmax_index_for_numeric_columns/add_minmax_index_for_string_columns)。#76139Azat Khuzhin)。
  • 修复了作业父线程的堆栈跟踪(enable_job_stack_trace 设置)未被打印的问题。修复了 enable_job_stack_trace 设置未正确传播到线程,导致生成的堆栈跟踪内容不总是遵从该设置的问题。#76191 (Yakov Olkhovskiy).
  • 修复了错误的权限检查问题,其中 ALTER RENAME 被错误地要求具有 CREATE USER 权限。关闭 #74372#76241pufit)。
  • 修复在大端架构上将 FixedString 与 reinterpretAs 一起使用时的问题。 #76253 (Azat Khuzhin).
  • 修复 S3Queue 中的逻辑错误:“Expected current processor to be equal to for bucket ”。 #76358Kseniia Sumarokova)。
  • 修复在 Memory 数据库上执行 ALTER 时出现的死锁问题。 #76359 (Azat Khuzhin).
  • 修复在 WHERE 条件中使用 pointInPolygon 函数时的索引分析逻辑错误。 #76360 (Anton Popov).
  • 修复信号处理程序中可能不安全的函数调用。#76549Yakov Olkhovskiy)。
  • 修复了 PartsSplitter 中对反向键的支持。这一改动修复了 #73400#73418Amos Bird)。

构建/测试/打包改进

  • 支持在 ARM 和 Intel Mac 上构建 HDFS。 #74244 (Yan Xin).
  • 在为 Darwin 进行交叉编译时启用 ICU 和 gRPC。 #75922 (Raúl Marín).
  • 更新到内嵌的 LLVM 19。 #75148 (Konstantin Bogdanov).
  • 在 Docker 镜像中为默认用户禁用网络访问。 #75259 (Mikhail f. Shiryaev). 将所有与 clickhouse-server 相关的操作封装为一个函数,并仅在 entrypoint.sh 中启动默认可执行文件时执行。一个被长期推迟的改进此前在 #50724 中被提出。为 clickhouse-extract-from-config 添加了 --users 开关,用于从 users.xml 中获取值。 #75643 (Mikhail f. Shiryaev).
  • 从二进制文件中移除约 20MB 的死代码。 #76226 (Alexey Milovidov).

ClickHouse 25.1 发行版,2025-01-28

向后不兼容的变更

  • JSONEachRowWithProgress 现在会在每当进度更新时写出进度信息。在之前的版本中,进度只会在每个结果块之后显示,这使其基本无用。已更改进度展示方式:不会再显示为零的进度值。此变更关闭了 #70800#73834Alexey Milovidov)。
  • Merge 表现在会通过使用其所有列的并集并推导出公共类型来统一底层表的结构。此变更关闭了 #64864。在某些情况下,此变更可能向后不兼容。一个示例是各表之间不存在公共类型,但仍然可以转换为第一个表的类型,例如 UInt64 和 Int64,或任意数值类型与 String。若要恢复旧行为,将 merge_table_max_tables_to_look_for_schema_inference 设为 1,或将 compatibility 设为 24.12 或更早版本。#73956Alexey Milovidov)。
  • Parquet 输出格式会将 Date 和 DateTime 列转换为 Parquet 支持的日期/时间类型,而不是写为原始数字。DateTime 现在变为 DateTime64(3)(之前为:UInt32);通过设置 output_format_parquet_datetime_as_uint32 可以恢复旧行为。Date 现在变为 Date32(之前为:UInt16)。#70950Michael Kolupaev)。
  • 默认情况下,不再允许在 ORDER BY 和比较函数 less/greater/equal/etc 中使用不可比较的类型(例如 JSON/Object/AggregateFunction)。#73276Pavel Kruglov)。
  • 过时的 MaterializedMySQL 数据库引擎已被移除,且不再可用。#73879Alexey Milovidov)。
  • mysql 字典源不再执行 SHOW TABLE STATUS 查询,因为对于 InnoDB 表以及任何较新的 MySQL 版本,该查询不再提供任何有价值的信息。此变更关闭了 #72636。该变更是向后兼容的,但仍归入本节,以便你能注意到它。#73914Alexey Milovidov)。
  • 现在 CHECK TABLE 查询需要单独的 CHECK 权限。在之前的版本中,拥有 SHOW TABLES 权限就足以执行这些查询。但 CHECK TABLE 查询可能非常重,而常规 SELECT 查询的复杂度限制并不适用于它,这带来了潜在的拒绝服务攻击(DoS)风险。#74471Alexey Milovidov)。
  • 函数 h3ToGeo() 现在按 (lat, lon) 的顺序返回结果(这是几何函数的标准顺序)。希望保留旧有结果顺序 (lon, lat) 的用户可以将设置 h3togeo_lon_lat_result_order 设为 true#74719Manish Gill)。
  • 新的 MongoDB 驱动现在是默认驱动。希望继续使用旧驱动的用户可以将服务器端设置 use_legacy_mongodb_integration 设为 true#73359Robert Schulze)。

新功能

  • 新增支持在提交 SELECT 查询后,在其执行期间即时应用未完成的(尚未由后台进程物化的)mutation。可通过设置 apply_mutations_on_fly 来启用此功能。 #74877 (Anton Popov).
  • 为 Iceberg 中与时间相关的 transform 分区操作实现 Iceberg 表分区裁剪功能。#72044 (Daniil Ivanik).
  • 在 MergeTree 的排序键和跳过索引中支持子列。 #72644 (Pavel Kruglov).
  • 支持从 Apache Arrow/Parquet/ORC 中读取 HALF_FLOAT 值(会被读取为 Float32 类型)。修复了 #72960。请注意,IEEE-754 半精度浮点数(half float)与 BFloat16 并不相同。修复了 #73835#73836Alexey Milovidov)。
  • system.trace_log 表将包含两个新列 symbolslines,用于存储符号化后的堆栈跟踪信息。这样便于收集和导出性能分析信息。该行为由 trace_log 中名为 symbolize 的服务器配置项控制,默认启用。#73896 (Alexey Milovidov)。
  • 添加了一个新函数 generateSerialID,可用于在表中生成自增数字。延续了 kazalika#64310 中的工作。此更改关闭了 #62485#73950Alexey Milovidov)。
  • 为 DDL 查询新增语法 query1 PARALLEL WITH query2 PARALLEL WITH query3 ... PARALLEL WITH queryN。这意味着子查询 {query1, query2, ... queryN} 可以彼此并行运行(并且这是推荐的用法)。 #73983 (Vitaly Baranov).
  • 为反序列化的 skipping 索引粒度添加了内存缓存。这应当能加速重复使用 skipping 索引的查询。新缓存的大小由服务器端设置 skipping_index_cache_sizeskipping_index_cache_max_entries 控制。引入该缓存的初衷是加速向量相似度索引,它们现在已经快了很多。#70102 (Robert Schulze)。
  • 现在,嵌入式 Web UI 在查询执行期间显示进度条,并支持取消查询。它会显示行的总数以及更详细的执行速度信息。数据一到达,表格就可以逐步渲染。启用 HTTP 压缩后,表格渲染速度变得更快。表头现在会固定在顶部。现在支持选择单元格,并可通过方向键在单元格间导航。修复了选中单元格的轮廓导致其变小的问题。单元格不再在鼠标悬停时展开,而仅在选中时展开。停止渲染传入数据的时机现在由客户端而不是服务器端决定。对数字的分组位进行高亮显示。整体设计经过焕新,变得更加醒目。它会检查服务器是否可达以及凭据是否正确,并显示服务器版本和运行时长。云图标在所有字体下都以描边样式显示,即使在 Safari 中也是如此。嵌套数据类型中的大整数将会有更好的显示效果。现在可以正确显示 inf/nan。鼠标悬停在列标题上时,它会显示数据类型。#74204 (Alexey Milovidov)。
  • 新增支持通过设置项 add_minmax_index_for_numeric_columns(用于数值列)和 add_minmax_index_for_string_columns(用于字符串列),为由 MergeTree 管理的列默认创建 min-max(跳过)索引。当前这两个设置项均为禁用状态,因此暂时不会产生行为变更。 #74266 (Smita Kulkarni).
  • script_query_numberscript_line_number 字段添加到 system.query_log、原生协议中的 ClientInfo 以及服务器日志中。此更改解决了 #67542。感谢 pinsvin00 早先在 #68133 中提出并推动这一特性。#74477Alexey Milovidov)。
  • 新增聚合函数 sequenceMatchEvents,用于返回模式中最长事件链上匹配事件的时间戳。 #72349 (UnamedRus)。
  • 新增了函数 arrayNormalizedGini#72823 (flynn)。
  • DateTime64 增加对减号运算符的支持,允许在 DateTime64 值之间以及与 DateTime 之间进行相减。 #74482 (Li Yin).

实验性特性

性能优化

  • 已优化函数 indexHint。现在,只在函数 indexHint 中作为参数使用的列将不会从表中读取。#74314 (Anton Popov)。如果 indexHint 函数是您企业数据架构中的核心组件,那么这一优化简直是救命级别的。
  • parallel_hash JOIN 算法中 max_joined_block_size_rows 设置的统计更加精确,有助于避免相比 hash 算法出现更高的内存消耗。#74630 (Nikita Taranov)。
  • 在查询计划层面支持对 MergingAggregated 步骤进行谓词下推优化。该优化可以提升使用 analyzer 的某些查询的性能。#74073 (Nikolai Kochetov).
  • parallel_hash JOIN 算法探测阶段中对左表数据块按哈希拆分的步骤已被移除。#73089 (Nikita Taranov)。
  • 优化 RowBinary 输入格式,解决了 #63805 问题。#65059Pavel Kruglov)。
  • 如果启用了 optimize_on_insert,则将分区片段写为 level 1。这样可以对新写入的分区片段使用带有 FINAL 的查询进行多种优化。#73132 (Anton Popov)。
  • 通过一些底层优化提升字符串反序列化性能。#65948 (Nikita Taranov)。
  • 在对记录进行相等比较时(例如在合并过程中),会优先从最有可能不相等的列开始比较各行数据。 #63780 (UnamedRus).
  • 通过根据键对右侧连接表重新排序,提升 Grace 哈希连接的性能。#72237 (kevinyhzou).
  • 允许 arrayROCAUCarrayAUCPR 计算整条曲线的局部面积,从而可以在海量数据集上并行化其计算。#72904 (Emmanuel)。
  • 避免创建过多空闲线程。 #72920 (Guo Wangyang).
  • 当表函数中仅有花括号展开时,不再枚举 Blob 存储键。修复了 #73333#73518Konstantin Bogdanov)。
  • 为在 Nullable 参数上执行的函数添加了短路优化。 #73820 (李扬).
  • 不要对非函数列使用 maskedExecute,以提升短路执行的性能。 #73965 (lgbo).
  • 禁用在 Kafka/NATS/RabbitMQ/FileLog 输入格式中对消息头的自动检测功能,以提升性能。 #74006 (Azat Khuzhin)。
  • 在使用 GROUPING SETS 的聚合之后,以更高的并行度执行 pipeline。 #74082 (Nikita Taranov)。
  • 缩小 MergeTreeReadPool 中的临界区范围。#74202 (Guo Wangyang)。
  • 并行副本性能改进。对于与并行副本协议无关的数据包,现在其在查询发起方的反序列化始终在 pipeline 线程中进行。此前,它可能在负责 pipeline 调度的线程中执行,这会降低发起方的响应能力并延迟 pipeline 的执行。 #74398 (Igor Nikonov).
  • 提升 Keeper 中大规模多请求操作的性能。#74849 (Antonio Andelic).
  • 按值使用日志包装器,不要将其分配在堆上。#74034Mikhail Artemenko)。
  • 在后台重新建立与 MySQL 和 Postgres 字典副本的连接,以免延迟对相应字典的请求。#71101 (Yakov Olkhovskiy).
  • 并行副本会利用关于副本可用性的历史信息来改进副本选择,但在连接不可用时不会更新该副本的错误计数。此 PR 现在会在副本不可用时更新该副本的错误计数。 #72666 (zoomxi).
  • 添加了一个 MergeTree 的设置项 materialize_skip_indexes_on_merge,用于在合并过程中抑制创建跳过索引。这样您可以通过 ALTER TABLE [..] MATERIALIZE INDEX [...] 明确控制何时创建跳过索引。如果跳过索引的构建成本较高(例如向量相似度索引),这将非常有用。#74401Robert Schulze)。
  • 优化 Storage(S3/Azure)Queue 中的 keeper 请求。#74410 (Kseniia Sumarokova). #74538 (Kseniia Sumarokova).
  • 默认情况下最多使用 1000 个并行副本。#74504Konstantin Bogdanov)。
  • 在从 S3 磁盘读取数据时提升 HTTP 会话复用效率(#72401)。#74548Julian Maicher)。

改进

  • 在具有隐式 ENGINE 的 CREATE TABLE 查询中支持使用 SETTINGS,并且支持同时混用引擎设置和查询设置。#73120 (Raúl Marín)。
  • 默认情况下启用 use_hive_partitioning#71636 (Yarik Briukhovetskyi).
  • 支持在具有不同参数的 JSON 类型之间进行 CASTALTER 操作。#72303 (Pavel Kruglov)。
  • 支持对 JSON 列中的值进行等值比较。#72991 (Pavel Kruglov).
  • 优化带有 JSON 子列的标识符格式,以避免不必要的反引号。 #73085 (Pavel Kruglov).
  • 交互式指标改进。修复来自并行副本的指标未完全显示的问题。先按最近更新时间排序,再按名称的字典序显示指标。不显示陈旧指标。#71631Julia Kartseva)。
  • 默认将 JSON 输出格式美化显示。新增 output_format_json_pretty_print 设置用于控制该行为,并默认启用。#72148 (Pavel Kruglov)。
  • 默认允许使用 LowCardinality(UUID)。事实证明,这在 ClickHouse Cloud 客户中非常实用。#73826 (Alexey Milovidov)。
  • 改进了安装过程中的提示信息。#73827 (Alexey Milovidov).
  • 改进了 ClickHouse Cloud 的密码重置提示信息。#73831 (Alexey Milovidov).
  • 改进了在 File 表无法向文件中追加数据时的错误信息。#73832Alexey Milovidov)。
  • 当用户在终端中误将输出设置为二进制格式(例如 Native、Parquet、Avro)时,会弹出确认提示。关闭了 #59524#73833Alexey Milovidov)。
  • 在终端中以 Pretty 和 Vertical 格式显示时高亮行尾空白字符,以提高清晰度。可通过 output_format_pretty_highlight_trailing_spaces 设置进行控制。初始实现由 Braden Burns#72996 中完成。关闭了 #71590#73847Alexey Milovidov)。
  • clickhouse-clientclickhouse-local 的标准输入从文件重定向时,将自动检测输入的压缩格式。此更改解决了 #70865#73848Alexey Milovidov)。
  • 默认情况下,在 Pretty 输出格式中会截断过长的列名。该行为由 output_format_pretty_max_column_name_width_cut_tooutput_format_pretty_max_column_name_width_min_chars_to_cut 这两个设置控制。这是对 tanmaydatta#66502 中工作的延续。此更改关闭了 #65968#73851Alexey Milovidov)。
  • Pretty 输出格式更美观:如果距离上一个数据块输出的时间不长,则合并数据块。通过新的设置 output_format_pretty_squash_consecutive_ms(默认 50 ms)和 output_format_pretty_squash_max_wait_ms(默认 1000 ms)进行控制。是对 #49537 的延续。本次变更关闭了 #49153#73852Alexey Milovidov)。
  • 新增一个用于统计当前正在合并的源分区片段数量的指标。此更改关闭了 #70809#73868 (Alexey Milovidov)。
  • 当输出到终端时,会在 Vertical 格式中高亮显示列。可以通过 output_format_pretty_color 设置来禁用此行为。 #73898 (Alexey Milovidov).
  • 将 MySQL 兼容性增强到足以使 mysqlsh(Oracle 提供的功能丰富的 MySQL CLI)现在可以连接到 ClickHouse,从而便于测试。#73912Alexey Milovidov)。
  • Pretty 格式现在可以在表格单元格中渲染多行字段,从而提升可读性。该功能默认启用,可通过设置项 output_format_pretty_multiline_fields 进行控制。延续了 Volodyachan#64094 中的工作。此更改关闭了 #56912#74032Alexey Milovidov)。
  • 在浏览器中将 X-ClickHouse HTTP 头部暴露给 JavaScript,从而使编写应用程序更加方便。#74180 (Alexey Milovidov)。
  • JSONEachRowWithProgress 格式现在将包含事件及其元数据,以及 totals 和 extremes。同时还包括 rows_before_limit_at_leastrows_before_aggregation。如果在部分结果之后才出现异常,该格式也能正确输出异常。进度信息现在包含已消耗的纳秒数。结束时会发出最后一个进度事件。查询运行期间的进度打印频率不会超过 interactive_delay 设置的值。#74181 (Alexey Milovidov)。
  • Play UI 中的沙漏将平滑旋转。 #74182 (Alexey Milovidov).
  • 即使 HTTP 响应已被压缩,也要在数据包一到就立刻发送出去。这样浏览器就能接收进度数据包和压缩后的数据。#74201 (Alexey Milovidov)。
  • 如果输出行数大于 N = output_format_pretty_max_rows,则不再只显示前 N 行,而是从中间截断输出表格,显示前 N/2 行和最后 N/2 行。这是对 #64200 的延续,修复了 #59502#73929Alexey Milovidov)。
  • 在启用 hash join 算法时,允许使用更通用的 JOIN 计划算法。#71926János Benjamin Antal)。
  • 现在支持在数据类型为 DateTime64 的列上创建 bloom_filter 索引。 #66416 (Yutong Xiao).
  • 当同时启用 min_age_to_force_merge_secondsmin_age_to_force_merge_on_partition_only 时,数据片段合并将忽略最大字节数限制。#73656Kai Zhu)。
  • 向 OpenTelemetry span 日志表中添加了 HTTP 头部,以增强可追踪性。 #70516 (jonymohajanGmail).
  • 支持按自定义时区写入 orc 文件,而不再固定使用 GMT 时区。#70615 (kevinyhzou).
  • 在跨 Cloud 写入备份时遵守 I/O 调度设置。#71093 (János Benjamin Antal)。
  • system.asynchronous_metrics 中为 metric 列新增别名 name#71164 (megao).
  • 由于历史原因,ALTER TABLE MOVE PARTITION TO TABLE 查询检查的是 SELECTALTER DELETE 权限,而不是专门的 ALTER_MOVE_PARTITION。本 PR 改为使用该访问类型。为保持兼容性,如果已授予 SELECTALTER DELETE,也会隐式授予该权限,但这种行为将在未来版本中移除。修复了 #16403#71632pufit)。
  • 在尝试物化排序键中的列时抛出异常,以避免破坏排序顺序。#71891 (Peter Nguyen)。
  • EXPLAIN QUERY TREE 中隐藏敏感信息。 #72025 (Yakov Olkhovskiy).
  • 在 "native" 读取器中支持 Parquet 整数逻辑类型。#72105 (Arthur Passos)。
  • 如果默认用户配置了密码,则会在浏览器中以交互方式请求凭证。此前版本中,服务器会返回 HTTP 403;现在会返回 HTTP 401。#72198Alexey Milovidov)。
  • 将访问类型 CREATE_USERALTER_USERDROP_USERCREATE_ROLEALTER_ROLEDROP_ROLE 从全局改为参数化。这意味着你现在可以更精细地进行访问管理授权。#72246 (pufit)。
  • latest_fail_error_code_name 列添加到 system.mutations 表中。我们需要此列来引入一个用于卡住的 mutation 的新指标,并使用它在 Cloud 中构建错误可视化图表,并且(可选)添加一个噪声更少的新告警。#72398 (Miсhael Stetsyuk)。
  • 减少 ATTACH PARTITION 查询中的内存分配开销。#72583 (Konstantin Morozov).
  • 使 max_bytes_before_external_sort 的限制取决于查询的总内存消耗(之前它表示的是单个排序线程中用于排序块的字节数,现在它与 max_bytes_before_external_group_by 含义相同——即对所有线程的整个查询的总内存限制)。另外新增一个用于控制落盘块大小的设置——min_external_sort_block_bytes#72598 (Azat Khuzhin).
  • 忽略由 trace collector 施加的内存限制。#72606 (Azat Khuzhin)。
  • 将服务器设置项 dictionaries_lazy_loadwait_dictionaries_load_at_startup 添加到 system.server_settings#72664 (Christoph Wurm).
  • 将设置 max_backup_bandwidth 添加到可在 BACKUP/RESTORE 查询中指定的设置列表中。#72665 (Christoph Wurm)。
  • 降低在 ReplicatedMergeTree 引擎中针对出现的复制分区片段的日志级别,以减少在副本集群中生成的日志量。#72876 (mor-akamai)。
  • 改进对析取式中公共表达式的提取。即使所有析取项之间不存在共同子表达式,也允许对生成的过滤条件进行简化。是对 #71537 的延续。#73271Dmitry Novik)。
  • S3Queue/AzureQueue 存储中,现在允许为在创建时未指定设置的表补充添加设置。 #73283 (Kseniia Sumarokova).
  • 引入一个名为 least_greatest_legacy_null_behavior 的 setting(默认值为 false),用于控制函数 leastgreatest 在处理 NULL 参数时,是无条件返回 NULL(当为 true 时),还是忽略这些参数(当为 false 时)。 #73344 (Robert Schulze)。
  • 在 ObjectStorageQueueMetadata 的清理线程中使用 Keeper 的多请求操作。 #73357 (Antonio Andelic).
  • 当 ClickHouse 在 cgroup 中运行时,我们仍然会收集与系统负载、进程调度、内存等相关的系统级异步指标。 当 ClickHouse 是主机上唯一资源消耗较高的进程时,这些指标可能会提供有用的信号。 #73369 (Nikita Taranov).
  • S3Queue 存储中,现在可以将 24.6 之前创建的旧有序表迁移到使用分桶的新结构中。#73467 (Kseniia Sumarokova)。
  • 新增 system.azure_queue,类似于已有的 system.s3queue#73477 (Kseniia Sumarokova).
  • 函数 parseDateTime64(及其变体)现在对于早于 1970 年或晚于 2106 年的输入日期能够返回正确结果。示例:SELECT parseDateTime64InJodaSyntax('2200-01-01 00:00:00.000', 'yyyy-MM-dd HH:mm:ss.SSS')#73594zhanglistar)。
  • 解决了一些用户提出的 clickhouse-disks 可用性问题。已关闭 #67136#73616Daniil Ivanik)。
  • 允许修改 S3(Azure)Queue 存储的提交设置(提交设置包括:max_processed_files_before_commitmax_processed_rows_before_commitmax_processed_bytes_before_commitmax_processing_time_sec_before_commit)。#73635Kseniia Sumarokova)。
  • 在 S3(Azure)Queue 存储中聚合各个源的进度,以便与提交限制设置进行比较。#73641 (Kseniia Sumarokova)。
  • BACKUP/RESTORE 查询支持核心设置。 #73650 (Vitaly Baranov).
  • 在生成 Parquet 输出时会考虑 output_format_compression_level#73651Arthur Passos)。
  • 将 Apache Arrow 的 fixed_size_list 改为读取为 Array,而不是将其视为不受支持的类型。#73654 (Julian Meyers)。
  • 新增了两个备份引擎:Memory(在当前用户会话内保存备份)和 Null(不在任何地方保存备份),主要用于测试。 #73690 (Vitaly Baranov).
  • concurrent_threads_soft_limit_numconcurrent_threads_soft_limit_num_ratio_to_cores 现在可以在不重启服务器的情况下修改。#73713 (Sergei Trifonov).
  • formatReadable 函数新增对扩展数值类型(Decimal、大整数)的支持。#73765Raúl Marín)。
  • 为兼容 Postgres wire 协议提供 TLS 支持。#73812scanhex12)。
  • 函数 isIPv4String 在正确的 IPv4 地址后紧跟一个零字节时会返回 true,而在这种情况下本应返回 false。是对 #65387 的后续修复。#73946 (Alexey Milovidov)。
  • 使 MySQL wire 协议中的错误代码与 MySQL 保持兼容。延续自 #56831。关闭了 #50957#73948Alexey Milovidov)。
  • 添加 validate_enum_literals_in_opearators 设置项,用于对 INNOT IN 等运算符中的枚举字面量进行校验,将其与枚举类型进行比对,如果字面量不是合法的枚举值则抛出异常。 #73985 (Vladimir Cherkasov).
  • S3(Azure)Queue 存储中,将同一批次(由提交设置定义)的所有文件在单个 Keeper 事务中提交。#73991Kseniia Sumarokova)。
  • 禁用可执行 UDF 和字典的表头检测(可能导致 Function 'X':结果错误,预期 Y 行,实际为 Y-1)。 #73992 (Azat Khuzhin).
  • EXPLAIN PLAN 新增 distributed 选项。现在,EXPLAIN distributed=1 ... 会将远程执行计划附加到 ReadFromParallelRemote* 步骤。 #73994 (Nikolai Kochetov)。
  • 为带有 Dynamic 参数的 not/xor 使用正确的返回类型。#74013 (Pavel Kruglov)。
  • 允许在建表后更改 add_implicit_sign_column_constraint_for_collapsing_engine#74014 (Christoph Wurm).
  • materialized view 的 SELECT 查询现在支持子列。 #74030 (Pavel Kruglov).
  • 现在在 clickhouse-client 中设置自定义提示符有三种简便方式:1. 通过命令行参数 --prompt;2. 在配置文件中通过设置 <prompt>[...]</prompt>;3. 同样在配置文件中,通过连接级设置 <connections_credentials><prompt>[...]</prompt></connection_credentials>#74168 (Christoph Wurm)。
  • ClickHouse Client 现在可以在连接到端口 9440 时自动检测是否使用安全连接。#74212Christoph Wurm)。
  • http_handlers 中支持仅使用用户名对用户进行身份验证(此前还要求用户同时提供密码)。#74221 (Azat Khuzhin).
  • 对替代查询语言 PRQL 和 KQL 的支持被标记为实验特性。要使用它们,请将设置 allow_experimental_prql_dialect = 1allow_experimental_kusto_dialect = 1#74224 (Robert Schulze)。
  • 更多聚合函数现在支持返回默认的 Enum 类型。#74272 (Raúl Marín)。
  • OPTIMIZE TABLE 中,现在可以使用关键字 FORCE 作为现有关键字 FINAL 的替代。#74342 (Robert Schulze)。
  • 添加 IsServerShuttingDown 指标,用于在服务器关闭过程耗时过长时触发告警。#74429 (Miсhael Stetsyuk)。
  • EXPLAIN 输出中添加了 Iceberg 表名。 #74485 (alekseev-maksim)。
  • 在使用旧版分析器配合 RECURSIVE CTE 时提供更清晰的错误信息。#74523 (Raúl Marín)。
  • system.errors 中显示详细错误信息。#74574 (Vitaly Baranov)。
  • 允许在客户端与 clickhouse-keeper 之间通信时使用密码。如果你为服务器端和客户端配置了合适的 SSL,此功能意义不大,但在某些场景下仍然可能有用。密码最长为 16 个字符。它与 Keeper 身份验证模型无关。#74673 (alesapin)。
  • 为配置重载器添加错误码。#74746 (Garrett Thomas)。
  • 在 MySQL 和 PostgreSQL 表函数和引擎中新增对 IPv6 地址的支持。#74796Mikhail Koviazin)。
  • divideDecimal 实现短路优化。修复 #74280#74843Kevin Mingtarja)。
  • 现在可以在启动脚本中配置用户。 #74894 (pufit).
  • 新增对 Azure SAS 令牌的支持。 #72959 (Azat Khuzhin).

Bug 修复(官方稳定版中对用户可见的错误行为)

  • 仅在压缩编解码器支持时才设置 Parquet 压缩级别。#74659 (Arthur Passos)。
  • 修复了一个回归问题,即在使用带有修饰符的排序规则 locale 时会抛出错误。例如,SELECT arrayJoin(['kk 50', 'KK 01', ' KK 2', ' KK 3', 'kk 1', 'x9y99', 'x9y100']) item ORDER BY item ASC COLLATE 'tr-u-kn-true-ka-shifted 现在可以正常工作。#73544Robert Schulze)。
  • 修复无法使用 keeper-client 创建 SEQUENTIAL 节点的问题。 #64177 (Duc Canh Le).
  • 修复 position 函数中字符计数不正确的问题。#71003 (思维).
  • 由于部分撤销操作未被正确处理,针对访问实体执行 RESTORE 时需要的权限比实际所需更多。此 PR 修复了该问题。关闭 #71853#71958pufit)。
  • 避免在执行 ALTER TABLE REPLACE/MOVE PARTITION FROM/TO TABLE 后发生暂停。为后台任务调度检索正确的设置。#72024Aleksei Filatov)。
  • 修复某些输入和输出格式(如 Parquet、Arrow)中对空元组的处理问题。#72616 (Michael Kolupaev)。
  • 现在,在带通配符的数据库/表上授予列级 GRANT SELECT/INSERT 权限时会抛出错误。 #72646 (Johann Gan).
  • 修复了由于目标访问实体中的隐式授权导致用户无法执行 REVOKE ALL ON *.* 的问题。#72872pufit)。
  • 修复 formatDateTime 标量函数在处理正时区时的格式化问题。 #73091 (ollidraese).
  • 修复了在通过 PROXYv1 建立连接且已设置 auth_use_forwarded_address 时,源端口未被正确反映的问题——此前会错误地使用代理端口。新增 currentQueryID() 函数。#73095 (Yakov Olkhovskiy)。
  • 将格式设置传递给 TCPHandler 中的 NativeWriter,使诸如 output_format_native_write_json_as_string 之类的设置能够正确生效。 #73179 (Pavel Kruglov).
  • 修复 StorageObjectStorageQueue 中的崩溃。 #73274 (Kseniia Sumarokova).
  • 修复服务器关闭期间在可刷新materialized view中发生的罕见崩溃。#73323 (Michael Kolupaev)。
  • 函数 formatDateTime 的占位符 %f 现在始终生成 6 位(子秒)数字。这样其行为就与 MySQL DATE_FORMAT 函数兼容。可以通过将设置 formatdatetime_f_prints_scale_number_of_digits 设为 1 来恢复之前的行为。#73324ollidraese)。
  • 修复了从 s3 存储和表函数读取时基于 _etag 列进行过滤的问题。#73353Anton Popov)。
  • 修复在旧分析器中,当在 JOIN ON 表达式中使用 IN (subquery) 时出现的 Not-ready Set is passed as the second argument for function 'in' 错误。 #73382 (Nikolai Kochetov).
  • 修复了为 Dynamic 和 JSON 列准备进行 squash 时的处理逻辑。此前在某些情况下,即使尚未达到类型或路径的数量上限,新类型仍可能被插入到 shared variant/shared data 中。#73388Pavel Kruglov)。
  • 在类型的二进制解码过程中检查损坏的大小信息,以避免过大的内存分配。 #73390 (Pavel Kruglov).
  • 修复了在启用并行副本时,从单副本集群读取时出现的逻辑错误。#73403 (Michael Kolupaev)。
  • 修复 ObjectStorageQueue 在配合 ZooKeeper 和旧版 Keeper 使用时的问题。 #73420 (Antonio Andelic)。
  • 实现了为默认启用 Hive 分区所需的修复。#73479 (Yarik Briukhovetskyi)。
  • 修复在创建向量相似性索引时的数据竞争。#73517 (Antonio Andelic)。
  • 修复了当字典的数据源包含使用错误数据的函数时出现的段错误。 #73535 (Yarik Briukhovetskyi)。
  • 修复在使用 S3(Azure)Queue 存储引擎时插入失败时的重试机制。关闭 #70951#73546Kseniia Sumarokova)。
  • 修复了 tupleElement 函数中的一个错误,该错误在某些情况下,当元组包含 LowCardinality 元素且启用了 optimize_functions_to_subcolumns 设置时可能会出现。 #73548 (Anton Popov).
  • 修复了解析枚举 glob 后紧跟范围时的问题。修复了 #73473#73569Konstantin Bogdanov)。
  • 修复了在针对非复制表的子查询中被忽略的 parallel_replicas_for_non_replicated_merge_tree 设置。 #73584 (Igor Nikonov).
  • 修复了在任务无法调度时会抛出 std::logical_error 的问题。在压力测试中发现。#73629 (Alexander Gololobov)。
  • EXPLAIN SYNTAX 中不再对查询进行解析,以避免因对分布式查询使用错误的处理阶段而导致的逻辑错误。修复了 #65205#73634Dmitry Novik)。
  • 修复 Dynamic 列中可能出现的数据不一致问题,解决了可能出现的逻辑错误 Nested columns sizes are inconsistent with local_discriminators column size#73644 (Pavel Kruglov)。
  • 修复了在包含 FINALSAMPLE 的查询中出现的 NOT_FOUND_COLUMN_IN_BLOCK 问题。修复了对 CollapsingMergeTree 表使用 FINAL 进行查询时的结果错误问题,并启用了针对 FINAL 的优化。#73682 (Anton Popov)。
  • 修复在 LIMIT BY COLUMNS 中的崩溃。#73686 (Raúl Marín).
  • 修复了这样一个问题:在被强制使用普通 PROJECTION 时,即使查询与该 PROJECTION 的定义完全相同,仍未选中该 PROJECTION,因而导致报错。#73700 (Shichao Jin).
  • 修复 Dynamic/Object 结构的反序列化问题。该问题可能导致 CANNOT_READ_ALL_DATA 异常。#73767 (Pavel Kruglov).
  • 在从备份中恢复分区片段时跳过 metadata_version.txt#73768 (Vitaly Baranov)。
  • 修复在结合 LIKE 将值转换为 Enum 类型时出现的段错误。 #73775 (zhanglistar).
  • 修复了 S3 Express 存储桶无法作为磁盘使用的问题。 #73777 (Sameer Tamsekar).
  • 允许在 CollapsingMergeTree 表中合并 sign 列值无效的行。#73864Christoph Wurm)。
  • 修复在存在离线副本时查询 DDL 会报错的问题。#73876 (Tuan Pham Anh)。
  • 修复了在比较 map() 类型时偶发失败的问题,原因是允许创建其嵌套元组未对字段('keys'、'values')进行显式命名的 Map#73878 (Yakov Olkhovskiy).
  • 在解析 GROUP BY ALL 子句时忽略窗口函数。修复 #73501#73916Dmitry Novik)。
  • 修复隐式权限问题(之前被当作通配符处理)。 #73932 (Azat Khuzhin).
  • 修复在创建嵌套 Maps 时的高内存占用问题。 #73982 (Pavel Kruglov).
  • 修复解析键名为空的嵌套 JSON 时的错误。 #73993 (Pavel Kruglov).
  • 修复:当某个别名被另一个别名引用,并且在选择时顺序相反时,该别名可能不会被添加到投影中。#74033 (Yakov Olkhovskiy)。
  • 在 Azure 上初始化 plain_rewritable 磁盘时忽略“对象未找到”错误。 #74059 (Julia Kartseva).
  • 修复在使用枚举类型或空表时 anyanyLast 的行为。#74061Joanna Hulboj)。
  • 修复了当用户在 Kafka 表引擎中指定关键字参数时出现的问题。 #74064 (Yarik Briukhovetskyi).
  • 修复了在修改 Storage S3Queue 设置时,在带有前缀 "s3queue_" 与不带此前缀之间切换的行为。#74075 (Kseniia Sumarokova)。
  • 添加了一个名为 allow_push_predicate_ast_for_distributed_subqueries 的设置。它为使用 analyzer 的分布式查询增加了基于 AST 的谓词下推。这个方案是临时的,我们会一直使用它,直到分布式查询支持查询计划序列化为止。修复了 #66878 #69472 #65638 #68030 #73718#74085 (Nikolai Kochetov)。
  • 修复了在 #73095 之后的更改中,forwarded_for 字段中可能包含端口,从而导致无法解析带端口的主机名的问题。#74116 (Yakov Olkhovskiy).
  • 修复了 ALTER TABLE (DROP STATISTICS ...) (DROP STATISTICS ...) 语句的错误格式。#74126Han Fei)。
  • 修复了问题 #66112#74128Anton Ivashkin)。
  • CREATE TABLE 中不再允许将 Loop 用作表引擎,此前这种组合会导致段错误。 #74137 (Yarik Briukhovetskyi).
  • 修复安全漏洞,防止在 PostgreSQL 和 SQLite 表函数中发生 SQL 注入。 #74144 (Pablo Marcos).
  • 修复在从压缩的 Memory 引擎表读取子列时发生的崩溃问题。修复 #74009#74161Nikita Taranov)。
  • 修复了在查询 system.detached_tables 时发生的无限循环。 #74190 (Konstantin Morozov)。
  • 修复在将文件标记为失败时 s3queue 中的逻辑错误。#74216Kseniia Sumarokova)。
  • 修复了从基础备份执行 RESTORE 时原生复制设置(allow_s3_native_copy / allow_azure_native_copy)未正确生效的问题。#74286Azat Khuzhin)。
  • 修复了当数据库中已分离表的数量为 max_block_size 的整数倍时出现的问题。#74289Konstantin Morozov)。
  • 修复当源和目标凭据不同时,通过 ObjectStorage(如 S3)进行复制时的问题。 #74331 (Azat Khuzhin).
  • 修复在 GCS 上进行原生复制时对“在 JSON API 中使用 Rewrite 方法”的检测。#74338 (Azat Khuzhin)。
  • 修复对 BackgroundMergesAndMutationsPoolSize 的错误计算(之前是实际值的 2 倍)。#74509 (alesapin)。
  • 修复在启用 Cluster Discovery 时 keeper watch 泄漏的问题。 #74521 (RinChanNOW).
  • 修复 UBSan 报告的内存对齐问题 #74512#74534Arthur Passos)。
  • 修复在创建表时 KeeperMap 的并发清理问题。#74568Antonio Andelic)。
  • 在包含 EXCEPTINTERSECT 的情况下,不要在子查询中移除未使用的投影列,以确保查询结果正确。修复了 #73930。修复了 #66465#74577Dmitry Novik)。
  • 修复了在启用稀疏序列化时,包含 Tuple 列的表之间执行 INSERT SELECT 查询时的问题。 #74698 (Anton Popov).
  • 函数 right 在负常量偏移量情况下行为不正确。 #74701 (Daniil Ivanik)。
  • 修复了由于客户端解压缩实现存在缺陷,导致 gzip 压缩数据的插入有时失败的问题。#74707siyuan)。
  • 在使用通配符授权时执行部分撤销操作可能会移除超出预期的权限。修复 #74263#74751 (pufit)。
  • Keeper:修复从磁盘读取日志记录的问题。 #74785 (Antonio Andelic).
  • 修复了对 SYSTEM REFRESH/START/STOP VIEW 的权限检查,现在在对某个特定 VIEW 执行查询时,不再需要在 *.* 上授予此权限,只需对该 VIEW 本身授予该权限即可。 #74789 (Alexander Tokmakov).
  • hasColumnInTable 函数之前不支持别名列。已修复为也适用于别名列。#74841 (Bharat Nallan)。
  • 修复了在 Azure Blob Storage 中,对包含空列的表进行数据分区片段合并时出现的 FILE_DOESNT_EXIST 错误。#74892Julia Kartseva)。
  • 修正在与临时表进行 JOIN 时的 PROJECTION 列名问题,关闭 #68872#74897Vladimir Cherkasov)。

构建/测试/打包改进