ClickHouse 26.8 长期支持版,2026-08-27,FIXME (进行中)
向后不兼容的变更
JSONEachRow及类似格式中,DateTime和DateTime64列未加引号的 JSON 数字现在会被解析为可带子秒级精度的 Unix 时间戳,与Values、CAST和toDateTime64的行为一致。此前,1703363853.035这类小数会被拒绝,而1703363853这类纯整数会被读取为DateTime64的原始缩放值,从而生成1970-...时间戳。带引号的字符串和 ClickHouse’s 自身的 JSON 输出不受影响。#108091 (Alexey Milovidov).max_insert_threads的默认值从1改为auto,后者会解析为服务器可用的 CPU 核心数。这会默认并行执行INSERT SELECT;当目标端的写入路径可以安全地分发写入时,max_insert_threads现在也能并行化普通INSERT的写入端。这可能会改变此类查询创建的分区数量和插入行的顺序。若要恢复之前的行为,请将max_insert_threads设为1,或将compatibility设为低于26.8的版本。#109000 (Alexey Milovidov). #109006 (Alexey Milovidov).PostgreSQL和MaterializedPostgreSQL数据库引擎现在会遵循remote_url_allow_hosts,与PostgreSQL表引擎、postgresql表函数及通过 DDL 创建的字典的现有行为一致。配置remote_url_allow_hosts后,CREATE DATABASE和用户执行的ATTACH DATABASE现在会以UNACCEPTABLE_URL拒绝指向不允许主机的PostgreSQL和MaterializedPostgreSQL数据库。现有数据库仍会在服务器启动时加载。#111135 (Alexey Milovidov).- Experimental
ALP(STD)编解码器现在使用Float64执行Float32缩放运算。这提高了压缩率,并避免了压缩十进制数据时频繁抛出异常;但早期版本写入的Float32值现在解码后可能相差 1 ULP。#111627 (Raufs Dunamalijevs). - 移除了
library字典源。SOURCE(LIBRARY(...))现在会因UNKNOWN_ELEMENT_IN_CONFIG而失败,dictionaries_lib_path服务器设置已废弃且不再生效。#111980 (Alexey Milovidov). - TODO:@Mikhail Artemenko 这为何是向后不兼容的变更?更新日志条目未作说明:对象存储磁盘事务现在默认使用元数据存储的原生事务,而不是之前的伪事务。#89658 (Mikhail Artemenko).
- 移除了用于
Arrow和ArrowStream格式的基于 Apache Arrow 库的 reader 和 writer。自 26.7 起一直作为默认实现的 ClickHouse 原生实现现已成为唯一实现。设置input_format_arrow_use_native_reader和output_format_arrow_use_native_writer已废弃:仍可接受,但不再生效。因此,原本将其设为0以强制使用 Apache Arrow 实现的查询现在会使用原生实现。#111996 (Alexey Milovidov). - TODO:说明向后不兼容性:拒绝会导致 Int64 微秒值溢出的时间跨度设置值 (毫秒/秒) 。#112757 (Azat Khuzhin).
MySQL源的 TLS 凭据 (ssl_ca、ssl_cert、ssl_key) 不再支持通过 SQL 指定为文件路径,例如在CREATE NAMED COLLECTION、查询参数或CREATE DICTIONARY中,因为服务器会以自身权限打开这些文件。服务器配置文件中仍可使用路径。其他情况下,请通过新增的ssl_ca_pem、ssl_cert_pem和ssl_key_pem参数传入证书或密钥内容;这些参数会像密码一样在日志和SHOW查询中被掩码。 #112070 (Alexey Milovidov).SYSTEM ... CACHE ON CLUSTER命令的权限检查现在使用各命令自身的权限,而不再使用SYSTEM DROP CACHE权限组。这使持有单项细粒度缓存权限的用户能够运行对应命令,同时防止仅持有该权限组的用户在没有SYSTEM SYNC FILESYSTEM CACHE权限的情况下运行SYSTEM SYNC FILESYSTEM CACHE ON CLUSTER。 #114042 (Groene AI).- 对于主体为在单个
Distributed表上执行普通SELECT的视图,现在会将整个外层查询下推到各分片 (新增设置optimize_trivial_view_pushdown_to_distributed,默认启用) 。这改变了此类视图的可观察行为:在引用视图时指定的FINAL和SAMPLE现在会传递给分片本地表,而不再被忽略;单分片集群也不再报告extremes。设置optimize_trivial_view_pushdown_to_distributed = 0可恢复此前的行为。 #101791 (simonmichal). - TODO:等待 revert-of-revert。轻量级
UPDATE补丁分区片段现采用新的 v2 磁盘格式,按 (sorting_key..., _block_number, _block_offset) 排序,并使用新的合并算法应用。峰值内存占用受最大同排序键连续段限制,而不再受整个补丁限制;跨越合并边界的更新也不再回退到内存中的 Join 应用。旧格式的补丁分区片段仍可读取。从 26.8 之前的版本进行滚动升级时,请保持patch_parts_version = 'v1',或使用compatibility设置,直至所有副本均已升级。 #103182 (Anton Popov). - 在
CREATE USER和ALTER USER中新增VALID FOR <interval>子句,作为VALID UNTIL的简写。过期截止时间会在查询执行时按当前时间加给定时间间隔计算,并以VALID UNTIL形式存储。system.users表的valid_until列现在使用Array(DateTime64(0))类型,而非Array(DateTime),从而可精确表示 2106 年以后的截止时间;读取该列的工具应处理这一新类型。 #110171 (Alexey Milovidov). EXPLAIN SYNTAX现在将格式化后的查询作为单条String记录 (包含嵌入的换行符) 返回,而不再每行返回一条记录,因此其输出为可还原、可直接使用的单行结果 (例如,SELECT count() FROM (EXPLAIN SYNTAX ...)返回1) 。这一行为由新增的single_record选项控制,默认值为1;设置single_record = 0可恢复原先每行一条记录的输出。其他EXPLAIN类型 (PLAN/PIPELINE/AST) 仍保留逐行的树状输出。 #110479 (Alexey Milovidov).Date32的支持范围从[1900-01-01, 2299-12-31]扩展至[0000-01-01, 9999-12-31],与DateTime64保持一致。解析和转换现在接受扩展后的范围,不再静默截断至旧边界。向后兼容性说明:在数值转换toDate32(N)中,[120530, 2932896]范围内的值现在会被解释为日数 (即从2300-01-01到9999-12-31的日期) ,而非 1970 年初的 Unix 时间戳,这符合“落在日数范围内的数值即为日数”的规则;小于0000-01-01对应日数的数值,以及晚于9999-12-31的时间戳,将饱和至新边界。 #111534 (Alexey Milovidov).arrayIntersect和arraySymmetricDifference不再将单个参数内重复出现的值视为出现在多个参数中。依赖此前行为的查询现在可能返回不同结果:arrayIntersect([1], [2], [1, 1])返回[]而非[1],arrayIntersect([1, 2], [2], [1, 1, 2])返回[2]而非[1, 2],arraySymmetricDifference([1], [2], [1, 1])返回[2, 1]而非[2]。对于arraySymmetricDifference,仅需两个参数即可:arraySymmetricDifference([1], [2, 2])返回[2, 1]而非[1]。现在,只有某个值此前已出现在每个参数中时,才会将其计入当前参数,因此结果恰好包含所有参数中均存在的值。作为同一项变更的一部分,arrayIntersect现在仅使用最小的参数构建哈希表,而非使用所有参数;当参数大小差异较大时,速度最高可提升 1.85 倍,内存使用量可减少三分之一。arrayUnion不受影响。 #113021 (Alexey Milovidov).disable_insertion_and_mutation现在会阻止Kafka、RabbitMQ和NATS表进行后台消费,同时仍允许直接写入外部存储。受此设置限制的Kafka2、NATS和RabbitMQ表在直接执行SELECT时不会初始化消费者。最近引入的message_queue_disable_insertion设置现在需要重启服务器才能生效。 #113660 (Christoph Wurm).- 对
AggregateFunction列使用窗口PARTITION BY或ORDER BY现在会被拒绝并报错ILLEGAL_COLUMN,与此前顶层ORDER BY对此类列的处理一致。此前,至少有一个 analyzer 会接受此类查询,并且窗口PARTITION BY的分区结果会因max_threads而异。该限制也适用于嵌套在Array、Tuple、Map、Variant或SimpleAggregateFunction中的状态。普通类型上的SimpleAggregateFunction、QBit,以及对状态使用GROUP BY和DISTINCT均不受影响。 #113878 (Groene AI). include_from设置不再默认使用/etc/metrika.xml。此前,只要该文件存在,就会将其用于配置替换,即使 ClickHouse 配置中没有任何内容引用它。如果依赖此隐式替换文件,请在每个受影响的配置文件中显式添加<include_from>/etc/metrika.xml</include_from>;单独加载的users.xml和 XML 字典配置均需各自添加include_from元素。 #114161 (Alexey Milovidov).NATS表引擎现在支持在新的nats_credentials设置中内联提供凭据 (载荷与.creds文件相同) ,并且不再允许通过 SQL 指定nats_credential_file:该路径引用服务器文件系统中的文件,服务器会以自身特权打开该文件,因此只能在服务器配置文件中定义的命名集合内指定,或在服务器配置中指定为nats.credential_file。查询可以用内联nats_credentials覆盖此类已配置的路径,除非操作员通过<nats_credential_file overridable="false">将其设为不可覆盖。在此限制实施前创建的表升级后仍可正常工作。#114644 (Alexey Milovidov).- 异步指标现在可以使用
Map数据类型,按 CPU 核心和设备划分的指标也已转换为单个键值指标:OSUserTimeCPU0、OSUserTimeCPU1、… 现已合并为单个OSUserTimeCPU指标,其中 map 将 CPU 核心编号映射为对应的值 (其他OS*TimeCPU*指标、CPUFrequencyMHz_*、Temperature*、EDAC*、Block*_*、Network(Receive|Send)*_*、Disk*_*、*BlobsQueueEstimate和AsyncLogging*QueueSize也同样如此) 。system.asynchronous_metrics新增了key_values Map(LowCardinality(String), Float64)列 (对于此类指标,value列为NaN) ;system.asynchronous_metric_log通过新增的key列按键逐行记录这些指标;Prometheus 端点通过标签导出这些指标 (例如ClickHouseAsyncMetrics_BlockReadBytes{device="sda"}) ;GraphiteMetricsTransmitter则将其发送为<prefix>.<Metric>.<key>。#115333 (Alexey Milovidov).
新特性
- 新增
CREATE HANDLER、ALTER HANDLER和DROP HANDLER语句,可通过 SQL 定义自定义 HTTP handler,并将其持久化存储在本地或 Keeper 中。新增currentHandler和currentRequestURL函数、system.handlers表,以及system.query_log中的http_handler_name/http_request_url列。#106231 (Alexey Milovidov). - 新增通过 HTTP 接口中的 URL 路径访问表和数据库的方式 (例如 `/database/table.format.gz?filter=a>0`) ,以及可相互组合并与现有 `query` URL 参数配合使用的新设置 (`http_allow_database_as_path`、`http_allow_table_as_file`、`http_allow_filters_as_path`、`http_allow_filters_as_unrecognized_url_parameters`、`select`、`order`、`sort`、`filter`、`page`、`compression`、`format`、`input_format`、`output_format`、`default_format`、`database`) 。#105249 (Alexey Milovidov).
- 新增由
framing_output_format设置选择的 framing 格式:可在单个 HTTP 响应流中复用查询响应的不同部分,包括数据块、totals 和 extremes、进度数据包、profile events、服务器日志和异常。已实现的 framing 格式包括:None(默认,行为与此前一致) 、EventStream(HTTP 服务器发送事件) 、JSONEachPacketBase64和JSONEachPacketString(每个数据包对应一个 JSON 对象,其中数据采用 Base64 编码或字符串形式) 。#110127 (Alexey Milovidov). - 新增
default_session_user服务器设置:客户端连接时若未指定用户名,将以该用户进行身份验证 (此前硬编码为default;原生、MySQL 和 PostgreSQL 协议现在会接受空用户名而非拒绝,Arrow Flight 也会遵循此设置,而不再使用其自身硬编码的default) 。protocols部分中的可组合协议端点可通过default_session_user键为各端点覆盖此设置,因此不同的监听端口可服务于不同的匿名用户。将其设为空字符串会禁止未指定用户名的连接。服务器间连接永不使用默认会话用户。#110179 (Alexey Milovidov). - 支持在 SQL 查询中使用管道运算符:
FROM t |> WHERE x > 1 |> AGGREGATE count() AS c GROUP BY y |> ORDER BY c DESC |> LIMIT 10,类似于 GoogleSQL 的管道语法。任何SELECT查询后都可跟随一串|>运算符,每个运算符都会将其前面的查询包装为子查询,因此生成的 AST 与使用嵌套子查询的等效查询相同。对于以FROM子句开头的查询,SELECT子句现为可选,默认使用SELECT *。#111151 (Alexey Milovidov). - 新增
parseQueryToJSON和formatQueryFromJSON函数,用于将 AST 序列化为 JSON 和从 JSON 反序列化;并新增可通过enable_json_ast_dialect启用的 Experimentalclickhouse_json方言。#100412 (Alexey Milovidov). #113480 (Nikita Fomichev). - 新增设置
run_query_in_background。服务器接受查询后会立即返回空结果,并继续执行查询直至完成,不受连接状态影响。查询结果会被丢弃。可通过system.processes和system.query_log中的query_id跟踪该查询。适用于INSERT ... SELECT、CREATE TABLE … AS SELECT或CREATE MATERIALIZED VIEW … POPULATE等长时间运行且不能因连接断开而终止的查询。#112816 (Miсhael Stetsyuk). - 新增系统表
system.user_query_log,用户无需访问查询日志表,即可查看自己的查询日志记录。最初的实现和构想来自 Yue Ni (@niyue),#104462。#110156 (Alexey Milovidov). - 实现了 URL 统一化的其余部分 (问题 #59617) 。新设置
s3_base可在s3表函数和S3表引擎 (以及共享其配置的函数:s3Cluster、gcs、oss) 中解析相对 URL,类似于url_base。新的URL数据库引擎将表名视为 URL,根据可选的 base URL 解析,并按 URL 协议分派,从而统一处理文件、Web 和对象存储。它在clickhouse-local的默认 (Overlay) 数据库中使用file://base URL 替代Filesystem,因此普通文件名仍可正常使用,也可以编写SELECT * FROM 'https://example.com/data.csv'。#111512 (Alexey Milovidov). - 新增
bigquery表函数和BigQuery表引擎,用于读取和写入 Google BigQuery 表,包括公开数据集。表结构将根据 BigQuery 表 schema 自动推断。身份验证支持 OAuth 访问令牌、JSON格式的服务账号密钥,以及带刷新令牌的 OAuth 客户端。#110166 (Alexey Milovidov). - 普通的
CREATE MATERIALIZED VIEW ... POPULATE现已实现本地原子性:在对源表施加短暂独占锁期间,视图会订阅源表的新 inserts,并对现有数据创建 snapshot,因此在填充期间通过同一服务器并发插入的行不再会遗漏或重复 (新增设置materialized_views_populate_atomically,默认启用) 。该保证仅涵盖本地 insert 路径;经由其他副本或分布式写入路径到达的 inserts 不在此范围内,并且要求源能够提供固定的 snapshot (MergeTreefamily 和Memory) 。其他源,以及CREATE OR REPLACE/REPLACE和在Replicated数据库中创建的视图,仍采用原有的非原子填充方式。现在还可以将POPULATE与TO一同使用,以回填目标表。#108715 (Alexey Milovidov). - Keeper 现在可通过自定义 LSM 树将数据存储在磁盘上,其性能与之前的存储方式相近。使用 coordination 设置
use_lsmt_storage = true启用此功能,使用storage_memory_only = false将文件存储到磁盘,并在 config 中添加data_storage_path或data_storage_disk以指定文件存放位置。要写入 S3,请将data_storage_disk指向类型为s3_plain的磁盘。#113903 (Michael Kolupaev). - 面向数据湖的 “S3 表”引擎目录,与 #103220 相同,但
INSERT现已可正常工作。#113505 (Konstantin Vedernikov). - 新增对 Snowflake Horizon 的支持。现在可以查询 Horizon catalog 背后 Iceberg 中的 Iceberg 表,也可以通过该 catalog 向 Iceberg 表写入数据。#114547 (Melvyn Peignon).
- 新增对
Puffin文件格式的支持。可将其与file、url、s3等表函数配合使用。#103936 (Konstantin Vedernikov). - 窗口函数现支持
GROUPS窗口帧模式 (SQL:2011) ,例如any(price) OVER (PARTITION BY symbol ORDER BY ts GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING)。在GROUPS窗口帧中,边界按完整的对等组计算——即ORDER BY键值相同的行集合——因此,N PRECEDING/N FOLLOWING表示当前行所在对等组之前/之后的N个对等组,而不是物理行 (ROWS) 或ORDER BY值的距离 (RANGE) 。#108653 (Nihal Z. Miaji). - 新增
mergeTreeCodecBlockCounts表函数,用于报告MergeTree表中每个分片、列和子流分别有多少压缩块使用各个 codec。#109623 (Raufs Dunamalijevs). - 新增
MultiPointGeo 数据类型,以Array(Point)存储,并纳入Geometry类型。#109951 (David Meng). - 为
HDFS存储新增_etag虚拟列。#108255 (Zhang Yifan). - 原生
ORC读取器和输出格式现支持uniontype,并将其映射为 ClickHouseVariant类型。此前,读取此类列会因Unsupported ORC type而失败,写入则会因ILLEGAL_COLUMN而失败。#110078 (Alexey Milovidov). #110085 (Alexey Milovidov). - 为文本索引以及
tokens、hasAnyTokens和hasAllTokens函数新增japanese分词器,使用 MeCab 形态分析器。字典会在运行时从服务器配置指定的位置加载,并在使用前根据 SHA-256 校验和进行验证。#111420 (Jimmy Aguilar Mena). - 为
tokens函数和MergeTree文本索引新增chinese分词器。它使用字典和隐马尔可夫模型将中文文本切分为词语 (算法参考 jieba) ,并提供coarse_grained(默认) 和fine_grained两种粒度。延续 #80174。#89945 (Amos Bird). - 为文本索引以及
tokens、hasAnyTokens和hasAllTokens函数新增icu分词器,提供与区域设置相关的 Unicode 词语分割 (包括中文、日文和泰文等语言的基于字典的词语分割) 。#109940 (Jimmy Aguilar Mena). - 为文本索引和
tokens函数新增splitByRegexp分词器。它使用正则表达式作为分隔符将输入拆分为标记,例如tokenizer = splitByRegexp('[^\p{L}\p{N}#+]+'),从而可保留C++或C#等包含特殊字符的标记,而其他分词器会将这些标记拆开。 #110002 (Jimmy Aguilar Mena). - Keeper HTTP 仪表板现包含一个 Cluster 选项卡,以拓扑图展示 Raft 成员关系,并通过颜色标示健康状况、延迟和优先级。您可以查看哪些节点健康、滞后或不可达,并直接打开领导者的仪表板。 #111655 (yanglongwei).
- 新增服务器配置节
create_union_system_log_tables,用于创建并自动维护all_...表 (例如system.all_query_log) 。这些表可查询某个系统日志表、其轮转版本和/或集群中所有副本上同名表的并集。remote、remoteSecure、cluster和clusterAllReplicas表函数现支持在末尾添加SETTINGS子句,以指定其创建的Distributed存储设置,例如clusterAllReplicas('default', system.query_log, SETTINGS skip_unavailable_shards = 1)。 #112670 (Alexey Milovidov). - 为 NATS 表引擎新增
nats_credentials设置,允许用户以内联字符串形式指定 NATS 凭据 (与.creds文件的内容格式一致) 。 #110733 (addshore). - 新增基于排序的
IEJoinJOIN 算法,适用于其ON子句包含两个连接表之间不等式比较 (<、<=、>、>=) 的 JOIN;可通过在join_algorithm设置中添加ie_join启用。支持的类型包括ALL INNER/LEFT/RIGHT/FULL JOIN和SEMI/ANTI LEFT/RIGHT JOIN。此前,此类查询会作为带筛选条件的CROSS JOIN(仅限INNER) 执行,在大型表上的速度会慢得多。 #109920 (Vladimir Cherkasov). - 新增聚合函数
gini,用于计算有限非负数值的基尼系数,支持分组聚合和分布式聚合。 #112280 (Amirreza Akhondi). #114643 (Groene AI). - 新增
HiveText输出格式,用于写入 Apache HiveLazySimpleSerDe文本。字段以\x01分隔;行以format_hive_text_rows_delimiter设置分隔 (默认值为\n) ;嵌套的Array、Map和Tuple值使用 Hive 的分隔符列表。该输出面向 Hive 默认的LazySimpleSerDe,对于嵌套值或自定义行分隔符,与 ClickHouse 的HiveText输入并不对称。 #107582 (Alexey Milovidov). - 新增对 Prometheus 指标端点中常量标记的支持:在
<prometheus>内新增<labels>节,可将配置的标记添加到每个暴露的指标中,有助于区分由同一 Prometheus 抓取的多个集群。标记值支持from_env等标准配置替换。关闭 #85969。 #111672 (Valery Petrov). - 新增
always_fetch_mutated_part设置。启用后,副本可从其他副本下载已完成变更的分片,而无需在本地执行变更操作。#113020 (Rory Shanks). - 新增聚合函数
mergedJSONPatch,用于对JSON值执行 RFC 7396 风格的合并补丁聚合,支持状态合并及用于AggregatingMergeTree。用户可使用时间戳或其他排序列作为排序键,对JSON列进行聚合以计算最新状态。#108349 (larryluogit). - 新增
aiSimilarity函数,使用嵌入模型计算两段文本的语义相似度。该函数返回[-1, 1]范围内的Nullable(Float32):1表示文本完全相同;如果任一操作数为NULL或为空,或者其嵌入失败,则返回NULL。#110777 (David Meng). - 新增
restore_table_data、restore_access_entities和restore_functions恢复设置,以精细控制恢复内容。这些设置可针对单个类别覆盖structure_only——例如,structure_only=true, restore_access_entities=true会恢复表定义和访问实体,但不恢复表数据。#102402 (Nikita Fomichev). - 数组下标运算符现支持使用整数数组作为索引:
arr[indexes]返回所有指定位置的元素,等价于arrayMap(i -> arr[i], indexes)。#108371 (folly). - 新增函数
notHas,即用于数组、映射和 JSON 的has的否定形式。当 haystack 为常量数组时,optimize_rewrite_has_to_in(默认启用) 会将notHas(constant_array, x)重写为x NOT IN constant_array,因此会通过集合查找执行,并且可像NOT IN一样利用主键索引进行裁剪。#109926 (Nihal Z. Miaji). - 函数
arrayElement(vec[n]运算符) 和arraySlice现已支持QBit数据类型:qbit[n]返回第 n 个全精度向量元素,arraySlice(qbit, offset, length)返回维度子集的投影。两者仅读取所需 stride group 的比特平面;与 stride group 边界对齐的切片会复用已存储的 stream,无需复制。这解决了 #109942。#109953 (Utkal Singh). PNG输出格式现支持动画 PNG。t列会将查询结果转换为动画,其中t的时间尺度由output_format_image_time_multiplier_seconds和output_format_image_time_divisor_seconds设置;启用output_format_image_streaming_animation后,查询生成帧时会直接写出,而非在内存中缓冲。#112846 (Alexey Milovidov).- 新增函数
aiRedact,使用 LLM provider 检测并脱敏文本中的个人身份信息 (PII) 。可指定要脱敏的类别 (例如['email', 'name']) ,或传入空数组以使用默认的 PII 类别集合。匹配的值将替换为令牌 (默认为[REDACTED]) 。#110464 (David Meng). - 新增
aiFilter函数,使用 LLM 根据自然语言条件评估文本,并返回可用于WHERE、PREWHERE和JOIN ... ON的UInt8。 #110594 (yanglongwei). PostgreSQL表引擎、postgresql表函数、PostgreSQL和MaterializedPostgreSQL数据库引擎以及PostgreSQL字典现支持 TLS/SSL 连接:可指定sslmode、证书和私钥,既可直接提供内容 (sslrootcert_pem、sslcert_pem、sslkey_pem;会像密码一样脱敏) ,也可提供路径 (sslrootcert、sslcert、sslkey;仅接受服务器配置文件中定义的命名集合提供的路径) 。 #110615 (Alexey Milovidov).- ClickHouse server 现提供内部信息端口。这是一个原生协议 TCP 监听器,会在服务器开始附加表之前启动,并仅在表’的分离操作完成后停止。在此期间,操作人员可以通过
clickhouse client连接到该端口并运行查询,例如SHOW PROCESSLIST、SELECT * FROM system.stack_trace或SYSTEM INSTRUMENT ADD 'QueryMetricLog::startQuery' SLEEP ENTRY 0.5。此外,服务器设置shutdown_wait_unfinished的默认值从 5 秒提高到 120 秒。此前的默认值小于连接轮询间隔,因此服务器可能会在关闭过程中强制退出,而非等待尚未结束的连接完成。 #110838 (Miсhael Stetsyuk). - 在 Keeper
mntr命令中引入模拟的 ZooKeeper 指标:zk_leader_uptime、zk_sum_election_time、zk_cnt_election_time、zk_sum_leader_unavailable_time、zk_cnt_leader_unavailable_time;还引入仅适用于 Keeper 的相关 leader 指标:KeeperLastLeaderElectionTime、KeeperLastLeaderUnavailableTime。 #113334 (Maxim Orlovsky). - 支持 ALTER TABLE … MODIFY PROJECTION,在不重建现有投影的情况下修改其投影级设置 (例如 index_granularity) 。新设置会在合并过程中延迟生效。 #113343 (Diego Gomes Tomé).
- 在
system.mutations中新增finish_time列,用于记录变更完成的时间。未完成的变更以及完成时间未知的变更均报告为零值。 #113474 (Nikita Mikhaylov). - 在
experimental和beta之间新增private preview功能层级,因此功能层级的顺序现为experimental < private preview < beta < production。服务器设置allow_feature_tier新增一个级别:0允许所有层级,1排除 experimental,2还会排除 private preview,3则仅允许 production 设置。此前将allow_feature_tier = 2固定为仅允许 production 设置的配置现在必须改用3。关闭 #113481。 #113581 (Groene AI). - 内置 Web SQL UI (
/play) 现已支持无需编辑查询即可按列排序结果、按列值过滤,并分页浏览。每个列标题中都会显示排序箭头和过滤输入框;选中单元格后,会提供适用于其值的比较方式;对于无法在一个屏幕内显示的结果,下方会显示可调整每页大小的分页器。所有操作均由服务器使用order、filter、limit和page查询构建设置执行,因此处理的是整个结果集,而非仅处理当前显示的行;所选的排序、过滤器和页面会包含在页面 URL 中,因此共享链接可复现该结果。#115540 (Alexey Milovidov) 。 chdigv26.8.1:ratatui、tmux 窗格、tmuxinator 会话、彩色日志共享、功能导览。#115216 (Azat Khuzhin) 。
Experimental 功能
- 新增 Experimental Cascades 成本型优化器,用于分布式查询计划;同时设置
enable_cascades_optimizer = 1和make_distributed_plan = 1即可启用。它会根据估算成本,在 shuffle、广播、副本和本地 join 策略,两阶段、shuffle 和本地聚合,两阶段分布式 top-N,以及并行和副本读取之间进行选择,并按需插入 exchange 运算符。 #86353 (Alexander Gololobov). - 新增 Experimental
MergeTree设置enable_adaptive_codec_selection。启用后,合并和变更会针对使用默认 codec 的列,为每个块选择输出最小的 codec。 #111834 (Raufs Dunamalijevs). * 自适应 codec 选择现在对每个块中的每种候选 codec 最多压缩一次,而不再测量所有候选 codec 后重新压缩胜出的 codec。 #113511 (Raufs Dunamalijevs). clickhouse二进制文件现可构建为 WebAssembly (wasm64,通过 Emscripten) ,clickhouse local可在 Node.js ≥ 24 和浏览器中运行查询,包括查询MergeTree表。新增的Build (wasm64)CI 作业固定了构建及 Node.js 执行路径 (浏览器路径尚未纳入 CI 覆盖范围) ,并将 WebAssembly 模块作为制品提供。 #113404 (Alexey Milovidov).parallel_replicas_plan_based现在会通过优化查询计划来确定本地/远程边界;无需parallel_replicas_allow_view_over_mergetree,即可并行执行针对包含UNION的视图的查询;对于IN (subquery)查询,会回退到本地执行计划而非失败;现在还会分发符合条件的JOIN(INNER、LEFT、RIGHT,包括SEMI/ANTI) 。 #111063 (Igor Nikonov). #112268 (Igor Nikonov). #112443 (Igor Nikonov).- 分布式查询计划 (
make_distributed_plan) 现还支持在规划阶段已知数据源不会产生任何行的查询,例如读取空MergeTree表。 #111941 (Groene AI). - 新增默认禁用的
use_projection_index_in_read_pools设置。启用后,完全被 projection 或跳过索引过滤的范围会在MergeTree读取池中、为其创建读取任务之前被丢弃,而不是在读取期间逐粒度跳过。这样可避免为不会读取的数据创建读取任务并设置读取器。 #110291 (Nikolai Kochetov). #112296 (Anton Popov). - PromQL:修复了对不带标签的瞬时向量执行操作时的问题,例如
vector(1) + vector(2)、topk(1, vector(1))、label_replace(vector(1), ...)以及带有on()的二元运算符,这些操作此前会因类型错误而失败。 #111872 (Valery Petrov). - PromQL:实现了
changes和resets函数。 #112352 (Valery Petrov). - 报告导致分布式查询 (
make_distributed_plan = 1) 被取消的错误,而非仅报告QUERY_WAS_CANCELLED。此前,失败工作任务的实际错误仅会显示在服务器日志中。#112590 (Alexander Gololobov). - 当
make_distributed_plan = 1时,ClickHouse 现在会禁用分布式查询计划暂不支持的功能,而不是让其在后续执行中失败。关闭 #109476。#112463 (alesapin). - 分布式查询计划 (
make_distributed_plan) 现对ORDER BY ... LIMIT k查询使用延迟物化。#113111 (Shankar Iyer). - 分布式查询计划 (
make_distributed_plan) 现支持不含分区的窗口函数 (OVER (ORDER BY ...)) 。此前,任何包含窗口函数的查询都会失败,因为无法将WindowStep序列化以供远程执行;目前仍会拒绝使用PARTITION BY的窗口函数。#109802 (Vighnesh Pathrikar). - 新增设置
use_query_condition_cache_for_top_k,用于控制查询条件缓存是否应用于ORDER BY ... LIMIT n(TopK) 查询。#111492 (Alexey Milovidov)。对于使用ORDER BY <column> LIMIT n(TopK) 优化的查询,查询条件缓存 现默认启用。可通过设置use_query_condition_cache_for_top_k将其关闭。#114539 (Alexey Milovidov). - 通过设置
kafka_partition_shard_num和kafka_shard_count,为StorageKafka2新增静态分区到分片的亲和性,使多个 ClickHouse 分片能够以确定性方式消费互不重叠的 Kafka 分区子集。#108886 (johnjing). - 强化 Experimental AI 函数:默认拒绝指向远程主机的不安全 (
http) 端点 (新增设置ai_function_allow_insecure_endpoint) ;默认限制每个查询的出站 API 调用次数 (ai_function_max_api_calls_per_query的默认值现为1000) ;并对写入日志的提供商错误响应进行清理。#111286 (George Larionov). - PromQL:分位数级别超出 [0, 1] 范围时,
quantile现会像 Prometheus 一样返回 -Inf/+Inf/NaN,而不是抛出错误;histogram_quantile现会像 Prometheus 一样忽略缺少le标签或该标签无法解析的输入序列。#111871 (Valery Petrov). - 允许在 TimeSeries 表中使用多组件标识符。#112799 (Vitaly Baranov).
- 新增
TimeSeries设置samples_index_granularity和tags_inner_granularity,用于控制内部表的索引粒度。#113075 (Vitaly Baranov). - PromQL:新增
deriv函数,并修复了其底层聚合函数在毫秒分辨率时间戳下返回值小 1000 倍的问题。#112360 (Valery Petrov). - PromQL:拒绝字符串中无效的跨分隔符转义和无效的 Unicode 代理码点。#113587 (Minh Vu). #113203 (Minh Vu).
- PromQL:使用无穷大除数进行取模运算时保留有限值。#113746 (Minh Vu).
- PromQL:日期/时间函数
hour、minute、month、year、day_of_week、day_of_month、day_of_year和days_in_month现可不带参数调用,默认使用与 Prometheus 相同的vector(time())。#111869 (Valery Petrov). - PromQL 现已支持 Prometheus HTTP API 的
lookback_delta参数,可用于即时查询和范围查询。#113971 (Minh Vu). - 分布式查询计划 (
make_distributed_plan) 现支持IN (subquery),无需将其改写为JOIN:集合仅在发起节点构建一次,其值会随工作节点任务一同传输。已移除强制性的rewrite_in_to_join覆盖;仍可通过显式设置启用改写。#113826 (Alexander Gololobov). - 流式查询支持水印。#106169 (Mikhail Artemenko).
- 为 Experimental
ReaderExecutor读取路径添加了读取穿透式文件系统缓存 (use_reader_executor,默认禁用) 。#110029 (Sema Checherinda). - PromQL:实现了
clamp、clamp_min、clamp_max和round函数。#111870 (Valery Petrov). - 通过 Prometheus 远程写入端点正确收集插入统计信息和查询。#112825 (James Cunningham).
- PromQL 聚合运算符现可接受混合大小写,与 Prometheus 保持一致。#114076 (Minh Vu).
- TimeSeries:将所有标签存储在
tags列中。#114300 (Vitaly Baranov). - 启用
parallel_replicas_plan_based时,将按序读取优化应用于ORDER BY查询:排序操作现会下发至副本,并在发起节点合并,因此每个副本都会按排序键顺序读取。还修复了启用此设置时,对非主键列执行ORDER BY出现的Unknown function __topKFilter问题。#114315 (Igor Nikonov). - 拒绝普通带引号 PromQL 字符串中的字面换行符。#114381 (Minh Vu).
- 修复
make_distributed_plan部分聚合策略中的重复GROUP BY键,并允许该策略用于分布式读取上的聚合。#114523 (Alexander Gololobov). - 当 WHATIF 违反假设索引类型的允许列表时抛出异常。#114646 (Yarik Briukhovetskyi).
- 恢复向量搜索中量化子列的读取功能 (于 26.7 引入) 。#114763 (Shankar Iyer).
- Experimental
TimeSeries表引擎不再为样本内部表中自动创建的value列应用Gorilla编解码器;这些列现默认使用CODEC(ZSTD(1))。显式声明的列会保留用户指定的编解码器。timestamp列的默认设置保持不变 (CODEC(DoubleDelta, ZSTD(1))) 。#114790 (Nikita Mikhaylov). - 分布式查询计划查询 (
make_distributed_plan) 现会在达到LIMIT时停止上游阶段,而不再计算完整结果后丢弃多余部分。#114806 (Alexander Gololobov). - 在 Experimental
ReaderExecutor读取路径中新增用户态页缓存层 (use_reader_executor,默认关闭) 。发生缓存未命中时,执行器会填充用户态页缓存,并以零拷贝方式为后续读取提供数据。#114890 (Sema Checherinda). - 支持在通过
make_distributed_plan = 1执行的查询中使用ROLLUP、CUBE、GROUPING SETS和grouping函数。#114950 (Alexander Gololobov). - 修复 PromQL 查询在范围选择器中使用
offset时出现的错误Illegal type Decimal(18, 0) of argument of function toIntervalNanosecond,例如rate(m[2m] offset 5m)。#114997 (Nikita Mikhaylov). - 启用 Experimental
make_distributed_plan和enable_cascades_optimizer时,过大的distributed_plan_workers_num不再导致服务器因std::length_error而中止。现在会以INVALID_SETTING_VALUE拒绝此类节点数量。#115398 (Groene AI). - 支持 Cascades 优化器构建的分布式查询计划中的
GROUPING SETS聚合 (make_distributed_plan = 1, enable_cascades_optimizer = 1) 。#115426 (Alexander Gololobov). TimeSeries表现可维护一个”最近样本”表:当新引擎设置recent_samples_ttl_seconds为非零值时,引擎会创建样本表的带生存时间 (TTL) 副本 (按recent_samples_partition_by分区,默认按天) ,并在每次插入时写入数据;时间范围落在 TTL 窗口内的 PromQL 查询会自动从该表读取,使大型表上的告警/记录规则和短时间范围仪表盘快数倍。可通过新的查询级别设置time_series_prefer_recent_samples_table禁用此优先选项。#115441 (Nikita Mikhaylov).- 实现从 TimeSeries 执行 SELECT 查询。#115622 (Vitaly Baranov).
- 为
TimeSeries表实现 Prometheus HTTP API 的/api/v1/series端点:match[]系列选择器 (重复值取并集) 、可选的start/end时间范围,以及可选的limit参数。#115676 (Nikita Mikhaylov). - 分布式查询计划 (
make_distributed_plan) 现在会在满足LIMIT后及时停止空闲的上游阶段:空闲的 exchange sink 会在收到NoMoreDataNeeded后立即读取该信号,而空闲的 exchange source 会检测到其输出已关闭,并将停止信号转发至上游。此前,这类阶段会持续读取和计算无人消费的数据。#115690 (Alexander Gololobov). - 启用
parallel_replicas_plan_based时,自动并行副本现在可以收集运行时统计信息,并为受支持的查询启用并行副本。#115788 (Igor Nikonov). - 将 TimeSeries 表的外部近期样本表注册为引用依赖项。#115944 (Groene AI).
性能提升
- 面向并行
GROUP BY的新自适应算法 (由设置enable_adaptive_aggregator控制,默认启用) :每个线程先在各自的哈希表中聚合,直至该表包含adaptive_aggregator_freeze_threshold个键后将其冻结。这样,频繁出现的键可持续更新驻留在缓存中的小型表,无需协调;而罕见键则按哈希值路由至各 bucket 的积压队列,并在 bucket 并行合并过程中恰好聚合一次。#111459 (Nihal Z. Miaji). - 通过在同一表的各个数据分区片段之间共享从架构派生的每个分区片段元数据 (列列表、列描述、序列化方式和列子流) ,而非将其复制到每个分区片段中,降低包含大量数据分区片段的
MergeTree表的内存使用量。对于包含许多小型数据分区片段的宽表,效果最为显著。#109816 (Raúl Marín). - 通过在聚合期间维护有界堆,剪除不可能出现在结果中的分组,从而优化
GROUP BY ... ORDER BY ... LIMIT和GROUP BY ... LIMIT查询,显著降低高基数分组的内存使用量和执行时间。由enable_group_by_top_k_optimization设置控制。基于 Dmitriy Terenichev 的初始实现 (#78553) 。#96630 (Konstantin Bogdanov). - 减小单个
String聚合键的哈希表单元大小,提升以字符串为主的GROUP BY工作负载性能。新的enable_packed_string_keys_in_aggregation设置默认启用;禁用该设置或将compatibility设为低于26.8,会恢复旧版StringHashTable方法;对于键长度超过 11 字节的极低基数聚合,该方法可能仍然更快。#110573 (Harikrishnan Prabakaran). #112089 (Harikrishnan Prabakaran). - 使用默认启用的新设置
enable_parallel_single_level_merge,并行执行单层聚合哈希表的最终合并。这可加速每线程哈希表仍低于双层阈值、但合并操作占据主要运行时间的GROUP BY查询。#110395 (Nihal Z. Miaji). - 当输入 stream 按
DISTINCT列的前缀排序时,提升DISTINCT的性能,例如SELECT DISTINCT a, b FROM table ORDER BY a。此类查询的运行速度最高可提升 2.4 倍。#110170 (Nihal Z. Miaji). - 通过将每个分区的行保留在单个 stream 中,加速并降低分区
MergeTree表上DISTINCT查询的内存使用量,使每个 stream 的初步DISTINCT操作处理互不重叠的一组键,而非让同一组键出现在多个初步DISTINCT操作中。当分区表达式是DISTINCT列的确定性函数时,此优化适用,并受基于分区数量和倾斜度的成本启发式算法控制 (可通过设置force_distinct_partitions_independently切换,默认禁用) 。同样的分区间互不重叠特性会经由Expression、Filter和ARRAY JOIN步骤传播至最终的DISTINCT、LIMIT BY和GROUP BY消费者,使其也能跳过合并。由新设置allow_distinct_partitions_independently(默认启用) 和max_number_of_partitions_for_independent_distinct控制,用于调整启发式算法。#108326 (Nihal Z. Miaji). - 优化了无键聚合场景下的
uniq、uniqExact和uniqHLL12函数。#110150 (Anton Popov). - 当列块完全采用字典编码时,
ParquetV3 读取器现在可针对等值和IN条件,除利用 min/max 统计信息和布隆过滤器外,还可利用字典页跳过整个行组。由新设置input_format_parquet_dictionary_filter_push_down控制。#106952 (Alexey Milovidov). #110567 (Alexey Milovidov). - 从对象存储读取
Parquet文件 (包括Iceberg表) 时支持延迟物化:对于ORDER BY ... LIMIT n查询,仅会为通过LIMIT保留的n行读取排序和过滤所不需要的列。在S3上的一个 200 MBParquet文件中,SELECT k, s ... ORDER BY k DESC LIMIT 10仅读取 3.3 MB,而非 171 MB (I/O 减少 51 倍,速度提升 8 倍) 。由新设置query_plan_optimize_lazy_materialization_for_object_storage控制 (默认启用,且还需启用query_plan_optimize_lazy_materialization) 。#110970 (Alexey Milovidov). *ORDER BY ... LIMIT n查询的延迟物化 (#110970) 现在也适用于通过file表函数和File表引擎读取的本地 Parquet 文件:仅会为通过LIMIT保留的n行读取排序和过滤所不需要的列。如果文件在两次读取之间被修改,则在第二次读取保留的文件时会以新的FILE_CHANGED_DURING_READ错误安全地失败。由新设置query_plan_optimize_lazy_materialization_for_file控制 (默认启用) 。此外,还修复了在请求的子列 (例如JSON列的子列) 被延迟读取时,对象存储的延迟物化因Not found column or subcolumn ... in block而失败的问题。#114262 (Alexey Milovidov). - 当表当前的活动数据大小与写入块大小之和不超过新设置
materialize_statistics_on_insert_max_table_size(默认值为 25 GiB) 时,现在默认会在INSERT时物化列统计信息;该检查针对每个写入块执行,因此首次向空表批量加载数据时,仍可能为每个写入块物化统计信息。这可为基于成本的 join 优化器提供新加载维度表的准确估算,并避免异常的 join 顺序 (例如,TPC-H Q5 和 Q8 在缩放因子为 40 时不再超时) ;而规模较大的既有事实表仍会在合并期间物化统计信息。#109454 (Alexey Milovidov). - 通过让每个分区使用独立 stream 读取,并按分区计算窗口函数,提升分区
MergeTree表上窗口函数的性能,避免在窗口排序前通常需要通过哈希重分布将每一行重新分配到各线程。仅当表分区表达式是窗口PARTITION BY列的确定性函数时适用,并受与按分区GROUP BY/DISTINCT相同的成本启发式规则控制 (相对于max_threads而言分区数量足够多,且不存在占主导地位的分区) 。由新设置allow_window_partitions_independently(默认启用) 、force_window_partitions_independently和max_number_of_partitions_for_independent_window控制。#114783 (Nihal Z. Miaji). - 通过将最终归档直接流式写入目标文件,而非在数据分片提交期间在内存中保留第二个完整副本,降低写入打包分片时的内存使用量。#111995 (Alexey Milovidov).
- 新增
join_algorithm值parallel_full_sorting_merge:对于哈希兼容的等值 JOIN,它会根据连接键的哈希值,将全排序归并 JOIN 划分为相互独立、可在所有线程上运行的分片归并 JOIN。在实现并行化的同时,保留归并 JOIN 较低的流式内存占用 (基准测试中,比parallel_hash快约 2.4 倍,内存占用少约 3.3 倍) 。ASOFJOIN 会回退为单个full_sorting_merge;哈希不兼容的键类型 (浮点型、JSON、Object、Dynamic) 仅跳过哈希分散重写,并且在启用query_plan_join_shard_by_pk_ranges时,仍可在源端按主键范围分片。结果不保证有序。#109005 (Alexey Milovidov). - 为
Parquet读取器新增行组和页面级别的 GeoParquet 空间剪枝。行组剪枝会跳过边界框与查询几何对象不重叠的整个行组。页面级剪枝使用covering.bbox列索引跳过行组中的无关页面,空间谓词下推现在也会在读取Parquet行时生效。#104435 (Vasily Chekalkin). - Parquet 过滤器下推 (行组剪枝和列索引) 现支持更多类型转换:
DateTime64(x) <-> DateTime64(y)、Decimal(x) <-> Decimal(y)、Float32 <-> Float64。#110457 (Michael Kolupaev). - 当标记范围因主键索引或跳过索引等原因而碎片化时,减少远程磁盘上的重复读取请求。#113584 (Anton Popov).
- 对于聚簇列 (例如按主键排序的列) 上的
IN操作,通过复用前一行相同值的结果来加快执行速度。#114853 (Nikita Mikhaylov). - 不带
GROUP BY键的聚合不再将单行输出扇出到max_threads个流,因此,对于在此类聚合后仍有后续执行步骤的查询,可使用规模更小的管道 (需要创建、调度和分析的处理器更少) ,且不会损失并行度。#115170 (Nikita Mikhaylov). - Keeper 现在读取更新日志条目时的锁竞争更少:追赶读取会在共享锁下进行规划,并在无锁状态下执行磁盘 I/O;此外,跟随者追赶和提交路径均可在后台线程池中预解码条目,从而减少主节点上冗余的磁盘读取和 CPU 解码。#108473 (Antonio Andelic).
- 通过并发读取多个更新日志文件而非串行读取,加快 Keeper 启动速度;可通过新设置
log_startup_read_max_streams和log_startup_read_buffer_size控制。#109881 (Antonio Andelic). - 为
system.metric_log新增bucketed架构类型,使用包含 128 个桶的分桶Map序列化方式,将所有指标存储在单个Map(Enum16(...), Int64)列中,并为每个指标提供一个ALIAS列以保持兼容性:该表仅包含少数几列,而非数千列;不存储零值;读取单个指标时仅需读取 128 个桶中的一个。此外,具有Enum键的Map现在可通过枚举值的字符串名称进行索引,例如map['name']。#115380 (Alexey Milovidov). - 新增查询计划优化:将可减少数据量的函数 (
length、lengthUTF8、empty、notEmpty) 下推至Sorting和Filter步骤之前,以固定大小的结果替代较宽的String/FixedString参数,从而避免排序时缓冲或过滤时复制这些参数。由默认启用的新设置query_plan_push_down_volume_reducing_functions控制。#106199 (Peng)。 - 默认启用
read_in_order_use_virtual_row。对于拥有许多 parts 的表,按主键顺序读取时 (例如ORDER BY primary_key LIMIT n) ,仅会读取实际可能对结果有贡献的 parts,以及最多包含max_threads个 parts 的预读窗口以保持并行读取,从而显著降低峰值内存占用。#106215 (Alexey Milovidov)。 - 不含聚合函数的聚合查询现在会对受支持的键类型使用基于
HashSet的方法,而非HashMap。实测最高可加速 1.8 倍。#108862 (Nikita Taranov)。 - 当估计探测端较小时,避免
JOIN运行时过滤器的开销。阈值由新设置join_runtime_filter_min_probe_rows控制,默认值为1000。#104860 (Vladimir Cherkasov)。 - 使用
nullIf(key, sentinel) = const等谓词的查询现在可以利用主键、分区和跳数索引进行裁剪。#107308 (Aditya Kumar)。 - 新增
jemalloc_merge_tree_arenas服务器设置,用于控制MergeTreepart 和表元数据的专用 jemalloc Arena。在多核服务器上,每 CPU 一个的池可减少并发合并之间的 allocator 锁争用;专用 Arena 现在也仅保存长期存活的元数据。#109490 (Raúl Marín)。 - 通过使用 SSSE3
pshufb对短偏移量的重叠复制进行向量化,加快了x86_64上匹配偏移量较小的列 (如固定宽度整数列) 的 ZSTD 解压缩。例如,在 AMD Zen 5 上,UInt64列的解压缩速度最高可提升约 1.2 倍。#110909 (Konstantin Bogdanov)。 - 通过像
uniqExact一样使用 CRC32 哈希,并内联逐行插入操作,将数值类型的groupUniqArray速度最高提升 3 倍。#110917 (Manuel)。 - 使用
NONE编解码器时,estimateCompressionRatio的速度更快。#111107 (Raufs Dunamalijevs)。 - 将默认的
max_snapshot_commit_thread_pool_size降至16,以匹配backup_threads,从而减少为拥有许多 parts 的表提交快照时的 CFS 限流。#111417 (Han Fei)。 - 减少为拥有大量文件的表提交快照时的 CPU 使用量。#112297 (Han Fei)。
- 去重被禁用时,跳过 async-insert 去重哈希预热。#111549 (Sema Checherinda)。
ON条件始终为 false 的JOIN(例如ON 1 = 2、ON NULL或a.t = 'A' AND a.t = 'B') 不再读取不参与结果的一侧。由query_plan_short_circuit_constant_false_join设置控制 (默认启用) 。#110234 (Groene AI).- 解析当前 manifest 文件时预取下一个 manifest 文件,使 I/O 与 CPU 工作重叠,从而加快
Iceberg表的读取速度。#108543 (Asya Shneerson). - 使用
FINAL、按主键顺序读取且LIMIT较小的查询不再使用split_intersecting_parts_ranges_into_layers_final。#110431 (Nikolai Kochetov). - 当右侧包含
NULL连接键或被ON表达式过滤掉的行时,通过避免重建 null-map,提升使用parallel_hash算法的RIGHT和FULL JOIN性能。#111258 (Hechem Selmi). - 修复二次复杂度问题,提升
countSubstringsCaseInsensitiveUTF8的速度;此前,在具有大量匹配项的数 MB haystack 上,该函数可能需要执行数分钟。#112003 (Groene AI). - 实验性
TimeSeries引擎的 Prometheus 查询 API (/api/v1/query、/api/v1/query_range) 现以并行方式执行查询,而非使用单线程。#112108 (Nikita Mikhaylov). TimeSeries样本内部表中自动创建的timestamp和value列,现在默认分别使用CODEC(DoubleDelta, ZSTD(1))和CODEC(Gorilla, ZSTD(1))。#112110 (Nikita Mikhaylov).- 修复
system.query_log摄取的性能回归。构建Settings和asynchronous_read_countersmap 列的速度约比之前慢六倍,可能导致在记录大量查询且变更了许多设置的服务器上,SYSTEM FLUSH LOGS query_log超过 180 秒超时时间。关闭 #112191。#112210 (Groene AI). - 提升
ON部分包含多个OR析取条件的 RIGHT 和 FULL 哈希 JOIN,以及带有残余 (不等式) 条件的 RIGHT/FULL JOIN 的性能。#111590 (Hechem Selmi). - 不加载解锁路径不会使用的各数据分片元数据,从而降低
UNLOCK SNAPSHOT的内存使用,避免 parts 数量极大的快照发生内存不足。#111849 (Julia Kartseva). - 在异步
INSERT刷新期间恢复对JSON列动态路径的内存预分配,避免追加批量行时反复重新分配内存。#112222 (Groene AI). - 在合并期间重新启用
TTL ... GROUP BY聚合的连续键优化。该路径此前被意外禁用,结果虽仍然正确,但合并执行了不必要的额外工作。#112314 (Groene AI). - 启用
input_format_binary_decode_types_in_binary_format时,加快从Native和RowBinary等二进制编码格式读取Nested列的速度;对于格式错误的嵌套Tuple类型名称,报告语法错误而非花费指数级时间解析。 #112560 (Alexey Milovidov). - 提升对包含大量动态变体或 JSON 路径的
Dynamic和Object列进行块压缩和合并时的性能。 #110583 (Christoph Viebig). - 加快 128 位和 256 位类型 (
Int128、UInt128、Int256、UInt256、Decimal128、Decimal256) 的min和max计算。宽整数最高快 1.8 倍,宽小数最高快 3.4 倍。 #111965 (Manuel). - 默认启用 (并提升至 beta) 两项磁盘功能:1)
packed_skip_index_max_bytes = '1M':现在每个 part 中大小不超过 1 MiB 的跳过索引子流会写入单个skp_idx.packed归档文件,从而减少对象存储中的对象数量和写请求。兼容性:仅影响新写入的 parts,且它们在旧版本中仍完全可读;26.6 之前的版本不会使用压缩索引进行剪枝 (将其视为未 materialized) 。将packed_skip_index_max_bytes = 0设为可保留每文件独立布局。2)compute_exact_num_defaults_for_sparse_columns加上optimize_trivial_count_with_sparsity_filter:精确的逐列num_defaults计数器会被持久化,并在谓词将行区分为默认值和非默认值时,用于无需扫描数据即可计算SELECT count() FROM t WHERE <pred>。兼容性:旧版本会忽略serialization.json中的exact_num_defaults标志,因此降级后 parts 仍完全可读;计数重写仅适用于带有精确计数器的 parts,因此在包含混合 parts 的表中结果仍然正确。 #111816 (Raúl Marín). - 为文本索引中不存在的词元添加可选缓存。 #112742 (Rory Shanks).
- 修复复制元素在共享数据中包含
JSON值的Array时的二次内存重分配问题,例如传递给聚合函数的常量Array(JSON)。这类查询复制的字节数会随行数呈二次增长。 #112897 (Groene AI). - 当点参数为类型为
Point的完整键列 (或包含两个数值元素的其他Tuple) 时,pointInPolygon可使用主键索引,例如对于按coord排序的表,可使用pointInPolygon(coord, [...])。此前仅会分析使用两个标量键列的pointInPolygon((x, y), [...])形式。关闭 #54805。 #112956 (Alexey Milovidov). - 对于
TTLDrop合并,完全跳过数据读取步骤以减少内存使用,尤其是读取和预取缓冲区的内存占用。关闭 #105639。 #105859 (Pavel Kruglov). - 读取备份元数据时,将文件条目移入内存映射表而非复制,以减少内存分配。 #111718 (Julia Kartseva).
- 当文本索引表达式中包含空字符串比较 (如
arrayFilter(s -> s != '', ...)) 时使用该索引,即使optimize_empty_string_comparisons = 1将其改写为notEmpty也不例外。关闭 #111788。#112115 (Jimmy Aguilar Mena). - 恢复
lightweight DELETE后的查询条件缓存剪枝:对于曾执行过lightweight DELETE的表,重复执行选择性查询时不再回退到读取所有标记。#112947 (Nikita Fomichev). - 启用
enable_lazy_columns_replication后,高阶函数不再为每个数组元素物理复制捕获的列,从而减少捕获大型列的 lambda 表达式的内存占用和复制时间。#111581 (Diego Gomes Tomé). - 修复了 26.5 引入的性能回归:对
Dynamic键和JSON路径子列执行GROUP BY时性能降低约 1.5 倍。#112316 (Utkal Singh). text_index_posting_list_apply_mode现默认设为lazy。对于设置了posting_list_codec的文本索引,文本索引查询会使用游标按需以压缩块粒度解码倒排列表,而不再急切地将其物化为位图。#113521 (Anton Popov).- 加速
TimeSeries表上的 PromQL 查询:连续行具有相同序列 ID 时,timeSeriesIdToGroup现会复用前一行的组,从而跳过逐行 ID 序列化和哈希查找。#113580 (Nikita Mikhaylov). - PromQL 聚合运算符
topk、bottomk和limitk现采用内存有界的流式并行执行计划,而非将所有序列收集到单行中。此前因MEMORY_LIMIT_EXCEEDED失败的高基数指标查询,现在可在有限内存内运行。#113656 (Nikita Mikhaylov). #114409 (Alexey Milovidov). - 加速 256 位整数 (
Int256、UInt256和Decimal256) 的除法运算,影响intDiv、modulo、Decimal256算术运算及这些类型到文本的转换。#112477 (Konstantin Bogdanov). - 通过在必要的转换过程中复用已解析的子列元数据,提升
MergeTree读取JSON子列的性能。#113008 (Rory Shanks). - 加速使用
sparseGrams分词器构建文本跳过索引和基于布隆过滤器的跳过索引。#110541 (UnamedRus). - 创建快照现使用专用线程池,因此不再会因高并发
BACKUP而资源不足。#113509 (Han Fei). - 对多个计划步骤共享的 PromQL 子表达式 (
topk/bottomk/limitk的操作数以及or的左侧) 只计算一次,而非两次:现在由 PromQL 生成的 SQL 会物化共享子查询。这消除了对样本表的重复扫描;topk配合rate时,冷查询速度提升约 2 倍,kubernetes-mixin 规则查询性能提升 10%–29%。#113772 (Nikita Mikhaylov). - 现在可以通过
enable_function_early_short_circuit设置,在分析阶段为内置and和or启用提前短路折叠。在保留常规类型推断和语义验证的同时,可跳过执行不会被使用的单行count()标量子查询。解决 #83017。#83505 (fhw12345). - 在
PREWHERE条件排序中同时考虑 I/O 成本和选择性。修复了 #101275 之后引入的某些场景下PREWHERE执行性能回退的问题。属于 #110462 的一部分。#110695 (Pavel Kruglov). - 通过避免在 blocked Myers 代码路径中逐行进行堆内存分配,提升 ARM 平台上中等长度字符串的
levenshteinDistance(及editDistance) 性能。#108185 (Groene AI). - 新增
merge_use_batch_sorting_queueMergeTree设置,可选择在普通MergeTree合并中使用批量排序队列,从而降低排序归并成本较高的合并工作负载的 CPU 用量和挂钟时间。#108468 (Rory Shanks). - 新增
merge_tree_min_bytes_per_read_stream设置,以减少高核心数服务器上普通本地无序窄列MergeTree扫描中过多的读取流和管道开销。#109035 (Jiebin Sun). - 将函数
toStartOfInterval(别名time_bucket、date_bin) 在SECOND、MINUTE和HOUR时间间隔上的性能最高提升 5 倍。#109729 (Manuel). - 当通信双方的协议修订版本均为 54489 或更高时,原生协议现在会将
String列作为独立的累计字节偏移量流发送 (其偏移量布局与Array相同) ,随后发送拼接后的数据,而不再使用逐值 varint 长度前缀。客户端因此可通过精确预分配缓冲区并执行一次批量复制来读取String列,速度约为逐值布局的 4 倍。旧版客户端和服务器不受影响:该布局通过协议修订版本协商。通过新设置output_format_native_write_string_with_size_stream/input_format_native_read_string_with_size_stream,Native和Buffers格式也可使用相同布局 (默认关闭,因此格式仍保持可移植性) 。#110320 (vahid-sohrabloo). - 当 iceberg_metadata_log_level 低于调用点阈值时,避免对 Iceberg manifest 条目进行不必要的 JSON 序列化。#110437 (Andy Bradshaw).
- 在稀疏场景下,将全排序归并连接的性能最高提升 1.5 至 3 倍。#111200 (Vladimir Cherkasov).
- 提升浮点列 minmax 和基本列统计信息的效率。#111221 (Christoph Viebig).
- 当探测端和构建端的 join 键类型不一致时 (例如,探测键为 Nullable 而构建键为非 Nullable) ,启用
join_runtime_filter_from_fixed_hash_table。#111244 (Hechem Selmi). COUNT()查询可直接从文本索引的基数元数据返回结果。#111494 (Elmi Ahmadov).- 避免为每个值重建
ColumnDynamic,从而加快存储在共享数据中的 JSON/Object列值的逐行哈希计算 (例如,对 JSON 列执行uniq/uniqExact,以及使用基于哈希的GROUP BY/DISTINCT键时) 。哈希值保持不变。#111501 (Valery Petrov). - 启用 enable_lazy_columns_replication 时,使用非常量模式的
mapContainsKeyLike、mapContainsValueLike、mapExtractKeyLike和mapExtractValueLike函数可减少内存和时间开销。模式不再在捕获时为每个 map 条目立即复制,而是推迟到内部 lambda 执行时再复制,并可更早释放,因此峰值时会少一份展开后的模式副本。#111749 (Diego Gomes Tomé). - 加快路径存储在共享数据中的
JSON列的排序及其他基于比较的操作。此前,每次值比较都会物化一个临时Dynamic列,并对两侧执行完整的二进制反序列化,导致对此类列执行ORDER BY的速度异常缓慢。#111894 (Groene AI). clickhouse-client不再在每次查询前 Ping 服务器,从而省去每次查询的一次网络往返。也不再仅因服务器响应 Ping 过慢而重新建立连接——这会悄然开启新会话,并丢失临时表、当前数据库和会话设置。#111990 (Alexey Milovidov).- 更合理地使用传递条件优化:现在,传递性生成的附加过滤器仅用于无法应用完整过滤器的索引分析。请参阅
optimize_and_compare_chain设置。#112076 (Yarik Briukhovetskyi). - 新增两个设置
shrink_over_allocated_columns_min_waste_ratio和shrink_over_allocated_columns_min_waste_bytes,使 INSERT 操作可在物化和写入分片前缩减过度分配的列 (可变长度列按 2 的幂扩容,导致其预留内存超过已用内存) ,从而降低峰值内存占用。默认禁用。.#112161 (Pavel Kruglov). - 查询计划序列化后,不再丢失
ARRAY JOIN的延迟列复制。使用serialize_query_plan = 1时,执行远程计划片段的节点过去会忽略enable_lazy_columns_replication,始终实体化每个复制副本,尽管该设置默认已启用。 #112330 (Groene AI). - 将
Decimal值格式化为文本的速度大幅提升——对于标度较大的Decimal256,最高可提升 190 倍;对于Decimal64,约提升 1.6 倍。在配备 AVX-512 IFMA 的处理器上,将 64 位整数转换为文本的速度约提升 1.4 倍。还修复了toDecimalString的舍入问题,此前会丢失从小数部分产生的进位:toDecimalString(toDecimal64('9.995', 3), 2)过去返回9.00,现在返回10.00。 #112457 (Konstantin Bogdanov). - 当
WHERE等值条件的操作数类型不同但具有共同超类型 (例如Int32和Nullable(Int32)) 时,现在会将该条件合并到JOIN条件中。这使得 CROSS JOIN 可以转换为 INNER JOIN。 #112630 (Hechem Selmi). - 对包含大量删除文件的 Iceberg 表的查询现在启动更快。ClickHouse 会并发读取和解码删除 manifest 文件,而非逐个处理,因此存储读取可以重叠进行。新设置
iceberg_delete_manifest_decode_concurrency(默认值为4) 控制同时解码的文件数。 #112679 (Asya Shneerson). - 异步日志现在使用有界无锁队列:写入日志消息的线程不会因互斥锁而阻塞,也不会唤醒日志线程。 #112803 (Alexey Milovidov).
- 常量向量的
randomHadamardTransform现在只计算一次,而非每行计算一次。这可加速向量搜索查询:此类查询会先使用randomHadamardTransform旋转查询向量,再将其与QBit列进行比较。 #112921 (Alexey Milovidov). - 恢复了在对主键列使用
IN (subquery)过滤的单个变更中,各数据分片任务之间的集合共享。enable_sharing_sets_for_mutations默认开启,但为主键分析构建的集合此前不再参与共享缓存,因此具有 N 个分片的表会将同一集合实体化 N 次。 #112941 (Groene AI). - 修复了对结构不同的多个表上的
Merge表执行 JOIN 时,查询计划具有三次复杂度的问题。此类查询此前可能在查询计划阶段耗时数分钟,且不响应max_execution_time或KILL QUERY。 #113140 (Alexey Milovidov). S3客户端的存储桶区域缓存现在也适用于数据湖目录;此前,对数据湖目录的每个请求都会重新解析区域。 #113330 (Konstantin Vedernikov).- 修复了一项性能回退:不带
GROUP BY键的聚合会在每次执行时序列化其完整输入计划子树 (包括常量折叠后字面量的全部内容) ,以计算一个永远不会使用的哈希表大小缓存键。诸如SELECT quantileMerge(arrayJoin(arrayMap(x -> state, range(5000000))))的查询过去每次执行约有 63 ms 花费在查询计划优化上,现在仅需 0.15 ms。 #113333 (Groene AI). - 新增可选功能:将 UInt128/UInt256/Int128/Int256 以 DECIMAL 形式序列化为 Parquet,以支持行组和页裁剪。 #113347 (Ivan Babrou).
- 使用
uniq_v2列统计信息时加快查询计划生成。现在会缓存估算的不同值数量,而不再在每次请求时重新计算;查询计划会针对每个查询多次发起此类请求。 (issue #113038). #113357 (Groene AI). - 从高级共享数据中读取完整 JSON 路径时,不再预取不需要的子流。 #113380 (Pavel Kruglov).
- 过滤器下推现已适用于 Parquet 和 ORC 文件中的
Tuple子列。对file()、s3()或url()使用WHERE tup.1 = 555555等谓词时,现在会利用元组元素’自身的统计信息裁剪行组和行索引步长,而非读取整个文件。 #113383 (Groene AI). - 将
timeSeries*ToGrid聚合函数中每个桶内的哈希映射替换为扁平的有序样本数组:对于按顺序输入的数据 (绝大多数情况下如此) ,样本摄取变为 O(1) 的追加操作,最终化时也不再需要对每个桶进行复制和排序。 #113681 (Nikita Mikhaylov). - 提升 TimeSeries 引擎上的 PromQL 查询性能:内部选择器 SQL 现在直接读取样本表的主键列 (无需无意义的类型转换) ,并且先检查时间戳范围,再检查序列 ID 集合,使冷态选择器密集型查询速度提升 30–44%。 #113768 (Nikita Mikhaylov).
- 在时间序列标签 collector 中使用带类型的 ID 映射。 #113839 (Vitaly Baranov).
- 写入排序键均为常量的 MergeTree 数据部件时,跳过冗余的有序性扫描。 #113899 (Perfloop Agent).
- 当 ID 布局为采用规范 ID 生成器的双组件元组时,匹配某一指标所有序列的 PromQL 选择器现在会在索引分析期间,使用
id上的连续主键范围过滤TimeSeries表的样本表,而非使用大型id IN <set>条件。这消除了选择器密集型 PromQL 查询中占主导地位的单线程索引分析开销:对于仪表板和规则查询模式,冷态延迟最高降低 45%;在包含 620 亿个样本的表上,完整套件的冷态几何平均值降低 11%。 #114131 (Nikita Mikhaylov). - 当标签组 ID 位于紧凑范围内时,以直接索引替代基于哈希的重映射,加快向量化 TimeSeries 标签转换。 #114244 (Minh Vu).
- Prometheus HTTP API 端点
/api/v1/query和/api/v1/query_range现在会仅计算一次由多个查询计划步骤共享的 PromQL 子查询,与prometheusQuery和prometheusQueryRange表函数此前的行为一致。此前,以enable_analyzer = 0发起的请求,或由配置文件设置了该选项的用户发起的请求,都会针对每个引用步骤重新扫描一次共享子查询。 #114261 (Groene AI). - 限制了基于列统计信息估算
col IN (...)选择性的开销,此前该操作可能会使单个查询的规划时间增加数百毫秒。估算器不再执行col IN (subquery)中的子查询来填充集合,因为它只需要该集合的一个选择性数值;现在会直接跳过尚未构建的集合。对于超过新设置statistics_max_set_size_for_exact_selectivity_estimation(默认值为 10000) 的集合,选择性现在根据集合大小及其取值范围推导得出。#114389 (Nikita Taranov). - 解析包含大量同名查询参数或请求头的 HTTP 请求 (例如数千个重复的
role=参数) 不再耗费二次时间复杂度。#114410 (James). - 修复了 26.7 中的一个性能回归:对于按
DateTime64列的toUnixTimestamp(或其他整数转换) 排序的MergeTree表,该列上的普通范围过滤器此前无法使用主键,导致读取匹配数据分片中的所有粒度。另针对按原始DateTime64列排序的表,类似toInt64(ts) >= c的过滤器现在也会使用主键。#114413 (Alexey Milovidov). ColumnArray中开销较大的一致性检查现在仅在调试构建中执行。#114469 (Anton Popov).- 当排序描述全部为常量时,不再对分布式聚集结果执行归并排序。#114626 (Groene AI).
- 通过将每个分区的行保留在单个 stream 中,并分别对各 stream 去重,加快分区
MergeTree表上IN (subquery)的集合构建速度。这样,单个集合填充转换——此前会串行计算每一行的哈希——现在只会处理唯一行。当分区表达式是子查询输出列的确定性函数时,此优化适用。当最大分区的行数超过平均分区行数的两倍时,不会应用此优化;新设置force_creating_set_partitions_independently(默认禁用) 可绕过此检查。此优化由新设置allow_creating_set_partitions_independently(默认启用) 控制。#114645 (Nihal Z. Miaji). - 在合并前,并行执行每线程聚合状态从单级到双级的转换。这修复了短
GROUP BY查询在拥有大量核心的机器上处理高开销聚合状态 (例如COUNT(DISTINCT ...)、ClickBench Q10/Q11) 时出现的 2-3 倍性能回归;该回归是在 26.7 开发构建中引入的,当时聚合内存统计变得准确。#114691 (Alexey Milovidov). - 加快
timeSeries*ToGrid聚合函数:每个样本的桶计算现在避免使用 Int128 除法,且落入同一桶的连续样本会跳过哈希映射查找。#114889 (Nikita Mikhaylov). - 向系统日志队列追加内容时,队列扩容不再深度复制整个队列。#115030 (Groene AI).
- 将
timeSeries*ToGrid聚合函数的样本按连续落入同一网格桶的样本段处理,在已排序的时间序列数据上将timeSeriesRateToGrid及相关函数的样本摄取阶段加快 1.2-2 倍。#115041 (Nikita Mikhaylov). - 对 PromQL 集合运算符使用紧凑的存在掩码。#115224 (Minh Vu).
- 加速 PromQL 即时查询的求值:
timeSeries*ToGrid聚合函数针对单点网格采用向量化样本分类路径,timeSeriesIdToGroup则直接填充结果列。#115267 (Nikita Mikhaylov). - 对于
ON子句中包含多个由OR连接的等式条件的JOIN,不再物化查询未选取的右侧键列。#115465 (Nikita Taranov). - 指定
DateTime或DateTime64类型时,不再构建从未被读取的 UTC 时区查找表,从而加快这些类型的构造速度,也提升了clickhouse local和clickhouse client的启动速度。#115488 (Konstantin Bogdanov). - 附加系统表时,不再仅为设置表注释而将每个表的元数据 (包括完整列描述) 复制两次。#115490 (Konstantin Bogdanov).
- 现在仅在首次上报客户端主机名时解析它,而不再在每次调用
clickhouse client和clickhouse local时解析。#115491 (Konstantin Bogdanov). - 修复函数
h3kRing、h3ToChildren、h3PolygonToCells和h3PolygonToCellsWithContainment在处理多行数据构建结果时的二次时间复杂度问题。一项针对 196 000 行的查询在 CI 压力测试中花费 838 秒进行内存复制;现在仅需约 5 秒。#115773 (Groene AI). - 加速全零 PromQL 条件向量的重复序列检查。#115822 (Minh Vu).
- 加速以
String、FixedString和LowCardinality键执行不含聚合函数的GROUP BY:查询不再针对每一行将未使用的占位符写入哈希表,而仅针对新增键的行执行此操作。#115834 (Nikita Taranov). - 加速在
DateTime64参数上执行toUTCTimestamp/to_utc_timestamp和fromUTCTimestamp/from_utc_timestamp,恢复其在 #109738 的溢出修复前的吞吐量。结果不变。关闭 #115802。#115838 (Groene AI). - 降低对大型常量折叠字面量执行带键聚合时的内存占用和查询计划优化时间。聚合哈希表统计信息缓存键现在会在序列化时计算哈希,而非先在内存中累积,因此携带大型字面量的计划在优化期间不再保留其副本。对于 80 MB 的字面量,峰值内存占用降低约 250 MB,优化时间缩短约 2.5 倍。计算得到的键保持不变。#115847 (Groene AI).
改进
- 现会使用调用 AI 函数的 SQL 名称标记传出的 OpenAI 格式 HTTP 请求,以便识别上游端点。 #110449 (George Larionov).
- 缩短正向
LIMIT BY形式的取消延迟:KILL QUERY和 Ctrl+C 现在可在单个数据块内中断,而无需等待整个步骤完成。 #106070 (Roman Vasin). - 当
INSERT因 materialized view 的TO目标表在构建插入管道时拒绝写入而失败时,错误消息现在会显示该 materialized view 及其目标表,而不再仅报告底层存储错误。 #107234 (Groene AI). - 使用
input_format_protobuf_oneof_presence时,ClickHouse 不再要求oneof存在性枚举必须恰好列出 Protobuf schema 中声明的标签:现允许额外的、在目标表中没有匹配列的标签,从而简化 schema 变更。 #109174 (Ilya Golshtein). QBit上的转置距离函数 (L2DistanceTransposed、cosineDistanceTransposed、dotProductTransposed及其量化变体) 现在接受长度超过搜索维度数的参考向量,并忽略额外的尾随元素。这样无需先切片,即可在降维 Matryoshka 搜索中复用完整大小的查询向量。 #109388 (Alexey Milovidov).basic统计信息中的NullCount子统计信息已重命名为DefaultCount,现在统计等于列类型默认值的行,而不再仅统计Nullable列中的NULL行。 #109977 (Han Fei).- 支持对本地磁盘上的
Iceberg表进行并发写入:LocalObjectStorage现已实现条件写入,因此可在此通过version-hint.text的比较并交换操作发布新快照,并发写入者也不会丢失彼此的更新。 #112556 (Alexey Milovidov). - 两个粒度不兼容的
MergeTree表之间执行ALTER TABLE ... MOVE/REPLACE PARTITION时,现在会抛出BAD_ARGUMENTS,而非LOGICAL_ERROR。 #110535 (Groene AI). - 当流式解析成功回退到 SQL 表达式解析时,
Values格式不再在system.errors和system.error_log中记录误报的解析错误。 #111141 (Pablo Marcos). - 新增
DuplicationDataHashComputationsProfileEvent,用于统计将INSERT数据块去重写入*MergeTree表时执行的按列数据哈希计算次数。 #111173 (Valery Petrov). - 在通用安装脚本的输出中突出显示
./clickhouse和sudo ./clickhouse install命令。 #111514 (Alexey Milovidov). - 使用 analyzer 时,笛卡尔 join 和由 analyzer 规划的常量谓词 join 不再因不兼容的
join_algorithm设置而失败。 #108289 (János Benjamin Antal). bitmaskToArray和bitmaskToList现已支持Int128、UInt128、Int256和UInt256参数。对于大整数参数,bitPositionsToArray的速度也更快,因为其性能现在随置位数量而非最高置位位置扩展。 #110743 (Manuel).- 通过为主机操作系统使用正确的 LLVM 主机三元组,修复了原生从源码构建的 macOS/aarch64 版本中 JIT 编译表达式崩溃的问题。 #111591 (Raúl Marín).
- 修复了在元组路径参数包含
LowCardinality元素时,Dynamic输入的JSON_EXISTS、JSON_VALUE和JSON_QUERY问题,避免引发LOGICAL_ERROR异常。关闭 #110345。 #109944 (Groene AI). - 对于类型树声明的列数多于条带页脚的损坏
ORC文件,schema 推断现在会报出CANNOT_EXTRACT_TABLE_STRUCTURE,而不再在调试或 sanitizer 构建中中止。 #110967 (Groene AI). - 轮转后的系统日志表 (如
system.metric_log) 现在即使其 metadata 超过max_query_size,也可标记为table_readonly。因此,轮转过程不再记录QUERY_IS_TOO_LARGE,并可正常继续。 #111703 (Alexey Milovidov). - 在 Play 中,新增了一个按钮,可关闭除当前选项卡外的所有选项卡。 #111835 (Mikhail Artemenko). 修复了通过 Enter 或 Space 激活该按钮后,按钮自行隐藏时键盘焦点的问题。 #111899 (Alexey Milovidov).
- 在 Play 中,按住
Ctrl(Mac 上为Cmd) 并将鼠标悬停在值为图像 URL 的表格单元格上时,现在会显示图像预览。 #109347 (Alexey Milovidov). - 在 Linux 上,当
rseq不可用时,ClickHouse 现在会在启动时添加一条system.warnings记录,因为每 CPU profile 计数器会回退到较慢的sched_getcpu路径。 #109283 (Azat Khuzhin). - 当 schema 推断将列包装为
Nullable时,对file表函数执行COUNT(*)不再抛出异常。关闭 #102044。 #102509 (Rory Shanks). - 函数
L1Normalize、L2Normalize、LinfNormalize和LpNormalize(及其别名) 现在支持Array参数,而不仅限于Tuple参数,与L2Norm和距离函数保持一致。 #110052 (Alexey Milovidov). - 移除了旧版基于 Apache Arrow 的
ORC读取器。ORC输入格式现在始终使用原生 ClickHouse 解码器,后者原本已是默认选项。input_format_orc_use_fast_decoder设置已过时且不再生效。 #110074 (Alexey Milovidov). - 现可通过 XML 配置常用的
clickhouse-client参数 (<hints/>、<highlight/>、<echo/>、<echo_query_id/>、<echo_formatted/>、<print-profile-events/>) 。对于history_max_entries、suggestion_limit、progress、progress-table、enable_progress_table_toggle、print-memory-to-stderr、chime-threshold-seconds和profile-events-delay-ms等设置,若省略相应的带默认值 CLI 标志,将保留客户端配置中的值。#110607 (Larry Snizek). - 新增
analyzer_compatibility_apply_final_to_all_joined_tables设置,用于恢复旧行为:最左侧表上的FINAL也会应用于JOIN中的其他表。该设置已记录在设置变更历史中,因此将compatibility设为早于 26.6 的版本时,会自动恢复旧语义。#111589 (Nikita Fomichev). - 在 Play 中,Firefox 现在会以正确的高度渲染
+(新选项卡) 按钮。#109524 (Alexey Milovidov). - 嵌套的关联
EXISTS子查询若引用了直接外层查询之外作用域中的列,现在会报出NOT_IMPLEMENTED,而非内部NOT_FOUND_COLUMN_IN_BLOCK异常。#110310 (Groene AI). - AST 重写后格式化
EXECUTE AS查询时不再抛出客户端异常,例如 AST fuzzer 中的情况。#111725 (Groene AI). - 改进对参数化视图的
DESCRIBE查询支持,并在新 analyzer 中支持在标量表达式中使用参数化视图。关闭 #66307。关闭 #69598。#68978 (Dmitry Novik). - 对于无法通过“格式化—解析—格式化”往返处理的畸形
CREATE INDEX和CREATE HYPOTHETICAL INDEX表达式,现在会报告异常,而不再在调试和 sanitizer 构建中触发Inconsistent AST formatting逻辑错误。#109175 (Groene AI). - Web UI:修复了即使凭据正确且服务器可访问,用户名/密码字段仍显示为红色的问题;编辑连接后会重新检查凭据,使正确的值显示为绿色。#109414 (Alexey Milovidov).
- 新增
text_index_max_processed_tokens_before_flush和text_index_max_memory_usage_before_flush设置,用于控制文本索引构建器何时将临时段刷写到存储中。#111573 (Rory Shanks). - 新增
system_cache_extensions设置,用于在启用use_split_cache时控制系统缓存中存储哪些文件扩展名。#111575 (Kirill). - 基于 musl 的构建中,错误消息现在会显示人类可读的
strerror文本,而非strerror: 0之类的空值或数值。#111620 (Konstantin Bogdanov). - 现在可在
system.server_settings中通过named_collections_storage.type,以及通过getServerSetting('named_collections_storage_type')获取实际生效的命名集合存储类型。#111806 (Pablo Marcos). - 放宽
ColumnReplicated::permute中过于严格的置换大小检查,使其遵循通用IColumn::permute约定:设置 limit 时,置换长度可以短于列长度。 #109897 (Groene AI). - 统一内部流式读取计划,改进流式查询的规划,避免对直接文本索引读取进行重复优化。 #111821 (Mikhail Artemenko).
- Web UI:
Run one和Run all按钮之间的间距现与第一个按钮左侧的边距一致。 #111988 (Alexey Milovidov). - 内存预留调度 (experimental) 在待释放的内存足以为超限预留扩容腾出所需空间时,不再驱逐分配。驱逐决策现在会等待在途减少操作生效,从而避免在内存压力下不必要地终止查询。 #112299 (Sergei Trifonov).
- Iceberg v2 要求 manifest 文件中包含
sequence_number,但 BigQuery 等其他引擎可以写入不含该字段的 manifest 文件。ClickHouse 现在可以读取此类表。 #112431 (Konstantin Vedernikov). - 当缺少用于 join 重排序的统计信息时显示警告。 #107666 (Vladimir Cherkasov).
- 为
INFORMATION_SCHEMA视图添加 MySQL 兼容列:SCHEMATA.DEFAULT_COLLATION_NAME和DEFAULT_ENCRYPTION;TABLES.ENGINE及其他相关 MySQL 列;以及COLUMNS.COLUMN_KEY、PRIVILEGES、GENERATION_EXPRESSION、SRS_ID。这样,兼容 MySQL 的客户端可运行其 catalog 内部信息查询,而不会遇到UNKNOWN_IDENTIFIER。 #109351 (Alexey Milovidov). - 对在
ON条件中相等的INNER JOIN键进行未限定引用时 (例如SELECT id FROM a INNER JOIN b ON a.id = b.id) ,不再将其报告为歧义标识符,因为两侧的值必然相同。 #109366 (Alexey Milovidov). - 通过 HTTP interface 返回
ACCESS_DENIED异常时,返回 HTTP 状态码403 Forbidden(而非500 Internal Server Error) 。 #111043 (Schum). - 将 UNIQUE KEY 索引 SST 直接写入分片存储,而非暂存到本地临时文件,从而消除对本地临时卷的依赖并避免额外复制。 #111189 (johnjing).
UTMToGeo现接受geoToUTM返回的 MGRS 纬度带字母作为第四个参数 (除整数半球标志外) ,因此可将geoToUTM的结果直接传入UTMToGeo实现往返转换。 #111521 (Alexey Milovidov).- 修复
LOGICAL_ERROR(“Part 级别 Min-Max 索引是从异常列集合构建的”) :降低part_minmax_index_columns后 (例如从with_block_number_offset降回partition_key_only) ,该错误可能会在 debug/sanitizer 构建中中止后台合并。 #111511 (Groene AI). - 修复
ProfileEvents['JoinResultRowCount']对结果溢写到磁盘的JOIN的结果大小少报的问题。从延迟桶输出的行仅计入JoinDelayedJoinedTransformRowCount,未计入总数。查询结果始终正确,只有 profile event 不正确。#112673 (Groene AI). SYSTEM DISABLE FAILPOINT现在会拒绝不存在的故障注入点名称,并像SYSTEM ENABLE FAILPOINT一样抛出BAD_ARGUMENTS。此前,拼写错误的名称会显示成功,但目标故障注入点仍保持启用状态,且不会提示实际上未禁用任何内容。#112680 (Groene AI).- 在
system.tables表中新增skipping_indices_types列。该列包含为每个表定义的数据跳过索引的去重类型。#106388 (Anton Popov). - 新增健全性检查,确保分布式查询始终携带已知的客户端版本;否则将抛出逻辑错误,而非将版本号零静默转发给远程分片。由服务器发起的查询 (后台刷写、流式消费者、字典重新加载、异步插入刷写) 现在会将服务器自身版本作为发起方版本报告。#109408 (Alexey Milovidov).
- 将每个分片中主键二分查找的诊断日志级别从 trace 降至 test,降低了
MergeTree中此类日志的详细程度。#110324 (Alexey Milovidov). - 对象存储表 (例如
S3) 的 Hive 分区示例路径现在会在首次使用该表时解析,而非在CREATE/ATTACH时解析,因此不可达的端点不再阻塞表创建和服务器启动。#111842 (Nikolay Degterinsky). - 修复
ReadBufferFromPocoSocketBase::setReceiveTimeout将其参数按秒而非微秒处理的问题,并修复以-DENABLE_LIBFIU=OFF配置的构建无法编译的问题。在不含 libfiu 的构建中,SYSTEM ENABLE FAILPOINT及相关命令现在会抛出异常,而非静默不执行任何操作。#112767 (Alexey Milovidov). - 修复
clickhouse-local在JSON/XML输出的statistics和进度条中对rows_read及其他进度计数器少报的问题:在组装进度数据包期间到达的进度增量会被丢弃。#112958 (Alexey Milovidov). - 修复向
Distributed表异步执行INSERT时,若所需队列目录名称超过文件系统 255 字节限制所报告的错误 (可通过use_compact_format_in_distributed_parts_names = 0触发) 。对于启用了internal_replication的分片,此前会报告LOGICAL_ERROR;其他情况则报告未归属的Code: 1001. std::exception;现在两种情况都会报告ARGUMENT_OUT_OF_BOUND,并指明表、集群和限制。#113083 (Groene AI). - 对超出范围的
execution_time配额限制报告BAD_ARGUMENTS,而不是在将其换算为内部纳秒时依赖未定义行为。#113178 (Alexey Milovidov). - 自动并行副本现已支持
JOIN查询。#106073 (Nikita Taranov). - 支持
OneLakecatalog 的刷新令牌身份验证。#110413 (alesapin). write_snapshot_versionKeeper设置现已支持热重载。#112150 (alesapin).SYSTEM DROP FILESYSTEM CACHE现可并行执行。#112532 (Kseniia Sumarokova).- 对基于
s3Cluster、urlCluster或fileCluster的SQL SECURITY DEFINER或SQL SECURITY NONE视图进行不受支持的嵌套时,现在会报告常规查询错误,而不再在调试和 sanitizer 构建中触发LOGICAL_ERROR。#113371 (Groene AI). - 新增设置
analyzer_compatibility_multiple_joins_qualify_column_names(默认值为false) 。启用后,当查询的FROM子句包含两个或更多JOIN时,analyzer 生成的结果列名会模拟旧版 analyzer 对多JOIN的重写行为:从*展开的列命名为<alias-or-table>.<column>,而SELECT列表中未使用别名的列引用会完全保留其原样名称。这使引用此类限定名称的外层查询 (如SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...)) 能够像使用旧版 analyzer 时一样正常工作。它还修复了当group_by_use_nulls与ROLLUP、CUBE或GROUPING SETS结合使用时,analyzer 会丢失从*展开的列的限定结果列名的问题;该问题会导致结果列名重复,并使外层查询无法引用这些列。#110746 (Dmitry Novik). - 将
allow_experimental_delta_kernel_rs重命名为allow_delta_kernel_rs。旧名称保留为别名。#113476 (Kseniia Sumarokova). - 当向
remote/remoteSecure表函数或Remote/RemoteSecure表引擎传入不存在的命名集合及key = value覆盖项时,ClickHouse 现在会报告缺失的命名集合,而不是按位置重新解析调用并报告无关错误。#113510 (Groene AI). - 从用户补全钩子加载补全时,Shell 使用
clickhouse-bootstrap补全启动不再输出环境变量。#113694 (Azat Khuzhin). - 为
shared_merge_tree_merge_coordinator_distribution_algorithm新增sainte_lague值,并将其设为默认值以替代water_filling。#113442 (Mikhail Artemenko). - 新增
filesystem_cache_wait_for_concurrent_download_timeout_milliseconds设置,用于限制读取操作等待另一查询将单个数据块 (约 1 MiB) 下载到文件系统缓存的时长,而非等待整个 File 段。#113322 (Kseniia Sumarokova). - 新增 Keeper 设置
min_time_between_fsyncs_ms(默认值为5ms) ,用于将紧随上一次刷新后到达的更新日志追加操作批量处理,而不是立即启动另一次刷新。#113749 (Michael Kolupaev). - 使用 Keeper 存储偏移量 (
kafka_keeper_path) 的 Kafka 表在因 Keeper 会话丢失而变为非活动状态时 (例如在直接读取或 materialized-view 流式处理中) ,现在会抛出ABORTED而非LOGICAL_ERROR。#113913 (Alexey Milovidov). - 修复
viewIfPermitted的 AST 格式不一致问题:表函数形式不再在其ELSE分支中错误格式化not等运算符,表达式形式viewIfPermitted(...)也不再出现多余的ELSE。 #113652 (Alexey Milovidov). - 修复在启用
database_atomic_wait_for_drop_and_detach_synchronously时,取消可刷新materialized view 刷新操作 (例如因服务器关闭) 后记录的多余错误Failed to drop temporary table after refresh. Table ... is left behind and requires manual cleanup.。实际上,临时表已被删除,无需手动清理。 #113957 (Groene AI). - 服务器现在会在服务器配置中存在未知配置选项时抛出
UNKNOWN_ELEMENT_IN_CONFIG,以便及早发现拼写错误和配置不当的选项。可通过<skip_check_for_incorrect_settings>禁用此检查。 #100332 (Alexey Milovidov). - 在 Web UI 中,浏览器历史记录和 URL 不再随每次按键更新,而会在查询成功运行或切换选项卡时记录。 #113596 (Alexey Milovidov).
- ClickHouse 现在会报告堆栈溢出,而非静默退出:致命信号处理程序将在备用信号栈上运行,因此即使发生故障的线程已耗尽栈空间,
SIGSEGV、SIGABRT、SIGILL、SIGBUS、SIGSYS、SIGFPE和SIGTRAP也会生成堆栈跟踪。 #113927 (Groene AI). - 现在,仅添加子字段时,对具名
Tuple执行ALTER TABLE ... MODIFY COLUMN <col> Tuple(...)属于 metadata-only 操作,速度与顶层ADD COLUMN一致。此功能受SETallow_metadata_only_named_tuple_alter= 1控制。 #107305 (Amos Bird). - 新增
input_format_json_max_object_size设置,用于限制解析时 JSON object 的大小。关闭 #106704。 #107669 (Pavel Kruglov). - 对于不使用 Kerberos keytab 身份验证的
Kafka引擎配置,不再记录sasl.kerberos.kinit.cmd configuration parameter is ignored.日志。 #108235 (Ivan Shelestov). - 新增 system.s3(azure)_queue_metadata。 #108522 (Kseniia Sumarokova).
- 将可容忍的远程 MySQL/PostgreSQL 数据库连接失败记录为 Warning,而非错误。 #109472 (Shaohua Wang).
- 当未指定
port和secure时,clickhouse-client会并发尝试默认端口 9000 和安全端口 9440,并使用最先响应的端口。因此,clickhouse-client --host play.clickhouse.com --user play无需--secure即可通过 TLS 连接,即使该服务器的非加密端口会被静默丢弃而非拒绝连接。如果最先响应的端口随后发现不可用——例如安全端口的证书不受信任——客户端会回退到另一个端口,因为未显式指定协议。 #110130 (Alexey Milovidov). - 现在,在 Playground 中点击云端徽标会在新标签页中打开 ClickHouse 网站,因此查询运行期间不会丢失进度。#110422 (William Hatcher).
- 添加 STREAM BOUNDED 修饰符:仅读取流式查询的第一个快照,随后结束,而非订阅后续更新。#110653 (Smita Kulkarni).
- 为
EXPLAIN ANALYZE添加 join 内部状态信息。#110892 (Kirill Kopnev). - 当
RWLockImpl::getLock()的重入断言触发时 (RWLock is already locked in exclusive mode/Cannot acquire exclusive lock while RWLock is already locked) ,错误消息现在会显示当前持有该锁的其他query_id,以及请求锁的query_id已持有的锁数量,使此类锁顺序错误能够被诊断。#110971 (Groene AI). - ClickHouse Keeper 现在将 “Client has not sent any data” 事件记录为
Information级别而非Warning,与服务器的 TCP handler 保持一致。这避免了 TCP 健康检查 probe (例如 KubernetestcpSocket存活性 probe) 打开并立即关闭与 Keeper 客户端端口的连接时产生误报警告。#111217 (Zeynel). MaterializedPostgreSQL现在会在更新期间保留未更改的 PostgreSQLTOAST值,而不是将其替换为默认值。#111552 (OrpheusAgent).- keeper:将默认
write_snapshot_version提升至 8,并支持热重载。#111715 (Michael Kolupaev). - 添加 STREAM UNORDERED 修饰符:跳过每个快照内按提交顺序进行的排序。#111794 (Smita Kulkarni).
- 新增 MergeTree 设置
text_index_version,用于控制文本索引的磁盘格式版本:v0_initial、v1_with_codec或v2_with_positions。在滚动升级期间或降级之前,将其设为较旧版本,以便较新服务器继续以较旧服务器仍可读取的格式写入文本索引分片;兼容性设置会自动调整该值。#111803 (Anton Popov). - AI 文本函数 (
aiGenerate、aiClassify、aiExtract、aiTranslate) 现在会拒绝被截断或其他不完整的提供商响应 (例如模型达到max_tokens限制时) ,而不是静默返回部分输出。具体行为遵循ai_function_throw_on_error设置。#111830 (George Larionov). - 通过使用高斯条件均值前缀质心重建
p < 8的QBit(Int8)编码,改进低精度L2DistanceTransposedQuantized、cosineDistanceTransposedQuantized和dotProductTransposedQuantized。全精度 (p = 8) 仍保持比特级精确;低精度近似距离可能发生变化,召回率和延迟方面的收益取决于工作负载。#111867 (Sergey Kuznetsov). - 修复了在具有多个
AND条件的WHERE子句中,除最后一个合取条件外的任一条件排除的 granule 未填充查询条件缓存的问题。#112083 (Shankar Iyer). - 新增设置
input_format_json_max_string_column_growth_step,限制构建 JSON 列时内部 String 缓冲区按 2 的幂扩容,从而降低插入大型 JSON 文档时的峰值内存占用。默认禁用。 #112159 (Pavel Kruglov). - 写入采用分桶共享数据序列化 (
map_with_buckets及高级模式) 的 JSON 列时,改为每次仅将共享数据拆分至一个桶,而非同时物化所有桶,从而降低峰值内存占用。这项改进主要有利于 Array(JSON) 列:对于标量 JSON,共享数据按粒度拆分 (受 index_granularity_bytes 限制) ,节省的内存较少;而单个 Array(JSON) 粒度可包含许多嵌套行及大量共享数据,因此逐桶拆分可显著降低峰值内存占用。 #112172 (Pavel Kruglov). system.documentation中设置的文档 (通过内置/docs页面和help命令显示) 现已包含其默认值的变更历史:设置引入的版本,以及此后默认值的每次变更,包括原值、新值和变更原因。 #112177 (Alexey Milovidov).EXPLAIN ANALYZE现已支持流式查询。 #112445 (Kirill Kopnev).- 现在,在
CREATE TABLE中,列声明修饰符——COMMENT、CODEC、STATISTICS、TTL、COLLATE、PRIMARY KEY和按列设置的SETTINGS——可以按任意顺序书写,且每种最多出现一次。此前仅接受一种固定顺序,例如x UInt64 CODEC(ZSTD) COMMENT 'text'会导致语法错误。在ALTER TABLE ... ADD COLUMN/MODIFY COLUMN中,受支持的修饰符——COMMENT、CODEC、STATISTICS、TTL和按列设置的SETTINGS——也可按任意顺序书写;ADD COLUMN中按列设置的SETTINGS以及ADD COLUMN/MODIFY COLUMN中声明的STATISTICS现在会生效,不再被静默丢弃;这些ALTER命令中的COLLATE和PRIMARY KEY现在会抛出异常,而不再被静默忽略。 #112788 (Alexey Milovidov). pread_threadpool读取方法需要使用带RWF_NOWAIT标志的preadv2系统调用,才能读取已在页缓存中的数据而无需将读取操作交给线程池。现在会在启动时检查该系统调用是否可用;如果不可用——例如 Linux 内核版本早于 5.11,或容器运行时的seccompprofile 拒绝该系统调用——则会将local_filesystem_read_method的默认值切换为pread,并在服务器日志中报告原因。此前,在这类系统上每次读取都需承担转交给线程池的开销,而返回EPERM的seccompprofile 会导致查询因CANNOT_READ_FROM_FILE_DESCRIPTOR而失败。 #112945 (Alexey Milovidov).- 将格式错误的 Parquet thrift 元数据报告为 INCORRECT_DATA。 #113311 (Groene AI).
- 修复 GCD codec 对含负数的有符号固定宽度值的处理。此前它直接根据有符号值计算除数,可能遗漏公约数,并显著降低有符号整数和十进制列的压缩效率。现在,对于有符号类型,它会根据绝对值计算除数,同时保持无符号类型和解压缩的现有行为不变。 #113798 (Kirill Shcherbatov).
- 新增
enable_alp_codec、enable_sz3_codec、enable_zxc_codec和enable_quantized_codec设置,可分别启用各个 Experimental 压缩编解码器。#113824 (Raufs Dunamalijevs). - 现在允许对其子列被用作主键或分区键的列执行
ALTER TABLE ... MODIFY COLUMN,前提是键中所用子列的类型与磁盘上的数据兼容。此前,所有此类 ALTER 操作均被禁止。#113862 (Pavel Kruglov). - 将
Filesystem cache仪表盘添加至system.dashboards。#113884 (Kseniia Sumarokova). - 通过
filesystem_cache_verbose_logging控制每次缓冲区填充时的缓存日志输出。#113885 (Groene AI). - 在读取
MergeTree时,如果某列的声明类型与其数据不一致 (类型来源混杂,例如ALTER TABLE ... MODIFY COLUMN的变更尚未完成) ,服务器现在会报告清晰的异常,指出列名及两种结构,而非执行未经检查的类型转换:此前,调试和 sanitizer 构建会因未指明列名的Bad cast from type A to B而中止;发布构建则会静默地访问不匹配的内存。#114087 (Alexey Milovidov). - 带有
PARTITION BY的窗口函数现可在make_distributed_plan下运行。当查询计划的形态允许时,窗口函数会在多个 bucket 中并行执行,每个 bucket 都会接收完整的分区。#114111 (Vighnesh Pathrikar). - Web UI:数据库面板中的沙漏加载指示器重新恢复动画效果。#114187 (Alexey Milovidov).
- 外部 Nullable 定宽聚合方法现使用 64 位哈希函数 (避免在极高基数聚合中出现严重的哈希冲突) 。#114210 (Nikita Taranov).
- 未指定列列表的
Distributed和Buffer表现在始终会根据创建用户的访问权限推断结构。#114211 (Pedro Ferreira). - 对
LowCardinality列执行x IN (subquery)现在返回LowCardinality(UInt8),与x IN (literal list)的类型相同。此前,这两种形式返回的类型不同,且包含此类IN的分布式查询计划需要在计划类型检查中进行特殊处理。#114229 (Alexander Gololobov). - 默认启用
ie_join:join_algorithm的默认值现为direct,parallel_hash,hash,ie_join。如果某个JOIN的ON子句仅包含不等式条件 (连接表表达式之间的两个比较:<、<=、>、>=) ,现在会使用基于排序的 IEJoin 算法执行,而非使用带过滤器的CROSS JOIN;同时也支持带有此类条件的LEFT/RIGHT/FULL/SEMI/ANTI连接。由于ie_join位于列表末尾,因此仅在其他算法不适用时才会使用。#114327 (Vladimir Cherkasov). - 修复了 Web UI 图表的问题:对于按
x降序排列的结果,悬停提示框会显示镜像点的数据。现在可以绘制Date、Date32、DateTime和DateTime64列;此前仅支持整数 Unix 时间戳。坐标轴和提示框中的日期以 ISO 8601 格式显示,数值则使用K/M/G/… 后缀,与高级仪表板一致。 #114349 (Alexey Milovidov). - 支持在
JSON数据类型、JSONExtract和isValidJSON中解析超出 64 位范围的整数。此类值将被读取为Int128/UInt256等宽整数类型,而不会导致整个文档被拒绝。 #114379 (Pavel Kruglov). - QueryRunner 表现在会按需启动工作线程,并在空闲时释放,而不再在表的整个生命周期内占用线程。 #114522 (Miсhael Stetsyuk).
- 为用于与远程副本进行异步通信的 fiber 栈增加了可观测性:profile events
FiberStackAllocs、FiberStackAllocBytes、FiberStackAllocNanoseconds、FiberStackFreeNanoseconds,以及指标FiberStacks、FiberStackBytes。 #114541 (Alexey Milovidov). - PromQL:支持
@ start()和@ end()时间戳修饰符。 #114558 (Minh Vu). - 将 OpenTelemetry trace context 传播到用于异步建立连接和执行远程查询的 fiber 中 (对冲请求、
async_socket_for_remote、async_query_sending_for_remote) 。分布式查询中的远程查询 span 现在会正确地归属为发起节点Connection::sendQueryspan 的子 span,而不再直接附加到客户端提供的 trace context;每次异步任务执行都会生成各自的 span。 #114813 (Diego Gomes Tomé). - 此项更改后,使用 WHATIF 索引时,由投影提供结果的基准方案会针对每个候选项报告
not_applicable,而不会导致 statement 失败。 #114846 (Yarik Briukhovetskyi). DROP DATABASE现在会按照加载依赖项和引用依赖项的逆拓扑顺序删除表 (此前仅考虑加载依赖项) ,因此即使在DROP DATABASE过程中发生崩溃,也不会遗留其依赖项已被删除的表。 #114952 (Alexey Milovidov).- 在 Web UI 仪表盘中,全局错误页面已替换为仪表盘上方的提示,因此单个图表失败不再导致整个页面被隐藏。 #115019 (Mikhail Artemenko).
- 在内存压力下,将 adaptive aggregator 学习阶段的表溢写到磁盘。 #115038 (Groene AI).
clickhouse-local现在会使用与clickhouse-server相同的宽松响应标头处理 CORS 预检请求,因此可直接在浏览器中使用通过SYSTEM START LISTEN HTTP开放的 HTTP interface,包括从file://URL 打开的 Web UI。 #115045 (Alexey Milovidov).- 支持 PostgreSQL 风格的正则表达式匹配运算符:
~(match函数的别名) 、~*(不区分大小写匹配) 、!~和!~*(否定匹配) 。通过 PostgreSQL 兼容协议连接到 ClickHouse 时,psql的\d、\dt、\dv命令现已可用,且查询失败不再终止连接。#115066 (Alexey Milovidov). clickhouse-client以交互方式请求密码时,不再重复打印两次Connecting to ...消息。#115081 (Alexey Milovidov).- 当
empirical_status为unsupported时,EXPLAIN WHATIF现在会显示新增的empirical_reason行,说明跳过经验估算的原因。#115140 (Yarik Briukhovetskyi). - 当
join_algorithm设置启用的所有 JOIN 算法均无法执行JOIN时,错误消息现在会列出已尝试的算法,以及失败 JOIN 的严格性和类型,而不再仅报告这些算法均未生效。#115226 (Alexey Elkin). - 当参考向量为整数数组字面量时,向量搜索查询现在可以使用向量相似度索引,例如
ORDER BY L2Distance(vec, [1, 2])。此前,这类查询会静默回退到穷举扫描。#115255 (Robert Schulze). - Azure 客户端侧网络故障 (连接重置或被拒绝、DNS 和 TLS 错误) 现在会作为传输错误进行重试,而不再显示为合成的
500错误,与 S3 客户端保持一致。#115269 (Arsen Muk). - 现在可以从系统表
system.statements获取所有 SQL 语句的文档 (如名称、语法、描述和示例) 。#115341 (Robert Schulze). - 如果创建锁文件的
BACKUP操作在写入任何内容前失败,将不再在目标端遗留锁文件——无论是在占用目标端时失败,还是在打开归档时失败。后续备份无法匹配此类锁,因此对同一目标端的每次重试都会失败,直至手动删除该文件。向S3和Azure目标端执行备份时也会以独占方式创建锁;若锁属于其他备份,将报告为并发备份,而非返回存储服务报告的错误。#115387 (Julia Kartseva). - 支持 BuilderRWBufferFromHTTP 中的 Bearer 令牌身份验证 (第二次尝试) 。#115400 (Sergei Trifonov).
- 为 S3Queue 添加了一些维度指标。#115422 (Bharat Nallan).
- 添加
keyword作为文本索引分词器array的别名,以提升与 OpenSearch、Elasticsearch、SolR 和 Lucene 的兼容性。#115507 (Robert Schulze). - 支持自行创建 S3 表。#115652 (Konstantin Vedernikov).
- 对于非全服务器范围的 MEMORY_LIMIT_EXCEEDED 错误,不再记录每个线程的未跟踪内存。#115658 (Azat Khuzhin).
- Prometheus 远程写入协议现已支持异步插入:根据
async_insert设置,会先将多个并发远程写入请求的数据合并为批次,再生成 parts (默认启用;如需保持同步行为,请在 handler URL 中添加async_insert=0) 。只有当数据已刷新到目标TimeSeries表的所有内部表后,请求才会得到确认。#115688 (Nikita Mikhaylov)。 - 所有
timeSeries*聚合函数现均按统一规则处理重复时间戳 (取最大值,NaN 会输给任何其他值) ,修复了共享时间戳的部分值为 NaN 时,timeSeriesInstantRateToGrid、timeSeriesInstantDeltaToGrid、timeSeriesLastTwoSamples和timeSeriesResampleToGridWithStaleness的结果依赖处理顺序的问题。该规则现已记录在文档中并经过测试。#115920 (Vitaly Baranov)。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复
inject_random_order_for_select_without_order_by导致的列名损坏和BAD_ARGUMENTS异常:多列SELECT查询不再失败,CREATE TABLE AS SELECT、CREATE VIEW AS SELECT以及JSONEachRow等命名格式的输出列名将得到保留,不再被替换为内部__subquery_column_<UUID>别名。关闭 #102812。关闭 #101107。#105896 (Groene AI) 。 - 修复原生
ParquetV3 读取器中,PREWHERE包含共享相同中间表达式的合取条件时出现的NOT_FOUND_COLUMN_IN_BLOCK错误。#107059 (Groene AI) 。 - 修复在
WHERE中结合延迟物化使用_part_starting_offset或_part_offset虚拟列的查询出现的NOT_FOUND_COLUMN_IN_BLOCK错误。#108287 (Vladimir Cherkasov) 。 - 修复对于在较旧数据文件写入后新增、经 schema 演进的
Iceberg列,在optimize_functions_to_subcolumns = 1(默认值) 下执行WHERE col IS NULL或IS NOT NULL时出现的Not found column or subcolumn c.null in block错误。#109515 (Groene AI) 。 - 修复读取
Iceberg表时出现的误报ICEBERG_SPECIFICATION_VIOLATION错误:当 decimal 或其他参数化基本类型在元数据文件中以不同的空白格式序列化时,例如表元数据中为decimal(20,0),而 manifest 中为decimal(20, 0)。#109676 (Groene AI) 。 - 修复在
FINAL之后应用PREWHERE时,使用optimize_move_to_prewhere = 1的延迟PREWHERE问题:WHERE条件不再被移至延迟行策略之前,避免改变查询结果。#109703 (Yarik Briukhovetskyi) 。 - 修复比较
Array(String)列与数组字面量 (例如arr = ['x']) 时出现的BAD_GET错误,适用于具有text、tokenbf_v1或ngrambf_v1跳过索引的列。此类比较现在会回退到全表扫描,而不会导致查询失败。#110057 (Groene AI) 。 - 修复存在文本索引时,使用空查找值的
has、mapContainsKey和mapContainsValue返回错误结果的问题。#110246 (Robert Schulze) 。 - 修复在
CREATE TABLE ... AS SELECT查询中,将标量子查询用作s3表函数的 URL 参数,或任何其他表函数的参数时出现的Host is empty in S3 URI错误。#110254 (Sema Checherinda) 。 - 修复
SYSTEM STOP/START CLEANUP和SYSTEM STOP/START VIRTUAL PARTS UPDATE的ON CLUSTER权限检查:不再要求SYSTEM PULLING REPLICATION LOG权限,现改用SYSTEM CLEANUP或SYSTEM VIRTUAL PARTS UPDATE权限。#110289 (Groene AI) 。 - 修复只读对象存储副本在
read_only = true时无法通过refresh_parts_interval发现新 parts,以及table_disk = true在此类磁盘上失败并报错table_disk is not supported for non-ObjectStorage disks的问题。#110460 (Julia Kartseva). - 修复通过数据湖表函数 (如
INSERT INTO FUNCTION icebergS3(...)) 写入时,生成的Parquet文件中字符串列丢失String类型注释,导致 Spark 等外部读取器无法读取写入数据的问题。#110465 (Shaohua Wang). - 修复读取映射键采用字典编码的
ORC文件时,架构推断因Map cannot have a key of type LowCardinality(Nullable(String))而失败的问题,包括由 Spark 写入的文件,以及 ClickHouse 自身在启用output_format_orc_dictionary_key_size_threshold时写入的文件。#110492 (Shaohua Wang). - 修复通过仅修改元数据的
ALTER MODIFY COLUMN T将列改为Nullable(T)后,对该Nullable列启用optimize_functions_to_subcolumns时IS NULL/IS NOT NULL/count()结果错误的问题。对于转换前写入的 parts,.null子列现在由物理存在的父列推导得出,而不再使用存储类型的默认值。#110584 (Groene AI). - 修复当传递条件混用比较语义不同的类型 (如
Enum和String、Decimal和Float64,或不同宽度的FixedString值) 时,optimize_and_compare_chain优化导致查询结果错误的问题。#110621 (Yarik Briukhovetskyi). - 修复优化器扩展排序键前缀时,某些按序读取查询返回错误结果的问题。#110725 (Groene AI).
- 修复带有
COMMENT子句的CREATE语句在缺少注释字符串字面量时,会静默接受错误解析的查询而不报语法错误的问题。例如,CREATE VIEW v COMMENT AS SELECT 1不再创建不含注释的视图。#111159 (Shaohua Wang). - 修复当
optimize_move_to_prewhere_if_final = 1且WHERE子句为排序键列上的隐式布尔条件 (如WHERE k) 时,SummingMergeTree和CoalescingMergeTree使用FINAL返回错误结果的问题。#111342 (Groene AI). - 修复在基于对象存储的数据库和表上执行仅修改元数据的操作 (如
DROP DATABASE) 时,误报Directory '...' was created concurrently with remote path '...'异常的问题。#111353 (Mikhail Artemenko). - 数据湖 REST Catalog 现在会针对过期凭据报告正确的异常,而不再静默将其视为缺失的表或返回
UNKNOWN_TABLE。#111379 (alesapin). - 修复 analyzer 被禁用 (
enable_analyzer = 0) 时,参数化视图未遵循SQL SECURITY DEFINER和SQL SECURITY NONE的问题。此前,没有底层表特权的用户查询此类视图时会因ACCESS_DENIED而失败,尽管同一视图在启用 analyzer 时可正常工作。#111458 (Groene AI). - 当从存储中推断 schema 时,在
CREATE TABLE时拒绝Nullable(Nothing)列或其他不允许用于表的类型。例如,在对执行SELECT NULL的视图创建无列的remote、Remote或Distributed表时,避免持久化会在下次服务器重启时加载失败并阻塞无关表加载的元数据。 #111487 (Groene AI). - 修复内部
Struct被修改的嵌套Array(Map(...))列导致的std::bad_variant_access和不正确的Icebergschema 演进问题。 #111489 (Konstantin Vedernikov). - 修复将带有
DEFAULT的Nullable列转换为其他类型时ALTER MODIFY COLUMN失败的问题,例如从Nullable(UInt8)转换为String、LowCardinality(String)或Array(UInt8)。 #102156 (DQ). - 修复
DETACH DICTIONARY ... PERMANENTLY因HAVE_DEPENDENT_OBJECTS被拒绝后,dictGet返回BAD_ARGUMENTS(Dictionary not found) 的问题;现在,若 detach 被拒绝,字典仍可使用。 #105259 (Groene AI). - ClickHouse 写入
Iceberg表的数据文件现在会在Avro和ORC中嵌入Iceberg字段 ID;ORC的String列将写为string而非二进制;可选的复杂ORC字段 (Array、Map、Tuple) 现在会保留正确的iceberg.required元数据。这修复了列重命名后静默返回NULL的问题,并恢复了与 Spark、iceberg-java等符合规范的读取器的兼容性。 #109994 (Groene AI). #111775 (Groene AI). - 修复现有路径被改写为大小不同的内容后,读取
plain_rewritable磁盘上文件时出现的问题:过期的内存中元数据可能会导致触发UNEXPECTED_END_OF_FILE。 #110304 (Konstantin Bogdanov). - 修复由
query_log和query_views_log等系统日志记录造成的每用户内存跟踪器偏差问题;否则,可能会对持续运行工作负载的用户错误触发max_memory_usage_for_user限制。 #110708 (Raúl Marín). - 修复一种罕见的竞争情况:在
ReplicatedMergeTree表上仅修改注释或设置的ALTER可能会静默丢弃由并发ALTER ... ADD COLUMN添加的列,导致某个副本的表元数据过期。 #111029 (Shaohua Wang). - 修复带有降序排序键后缀的表 (如
ORDER BY (g, r DESC)) 中不正确的主键修剪问题,该问题可能会丢弃匹配的行。 #111059 (Nihal Z. Miaji). - 修复启用证书验证时每次 TLS 握手发生的对端证书内存泄漏问题。 #111425 (Konstantin Bogdanov).
- 修复在
ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}中使用查询参数作为分区的变更:现在可以正确解析序列化后的分区值,因此ALTER不再写入会导致表加载失败的变更条目。 #111518 (Michael Kolupaev). - 修复在协程或 fiber 栈上捕获堆栈跟踪时 (例如由内存 Profiler 捕获) 导致的 macOS/aarch64 崩溃问题。#111656 (Raúl Marín).
- 修复使用
input_format_allow_errors_num > 0读取Protobuf数据时的服务器崩溃问题:当同一块中一条有效消息后紧跟一条错误但可跳过的消息时,会触发此问题。#107739 (Andrey Tsarevskiy | Андрей Царевский ). - 修复查询
Distributed表时,若使用变为Nullable的_shard_num或shardNum(例如在join_use_nulls = 1的FULL JOIN中) ,并同时使用ORDER BY和 analyzer,会出现NOT_FOUND_COLUMN_IN_BLOCK的问题。#109798 (Groene AI). - 修复在使用
join_algorithm = 'full_sorting_merge'的LEFT/RIGHT/FULL/ASOF JOIN中出现错误结果和UNKNOWN_ELEMENT_OF_ENUM异常的问题;此前未关联的行可能会被填充为0,而非列类型的默认值。#111197 (Groene AI). - 修复当高阶函数的 lambda 主体为条件恒定的
if或multiIf,且混用Bool字面量分支和UInt8比较分支时发生的LOGICAL_ERROR异常,例如arrayFilter(p -> multiIf(false, true, p = 'ALL'), ['ALL'])。#111245 (Groene AI). - 对于未显式指定
partition_strategy的S3、AzureBlobStorage、URL及类似文件型引擎,路径中的{_partition_id}占位符现在再次隐含使用wildcard策略,恢复了对 26.6 之前 DDL 的兼容性;此前这些 DDL 会因BAD_ARGUMENTS而失败。#111279 (Nikita Fomichev). - 修复针对包装
Distributed表的Merge表执行GROUP BY查询时出现的NUMBER_OF_COLUMNS_DOESNT_MATCH问题:当分组键是某列的函数,且聚合操作读取同一列时会触发该问题。#111334 (Groene AI). - 现在会以
BAD_ARGUMENTS拒绝对同一角色执行GRANT role TO role,不再静默地在system.role_grants中创建自引用条目。#103315 (zxuhan7). - 修复当元数据文件不含
refs部分时无法写入Iceberg表的问题。#106896 (Aleksandr Musorin). - 修复 Arrow Flight 登录后
system.session_log无法读取的问题:interface列为Enum8,但其枚举中缺少ArrowFlight值,因此通过 Arrow Flight 协议登录会写入原始值10,任何读取此类行的SELECT都会抛出Unexpected value 10 in enum异常。#110758 (Alexey Milovidov). - 修复
toStartOfInterval在处理亚秒时间间隔时的有符号整数溢出问题:对于距Int64下界不足一个时间间隔的DateTime64值,舍入结果此前会静默回绕为正的无效值;现在该函数会抛出DECIMAL_OVERFLOW异常。#111370 (Alexey Milovidov). - 修复
readWKTPoint和readWKT对带维度标签的空点 (如POINT M EMPTY) 返回未初始化的坐标 (标量模式) 或上一行的坐标 (向量化模式) 的问题。此类输入现在会像POINT EMPTY一样被拒绝,并报出CANNOT_PARSE_TEXT。 #111517 (Groene AI). - 修复当左侧存在经
UNION ALL保留的重复同名列 (例如1 AS b, 1 AS b) 时,RIGHT和FULL JOIN出现Unexpected number of columns in result sample block异常的问题。 #111554 (Groene AI). - 修复分布式查询中,在嵌套组合器下配合
RESPECT NULLS或IGNORE NULLS修饰符使用-Tuple组合器时出现的CANNOT_CONVERT_TYPE和LOGICAL_ERROR异常,例如anyRespectNullsStateTuple(...) IGNORE NULLS。 #111570 (Alexey Milovidov). - 修复 iPhone 上 Play 的 SQL 语法高亮问题:iOS Safari’s 自动文本膨胀可能导致高亮覆盖层错位。 #111683 (Alexey Milovidov).
- 修复调用参数化视图时,若参数为类型为
Array、Tuple或LowCardinality的子查询值,会出现UNKNOWN_QUERY_PARAMETER的问题,例如SELECT * FROM v(param = (SELECT groupArray(x) FROM t))。 #111790 (Groene AI). - 修复对字典执行
JOIN时,若使用Nullable、LowCardinality或LowCardinality(Nullable)连接键而字典键未包装,会出现TYPE_MISMATCH(Key type for complex key ... does not match) 的问题。直接 JOIN 的字典查找现在会将键规范化为字典声明的键类型,与dictGet和dictHas的行为一致;NULL键永远不会匹配。 #111857 (Groene AI). - 使用
fsync_part_directory = 1时,将分片目录从临时名称重命名为最终名称的操作现在也会通过 fsync 父目录来确保持久化;对于跨父目录移动,也会 fsync 源父目录。此前仅对移动后的目录执行 fsync,因此如果在分片提交后立即断电,即使启用了该设置,分片仍可能从磁盘上丢失,并导致行数据丢失。 #111861 (Groene AI). - 修复
randChiSquared、randStudentT、randFisherF和randBinomial在极端参数下挂起的问题。此类查询无法通过max_execution_time或KILL QUERY中断。现在,即使max_rand_distribution_parameter或max_rand_distribution_trials设为0,这些参数也会被拒绝;此外,randBinomial的max_rand_distribution_trials不再允许提高到超过默认值10^9。 #111909 (Alexey Milovidov). - 修复 analyzer 将比较链 (如
x = c1 OR x = c2 OR ...、x != c1 AND x != c2 AND ...或has(const_array, x)) 重写为IN和NOT IN时产生错误结果的问题。还修复了对具有Dynamic、Array(Dynamic)或JSON结构的表达式出现Illegal type ... of argument of function in异常的问题。 #111924 (Groene AI). - 修复从
MergeTree表中同时选择Nullable(Tuple(...))列及其某个携带 null 的元素子列 (Variant、Dynamic或LowCardinality) 时出现结果错误和LOGICAL_ERROR的问题。#111949 (Groene AI). - 拒绝对未知集群或未配置
<secret>元素的集群使用USER_INTERSERVER_MARKER的原生协议握手。此前,此类握手可能会在身份验证前进入服务器间模式,并读取本地表的信息。#99675 (Dan Anderson). - 修复针对
EmbeddedRocksDB、Redis和KeeperMap表的JOIN:使用String或Nullable(String)键的DirectKeyValueJoin时,可能会静默返回零行。#105253 (Vladimir Cherkasov). - 修复
Replicated数据库中的协调式可刷新materialized view 在不具备MULTI_READ功能标志的 Keeper 上重新附加后卡住的问题;现在该视图会以Disabled状态正常停止,而不会永久记录Unexpected exception in refresh scheduling。#108890 (Groene AI). - 修复 ZooKeeper 客户端针对超过
INT32_MAX字节的请求发送溢出的int32长度前缀的问题。现在会在客户端拒绝过大的请求。可通过<zookeeper>下的max_request_size配置此限制;未配置时则从 Keeper 获取。关闭 #109165。#109190 (Arsen Muk). - 修复具有持久化处理节点的
S3Queue/AzureQueue有序模式:现在会在流式处理期间刷新存储桶锁,因此由persistent_processing_node_ttl_seconds控制的 TTL 清理不会移除仍在运行的处理器所持有的锁。即使锁所有权仍然丢失,也会检测并报告该情况,流式处理将使用新的文件迭代器恢复。#110292 (Kseniia Sumarokova). - 修复在跳过前导行后读取
string_serialization_version = 'with_size_stream'的String列,以及读取使用object_shared_data_serialization_version = 'map'存储的JSON列子对象时,出现数据错误及可能发生越界读取的问题。#110471 (Alexey Milovidov). - 修复分析器在
CREATE TABLE和ALTER TABLE中接受引用_table或_database等虚拟列的DEFAULT或MATERIALIZED表达式的问题。现在会在定义时拒绝这些表达式,而不是稍后在插入时因NOT_FOUND_COLUMN_IN_BLOCK失败。#111776 (Groene AI). - 修复可执行 UDF、
executable表引擎和可执行字典中的竞争问题:对已关闭的文件描述符执行fcntl可能会损坏并发查询中无关的描述符,并使查询无限期挂起。#111779 (Raúl Marín). - 创建已弃用的
minmax统计信息现在会发出警告,而不是抛出异常。#111785 (Han Fei). - 修复由 ClickHouse 写入的
Iceberg表无法被 PyIceberg 和 Spark 等外部读取器读取的问题。清单列表和清单Avro模式现在包含必需的Icebergfield-id属性。#111786 (Groene AI). - 在分片 attach/detach/move/clone 操作期间重新生成 materialized-into-part
block_number和block_offset列,避免它们在分片操作后过期。#111801 (Mikhail Artemenko). - 修复
query_plan_split_filter优化在INTERSECT或UNION的某个分支中遗留内部__split_filter列的问题,该问题可能导致Block structure mismatch in IntersectOrExceptStep stream: different number of columns异常。#111930 (Groene AI). - 修复当
join_use_nulls = 1时,在WHERE中重复JOIN ON条件的查询触发AMBIGUOUS_COLUMN_NAME的问题;此类查询现在会返回结果,而非失败。#112007 (Groene AI). - 修复
PaimonREST catalog 中的 DLF 身份验证问题:首次请求后的所有请求不再因 HTTP 401 而失败,表存在性检查现在也能正确识别 HTTP 404。#112015 (JIaQi Tang). - 修复 Keeper 中并发清理
Kafka表时出现的LOGICAL_ERROR;如果表的 Keeper path 在会话过期后消失,创建或删除操作不再失败。#112078 (Groene AI). - 修复为
_block_number和_block_offset列启用分片级 min-max 索引时的合并与变更问题。#109281 (Mikhail Artemenko). - 修复向
DeltaLakeLocal或deltaLake表执行失败的INSERT后,在写入已开始的情况下遗留未 finalized 数据文件的问题。#109328 (Groene AI). - 修复通过 expressions 或 SQL UDF 构建的
encrypt、decrypt和 HMAC 函数的 secret 参数,以及s3/s3Cluster、由S3支持的引擎和BACKUP ... TO S3在SHOW CREATE、system.query_log、服务器日志和EXPLAIN输出中泄露 credential 的问题。#109768 (Raúl Marín). - 修复通过
s3和file从未压缩的STOREDzip 条目读取大型Parquet文件的问题。#110495 (Eva Wuuu). - 修复包含隐藏在子查询、CTE 或视图中的流式
FROM ... STREAM读取时,EXPLAIN ANALYZE挂起的问题。此类查询现在会像顶层流式读取一样因NOT_IMPLEMENTED被拒绝。#110935 (Groene AI). - 使用带
i8quantization 的vector_similarity索引时,拒绝平方模溢出为无穷大的向量。此前,此类向量会悄然产生无效结果。#111085 (Groene AI). - 设置
min_rows_to_fsync_after_merge、min_compressed_bytes_to_fsync_after_merge或fsync_part_directory时,对已合并或 materialized 分片的 text index 文件执行 fsync。此前,这些文件是分片中唯一未同步的文件,因此合并后立即断电可能留下已 committed 但损坏的分片,进而导致数据丢失。#111335 (Groene AI). - 修复针对
user_files的 path validation 问题。#111442 (Alexander Tokmakov). - 修复对已停止的
RabbitMQ表执行SYSTEM REFRESH时有时无法消费队列积压消息的问题。刷新操作现在会等待 AMQP 投递循环启动后,再消耗其唯一一次乱序流式处理周期。 #111480 (Groene AI). - 将本地对象访问限制在
user_files路径下。 #111483 (Konstantin Vedernikov). - 修复反序列化包含
String值的格式错误聚合函数状态时,因内存越界访问导致的段错误。现在会验证并拒绝此类状态。 #111606 (Miсhael Stetsyuk). - 修复解析
system.zookeeper_info时的整数溢出问题。 #111629 (Kseniia Sumarokova). - 修复当
FINAL查询按未包含在SELECT列表中的排序键列过滤,且过滤条件被移至PREWHERE时出现的NOT_FOUND_COLUMN_IN_BLOCK问题,例如在optimize_move_to_prewhere_if_final = 1时执行SELECT s FROM t FINAL WHERE k GROUP BY s。 #111721 (Groene AI). - 修复在
allow_experimental_delta_lake_writes = 1时向DeltaLake执行分区INSERT会损坏包含路径字符的分区值,并拒绝NULL分区值的问题。现在会将分区值进行百分号编码并存入单个路径段;NULL或空字符串值会以__HIVE_DEFAULT_PARTITION__写入,并在partitionValues中记录为 null。 #111793 (Groene AI). - 修复通过
Buffer表读取动态子列时发生异常并静默跳过数据的问题。 #111948 (Alexey Milovidov). - 修复
clickhouse-client在执行USE {db:Identifier}后丢失当前数据库的问题。如果客户端之后需要重新连接,会静默地将会话切换到default数据库。 #111982 (Alexey Milovidov). - 修复带有统计信息的列通过仅修改元数据的
ALTER MODIFY COLUMN更改列类型后,在执行MergeTree变更时出现LOGICAL_ERROR异常 (Type mismatch when building statistics for column) 的问题。现在,实际由变更重写的列会重新计算统计信息,未修改的列则保留现有统计信息。 #112009 (Groene AI). - 修复在可变的
snapshot/LATEST提示被并发替换时可能失败的Paimon表读取。现在会忽略无效或过时的提示,改为从目录加载快照。 #112010 (JIaQi Tang). - 修复读取 WKT 编码几何列使用非大写类型关键字 (如
point(1 2)) 或空容器 (如LINESTRING EMPTY或POLYGON()) 的GeoParquet、Arrow和ArrowStream文件时的问题。这也修复了读取存储空几何体wkt输出的文件。 #112020 (Groene AI). - 修复查询级别的配置覆盖未应用于 Azure 原生复制的问题。 #112037 (Smita Kulkarni).
- 修复
query_masking_rules重写EPHEMERAL列类型的问题,该问题可能导致CREATE TABLE存储错误类型或执行失败。#112048 (Alexey Milovidov). - 表函数参数不再接受聚合状态;此前此类不受支持的参数会触发逻辑错误。关闭 #112085。#112087 (Pedro Ferreira).
- 修复
JOIN的ON表达式包含常量合取条件时返回错误结果的问题,例如ON l.id = r.id AND CAST(NULL AS Nullable(UInt8))。#112155 (Vladimir Cherkasov). - 修复未使用
simdcomp的构建 (如aarch64) 在text_index_posting_list_apply_mode = 'lazy'时,hasAllTokens及其他多标记文本索引搜索返回错误结果的问题。#112178 (Groene AI). - 修复使用非
parameter = value赋值形式的参数调用参数化视图时返回错误结果的问题。现在,这类调用会在两条执行路径中均以UNKNOWN_QUERY_PARAMETER被拒绝。#112194 (Groene AI). - 修复
SELECT主体使用INTERSECT、EXCEPT,或混合UNION DISTINCT和UNION ALL的UNION链的参数化视图被错误归类为普通视图的问题,后者导致其元数据无法加载。#112211 (Groene AI). - 修复
TSV系列格式的模式推断问题:对于以前导零表示的小数值 (如0.0或0.5) ,会错误推断为String,并将该第一行作为标头读取。还修复TSKV将如x=1\x2E5的转义编码值推断为数值类型的问题。关闭 #112105。#112226 (Groene AI). - 修复
system.s3_queue_settings为bucketing_mode、partitioning_mode、partition_regex和partition_component报告错误值的问题。#112300 (Bharat Nallan). - 修复当主键为
Array或Tuple,且查询对其应用plus、minus、multiply、divide或intDiv时出现的错误结果、ORDER BY输出排序错误以及BAD_TYPE_OF_FIELD异常。#112339 (Groene AI). - 修复包含
PASTE JOIN的查询的远程执行问题,例如通过Distributed表或*Cluster表函数执行的查询。ClickHouse 不再将查询格式化为无效语法ALL PASTE JOIN。#112404 (Groene AI). - 修复
JoiningTransform中的LOGICAL_ERROR(Invalid number of rows in Chunk) 问题,该问题发生在右侧键唯一、ON条件混合且max_joined_block_size_rows较小时的LEFT JOIN中。#106928 (Groene AI). - 修复
S3Queue表引擎的_tags虚拟列:该列虽已声明,却从未填充,因此SELECT _tags始终返回空映射。现在它会像S3引擎和s3表函数一样返回对象标签。#108676 (Groene AI). - 修复合并与
ALTER TABLE... RENAME COLUMN并发执行时,或列的唯一值来自轻量级UPDATE时,无默认表达式的列发生数据丢失的问题。该列可能会从合并后的数据分区片段中丢失,导致读回的所有值均为 NULL。#109356 (Groene AI). - 修复在
Wide分片上执行全分片重写变更 (例如对MATERIALIZED列执行ALTER TABLE... DROP COLUMN) 后,数据分区片段中的跳数索引被移除 (或CHECK TABLE因UNEXPECTED_FILE_IN_DATA_PART而失败) 的问题。#109616 (Groene AI). - 修复
toUTCTimestamp/fromUTCTimestamp(及其to_utc_timestamp/from_utc_timestamp别名) 和toTime64的DateTime64路径中的两个错误。其一,Int64边界附近的有符号整数溢出 (现改为使用Int128计算,并将结果限制在可表示范围内) 。其二,时区偏移边界附近负小数值的结果错误:秒数拆分会向零截断,导致timezoneOffset()检查下一秒,并可能选取 DST/偏移变更的错误一侧。#109738 (Groene AI). - 修复从
Merge表读取时出现的逻辑错误 (“Cannot determine row level filter; 0 columns deleted, 0 columns added”) :当其子表的行策略过滤条件仅为一个现有列时 (例如CREATE ROW POLICY... USING flag) 。#109843 (Groene AI). - 修复带有
GROUP BY GROUPING SETS的查询 (或包含它的标量子查询或变更子查询) 在force_aggregation_in_order = 1下运行时引发的两个错误:在旧 analyzer (enable_analyzer = 0) 下出现Trying to get name of not a column: ExpressionList,以及在 analyzer 下,启用enable_memory_bound_merging_of_aggregation_results = 1的分布式查询出现Memory bound merging of aggregated results is not supported for grouping sets.。#109862 (Groene AI). - 修复容器类型中将数值
1/0解析为Bool值的问题 (例如Array(Bool)、Tuple(Bool,...)) 。此前,[1,0]会因CANNOT_READ_ARRAY_FROM_TEXT失败,而[true,false]可正常工作。#109976 (Groene AI). - 修复在应用阶段列已存在时,
ALTER TABLE... ADD COLUMN IF NOT EXISTS错误触发ILLEGAL_COLUMN的问题。当同一语句中使用IF NOT EXISTS两次添加同一列,或并发ALTER在准备与应用阶段之间添加该列时,便会发生此问题。#110080 (Groene AI). - 修复查询包含选择性过滤器时,在并行副本下
FixedString列的length(以及 QBit 维度) 返回0而非固定大小N的错误结果。#110427 (Groene AI). - 修复
flipCoordinates丢失Geometry类型的问题:对于Geometry参数,结果现在会重新标记为Geometry,而非底层的Variant(...),因此可直接传递给areaCartesian等函数。 #110694 (Groene AI). - 修复
optimize_injective_functions_in_group_by更改GROUP BY GROUPING SETS和GROUP BY... WITH TOTALS查询结果的问题。文档说明该设置不会改变结果,但消除聚合键的单射函数时,对于该键不属于聚合集的行 (即GROUPING SETS中不包含该键的集合) ,或对于WITH TOTALS行,会生成错误值 (或丢失一行) 。错误值可能恰好与真实键值相同,导致超级聚合行无法与同一结果集中的实际分组区分。 #110721 (Groene AI). - JSON
Bool解析中的数值1/0现在会遵循allow_special_bool_values设置。此前,对于Variant(Bool, UInt32)的 JSON 输入 (如{"v":1}) ,即使allow_special_bool_values_inside_variant = 0,也会被读取为Bool,因为 JSONBool解析器会忽略该设置,且Bool在Variant反序列化中的优先级高于整数类型。 #110835 (Groene AI). - 修复当
INSERT流经依赖的 materialized view 时出现的 logical errorblock.rows() == getRows():该视图的目标为Alias,内部查询会改变行数,且别名链后存在可访问的去重表。在发布构建中,此问题会导致越界读取和 insert deduplication 失效。 #111103 (Alexey Milovidov). - 修复对嵌套在
Tuple、Array、Map、Nullable或Variant等容器列中的兼容聚合状态列 (例如quantileState和quantilesState(0.9)) 执行集合操作时出现的 logical errorBlock structure mismatch(在调试和 sanitizer 构建中) 以及Illegal types of arguments错误。 #111191 (Alexey Milovidov). - 修复带有排序
LIMIT/OFFSET的DISTINCT在 DISTINCT 提前停止限制提示无法限制结果头部时返回错误行的问题,包括:负数LIMIT(返回头部而非尾部) 、小数LIMIT/OFFSET(小数部分只能在完整读取后确定) ,以及不带LIMIT的单独OFFSET(偏移量之后的尾部被丢弃) 。例如,在多 part 表上执行SELECT DISTINCT intDiv(x, 100) FROM t ORDER BY intDiv(x, 100) LIMIT -1时,会返回最小的不同值而非最大的。 #111326 (Groene AI). - 修复查询使用
set跳过索引且谓词形如(x AND <null-value>) OR y时返回错误结果的问题,其中 NULL 由函数生成 (例如toInt64OrNull('x')、nullIf(1, 1)、CAST(NULL AS Nullable(Int64))) 。此类值会被__bitWrapperFunc包装,并传播NULL而非 “unknown” 掩码,因此 set 索引可能会跳过实际匹配的数据粒度,导致查询返回的行数少于应有数量。 #111604 (Groene AI). - 修复当 Iceberg 表包含在
ALTER TABLE... ADD COLUMN前后写入的数据文件且启用了optimize_move_to_prewhere时,DELETE/UPDATE会静默删除错误行 (或抛出NOT_FOUND_COLUMN_IN_BLOCK) 的问题。 #111693 (Groene AI). - 修复了在包含两个或更多分片的
Distributed表上、通过clusterAllReplicas或使用自定义键的并行副本执行ORDER BY ... WITH FILL ... INTERPOLATE时出现的LOGICAL_ERROR(“Invalid number of rows in Chunk”) ;在强化构建中,还会导致相关的越界中止,即使结果为空也会出现。现在仅在生成最终结果的节点上应用WITH FILL,同时修复了生成的填充行在分片/副本间重复的问题。 #111919 (Yakov Olkhovskiy). - 确保
randBinomial在任意试验次数下均可使用退化概率0和1。 #112021 (Alexey Milovidov). - 修复了向量搜索查询污染查询条件缓存而导致结果错误的问题。在具有
vector_similarity索引的表上,SELECT... WHERE <condition> ORDER BY <distance function> LIMIT n查询可能将数据粒度标记为不匹配<condition>,从而使随后在同一表上执行的普通SELECT... WHERE <condition>静默返回较少的行。向量搜索读取不再写入查询条件缓存。 #112086 (Groene AI). - 修复了以下问题:定义中以
substring语法无法重新解析的形式调用substr、mid或byteSlice的CREATE VIEW或CREATE FUNCTION虽可被接受,但 ClickHouse 为其写入的元数据不是有效的 SQL。之后读取该定义会因SYNTAX_ERROR失败;服务器启动时还会中止元数据加载,导致服务器完全无法启动。现在此类定义可以正常往返处理,形如substring(x, a, b, c)的现有元数据文件也可再次读取,因此受影响的服务器无需手动干预即可启动。 #112195 (Groene AI). - 修复了
TimeSeries表的本地元数据与 Keeper 不一致,导致Replicated数据库中的副本恢复永久挂起的问题,使该副本此后无法再为该数据库提供服务,且重启后仍处于损坏状态。现在会在恢复元数据事务仍可用时删除此类表的内部表,而不再将其延后至根本无法执行DROP的后台任务。 #112218 (Groene AI). - 修复了读取
Nullable(Tuple(...))列的子列时的问题:当其元素为不可空的LowCardinality(T),且同一查询还读取父子列时,会出现错误。在 Compact part 上,父子列会返回错误值,或者查询会因Unexpected return type from assumeNotNull失败,或者服务器会因string_view强化断言而被终止;这是因为提取出的子列被反序列化到LowCardinality(Nullable(T))缓冲区中,其子流随后与父子列的读取共享。 #112232 (Groene AI). - 修复了 macOS 上启用 Sampling query profiler 时,因
pthread_rwlock丢失唤醒而导致的服务器永久挂起问题 (Apple bug FB24027930) :现在在 Darwin 上以对信号更稳健的实现替换pthread_rwlock。 #112267 (Raúl Marín). - 修复了查询在求值
geohashesInBox、arrayFold、sleep、base58Decode、h3PolygonToCells或h3PolygonToCellsWithContainment时忽略max_execution_time和KILL QUERY的问题。此类查询在取消后可能仍会继续运行数分钟。现在这也涵盖存储在表元数据中的表达式求值,例如排序键、跳过索引和PARTITION BY键。 #112273 (Groene AI). #113456 (Groene AI). - 修复了当查询包含
FINAL、PREWHERE过滤器、较小的LIMIT和make_distributed_plan = 1,且所选列顺序与表中列顺序不同时出现的逻辑错误Cannot add step Expression to QueryPlan because it has incompatible header with root step JoinLazyColumnsStep。惰性 materialization 替换计划节点时未保留该节点的输出请求头,导致查询计划不一致。#112303 (Groene AI). - 修复了写入架构中包含嵌套元组的 Iceberg 表时的问题。发布的表元数据将内部元组的字段名替换为位置名称
1、2…,导致使用默认Parquet格式时INSERT因INCORRECT_DATA失败,而使用Avro时无法读回该列。#112480 (Groene AI). - 修复了合并带有文本索引的 parts 时,若其中一个待合并的 part 为空 (例如变更删除了该 part 的所有行后) 出现的
ATTEMPT_TO_READ_AFTER_EOF错误。#112490 (Anton Popov). - 修复了在使用旧分析器时,必须为常量的 argument (例如
toDecimal32的 scale 或toDateTime的 timezone) 来自标量子查询而导致的错误结果和逻辑错误。此类 argument 会被当作值为零或空值进行分析,导致声明的结果类型与计算出的值不一致,并使CREATE VIEW和CREATE MATERIALIZED VIEW持久化错误的列类型。#112492 (Groene AI). - 修复了
ReplicatedMergeTree副本在应用自身待处理的ALTER... ADD COLUMN前,对从另一副本获取的 part 执行变更时出现的LOGICAL_ERROR(“Part… contains column… that is absent in table…”)。现在会将此类变更推迟到应用元数据更改后再执行。#112510 (Groene AI). - 修复了在 projection 中结合使用 GROUP BY、ORDER BY 和
arrayJoin时查询结果不正确的问题。#101775 (Yash ). - 修复了在
enable_hash_ring_filtering = 1的S3Queue/AzureQueue中,当一个批次包含无法处理的文件,且将该批次标记为处理中状态的 Keeper request 同时失败时发生的服务器崩溃 (越界访问) 。#108977 (Groene AI). - 修复了在具有 Wide parts 的表中,
ALTER TABLE... MODIFY COLUMN将列更改为带有动态子列的类型 (例如从Variant更改为Dynamic) 后,读取或合并该 part 时出现的逻辑错误Stream <col>.variant_discr... is not found(在调试和 sanitizer 构建中会导致服务器中止) 。#110204 (Groene AI). - 修复了在具有负偏移量的 timezone 中,将极端
DateTime64值 (例如INT64_MIN) 转换为Time/Time64时发生的有符号整数溢出 (UBSan) 。#110451 (Groene AI). - 修复了具有
_part_offset或 commit-order projection 的 MergeTree 表在禁用allow_part_offset_column_in_projections或allow_commit_order_projection后,分离该表或重启服务器会导致其永久无法 Attach 的问题。这两项设置仅在 CREATE 时作为门控条件,因此不再在 ATTACH 时重新检查。#110570 (Groene AI). - 使用
analyzer_compatibility_join_using_top_level_identifier = 1时,JOIN... USING中的标识符现在可解析为 SELECT 列表中子表达式内定义的别名 (例如SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)) ,与旧版 analyzer 的行为一致。此前仅会考虑顶层投影别名,即使启用该设置,此类查询仍会因UNKNOWN_IDENTIFIER异常而失败。现在,当匹配别名位于嵌套表达式中时,也会显示建议启用该设置的错误提示。 #110739 (Dmitry Novik). - 修复未经身份验证的请求可能导致 ClickHouse 解析转发客户端地址请求头中提供的主机名的问题。ClickHouse 现在仅接受这些请求头中的数字 IP 地址。对于转发地址的配额归属,无效值会被忽略,且不会进行 DNS 解析。启用
auth_use_forwarded_address后,会在身份验证期间拒绝无效的转发地址。拒绝信息会以 debug 级别记录。 #111060 (Dmitriy Borisenko). - 修复行策略和
additional_table_filters引用了查询未以其他方式选择的同一列时出现的NOT_FOUND_COLUMN_IN_BLOCK。 #111099 (Groene AI). - 修复启用 analyzer 时,存储在视图中的查询中由 CTE 名称限定的列 (
cte_name.column) 触发的UNKNOWN_IDENTIFIER错误。 #111386 (Dmitry Novik). - 修复使用并行副本读取时,如果查询在发起节点上通过投影优化 (精确计数、minmax 计数,或不选择任何范围的已存储聚合/普通投影) 获得完整结果,可能导致服务器中止的
LOGICAL_ERROR(Got read request from replica N for unknown stream...) 。 #111689 (Groene AI). - 修复
toStartOfInterval三参数重载中的有符号整数溢出问题:当origin参数接近Int64下界时,该函数会返回回绕后的值,而不是报告错误。 #112045 (Alexey Milovidov). - 修复多表 join 中的
LOGICAL_ERROR异常 (Block structure mismatch in joined block stream) 。当两个子 join 均不生成输出列时会出现该问题,例如将query_plan_optimize_join_order_limit设为0或1时执行SELECT count() FROM t1, t2, t3, t4 WHERE (t1.b = t2.b) AND (t3.a = t4.a)。 #112205 (Groene AI). - 修复
values表函数将插入String/文本列的非字面量Bool常量 (例如CAST(true, 'Nullable(Bool)')) 渲染为1/0而非true/false的问题。 #112308 (Yakov Olkhovskiy). - 修复对被位置删除操作清空的
Iceberg数据块进行分区时出现的LOGICAL_ERROR(partitions_count > 0) ,例如在对数据文件已被完全删除的分区Iceberg表进行合并整理时。 #112432 (Pedro Ferreira). - 修复 schema 推断会为值解析器无法重新读取的文本值推断数值类型的问题。此前,推断会接受悬空指数 (
1e+) 、缺少尾数 (.) 或重复符号 (++inf) ,但readFloatTextPrecise在读取推断出的 schema 时会以CANNOT_PARSE_NUMBER拒绝这些值;对于Dynamic列,这会在 INSERT 时导致错误。现在,推断会使用读取器实际使用的解析器验证数值。这还消除了推断类型依赖max_read_buffer_size的情况,并使0e5等有效的前导零指数形式能够在 TSV 中推断为Float64,与其在 CSV 中的现有行为一致。遵循 #112226,并解决 #112105 中与指数相关的部分。 #112453 (Groene AI). - 正确报告 PromQL 查询中错误的位置。 #112494 (Minh Vu).
- 修复在集群上执行聚合的查询启用
serialize_query_plan = 1和基于计划的并行副本时出现的LOGICAL_ERROR(Cannot add transform Resize to Pipes because it has no outputs) 。该问题由合并步骤将管道调整为零个流引起。 #112506 (Groene AI). - 修复表名长度检查中的无符号下溢问题,该问题允许创建永远无法删除的表。当转义后的数据库名称达到 214 字节时,为
metadata_dropped文件名计算的限制发生回绕,因此CREATE TABLE会被接受,而后续的DROP TABLE或DROP DATABASE会因File name too long失败。现在,此类名称会被以ARGUMENT_OUT_OF_BOUND拒绝,与刚好低于该边界时已返回的错误相同。 #112527 (Groene AI). - 修复在子查询中使用
getClientHTTPHeader时出现的Context has expired异常。 #112533 (Alexey Milovidov). - 修复
s3_allow_server_credentials_in_user_queries错误拒绝查询提供的extra_credentials(role_arn = '...')的问题。现在,始终允许使用显式角色进行 STS assume-role:这不会向查询暴露服务器自身的凭据,并且这是为私有 S3 bucket 授予访问权限的文档化方式。 #112603 (Raúl Marín). - 修复
ORDER BY落盘的查询中读取计数器 (read_rows、read_bytes、ProfileEvents['SelectedRows']、ProfileEvents['SelectedBytes']) 以及READ_ROWS和READ_BYTESQUOTA 被重复计费的问题。从外部排序临时 File 中重新读取的行被再次计为源端读取,因此落盘查询会高报读取量,即使未超出配额也可能因QUOTA_EXCEEDED被拒绝。 #112645 (Groene AI). - 修复写入格式为
Avro的 Iceberg 表将声明为"required": false、类型为list、map或struct的字段序列化为必填字段且不使用["null", T]union 的问题,导致数据文件自身的 schema 与表 metadata 不一致,其他 Iceberg 读取器会将其视为必填字段。现在,此类字段会按 Iceberg 规范写入为用于可选字段的["null", T]union。 #112648 (Groene AI). - 修复了当
WHERE谓词包含位于NOT下、delta-kernel 谓词转换器无法处理的子表达式时,DeltaLake表返回行数过少的问题。现在会将此类子表达式作为显式的未知谓词报告给 delta-kernel,而不再将其视为子迭代器结束;后者过去会静默截断外层合取条件。 #112652 (Groene AI). - 修复了堆损坏问题:
const方法AccessRights::getFilters修改了由并发查询共享的访问权限树,可能导致服务器在关闭时崩溃。 #112692 (Groene AI). - 修复了当
ARRAY JOIN子句不包含表达式时出现的查询格式化逻辑错误。现在会在解析时以SYNTAX_ERROR拒绝此类子句,与空USING的处理一致,而不再接受并将其格式化为无法重新解析的文本。 #112699 (Groene AI). - 修复了本地执行分布式查询计划 (
distributed_plan_execute_locally = 1) 时查询挂起的问题:内存交换读取器可能会在产生其数据的源启动前阻塞唯一的管道线程。 #111762 (Alexander Gololobov). - 修复了类型为
list、map或struct且声明为"required": false的Iceberg字段在Parquet页脚中被写为REQUIRED的问题。现在此类字段会被写为OPTIONAL,与已发布的Iceberg架构及其他读取器一致。 #112669 (Groene AI). - 修复了管道执行器中的堆释放后使用问题;当查询在运行时移除处理器 (例如使用延迟读取或外部排序的
FINAL) 时,该问题可能导致服务器崩溃。该问题由 AST fuzzer 发现。 #111017 (Groene AI). - 修复了启用共享存储快照 (设置
enable_shared_storage_snapshot_in_query) 的查询从快照中剥离数据分区片段时发生的释放后使用问题 (段错误) ——例如,流式子查询读取的MergeTree表也由查询的另一部分并发读取。 #111192 (Alexey Milovidov). - 在
CREATE TABLE时拒绝在生存时间 (TTL) 表达式中以不受支持的方式使用AggregateFunction列 (例如TTL toDateTime(state)) ,而不是在稍后执行 TTL 时因ILLEGAL_TYPE_OF_ARGUMENT失败。这也涵盖包含在Variant备选项和Dynamic值中的状态。finalizeAggregation等能够处理状态的有效使用方式仍会被接受。 #107366 (Ria Khatoniar). - 修复了针对
Distributed表的查询中,从多个连接树位置引用MATERIALIZEDCTE 时出现的LOGICAL_ERROR(CTE '...' does not have query tree, but was not planned yet) ——例如两个已连接的子查询,或一个已连接的子查询加上WHERE中的标量子查询。现在查询会正常执行,不再引发异常 (该异常会使服务器在 debug/sanitizer 构建中中止) 。 #108924 (Groene AI). - 在分桶 Map 序列化中保留原始键顺序,以修复依赖该顺序的比较操作。 #109178 (Pavel Kruglov).
- 修复了在 Iceberg 表上执行
ALTER TABLE... EXECUTE expire_snapshots后,system.iceberg_history中保留快照的made_current_at变为1970-01-01的问题。还修复了元数据中没有snapshot-log的表在system.iceberg_history中不返回任何行的问题。#111781 (Groene AI). - 修复了
FixedString文本尝试解析失败时在列中留下部分已追加字节的问题,这可能导致序列化Variant/Array/Nullable列时出现Sizes of nested column and null map of Nullable column are not equal逻辑错误,或使结果字节发生静默错位。#111908 (Groene AI). - 修复了
replaceOne、replaceAll、replaceRegexpOne和replaceRegexpAll忽略max_execution_time和KILL QUERY的问题。单次调用现在会在执行期间检查是否已取消,因此对大值或大量行进行的长时间替换会停止,而不会持续占用服务器线程直至完成。此类调用无法返回部分结果,因此在timeout_overflow_mode = 'break'下,会将超时作为错误报告:常量折叠时始终如此;在执行管道中,只要在执行器的块间检查之前到达此检查点也会如此,而该检查仍会静默停止查询。#112483 (Groene AI). - 修复了普通
VIEW主体通过查询参数引用表或字典时出现的逻辑错误和错误的依赖关系记录,例如CREATE VIEW v AS SELECT x FROM {db:Identifier}.t。此类视图不再记录对当前数据库中同名表的引用依赖关系,因此无关的表现在可以再次删除。#112704 (Groene AI). - 修复了列被删除后重新添加时,对其
Nested元素子列进行错误类型读取的问题。将此类子列与其父列一同选择时,会在子列的位置返回整个元素,而块中仍声明为元素类型,这会在发布版构建中产生任意值,并在调试和 sanitizer 构建中导致逻辑错误。#112769 (Groene AI). - 修复了读取使用
Quantized('product',...)编解码器的列的product_quantization_codebook子列时出现的Cannot read all data of type FixedString问题。每个分片的码本写在所有数据粒度的数据之后,因此不由标记分隔;如果读取的标记范围在该分片的最终标记之前结束,码本可能无法被完整读取。#112818 (Alexey Milovidov). - 修复了向
File表引擎或file表函数执行INSERT,并追加写入采用不支持追加格式 (如Avro) 的非空文件时发生的段错误和静默数据损坏问题。通过文件描述符或分区路径写入会绕过现有检查,导致格式前缀被抑制,并在已有字节后写入第二个头部,使文件无法读取。现在此类INSERT会被CANNOT_APPEND_TO_FILE拒绝,与普通路径的处理方式一致。#112839 (Groene AI). - 通过在构建函数时捕获客户端连接 ID,修复了在子查询中使用
connectionId时引发Context has expired的问题。关闭 #112533。#112870 (ClickGap AI Bot). - 修复
Poco::NumberParser解析无法容纳在目标类型中的整数时的问题。该解析器用于读取 JSON 数字;此前,此类数字会被静默解析为错误的值 (例如,18446744073709551617会变为1) ,而不是被拒绝;超过Int64最大值的UInt64数字在 AST JSON 往返转换后也无法保留。 #112904 (Alexey Milovidov). - 修复将
Array和Map值与NULL比较时的IS DISTINCT FROM问题。关闭 #103042。 #103162 (yanglongwei). - 防止由领导者执行的复制式分布式 DDL 在重试耗尽后永久阻塞后续的
ON CLUSTERDDL 查询。 #108505 (Ahaan Limaye). - 修复集合操作 (
INTERSECT/UNION ALL/EXCEPT) 合并使用关联子查询且设置了correlated_subqueries_default_join_kind = 'left'的分支时出现的LOGICAL_ERROR(“在所有输入完成前尝试从 ChunkBuffer 提取 chunk”) 。 #108554 (Groene AI). - 现在,在所有架构上,将超出范围的浮点值 (
BFloat16、Float32、Float64) 以及超过Int64::max()的UInt64值转换为DateTime和Time时,都会可靠地饱和至范围边界 (此前,超出范围的转换结果取决于架构,并且在 x86-64 上可能发生回绕) ;非有限值 (NaN、inf) 现在会抛出异常,而非产生任意结果。同样的修复也应用于toDate中从浮点数转换为Date的路径,以及将UInt64和宽整数 ((U)Int128、(U)Int256) 转换为Date和Date32的路径;这些转换此前可能返回 epoch 前的日期,而非饱和至边界。现在,对于每种数值源类型,将数字转换为Time都会饱和至该类型的范围 (此前,来自窄无符号整数或宽整数源的值会以未钳制状态存储,仅在打印时才会被钳制) ;将数字精确转换为Time时,也不再拒绝Time支持的负值,或静默饱和无法容纳的值。将数字精确转换为Date32(accurateCast、accurateCastOrNull) 时,不再静默饱和超出范围或非有限值,而是会像对Date和DateTime一样抛出异常或返回NULL;OrDefault变体则会针对这类输入返回Date32的默认值。现在,将非整数浮点数精确转换为Date、Date32、DateTime或Time会被拒绝,而非被静默截断。还修复了toDateTime32函数文档,该文档此前错误地展示了toDateTime64示例并描述了DateTime64的值范围。 #110459 (Alexey Milovidov). - 当表启用了
fsync_part_directory设置时,ALTER TABLE... DETACH PARTITION/PART现在会对其在detached/下创建的克隆执行 fsync (包括分片子树以及直至磁盘根目录的目录链) ,适用于 Full (目录) 和 Packed 分片存储。此前,克隆从未执行 fsync,而用于从活动集合中移除行的空覆盖分片却执行了 fsync;因此,确认操作后立即断电可能导致 btrfs 上已分离的数据被销毁 (未同步的克隆目录条目会回滚,导致detached/为空,没有任何内容可供ATTACH) 。该行为由现有的fsync_part_directory设置控制;默认行为不变。 #111426 (Groene AI). - 修复当调用方不具备被替换对象的删除权限时,
CREATE OR REPLACE会以内部名称遗留该对象的问题。#111466 (Nikolay Degterinsky). - 修复对具有多个分区且定义了行策略的表执行
STREAM读取 (enable_streaming_queries = 1) 时发生的崩溃问题。在调试和 sanitizer 构建中,会出现Filter column... not found in DAG outputslogical error;在发布构建中,则可能发生段错误。#111572 (Groene AI). - 修复快照摘要不准确或损坏的 Iceberg 表上
count()的问题:简单计数优化现在会从 manifest 文件中获取精确的行数,并在行级删除导致元数据计数不准确时回退为实际扫描。同时修复 IcebergOPTIMIZE TABLE写入错误的 manifest 列表计数和谱系信息的问题,并让totalBytes元数据能够稳健处理损坏的摘要。#111617 (Melvyn Peignon). - 修复当 PREWHERE 条件被拆分为多个读取步骤时,分片中缺失的 DEFAULT 列会填充类型默认值而非 DEFAULT 表达式的问题。关闭 #111757。#111795 (Yarik Briukhovetskyi).
- 修复在分片上执行启用了
enable_parallel_blocks_marshalling(默认启用) 的分布式查询时出现的Expected UInt64 column for __grouping_set, got BLOB和ColumnBLOB should be converted to a regular column before usagelogical error。例如,在具有本地副本的集群上使用GROUP BY GROUPING SETS,或读取跨越本地表和分布式表的Merge表时,可能会发生此问题。对于块在同一进程中被消费的计划,不再添加BlocksMarshallingStep。#111997 (Groene AI). - 现在加载到损坏的 MergeTree 统计信息时,操作会失败,而不再忽略错误。#112201 (Sergey Kuznetsov).
- 修复在另一个 Merge 表或列类型不同的 materialized view 上使用 PREWHERE 时发生的 logical error。同时修复从远程 server 读取的表上行策略被静默忽略的问题 (Distributed 表或封装该表的表) ,该问题可能会暴露策略原本要隐藏的行;此类查询现在会被拒绝并报出 ILLEGAL_PREWHERE 错误。请改为在每个远程 server 上的底层本地表中定义这些策略;请注意,使用
serialize_query_plan = 1发送的读取仍不会应用此类策略,这是另一个此前已存在的 bug。#112326 (Pedro Ferreira). - 修复
connection_pool_max_wait_ms,使其文档所述的默认值0表示无限超时。此前,发现连接池已满的查询会在紧密循环中重试,消耗 CPU,并在每次迭代时记录No free connections in pool. Waiting 0 ms.。现在会等待,直到连接归还到连接池。关闭 #112053。#112380 (Groene AI). - 修复 HDFS 上已确认的 Iceberg 写入被静默丢失的问题:Iceberg 提交会通过条件写入发布每个新的元数据文件,但
HDFSObjectStorage丢弃了该条件并执行普通覆盖,因此所有并发写入方都会收到确认,而其中一个写入方的快照会变得不可访问。HDFS 现在会拒绝条件写入,因此 HDFS 上由存储管理的 Iceberg 写入 (包括具有显式列列表的CREATE TABLE... ENGINE = IcebergHDFS(...)) 现在会失败。读取不受影响。#112437 (Groene AI). - 修复 insert deduplication 中的越界读取问题 (会导致发布构建崩溃) :当
INSERT经由内部查询会改变行数的 materialized view 写入已分区的去重目标表时,会触发此问题。DeduplicationInfo::filterToPartition会遍历大小为 (较小的) 视图输出块的分区选择器中标记对应的源行范围,将每个去重标记归入相应分区,从而发生越界读取。现在,对于任何 materialized view 目标表——行数变化后已无法建立源行到分区的映射——会在每个分区中保留所有标记,不再进行越界遍历 (也不再触发后续保护机制针对同一 INSERT 抛出的NOT_IMPLEMENTED) 。#112649 (Sema Checherinda). - 修复将
finalizeAggregation应用于某列时发生的逻辑错误 (会在调试和 sanitizer 构建中中止) :该列的 aggregate state 来自共享同一状态表示、但最终类型不同的函数——例如由UNION合并或通过arrayReduce生成的quantileState和quantilesState(0.9)。此类查询现在会报出常规错误,而非崩溃。#112662 (Zain Ul Abidin). - 修复
KeeperMap表上的DELETE仅删除前max_block_size个匹配行,却将变更报告为已成功完成的问题。同时修复在keeper_map_strict_mode = 1时,DELETE不具备原子性的问题:它可能回退为无版本删除,进而删除被并发更新的行;且会逐块处理匹配行,因此发生冲突时可能只部分完成删除。#112777 (Alexey Milovidov). - 修复在未完成的
RENAME COLUMNalter-mutation 仍在执行时,对MergeTree表执行ALTER的问题。这可能以不兼容的方式更新存储元数据,并彻底阻塞后续变更。#112783 (Mikhail Artemenko). - 修复当
enable_analyzer = 0是服务器默认值时,包含递归 CTE 的视图会导致服务器启动和ATTACH因WITH RECURSIVE is not supported with the old analyzer而失败的问题。#112784 (Nikolay Degterinsky). - 修复当
Join表引擎位于 JOIN 右侧,且其ON部分包含引用两个表列的条件时发生的逻辑错误,例如ON (t.key = j.key) AND (t.a < j.a)。此类查询现在会被清晰的异常拒绝,而不再引发required columns:... but not found any in left table或std::bad_variant_access。#112815 (Groene AI). - 修复带有混合条件的
JOIN返回错误结果的问题,即包含跨表非等值残余条件的情况,例如ON (t1.key = t2.key) AND (t1.a * 10 < t2.a)。只有哈希系列算法能够评估此类条件,但full_sorting_merge、partial_merge和直接 key-value join 曾声称可以执行这些 JOIN,随后却静默忽略残余条件,返回额外行。现在它们会拒绝此类 JOIN,因此将改用哈希算法。#112831 (Groene AI). - 修复使用直接 I/O 从
encrypted磁盘读取Compact分片时出现的ReadBufferFromEncryptedFile: Wrong file position逻辑错误,该问题会导致合并操作卡在system.replication_queue中。#112943 (Alexey Milovidov). - 修复了解析末尾包含大量无法识别字符的 PromQL 查询时出现的二次方级性能退化问题 (例如,使用 NUL 字节填充的
FixedString值) :此前,解析兆字节级的无效输入会让一个线程忙碌数十分钟且无法取消,因为此过程发生在查询分析阶段。现在,解析器会在遇到第一个错误时停止。 #112944 (Alexey Milovidov). - 拒绝单位重复或未按从长到短顺序排列的 PromQL 耗时。 #112954 (Minh Vu).
- 修复了启用
output_format_parquet_parallel_encoding(默认启用) 且max_threads大于 1 时写入Parquet发生的挂起问题。如果编码器无法调度额外线程,其活动线程计数器会发生下溢,导致写入可能永久停滞,而非完成或报告错误。 #112959 (Groene AI). #113170 (Alexey Milovidov). - 修复了
geohashesInBox在零面积边界框上耗费无界时间的问题,例如geohashesInBox(0., 0., 180., 0., 12)。此类查询会返回正确的单个 geohash,但每行会执行约 5e8 次空循环迭代,并忽略max_execution_time和KILL QUERY。 #112976 (Groene AI). - 修复了当替换字符串引用未参与匹配的捕获组时,
replaceRegexpOne/replaceRegexpAll中的未定义行为 (向memcpy传递空指针) ,例如replaceRegexpAll('abc', '(a)|(b)', '\\2')。 #113012 (Alexey Milovidov). - 拒绝标记为已写入但不带值、却携带非
true值的SETTINGS变更,并且在格式化查询时不再省略此类变更的值。此前,精心构造的 AST JSON 载荷可通过false执行Bool设置,而system.query_log和formatQueryFromJSON显示的却是不带值的形式。 #113025 (Alexey Milovidov). - 修复了以极大延迟调度后台任务时的未定义行为和静默调度错误,例如具有极长
REFRESH AFTER周期的可刷新materialized view。现在,延迟会被限制为可表示的最大值,而不会溢出。 #113041 (Groene AI). - 修复了读取物理类型宽于其声明精度所映射类型的
ParquetDECIMAL列时发生的越界写入问题,例如以物理类型INT64存储的DECIMAL(9, 2)。此类文件是有效的Parquet文件,其他写入器也会生成它们,但读取器根据声明精度确定目标列大小,而解码器则按物理宽度写入,从而造成内存损坏。现在,读取此类文件时,如果值无法容纳在声明精度内,也会引发DECIMAL_OVERFLOW,而不再返回损坏的数据;当 type hint 至少与物理类型一样宽时,可无损读取。 #113046 (Groene AI). - 修复了对非常量列使用常量除数 -1 时,
intDiv在计算最小有符号数的除法 (例如intDiv(-9223372036854775808, -1)) 时会静默回绕,而非像其他执行路径一样抛出ILLEGAL_DIVISION异常的问题。静默回绕还可能导致ORDER BY/DISTINCT结果错误,因为按序读取优化会正确地将除数为负常量的intDiv视为单调函数,而回绕后的值会破坏相应的排序顺序。 #113048 (Alexey Milovidov). - 修复了在 ClickHouse 26.3 中使用
unicode_word分词器创建的文本索引无法在后续版本中加载的兼容性问题。 #113061 (Robert Schulze). - 修复了按分区分发数据的查询中出现的
Pipeline stuck逻辑错误,例如带有PARTITION BY的窗口函数或使用join_algorithm = 'parallel_full_sorting_merge'的 join。当某个分片的下游处理已完成,但某个块仅完成部分分发时,会触发此问题。 #113190 (Groene AI). - 修复了 hash join 仅有一个宽度超过 8 字节的
LowCardinality键 (UInt128、Int128、UInt256、Int256及其Nullable变体) 时会产生错误结果的问题。此类 join 会静默返回键值不相等的行。 #113230 (Groene AI). - 修复了在表级
ALIAS列上执行ALTER TABLE ... ADD PROJECTION后导致表无法使用的问题:当会话设置optimize_respect_aliases = 0时,后续INSERT会因UNKNOWN_IDENTIFIER(Missing columns) 失败。 #109091 (Groene AI). - 修复了在
MergeTree右表上执行directJOIN时出现的NOT_FOUND_COLUMN_IN_BLOCK和LOGICAL_ERROR异常,以及调试和 sanitizer 构建中的相关中止问题。 #109932 (Groene AI). - 修复了操作数没有最小共同超类型时此前会抛出
ILLEGAL_TYPE_OF_ARGUMENT的比较问题。现在可以使用=、!=、<、<=、>、>=、IS DISTINCT FROM和IS NOT DISTINCT FROM对Array(Int64)与Array(UInt64)、Array(Int256)与Array(UInt256)等 Array 进行字典序比较。isDistinctFrom和isNotDistinctFrom现在还会按值比较受支持的非 Array 数值和十进制类型组合,而非抛出异常;同时也修复了嵌套在Tuple(Nullable(...))中的 Array 的相等比较。关闭 #33897。 #110245 (Diego Gomes Tomé). - 修复了在主键索引分析期间,当
LowCardinality键列被嵌套CAST链包装且该链重新引入LowCardinality时出现的LOGICAL_ERROR(Bad cast from ColumnString to ColumnLowCardinality) ,例如WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5'。在调试和 sanitizer 构建中,此问题会导致服务器中止;在发布构建中则会导致查询失败。 #111050 (Groene AI). - 修复了对
Join引擎表使用USING执行FULL JOIN时的错误结果:当左键为Nullable而存储键不是时,键为NULL的未匹配左侧行会返回0而非NULL。 #111371 (Groene AI). - 修复通过
Merge表读取MaterializedPostgreSQL数据库时,仍会看到过期或已删除行版本的问题。此类读取现在会经由MaterializedPostgreSQL包装器,并采用与直接读取相同的FINAL和_sign = 1过滤。 #112382 (Alexey Milovidov). - 修复在列类型比表元数据中记录的类型旧的分片上执行重写整个分片的变更时出现
Bad cast from ColumnNullable to ColumnString的问题,例如先执行ALTER TABLE ... MODIFY COLUMN,再执行ALTER TABLE ... MATERIALIZE PROJECTION后。 #112501 (Alexey Milovidov). - 修复基于行的输入格式在解析一个块时,可能数分钟不响应
KILL QUERY和max_execution_time的问题。现在每处理 8192 行会检查一次是否已取消,因此被终止的INSERT(包括后台异步插入刷新) 会及时停止,而不会一直运行到块末尾。 #112646 (Groene AI). - 修复
RENAME TABLE错误地根据源数据库而非目标数据库检查最大表名长度的问题。将表重命名到名称较长的数据库中,可能生成无法通过DROP TABLE删除的表;而将表从这类数据库中重命名出去则会被错误拒绝。 #113019 (Groene AI). - 修复从声明的列类型与其内部查询产生的类型不一致的
VIEW中查询时出现的UNKNOWN_IDENTIFIER,例如SELECT sum(length(arr)) FROM v,其中v基于一个String列将arr声明为Array(UInt8)。在默认设置optimize_functions_to_subcolumns = 1下,优化器会将length(arr)重写为读取arr.size0子列,并将该名称传递给不存在此子列的内部查询。 #113057 (Groene AI). - 修复变更谓词使用未显式指定数据库名称的
merge表函数时发生的异常 (在发布构建中会导致服务器无法启动) 。现在会使用发生变更的表所在的数据库,与表名的处理方式一致。 #113185 (Alexey Milovidov). - 修复在
share_nested_offsets = 1的MergeTree表上,同时读取删除后重新添加的Nested成员的子列及同组现有成员时出现错误结果和LOGICAL_ERROR的问题。当读取跨越多个块时,现有成员会返回后续块中的值。 #113225 (Groene AI). - 修复在
ReplicatedMergeTree表上使用alter_sync = 2执行ALTER、OPTIMIZE、TRUNCATE和分区操作语句时的挂起问题:如果语句正在等待另一个副本,表同时开始关闭 (例如由于并发执行DROP DATABASE ... SYNC) ,就会发生此问题。此类语句现在会以UNFINISHED失败,并会遵循max_execution_time和KILL QUERY。 #113228 (Groene AI). - 当
stdout为 TTY 时,不再向INTO OUTFILE写入 ANSI 转义序列。 #113252 (Azat Khuzhin). - 修复异步插入队列中不同条目具有相同截止时间时罕见的释放后使用问题。 #113363 (Miсhael Stetsyuk).
- 修复从同一备份创建多个
ENGINE = Backup数据库,或以不同名称重新创建此类数据库时表会悄然变为空的问题。现在,支撑Backup数据库的存储策略名称中会包含本地数据库名称,因此每个数据库都会获得为其自身数据路径创建的磁盘。#113378 (Groene AI). - 修复当
MergeTree表具有两条或更多TTL ... DELETE WHERE规则,且时间表达式相同、仅WHERE条件不同时,行永远不会被删除的问题。TTL 删除合并后,数据分片的rows_where_ttl_info会被重置为零,因此不会再为其调度 TTL 合并,过期行会无限期保留,且不会产生错误或日志消息。关闭 #113116。#113384 (Groene AI). - 对匹配多个表的
Merge表 (或merge表函数) 的查询,现在会在构建各表查询计划时响应KILL QUERY和max_execution_time,而非仅在所有子表规划完成后才响应。使用timeout_overflow_mode = 'break'时,还会停止为其余匹配表构建查询计划,并按该模式文档所述返回部分结果而不报错。#113415 (Alexey Milovidov). #113642 (Groene AI). - 修复
clickhouse-client在使用 Ctrl+C 取消查询后,或执行从 stdin 读取数据的INSERT后,以代码139而非0退出的问题。#113431 (Groene AI). - 允许文本索引的
preprocessor和postprocessor表达式引用ALIAS列。#110014 (Jimmy Aguilar Mena). - 修复并行副本返回重复行的多种情况:基于查询计划的并行副本忽略了
distributed_aggregation_memory_efficient,导致内存高效合并的桶乱序到达并被合并两次;此外,当并行副本不适用于该查询,或者parallel_replicas_mode请求按自定义键筛选但未设置parallel_replicas_custom_key时,尽管数据未在各副本之间拆分,仍会从分片的所有副本读取数据。#112942 (Nikita Taranov). - 修复启用
database_atomic_wait_for_drop_and_detach_synchronously时,CREATE TABLE ... AS SELECT的填充SELECT失败后无法终止的问题:临时表的内部清理DROP会等待后台删除队列,并忽略KILL QUERY和max_execution_time。#113504 (Groene AI). - 修复
ALTER TABLE ... EXECUTE remove_orphan_files删除Iceberg表仍在使用的metadata/version-hint.text文件的问题。其可达集合条目通过字符串拼接构建时,错误地假设一个永远不会带尾随斜杠的值带有尾随斜杠,因此实际的提示文件从未被识别为可达,并会在早于older_than阈值时被删除。使用iceberg_use_version_hint = 1时,该表随后将完全无法读取。#113548 (Groene AI). - 修复了未限定名称的参数化视图查询被发送到分片时丢失所在数据库的问题,导致分片在自身默认数据库中解析该名称。根据该数据库中的内容,查询可能因
UNKNOWN_FUNCTION失败,或静默返回另一视图中的行。通过Distributed表使用IN、JOIN和remote时会受影响。 #113550 (Groene AI). - 修复了查询在
indexHint中使用子查询按name列筛选system.databases时出现LOGICAL_ERROR的问题,例如SELECT count() FROM system.databases WHERE indexHint(name IN (SELECT 'foo'))。 #113556 (Groene AI). - 修复了当
merge_max_block_size_bytes设置得低于空列的byteSize()时,后台合并和OPTIMIZE会陷入无限循环的问题。空的LowCardinality列仍会携带其字典,因此可能在合并任何一行之前就达到字节限制;之后合并会不断生成空块,占满一个 CPU 核心,且永不释放后台池槽位。 #113585 (Groene AI). - 修复了对
Variant列的查询忽略max_execution_time和KILL QUERY的问题。使用多个Variant参数调用函数时,会针对每个参数的每种备选类型解析一次函数,而执行此操作的两个循环都未检查是否已取消,因此此类查询在完成前无法停止。 #113612 (Groene AI). - 修复了以非全小写的任意字母大小写形式写入
auto和none压缩提示时出现Unknown compression method的问题,例如file('data.csv.gz', 'CSV', 'x String', 'AUTO')。GZIP等编解码器名称本已支持不区分大小写;现在这两个特殊提示的行为也与之相同。 #113631 (Groene AI). - 修复了新 analyzer 下常量折叠会更改常量
Geometry值类型的问题。Geometry是具名Variant,其备选类型可能共享相同的存储布局 (LineString/Ring、MultiLineString/Polygon以及空值) ,因此仅备选类型不同的两个折叠后常量可能会合并为一个,例如MULTIPOLYGON EMPTY会变为LINESTRING()。 #110709 (Groene AI). - 修复了仅含一列的
MergeTree表在合并时出现异常 (Cannot calculate columns sizes when columns or checksums are not initialized) 的问题:该表的唯一列具有完全过期的列TTL,且min_bytes_for_wide_part = 1。 #111169 (Groene AI). - 无法启动后台调度池 (例如全局线程池耗尽时的
iceberg池) 不再会导致服务器中止:该错误现在会作为可恢复异常处理。读取system.background_schedule_pool也不再会附带创建这些池。 #111209 (Groene AI). - 修复了原生协议在处理损坏的索引数据时发生越界读取的问题。 #112331 (Pavel Kruglov).
- 修复了当两个查询同时解析同一个表名时,导致
Filesystem或HDFS数据库永久挂起的死锁问题。之后针对该数据库的所有查询都会永久阻塞且无法中断,因此需要重启服务器才能恢复。 #112495 (Groene AI). - 修复了正在与副本建立连接的分布式查询中,
max_execution_time和KILL QUERY会静默失效的问题。此类查询现在会在下一次尝试连接时停止,而不再依次尝试所有剩余副本并重试。#112689 (Groene AI). - 修复了可刷新materialized view 在规划刷新查询时被阻塞,导致
DROP TABLE和SYSTEM STOP VIEW挂起的问题。#113188 (Nikolay Degterinsky). - 修复了未指定列列表且使用
ENGINE = Distributed(...)或ENGINE = Buffer(...)的CREATE TABLE会泄露创建用户无权查看的引用表结构的问题。对于本地CREATE,现在会在该用户自身的上下文中推断结构,因此需要拥有引用表的SHOW COLUMNS权限。从 DDL 队列重放的CREATE(ON CLUSTER或位于Replicateddatabase 中) 不受此修复影响。#113220 (Groene AI). #113372 (Groene AI). - 修复了可通过
mergetable function 和Mergetable engine 读取内部_temporary_and_external_tablesdatabase 的问题;此前,一个 session 可以读取其他 session 和其他用户的 temporary tables。现在,database regexp 会跳过该 database,且显式指定该 database 也会被拒绝,与直接访问该 database 的处理方式一致。#113224 (Alexey Milovidov). - 修复了
countSubstrings、countSubstringsCaseInsensitive、countSubstringsCaseInsensitiveUTF8、countMatches和countMatchesCaseInsensitive忽略KILL QUERY和max_execution_time的问题:在处理大量行、匹配项较多或单个值较大时,函数调用可能在查询取消后仍继续运行数分钟。#113369 (Groene AI). #113886 (Groene AI). - 修复了当表使用
serialization_info_version = 'basic'时,Compact 分片的变更结果会因该分片的 serialization info 仍在内存中,还是已从serialization.json重新加载而不同的问题。在ReplicatedMergeTree中,这会导致持有字节完全相同源分片的两个副本写入不同的变更后分片,并使变更因CHECKSUM_DOESNT_MATCH而失败。关闭 #113500。#113588 (Groene AI). - 修复了当同一
snapshot-id在Icebergsnapshot-log中出现多次 (例如回滚后可能出现这种情况) 时,system.iceberg_history中的made_current_at会报告 snapshot 最早而非最近一次成为 current 的时间的问题。#113598 (Groene AI). - 修复了从针对
EmbeddedRocksDB、KeeperMap、Redis或字典等 key-value source 的JOIN右侧选择_table或_database等 virtual columns 时返回错误值的问题。查询可能错误地返回数据列的值,或因LOGICAL_ERRORexception 而失败。#113698 (Groene AI). - 修复了对具有多个子节点、使用裸列
PREWHERE且另有WHERE的Merge表执行EXPLAIN ANALYZE时,会因Required output position N is out of range for pass-through inputs而失败的问题。关闭 #113621。#113725 (Groene AI). - 修复了在
metadata_type = plain_rewritable的磁盘 (例如s3_plain_rewritable) 上使用clickhouse-disks move移动目录时因DIRECTORY_ALREADY_EXISTS而失败的问题;该问题还会遗留空的目标目录。#113727 (Groene AI). - 修复了当子表声明包含
IN的ALIAS列,且各子表中该列的默认值不一致时,读取Merge表会因No set is registered for key ...而失败的问题。#113757 (Groene AI). - 修复了在
enable_analyzer = 0时,若WHERE引用了子查询中由untuple生成的列而导致的UNKNOWN_IDENTIFIER,例如SELECT t.keys FROM (SELECT untuple(arrayJoin(m)) AS t FROM ...) WHERE t.values > 0。enable_optimize_predicate_expression重写会将此类谓词作为HAVING下推至子查询,但该名称在此处尚不存在。#113760 (Groene AI). - 修复了单个
ALTER TABLE ... MODIFY COLUMN语句同时将ALIAS列转换为实体列 (DEFAULT或MATERIALIZED) 并指定CODEC时,因Cannot specify codec for column type ALIAS而失败的问题。关闭 #113693。#113853 (Groene AI). - 修复了在旧 analyzer (
allow_experimental_analyzer = 0) 下,对连接后的Merge表执行ORDER BY ALL和GROUP BY ALL时的问题。查询不再因内部异常而失败,调试和 sanitizer 构建也不再中止。#109139 (Groene AI). - 修复了插入表达式中包含数值类型转换的值时可能偶发的
Cannot parse string ... as UInt64 ... While executing ValuesBlockInputFormat异常,例如initializeAggregation('sumState', 0::UInt64)。#110637 (Groene AI). - 修复了健康磁盘的定期本地磁盘检查误报失败的问题。当 server 与
local磁盘一同运行嵌入式 Keeper 时,两个检查线程可能会探测同一文件,短暂记录FILE_DOESNT_EXIST、CANNOT_READ_ALL_DATA或CANNOT_UNLINK,并暂时在BrokenDisks指标中将该磁盘计为损坏。#110773 (Groene AI). - 修复了启用基于查询计划的并行副本时,对
Merge表和merge表函数执行查询会产生错误结果及逻辑错误Cannot serialize FutureSetFromSubquery with no query plan的问题。#112849 (Alexey Milovidov). URL数据库引擎中的表不再向缺少读取源授权的用户泄露本地文件是否存在。仅需SHOW TABLESprivilege 的EXISTS TABLE以及表名解析,现在都会在探测文件系统前先进行授权检查。#113029 (Alexey Milovidov).- 修复了常量折叠裁剪掉 TTL expression 所引用的列后,导致该表达式无法使用的问题。例如,对于非
Nullable的x,TTL d + INTERVAL 1 DAY DELETE WHERE isNull(x)会导致对该表的每次INSERT都因Missing columns而失败。还修复了当表包含 TTL expression,且该表达式作用于使用variant_throw_on_type_mismatch = 0创建的Variant列时 server 无法启动的问题。#113042 (Alexey Milovidov). - 修复了取消
postgresql表函数和PostgreSQL表引擎读取操作的问题:在读取尚处于启动阶段时取消,可能会与事务指针产生竞态并导致取消丢失,使查询持续运行直至 PostgreSQL 完成。 #113150 (Groene AI). UNDROP TABLE在等待正在运行的查询释放已删除表期间,现在可以由KILL QUERY中断。 #113263 (Alexey Milovidov).- 修复了
PocoXML 处理程序在解析过程中抛出异常时整个 XML 解析器发生内存泄漏的问题,例如解析包含大量唯一元素名称的文档时Poco::XML::NamePool溢出。 #113348 (Alexey Milovidov). - 修复了对
HDFS磁盘的写入:当生成的对象键包含嵌套目录前缀时,不再因Parent directory doesn't exist而失败,因为现在会创建缺失的父目录。 #113396 (Alexey Milovidov). - 修复了启用
join_use_nulls时,对字典执行JOIN的ON子句包含同时涉及两个表的非等值条件 (如ON (t.key = d.key) AND (t.a * 10 < d.a)) 导致结果错误的问题,以及在启用断言的构建中触发断言中止的问题。 #113534 (Alexey Milovidov). - 修复了查询在发起节点上极快完成时,可能挂起长达
receive_timeout秒的问题。 #113551 (Nikita Taranov). - 修复了当被更新表所在数据库与会话数据库不同时,
UPDATE和轻量级DELETE读取错误表的问题。现在,未限定的表名和merge表函数会基于被更新表所在的数据库进行解析,因此语句不再静默更新或删除从其他表中选出的行。 #113748 (Groene AI). - 修复了并行
INSERT被错误地以TOO_MANY_PARTS拒绝的问题:当max_insert_threads将普通INSERT并行化时,查询不再将自身同级 sink 已提交的 parts 计入其中。关闭 #114015。 #114016 (Alexey Milovidov). - 修复了以下问题:具有并行副本的查询选择以
GLOBAL JOIN临时表形式传输的表中的ALIAS列时出现NO_SUCH_COLUMN_IN_TABLE;分布式JOIN两侧声明同名ALIAS列时出现MULTIPLE_EXPRESSIONS_FOR_ALIAS;以及Distributed表基于另一个ALIAS列声明ALIAS列时 (包括将其用作JOIN USING键) 出现UNKNOWN_IDENTIFIER。 #107700 (Yakov Olkhovskiy). - 修复了读取首个元素为
NULL的 CSVTuple时的问题。启用input_format_csv_deserialize_separate_columns_into_tuple和input_format_null_as_default后,诸如\N,1的行中开头的\N会被视为整个列均为NULL,导致该行被替换为默认值,而剩余元素单元格则会引发解析错误。现在,开头的NULL会被视为第一个元素的值,且input_format_null_as_default将应用于该元素。对于整个裸Tuple,若某行仅提供一个\N字段,现在会因缺少其余元素而被拒绝;请设置input_format_csv_deserialize_separate_columns_into_tuple = 0,以再次将此类字段作为整列读取。 #109744 (Groene AI). - 修复了带有
LIMIT的有效分布式查询中罕见的Logical error: 'No more packets are available.'。在调试版和 sanitizer 构建中,该问题还会导致服务器中止。 #110334 (Groene AI). - 修复了当远程数据库名称为空的
Distributed表以distributed_product_mode = 'local'模式用于JOIN时出现的逻辑错误 (!part.empty()) 。 #110677 (Groene AI). - 修复了分析器中数据库名称与表名相同的表对诸如
db.table.column的完全限定列名的解析问题。关闭 #82084。 #110976 (Alexey Milovidov). - 修复了只要配置了自动溢写到磁盘的阈值,哈希连接就会丢失其构建后优化 (转换为固定哈希表、共享运行时过滤器、右表重新排序) 的问题;自 26.5 起,该配置一直是默认设置。 #111972 (Alexey Milovidov).
- 修复了一个 bug:当列的子列用于主键/排序键、分区键或显式跳过索引时,
ALTER TABLE ... MODIFY COLUMN更改该列的JSON类型提示 (启用allow_experimental_json_lazy_type_hints时) 可能会损坏磁盘上的键或索引。常规读取会通过缓存的结构掩盖此问题,但在重新加载后 (例如服务器重启时) ,查询会因CANNOT_READ_ALL_DATA失败或返回错误结果。现在,只要此类ALTER更改了被引用JSON子列的磁盘上类型,就会被拒绝。对这些结构之外列的类型提示更改,或不会改变被引用子列磁盘上类型的更改 (例如添加无关的类型化路径) ,仍然只修改元数据。 #112302 (Pavel Kruglov). - 修复了当
query_plan_join_swap_table交换ANY JOIN且join_any_take_last_row = 1时返回错误结果的问题:ClickHouse 现在会保留原始的连接侧顺序,因此ANY JOIN仍会返回最后一个匹配行。关闭 #111645。 #112458 (Vladimir Cherkasov). - 修复了带前缀端点的
AzureBlobStorage磁盘上,listObjects在第一页之后的每一页都返回错误 blob 名称的问题,原因是分页绕过了用于去除端点前缀的客户端 wrapper。现在,分页会通过续页令牌重新进入 wrapper,因此每一页的 blob 名称都正确。 #112872 (Arsen Muk). - 修复了读取
Parquet文件时的无界内存分配问题:当其 Thrift 元数据声明的容器或字符串长度大于元数据本身时,系统此前会为该长度分配内存。现在会拒绝此类长度,而非为其分配内存。 #113212 (Groene AI). - 修复启用
read_in_order_use_virtual_row时,MergeTree按序读取查询结合使用WITH FILL ... INTERPOLATE和IN或has过滤器导致的Cannot insert element into Set(NOT_IMPLEMENTED) 错误。#113264 (Groene AI). - 修复部分
ORDER BY查询中optimize_read_in_order被静默跳过的问题,包括使用虚拟行,或对String排序键使用toString/CAST(..., 'Nullable(String)')的查询。同时修复在采用夏令时的时区中,对Time、Time64或DateTime值的toString结果进行过滤或ORDER BY时出现的错误结果。#113291 (Vladimir Cherkasov). - 对于
tuple()或(x, y)等无效的parallel_replicas_custom_key表达式,现会报出ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER,而非读取超出自定义键类型列表末尾的数据。#113359 (Nikita Taranov). - 修复使用命名集合的表在执行
DROP TABLE期间服务器被终止后,服务器重启失败的问题:后续DROP NAMED COLLECTION可能成功,导致表元数据引用不存在的命名集合,使下一次启动因NAMED_COLLECTION_DOESNT_EXIST而失败。#113524 (Alexey Milovidov). - 修复 AWS Glue
DataLakeCatalog数据库将表报告为不存在而非报告错误的两种情况。在列出 Glue 数据库的表时,如果该数据库不存在,SHOW TABLES和system.tables不再因DATALAKE_DATABASE_ERROR(“Exception calling GetTables … not found”) 而失败,例如同一 AWS 账户中不相关的数据库被并发删除时;此类数据库现在不会返回任何表,也不会中止列表操作。当底层GetTable调用因表不存在以外的原因失败时,例如身份验证、DNS 或 5xx 故障,EXISTS TABLE不再对实际存在的表返回0。在两条路径中,其他所有 Glue 错误仍会继续传播。#113591 (Groene AI). - 修复 Keeper 持久性缺陷:持久化 Raft 状态文件 (存储
term和voted_for) 时发生崩溃,可能导致节点既没有有效状态,也没有备份。重启后,节点可能重置为term = 0,并在该任期内再次授予已授予的投票,从而可能导致出现两个领导者并丢失已提交的数据。现在会保留先前状态,直至新状态文件完全写入并同步完成。#113654 (Alexey Bakharew). - 修复销毁
MergeTree表时,其后台统计信息刷新、parts 刷新或过期/异常 parts 加载任务仍在运行导致的数据竞争。#113722 (Alexey Milovidov). - 使用旧 analyzer 时,修复
WINDOW VIEW中的ORDER BY ALL,以及对带有 join 的Merge或Distributed表进行查询时,INTERPOLATE、WINDOW和LIMIT BY出现的UNKNOWN_IDENTIFIER错误。#113759 (Alexey Milovidov). - 修复 Experimental
SZ3compression codec 中的内存泄漏:压缩难以压缩或损坏的数据时若抛出异常,临时暂存缓冲区不会被释放。#113916 (Alexey Milovidov). - 修复解析
remote、mysql等表函数的地址参数时存在的二次复杂度问题:超长地址 (例如大小达数 MB、以零填充的FixedString) 会导致查询在分析阶段卡住且无法取消。 #113918 (Alexey Milovidov). - 修复当
Iceberg表的历史记录包含一次行删除操作,且该操作在每个位置删除文件中删除了多行时,对该表执行OPTIMIZE TABLE会因Unsupported snapshot's operation type OVERWRITE而失败的问题。关闭 #113745。 #113964 (Groene AI). - 不再为复制数据库复制
ALTER TABLE ATTACH PARTITION FROM操作。 #94835 (MikhailBurdukov). - 现在会尽早以明确的错误拒绝无效的 Azure 上传大小设置 (例如
azure_min_upload_part_size = 0或azure_max_blocks_in_multipart_upload = 0) ,而非在写入路径深处触发内部异常 (second_size > 0) 。这同时适用于查询设置和 Azure 磁盘配置。 #103394 (Statxc). - 修复将
WHERE谓词下推到 SQLite 时,StorageSQLite和sqlite()表函数中 SQL 字面量转义不正确的问题:单引号和控制字符 (\n、\r、\t、\) 使用反斜杠转义,但 SQLite 不会将其解释为转义序列,从而导致语法错误或查询结果不正确。同时修复下推到 PostgreSQL 的字符串字面量转义:嵌套在IN列表中的字符串保留了 ClickHouse 的转义方式,控制字符则以反斜杠序列发送,而 PostgreSQL 会将其读取为不同的字节。 #104217 (Shaohua Wang). - 修复启用
query_plan_convert_join_to_in且 SELECT 引用了源数组列时,INNER JOIN ... ON arrayJoin(...) = ...查询出现NOT_FOUND_COLUMN_IN_BLOCK异常的问题。 #104809 (Shaohua Wang). - 修复右侧非恒定操作数引用当前行列的 IN 和 NOT IN 表达式,并使新的 analyzer 对元组右侧操作数的处理与现有 ClickHouse IN 语义保持一致。在旧 analyzer 中,右侧的裸源列 (
x IN (arr)) 仍会被解析为表名,因此不在作用域内。 #104993 (Yue Ni). - 修复从
file、s3或input等表函数执行INSERT SELECT时,若同一源列被选择多次而出现Cannot add column ...: column with this name already exists错误的问题。 #105982 (etienne). - 在
Replicated数据库中拒绝max_replication_lag_to_enqueue = 0。该值会使恢复后的未同步检查恒为真,并在调试和 sanitizer 构建中以LOGICAL_ERROR中止服务器。现在会在解析时针对所有来源以BAD_ARGUMENTS拒绝0(CREATE DATABASE ... SETTINGS、<database_replicated>服务器配置块、ATTACH重放,以及升级时对现有元数据的重放) 。最小有效值为1。关闭 #98823。 #106006 (Groene AI). - 修复在同时使用
enable_sharding_aggregator = 1和UNION ALL,且max_streams_for_union_step小于管道宽度的查询中出现的Logical error: 'Pipeline stuck'。BufferedShardByHashTransform现在会在输入耗尽后立即结束空队列输出端口;当被请求的空端口没有可排出数据时,即使同级队列已达到背压上限,也会继续拉取输入。#106251 (Groene AI). - 修复当等待超时设置 (如
interactive_delay) 设为极大值时发生的有符号整数溢出:等待可能立即超时而非继续等待,服务器也可能在 Undefined Behavior Sanitizer 下中止。#106961 (Groene AI). - 现在,将有效时刻范围之外 (负值或
>= 24h) 的Time/Time64值导出为Arrow格式时,会明确报错并拒绝导出,不再写入无效的 Arrowtime32/time64数据。#107179 (Shaohua Wang). - 修复在两级 / 内存高效的分布式聚合下,对包含重复
ALIAS列 (展开为相同表达式,例如两列均定义为toString(x)) 的Distributed表执行GROUP BY时返回错误结果的问题。重复键在分片上会折叠为一个键,但在发起节点上按完整键集进行合并;因此,在两级聚合下,来自不同分片的相同分组会落入不同桶中而无法合并,导致每个分片各返回一次该分组,且count()被拆分。#108855 (Groene AI). - 修复对
ALTER TABLE ... MOVE PART ... TO SHARD '<path>'执行格式化时出现的伪错误Inconsistent AST formatting。查询格式化器会丢弃SHARD关键字,导致格式化后的查询无法重新解析,进而引发LOGICAL_ERROR(在发布构建中为已处理的异常,在调试和 sanitizer 构建中会中止) 。#109060 (Groene AI). - 现在,所有将
Array偏移量解码为绝对值的读取路径都会拒绝非单调偏移量,而不再仅限于Native格式。此前,损坏的set跳过索引粒度未经检查便会通过,随后导致越界读取。#109212 (Groene AI). JSONExtract现在在将字符串 JSON 值转换为DateTime/DateTime64时会遵循cast_string_to_date_time_mode,与CAST保持一致。关闭 #109126。#109252 (Utkal Singh).- 修复提升兼容性设置期间可能出现的逻辑错误 “Unexpected substream … for column …”。#109496 (Pavel Kruglov).
- 修复计算 system.detached_parts 大小时未设置协调组件的问题。#109553 (Den Kalantaevskii).
- 修复查询 profiler 处于活动状态时,流式插入的块等待超时 (
input_format_max_block_wait_ms) 可能永不触发的问题:文件描述符轮询会在每次 profiler 信号后按完整超时时间重新启动,导致停滞的输入源可能无限期延迟部分块刷新,而非在达到等待上限时刷新。#109602 (Shaohua Wang). - 查询计划阶段的常量折叠不再执行参数类型与分析阶段函数解析类型不一致的函数。此前,计算输出头部时,此类不匹配会引发
LOGICAL_ERROR;在调试和 sanitizer 构建中,这属于断言失败。现在会跳过折叠,而真正无效的查询仍会在正常执行路径中报告可恢复的ILLEGAL_TYPE_OF_ARGUMENT错误。#109747 (Groene AI). - 修复引用
_sample_factor虚拟列的变更在执行过程中因Unexpected const virtual column: _sample_factor失败并导致卡住的问题。变更现在会将其读取为1,与未使用SAMPLE的查询返回的值相同。#109813 (Groene AI). - 修复
use_constant_folding_in_index_analysis的三个问题:当表设置part_minmax_index_columns = 'with_block_number_offset'时,使用普通投影的SELECT可能因逻辑错误Invalid partition key size而中止;对模运算分区键 (如PARTITION BY id % 200) 进行筛选时可能产生错误结果 (静默丢弃行) ;以及使用带有sparseGrams分词器的text索引、通过LIKE谓词查询多个分区且max_threads > 1时可能发生崩溃 (数据竞争) 。#109896 (Groene AI). - 修复读取文件/对象存储表时报告解析或分析错误所发生的数据竞争 (以及罕见的崩溃) 。延迟初始化
KeyCondition时引发的解析错误会作为同一个异常对象在线程读取器之间共享,两个线程可能同时向其消息追加(in file/uri ...),从而导致异常消息字符串发生竞争。#109911 (Groene AI). - 修复
accurateCastOrDefault中查询设置的传递问题,并保留由Dynamic和Variant编码的源NULL值。关闭 #109943。#109946 (Pavel Kruglov). #114912 (Alexey Milovidov). - 修复
subBitmap、bitmapSubsetInRange和bitmapSubsetLimit对仍采用小型表示的 bitmap 返回错误结果的问题,其中包括被截断为 32 比特的、大于2^32的UInt64和Int64元素值。bitmap 函数中对有符号元素类型进行比较时,现在始终使用该元素类型的无符号值;因此,在Int8bitmap 中,元素-1会按255而非符号扩展后的4294967295进行比较。这也修复了已超出小型表示的 bitmap 上的bitmapMin、bitmapMax、bitmapContains和bitmapTransform。传入符号扩展阈值的查询必须调整:对于Int8bitmap,bitmapSubsetInRange(bm, 4294967168, 4294967296)应改为bitmapSubsetInRange(bm, 128, 256)。同时修复了groupNumericIndexedVector对Int8和Int16索引列返回的结果与更宽索引类型不同的问题,以及numericIndexedVectorGetValue对负索引返回0的问题。更正了 bitmap 函数文档,包括此前被描述为使用从 1 开始索引的子集函数,以及对有符号类型的bitmapBuild/bitmapToArray支持。#110072 (Rami Darwiche). - 修复
optimize_aggregation_in_order忽略查询取消的问题。AggregatingInOrderTransform现在会在聚合一个 chunk 时检查取消状态,因此被KILL QUERY或max_execution_time停止的查询 (默认timeout_overflow_mode = 'throw') 会及时停止,而非继续运行完整个 chunk。 #110104 (Groene AI). - 修复事务内
KILL TRANSACTION与ALTER TABLE ... UPDATE/DELETE之间的竞态条件:如果回滚发生在变更注册到事务与注册到表之间,会遗留孤立的变更条目,从而在后台作业中引发逻辑错误 (Cannot find transaction ... that has started mutation ...) ,并阻止受影响 parts 的所有后续变更,直至 server 重启。 #110226 (Shaohua Wang). - 修复启用
query_plan_merge_expression_into_join时,对多表视图执行逗号连接可能触发的 JOIN 顺序优化器LOGICAL_ERROR(Left and right columns have same names) 。 #110227 (Groene AI). - JOIN 顺序基数估计现在会基于经分区/PK 剪枝后保留的 parts 组合列统计信息,而非所有活跃 parts。此前,剪枝到较小分区的查询会按全表统计信息进行规划 (曾观察到行数被高估 2500 倍,导致哈希 JOIN 的构建端发生翻转) ,而禁用统计信息反而会生成更优的计划。此外还修复了:JOIN 顺序优化器缓存的索引分析结果被误认为已应用的 projection,导致 JOIN 中 MergeTree 关系的惰性 FINAL 被静默禁用。 #110283 (Sergey Kuznetsov).
- 修复当外部查询的关联列包含重复值,且子查询通过 CROSS JOIN 路径去关联化时,关联标量子查询会返回错误结果的问题。此前,
count()和sum()等聚合结果会被重复次数放大。这会影响 Experimentalallow_experimental_correlated_subqueries功能。 #110311 (Groene AI). - 修复启用
optimize_or_like_chain时,若OR链中LIKE/ILIKE/match左侧出现聚合函数或窗口函数,可能发生的逻辑错误 (Function node with name '...' is not resolved as ordinary function) 。 #110641 (Groene AI). - 修复因对
WHERE中引用的列执行ALTER TABLE ... UPDATE,导致TTL ... DELETE WHERE <cond>永远不会删除后来开始匹配<cond>的行的问题。变更现在会重新计算行 TTL,因此新匹配的过期行将被删除,而不会被静默保留。 #110648 (Groene AI). - 修复内存跟踪中的记账泄漏:当内存分配被父级 memory tracker (例如 server 级 memory limit) 拒绝时,线程、查询和用户级跟踪器仍会保留被拒绝的内存量。该误差会随时间累积,导致
MemoryTracking以及每查询/每用户内存使用量虚高,并可能引发误报的MEMORY_LIMIT_EXCEEDED错误。 #110784 (Seva Potapov). - 修复空多边形的非规范 WKB 序列化:
wkb(POLYGON EMPTY)现在会输出numRings = 0,而不是错误地输出一个零点 ring,因此标准空 Polygon 的 WKB 往返转换能够保持不变。 #110796 (Groene AI). - 修复了在
INTERSECT或EXCEPT查询中使用 CTE 列别名时查询失败的问题。例如,WITH t (a, b) AS (SELECT 1, 2 INTERSECT SELECT 1, 2) SELECT a, b FROM t此前会因 UNKNOWN_IDENTIFIER 错误而失败。关闭 #104770。#110885 (Yarik Briukhovetskyi). - 修复了读取 MergeTree 表时,若
max_streams_for_merge_tree_reading设置为异常值 (接近UInt64的最大值) 且同时启用allow_asynchronous_read_from_io_pool_for_merge_tree = 1,会出现std::length_error(LOGICAL_ERROR) 的问题。该设置现在会被限制为与max_threads相同的上限。 #110936 (Groene AI). - 修复了对具有内部类型提示子列名称 (即以反引号类型标记开头的名称) 的
JSON参数调用getSubcolumn时发生的崩溃 (查询分析期间的空指针解引用) 。 #110940 (Groene AI). - 修复了通过
mysql表函数或MySQL表/数据库引擎读取可为空的 MySQL 空间列 (LINESTRING、POLYGON、MULTILINESTRING、MULTIPOLYGON、MULTIPOINT或通用GEOMETRY) 时出现的Nested type LineString cannot be inside Nullable type (ILLEGAL_TYPE_OF_ARGUMENT)。这类列现在会回退为Nullable(String),其中保存 MySQL 返回的原始值 (4 字节 SRID 前缀后跟 WKB 负载) 。POINT仍映射为Nullable(Point)。 #110943 (Groene AI). - 修复了面向旧版本对端时,包含版本化聚合状态的
SimpleAggregateFunction包装器的Native序列化问题。 #110997 (Groene AI). - 修复了在
grace_hash连接中,多个线程共享读取器且读取溢写块时读取中途失败,可能导致出现LOGICAL_ERROR: ReadBuffer is canceled. Can't read from it.的问题。 #111056 (Groene AI). - 每个 SSH 密钥现在都会单独计入
max_authentication_methods_per_user限制,因此该限制无论采用何种语法均能一致适用。此前,单个ssh_key方法中的多个密钥只计为一个。 #111181 (Yecine Megdiche). - 修复了在
WITH TOTALS或extremes输出被丢弃的分支上读取重复使用的 materialized CTE (enable_materialized_cte) 时出现的LOGICAL_ERROR(Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan) ,包括外部聚合、INSERT ... SELECT、集合操作和EXPLAIN ANALYZE。 #111194 (Groene AI). - 修复了
map[key]返回后续重复键的值而非第一个值的问题。当Map列包含重复键时,map[key]的结果可能取决于同一块中前面的行及optimize_functions_to_subcolumns设置,因此针对同一行的SELECT和WHERE可能产生不同结果。 #111246 (Groene AI). - 修复逻辑表达式优化器中的逻辑错误
!rhs_literal->getValue().isNull():当AND链在use_variant_default_implementation_for_comparisons = 0时将列与非Nullable类型的 NULL 值常量 (例如 NULL 值的Variant) 比较,会触发该错误。#111292 (Groene AI). - 修复在设置
parallel_replicas_min_number_of_rows_per_replica且投影左表列时,RIGHT JOIN出现NOT_FOUND_COLUMN_IN_BLOCK/THERE_IS_NO_COLUMN错误的问题 (在某些版本中还会静默地产生错误结果) 。#111332 (Groene AI). - 当目标表启用
fsync_after_insert时,RESTORE现在会对恢复的 part 文件执行 fsync,使恢复的 part 与插入的 part 具有同等的断电持久性。此前,恢复的文件仅被写入并关闭 (从未执行 fsync) ,因此在RESTORE返回RESTORED后立即断电,可能导致 parts 损坏且表为空。#111378 (Groene AI). - 修复本地快照磁盘上罕见的 Keeper 数据丢失窗口:快照写入路径现在会在移除
tmp_标记后对快照目录执行 fsync,因此断电时不再可能保留快照内容却丢失标记删除操作。此前,此类崩溃会使 Keeper 将完好且已完全同步的快照视为不完整,并在重启时将其删除;即使使用force_sync=true,也会丢失已确认的写入。由对象存储支持的快照磁盘不在此修复范围内。#111397 (Groene AI). - 修复延迟物化优化中的越界读取 (发布构建) /逻辑错误 (调试构建) ,以及
Merge表中Pipe::unitePipes的逻辑错误。当直接从文本索引读取的优化在具有多个text索引的MergeTree表的读取请求头中留下未使用的索引虚拟列时,会发生这些问题。#111467 (Groene AI). - 修复基于 musl 的构建中,因以不可移植的方式解析 HTTP
Last-Modified请求头,导致url/urlCluster表函数的_time虚拟列始终为NULL的问题。#111619 (Konstantin Bogdanov). - 修复当
MergeTree表加载已有的Compactpart,而当前设置禁用了多态 parts (非自适应粒度) 时引发的LOGICAL_ERROR(Cannot create part with type Compact and storage type Full because table does not support polymorphic parts) 。例如,只读表与另一张表共享磁盘路径,并通过SYSTEM RESTART DISK或在服务器启动时重新加载其 parts 时,可能发生此问题。在调试和 sanitizer 构建中,该异常会中止服务器。#111626 (Groene AI). - 修复当同一 Keeper 路径上的另一张表被并发删除时,
CREATE TABLE ... ENGINE = KeeperMap因Coordination error: No node, path .../metadata/drop_lock_version而失败的问题。现在,创建操作会将消失的元数据子树视为已完成清理并重试,这与同一语句稍后对相同情况的既有处理方式一致。#111966 (Groene AI). - 修复
ReplicatedMergeTree变更与删除旧临时目录之间的竞争条件,该问题可能会发布某些文件缺失的已变更 part,导致读取该 part 及其后续所有变更均失败。#111992 (Alexey Milovidov). - 修复在查询使用并行副本、分布式表或外部聚合,或将状态存储在表中 (包括
Dynamic值内) 时,quantileDeterministic、quantilesDeterministic和medianDeterministic对相同数据每次运行返回不同结果的问题。此版本之前以未版本化类型拼写写入的状态将保留原有行为,因为其布局无法更改。#112052 (Alexey Milovidov). - 修复未将
serialize_string_in_memory_with_zero_byte写入序列化查询计划的问题。使用serialize_query_plan = 1时,运行时禁用该设置的集群中,发起节点与执行反序列化查询计划的节点的内存字符串表示形式可能不一致,因为该设置会在反序列化时读取,却从未在序列化时写入,因而在执行节点上始终解析为默认值。#112131 (Groene AI). - 修复在致命日志消息以及
system.crash_log的trace_full列中,堆栈帧显示为?而非函数名称的问题。该问题影响代码归属于 libc++__functional头文件的普通函数帧,这在发布构建中很常见。#112152 (Alexey Milovidov). - 修复查询按
intDiv(constant, key)或divide(constant, key)过滤时静默漏掉行的问题。主键和分区分析会错误判断常量除以键列时的单调性方向,导致匹配的数据粒度被裁剪,查询不会报错但会返回较少的行。同时修复了被除数为高位已设置的无符号常量时intDiv的问题;当Decimal操作数导致除法以十进制原生位宽计算时,不再错误地认为其具有单调性;并防止键分析对将IPv4/IPv6常量除以键列的有效查询引发Cannot compare DB::IPv4 with long错误。#112156 (Groene AI). - 修复当针对
system.replicas的查询在其状态请求得到处理前被终止时,DROP TABLE ... SYNC会永久挂起的问题。#112164 (Nikolay Degterinsky). - 修复当
BUFFERED_V1WebAssembly UDF 返回空结果缓冲区时服务器中止 (SIGABRT) 的问题;现在查询会以可捕获的WASM_ERROR失败,服务器仍会保持运行。#112182 (Nikolai Ovchinnikov). - 修复在使用
join_algorithm = 'direct'与字典进行JOIN时,连接键采用稀疏序列化存储会导致释放后使用的问题。getColumnVectorData返回了对临时列的引用,导致字典查找读取已释放的内存:发布构建可能返回错误结果,而调试或 sanitizer 构建会中止。#112327 (Groene AI). - 修复查询执行期间未对 MergeTree 投影应用行策略的情况。#112329 (Yarik Briukhovetskyi).
- 修复了通过
MATERIALIZED VIEW向 Iceberg 表插入数据时的数据损坏问题。数据文件此前根据目标表在CREATE时的列类型写入,而非其当前的 Iceberg schema,导致DateTime值被存储为不带逻辑类型的 Avroint,读回时被当作微秒;而DateTime64(0)或DateTime64(9)则完全无法读回。因此,当目标表的 Iceberg schema 比视图声明的列更多时,对该目标执行INSERT INTO <materialized view>现在会引发TYPE_MISMATCH,而不会写入损坏的行。 #112359 (Groene AI). - 当 Keeper 超过
max_memory_usage_soft_limit时,不再拒绝数据为空的Set请求。这类请求不会增加存储数据量,而拒绝它会阻止客户端重新建立 session,可能导致表在整个 Keeper 内存事件期间保持只读。 #112386 (Shaohua Wang). - 修复了 Keeper follower 成功安装大型 snapshot 后长时间脱离 quorum、导致大量
Session expired错误的问题:如果应用 snapshot 所需时间超过 snapshot 安装 timeout,leader 会丢弃 follower 的 acknowledgement,随后每次往返通信只将该 follower 的日志索引回退一个条目。还新增了 Keeper 设置nuraft_snapshot_sync_ctx_timeout_ms来控制此 timeout;此前只能通过raft_limits_response_limit修改,因此无法在不同时降低失效 peer 检测速度的情况下进行调整。 #112405 (Shaohua Wang). - 修复 profile events 和 memory tracker 中的数据竞争。 #112466 (Miсhael Stetsyuk).
- 修复与安全相关的错误。 #112479 (Kseniia Sumarokova).
- 修复在
ALTER TABLE ... MODIFY COLUMN类型变更对应的变更从未执行后读取过期次级 (跳数) 索引的问题,例如该变更被KILL MUTATION移除:磁盘上的粒度按旧类型写入,却按新类型解码,可能引发LOGICAL_ERROR、请求数 EB 级内存分配,或静默返回错误结果。还修复了表达式索引返回错误结果的问题:当表达式语义发生变化、但所有已存储字节保持不变时,根本不会创建变更,例如仅修改DateTimetimezone,或仅将UInt8之类的自定义类型名称改为Bool的MODIFY COLUMN。现在会跳过受影响数据 part 上的此类索引。关闭 #112213。 #112484 (Groene AI). - 修复读取 bloom filter metadata 不一致的 Parquet file 时发生的崩溃问题。此类文件还可能静默返回少于应有数量的行。 #112498 (Shaohua Wang).
- 修复 AsynchronousBoundedReadBuffer 的 readBigAt 数据竞争。关闭 #109678。 #112573 (Kseniia Sumarokova).
- 修复列别名列表 (如
(SELECT 1) AS t(x)或WITH t(x) AS (SELECT 1)) 在view表函数内不可见的问题;对t.x的引用会失败并报出UNKNOWN_IDENTIFIER,尽管相同写法在view外可以正常工作。 #112690 (Groene AI). - 修复了在采用两级聚合的多层分布式
GROUP BY查询中可能发生的逻辑错误SortingAggregatedTransform already got bucket with number N。 #112794 (Nikita Taranov). - 修复了设置
nats_stream的NATS表在 NATS 服务器重启后静默停止消费数据的问题。现在会自动重新建立JetStream订阅,无需执行DETACH TABLE和ATTACH TABLE。 #112828 (Groene AI). - 修复了读取或合并路径上的瞬时 Azure Blob 存储错误——RBAC 权限传播导致的
403 Forbidden、凭据身份验证失败,或表现为408的连接超时——被错误归类为不可重试并报告为POTENTIALLY_BROKEN_DATA_PART(代码 740) 的问题,此前这会对健康的数据分区片段触发误报的严重告警。现在,这些瞬时故障会被视为可重试;真正持续存在的故障将显示为普通 Azure 错误,而非虚假的损坏数据分区片段。 #112871 (Arsen Muk). - 修复了 Azure 批次对象删除时,若批次请求本身失败,未记录任何
system.blob_storage_logDelete 事件,导致整个批次均未记录的问题。现在,发生批次级失败时会为每个对象记录一条 Delete 事件。 #112873 (Arsen Muk). - 修复了当数据分区片段由未重写整个分区片段的 mutation 生成时,重新加载表后
_block_number和_block_offset的按分区片段 minmax 索引丢失的问题。 #112878 (Alexey Milovidov). - 修复了在 join 期间计算的非等值
JOIN ON条件包含arrayJoin时导致逻辑错误和结果错误的问题。现在,hash、parallel_hash或grace_hashjoin 会以INVALID_JOIN_ON_EXPRESSION拒绝此类条件。如果展开操作仅依赖一侧,请在 join 前将其移至子查询中的ARRAY JOIN;如果条件中arrayJoin的参数读取了两侧的列,则必须重构该条件。 #112889 (Groene AI). - 修复了从基于
Distributed表的Merge表读取时ORDER BY结果不正确的问题:行可能乱序返回,使用LIMIT时结果中应有的行也可能缺失。 #112931 (Alexey Milovidov). - 修复了
IN右侧的Bool常量被转换为String左侧的'1'/'0',而不是规范形式'true'/'false'的问题 (现与CAST和values表函数保持一致) 。 #113051 (Yakov Olkhovskiy). - 修复了向目标表会触发 materialized view 的
Alias表插入数据时,query_log中的views列始终为空的问题。 #113076 (Enric Calabuig). - 修复了读取在表达式上定义了
set跳过索引的表时,若查询以带有Nullable操作数的形式重复使用该表达式,便会出现LOGICAL_ERROR的问题,例如对INDEX b_set intDiv(id, 1000) TYPE set(100)执行WHERE intDiv(id, (SELECT 1000)) = 3。仅使用标量子查询即可触发此问题,因为其类型为Nullable。 #113244 (George Larionov). - 修复了启用
inject_random_order_for_select_without_order_by设置且聚合查询读取包含Distributed子表的Merge表时出现的逻辑错误 (异常)Chunk info was not set for chunk in MergingAggregatedTransform:不再向仅计划执行到中间阶段的查询注入随机ORDER BY rand()包装器。#113266 (Alexey Milovidov). - 修复了当
WHERE子句包含带有大量点号的大型字符串常量,且表具有bloom_filter、tokenbf_v1、ngrambf_v1或text跳过索引时,查询计划优化停滞的问题。在将过滤器列名与JSONAllPaths(...)索引列进行匹配时,会枚举该名称按点号拆分的所有方式,导致跳过索引条件的构建复杂度相对于常量长度呈二次增长。关闭 #113003。#113289 (Groene AI). - 修复了当
kafka_num_consumers超过根据 CPU 核心数计算出的限制时,无法ATTACHKafka表的问题。#113390 (Nikolay Degterinsky). - 修复了使用 materialized CTE 的查询失败后,
DROP TABLE永久卡住及内存泄漏的问题。该表会一直滞留在删除队列中,直至重启服务器。#113397 (Shaohua Wang). - 修复了当带有
view(...)参数的 remote 系列表函数位于JOIN ... USING左侧、连接键为SELECT列表别名,且analyzer_compatibility_join_using_top_level_identifier = 1时出现的逻辑错误IDENTIFIER is not a table expression。#113400 (Groene AI). - 修复了读取按精度高于毫秒的
TIMESTAMP列分区的Paimon表时失败的问题,此前会报错scale 6 is not supported, only support scale <= 3。关闭 #112768。#113401 (JIaQi Tang). - 修复了在
make_distributed_plan下,子查询在自身的SETTINGS子句中设置distributed_plan_execute_locally时发生的段错误和LOGICAL_ERROR(No host found for exchange stream final_result__0_0) 。分布式查询计划及执行该计划的代码会从两个不同的上下文读取此设置,可能产生不一致,导致发起节点构建出自相矛盾的管道。#113422 (Groene AI). - 修复了读取包含可空
ARRAY或MAP列的 Paimon 表时的问题。此前此类表完全无法读取,因为模式映射器将复合类型包装为Nullable,而 ClickHouse 不允许这样做,因此DESC和SELECT均会因Nested type Array(Nullable(Int32)) cannot be inside Nullable type而失败。现在,可空复合列会映射为非Nullable的复合类型,NULL值会读取为空复合值。关闭 #113337。#113450 (Groene AI). - 修复了涉及另一侧常量列的
JOIN ON条件中的分片和粒度剪枝问题。#113484 (Vladimir Cherkasov). - 不再写入
Dynamic列中Map值的布局与自身元数据不一致的数据分片。仅map_serialization_version不同的表曾共享同一个缓存的序列化对象,因此数据分片可能使用basicMap 布局,而元数据却声明为with_buckets,导致后续读取失败并报错LOGICAL_ERROR: Stream ...buckets_info ... is not found。早期版本以这种方式写入的数据分片仍无法读取,必须删除。 #113514 (Groene AI). - 修复了对于 schema 已缓存的数据源,推断出的列类型取决于此前查询顺序的问题。会改变推断类型的设置未包含在 schema inference 缓存键中,因此第一个查询的设置值会决定后续所有查询看到的类型:
input_format_try_infer_exponent_floats、max_parser_depth、input_format_json_infer_array_of_dynamic_from_array_of_different_types,以及针对Parquet的input_format_parquet_local_time_as_utc、input_format_parquet_allow_geoparquet_parser、input_format_parquet_skip_columns_with_unsupported_types_in_schema_inference和schema_inference_make_json_columns_nullable。同时为Form注册缺失的缓存键 getter,并使Templategetter 使用其自身行格式的转义规则。 #113533 (Groene AI). - 修复了使用
trace_profile_events_list设置将特定 profile events 的堆栈跟踪写入system.trace_log时,理论上可能发生的数据竞争。 #113553 (Miсhael Stetsyuk). - 修复了
RENAME DATABASE接受过长的目标名称,导致该数据库中的表无法删除的问题。现在无论check_table_dependencies的值为何,都会执行表名长度检查;该检查也涵盖此前从未检查过的分离表,因此即使使用默认设置也会受到影响。关闭 #101747。 #113557 (Groene AI). - 修复了具有多个子表的
Merge表读取外部查询所引用的 materialized CTE 时引发的LOGICAL_ERROR:Reading from materialized CTE '...' before its materialization completed - DelayedPortsProcessor gate is missing in the query plan。 #113558 (Alexey Milovidov). - 修复了包含标量子查询的行策略在通过
Merge表读取后仅计算一次,随后一直被复用的问题。解析后的策略条件会被缓存并由所有查询共享,而通过Merge读取会原地改写缓存的表达式,也会导致并发使用同一策略的查询之间发生数据竞争。 #113563 (Alexey Milovidov). - 修复了读取键为复合键 (多个列) 或
UUID、Int256、FixedString(4)等单个 16/32 字节值的Join表引擎表时出现的Unsupported JOIN keys of type keys256 in StorageJoin。此类表可以创建、写入并用于 JOIN,但无法通过SELECT读取。关闭 #74362 和 #77394。 #113578 (Groene AI). - 在 Web UI 中,打开带有
run=1的链接后,其他选项卡 URL 中的查询不再会在下次重新加载页面时自动运行。 #113595 (Alexey Milovidov). - 修复了比较元素类型为 Nothing 的数组时出现的逻辑错误。 #113609 (Groene AI).
- 当目标存储无法读取 .lock 文件时,备份现在会报告底层锁文件访问错误,而不再错误地报告并发备份。#113637 (Kirill Shokhin).
- 修复了远程分片上的无结构
Distributed表被挂载,或从由旧版服务器写入的元数据加载时出现的逻辑错误Sending a distributed query with unknown (zero) client version。#113675 (Alexey Milovidov). - 将 NUL 字节视为 match() 模式中的普通字面量。#113690 (Vitaly Baranov).
- 修复了当第一个参数在窗口帧内为常量时,窗口帧上的
theilsU返回任意值而非 0 的问题。#113691 (Alexey Milovidov). - 修复了自动并行副本 (
automatic_parallel_replicas_mode) 采用查询计划时出现的Logical error: Duplicate announcement received for replica number N;该计划的单节点变体已由query_plan_join_shard_by_pk_ranges分片。#113730 (Alexey Milovidov). - 修复了在自定义键并行副本 (
parallel_replicas_mode = 'custom_key_sampling'或'custom_key_range') 下,读取子表之一为Distributed表的Merge表时出现的CANNOT_CONVERT_TYPE和GroupingAggregatedTransform异常。关闭 #113741。#113742 (Alexey Milovidov). - 修复了
SELECT在读取任务模式下对命名表使用STREAM修饰符并同时启用并行副本时出现的LOGICAL_ERROR。在PREWHERE中将 materialized CTE 用作IN集合时,服务器会引发Reading from materialized CTE ... DelayedPortsProcessor gate is missing in the query plan(在调试版和 sanitizer 构建中会导致服务器中止) 。现在,请求并行副本时会拒绝使用STREAM的表:当enable_parallel_replicas = 2时,查询会因SUPPORT_IS_DISABLED而失败;当其为1时,查询会在不使用并行副本的情况下运行,与FINAL的现有行为完全一致。#113754 (Groene AI). - 修复了使用常量
ON表达式与包含ARRAY JOIN的右侧进行 JOIN 时发生的服务器崩溃。延迟读取已复制的右侧列时使用了已释放的ColumnReplicated。关闭 #113859。#113901 (Groene AI). - 修复了
Date/DateTime/DateTime64/Time/Time64上avg的未定义行为和错误结果:现在会在整数空间中精确计算平均值,修复了Int64边界溢出 (UB,在 x86 上会产生错误结果) 以及超过 2^53 时的Float64精度损失 (在纳秒级别可见) 。#113912 (Alexey Milovidov). - 修复了右侧包含 totals 时,
join_algorithm = 'partial_merge'的JOIN产生错误结果的问题:右侧可能未被合并,导致LEFTJOIN 会为实际匹配项填充默认值,而INNER/RIGHTJOIN 则完全不返回任何行。在RIGHT/FULL的未 JOIN 路径中,同一状态还会解引用空指针,导致服务器崩溃。#113936 (Groene AI). - 修复了
MySQL集成中的一个缺陷:当命名集合以内容形式存储凭据时,使用空的ssl_ca_pem/ssl_cert_pem/ssl_key_pem值覆盖 TLS 凭据会被接受,导致已配置的 CA 或客户端证书被静默丢弃,而非拒绝该覆盖操作。 #113947 (Alexey Milovidov). - 修复了 Parquet v3 读取器中的
std::out_of_range异常 (Logical error: 'std::exception. Code: 1001, type: std::out_of_range';该异常还会在调试和 sanitizer 构建中导致服务器中止) 。当仅用于过滤器求值的列在其输出槽位已被丢弃后才被调度解码时,会发生此问题。 #113956 (Groene AI). - 修复了当对列类型与底层存储不同的视图 (例如
information_schema.tables中的engine为Nullable(String),而底层system.tables中为String) 应用的过滤器被下推到存储层时出现的逻辑错误 (Unexpected return type) 。 #113984 (Alexey Milovidov). - 修复了 ClickHouse Keeper 在跨片段 Raft 日志截断 (
writeAt) 期间崩溃后因CORRUPTED_DATA拒绝启动的问题;该问题可能导致已确认的日志条目滞留在过期的更新日志片段之后。 #114003 (Nishant Agarwal). - 现在,如果表或数据库名称通过
{database}或{table}宏替换到ReplicatedMergeTreeZooKeeper 路径中,且该名称无法构成单个安全的路径组件,则会被拒绝。此前,包含/的名称会未经转义直接拼接,使该表在另一张表的 keeper 子树中注册 znode,并永久破坏其中的ALTER和OPTIMIZE操作。同样会拒绝.或..组件、控制字符及宏语法。现有表仍可正常加载和附加。 #114006 (Groene AI). - 修复了
optimize_aggregation_in_order = 1时的内存泄漏:当表排序键是GROUP BY键的严格前缀,且使用了状态占用堆内存的聚合函数 (如quantileDD) 时会发生此问题。服务器内存会随着每次此类查询不断增长,直至重启。 #114010 (Groene AI). - 修复了分布式查询计划包含生成聚合函数状态的窗口函数时出现的逻辑错误,例如在
make_distributed_plan = 1下使用theilsUState(a, b) OVER (ORDER BY a)。影响cramersV、cramersVBiasCorrected、theilsU和contingency函数族。 #114020 (Groene AI). - 修复了使用必须读取完整输入的
LIMIT时,SELECT DISTINCT返回错误结果的问题:LIMIT n WITH TIES会丢弃并列行,exact_rows_before_limit = 1会报告被截断的rows_before_limit_at_least,而GROUP BY ... WITH TOTALS会基于数据流的前缀计算总计行。 #114025 (Groene AI). - 修复了
UInt128/UInt256上的isProbablePrime忽略max_execution_time和KILL QUERY的问题。一批宽位宽值会在单次函数调用中运行至完成,期间没有取消点,因此查询可能在超过截止时间数分钟后仍继续运行。 #114032 (Groene AI). - 修复了启用
materialized_views_ignore_errors时,materialized view 在收集依赖项期间失败而system.query_views_log中缺少对应行的问题。在 debug 和 sanitizer 构建中,这还会导致服务器因std::out_of_range中止,而非记录该视图。#114064 (Groene AI). - 修复了当
PREWHERE子句包含IN (subquery)谓词,并设置rewrite_in_to_join = 1(或会强制启用该设置的make_distributed_plan = 1) 时抛出的Code: 46. DB::Exception: Unknown function exists. (UNKNOWN_FUNCTION)。使用WHERE的相同查询可正常运行。#114067 (RohithPariki). - 修复了当行策略是查询的唯一过滤条件且排序列具有
minmax跳过索引时,ORDER BY ... LIMIT返回的行数少于请求数,甚至可能不返回任何行的问题。top-K 优化在应用行策略前缩小了读取范围。#114073 (Alexey Milovidov). - 修复了使用
FixedString常量查询bloom_filter索引时,hasAny、hasAll、has、indexOf、mapContainsKey、mapContainsValue和mapContains返回行数过少,或因TOO_LARGE_STRING_SIZE失败的问题。该索引对常量的填充形式计算哈希值,而函数比较的是未填充形式,因此跳过了匹配的数据粒度。#114089 (Alexey Milovidov). - 修复了
LOGICAL_ERROR“未就绪的 Set 被作为函数globalNullIn的第二个参数传递”,以及查询实际错误消息丢失的问题。当统计信息部分裁剪在索引分析期间推测性执行IN/GLOBAL IN子查询且该子查询失败时,可能发生此问题。#114121 (Groene AI). - 在 PREWHERE 优化中遵循
allow_calculating_subcolumns_sizes_for_merge_tree_reading设置。#114146 (Pavel Kruglov). - 在写入缓冲区前,拒绝
lcp超过前一个 token 或lcp + data_size溢出的损坏或恶意字典。#114155 (Elmi Ahmadov). - 修复了对
DateTime64列执行min和max时,聚合经 JIT 编译且数据包含 1970 年之前的时间戳会返回错误结果的问题。is_signed未针对派生自Decimal64的DateTime64和Time64进行特化,因此生成的代码将 tick 计数作为无符号整数比较,导致 1970 年前的时间戳在max中胜出、在min中落败。#114168 (Groene AI). - 修复了按主键范围层读取
MergeTree表时,某一层生成空管道而引发异常的问题。#114177 (Alexey Milovidov). - 修复了通过 Native protocol 接收的部分格式错误的
Replicated序列化列所报告的错误代码:现在会以INCORRECT_DATA而非LOGICAL_ERROR拒绝这些列 (后者会在 debug 和 sanitizer 构建中中止服务器) 。#114186 (Pavel Kruglov). - 修复了以下问题:对于定义中含有冗余括号的表,例如
PARTITION BY (a)、ORDER BY (b)、INDEX ix (b * c) TYPE minmax、PROJECTION p (SELECT (b) ...)、CONSTRAINT c CHECK (a > 0)、TTL (d + INTERVAL 10 YEAR)或DEFAULT (a + 1),执行ATTACH PARTITION FROM、REPLACE PARTITION、MOVE PARTITION TO TABLE或添加ReplicatedMergeTree副本时,会因Tables have different ...、METADATA_MISMATCH或INCOMPATIBLE_COLUMNS而失败。 #114188 (Alexey Milovidov). - 修复了
ALP、FPC和GCD未将其类型派生参数纳入编解码器哈希的问题。在 Compact part 中,写入器会为每个不同的编解码器哈希共享一个压缩流,因此使用相同编解码器但值宽度不同的两列会发生冲突,并共享一个携带错误宽度的编解码器对象。这会在宽度不一致时以CANNOT_COMPRESS拒绝有效的插入操作,否则会导致其中一列的压缩效果不如预期。 #114189 (Groene AI). - 修复了当
MergeTree键表达式包含自身并非键列的mortonEncode或hilbertEncode调用时出现的std::out_of_range: map::at: key not found,例如ORDER BY mortonEncode(hilbertEncode(x, y), x, y)或PARTITION BY mortonEncode(x, y) % 4。 #114233 (Groene AI). - 移除窗口视图回填源查询中的普通 LIMIT/OFFSET。 #114247 (Alexey Milovidov).
- 修复了当
arrayAutocorrelation的参数是元素类型为Nothing的非空数组时出现的LOGICAL_ERROR,例如SELECT arrayAutocorrelation([arrayMax([])])。此类参数现在会被拒绝并返回ILLEGAL_COLUMN。空数组字面量[]仍会返回[]。 #114249 (Groene AI). - 修复了启用
nuraft_use_bg_thread_for_snapshot_io时 Keeper 服务器始终无法加入集群的问题:发送给正在加入集群的服务器的日志批次会被静默丢弃,导致成员变更始终无法完成。 #114275 (Shaohua Wang). - 修复了错误地从
XDG_STATE_HOME读取XDG_CACHE_HOME的问题。 #114278 (Alexey Milovidov). - 在写入表文件之前,在 catalog 中注册 Iceberg 命名空间 (SeaweedFS 所需) 。 #114285 (Azat Khuzhin).
- 修复了将右表非键列上的过滤器下推到 ANY INNER JOIN 下方时结果不一致的问题。 #114313 (Kirill Shokhin).
- 修复了 bash-completion 2.12+ 的 Bash 补全问题 (_comp_get_words)。 #114339 (Azat Khuzhin).
- 修复读取 schema 中声明了空名称列的数据湖表时发生崩溃的问题。格式错误的 Iceberg 元数据会因
ICEBERG_SPECIFICATION_VIOLATION被拒绝;由 catalog、Delta Lake 或 Paimon 提供的 schema 会因AMBIGUOUS_COLUMN_NAME被拒绝。该检查无条件执行,因此,即使 Iceberg 表仅保留了含有空字段名的未使用历史 schema,也会变得不可读,而不是在读取该 schema 时中止。 #114394 (Groene AI). - 修复了在 Raft leader 变更期间连接到 ClickHouse Keeper 的客户端在连接被拒绝前,可能会等待整个
session_timeout_ms(默认 30 秒) 的问题;此前,本应在进行中的请求被丢弃后立即拒绝连接。现在,连接中的客户端可以更快地重新连接到另一个副本。 #114401 (Groene AI). BACKUP、RESTORE和ENGINE = Backup现在会根据用户的SOURCES权限检查备份位置,与s3()、file()和azureBlobStorage()的方式相同。此前,拥有BACKUP但没有SOURCES权限的用户可以向服务器可访问的任意位置写入备份,也可以从中读取备份。现在写入备份要求具有目标端 source 的WRITE权限 (WRITE ON S3、WRITE ON AZURE、WRITE ON FILE) ,读取则要求READ权限;Disk(...)目标端仍仅受backups.allowed_disk限制。 #114405 (Groene AI).- 修复在设置
ignore_drop_queries_probability时,CREATE OR REPLACE泄漏内部_tmp_replace_*表,以及CREATE OR REPLACE VIEW因NOT_IMPLEMENTED失败的问题。其内部发出的 DROP 是同一条用户语句中的步骤,因此不再对其应用 DROP 故障注入。 #114420 (Groene AI). - 修复从 JSON AST (
dialect = clickhouse_json) 反序列化的ALTER TABLE ... MOVE命令将PART形式与TO TABLE配对,或将PARTITION形式与TO SHARD配对时出现的LOGICAL_ERROR(Bad cast from type DB::ASTLiteral to DB::ASTPartition) 以及无法解析的格式化 SQL。此类负载现在会因BAD_ARGUMENTS被拒绝。 #114429 (Groene AI). - 当列同时在
PREWHERE和WHERE过滤条件中被引用时,即使被重写为文本索引虚拟列,也不会删除该列。 #114460 (Elmi Ahmadov). - 修复当谓词包含
IN (subquery)的变更在子查询的 Set 仍在构建期间被取消 (例如通过KILL MUTATION或DETACH DATABASE) 时出现Not-ready Set is passed as the second argument for function 'in'错误的问题。相关:#107619。 #114463 (Groene AI). - 现在,对用于排序键、主键或分区键的列执行
ALTER TABLE ... DROP COLUMN会以ALTER_OF_COLUMN_IS_FORBIDDEN失败并给出说明,与ALTER TABLE ... CLEAR COLUMN相同。此前,它会在重新计算键表达式时产生令人困惑的UNKNOWN_IDENTIFIER: Missing columns错误。若Nested组中的列用于键,则通过其公共前缀删除或清除整个组时也同样如此;此前这可能会静默破坏该组的数据,或留下一个永远无法完成的变更。现在,删除仅用于生存时间 (TTL) 表达式的列时,也会报告其破坏的是哪个 TTL 表达式。 #114468 (Maksim Dergousov). - 修复了在
CustomSeparated、Regexp和Template格式中使用CSV转义规则读取第一个元素为NULL的Tuple列时的问题。裸Tuple在这些格式中每个元素各占一个字段,因此开头的\N字段对应的是该元素,而非整列。此前该字段被当作整列读取,导致其余元素字段错位到后续列,使CustomSeparated无法读回自身输出。关闭 #114402。#114471 (Groene AI). - 修复了当数组元素和 needle 属于不同字符串类型时 (例如
Stringneedle 与Array(FixedString(N))元素) ,arrayExists(x -> x = needle, arr)返回错误结果或因TOO_LARGE_STRING_SIZE失败的问题。默认启用的optimize_rewrite_array_exists_to_has优化会将此类调用重写为has,但has不会像=那样比较零填充。#114496 (Groene AI). - 读取元数据描述了 Iceberg 规范所禁止的 schema evolution 的 Iceberg 表时,不再导致服务器中止。此前,
IcebergSchemaProcessor中的四项规范违规会被报告为LOGICAL_ERROR(被视为断言失败) ,或在未检查的情况下触发致命断言;现在会引发ICEBERG_SPECIFICATION_VIOLATION。#114518 (Groene AI). - 修复了
Regexpinput format 静默丢弃匹配字段中未解析剩余内容的问题,该问题会存储截断或伪造的值,而非报告错误:在JSON规则下,将v=-1读入UInt64会得到0,将v=2020-01-01junk读入Date会得到1975-07-14。现在,Escaped、CSV和JSON规则会拒绝格式错误的字段,这与文档所述这些规则模拟的格式行为一致。在Raw规则下,包含制表符的匹配字段现在会被完整读取,而不会在制表符处截断。#114520 (Groene AI). - 修复了筛选经
ALTER TABLE ... MODIFY COLUMN变为Nullable的 Iceberg 列时出现的LOGICAL_ERROR。关闭 #85029。#114521 (Groene AI). CREATE TABLE和ALTER TABLE现在会拒绝为排序键所用列配置诸如SZ3的有损 codec。#114531 (Groene AI).- 修复了读取 Delta Lake 表时出现的
LOGICAL_ERROR:该表的metaData.partitionColumns指定了metaData.schemaString未声明的列。现在,只要从 snapshot 读取表或其 schema,无论查询是否带有 predicate,delta-kernel reader 都会以BAD_ARGUMENTS拒绝此类元数据,legacy reader 则会以INCORRECT_DATA拒绝。#114538 (Groene AI). - 拒绝 ORC branches 读回后成为同一类型的 Variant。#114540 (Groene AI).
- 修复了基于 Map 或 JSON 容器的
LIKE/ILIKEoperator 的 text index 评估问题。#114544 (Elmi Ahmadov). - 支持在 PromQL grouping modifiers 中使用带引号的标签名称。. #114545 (Minh Vu).
- 修复了对较低 scale 的
Decimal64重新缩放时因Int64溢出而产生的不正确、且通常符号颠倒的Time64字面量和IN列表常量。此类转换现在会报告DECIMAL_OVERFLOW,与DateTime64分支及显式CAST一致。#114546 (Groene AI). - 接受 PromQL 分组标签列表中的尾随逗号。。#114548 (Minh Vu).
- 支持在 PromQL 选择器中使用带引号的指标和标签名称。#114551 (Minh Vu).
- 查询可能会在
max_execution_time到期前最多 1 ms 被取消,并因自相矛盾的Timeout exceeded: elapsed 999.672 ms, maximum: 1000 ms而失败。#114559 (Alexey Milovidov). - 修复了在变更进行期间读取表的问题:
MATERIALIZED列可能返回过期值,同时查询该列和已更新列时可能会报错。#114561 (Shaohua Wang). - 修复了
clickhouse-local接受表名相对于配置的--default_database过长的CREATE TABLE的问题,此前会创建无法删除的表。DatabaseOverlay现在会像它所写入的磁盘数据库一样检查表名长度。#114567 (Groene AI). - 修复了
Alias表引擎中的 RBAC 绕过问题,该问题允许对目标表没有特权的用户获知其架构、行数、大小及是否存在。#114596 (Kai Zhu). - 修复了服务器启动后首次运行的聚合若为使用惰性
FINAL优化 (query_plan_optimize_lazy_final) 的查询,哈希表统计信息——以及相应的聚合哈希表预分配——会在整个服务器上被静默且永久禁用的问题。#114597 (Alexey Milovidov). - 修复了在一次
ALTER中被重命名、删除并再次添加的列,在变更仍待执行时会返回已删除列’的值而非自身默认值的问题。#114601 (Shaohua Wang). - 修复了当时间间隔参数的跨度 (以秒计) 为 2^32 的倍数时 (例如
toIntervalDay(2147483648)) ,函数hop和windowID中出现的无限且无法取消的循环:回绕减法绕过了时间溢出检查,而对于常量参数,循环会在分析阶段运行,此时甚至无法终止查询。相同的时间间隔还可能使WINDOW VIEW的后台线程永久空转;现在会在创建时拒绝此类 window view。#114607 (Alexey Milovidov). - 修复了携带
Map类型设置的访问实体 (例如包含http_response_headers或additional_table_filters的 settings profile) 以 ClickHouse 无法重新读取的形式存储的问题,导致该实体在重启后永久无法加载。#114620 (Groene AI). - 修复了启用
ignore_drop_queries_probability时,可刷新materialized view 会泄漏已轮换的目标表的问题。刷新为清理先前目标表而发出的DROP是刷新流程的一步,而非用户请求的DROP,因此故障注入不再适用于它。#114622 (Groene AI). - 修复了当常量
LowCardinality查找值等于元素类型的默认值 (例如空String或数值零) 时,has、indexOf、countEqual、mapContainsKey、mapContainsValue和Map下标操作返回 “未找到” 的问题。#114624 (Groene AI). - 修复了在延迟应用倒排列表模式下,查询带有文本索引的表时若在读取期间被取消,会出现逻辑错误
Multi-block postings must be compressed的问题。#114636 (Anton Popov). - 修复了外层查询带有尾随
SETTINGS子句时,view和viewIfPermitted表函数的子查询参数格式化问题。这类查询会被格式化为无法重新解析的view((SELECT ...)),因而无法通过内部“格式化-解析-格式化”检查,并引发Inconsistent AST formatting。#114658 (Groene AI). - 修复了通过自行管理读取缓冲区的输入格式读取 Parquet 时发生的堆内存损坏问题,例如使用
SOURCE(FILE(... format 'Parquet'))的字典。管道释放缓冲区后,后台预取和解码任务仍可能通过该缓冲区读写,从而导致服务器中止。#114668 (Groene AI). - 修复了当底层表将父列声明为
ALIAS时,通过Merge表读取子列 (.size0、.null、元组元素、String.size) 的问题。此类读取会返回该类型的默认值;如果同一查询中还选择了父列,则可能返回无关列的值。#114673 (Groene AI). - 修复了当
ON子句包含多个以OR连接的条件时,ANY RIGHT JOIN和SEMI RIGHT JOIN会使右表的部分行返回两次,并丢失其他行匹配结果的问题。显式写出的ANY LEFT JOIN也会受影响,因为规划器可能交换两张表,并将其作为ANY RIGHT JOIN执行。#114676 (Vladimir Cherkasov). - 修复了简单
GROUP BY ... LIMIT优化 (设置optimize_trivial_group_by_limit_query) 在包含DISTINCT、QUALIFY、窗口函数或投影中的arrayJoin的查询中产生错误结果的问题:这些操作会在聚合后消耗或过滤分组,因此将聚合限制为LIMIT + OFFSET个键可能导致返回的行数过少或值错误。该优化不再适用于此类查询。#114695 (Alexey Milovidov). - 修复了当多边形参数为无效常量字面量且
validate_polygons = 0时,使用 MergeTree 主键按pointInPolygon过滤的SELECT结果缺少行的问题。主键分析从未经验证的多边形推导出粒度剪枝,丢弃了包含匹配行的粒度。#114710 (Groene AI). - 修复了当
-OrNull或-OrDefault组合器的聚合状态在group_by_overflow_mode = 'any'且max_rows_to_group_by非零时合并,可能导致服务器崩溃的问题,例如查询通过聚合投影读取数据时。#114740 (Groene AI). - 修复了由
SELECT ... FINAL引发的LOGICAL_ERROR(“Unexpected number of kept output positions after removing unused columns fromReadFromMergeTree”) 问题:其PREWHERE使用了FINAL合并所需的列 (ver、is_deleted、sign) ,但未选择该列。#114746 (Groene AI). - 修复启用
make_distributed_plan后,通过包含内部集合操作的子节点读取Merge表时出现的逻辑错误 (Block structure mismatch) 。#114753 (Alexey Milovidov). - 对过大的
kafka_num_consumers返回明确错误,而非在Kafka表引擎内部因内存分配失败而报错。此前,启用kafka_disable_num_consumers_limit时,此类值会导致std::length_error异常。#114764 (Alexey Milovidov). - 修复在创建存储表达式的查询完成后对其求值时出现的
LOGICAL_ERROR: Context has expired异常。此类表达式包含accurateCastOrDefault或to<Type>OrDefault函数,例如INSERT中MATERIALIZED列的默认值或变更表达式。#114769 (Groene AI). - 修复当查询中
JOIN位于某表之上,且该表的文本索引列同时用于PREWHERE和WHERE文本搜索谓词时出现的LOGICAL_ERROR(Cannot find input column ... on its position in inputs of expression actions DAG) 。#114771 (Groene AI). - 修复启动时 attach 线程重启线程过程中丢失唤醒信号的问题。#114802 (Azat Khuzhin).
- 对于未实现合并整理的对象存储表引擎,
OPTIMIZE TABLE此前会在未执行任何操作的情况下报告成功。现在会像所有其他不支持该语句的引擎一样报错。这会影响DeltaLake、Paimon、Hudi和普通对象存储引擎 (S3、GCS、COSN、OSS、AzureBlobStorage、HDFS以及由对象存储支持的URL) ;实现合并整理的Iceberg不受影响。关闭 #114765。#114805 (Groene AI). - 对于 1970 年之前的时间戳,
timeSeriesRange和timeSeriesFromGrid会错误地抛出DECIMAL_OVERFLOW,因为起始和结束时间戳被读取为无符号值。此外,对于DateTime/UInt32时间戳,步长会被静默截断为低 32 位。现在所有计算均使用Int64完成。#114815 (Vitaly Baranov). - 修复当
DROP TABLE与ReplicatedMergeTree表上的 lightweightUPDATE并发执行时导致服务器中止的问题 (Logical error: Part patch-... doesn't exist) 。现在,更新会一直持有表的共享锁,直至其补丁分片提交,因此DROP会等待而不会将其删除。#114826 (Groene AI). - 修复异步插入中的几个问题 (某些查询因
MEMORY_LIMIT_EXCEEDED失败时可能导致崩溃,以及async_insert_queue_flush_on_shutdown从未生效) 。#114839 (Azat Khuzhin). - 修复了当通过
tuple(...)跨子查询边界读取与IN (subquery)比较的LowCardinality列,且enable_analyzer = 0时出现的LOGICAL_ERROR: Unexpected return type from tuple. Expected Tuple(..., UInt8). Got Tuple(..., LowCardinality(UInt8))。使用旧 analyzer 时,LowCardinality列上的x IN (subquery)现在会返回LowCardinality(UInt8),其类型与x IN (literal list)相同,也与enable_analyzer = 1时保持一致。#114856 (Nikita Fomichev). - AI 函数配额设置 (
ai_function_max_api_calls_per_query、ai_function_max_input_tokens_per_query、ai_function_max_output_tokens_per_query) 此前按块而非按查询执行,导致查询可随处理的块和线程数量增加而按比例超出配置的限制。现在,这些设置会在每台服务器上对整个查询生效:API 调用次数限制为精确上限 (原子预留) ,标记数限制则尽力执行。分布式查询会在每个参与的服务器/片段上独立执行这些限制。#114885 (George Larionov). - 修复了当表仍在加载且全局线程池暂时饱和时发生的服务器中止。
AsyncLoader现在在无法创建额外的加载工作线程、但仍有工作线程会处理队列中的作业时继续运行,而不是调用std::terminate。#114897 (Groene AI). - 修复了
DateTime64和高精度Decimal值在quantile和quantiles中的未定义行为及错误的边界结果。#114919 (Alexey Milovidov). - 修复损坏的 ORC stripe 页脚导致的服务器中止。#114924 (Groene AI).
- 修复因 ThreadGroup 释放后使用而可能导致的崩溃 (适用于异步 INSERT/MV/EXPLAIN ANALYZE) 。#114940 (Azat Khuzhin).
- 修复了删除名称按字典序排在其内部表名称之前的
TimeSeries表时发生的挂起问题,例如DROP TABLE `-ts`,或删除使用ENGINE = TimeSeries声明的 materialized view。删除操作会在 DDL 守卫上发生自死锁,且无法通过KILL QUERY取消。#114953 (Groene AI). - 修复了在
allow_deprecated_syntax_for_merge_tree下,使用已弃用的位置语法创建的ReplicatedMergeTree中出现的BAD_DATA_PART_NAME(“Trying to get part name in new format for old format version”) 。变更可能会在尚未应用该变更的副本上被报告为已完成,并且该表在重启后可能仍保持只读状态。#114980 (Groene AI). - 修复了包含从远程集群读取的
IN子查询时出现的逻辑错误Not-ready Set is passed as the second argument for function 'in':现在,查询会返回子查询产生的实际错误,例如连接失败。#114983 (Alexey Milovidov). - 修复了旧 analyzer 中
IN两侧均为相同非常量 Tuple 时出现的逻辑错误。#114988 (Groene AI). - 修复了通过位置 Tuple 结构提示读取 Tuple 元素的问题。#115000 (Groene AI).
- 不再为 arrayReduceInRanges 中零大小聚合的预聚合状态设置别名。#115008 (Groene AI).
- 修复向
Log、TinyLog或StripeLog表执行INSERT时,在提交已记录的文件大小阶段失败的问题。此类插入即使报告错误,其行仍可能保留在表中,或者导致数组列的数据文件彼此不一致。现在,读取数组列没有元素但其偏移量显示存在元素的Log或TinyLog表时,会引发指出该列的错误,而不会越过元素末尾继续读取。此前已会拒绝部分写入的元素列。#115027 (Groene AI). - 修复惰性复制列上的自适应聚合器中止问题。#115034 (Groene AI).
- 修复
pointInPolygon使用边界框无界的常量 Polygon 时发生的越界读取问题,例如坐标达到+-DBL_MAX时。现在会以BAD_ARGUMENTS拒绝此类 Polygon,而包含空环的 Polygon 会被视为没有内部区域。此前,查询可能返回错误结果,或者在启用强化或 sanitizers 的构建中导致服务器中止。#115035 (Groene AI). - 修复当
sequenceMatch、sequenceCount或sequenceMatchEvents模式包含事件编号0时引发的out_of_range异常,该异常会被报告为内部Code: 1001错误,例如sequenceMatch('(?0)')。现在会以BAD_ARGUMENTS拒绝此类模式。仅含单个符号的时间条件 (例如sequenceMatch('(?1)(?t>+)(?2)')) 此前会被静默视为(?t>0),现在会以SYNTAX_ERROR拒绝。#115056 (Groene AI). - 修复启用轻量级更新的表中出现
Found patch part ... that intersects mutation with version ...(LOGICAL_ERROR) 的问题。补丁分区片段合并可能生成一个数据版本范围跨越现有分片数据版本的补丁;该补丁随后既无法应用也无法跳过,导致该分区上的所有后续操作失败,复制队列也随之停滞。现不再分配此类合并任务。#115064 (Alexey Milovidov). - 修复在启用实验性
use_reader_executor设置时通过文件系统缓存读取出现的LOGICAL_ERROR(Cache file segment is in detached state) 问题。该回归由 #110029 引入,未包含在任何发布版本中,因此无需回移。#115070 (Groene AI). - Arrow Flight server:接受基于 Go 的 Flight 客户端 (如 ADBC Flight SQL 驱动程序) 发送的不带填充的 Base64 编码
Basic身份验证凭据;当authorization标头格式错误时,返回正确的身份验证错误,而非通用的Unexpected error in RPC handling。#115085 (Alexey Milovidov). - 修复 SSH 接口和 Web 终端所用嵌入式客户端中的自动补全功能 (来自
system.completions的提示和 TAB 补全) :此前建议通过单独的连接加载,该连接会以空密码将自身身份验证为default用户,因此在default设置了密码的服务器上会失败;否则会泄露当前登录用户无权访问的实体名称。现在,建议通过会话自身的连接加载。#115086 (Alexey Milovidov). - 修复了启用
allow_experimental_url_wildcard_from_index_pages后,使用CREATE TABLE ... AS url('http://host/**/', ...)创建表会导致服务器无法启动的问题。加载此类表的元数据时会重新执行实验性功能检查,并因SUPPORT_IS_DISABLED失败,从而中止启动。 #115095 (Groene AI). - 使用 64 位算术重写 bucketIndexForTimestamp。 #115097 (Vitaly Baranov).
- 修复了
ALTER TABLE ... MATERIALIZE INDEX、MATERIALIZE STATISTICS和MATERIALIZE PROJECTION的格式化问题:此前会丢失IF EXISTS子句,导致格式化后的查询与实际解析的查询不一致。同时拒绝了四种 SQL 解析器无法生成且会被格式化为不同命令的ALTER ... STATISTICSAST JSON 负载。 #115099 (Groene AI). - 修复了在排序键为表达式的表上,某些带
PREWHERE的SELECT ... FINAL查询会出现异常 (Block structure mismatch in Expression for FilterSortedStreamByRange) 的问题。 #115113 (Shaohua Wang). - 修复 clickhouse-local 的 CORS 命令行覆盖配置。 #115129 (Alexey Milovidov).
- 禁用投影的分布式索引分析功能 (结果不正确) 。 #115132 (Azat Khuzhin).
- 修复了当
Time分支与Time64、DateTime或DateTime64组合且表达式经 JIT 编译时,if和multiIf会返回较大的正值而非负值的问题。 #115146 (Groene AI). - 嵌入其他页面 (如 SQL 控制台或
play.html) 的 Web 终端会从该页面获取凭据,并且在凭据到达前不再自行建立连接。此前它会连接两次:先使用空密码,随后使用实际凭据再次连接,并两次输出Connecting...。 #115148 (Alexey Milovidov). - 修复了当
WHERE子句在NOT下包含NULL表达式时结果不正确的问题,例如SELECT count() FROM t WHERE NOT (id >= 20 AND NULL)。索引分析会将此类条件视为对整个范围恒为真,因而跳过过滤器:count()会返回本应被查询排除的行,而带有该条件的ALTER TABLE ... DELETE会删除本应保留的行。 #115152 (Groene AI). - 修复了
EXPLAIN ANALYZE会丢失视图 JOIN 统计信息的问题;该视图声明为SQL SECURITY DEFINER或SQL SECURITY NONE,且主体包含 JOIN。在调试和 sanitizer 构建中,查询会因逻辑错误JoinStep analyzed without the analyze mode而中止。 #115156 (Groene AI). - 修复了反序列化文本索引中损坏的倒排列表时发生越界读取的问题。 #115222 (Anton Popov).
- 修复了默认
optimize_trivial_count_query = 1时SELECT count(arrayJoin(arr))返回结果不正确的问题。此前返回的是存储的行数,而非数组元素数量;对于file()和url(),该查询会返回0。关闭 #115123。 #115227 (Groene AI). - 修复了对在
ALIAS或EPHEMERAL列上声明STATISTICS(...)的表执行任何INSERT时出现NOT_FOUND_COLUMN_IN_BLOCK的问题,该问题会使此类表变为只读。 #115231 (Groene AI). - 修复了已完成查询的最终统计信息 (
结果中有 N 行、读取 ... 行) 在 Web UI 中以不可见颜色显示的问题。 #115245 (Alexey Milovidov). - 修复了读取格式错误的
AggregateFunction(uniq, ...)状态时静默产生错误结果和未定义行为的问题。序列化状态中的skip_degree字段未经验证便被用作移位指数,因此超出范围的值会产生任意基数,而非报错。现在此类状态会被拒绝,并返回INCORRECT_DATA。 #115276 (Groene AI). - 修复了行策略绕过问题:mergeTreeIndex 表函数会暴露源表中被 SELECT 行策略隐藏行的主键和 minmax 索引值;现在禁止读取具有行策略的表的 mergeTreeIndex。 #115304 (Yarik Briukhovetskyi).
- 修复了省略时间间隔之间的分隔逗号时,
CREATE QUOTA和ALTER QUOTA会静默丢弃除最后一个FOR INTERVAL块外所有块的问题。此类语句会成功执行,但不会应用任何此前的限制。现在时间间隔会再次累积,与 2020 年之前的行为一致。关闭 #115282。 #115320 (Groene AI). - 修复了当某个分支为
Date或Date32、结果类型为DateTime或DateTime64时,if、multiIf和CASE会产生错误结果的问题。启用compile_expressions = 1(默认值) 时,编译后的表达式会将日期的天数计数复制到时间戳列中,而未将天数转换为秒,因此if(cond, toDate32('1900-01-01'), toDateTime64('1970-01-01', 3))会返回1969-12-31 23:59:34.433。关闭 #115272。 #115325 (Groene AI). - 不再保留引用已删除命名集合的元数据。 #115326 (Groene AI).
- 修复了
timezoneOffset(别名timeZoneOffset) 针对 UTC 偏移量与 1970-01-01 时的偏移量相差整整一天的时区返回相差一天的错误偏移量的问题,例如跨越国际日期变更线后的Pacific/Kiritimati和Pacific/Apia,以及 1970 年之前的大多数时区。这也修复了依赖该偏移量的parseDateTime、parseDateTimeOrNull、parseDateTime64、parseDateTimeInJodaSyntax、EXTRACT(TIMEZONE_HOUR / TIMEZONE_MINUTE ...)、formatDateTime的%z、toUTCTimestamp和fromUTCTimestamp。关闭 #115281。 #115332 (Groene AI). - 修复了设置约束绕过问题:
SET <name> = DEFAULT会在不检查用户 profile 中约束的情况下重置设置,因此可通过重置设置而非为其赋值来绕过MIN/MAX/CONST约束,并且会话可通过SET readonly = DEFAULT退出只读模式。 #115334 (Alexey Milovidov). - Arrow Flight 服务器:拒绝缺少用户名/密码分隔符的格式错误 Basic 身份验证凭据。#115347 (Alexey Milovidov).
- 修复了启用
query_plan_join_shard_by_pk_ranges时,若 JOIN 任一侧因主键、列统计信息或表为空而被裁剪至完全没有分片,full_sorting_mergeJOIN 会触发LOGICAL_ERROR(Join is supported only for pipelines with one output port) 的问题。#115352 (Alexey Milovidov). - 对 _part_starting_offset 上的过滤器禁用查询条件缓存。#115358 (Azat Khuzhin).
- 修复了
randConstant的调用带有不同别名时,会在同一查询中返回两个不同值的问题。文档说明randConstant在整个查询中应保持单一值,并且SELECT randConstant() = randConstant()已经返回1,但像SELECT randConstant() AS a, randConstant() AS b这样添加别名会产生两个不相关的值。#115384 (Alexey Milovidov). - 修复了
uniq、uniqExact、uniqHLL12和uniqTheta对包装在隐藏可空性的单射函数中的参数返回错误结果的问题,例如对Nullable列执行uniqExact(tuple(x))。optimize_injective_functions_inside_uniq优化移除了包装函数,导致 NULL 行被跳过而未被计数。#115466 (Vladimir Cherkasov). - 修复
GroupingAggregatedTransform为同一存储桶生成重复数据块的问题。#115487 (Nikita Taranov). - 修复了当坐标不是
Float64时,geoToH3错误消息中参数位置和类型错误的问题。在默认的geotoh3_argument_order = 'lat_lon'下,该消息会指向另一个参数,并显示该参数的类型。关闭 #101813。#115503 (Groene AI). - 除换行符 (
\n) 外,还拒绝通过 HTTP 请求头过滤器的 HTTP 请求头名称和值中出现的裸回车符 (\r) 。这修复了会传递用户提供的请求头的功能中的 HTTP 请求头注入 (请求/响应拆分) 漏洞,例如url表函数和引擎、HTTP 字典以及数据湖目录。#115510 (Sergei Trifonov). - 修复了按最大条目数配置的缓存 (
SLRU策略) :当已有达到该数量的条目至少被访问两次后,会静默停止接纳新条目。受影响的缓存包括 Iceberg 和 Paimon 元数据文件缓存、Parquet 元数据缓存、文本索引缓存、向量相似度索引缓存、已编译表达式缓存以及 ObjectStorageQueue 文件状态缓存。#115517 (Groene AI). - 修复了在
BACKUP/RESTORE ... TO S3、GCS 磁盘和s3表函数中,当命名集合设置http_client = 'gcp_oauth'且 Google OAuth2 令牌端点接受连接但始终不响应时,可能长达一小时的挂起问题。Bearer 令牌请求不再继承调用方的数据传输请求超时时间;其响应等待时间限制为 10 秒,与 STSAssumeRole请求上限一致。#115531 (Groene AI). - 修复分布式查询中的
dictGet及其变体:未限定的字典名称现在会绑定到发起节点的当前数据库,而不再根据各分片的当前数据库进行解析;此前可能找不到该字典,或解析为同名的其他字典。 #115541 (Alexey Milovidov). - 修复了一个竞态条件:它可能导致
STREAM BOUNDED查询返回的行数少于查询启动前已提交的行数,通常会返回零行。 #115543 (Alexey Milovidov). - 修复了禁用
compress_snapshots_with_zstd_format时 Keeper 快照被写入为空文件的问题。服务器会记录Created persistent snapshot,但快照文件为 0 字节,随后节点会因CORRUPTED_DATA拒绝启动。关闭 #115388。 #115553 (Groene AI). - 修复了
system.query_thread_log中的read_rows、read_bytes、written_rows和written_bytes报告线程整个生命周期的累计值,而非所记录查询对应值的问题。长期运行的线程池线程受此影响,尤其是发起查询的HTTPHandler线程。 #115596 (Groene AI). - 修复了对字典会在聚合期间增长的
LowCardinality(String)键进行聚合或连接时,读取缓存字典哈希发生越界的问题,可通过TTL ... GROUP BY触发。该问题可能导致哈希错误,并在 sanitizer 构建中报告堆缓冲区溢出。 #115604 (Groene AI). CREATE TABLE和ALTER TABLE现在会拒绝在分区键所用列上使用SZ3等有损编解码器。 #115626 (Groene AI).- 修复了文本、tokenbf_v1 和 ngrambf_v1 索引中无效的反斜杠转义字符。 #115634 (Elmi Ahmadov).
- 修复了对活动数据分区片段集合中存在的分片调用
removePartAndCoveredParts时的问题。 #115640 (Mikhail Artemenko). - 允许 KeeperMap 读取器在等效主键仅因冗余的外层括号而不同时接受共享元数据。 #115642 (Sergey Kuznetsov).
- 修复了以新名称还原数据库或表时,从已存储视图的定义中移除表别名的问题,这会导致读取还原后的视图时因
UNKNOWN_IDENTIFIER失败。关闭 #115479。 #115645 (Groene AI). - 修复了当
has或notHas谓词包含 NULL 数组元素,且主键为String、Array(String)或Map(String, String)时出现的Code: 349. Cannot convert NULL value to non-Nullable type;同时修复了当该元素为包含 NULL 的Dynamic或Variant时返回错误结果的问题。现在会在键分析期间从集合中移除 NULL,其他键类型此前已如此处理。 #115647 (Groene AI). - 修复了函数
formatRowNoNewline中的一个问题:当行被格式化为为空的结果时,可能产生错误结果或逻辑错误。 #115669 (Alexey Milovidov). - 拒绝单点 Prometheus 范围查询中值为零或负数的
step。#115679 (Minh Vu). - 拒绝超出 Int64 范围的 PromQL 时间戳和耗时。#115682 (Minh Vu).
- 修复
readWKB、JSONMergePatch、url/remote/cluster/mysql/postgresql表函数的地址解析器、CURSOR子句解析器以及 CapnProto 模式解析器处理深度嵌套输入时导致服务器崩溃的问题。修复EXECUTE语句解析器在参数不是字面量时发生崩溃的问题。#115700 (Alexey Milovidov). - 不再从长度不是八的倍数的二进制字符串字面量结果中返回未初始化的内存,也不再在压缩块没有主体时从 LZ4 解压器返回未初始化的内存。#115704 (Alexey Milovidov).
- 限制在身份验证前读取的 PostgreSQL wire protocol 启动消息大小。#115708 (Alexey Milovidov).
- 修复在
FROM部分中列别名与表表达式别名相同时出现的MULTIPLE_EXPRESSIONS_FOR_ALIAS错误 (25.2 版本中 analyzer 引入的回归) 。#115714 (Alexey Milovidov). - 修复通过
SYSTEM START LISTEN启动的 listener 的连接 handler 抛出异常时 (例如客户端发送格式错误的数据包或重置 keep-alive socket) ,clickhouse-local会终止整个进程的问题。现在,此类进程会记录错误并继续提供服务,与clickhouse-server的行为一致。#115715 (Groene AI). - 修复查询未从完全没有列的表表达式读取任何列时出现的
LOGICAL_ERROR: No available columns,例如SELECT count() FROM loop(db, tbl),其中tbl是目标表已被删除的Alias表或参数化视图。此类查询现在会以UNSUPPORTED_METHOD失败,而不会在调试和 sanitizer 构建中中止服务器。#115716 (Groene AI). - 修复在
Distributed表上的IN子查询中读取MATERIALIZEDCTE 时出现的LOGICAL_ERROR“Reading from materialized CTE ‘X’ before its materialization completed - DelayedPortsProcessor gate is missing in the query plan”。关闭 #113184。#115740 (Groene AI). - 拒绝无效的 projections 和索引名称。#115824 (Alexander Tokmakov).
- 当其中一个操作数为标量时,拒绝 PromQL 向量匹配修饰符。#115828 (Minh Vu).
- 修复
cast_keep_nullable在目标类型为LowCardinality时未保留可空性的问题。将可为 NULL 的值转换为LowCardinality(T)时,此前会抛出CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN,而不是生成LowCardinality(Nullable(T))。关闭 #103485。#115851 (Groene AI). - 将 Objects 路径纳入去重哈希计算,避免错误去重。 #115866 (Mikhail f. Shiryaev).
- 修复在
Distributed表上或使用并行副本执行包含Array(Map(...))类型常量的查询 (例如has([map('k', 'v')], m)) 时出现的TYPE_MISMATCH(“CAST AS Array can only be performed between same-dimensional array types”) 。 #115883 (Alexey Milovidov). - 修复在
make_distributed_plan = 1下优化查询计划时,窗口查询的排序列经过未引用该列的Expression步骤而引发的Unknown identifier。关闭 #115737。 #115890 (Groene AI). - 修复
h3kRing、h3HexRing、h3Line和h3ToChildren在展开一个数据块中的行时忽略max_execution_time和KILL QUERY的问题。 #115893 (Alexey Milovidov). - 通过匹配到目标为参数化视图的
Alias表的Merge表读取数据时,不再引发LOGICAL_ERROR: Table has no columns.(这会导致 server 在调试和 sanitizer 构建中中止) 。此类表现在会报告STORAGE_REQUIRES_PARAMETER,与参数化视图本身报告的错误一致。其他任何无法提供列的匹配表现在会报告UNSUPPORTED_METHOD,而非内部错误。 #115896 (Groene AI). - 修复引用
_sample_factor的待处理变更的即时预览问题。使用apply_mutations_on_fly = 1和SAMPLE子句时,该表达式此前会使用读取查询的样本因子求值,而非后台 materialized 操作所持久化的值,导致预览行与最终 materialized 结果不一致;待处理的ALTER TABLE t DELETE WHERE _sample_factor > 1还可能使SAMPLE读取完全不返回行。查询自身的_sample_factor列不受影响。 #115906 (Groene AI). - 修复携带
ENGINE = URL(...)定义的ATTACH TABLE未检查 URL 协议分派到的 engine 的TABLE ENGINE授权的问题。仅拥有TABLE ENGINE ON URL权限的用户此前可以附加并读取由File、S3、AzureBlobStorage或HDFS支持的表,而CREATE TABLE会正确拒绝该操作。 #115914 (Groene AI). - 不再让无法解析的 KeeperMap 元数据节点阻止 server 启动。 #115941 (Groene AI).
- 修复在通过 ACME (Let’s Encrypt) 获取 TLS 证书的 server 上调用
showCertificate函数时崩溃的问题。该函数现在会报告实际提供的证书,包括重新加载证书后。 #115976 (Alexey Milovidov). - 修复向
TO目标为另一个 materialized view 的 materialized view 插入数据时,在调试和 sanitizer 构建中导致 server 中止的问题。此类插入在已发布版本中本就会失败,并显示信息不足的Code: 1001 STD_EXCEPTION;现在会报告NOT_IMPLEMENTED并指出存在问题的视图。 #115985 (Groene AI). - 现在会读取格式版本为
V3的统计信息文件,不再因ILLEGAL_STATISTICS而拒绝读取。这类文件仅由短暂时期内的master构建产生,但包含这些文件的 parts 此前完全无法读取;而在只读 disk 上,ALTER TABLE ... MATERIALIZE STATISTICS也无法重新生成它们。#116030 (Alexey Milovidov). - 修复了在具有隐式 minmax 索引 (
add_minmax_index_for_numeric_columns等) 的表上,单条ALTER TABLE语句同时使用RENAME COLUMN和其他命令 (如MODIFY SETTING) 时出现的LOGICAL_ERROR: Index with name auto_minmax_index_<column> already exists。重命名普通列后,后续的DROP COLUMN也不再因UNKNOWN_IDENTIFIER失败,后续的ADD COLUMN也不会再缺少相应的隐式索引。#116063 (Groene AI). - 修复了使用对象存储时无状态工作线程崩溃的问题。#116067 (Konstantin Vedernikov).
构建/测试/打包改进
- 为 macOS 提供已签名的制品。#115169 (Konstantin Bogdanov).
- 修复使用 clang 23 从源码构建时的问题。#112288 (Azat Khuzhin).
- 减少 SQL parser 的依赖项和代码量,现可独立构建——其独立的 WebAssembly 构建请参阅
utils/wasm-parser。SQL 关键字和访问类型表现在会在编译时生成,而非在每次 server 启动时生成。#112067 (Alexey Milovidov). - 现在,当许可证生成失败时,从源码构建会在 CMake 生成阶段失败,而不会损坏
StorageSystemLicenses.generated.cpp。#111222 (Mikhail Artemenko). - 将捆绑的 Apache Thrift 库更新至版本 0.24.0。#111278 (Groene AI).
- 为 musl 构建添加
libucontext,以启用 sanitizer 构建使用的boost::contextucontext后端。#111437 (Konstantin Bogdanov). - 修复使用 musl 构建时的源码级可移植性问题。#111631 (Konstantin Bogdanov).
- 从源码构建时,编辑
Core/ProtocolDefines.h不再触发接近完整的重新构建:已从BlockInfo.h中移除该 include,并仅在使用其常量的文件中添加。#111650 (Alexander Gololobov). - 通过禁用对系统库分配内存的 memory-tracker debug 检查,修复 macOS debug 构建中的启动中止问题。#112080 (Arsen Muk).
- 将捆绑的
libarchive更新至版本 3.8.9。#112434 (Konstantin Bogdanov). - 将
StringZilla更新至版本 5.0.5。#112319 (Konstantin Bogdanov). - 将
jwt-cpp更新至 v0.7.2。#112595 (Konstantin Bogdanov). - 将捆绑的 SQLite amalgamation 从 3.41.2 更新至 3.53.4。#112599 (Konstantin Bogdanov).
- 将
aws-c-http更新至版本 0.11.0。#112413 (Govind R Nair). - 将
libcotp更新至 v4.2.1。#112596 (Konstantin Bogdanov). - 对于构建描述中未包含手写汇编代码的架构,OpenSSL 现可从其可移植 C 源码构建,不再在最终链接阶段因未定义符号而失败。新的
OPENSSL_NO_ASMCMake 选项可显式选择此路径。#112863 (Alexey Milovidov). - 新增
ENABLE_ORCCMake 选项 (默认启用) ,使构建可包含 Parquet 而不包含 ORC,也无需 ORC 引入的 protobuf 和protoc。 #112864 (Alexey Milovidov). Common/Exception.cpp编译时不再需要 ClickHouse 修补版 libc++;因此,链接其他 C++ 标准库的构建会获得不含抛出位置堆栈跟踪的异常,而不再无法编译。 #112865 (Alexey Milovidov).- aarch64 musl 构建中的堆栈展开现在可跨越信号帧和被阻塞的系统调用,而不再停在 libc 帧处,从而改进致命错误处理程序和采样查询分析器生成的堆栈跟踪。 #112592 (Konstantin Bogdanov).
- 将内置的
libexpat更新至 2.8.2。 #112593 (Konstantin Bogdanov). - 将
simdjson更新至 v4.6.5。 #112594 (Konstantin Bogdanov). - 将 Apache Arrow 更新至 25.0.0,并将 Apache ORC 更新至 2.3.1。 #112604 (Konstantin Bogdanov).
- 覆盖率构建 (
WITH_COVERAGE) 现在链接基于内置 LLVM 源码在源码树内构建的 profile 运行时,而非主机 clang 工具链附带的归档文件。 #112607 (Konstantin Bogdanov). - 将 Protocol Buffers 更新至 v35.1,并将 gRPC 更新至 v1.83.0。 #112614 (Konstantin Bogdanov).
- 新增实验性 WebAssembly (
wasm64,通过 Emscripten) 目标:emcmake cmake现在可配置源码树,且底层组件可正常构建。还修复了无法在任何平台上构建的-DENABLE_LIBFIU=OFF。 #112911 (Alexey Milovidov). - 修复所有
-Wunique-object-duplication报告的位置:在头文件中定义的可变单例此前会为每个共享对象生成一份副本,而非每个进程一份。主要通过将定义移至.cpp文件中实现。 #112995 (Alexey Milovidov). - 现在在悬空符号链接上安装
tgz软件包时,会保留符号链接链,并应用软件包中目标的权限模式和所有权,而非使用由umask派生的权限模式。 #112766 (Alexey Milovidov). - 在
aarch64musl 构建中,memmove现在使用 ARM optimized-routines 的汇编实现 (与memcpy共用) ,而非通用的 C 语言逐机器字循环。 #113502 (Konstantin Bogdanov). - 在 musl 构建中,使用
AI_ADDRCONFIG的getaddrinfo现在遵循 glibc 语义,因此在仅 IPv4 环境中,localhost不再优先解析为不可用的::1;此外,sysconf现在会为getpwuid_r/getgrgid_r返回 glibc 的缓冲区大小提示,而非 -1,从而修复 libhdfs3。 #113485 (Konstantin Bogdanov). - 在 musl 构建中,
sched_getcpu现改为通过 rseq 读取 (约 1ns) ,而非系统调用,与 glibc 保持一致;这消除了 jemalloc 的percpu_arena在频繁内存分配的工作负载中的系统时间开销。musl 还会立即注册 rseq,并导出 glibc__rseq_*ABI。#113501 (Konstantin Bogdanov). - 修复本地 (非 CI) 构建将所有内置的 Rust 代码以
opt-level = 0编译的问题,包括PCOcodec、通过delta-kernel-rs读取 Delta Lake、prqlc、chdig、wasmtime以及客户端通过skim实现的模糊历史记录搜索。由于SANITIZECMake 变量使用option声明,其默认值为 BOOLOFF,未能通过STREQUAL ""的“未启用 sanitizer”检查;因此,所有未显式指定-DSANITIZE=...的构建都会走禁用 Rust 优化的 sanitizer 变通路径。#114083 (Alexey Milovidov). - 推送经 zstd 压缩的 Docker 镜像层。#114342 (Alexey Milovidov).
- 仅为发布构建生成 Debian 软件包。#114739 (Alexey Milovidov).
- 修复在未启用完整库集的配置中 (
ENABLE_LIBRARIES=0或ENABLE_ROCKSDB=0) 构建unit_tests_dbms的问题。#115655 (Alexey Milovidov).
向后不兼容的变更
- 默认情况下,来自用户 SQL 的 S3 访问不再解析服务器自身的云凭证 (环境变量、IMDS/IRSA、实例配置文件、AWS 配置文件、基于
role_arn的 STS、GCP OAuth 元数据) ;这类请求必须使用显式凭证或NOSIGN。命名集合现在默认将use_environment_credentials设为0。如需恢复此前行为,可按请求设置use_environment_credentials = 1(或通过<s3>config 全局设置) ,并配合新的设置s3_allow_server_credentials_in_user_queries(默认禁用) 。显式提供的凭证以及运维预配的 config 凭证不受影响。在 server 启动时或执行RESTORE时,如果持久化的S3/S3Queue表、动态 S3 disk 或DataLakeCatalog的定义会解析这类凭证,则会以匿名方式加载 (在重新提供凭证前不可访问) ,而不是中止启动;这一行为由新的 server settings3_load_table_anonymously_if_credentials_restricted控制 (默认启用) 。#106855 (Raúl Marín). **/glob (任意层级的目录) 现在也会匹配当前目录本身。此前,glob patterns 中的**/不会作为特殊情况处理,因此data/**/file.txt不会匹配data/file.txt(零级目录) 。#97676 (Alexey Milovidov).- 对于存储在对象存储上的备份——包括直接的
S3(...)/AzureBlobStorage(...)目标端,以及底层存储为 S3 或 Azure 的Disk(...)目标端——BACKUP和RESTORE现在都拒绝使用zip/zipx备份归档格式。Zip 需要通过 seek 读取其中央目录,而这在对象存储上会非常慢。请改用基于 tar 的格式,例如tar.gz。#101770 (Yash ). DateTime64的支持范围已从[1900-01-01, 2299-12-31]扩展到[0000-01-01, 9999-12-31]。此前超出旧范围的值现在会被正确计算 (通过 cctz) ,而不是被截到边界值。对于精度 8 或 9,由于 ticks 以Int64存储,范围仍然较窄 (纳秒精度下最大值仍为2262-04-11) 。backward compatibility:如果你之前使用过超出范围的日期时间,并依赖旧范围内那套非常特殊的饱和规则,请注意结果现在会发生变化,以获得更正确的行为。#107907 (Alexey Milovidov).AggregatingMergeTree现在会在建表时拒绝以下 schema:某列既不属于 sorting key,也不是聚合状态度量 (AggregateFunction/SimpleAggregateFunction) 。这类列在 background merges 期间会被静默折叠为任意值,从而导致对其执行GROUP BY或按其过滤的 queries 产生错误结果。设置allow_dimensions_outside_sorting_key = 1可恢复此前行为。关闭 #751。#108087 (Alexey Milovidov).- 已移除基于 config 的 Workload scheduling 配置 (server config 中的
resources和workload_classifiers部分) 。请改用CREATE RESOURCE和CREATE WORKLOADqueries。已废弃的 config 部分会被忽略,并给出警告。#108286 (Sergei Trifonov). - ClickHouse 现在对同步插入和异步插入一律使用统一的插入去重哈希;旧版按单次插入去重的行为已被移除。服务器设置
insert_deduplication_version被保留为迁移保护机制:如果其被设为旧值 (old_separate_hashes或compatible_double_hashes) ,服务器将拒绝启动。若要从使用旧值的版本升级,请先运行一个支持compatible_double_hashes的版本 (该版本会同时写入旧版哈希和统一哈希) 。对于复制表,请至少运行replicated_deduplication_window_seconds这么长时间 (默认为一小时;默认窗口会在该时间窗口内保留所有插入的统一哈希,这被认为足以覆盖插入重试循环) 。对于non_replicated_deduplication_window> 0 的非复制表,该窗口按计数而非按时间计算,因此请至少在compatible_double_hashes下运行这么多次插入。然后在升级到此版本之前移除该设置 (或将其设为new_unified_hash) 。#108361 (Sema Checherinda)。如果你从未设置过insert_deduplication_version,可以忽略此项。 - 已移除长期弃用的函数
snowflakeToDateTime、snowflakeToDateTime64、dateTimeToSnowflake和dateTime64ToSnowflake。它们早在 v24.6 就已被弃用,推荐改用snowflakeIDToDateTime、snowflakeIDToDateTime64、dateTimeToSnowflakeID和dateTime64ToSnowflakeID,现在应使用后者。设置allow_deprecated_snowflake_conversion_functions(此前可用于重新启用这些函数) 现已过时且不再生效。#108711 (Alexey Milovidov)。 - 设置
use_legacy_to_time现在默认值为0,因此toTime会将值转换为Time数据类型,而不是将日期时间转换为固定日期。旧行为仍可通过toTimeWithFixedDate函数或设置use_legacy_to_time = 1来使用。#108729 (Alexey Milovidov)。 - 朴素贝叶斯模型 (由
naiveBayesClassifier使用) 现在改为配置成采用NAIVE_BAYES布局的字典,并在加载时根据按类别预聚合的 n-gram 计数表构建,而不再使用此前的服务端配置方式 (即引用已序列化.bin模型文件的 XML 配置文件) ;该旧方式已不再受支持——现有模型必须重建为字典。除了naiveBayesClassifier外,还新增了三个函数:naiveBayesClassifierWithProb返回预测类别及其概率,naiveBayesClassifierWithAllProbs返回每个类别及其概率,naiveBayesNgrams以与字典相同的方式将文本切分为 n-gram,用于从原始带标签文本构建训练数据。此外,还进行了多项性能优化:对于一个 9.7 MiB 的 code-point trigram 语言模型,其内存占用减少约 49 倍 (从 1.84 GiB 降至 38 MiB) ,加载速度提升约 11 倍,分类速度也提升约 11 倍。#108773 (Nihal Z. Miaji)。 hasColumnInTable函数不再接受可选的hostname、username和password参数来检查任意远程服务器上的列;现在仅保留hasColumnInTable(database, table, column)这一形式。被移除的远程模式存在安全隐患:它允许任何用户触发到任意主机的出站连接,并将凭据泄露到查询日志中,而且不受任何权限控制。#110881 (Alexey Milovidov)。
新特性
- 新增
EXPLAIN ANALYZE,用于分析查询性能:查询会实际执行,并以熟悉的查询计划格式展示实际执行指标。#106586 (Kirill Kopnev). #110668 (Kirill Kopnev). - 投影定义现已支持
WHERE子句。带有WHERE的投影只会物化满足谓词的行;当查询的WHERE蕴含投影的WHERE时,优化器可以基于成本使用这些投影。#102347 (S Bala Vignesh). - 新增
skip_unavailable_shards_mode设置 (也可用作Distributed引擎设置) ,用于控制在启用skip_unavailable_shards时,来自远程分片的哪些异常会被静默忽略。#79091 (cjw). - 新增
groupFormat聚合函数,可使用指定的输出格式格式化每个分组中的行,并将结果作为字符串返回。#93201 (Yang Hu). - 新增
AWS_MSK_IAM作为kafka_sasl_mechanism的支持取值,使 ClickHouse 能够通过 IAM 角色向亚马逊 MSK 进行身份验证,而无需管理 SASL/SCRAM 凭证。#96100 (kalavt). - 新增聚合函数组合器
-Tuple,它会将底层聚合函数分别应用到Tuple列的每个元素上,并返回由结果组成的Tuple,同时保留元素名称:对于t = (a, b),sumTuple(t)返回(sum(a), sum(b))。带有多个参数的聚合函数会为每个参数接收一个Tuple,并按位置配对:corrTuple((a1, a2), (b1, b2))返回(corr(a1, b1), corr(a2, b2))。与作用于数组的-ForEach不同,这些元素可以具有不同类型,并且会保留每个元素的结果类型和名称。#98190 (RinChanNOW). - 文本索引现已支持
postprocessor参数——即可在分词后转换每个标记的任意表达式 (例如lower) 。#98939 (Jimmy Aguilar Mena). #108606 (Jimmy Aguilar Mena). - 新增
system.stemmers系统表,其中列出了可为stem函数指定的所有语言。#100611 (Jimmy Aguilar Mena). - 新增对负
LIMIT使用WITH TIES的支持。#100930 (Nihal Z. Miaji). - 新增对标准 SQL 后缀操作符
AT TIME ZONE和AT LOCAL的支持,作为toTimeZone的语法糖。表达式expr AT TIME ZONE zone现在等价于toTimeZone(expr, zone),而expr AT LOCAL等价于toTimeZone(expr, timeZone())。#106092 (lizepeng). URL表引擎和url表函数现在会根据 URL 协议分发到相应的后端:file://由File表引擎处理,s3:///gs:///gcs:///oss://由S3处理,az:///azure:///abfss:///abfs://由AzureBlobStorage处理,hdfs://由HDFS处理,而http(s)://仍和之前一样由URL引擎处理。url_base设置会在按协议分发前应用。只有通过默认url_scheme_mappers解析出的 S3 协议会被分发;其他兼容 S3 的厂商协议 (cos、obs等) 不会被分发,需直接使用s3引擎/函数。#106093 (Alexey Milovidov).- 新增
Remote和RemoteSecure表引擎,它们分别是remote和remoteSecure表函数的持久化对应形式。现在除了CREATE TABLE ... AS remote(...)之外,还支持CREATE TABLE ... ENGINE = Remote('addresses', db, table, ...)。#106189 (Alexey Milovidov). - 新增与引擎无关的
SYSTEM STOP、SYSTEM START、SYSTEM PAUSE、SYSTEM CANCEL和SYSTEM REFRESH命令,以及它们面向整个服务器的... ALL BACKGROUND形式,用于通过统一接口控制Kafka、RabbitMQ、NATS、S3Queue/AzureQueue表以及可刷新materialized view 的后台活动。对于可刷新materialized view,这些命令是现有SYSTEM ... VIEW命令的别名。为支持在 NATS 上使用这些控制,JetStream 表现在仅会在成功 insert 后才确认消息 (至少一次;此前消息会在投递时自动确认,如果 insert 失败则可能丢失) 。新增nats_wait_for_flush_interval设置 (默认false,保持此前的低延迟行为) ,可选择让一次消费周期在整个 flush 时间间隔内保持开启,而不是在队列清空后立即 flush。新增的nats_commit_on_select设置会让对 JetStream 表直接执行SELECT时消费 (确认) 其读取到的消息。#107476 (Samuel Krempaský). - 新增支持:
mysql、postgresql和sqlite表函数及表引擎现在可以接收用户查询 (而非表名) ,并将其原样传递给外部数据库,写法可以是子查询(SELECT ...)或query('SELECT ...')。结果表的结构会根据查询结果推断,此类表为只读。关闭 #46758。基于 Denis Vidiaev 的初始实现 (#79652) 。#107740 (Alexey Milovidov). - ClickHouse Web UI (Play) 新增了用于同时处理多个查询的选项卡。选项卡及其标题、参数、激活状态和小型结果快照都会在重新加载后保留 (大型结果和图像结果不会恢复) ,并与浏览器历史记录和 URL 集成,还可通过鼠标滚轮切换。#107826 (Alexey Milovidov).
- 引入
QueryRunner表引擎。insert 到QueryRunner表中的记录表示要由该引擎执行的查询。该引擎可用于异步查询执行、生成查询的批量执行、将查询定向到远程集群、基准测试、模糊测试,以及使用影子流量进行测试。#107888 (Miсhael Stetsyuk). - 新增
GeoJSON输出格式,用于写入 GeoJSONFeatureCollection文档,每一行生成一个 feature。唯一的 geo 类型列 (Point、LineString、MultiLineString、Polygon、MultiPolygon、Ring或Geometry) 会成为每个 feature 的geometry;名为id的列会成为 feature 的id;其余所有列都会成为 feature 的properties。其中,如果只有一个名为properties的 object 类型列 (JSON、Map或具名Tuple) ,则会直接写入为properties对象。Ring会被写成单环Polygon。新的format_geojson_validate_geometry设置 (默认启用) 用于控制在读写时,是否拒绝不符合 GeoJSON 形状要求的几何对象——例如点数少于四个的Polygon,或未闭合的Polygon环。此外,GeoJSON输入格式现在会将id列推断为Nullable(String),而不是String``因此,缺少id成员或显式包含”id”: null的 feature 会被读取为NULL,并与空字符串""` 区分开来。基于 Mark Needham 的初始实现 (#98124) 。#108065 (Nihal Z. Miaji). - 新增
dotProductTransposed函数 (别名scalarProductTransposed) ,用于计算QBit列与参考向量之间的近似内积,补充了现有的L2DistanceTransposed和cosineDistanceTransposed函数。#108100 (Alexey Milovidov)。同时新增量化转置距离函数cosineDistanceTransposedQuantized、L2DistanceTransposedQuantized和dotProductTransposedQuantized,用于处理包含quantizeBFloat16ToInt8Lloyd-Max 编码的QBit(Int8),并在运行时动态对存储的编码进行反量化。浮点参考向量表示全精度查询,并以Float32精度进行比较 (Float64查询会被收窄) ;Array(Int8)参考向量本身也会被反量化,从而实现对称的 quantized-vs-quantized distance。#109405 (Alexey Milovidov). - 为
QBit数据类型新增可选的 stride 参数 (QBit(T, dimension, stride)) ,可将不同维度分组存储到独立的数据流中,从而让 vector search 能够高效地仅读取前几个维度 (例如用于 Matryoshka embeddings) 。转置距离函数还支持可选的第四个used_dims参数,用于读取缩减后的维度数。#108103 (Alexey Milovidov). - 为
QBit数据类型新增对Int8元素类型的支持,从而可以存储量化后的 8 位整数向量,并基于其执行转置距离 vector search (L2DistanceTransposed、cosineDistanceTransposed) 。#108105 (Alexey Milovidov). - 新函数
randomHadamardTransform(vector[, seed[, output_dims]]):对浮点向量执行确定性的随机 Hadamard transform——这是一种保持正交性和范数不变的旋转,适合在量化前对嵌入向量进行预处理;在截断时,还可作为 Johnson–Lindenstrauss / subsampled-randomized-Hadamard 随机投影。#108227 (Alexey Milovidov). - 支持在字典定义中使用
dictionary_lazy_load设置,按字典单独配置 lazy loading,并覆盖全局的dictionaries_lazy_load服务器设置,因此某些字典可以延迟加载,而其他字典则可以预先加载。#108314 (Miсhael Stetsyuk). - 新增内置文档搜索页面,可通过 HTTP interface 的
/docs路径访问,支持对system.documentation表进行即时搜索,并渲染参考文档 (包含语法高亮、数学公式和交叉链接) 。#108345 (Alexey Milovidov) 。 - 新增函数
xxHash64Spark,使用种子42为String和NULL输入计算与 Spark 兼容的xxHash64值,并返回Int64。#108436 (Lalit Yadav) 。 ALTER USER、ALTER ROLE和ALTER SETTINGS PROFILE现已支持将SET name = value作为MODIFY SETTING name = value的别名。它会原地修改单个 setting,同时保留其余设置;而裸SETTINGS子句则会替换整个 settings 列表。这样可降低误清除用户其他设置的风险。#108722 (Groene AI) 。- 支持
ALTER TABLE ... MODIFY CONSTRAINT [IF EXISTS] name CHECK expr,可原地修改现有约束的 expression。#108768 (Alexey Milovidov) 。 - Web UI:新增按列设置的 color coding 切换开关 (列标题中的 🌈 图标) ,可在条形图、热力图、categorical 和无 visualization 之间切换。所选模式会保存在 URL 和浏览器历史记录中。#108873 (Alexey Milovidov) 。
Keeper现已能正确处理ZooKeeper的CreateContainer操作码 (19),该功能受新的可选create_containerfeature flag 控制 (默认禁用,与create_ttl相同) 。在整个 ensemble 完成升级后启用该功能,外部ZooKeeperclients (如 JavaZooKeeper3.9+) 即可在Keeper上创建容器节点,而不会再收到ConnectionLoss;容器节点会报告预期的ephemeralOwner哨兵值,leader 上的后台 GC 线程也会自动删除无子节点的容器。携带CONTAINERcreate-mode 标志但未使用操作码 19 的普通Createrequest 仍会被拒绝 (ZBADARGUMENTS) :目前没有已知的ZooKeeperclient 会发出这种组合。这仅涉及 server-side protocol compatibility:ClickHouse 自带的ZooKeeperclient (zkutil) 没有变化,也没有可自行创建容器节点的 API。#108908 (unintended) 。- 新增函数
geoToUTM、UTMToGeo、geoToMGRS和MGRSToGeo,用于在 WGS84 地理坐标与 UTM、MGRS 坐标系之间进行转换。#108939 (Alexey Milovidov) 。 - 新增
digits(n, offset[, length])函数,返回n中从 1-basedoffset开始、长度为length的数字;如果省略 `length“,则一直返回到该数字的末尾。#109012 (Umang Agrawal) 。 - 新增
sqr算术函数,用于计算一个数的平方。#109061 (Lalit Yadav) 。 - 新增函数
dictGetRoot,用于返回层级字典中某个键的最高层祖先 (根节点) 。它是dictGetHierarchy(dict_name, key)[-1]的便捷等价写法。#109459 (Alexey Milovidov) 。 - 新增
SYSTEM UNLOAD DICTIONARY和SYSTEM UNLOAD DICTIONARIES命令,可在不删除字典定义的情况下释放字典占用的内存。字典会在下次访问时按需重新加载。#109639 (Matheus Nerone) 。 - 新增函数
geometryIntersectCartesian和geometryIntersectSpherical,用于判断两个几何对象是否相交。与polygonsIntersectCartesian/polygonsIntersectSpherical不同,它们接受任意几何数据类型 (Point、LineString、MultiLineString、Ring、Polygon、MultiPolygon) ,包括通用的Geometry类型,且两个参数可以是不同类型。#110062 (Alexey Milovidov) 。 - 查询参数 (
{name:Type}替换) 现在也可用作设置值,既可用于查询的SETTINGS子句 (如SELECT或INSERT) ,也可用于独立的SET查询,例如SELECT ... SETTINGS max_threads = {threads:UInt64}和SET max_threads = {threads:UInt64}。#108760 (Alexey Milovidov) 。
Experimental 功能
url表函数和URL表引擎的通配符展开:通过列出 HTTP 索引页 (HTML 或 plaintext 目录列表) 并提取匹配的 URL,可以展开 URL 路径中的通配符,同时对索引页大小和读取的目录数量施加限制。通过allow_experimental_url_wildcard_from_index_pages设置启用。#95181 (Yue Ni)。- 文本索引现在可以存储词元位置 (
support_phrase_search索引参数) ,从而为hasPhrase函数启用基于直接读取的精确短语匹配。需要启用MergeTree设置allow_experimental_text_index_phrase_search。#103172 (Elmi Ahmadov)。该参数最初以positions这一名称引入。#109900 (Elmi Ahmadov)。 Iceberg表现已支持通过OPTIMIZE TABLE ... MANIFEST进行 manifest 文件合并整理 (受allow_experimental_iceberg_compaction设置控制) 。解决了 #95174。#98178 (Smita Kulkarni)。修复了Iceberg表在 manifest 分区元组与其分区规范不匹配时OPTIMIZE TABLE ... MANIFEST的问题。#111368 (Smita Kulkarni)。- 为实验性的
ALP编解码器新增了 Real Doubles (RD) 变体,以及可选的ALP(AUTO|STD|RD)参数。现在,裸ALP会在现有的STD方案和RD之间自动选择,而不再始终使用STD。#99654 (Nazarii Piontko)。 - 为反序列化后的
Paimon元数据文件 (manifest 列表和 manifests) 新增了内存 SLRU 缓存。通过use_paimon_metadata_files_cache设置启用后,对同一个Paimon表的重复查询将跳过从 object storage 重新下载和重新解析元数据。#104657 (XiaoBinMu)。 - 为可执行用户自定义函数新增了“驱动”。在
<user_defined_executable_function_drivers_config>中声明的驱动可用于CREATE FUNCTION name ARGUMENTS (...) RETURNS T ENGINE = DriverName(...) AS '...code...',以便在函数创建时编译或以其他方式处理用户代码片段,并生成可运行的 executable UDF。生成的配置会存储在<dynamic_user_defined_executable_functions_path>中,而原始查询会以ATTACH FUNCTION的形式持久化,因此该函数在服务器重启后仍可保留。概念验证版c_function_body驱动可在executable_pool模式下,在沙箱化的 Docker 容器中编译并运行 C 函数体。基于 Daniil Timižev 的初始实现 (#77128) 。#105131 (Alexey Milovidov)。 - 当谓词能够将列精确划分为默认值和非默认值时,可直接根据
serialization.json中按列统计的稀疏性信息返回SELECT count(*) FROM t WHERE col <op> default(col)的结果,无需进行任何数据扫描 (由新的实验性设置optimize_trivial_count_with_sparsity_filter控制,默认关闭) 。#105890 (Raúl Marín)。 - 发送到
/api/v1/query和/api/v1/query_range的 Prometheus Query API 请求现在会记录到system.query_log中,并带有read_rows和read_bytes指标。#106611 (James Cunningham)。 - Experimental
ReaderExecutor读取路径 (use_reader_executor,默认关闭) 现在可以保持远程源连接处于打开状态,并在顺序读取之间复用,从而减少扫描时对对象存储的请求次数。#107735 (Sema Checherinda)。现在它还支持读取加密文件,并提供全局加密请求头缓存,可通过encryption_header_cache_size服务器设置进行配置,并可通过SYSTEM DROP ENCRYPTION HEADERS CACHE清除。#109702 (Sema Checherinda)。 - 启用
make_distributed_plan后,支持在MergeTree家族表上对SELECT ... FINAL执行分布式查询计划读取。#108148 (Alexander Gololobov)。 - 为
MergeTree查询新增基于执行计划的 Experimental 并行副本执行。#108504 (Igor Nikonov)。 - 新增 Experimental
Quantize向量编解码器家族,以及一种可选启用的、针对量化配套流的两阶段近似向量搜索 Rewrite。#108565 (Shankar Iyer)。 - 恢复了 Experimental
SZ3有损压缩编解码器 (带误差界限) ,适用于Float32/Float64(及其数组) 列,最初由 Konstantin Vedernikov 实现 (#83088) 。它需要allow_experimental_codecs。#108788 (Alexey Milovidov)。修复了读取使用SZ3('ALGO_LORENZO_REG', ...)压缩的数据时的问题,此前会因CORRUPTED_DATA而失败;同时避免了在压缩非有限浮点值 (NaN和无穷大) 时出现未定义行为。#110762 (Alexey Milovidov)。 - 新增 Experimental
ZXC编解码器——一种非对称 LZ 编解码器,压缩较慢但解压非常快,压缩率介于LZ4和ZSTD之间。它需要allow_experimental_codecs = 1,并且system.compression_codecs会将其标记为 experimental。#110620 (Alexey Milovidov)。#111007 (Alexey Milovidov)。 - 现在你可以通过
onelake_bearer_token设置,使用预先获取的 Bearer 令牌对 OneLake 进行身份验证,而不必使用onelake_client_id和onelake_client_secret。这样可以避免共享长期有效的客户端密钥。该令牌不会自动刷新,因此一旦过期,必须重新创建数据库。#109104 (Asya Shneerson)。 - AI functions 不再将 named collection 作为第一个位置参数。凭据来自
ai_function_text_default_credentials/ai_function_embedding_default_credentials设置,或者来自可选末尾Map(String, String)参数中的credentials键;该参数还可携带可调参数 (model、max_tokens、temperature、system_prompt、instructions、dimensions) 。#109232 (George Larionov)。aiEmbed函数现在将model作为必需的位置参数 (aiEmbed(text, model[, params])) ,而不是从 named collection 中读取它,这可确保嵌入向量结果的可复现性。#110619 (George Larionov)。 - 修复了打包到
skp_idx.packed中的跳数索引的data_uncompressed_bytes(通过packed_skip_index_max_bytes) :此前报告的未压缩大小实际上是压缩后大小,这也可能导致distributed_index_analysis无法启用。#109272 (Raúl Marín). - 为
MergeTree表新增了实验性的打包数据分区片段存储:该功能会将一个分区片段的大多数文件存放在单个data.packed归档中,而不是每个流对应一个文件 (projections 和少数 service file,例如txn_version.txt,仍会单独写入) 。它由min_bytes_for_full_part_storage、min_rows_for_full_part_storage和min_level_for_full_part_storage设置控制,默认禁用。一旦某个表写入了打包分区片段,旧版 server 将无法读取它们,因此启用该格式后将无法将 server 降级。#108118 (Raúl Marín). - 新增了实验性的 table function
eval,它会将常量 expression 求值为查询字符串,并执行生成的单条SELECT查询。该功能默认禁用,可通过allow_experimental_eval_table_function设置启用。作者:Yue Ni。#110132 (Alexey Milovidov). - 为实验性的 Prometheus remote-write v1 HTTP handler 新增了
zstd压缩支持。#110907 (James Cunningham). DeltaLake表写入 (allow_experimental_delta_lake_writes设置) 已提升为 Beta。#107034 (Kseniia Sumarokova).- 新增了
ProfileEventsDistributedPlanRemoteTasks、DistributedPlanLocalExecution和DistributedPlanHostsUsed,用于观测实验性 distributed query plan (make_distributed_plan) 的执行情况。#107985 (Shankar Iyer). - 移除了 Keeper 中基于 RocksDB 的实验性存储 (
experimental_use_rocksdb) 。一种更好的新型磁盘存储即将推出。#108000 (Michael Kolupaev). - Distributed 索引分析 (由
distributed_index_analysis设置控制的一项实验性功能) 现在会将大型数据分区片段名称列表作为标量发送到 remote server,而不是将其嵌入查询文本中。这避免了因max_ast_elements/max_query_size限制导致的潜在失败,并消除了 AST 解析开销。#110419 (Azat Khuzhin). - 优化了实验性的
timeSeries*ToGrid聚合函数:桶现在会同时按 step 和 window 对齐,并且当 window 远大于 step 时,最终聚合速度会快得多。聚合状态的 serialization format 发生了不兼容变更 (这些函数仍属实验性) 。#106724 (Vitaly Baranov). TimeSeries表的外部目标端表现在会注册为引用依赖:与 materialized view 类似,这意味着在删除引用它的TimeSeries表之前,不能先删除外部目标端表 (如果启用了check_referential_table_dependencies) 。#108388 (Vitaly Baranov).- 新增了 PromQL 函数
increase。#111023 (Vitaly Baranov).
性能提升
JOIN现在可以利用左侧表上的主键索引或跳过索引来裁剪粒度。由设置enable_join_runtime_filters_index_analysis控制。#109085 (Shankar Iyer) 。- 现在,对可直接序列化类型向量的序列化和反序列化,会使用单次缓冲区 I/O 调用,而不再逐个处理元素。#89842 (Jimmy Aguilar Mena) 。
- 优化逆向字典查找:常量相等谓词 (例如
WHERE dictGet(dict, attr, key_expr) = value) 现在会直接常量折叠为键过滤条件 (key_expr = const、key_expr IN [...]或WHERE 0) ,而不是改写为IN (SELECT ... FROM dictionary(...))子查询;同时,dictGetKeys的常量路径现在也会并行执行。#91164 (Nihal Z. Miaji) 。 - 新增设置
merge_tree_generic_exclusion_search_max_steps,用于限制通用排除搜索算法在分析每个数据分片的主键索引时可使用的步数。该预算会优先用于最大的剩余键范围,因此即使预算很小,也能裁剪掉大部分数据;未被完全分析的范围会整体读取,因此查询结果仍然正确,但可能会读取更多粒度。该限制是宽松生效的:最多可能超出merge_tree_coarse_index_granularity步,再加上该分片当前已划分出的每个范围各 1 步 (例如由查询条件缓存划分时) 。默认值 0 表示步数不受限制。#92779 (Michael Jarrett) 。 - 现在,针对
Distributed表之上视图的ORDER BY和LIMIT查询,会使用 merge-sorted-streams 优化:外层ORDER BY/LIMIT会下推到简单视图的内部查询中,因此每个分片都会在本地对数据排序,而协调节点只需合并预排序的流,无需执行完整排序。#94102 (matanper) 。 - 默认启用
optimize_or_like_chain。关闭 #87779。#94517 (Alexey Milovidov) 。 - 将不带生存时间 (TTL) 的轮转非复制表
MergeTree系统日志表标记为table_readonly,以避免不必要的后台操作。table_readonlyMergeTree设置现在还会抑制普通MergeTree表上的所有后台工作——常规合并、TTL (DELETE/MOVE/重新压缩) 以及重新压缩合并、后台变更和后台分片移动——并且会拒绝会修改分区的命令 (针对该表的ATTACH/MOVE/DROP/DROP DETACHED/FETCH/REPLACE PARTITION以及MOVE PARTITION ... TO TABLE) ;除此之外,它原本就会拒绝 inserts、mutations 和OPTIMIZE。因此,在启用该设置时,带 TTL 的table_readonly表将不再回收其已过期数据。#95079 (Mathuranath Metivier) 。 - 当服务器拥有大量用户时,提升从
system.users读取单条用户记录的性能。#96699 (Alistair Evans) 。 - 使用并行副本按序读取时,现在会采用与本地读取相同的逻辑,将表拆分为
max_threads个部分,以获得更好的并行性。#101434 (Nikita Taranov) 。 - 当主键列同时也是分区键的输入列时,
MergeTree表在进行主键分析时会利用分区 minmax 索引边界来裁剪更多粒度。例如,对于使用ORDER BY (id, event_time)和PARTITION BY toYYYYMM(event_time)的MergeTree表,ClickHouse 会在主键索引分析期间使用event_time上的分区 minmax 索引,从而做出更准确的粒度裁剪决策。由新设置use_partition_minmax_for_primary_key_pruning控制 (默认启用) 。#103480 (UnamedRus). - 为使用 Top-K 动态筛选 (
ORDER BY ... LIMIT n) 的查询启用查询条件缓存。缓存条目会按 Top-K 执行计划参数分区,因此相同查询会复用缓存的WHERE过滤结果,而不同的LIMIT、排序列或排序方向则会生成新的条目。#104478 (Alexey Milovidov). - 新增
use_constant_folding_in_index_analysis设置 (默认禁用) 。启用后,MergeTree主键、MinMax以及数据跳过索引分析会针对每个分片分别将分区级常量折叠到过滤谓词中,从而提升这类过滤条件的裁剪效果:其分支依赖于分区值,例如在PARTITION BY a时的(a = 1 AND b >= 1) OR (a = 2 AND b > 10)。#104582 (Mikhail Artemenko). - 将
LIMIT下推到按序聚合中,使得当GROUP BY键与ORDER BY键及表排序键一致时可以提前终止,从而显著减少读取的行数。#104859 (Konstantin Bogdanov). - 现在更新 profile events 的速度最高可提升 30 倍,方法是对全局服务器级和每用户计数器使用按 CPU 划分的原子操作。由
user_profile_events_per_cpuserver setting 控制 (在 64 核上每个用户大约会占用 640 KiB,因此当用户数量非常大时,继续保持禁用可能更合适) 。#105056 (Azat Khuzhin). - 默认启用
allow_aggregate_partitions_independently。当GROUP BY键适合分区键时,ClickHouse 可以对每个分区独立执行聚合,并跳过全局 merge 步骤。运行时启发式规则会在分区布局不利于该优化时自动跳过它 (例如分区过少、分区过多,或分区大小严重倾斜) 。#105128 (Alexey Milovidov). - 带重评分的向量搜索查询 (
vector_search_with_rescoring = 1) 现在只会对向量索引返回的行计算精确距离,应用精确的行位置过滤器,而不再对同一MergeTree粒度中的相邻行进行穷举重评分。#105591 (Sergey Kuznetsov). #108846 (Sergey Kuznetsov). - 通过一次比较整段值,而不是为每个值分别调用一次比较操作,提升
partial_mergejoin algorithm 在FixedString键上的性能。#105737 (Artem Zuikov). - 数据湖 catalog (Iceberg REST、Glue、Unity、Hive、Paimon) 上的
SHOW TABLES和system.tables现在会将带命名空间约束的谓词下推到 catalog,从而避免扫描整个 catalog。修复 #105022。#106029 (Smita Kulkarni). - 限制每个 CPU 的未跟踪内存,以避免 overcommit 和内存不足错误 (这些限制可通过
max_per_cpu_untracked_memory和per_cpu_untracked_memory_thread_buffer服务器设置进行配置) 。#106055 (Azat Khuzhin). - 加速对已排序流中相同键值连续段的扫描操作——包括按顺序执行的
DISTINCT、按顺序执行的LIMIT BY、按顺序执行的负LIMIT BY,以及full_sorting_merge和partial_mergejoin。#106502 (Nihal Z. Miaji). - 为
Arrow和ArrowStream格式实现了原生读取器和写入器,不再依赖 Apache Arrow 库,从而避免额外的数据复制和转换。现在它已成为默认实现 (设置input_format_arrow_use_native_reader和output_format_arrow_use_native_writer) ,并且无论读取还是写入都更快。#106522 (Alexey Milovidov). - 在修复了 LTO 下出现的线程缓存损坏问题后,重新为 jemalloc 启用 LTO,从而提升性能。#106898 (Azat Khuzhin).
- 降低了内存占用并提升了
JOIN性能。哈希 join 的右侧现在使用紧凑的 8 字节索引式行引用,因此对所有连接键类型,ALLjoin 的哈希表条目现在都与ANYjoin 一样小。基于大型parallel_hashjoin 查询的基准测试显示:在UInt64和String连接键上,对包含唯一键和重复键的 1 亿到 3 亿行表执行INNER和ANYjoin 时,查询中位数速度提升约 12%,峰值内存占用降低约 15%,且没有任何查询变慢。UInt64连接键上的INNERjoin 收益最大 (中位数快约 21%,内存减少 38%) 。#107189 (Harikrishnan Prabakaran). - 哈希 join 现已原生支持单列非 Nullable
LowCardinality(String)连接键。#107264 (Nikita Taranov). - 新增
dpsubjoin 顺序枚举算法 (对子集进行动态规划) ;与dpsize相比,它能以更低的优化开销生成最优查询计划,并支持非 inner join。#107351 (Fisnik Kastrati). - 通过将每个缓存文件的大小编码到文件名中 (
<offset>_<size>) ,避免对每个文件执行一次stat,从而加快启动时的文件系统缓存加载。仍然支持加载由旧版本写入的缓存文件。#107415 (Alexey Milovidov). - 通过避免不必要的字符串物化,提升了
Array(LowCardinality(String))上arrayElement的性能,以及键或值为LowCardinality(String)的Map上 mapLIKE函数的性能。#107450 (Michael Jarrett). - 通过跟踪聚合状态本身的内存,而不是整个查询的内存,在内存占用较小时避免将单层 aggregation 转换为双层 aggregation。#107490 (Hechem Selmi).
- 加快了对聚合查询的分析:聚合哈希表大小统计信息的缓存键现在基于查询计划计算,而不再构建完整的查询 AST。#107643 (Dmitry Novik).
- 通过按行值而不是使用 SipHash 对每一行进行哈希来为多重集建立键,将
INTERSECT ALL和EXCEPT ALL(INTERSECT和EXCEPT的默认模式) 的性能提升了数倍。#107649 (Raúl Marín) 。 - 在不持有缓存锁的情况下重建行级策略过滤器,从而提升并发执行
CREATE ROW POLICY和DROP ROW POLICY时的查询可扩展性。#107917 (Azat Khuzhin) 。 - 通过使用 LLVM 将简单正则表达式编译为原生代码,加速
match、extract、extractAll、replaceRegexpOne和replaceRegexpAll函数。该功能由新设置compile_regular_expressions控制 (默认启用) ;超出支持子集的模式会透明地回退到 RE2 引擎。#108004 (Alexey Milovidov) 。 - 通过使用 NEON 对短偏移重叠复制进行向量化,提升了 AArch64 (ARM) 上小匹配偏移列 (例如定宽整数列) 的 ZSTD 解压速度。例如,在 AWS Graviton 4 上,
UInt64列的解压速度最高可提升约 2.3 倍。#108049 (Alexey Milovidov) 。 - 对
.gz/HTTP/url/s3数据以及 Parquet GZIP codec,使用libdeflate库进行 gzip/zlib/deflate 压缩和解压,进一步提升了速度 (压缩约 1.15×,且压缩率更优;解压约 1.4–1.5×) 。#108074 (Alexey Milovidov) 。 - 提升了与主键过滤器结合使用的文本搜索查询性能。#108114 (Anton Popov) 。
- 利用查询首次运行期间收集的运行时统计信息来优化后续运行:
hashjoin 算法可根据收集到的统计信息自动切换到parallel_hash。#108125 (Hechem Selmi) 。此外,还会利用运行时 join 统计信息中的哈希表大小来优化 JOIN 运行时过滤器的大小,由新设置join_runtime_filter_size_from_hash_table_stats控制。#108313 (Hechem Selmi) 。 - 提升了定长、低基数列的 LZ4 解压速度。#108175 (Nikita Taranov) 。
- 加速默认空白字符的
trimLeft/trimRight/trimBoth函数 (以及它们的别名ltrim/rtrim/trim) :对于无需裁剪的连续行,会一次性按单个批次复制;而逐行扫描空格则只会对实际存在前导或尾随空格的行执行。#108177 (Groene AI) 。 - 当 pattern 为单个字符且 replacement 为单个字符时,提升
replaceAll和replaceRegexpAll的性能 (例如replaceRegexpAll(s, ' ', '_')) 。这类替换不再改变字符串布局,因此现在只需复制一次该列,并在原地重写匹配字节,而不再执行逐次匹配的搜索循环。#108178 (Groene AI) 。 - 使用常量 Polygon 提升
pointInPolygon函数的性能。预处理后的 Polygon 缓存现在以原始常量参数作为键,因此常量 Polygon 只会在发生 cache miss 时解析一次,而不再需要对每个输入块重复解析。#108184 (Groene AI). - 在 best-effort 模式下 (
date_time_input_format = 'best_effort'、cast_string_to_date_time_mode = 'best_effort',也是默认值) ,加快了对规范YYYY-MM-DD hh:mm:ss日期时间格式的解析速度。这恢复了此前将这些默认值从basic切换为best_effort时引入的解析性能回退。#108187 (Groene AI). - 当该功能被禁用时 (
predicate_statistics_sample_rate = 0,默认值) ,避免在MergeTree读取路径上维护system.predicate_statistics_log的选择性计数器。这样移除了每个 granule 上的一次原子更新,以及每次读取中的一个O(rows)过滤器 popcount 操作,从而恢复了在 AArch64 上最明显的性能回退。#108190 (Groene AI). - 在
precise_float_parsing = 1时,加快了从文本解析浮点数的速度,使其在几乎所有输入上的速度都能达到或超过默认解析器。同时将捆绑的fast_floatlibrary 升级到 v8.2.10。#108205 (Raúl Marín). - 在 base64 编码和解码函数中使用
simdutflibrary,以提升性能。#108333 (Konstantin Bogdanov). - 优化高基数且开销较大的 key 上的
DISTINCT。#108366 (Nihal Z. Miaji). - 在非 Linux 构建 (macOS 和 FreeBSD) 中,jemalloc 不再主动清理 dirty pages (即每次
free都执行一次madvise系统调用) ;现在它改为像 Linux 一样,使用带有限dirty_decay_ms的后台清理线程。这显著提升了频繁分配/释放内存的 workloads (例如递归 CTE,在 macOS 上的递归 CTE benchmark 中约提升 2 倍) ,而对 RSS 的影响可以忽略不计。#108430 (Alexey Milovidov). - 对于多次引用同一
WITH别名或重复同一子表达式 (例如深度嵌套的if/multiIf链) 的表达式,在 analyzer 下加快了查询计划的构建速度,方法是在构建 actions DAG 时不再重复构建共享子表达式。#108523 (Dmitry Novik). - 即使
ONclause 同时包含非等值 predicates,现在也会基于等值 key 构建运行时过滤器,从而减少在同时混合等值和非等值条件的 join 中进入 hash join 的行数。LEFT ANTI JOIN不受影响。#108579 (Antonio Álvarez Caballero). - 在整个 codebase 中全局启用
-fno-math-errno,让 compiler 能更好地优化数学函数。#108628 (Nikita Taranov). - 将 aggregation 和 join hash tables 的软件 prefetch 阈值从
4 * L2 cache size降低到L2 cache size,这样一旦 hash table 无法再装入 L2,就会启用 prefetch。这恢复了在报告 L2 较大的平台上 (例如 L2 为 2 MiB 的 AArch64) ,针对中等大小 hash tables (约 1–8 MiB) 的GROUP BY和JOIN性能回退问题。#108655 (Groene AI). - 提升窗口函数性能。对宽表执行包含
SELECT *的窗口查询时,现在内存占用显著降低,运行速度也更快。窗口聚合 (包括quantile*、uniq*和groupArray) 在使用OVER ()和OVER (ORDER BY ... RANGE ...)时性能更佳。cume_dist函数也得到了加速,使用PARTITION BY或ORDER BY的窗口在包含大量重复值的列上现在也有更好的表现。#108688 (Nihal Z. Miaji). - 加快了包含大量或超长比较
AND链的查询的查询分析:optimize_and_compare_chain优化现在受工作预算 (新设置optimize_and_compare_chain_max_hash_work) 约束,而不再对查询树中的很大一部分进行哈希计算;此外,lambda 解析在递归保护中也不再重复计算 lambda 主体的哈希值。#108757 (Alexey Milovidov). - 修复了多线程读取
JSON/Dynamic列时的性能回退问题:对input_format_binary_max_type_complexity设置逐值查找会导致共享查询上下文上的引用计数竞争,从而将并行读取串行化;现在该设置值会按线程缓存。#108797 (Seva Potapov). - 修复了一个性能回退问题 (由 #71781 引入) :通过
s3和其他表函数从对象存储读取大量小文件时,预取会停止工作并退回为同步读取,导致读取大量微小文件时,单线程和低并发场景的速度明显变慢。#108872 (Nikita Fomichev). 现在,当对象存储读取经过文件系统缓存 (filesystem_cache_name) 时,也会发起初始的小对象预取,因此在启用缓存后,读取大量小文件 (例如S3Queue摄取) 不再是同步且受延迟限制的。#109478 (Nikita Fomichev). - 将深度嵌套数组和元组字面量的解析时间从二次时间降低为线性时间。#108892 (Alexey Milovidov).
- 降低了
parallel_hashjoin algorithm 中锁竞争带来的开销。#108938 (Hechem Selmi). - 对
T64编码列的estimateCompressionRatio进行了加速:通过解析计算压缩后大小,而不是实际执行压缩。#109054 (Raufs Dunamalijevs). - 消除了分布式查询计划在 shuffle 步骤中的一个单线程瓶颈:现在每个上游 stream 都会独立地按目标端 bucket 分发行,而不再让整条数据 stream 都汇入单个 transform。#109206 (Alexander Gololobov).
- 降低了 Keeper server 空闲时的 CPU usage。#109255 (Michael Kolupaev).
- 加快了共享数据包含大量稀疏路径的
JSON列的序列化与合并:在将共享数据展平为按路径划分的各列时,移除了针对所有已累积路径列的逐行扫描,并改为批量回填空缺,而不是逐个单元格插入默认值。#109341 (Groene AI). - 降低了具有大量列的 queries 在 expression 求值时的 CPU overhead (例如,对小
stride的QBit列执行 vector search 时,每个向量会展开成数百个 bit-plane sub-columns,并全部传入一次*DistanceTransposed调用) 。#109380 (Alexey Milovidov). - 通过同时计算成对的 sine/余弦,并消除坐标 transform 中冗余的三角函数调用,提升了 H3 Geo functions (
h3ToGeoBoundary、h3ToGeo、h3CellAreaM2/h3CellAreaRads2、geoToH3) 的性能。结果保持不变 (逐比特完全一致) 。#109399 (Alexey Milovidov). - 通过将比较和符号扩展代码改为无分支实现,宽整数类型 (
Int128、UInt128、Int256、UInt256及基于它们的类型,如Decimal128) 的比较 (<、>、<=、>=) 性能最高提升 7 倍;将有符号整数转换为Int256的性能也最高提升 7 倍 (在正负混合数据上) 。#109474 (Manuel). - 优化了
uniqCombined(包括无键 aggregation 的情况) 和uniqHLL12。#109794 (Anton Popov). #109831 (Anton Popov). - 在不带 lambda 调用时,
arraySort和arrayReverseSort对数值数组 (包括Decimal和DateTime64) 的处理速度可提升数倍。#109832 (Manuel). - 通过采用算术快速路径,加速了固定偏移 time zones (如 UTC) 中
DateTime和DateTime64值上的addDays、addWeeks、subtractDays和subtractWeeks。#109836 (Manuel). - 优化了 text index 的分析。#109886 (Anton Popov).
- 在另外两种情况下,并行化了
parallel_hashjoin algorithm 中非 joined rows 的 processing:存在残余 filter 时,以及 join keys 较小时 (单层哈希表) 的情况。#110008 (Hechem Selmi). - 内置 web UI 的响应 (Play UI、dashboards 和静态文件 handlers) 现在会根据 client 的
Accept-Encodingheader 进行压缩,支持 zstd、gzip、deflate、brotli、lz4、xz、snappy 或 bzip2。例如,/play页面可从约 350 KB 的 uncompressed 缩小到使用 zstd 时不足 120 KB,从而减少慢 connections 下的 load time。已压缩的响应不会被修改,并会返回Vary: Accept-Encoding,以确保 CDN 和 cache 分区正确。#110108 (Sayantanu Dey). - 在安全的情况下,可将过滤器下推到窗口函数或
LIMIT BY之下:如果写在其上方的谓词 (子查询外层的WHERE,或QUALIFY中的某个合取条件) 只引用窗口PARTITION BY列,或只引用LIMIT BY的键列 (对于LIMIT n BY且n >= 1并且没有OFFSET) ,现在就能下推到存储层,从而启用主键和分区裁剪、跳过索引以及 projections。例如,SELECT ... row_number() OVER (PARTITION BY key ORDER BY ts) AS rn ... QUALIFY rn = 1 AND key = 'x'现在不再需要读取整张表并对其执行窗口计算。#110114 (Groene AI). #110116 (Groene AI). - 在
join_use_nulls = 1时,如果一个拒绝 null 的WHERE同时引用了外连接两侧的列 (例如WHERE l.k = 42 AND r.k = 42) ,现在会将该 join 转换为INNER(或LEFT/RIGHT) ,并进行主键裁剪,这与join_use_nulls = 0时一致。此前在这种情况下会跳过该转换,并完整读取两张表。#110121 (Groene AI). - 对于只有一个非常量
Nullable参数的函数,现在会让结果复用该参数的 null map,而不是新分配并合并一个。#110151 (Manuel). - 在主键索引分析中,避免了每次超矩形检查都进行一次堆内存分配,使 mark 过滤速度根据查询形态提升 5–26%。#110153 (Manuel).
- 对数值 Array 上的函数
arrayMin和arrayMax,通过使用向量化归约代替逐元素比较循环,将性能提升约 1.3–1.5 倍。#110163 (Manuel). - 对
Deltacodec 的解压进行向量化。现在 8/16/32 位数据类型的解码速度提升了 1.5–5 倍,使Delta压缩列的扫描速度最高提升 20%。#110189 (Manuel). - 加速了在
Enum列上对常量 needle 执行的字符串搜索函数 (like、position、match、countSubstrings、hasToken等) :只搜索不同的枚举名称,再将结果映射回各行,而不是逐行搜索。#110325 (Alexey Milovidov). - 通过向量化批处理加速聚合函数
groupBitOr/groupBitAnd/groupBitXor和方差家族 (varPop、varSamp、stddevPop、stddevSamp、skewPop、skewSamp、kurtPop、kurtSamp、covarPop、covarSamp、corr) :在条件不可预测时结合-If组合器,速度最高可提升 4 倍;不使用该组合器时,方差家族最高可提升 3 倍。#110461 (Manuel). - 加速了 text index 的分析阶段 (即选择读取哪些粒度的阶段) :使用排除式搜索而不是遍历所有粒度,并避免为每次范围检查创建临时位图。#110530 (Anton Popov).
- 在自动
PREWHERE优化中将Map子列的 on-disk 大小纳入考量。这修复了 #99200 引入的PREWHERE性能回退问题。属于 #110462 的一部分。#110623 (Pavel Kruglov). - 加快从文本中解析
UUID值的速度 (例如将JSONExtract解析为LowCardinality(UUID)、toUUID、CAST AS UUID) ,方法是通过单次遍历同时完成十六进制数字的校验与转换,而非分两次进行。#110625 (Groene AI). - 通过采用更快的 sorting 和 hash table 实现,显著提升了
timeSeries*ToGridaggregate functions 的性能。#110875 (Nikita Mikhaylov). - 现在,像
SELECT * FROM t WHERE id这样的查询会在id列上使用索引 skipping。关闭 #89222。#89603 (Aditya Chopra). - 新增
query_plan_merge_expression_into_join设置 (默认启用) ,允许在 join 重排序优化期间将 expression step 合并到JOINstep 中。这使得对包裹 join 的 subquery 也能进行 join 重排序 (例如,当某个JOIN位于带有计算列的 subquery 中时) ,从而更好地优化复杂的 join tree。#98533 (Vladimir Cherkasov). - 优化同一 expression 上包含多个比较条件的
AND链:可检测矛盾条件 (例如a < 3 AND a > 5→false) ,并裁剪冗余条件 (例如a = 3 AND a < 5→a = 3) 。#99736 (Xiaozhe Yu). - 被
UNION查询多个分支引用的 Materialized CTEs 现在只会 materialized 一次,并在所有分支间共享。此前,每个分支都会获得各自独立的 CTE 副本,这些副本会被内联并分别求值。#102107 (Dmitry Novik). BackgroundSchedulePool中的线程现在会按需惰性创建,而不是在 server 启动时一次性全部创建。新增 server settingbackground_schedule_pool_initial_size(默认值为16) 用于控制预先生成多少个工作线程;需要时,该 pool 会扩展到background_schedule_pool_size。这减少了轻负载 server 上的 idle threads 数量。关闭 #85265。#105066 (Alexey Milovidov).- 对
JSON类型的高级 shared data serialization,跳过不必要的 标记文件 加载。#107051 (Pavel Kruglov). - 函数
pointInPolygon的预处理常量多边形缓存现在可在查询和线程之间共享,并受新的服务器设置point_in_polygon_cache_size限制 (默认 256 MiB,0表示禁用缓存,可在运行时更改) 。此前,缓存会为每个预处理后的多边形最多保留max_threads份副本,在不同多边形之间无限增长,并且直到服务器重启前都不会释放。可使用SYSTEM DROP POINT IN POLYGON CACHE清空该缓存,当前使用情况会在system.metrics中显示为PointInPolygonCacheBytes、PointInPolygonCacheCells和PointInPolygonCacheSizeLimit。关闭了 #106393。#107247 (Nihal Z. Miaji) 。 - Keeper 在将快照序列化并写入磁盘,或在磁盘之间移动快照时,不再持有其内部快照锁,因此向其他节点传输快照以及 Raft 处理不再因本地创建快照而被阻塞。#107595 (Antonio Andelic) 。
- 将文件系统缓存的后台淘汰并行化 (由
keep_free_space_ratio设置控制) 。新增设置keep_free_space_eviction_threads用于控制并行度,并将keep_free_space_remove_batch的默认值从100提高到250。#108147 (Kseniia Sumarokova) 。 - 将 Azure Blob 存储中先读后写复制可并发暂存的 parts 数量限制为
max_inflight_parts_for_one_file(当原生复制不可用时,backups 会使用这种方式) ,以防止并行复制大量大文件时内存占用过高。#108232 (Smita Kulkarni) 。 - 现已在全局范围内启用全部三种文本索引缓存——此前它们仅在查询内部启用。此外,倒排列表缓存大小现已设为零,这实际上又将其禁用了,因为倒排列表体积较大,缓存成本过高。#108274 (Robert Schulze) 。
- 在加载标记时新增对内存中标记的流式压缩,以减少峰值内存占用。关闭了 #108285。#108325 (Pavel Kruglov) 。
- 新的文件系统缓存设置
reserve_granularity(默认 4 MiB) 会按更粗的粒度提前预留空间,从而减少文件系统缓存空间预留热点路径上的锁竞争。#108369 (Kseniia Sumarokova) 。 - 减少文件系统缓存元数据 (每个 File 段 以及每个键) 的内存占用。#108477 (Kseniia Sumarokova) 。
- 现在,对
system.iceberg_history发起且在database和table列上带有WHERE过滤条件的查询,只会访问匹配的数据库;如果服务器上有许多不相关的远程数据库,这可以节省时间。#108492 (Den Kalantaevskii) 。 - 移除了文件系统缓存中不必要的锁操作,以减少锁竞争。#108932 (Kseniia Sumarokova) 。
- 降低了
BACKUP和RESTORE元数据处理的内存占用。现在,打开备份 (用于RESTORE,或作为增量BACKUP的基础) 时,会以流式方式解析.backup元数据,而不是将其加载到内存中的 XML 文档树中,因此对于大型备份 (尤其是增量备份) ,可避免分配数 GB 的 DOM 树。#109107 (Julia Kartseva) 。完成BACKUP时,也不再将所有文件的文件信息复制到临时 vector 中,这对于包含数百万文件的备份来说,此前会瞬时消耗数 GB 内存。#109861 (Julia Kartseva) 。写入备份条目时,也不再复制当前主机的文件信息列表。#111162 (Julia Kartseva) 。 - 降低了聚合器的内存消耗。#109224 (Konstantin Vedernikov) 。
- 现已支持通过
File表引擎读取的本地Parquet文件使用查询条件缓存 (此前仅支持对象存储和数据湖) 。#109247 (Alexey Milovidov) 。 - 文本索引头部缓存的内存占用降低了 2~2.5 倍。更多数据分区片段的头部可装入缓存 (设置
text_index_header_cache_size) ,从而减少文本搜索查询的磁盘读取。#109332 (Anton Popov) 。 - 转置向量距离函数
L2DistanceTransposed、cosineDistanceTransposed和dotProductTransposed现在会将部分位平面读取优化应用于Nullable(QBit)列,只读取所需的位平面,而不是整列。#109358 (Alexey Milovidov) 。 IS NOT DISTINCT FROM和IS TRUE现在会像=一样使用主键和 MinMax 索引来裁剪粒度。此前,k IS NOT DISTINCT FROM 42和(k = 42) IS TRUE会扫描所有粒度。#110006 (Groene AI) 。- 池化连接在每次使用前不再执行 ping。这去掉了此前附加到每个复用连接上的一次
Ping-Pong往返,从而降低了分布式查询以及clickhouse-benchmark的延迟。失效的池化连接会通过零超时的 poll (这是一种不会增加往返的非阻塞检查) 来检测,并通过重新连接恢复。#110068 (Alexey Milovidov) 。 - 修复了通过 TLS (HTTPS、S3) 的 HTTP keep-alive 池化连接发生误重连的问题。此前,失效连接检查在套接字上使用
poll,会将携带未读 TLS post-handshake 记录 (会话票据或KeyUpdate) 的活动安全连接误报为已关闭;现在,对普通套接字使用非阻塞MSG_PEEK,对 TLS 套接字使用SSL_peek/SSL_has_pending,这也能正确检测有序的 TLS 关闭,以及仅部分到达的 TLS 记录。#110402 (Alexey Milovidov) 。 - 由 TopK dynamic filtering (
ORDER BY ... LIMIT k) 加速的查询现在会更充分地利用查询条件缓存:即使对查询应用了 lazy materialization,也会填充该缓存;此外,这类查询还可以复用此前由具有相同WHERE谓词的普通查询写入的条目。#110507 (Shankar Iyer) 。 - 不带通配符 (
%、_) 的LIKE/NOT LIKE模式现在会使用精确的主键范围,因此读取的粒度数与等效的=/!=谓词相同,不再读取更宽的前缀范围。#107077 (Groene AI). - 修复了通过文件系统缓存读取数据时多余的 File 段锁竞争问题 (这是 26.1 中引入的一项性能回退) 。#109577 (Kseniia Sumarokova).
- 修复了定义在
Tuple子列上的跳过索引在通过tupleElement(t, 'name')、tupleElement(t, N)或t.N访问字段时未被使用的问题;如果同一查询中还会读取完整的 tuple (例如SELECT *) ,此前这些索引不会生效。现在,这些形式都会像具名子列访问t.name一样裁剪粒度。#110056 (Groene AI). - 修复了
Distributed表上缓慢的ORDER BY ... LIMIT查询:当prefer_localhost_replica选择本地副本时,本地分片执行计划中的预 LIMIT 已被移除,从而避免阻碍惰性物化和动态 top-K 过滤。#110136 (Michael Jarrett). - 修复了当索引定义在表达式而非裸列上时,
ILIKE运算符未使用文本索引的问题 (例如带有lower(...)预处理器的assumeNotNull(col)) :此前这类查询会读取所有粒度,而不是使用索引。此修复关闭了 #110350。#110595 (Elmi Ahmadov). - 减少了文件系统缓存中的锁竞争:从缓存读取的查询在更新条目的 LRU priority 时,不再阻塞于优先队列锁。#109065 (Antonio Andelic).
- 使用仅用于过滤的
postprocessor表达式 (例如if(..., '', token)) 的文本索引查询,现在会预先丢弃空标记,而不是逐行将其物化,从而提升性能。#109049 (Elmi Ahmadov). - 减少了系统日志队列中的锁竞争,降低了繁忙集群中的查询尾延迟。#110539 (Sean Haynes).
- 对于 needle 非常量的子字符串搜索函数 (
position、countSubstrings、multiSearch*、replaceAll、replaceOne及其不区分大小写和 UTF-8 变体) ,通过在逐行执行路径上使用 SIMD 加速的字符串搜索器替代朴素实现,性能最高提升了 1.5 倍。#110580 (Raúl Marín). - 惰性物化现在也会应用于带有
FINAL、过滤器和较小LIMIT的ReplacingMergeTree查询,即使没有ORDER BY也是如此。过滤器和FINALmerge 不需要的列,只会为 LIMIT 之后仍保留的行读取;因此,当这类查询选择宽列且过滤器选择性较高时,速度会快得多。由query_plan_optimize_lazy_materialization和query_plan_max_limit_for_lazy_materialization控制。#110722 (Nikolai Kochetov). - 改进了在启用 deduplication 且一次 flush 被拆分到多个分区时的 async insert 性能:ClickHouse 现在会跨分区复用已计算的 deduplication 哈希,而不是为每个分区重新计算。#111150 (Valery Petrov).
改进
- 新增设置
input_format_csv_missing_nullable_as_empty_string(默认禁用) 。启用后,CSV 输入中Nullable(String)列的缺失值会被读取为空String,而不是NULL,且不受input_format_csv_empty_as_default的影响。#58225 (kevinyhzou). #107577 (Alexey Milovidov). toDateOrNull、toDateTimeOrNull和toDateTime64OrNull函数现在接受所有原生整数类型的整数参数 (解释方式与toDate、toDateTime和toDateTime64相同,并且可选传入 timezone 参数) ,如果值超出结果类型的取值范围,则返回NULL。例如,toDateTimeOrNull(1583851242, 'Asia/Shanghai')返回2020-03-10 22:40:42,而toDateTimeOrNull(4294967296)返回NULL。#79791 (Jitendra).- 在
system.grants表中新增is_wildcard列,用于指示某项授权是否使用通配符前缀匹配 (例如GRANT SELECT ON db*.*) 。此前,在system.grants中无法区分同名的通配符授权和精确匹配授权。关闭了 #92835。#98577 (DQ). - HTTP interface 现已支持 Snappy 压缩 (
Accept-Encoding: snappy) ,并新增snappy_mode设置,用于在通用file/urlSnappy I/O 中选择 Hadoop Snappy block format 或 Snappy framing format。#100752 (Alexey Milovidov). - 通过
analyzer_compatibility_allow_non_aggregate_in_having设置支持与旧版 analyzer 兼容。启用后,非聚合连接条件会从HAVING移动到WHERE。#104232 (Dmitry Novik). - 新增 server setting
memory_worker_rss_speculative_reserve_ratio(默认值为1.0) :当 RSS 在两次采样之间的增长快于全局 memory tracker 的记录速度时,它会让全局 memory tracker 在观测到的 RSS 之上额外进行推测性内存预留。这样一来,allocation 会更早触发MEMORY_LIMIT_EXCEEDED,而内核 OOM-killer 抢先触发的可能性会更低。将该比率设为0可禁用此推测机制。#104976 (Alexey Milovidov). - 新增可选启用的 Prometheus 指标,用于反映文件系统缓存淘汰活动 (
filesystem_cache_evictions_total、filesystem_cache_evicted_bytes_total、filesystem_cache_evicted_segment_hits、filesystem_cache_evicted_segment_size_bytes,以及带有user_id标签的按用户划分变体) 。这些指标会按缓存通过system.dimensional_metrics、system.histogram_metrics和 Prometheus endpoint 暴露。它们由缓存磁盘 config 设置expose_prometheus_eviction_metrics和expose_prometheus_eviction_metrics_per_user控制 (默认均关闭) ,并可通过SYSTEM RELOAD CONFIG在运行时切换。#105020 (Sacheendra Talluri). - 将
EXPLAIN [PLAN] actions=1, compact=1, pretty=1设为默认值。#105036 (Kirill Kopnev). - 将
delta-kernel-rs(DeltaLakeintegration 背后的库) 升级到 v0.23.0。#105861 (Smita Kulkarni). - 向
clickhouse-disks添加了du和wc命令。它们分别用于输出给定文件或目录的总字节大小,以及列出文件的字节数、行数和单词数。#106268 (Asya Shneerson). - 新增了一个异步指标
UntrackedMemory(可在system.asynchronous_metrics中查看) ,用于报告已由线程分配但尚未计入全局内存跟踪计数器的内存:每个线程会先在本地累积小额分配,再批量上报。这有助于解释MemoryTracking与进程实际内存使用量之间的差异。MEMORY_LIMIT_EXCEEDED错误消息现在也会包含未跟踪内存的数量,从而更容易理解查询或 server 为何触及其内存限制。#106386 (Miсhael Stetsyuk). - 将 ClickStack (可观测性 UI) 升级到 2.28.0 版本。#106406 (Aaron Knudtson).
- 在
dotProduct中新增了对BFloat16的支持,并通过对 SIMD 路径进行批处理提升了其性能。#106569 (Nikita Taranov). - 使设置
max_named_collection_num_to_throw、max_table_num_to_throw、max_replicated_table_num_to_throw、max_view_num_to_throw、max_dictionary_num_to_throw和max_database_num_to_throw无需重启 server 即可修改。#106821 (Maxim Orlovsky). s3_storage_class_name设置现已支持REDUCED_REDUNDANCY、STANDARD_IA、ONEZONE_IA、GLACIER_IR和EXPRESS_ONEZONE这些值 (除STANDARD和INTELLIGENT_TIERING之外) 。#107251 (Aditya Kumar).- 为
MaterializedPostgreSQLdatabase engine 新增了创建时设置materialized_postgresql_use_extended_date_and_time_types。默认情况下 (启用时) ,PostgreSQL 的date/timestamp列会被推断为Date32/DateTime64;如果在CREATE DATABASE时将其设为0,则会推断为更窄的Date/DateTime类型。该设置不适用于MaterializedPostgreSQLtable engine。#107428 (Alexey Milovidov). SOME/ALLArray 量词 (expr OP SOME(array)/expr OP ALL(array)) 现在还支持关键字比较 predicateIS DISTINCT FROM和IS NOT DISTINCT FROM,以及字符串搜索 predicateLIKE、ILIKE、NOT LIKE、NOT ILIKE和REGEXP,并会重写为arrayExists/arrayAll。#107454 (Alexey Milovidov).- 修复了在打开 SQLite database 失败时发生的内存泄漏 (例如,当为
sqlitetable function 或SQLitedatabase engine 提供了无法打开的 path 时) 。#107807 (Alexey Milovidov). - 在 Web UI (
play.html) 中,运行快捷键提示现在会在 Mac 上显示Cmd+Enter,在其他平台上显示Ctrl+Enter,不再始终显示Ctrl/Cmd+Enter;并且提示中的, +Shift to run all仅在存在多个查询时才会显示。#107817 (Alexey Milovidov). #108957 (Alexey Milovidov). Alias表引擎现在支持在目标表属于MergeTree家族时通过并行副本进行读取。#107830 (Kai Zhu).- 新增
uniq_v2列统计信息类型——这是基于uniqCombined64sketch 的uniq统计信息轻量级替代方案。#107863 (Han Fei).minmax列统计信息类型已弃用,并将auto_statistics_types的默认值改为basic, uniq_v2。#108680 (Han Fei). - AI 函数 (
aiGenerate,aiEmbed,aiClassify,aiExtract,aiTranslate) 现在会在设置了ai_function_max_retries时,对瞬时网络故障 (连接重置、TLS 连接失败、超时、地址不可达) 进行重试,与urltable function 的重试行为一致。此前,只有提供商侧返回的 HTTP 错误响应会被重试。#107927 (Alexey Milovidov). - 向
MergeTree表执行INSERT时,现在在写入大量数据分片期间也会遵循查询取消和max_execution_time,而不是在被终止后仍可能继续运行很长时间。#107929 (Michael Kolupaev). - 在 Web UI (
play.html) 中,现在可以通过鼠标中键点击或 Ctrl/Cmd/Shift+点击,在新的浏览器选项卡中打开 Web 终端。#108006 (Alexey Milovidov). - 客户端中的 AI SQL 生成现在只有在通过配置中的
ai.temperature显式设置时才会发送temperature参数。这修复了会拒绝temperature参数的模型上的 AI SQL 生成功能。#108014 (Alexey Milovidov). - 在开源构建中新增了
system.masking_policies表以及SHOW MASKING POLICIES内部信息查询支持。脱敏策略本身仍然是 ClickHouse Cloud 功能,因此该表在开源构建中为空,但内部信息查询不再因报错而失败。#108030 (Alexey Milovidov). - 基于 Keeper 的 Kafka 消费者现在会在副本之间随机化获取临时分区锁的顺序,从而提升分区分布的公平性并减少锁竞争。此前,预期中的乱序实际上并未生效。#108033 (Alexey Milovidov).
- 为 Web UI (
play.html) 新增了自动补全功能,基于system.completions和 WASM SQL 词法分析器。#108059 (Alexey Milovidov). - 当光标位于输入末尾时,
clickhouse-client和clickhouse-local现在会显示即输即补全提示 (内联“幽灵”文本) ,给出最佳匹配建议。最相关的建议 (最近使用过的以及查询中已存在的标识符) 会排在最前面。使用 Up/Down (或 Ctrl-Up/Ctrl-Down) 导航;使用 Tab 或 Right 接受单个提示或当前选中的提示,使用 Enter 接受当前选中的提示;Tab 也会打开经典补全列表。由新的--hints选项控制 (默认开启;需要--highlight) 。#108070 (Alexey Milovidov). - 为
QBit数据类型支持length函数——它会将向量的维度作为常量返回。#108071 (Alexey Milovidov). 支持从QBit到Array的CAST,可重建原始向量——这是现有从Array到QBit转换的逆过程。#108072 (Alexey Milovidov). - 发送到 REST 数据湖目录 (例如 OneLake) 的请求现在会包含 ClickHouse
User-Agent标头。#108117 (Konstantin Vedernikov). arrayFold现在会响应查询取消和max_execution_time。此前,对超长数组执行 fold 时会完全在一次函数调用内运行,无法被中断,因此在 fold 完成之前会忽略KILL QUERY和时间限制。#108192 (Groene AI).MVTEncodeGeom现在会在裁剪前将几何对象吸附到整数像素网格上,并使用wagyu库裁剪多边形,因此裁剪后的输出是有效的 (会修复自相交环) 且与边界对齐,与 PostGISST_AsMVTGeom保持一致。#108248 (Saarthak Gupta).- 新增按阶段统计的查询执行前
ProfileEvents:QueryParseMicroseconds、QueryAnalysisMicroseconds、QueryPlanBuildMicroseconds和QueryPipelineBuildMicroseconds。它们可显示查询执行前的时间花在何处 (解析、分析、查询计划构建、管道构建) ,并可在system.query_log和system.events中查看。#108282 (Jordi Villar). - 现在会预先拒绝那些会导致表元数据超过
max_query_size的ALTER TABLE操作,从而防止表因 DDL 分发和副本恢复等组件而变得无法加载。#108283 (Andrew Kravchuk). - 在
system.backups和system.backup_log中新增了settings和engine_settings列。settings会显示某次操作请求的 backup/restore 专用设置 (例如allow_s3_native_copy、deduplicate_files、structure_only) ,而engine_settings会显示 backup 引擎的 reader 和 writer 实际使用的设置 (例如allow_native_copy这类 S3 请求设置;在合并端点配置后,它们可能与请求时的设置不同) 。这样就可以查看某个BACKUP/RESTORE操作实际是以哪些设置运行的。#108334 (Julia Kartseva). - 在
system.documentation中新增了一个source列,用于记录定义各实体文档的源文件路径。该表现在还包含压缩编解码器、profile events、当前指标、异步指标以及系统表本身 (及其列) 的文档;设置文档现在也包含其类型和默认值。#108346 (Alexey Milovidov) 。空的设置默认值现在会渲染为 空字符串,而不是空的反引号。#108708 (Alexey Milovidov) 。 - 通过在
kqueue之上实现基于 epoll 的轮询原语,现已支持在 macOS 上从远程副本异步读取 (async_socket_for_remote) 。这使分布式查询在 macOS 上可以并行读取分片,而不再是串行读取。#108403 (Raúl Marín) 。 - 二元数学函数现已支持
BFloat16。#108442 (Zhang Yifan) 。 MergeTree现在可以读取块使用不同编解码器的压缩流。这是实现自适应编解码器选择所需的读取侧前置条件 (#105404) 。#108592 (Raufs Dunamalijevs) 。max_threads及类似设置的自动值现在会在system.settings中显示为auto(8),而不是'auto(8)';外围的单引号是长期以来固化在该值中的历史遗留制品。跨版本兼容性仍然保留:在解析从旧服务器收到的设置时,依然接受旧版带引号的形式。#108657 (Alexey Milovidov) 。/schemaWeb UI 进行了多项易用性修复:按 Enter 加载 schema、滚动条适配主题、表名更易读、独立表按数据库分组时保持一致、拖动时不再选中文本,以及提供play风格的身份验证表单 (Credential Management API、通过 URL 提供凭据并去除密码,以及实时凭据校验) 。#108724 (Alexey Milovidov) 。- 文本索引的 lazy posting-list 应用模式不再属于 Experimental,现在无需
allow_experimental_text_index_lazy_apply,即可通过text_index_posting_list_apply_mode = 'lazy'选择该模式。密度阈值设置已从text_index_density_threshold更名为text_index_lazy_intersection_density_threshold。#108814 (Anton Popov) 。 - 为
DataLakeCatalog新增了delta_sharingcatalog 类型,用于 Databricks Delta Sharing 的 Iceberg REST 端点;这类端点的命名空间是扁平的,并且会忽略parent列表过滤器。对于这类端点,应使用它代替catalog_type = 'rest',否则SHOW TABLES可能会卡住。#108865 (Seva Potapov) 。 - 为
clickhouse-client/clickhouse-local新增了--echo-query-separator选项,可在格式化后的回显查询前输出自定义分隔符,从而更容易区分手动输入的查询和重新格式化后的回显。默认禁用。#108888 (David Meng) 。 - 改进了 Web UI 的数据库面板:数据库展开时,其名称旁的括号中会显示表数量。#108891 (Alexey Milovidov)。展开后的数据库旁新增了刷新按钮,可重新加载其表列表。#108958 (Alexey Milovidov)。重新打开该面板时,此前展开的数据库会恢复展开状态。#108964 (Alexey Milovidov)。
- 现在允许在
EXPLAIN WHATIF中计算组合跳过索引的收益:它会显示所有现有且适用的假设索引交集对应的数据比例。#108934 (Yarik Briukhovetskyi)。 - 修复了 Web UI 中结果表的水平滚动位置在点击单元格中的链接并返回页面后被重置的问题。#108941 (Alexey Milovidov)。
MySQLdatabase engine、table engine 和 table function 现在会将 MySQL 的空间列类型 (LINESTRING、POLYGON、MULTILINESTRING、MULTIPOLYGON以及通用的GEOMETRY) 映射为对应的 ClickHouse 几何类型,而不是String。此行为由mysql_datatypes_support_level设置中新增加的geometry标志控制,且默认启用。POINT仍始终转换为Point。通用GEOMETRY列会映射到统括性的Geometry类型;如果读取的值其子类型在 ClickHouse 中没有对应类型 (MULTIPOINT、GEOMETRYCOLLECTION) ,则会在读取时抛出异常。#108944 (Alexey Milovidov)。- Web UI (
play.html):完整的键盘导航——支持在数据库面板和结果表中使用方向键导航,可通过键盘访问工具栏按钮、主题切换器和下载菜单,并提供可见的焦点轮廓。#108972 (Alexey Milovidov)。 - HTTP 接口:当同时通过 URL parameters (
user/password) 和Authorization请求头提供凭据时,现在 URL parameters 具有更高优先次序,而不是直接拒绝请求。这修复了当浏览器记住 Basic 凭据时,从 Web UI (play.html) 下载结果会因AUTHENTICATION_FAILED(错误 516) 而失败的问题。#108980 (Alexey Milovidov)。 - 恢复
show_data_lake_catalogs_in_system_tables,作为仅控制DataLakeCatalog在system.tables、system.columns和system.completions中可见性的设置。新增show_remote_databases_in_system_tables,默认启用,使用户可以单独隐藏这些系统表中的MySQL和PostgreSQL数据库。#109082 (Pablo Marcos)。 - 默认使用精确的 (最接近可表示值的) 浮点解析算法,并将
precise_float_parsing设置应用于输入格式 (CSV、TSV、JSON、VALUES、…) 和数字字面量,而不仅仅是toFloat*/CAST。如需恢复之前的行为——在某些情况下更快但精度较低——请设置precise_float_parsing = 0。关闭 #60146。关闭 #74647。关闭 #68914。#109086 (Raúl Marín)。 - 现在,只有单个 CTE 的查询也会采用与多个 CTE 查询相同的换行和缩进格式。此前,
WITH a AS (...)会将 CTE 保留在与WITH同一行,而当有两个或更多 CTE 时,WITH会单独占一行,且每个 CTE 都会缩进显示。#109092 (Groene AI). - Web UI:当高亮的补全项与已输入的单词相同,或只是同一个单词但大小写不同 (例如,已输入
hash时提示HASH) ,按下 Right/Tab/Enter 不会再重写该单词,也不会被自动补全吞掉——按键会如预期那样移动光标或插入换行。#109106 (Alexey Milovidov). #109384 (Alexey Milovidov). - 为 Web UI (
play.html) 添加了彩虹括号、配对括号、匹配标识符和数字分组高亮,与clickhouse-client保持一致。#109108 (Alexey Milovidov). - 在 Web UI 中,
Tab和Shift+Tab现在会将选中的行缩进或取消缩进 4 个空格。#109110 (Alexey Milovidov). - Web UI:在查询编辑器中,用红色背景高亮显示语法错误的位置。用户一旦将焦点切回编辑器,该高亮就会立即清除。#109112 (Alexey Milovidov).
clickhouse-compressor --stat以及对旧 parts 的默认 codec 检测,现在会将损坏的块头报告为损坏,而不再误报为具有误导性的文件结束错误。#109157 (Raufs Dunamalijevs).- ClickHouse Keeper 现在会遵循
os_collect_psi_metrics设置,并在其被禁用时跳过 PSI 指标采集。#109179 (Maxim Orlovsky). - 在 Web UI 中,当显示查询选项卡时,连接参数 (host、user、password) 现在会隐藏在右上角的钥匙按钮中,并在需要时通过下拉菜单显示。#109243 (Alexey Milovidov).
- Web UI:单值结果 (1 行 1 列,例如
SHOW CREATE TABLE) 现在会以完整高度显示,而不再被限制为三行。#109245 (Alexey Milovidov). - 在 Web UI 中,使用鼠标中键、按住 Shift,或使用平台的新建选项卡修饰键 (macOS 上为 Cmd,其他平台上为 Ctrl) 点击 databases 面板中的某个表时,现在会在新的 Web UI 选项卡中打开其查询。#109246 (Alexey Milovidov).
- 对远程 (object storage)
Parquet文件的查询条件缓存,现在除了 path 之外还会按 ETag 建键,从而避免对象被原地覆盖后仍返回过期的缓存结果。#109310 (Alexey Milovidov). - 在 Web UI 中,空字符串和 NULL 在 categorical 着色模式下不再着色。#109342 (Alexey Milovidov).
- Web UI:现在点击数据库面板中某个表的图标,会显示该表的列列表,包括类型图标、按压缩后大小按比例显示的大小条,以及显示压缩后大小/未压缩大小和压缩率的工具提示。#109346 (Alexey Milovidov).
- Web UI:当选项卡标题被截断时,现在将鼠标悬停其上会通过工具提示显示完整标题。#109354 (Alexey Milovidov).
- 在 Web UI 中,现在中键单击选项卡标题 (或按住 Ctrl/Shift/Cmd 并单击) 会复制该选项卡。#109357 (Alexey Milovidov).
- Web UI:统一调整最终进度和查询统计区域的尺寸,以避免在浏览器窗口较窄时出现不自然的换行。#109363 (Alexey Milovidov).
- Web UI:现在在数据库面板中选择某个数据库后,会将其用作从编辑器运行查询时的默认数据库。#109372 (Alexey Milovidov).
- 支持将由固定大小元素组成的
Array重新解释为String,这与现有将String/FixedString重新解释为Array的功能互为逆操作。#109383 (Alexey Milovidov). - 在 Web UI 中,当结果最多只有一行时,不再显示按列着色的切换控件。#109385 (Alexey Milovidov).
- 允许在 element type 和/或 stride 不同的
QBit类型之间进行CAST,只要 dimension 保持不变 (例如从QBit(Float32, N)执行CAST(x AS QBit(Float64, N))) 。仅 stride 的变化是无损的;element type 的变化遵循相应的Array转换语义 (例如Float32到BFloat16可能会损失精度,而accurateCast/accurateCastOrNull会拒绝无法精确表示的行) 。#109387 (Alexey Milovidov). - 函数
quantizeBFloat16ToInt8和dequantizeInt8ToBFloat16现在也接受Array和QBit参数,会将 Lloyd-Max codec 应用于整个向量 (返回对应 element type 的Array/QBit) ,此外仍保留现有的 scalar 重载。#109398 (Alexey Milovidov). - Web UI:Documentation 链接现在会在 URL 中携带当前用户名。#109419 (Alexey Milovidov).
- 支持对
BFloat16数组使用arraySum、arrayAvg和arrayProduct。#109420 (Alexey Milovidov). parseDateTime/parseDateTime64(及其OrZero/OrNull变体) 中的 MySQL 风格 format 指定符%f现在接受 1 到 6 位 fractional digits,并像 MySQL 的STR_TO_DATE一样将其解释为左对齐的微秒,不再要求必须正好为 6 位。同时还修复了内置函数文档示例中PrettyCompact表对齐错位的问题。#109421 (Alexey Milovidov).- Web UI:查询选项卡现在会持久保留——切换到别处再切回时,每个选项卡都会保留其已渲染的结果 (包括图像和图表) 以及正在运行的查询,长时间运行的查询也会继续在后台执行。选项卡标题会显示对应查询的旋转指示器、进度条和完成勾选标记。#109425 (Alexey Milovidov).
- Web UI:现在,当查询在部分结果已经流式传输后失败时,会正确显示错误,而不是显示客户端侧的
SyntaxError: Unexpected end of JSON input(或者在启用http_write_exception_in_output_format时,将失败的查询标记为成功) 。#109430 (Alexey Milovidov). - Web UI 新增 pinned columns:现在可以从列标题固定某一列,这样在水平滚动结果表时,该列仍会保持可见 (固定在边缘) 。#109439 (Alexey Milovidov).
- 在高级仪表板 (
/dashboard) 中,现在可以直接通过指标名称添加特定指标的图表,该名称与其在源代码或文档中的名称一致,这让在调试会话中添加多个指标更加方便。#109449 (Mikhail Artemenko). - Web UI:修复了在连接设置下拉菜单中用鼠标选择文本并拖动到边框之外时,下拉菜单会关闭的问题。#109451 (Alexey Milovidov).
- Web UI:现在将鼠标悬停在结果表列标题上时,会以工具提示显示完整的列名和类型,因此被截断的标题也能查看完整内容。#109463 (Alexey Milovidov). 修复了即使列足够宽、能够显示完整标题时,列标题仍被省略号截断的问题。#110397 (Alexey Milovidov).
- 在 macOS 构建中支持 SSD cache 字典 (
SSD_CACHE布局) 和FileLog表引擎。#109493 (Raúl Marín). - Web UI:打开页面时,不再恢复查询为空的选项卡。#109529 (Alexey Milovidov).
- 修复了在
TERM不包含256的终端 (例如 Ghostty、kitty、Alacritty、foot) 中,交互式 client 里输入时显示的自动补全提示难以辨认以及颜色过亮的问题:现在会无条件输出 aixterm 亮色代码,而不再回退为粗体 + 深色;后者在现代终端中会在深色背景上渲染成较暗、难以辨认的颜色。#109622 (Alasdair Brown). - 在 macOS 构建中启用 jemalloc 的每 CPU arenas 和 allocation profiling。#109684 (Raúl Marín).
- 允许使用
ALTER DATABASE ... MODIFY SETTING修改OneLake数据湖目录数据库的某些身份验证设置。#110019 (alesapin). Hiveengine 现在使用 ClickHouse 原生ORCreader 读取ORC文件元数据 (min/max indexes、row counts) ,而不再使用 Apache ArrowORCadapter。#110086 (Alexey Milovidov).- 通过将罕用混合类型对 (
Decimal与不同位宽整数,以及涉及Int128/UInt128/Int256/UInt256的组合) 的比较和算术操作改为先转换到公共类型上执行,而不是为每一种类型组合都提供专用的编译内核,二进制文件大小减少了约 10.5 MB。相同类型对、常用类型对,以及受内存带宽限制的plus/minus/multiply仍保留专用内核;结果、结果类型和异常情况均保持不变。#110131 (Alexey Milovidov). - 现在,如果
IN右侧的子查询只有一列,且该列是一个比左侧参数多一层维度的数组,那么它会被解释为由该数组元素构成的集合 (类似数组字面量或返回数组的函数) ,而不再因令人困惑的类型不匹配错误而失败。例如,x IN (SELECT groupArray(x) FROM ...)现在可以正常工作。#110169 (Alexey Milovidov). - 当 SQLite 数据库被其他连接锁定时,从
SQLite表引擎或sqlitetable function 读取将不再让一个完整的 CPU 核心忙等空转。现在,读取会在等待锁时进入空闲状态,并且仍可取消。#110248 (Groene AI). - 将日志和异常消息中的已用时间、速率和比率值统一四舍五入到三位数字,因此像
1.345844286 sec.这样的数字将不再以完整精度输出。#110277 (Alexey Milovidov). - 在 Web UI (Play) 中,
BFloat16现在会被识别为浮点数,相应列也会按浮点数方式右对齐并着色。#110433 (Alexey Milovidov). PostgreSQL表引擎和postgresqltable function 现已支持SETTINGS子句 (例如SETTINGS postgresql_connection_pool_size = 50) ,从而与MySQLengine 达成功能对齐。#110614 (Alexey Milovidov).SHOW CREATE TABLE(以及SHOW CREATE VIEW/SHOW CREATE DICTIONARY) 现在会在请求的表不存在时,像SELECT查询一样,在错误消息中提示一个名称相近的表。#110633 (Alexey Milovidov).- 默认启用
merge_selector_enable_heuristic_to_lower_max_parts_to_merge_at_oncesetting:合并选择器现在会根据分区的填充程度,自动降低单次可合并的最大 parts 数量。参见 #91163。#110726 (Mikhail Artemenko). - 在 PostgreSQL 线协议中,PostgreSQL 清理命令
RESET、UNLISTEN和DISCARD现在会作为空操作接受,而不再因语法错误而失败。这提升了与 Skunk 等驱动的兼容性,因为这些驱动会在连接建立和清理期间发送RESET ALL和UNLISTEN *。#110780 (Alexey Milovidov). - 将
auto_statistics_typessetting 的默认值从basic, uniq改为basic, uniq_v2。#110878 (Han Fei). randomHadamardTransform现在可对任意向量长度计算精确且保持原长度的变换,只要其最大奇因子不超过 64 (例如3584 = 512 * 7,这在 embedding 模型中很常见) ,将此前仅支持的2^N、2^k * {12, 20}和2^k * 9这几类长度扩展到了更多情况。现在,对于无法精确表示的长度,执行完整变换会抛出异常,而不再静默通过零填充扩展为更长的向量;可传入output_dims来计算任意长度的截断投影。#111006 (Alexey Milovidov).- 修复了在并发删除并重建
Replicateddatabase 时,对其执行 backup 过程中出现的LOGICAL_ERROR异常;这类 backup 现在会明确失败,并返回CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT。#100651 (Alexey Milovidov). - 现在,当 zip archive 无法解包时,会显示实际的底层 error (例如 archive 从 S3 读取,而读取缓冲区拒绝 seek 时) 。此前,实际 error 会被通用消息
Couldn't unpack zip archive: Code = -100/Couldn't open zip archive掩盖。#105103 (Groene AI). - 修复了 server 重启后 (或执行
DETACH DATABASE/ATTACH DATABASE后) 一个令人困惑的 “Maybe you meant X?” 提示:drop 一个已经被 drop 的表时,可能会把刚被 drop 的名称建议为备选项。#106238 (Groene AI). - 修复了后台表 drop queue 中的一个 logical error (
Logical error: 'removed',会导致 debug 构建中的 server 中止) 。该问题会在多个CREATE OR REPLACE TABLE查询重复使用同一个显式 UUID 时触发,从而使 queue 中出现多个共享该 UUID 的已 drop 表。#107031 (Groene AI). - 修复了一个
Inconsistent AST formattinglogical error:当带别名的 lambda 在表达式列表中位于非首位,并被用作访问运算符 (tuple 元素.N或数组元素[]) 的操作数时,可能会在 debug 和 sanitizer 构建中导致 server 中止,例如SELECT 1, ((p0, p1) -> p0 AS a7).4[3] FROM t。#107092 (Groene AI). - 现在,嵌套在另一个 distributed query 中的 cluster 表函数 (
urlCluster、fileCluster、s3Cluster等) ,例如clusterAllReplicas(..., urlCluster(...)),会被拒绝并返回BAD_ARGUMENTSerror,而不再以 logical error (Distributed task iterator is not initialized) 失败。#107107 (Groene AI). - 当
OPTIMIZE ... DRY RUN因查询 timeout (设置了max_execution_time且timeout_overflow_mode = 'break') 而中断时,现在会返回TIMEOUT_EXCEEDED,而不是返回与rows_sources相关的 logical error (该错误会导致 debug/sanitizer 构建中的 server 中止) 。#107114 (Groene AI). - 不再在 macOS 上于
ZooKeeper会话 finalize 期间记录无害的Net Exception: Socket is not connectederror。clickhouse keeper-client退出时也不再向 stderr 打印这一虚假错误。#107438 (Groene AI). - 修复了可刷新materialized view 在
refresh_retries设置为极大值 (接近Int64最大值) 时,重试失败 refresh 过程中出现的有符号整数 overflow。该 overflow 可能会导致启用 undefined behavior sanitizer 的构建中的 server 中止。#108005 (Groene AI). - 修复了一个
LOGICAL_ERROR(在 debug/sanitizer 构建中会导致 server 中止) :当JOIN使用 NULL 安全比较运算符 (<=>/IS NOT DISTINCT FROM) ,且其中一个键是标量 subquery (例如... JOIN t2 ON (SELECT x FROM t1) <=> t2.k) ,并使用旧版 analyzer (enable_analyzer = 0) 时会触发该问题。现在,这类查询会返回常规的NOT_FOUND_COLUMN_IN_BLOCKerror,而不是 logical error。#108123 (Groene AI). - 选择
_distance列的 vector search 查询现在会返回恰当的 error,而不会再因 logical error 失败。#108423 (Robert Schulze). - 修复了一个可能出现的
std::future_error(The associated promise has been destructed prior to the associated state becoming ready) :当最终的异步 S3/Azure 分片上传完成任务调度失败时 (例如线程池耗尽) ,该问题可能暴露出来,并在 debug 和 sanitizer 构建中导致 server 中止。现在会改为报告真实的 scheduling error。#108730 (Groene AI). - 避免了在编译超大的 regular expression 时产生过量的 server log output 和过长的 error message (例如
LIKE或matchpattern 中包含数十万个 wildcards) ;现在,这类 pattern 会以清晰的CANNOT_COMPILE_REGEXPerror 失败。#108821 (Raúl Marín). - 修复了对超出范围的 protocol packet type 进行字符串化时的 undefined behaviour (例如在不同步或经模糊测试的 connection 中,
Unexpected packet from server/Received ... packeterror message 里会出现该问题) 。#108885 (Groene AI). - 修复了当表 expression 被用作
INoperator 的左 argument 时出现的一个令人困惑的内部 error (Method getResultType is not supported for TABLE query tree node) ;现在这类查询会产生清晰的 error message。#109412 (Alexey Milovidov). - 修复了读取 Iceberg table 时的一个问题:如果 metadata file 的版本号全为数字但超出 32 位整数范围 (例如
v99999999999999999999.metadata.json) ,此前会报出晦涩的std::out_of_range(STD_EXCEPTION) ,而不是清晰的BAD_ARGUMENTSerror。#109619 (Groene AI). - 修复了一个可能出现的
Logical error: 'ReadBuffer is canceled. Can't read from it.':当基于行的 input format (例如TSV/CSV) 解析输入失败,且底层读取已被取消时 (例如 HTTP chunk 格式错误或 body 被截断) ,就可能触发该问题。现在构建 verbose parse 诊断信息时不再从已取消的 buffer 中读取。#109708 (Groene AI). - 现在,使用
arrayJoin(或其unnest别名) 的 ROW POLICY filter expressions 会被直接拒绝,并返回清晰的 error;此前这类 policies 会在 query time 触发column->size() == num_rowslogical error。#109753 (Raúl Marín). #109973 (Raúl Marín). - 现在,读取 schema 中包含不受支持的 Nested type (例如
ROW字段) 的 Paimon table 时,会报告清晰的BAD_ARGUMENTSerror,并指出不受支持的类型;而不再返回没有任何消息、error code 为 0 的裸DB::Exception. (OK)。#109762 (Groene AI). - 修复了一个
LOGICAL_ERROR(std::length_error) :当查询启用实验性设置make_distributed_plan = 1,且使用非常大的distributed_plan_default_reader_bucket_count或distributed_plan_default_shuffle_join_bucket_count时,会触发该错误。现在这类值会被拒绝,并返回INVALID_SETTING_VALUE。#109770 (Groene AI). - 修复了一个
LOGICAL_ERROR(query tree node does not have valid source node) :当递归 CTE 将外层作用域中的标识符解析为关联列时 (使用allow_experimental_correlated_subqueries = 1) ,会触发该错误。现在这类查询会返回明确的UNSUPPORTED_METHOD错误。#109863 (Groene AI). - 修复了
ORDER BY ... WITH FILL在Int64/UInt64列上跨过非常大的 gap 时出现的有符号整数溢出问题 (例如,步长为 2,跨越接近 2^63 的 gap) 。此前该溢出在 sanitizers 下属于 undefined behavior,在发布构建中则会静默回绕。#109937 (Groene AI). - 修复了一个
Bad cast from type DB::FunctionNode to DB::ConstantNodelogical error (在 debug/sanitizer 构建中会导致 server 中止) :当针对Distributed表运行SELECT ... ORDER BY ... WITH FILL,且optimize_const_name_size较小时会触发该错误。#109938 (Groene AI). - 修复了一个
Invalid number of rows in Chunklogical error:当INTERPOLATE目标是WITH FILL列的别名,且使用旧版 analyzer (enable_analyzer = 0) 时会触发该错误。现在这类查询会被拒绝,并返回明确的INVALID_WITH_FILL_EXPRESSION错误。#110103 (Groene AI). - 修复了一个 logical error (在 debug/sanitizer 构建中会导致 server 中止) :当
indexHint/ignore/isZeroOrNull函数接收到类型解析为Nothing的参数时会触发,例如在indexHint(assumeNotNull(materialize(NULL)))这类表达式中。#110192 (Groene AI). - 修复了一个可能出现的 logical error:
Too large size (...) passed to allocator。当读取缓冲区大小设置 (如max_read_buffer_size或max_read_buffer_size_local_fs) 被设置为超出范围的值时,可能会触发该错误。现在,设置合理性检查会将这类值限制为 256 MiB;此外,对于INSERT ... FROM INFILE的使用位置也会额外进行限制,因为它会在clickhouse-client内部读取文件,而该场景下设置合理性检查不生效。#110207 (Alexey Milovidov). CHECK TABLE现在会报告 projection part 在加载 metadata 失败时的实际损坏情况,而不是给出误导性的Columns doesn't match ... Expected: 0 columns错误。#110262 (Raúl Marín).- 现在,当从 PostgreSQL source 读取的值 (例如来自
postgresqltable function 或PostgreSQLtable engine) 无法解析为声明的列类型时所产生的类型不匹配 (例如将text列声明为Int32) ,会被报告为正规的查询错误;此前它会在 debug 和 sanitizer 构建中导致 server 中止。#110264 (Groene AI). - 现已支持 macOS 上的 query profiler、memory profiler、trace profiler,以及
system.trace_log的符号化。#109825 (Raúl Marín). - 将
chdig更新到 v26.7.1:支持用于共享的压缩堆栈跟踪、查询模式、独立 Arena 内存、Perfetto 改进以及兼容性修复。#110938 (Azat Khuzhin). - 修复了在无符号键除以有符号常量时,对
intDiv单调性的错误推断;该问题可能导致对跨越结果类型有符号边界的IN/NOT IN谓词无法进行主键索引裁剪。Debug 构建还会触发LOGICAL_ERRORInvalid binary search result in MergeTreeSetIndex。#107586 (Groene AI). - 新增
allow_lossy_numeric_supertype设置 (默认禁用) 。启用后,当if、multiIf、coalesce、ifNull、array和map用于不存在无损公共类型的数值参数 (例如Decimal和Float64,或Int64和Float64) 时,会解析为Float64而不是Variant,从而可用于sum、avg、min和max等聚合函数。相关聚合函数的错误消息现在也会直接提及该设置名称。关闭了 #106707。#107236 (Groene AI). - 在表加载前启动 Prometheus 端点 (用于仅收集指标的配置) 和异步指标采集,以便在可能较长的元数据加载阶段也能看到指标。#108402 (Christoph Wurm).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了在包含大量去重块的表上,
TRUNCATE TABLE和DROP PARTITION可能失败的问题,因为在单个 ZooKeeper request 中删除这些块时,可能会超过默认 1 MB 的jute.maxbuffer限制。#105991 (Clayton McClure)。只有在使用 Apache ZooKeeper (不推荐) 而不是 ClickHouse Keeper 时,才会受到此问题影响。 - 修复了在
MergeTree系列表上的变更WHERE子句中使用限定列名 (database.table.column) 的问题,例如DELETE FROM和ALTER TABLE ... UPDATE/DELETE;此前此类查询会因缺少列而报错失败。关闭 #71760。#109491 (Mikhail Artemenko)。 - 修复了 PromQL 查询的查询结果缓存问题。
promql方言绕过了非确定性函数检查,可能会返回锚定在now()的过期结果;而 Prometheus HTTP API (/api/v1/query、/api/v1/query_range) 此前则完全不会存储任何缓存条目。#110887 (Nikita Mikhaylov)。 - 修复了当
TZ环境变量为空时,server 无法启动的问题。关闭 #68920。#68921 (Ardenwick)。 - 修复了当
Backupdatabase engine 引用的备份变为 unavailable 时 (例如文件被删除,或底层存储不可访问) ,server 无法启动的问题。现在会在不加载任何表的情况下加载该 database,而不会阻止整个 server 启动。#83188 (Vitaly Orlov)。 - 在对使用
Distributedengine 的表执行后台 insert 时,如果向远程分片发送数据时因重复报错而产生延迟,这些延迟现在会在错误解决后降低。此前,延迟只会不断累积,且不会重置。#87378 (Andrei Kochemirovskii)。 - 修复了在启动时扫描
Distributedasync-insert 队列时发现损坏文件的情况下,system.distribution_queue中的broken_data_files和BrokenDistributedFilesToInsert指标始终报告0的问题。#92124 (KG.Xu)。 - 修复了磁盘写满错误后的日志恢复问题。此前,当日志所在磁盘写满时,ClickHouse 会进入失败状态,并持续向 syslog 刷出大量错误消息 (可能高达每小时 100+ GB) ;即使释放了磁盘空间,也始终无法恢复。现在,一旦磁盘空间恢复可用,日志系统就会自动恢复,无需重启 server。#93127 (jaehanbyun)。
- 在禁用
vended_credentials时,将静态 S3 credentials 转发给 UnityDataLakeCatalog表读取,以防止匿名访问对象存储失败。#96910 (kgeg401)。 - 修复了
DeltaLake表引擎中 schema parsing 代码的崩溃问题。#97112 (Kseniia Sumarokova)。 - 修复了一个安全问题:未经身份验证的 TCP 客户端可通过 interserver port 探测表是否存在以及复制状态。#99854 (Shaohua Wang)。
- 修复了在
DESCRIBE TABLE中,子查询后跟别名时出现的语法错误。修复 #100031。#100205 (Yarik Briukhovetskyi) 。 - 修复了在关联子查询中,当
ROLLUP/CUBE与group_by_use_nulls一起使用导致外部列变为Nullable时出现的异常。#100365 (Alexey Milovidov) 。 - 修复了当已回滚的事务性
MergeTree分片与已提交的分片相交时,表启动期间发生的服务器中止 (在 sanitizer 构建中) 以及静默数据丢失问题。#100992 (Tuan Pham Anh) 。 - 修复了
indexOfAssumeSorted在MergeTree表的Array(LowCardinality(String))列上返回错误结果的问题。#101771 (Yash ) 。 - 修复了当表的排序键将
Date列包裹在toDateTime中 (例如ORDER BY toDateTime(date_column)) ,且查询使用类似WHERE date_column >= '...'的条件对原始列进行过滤时,主键剪枝不正确的问题。对于超出DateTime范围 (2106-02-07之后) 的Date值,toDateTime(Date)会发生溢出,因此存储的键不再单调;ClickHouse 不再对这种键/谓词组合使用主键剪枝,因为这样做可能会丢弃包含匹配行的 granule。关闭 #101744。#101814 (Nihal Z. Miaji) 。 - 修复了
intDivOrNull、moduloOrNull和positiveModuloOrNull在除法导致浮点异常 (除以零或INT_MIN / -1) 时返回0而不是NULL,以及intDivOrNull和intDivOrZero抛出异常而不是返回NULL/0的问题,这也包括有符号/无符号混合参数的情况。#101976 (Yarik Briukhovetskyi) 。 - 修复了在某些边缘情况下读取
Iceberg或DeltaLake表时出现的LOGICAL_ERROR异常,例如并发更新Iceberg元数据,或通过merge表函数读取DeltaLake表时。#102033 (Groene AI) 。 - 修复了出站 HTTP 请求 (例如
aiGenerate函数、url表函数、S3) 在主机同时公布 IPv4 和 IPv6 地址、但只有一种地址族可路由时,因No route to host而失败的问题。现在,HTTP 连接池会在第一个解析出的地址因网络错误失败时回退到下一个已解析地址,而不是在第一次请求时就直接返回该错误。#103786 (Alexey Milovidov) 。 - 修复了在
RESTORE包含具有循环依赖项的表的备份时,服务器发生中止的问题。#103824 (Konstantin Bogdanov) 。 - 对 Arrow
time32/time64列的模式推断 (例如SELECT * FROM file(..., 'Arrow')) 现在会推断为Time64而不是DateTime64;任何下游依赖旧推断类型的内容,在升级后都会看到这一新类型。此外,Time/Time64值现在也可以导出到 Arrow,并会根据 precision 选择合适的 Apache Arrow 时间类型。修复 #104038。#104316 (/bin/cat) 。 - 修复了
MergeTree中ALTER TABLE ... RENAME COLUMN与并发执行的OPTIMIZE TABLE ... FINAL(或任何后台 merge) 之间的竞争条件;该问题可能会在无提示的情况下将重命名列的数据替换为默认值。#104822 (Groene AI). - 修复了以下情况下的
Block structure mismatchlogical error:在Atomicdatabase 中执行过DETACH DATABASE/ATTACH DATABASE且lazy_load_tables = 1之后,如果ALTER TABLE ... RENAME COLUMN尚在进行中时并发执行INSERT,就可能触发该错误。#104852 (Groene AI). - 修复了
groupConcat在混用参数式和双参数写法时的问题,例如groupConcat(',', 2)(x, '/'):此前行数限制参数会被悄然忽略,导致返回所有行而不是请求的数量;现在第二个参数中的分隔符会正确覆盖该参数。#104882 (Yarik Briukhovetskyi). - 修复了
KILL QUERY/KILL MUTATION/KILL PART_MOVE_TO_SHARD/KILL TRANSACTION抛出的LOGICAL_ERROR(Expected one block from input stream) :当其WHEREclause 包含逐行执行的 subquery,或当max_block_size小到使针对相关system.*表的内部SELECT产生多个块时,就会触发该错误。#104927 (Groene AI). - 修复了从较小时间间隔单位转换为较大时间间隔单位时,
CAST返回错误结果的问题 (例如,CAST(toIntervalSecond(60) AS IntervalMinute)会返回0而不是1) 。关闭 #104986。#105058 (Yarik Briukhovetskyi). - 修复了使用按序读取管道 (
optimize_read_in_order = 1且read_in_order_use_virtual_row_per_block = 1) 运行的LIMIT ... WITH TIES查询中的一个 logical error (Assertion 'row < chunk.getNumRows()' failed) 。#105102 (Groene AI). - 修复了可刷新materialized view (
MATERIALIZED VIEW ... REFRESH ...) 中的泄漏问题:通过EXCHANGE TABLES在 refresh 时旋转出的临时内部表,如果大于max_table_size_to_drop就无法被 drop,因此之后每次 refresh 都会再创建一个新的临时内部表,导致该视图的数据 directory 持续增长,直至磁盘耗尽。现在,refresh 任务内部的 drop 会绕过max_table_size_to_drop和max_partition_size_to_drop;但这些安全保护仍适用于用户对该视图本身执行的DROP TABLE。关闭 #104900。#105106 (Groene AI). - 修复了一个异常的
DATA_TYPE_CANNOT_BE_USED_IN_KEY错误:对于 sorting key 未发生变化的ALTER查询 (修改 settings、注释、codecs、添加非键列等) ,如果MergeTree表的 sorting key 中包含SimpleAggregateFunction(或其他仅在allow_suspicious_primary_key = 1时允许的类型) ,此前也可能报错。#105111 (Groene AI). - 修复了一个 use-after-free 问题:当
Replicateddatabase 正在被 drop 或 detach 时,查询system.clusters中的副本状态列 (如is_active、unsynced_after_recovery、recovery_time) 可能触发该问题。此外,这条代码路径中原本被吞掉的无害 Keeper Exception (受影响的 database 会被视为暂时 unavailable 并跳过) 现在会以Information级别而非Error级别记入日志,因此在默认send_logs_level = 'warning'下不再发送给客户端。#105149 (Groene AI). - 修复了一个问题:在
clickhouse-local --ignore-error中执行多条语句时,每次出现词法错误或括号不匹配错误,错误消息都会回显其后的每条语句。#105480 (Groene AI). - 修复了一个罕见的 server crash:在可刷新materialized view 被 drop 或 replace 的同时,其 refresh 调度也在并发进行时,可能发生崩溃。#105588 (Groene AI).
- 对于数据 file format 不是
Parquet的Iceberg表,ALTER TABLE ... DELETE和ALTER TABLE ... UPDATE现在会明确返回NOT_IMPLEMENTEDerror,而不再导致 server crash 或悄悄破坏表。#105893 (Groene AI). - 修复了一个问题:某些以
EXCEPT或INTERSECT定义、且操作数为UNION链的视图,在DETACH/ATTACH或 server 重启后会返回错误结果。此前,格式说明符遗漏了INTERSECT/EXCEPT下UNION子项外层所需的括号,导致存储的 SQL 在重新解析时使用了相反的优先次序。#105935 (Groene AI). - 修复了 format 自动检测时将
JSONdata 误判为TSKV的问题。关闭 #100797。#106009 (Pavel Kruglov). - 禁止直接在
JSONcolumns 上创建minmax跳过索引——如果之后插入混合类型数组,可能会因NO_COMMON_TYPEexception 导致 insert 失败。请改为在带类型的 subcolumns 上创建索引 (例如INDEX idx json.field TYPE minmax) 。#106094 (linhaojie). - 修复了一个逻辑错误 (
Parsed partition value ... doesn't match partition value for an existing part with the same partition ID) :在分区键类型为Time的表上执行OPTIMIZE TABLE ... PARTITION ...以及其他需要解析分区值的 queries 时,可能会抛出该错误。#106202 (Groene AI). - 修复了一个问题:轻量级删除在未留下 projection part 的情况下,数据分区片段会被错误标记为 projection 已损坏——这可能发生在 projection 重建后输出行为零,或 projection 被丢弃 (
lightweight_mutation_projection_mode = 'rebuild'/'drop') 时。此前,这种损坏状态会禁用针对该分片查询的 projection optimization。#106273 (Shaohua Wang). - 修复了
plainobject storage disk (如s3_plain) 上的removeDirectory问题:它此前会像递归删除一样,删除非空 directory 中的所有文件;现在删除非空 directory 会返回CANNOT_RMDIR,而递归删除则会显式处理其中的内容。#106281 (RinChanNOW). - 修复了一个逻辑错误 (
Part ... doesn't exist) :在从 Keeper 硬件错误中恢复 quorumINSERT时,如果 quorum 同时被标记为失败,可能导致 server 中止。#106424 (Alexey Milovidov). - 修复了在应用行策略时因列名重复而触发的
LOGICAL_ERROR异常。#106438 (János Benjamin Antal) 。 - 修复了
CREATE OR REPLACE TABLE和REPLACE TABLE在现有目标超过max_table_size_to_drop时,会在磁盘上遗留_tmp_replace_*表,并将原表替换为空表的问题。现在会在交换前先执行大小检查,因此一旦违反限制,就会干净地中止,并在错误中显示用户可见的表名。#106782 (Groene AI) 。 - 修复了
JSON_QUERY/JSON_VALUE/JSON_EXISTS对Dynamic参数返回Dynamic而非String/UInt8的问题。关闭 #106461。#106877 (Pavel Kruglov) 。 - 修复了在启用
query_plan_optimize_lazy_final时,对带有文本索引过滤器的ReplacingMergeTree表使用FINAL查询会返回错误结果的问题。惰性FINAL优化构建出的读取步骤未能复现从文本索引进行的直接读取,因此过滤器丢弃了所有匹配行。#106894 (Jimmy Aguilar Mena) 。 - 将
query_masking_rules应用于附加到异常的消息,这样在配置了脱敏规则时,jdbc/odbctable function 报错中(in file/uri ...)后缀里的 URL 编码 credentials 就不会泄露。#106916 (Gaurav Dubey) 。 - 修复了对于分区键中包含
LowCardinality(Nullable(...))列的表,在任何 parts 重新加载时 (server 重启、DETACH/ATTACH) ,parts 都会被标记为损坏并分离的问题。自 26.5 起,当此类列的最小值和最大值均为NULL时,不会写入每个 part 的 minmax 索引文件,但 part 一致性检查仍要求该文件存在。受影响版本写入的 parts 缺少 minmax 索引文件,仍需手动重新附加。关闭 #106837。#106945 (Pedro Ferreira) 。 - 修复了当非等值
JOIN ... ONpredicate 引用了Nothing类型的列 (例如由ARRAY JOIN []生成的列) 时出现的LOGICAL_ERROR(Unexpected expression in JOIN ON section. Expected boolean (UInt8), got 'Nothing') 。#106981 (Groene AI) 。 - 修复了一个罕见的
LOGICAL_ERROR(Attempt to release query context that does not exist) ,以及在通过使用enable_filesystem_query_cache_limit = 1创建的文件系统缓存 disk 读取MergeTree表时伴随发生的 server 崩溃。#107028 (Groene AI) 。 - 修复了将空分片移动到
plain_rewritabledisk 时发生的 server 崩溃问题 (例如,对由remove_empty_parts = 0保留的空分片执行ALTER TABLE ... MOVE PARTITION ... TO DISK) 。#107040 (Groene AI) 。 - 修复了在启用
optimize_read_in_order和read_in_order_use_virtual_row时,对UNION ALL执行ORDER BY查询会出现行顺序错误的问题。关闭 #106879。#107053 (Vladimir Cherkasov) 。 - 修复了
geohashesInBox函数中的一个LOGICAL_ERROR(Unsupported argument types) :当其坐标参数混用了常量值和非常量值,或某个坐标为BFloat16时会触发该错误。现在,混合 const/non-const 的Float32参数已可正常工作,而BFloat16参数会被明确报错并拒绝。#107063 (Groene AI)。 - 修复了在相同键上,对带有
WITH CUBE、WITH ROLLUP或GROUPING SETS的GROUP BY执行SELECT DISTINCT时返回错误结果 (重复行) 的问题。query_plan_remove_redundant_distinct优化在这些情况下不再移除DISTINCT,因为这些分组修饰符会生成额外的行,其中键列会被填充为默认值,从而可能与真实的分组值冲突。#107072 (Groene AI)。 - 修复了
OUTER JOIN中的错误结果问题:当WHERE过滤条件是包含常量项的合取时 (例如p AND 1,或WHERE p QUALIFY NULL,其中QUALIFY NULL会被合并到WHERE中) 。该常量合取项可能会被下推到 join 的非保留侧,并从 join 后的过滤条件中移除,导致 join 产生侧表列为默认值的不匹配行,而这些行又会被错误地通过过滤。#107084 (Groene AI)。 - 修复了配置了
<lifetime>的executable_pool用户自定义函数无法获取底层脚本变更的问题。此前,只有SYSTEM RELOAD FUNCTIONS才会重新读取已编辑的脚本;周期性的<lifetime>重载仍会继续执行旧版本。#107087 (Groene AI)。 - 修复了在
correlated_subqueries_default_join_kind = 'left'时,对于源中将同一列标识符投影两次 (例如SELECT number, *) 的关联标量子查询出现的LOGICAL_ERROR异常 (Cannot find input column ... on its position in inputs of expression actions DAG) 。#107112 (Groene AI)。 - 修复了服务器全局 trace collector 上的一个数据竞争问题,该问题发生在工作线程启动其 profiler 与服务器关闭之间。#107307 (Groene AI)。
- 增量备份不再将
S3凭据存储在.backup元数据文件的<base_backup>定位符中。对于使用use_same_s3_credentials_for_base_backup = 1创建的备份,或显式基础备份凭据与该备份定位符匹配的备份,现在会存储一个非敏感标记,并且恢复时无需额外的恢复期设置;对于使用不同的显式基础备份凭据或额外基础身份验证参数创建的备份,请在RESTORE中通过base_backupsetting 传入它们。由旧版本创建且带有嵌入式凭据的备份仍然可以恢复。#107357 (Pablo Marcos)。 - 修复了在启用
output_format_csv_serialize_tuple_into_separate_columns(默认启用) 时,CSVWithNames和CSVWithNamesAndTypes的表头列数少于数据列数的问题。现在,表头 (以及类型行) 会将Tuple列展平为带点号名称的叶子字段 (例如t.a、t.b) ,因此表头列数与数据保持一致。新增 settingoutput_format_csv_header_serialize_tuple_into_separate_columns(默认值为1) 用于控制此行为,并可设置为0以恢复之前的单名称表头。#107371 (Groene AI)。 - 修复了读取
Icebergv3 表时的问题:当其Parquet数据文件包含保留的行血缘列 (例如_row_id) 时,原生Parquet读取器不再因不属于表 schema 的保留字段 ID 而抛出ICEBERG_SPECIFICATION_VIOLATION。#107377 (Greg Maher)。 - 修复了一个罕见问题:服务器在关闭期间会异常中止 (
std::future_error:The associated promise has been destructed prior to the associated state becoming ready) ,原因是某个已调度任务在执行前就从线程池队列中被丢弃。#107383 (Groene AI). - 修复了
MaterializedPostgreSQL表引擎和数据库引擎,使其支持从非默认 PostgreSQL schema (materialized_postgresql_schema) 复制单个表或整个数据库,包括同一数据库中多个 schema 下存在同名表的情况 (此前它们会共享同一个 publication 和 replication slot,从而相互干扰) 。#107425 (Alexey Milovidov). - 修复了
MaterializedPostgreSQL的一个问题:如果服务器停机期间某个已复制表的结构发生变化,整个数据库的复制会停止 (报错为LOGICAL_ERROR: Columns number mismatch) 。现在只会跳过受影响的表,并且可通过DETACH/ATTACH恢复。#107427 (Alexey Milovidov). MaterializedPostgreSQL数据库的BACKUP不再因Table ... were created or changed its definition during scanning而永久卡住,现在还会真正备份表数据 (委托给底层的ReplacingMergeTree) ,并且可将其恢复为独立的ReplacingMergeTree。#107433 (Alexey Milovidov).- 修复了一个回归问题:设置
compatibility = '26.6'(这会隐式启用hivepartition strategy) 时,S3/object storage 表路径中的{_partition_id}会被静默接受,而不是抛出BAD_ARGUMENTS。#107437 (Lefteris). - 修复了捆绑的
mongo-c-driver中的内存泄漏问题:从 MongoDB 读取时 (例如通过 MongoDB 字典或mongodb表函数) ,如果发生了可重试的读取错误,随后重试时服务器选择又失败,就可能触发该问题。#107448 (Groene AI). - 修复了向
Iceberg表插入数据时的异常:当该表的 metadata 由 external engine 创建,且省略了可选的snapshots、metadata-log或snapshot-log数组时,插入会失败。现在这类插入已可正常成功。#107473 (Shaohua Wang). - 修复了
DELETE FROM(轻量级删除) 除了ALTER DELETE之外还要求ALTER UPDATE权限的问题。现在,仅授予ALTER DELETE的用户也可以按文档所述执行DELETE FROM。#107491 (Shaohua Wang). - 修复了读取 Hive 分区文件时出现
NOT_FOUND_COLUMN_IN_BLOCK的问题:当use_hive_partitioning = 1,且WHERE/PREWHERE子句过滤的是一个真实 (非虚拟) 列,同时又选择了一个 Hive 分区列时,就会触发该问题。#107505 (Groene AI). - 修复了旧版 analyzer (
enable_analyzer = 0) 读取某个子查询的部分列时出现的LOGICAL_ERROR(Different order of columns in UNION subquery) 问题:该子查询的UNION子项是INTERSECT/EXCEPT集合操作。#107511 (Groene AI). - 修复了将
Arrow/ORC数据插入LowCardinality(Nullable(...))列时,NULL值会被静默转换为空字符串的问题。这是 26.5 中引入的一个回归。#107532 (Jimmy Aguilar Mena). - 修复了一个逻辑错误 (
Stream ... variant_discr ... is not found) :在合并或读取因对包含Dynamic列的表执行变更而生成的MergeTree分片时,可能会触发该错误。#107562 (Alexey Milovidov). - 修复了主键分析期间的一个逻辑错误 (
WhichDataType(const_type).isArray()) :当pointInPolygon使用Variant或Dynamic等包装类型的常量多边形参数调用时,会触发该错误 (例如,pointInPolygon((x, y), if(c, [(0, 0), ...], NULL))) 。#107589 (Groene AI). - 修复了
FileLog引擎中的一个逻辑错误 (Last stored last_written_position in meta file ... is bigger than current last_written_pos) :当被监视的文件被删除后重新创建,并复用了同一个 inode 时,可能会触发该错误。#107617 (Groene AI). - 修复了 ZooKeeper 客户端处理请求期间一个罕见的 server 中止问题 (
std::future_error:The associated promise has been destructed prior to the associated state becoming ready) :当异步 Keeper request 在发送过程中被丢弃时可能发生,例如在内存压力下。#107647 (Groene AI). - 修复了
ReplicatedMergeTree表的RESTORE,使备份中的重复内容分片能够被保留,而不是被静默去重。#107652 (Pablo Marcos). - 修复了运行时 join 过滤器在
JSON列上产生错误结果的问题。关闭 #107646。#107663 (Pavel Kruglov). - 修复了分布式查询在选择共享公共子表达式的
ALIAS列时返回错误结果的问题:列可能错位,返回的值也可能落在错误的列下。#107675 (Vladimir Cherkasov). - 现在,以
normalized_query_hash为键的配额会像查询计数计数器一样,按每个查询模式统计所有资源 (read_rows,read_bytes,result_rows,result_bytes,execution_time,written_bytes,errors) ,而不是将它们统一记入一个按用户共享的桶中。#107681 (Alexey Milovidov). - 修复了一个
Block structure mismatch in UnionStep stream逻辑错误 (在 debug/sanitizer 构建中会导致 server 中止,在发布构建中表现为Code: 49) :当UNION/INTERSECT/EXCEPT的同级分支仅WHERE谓词不同,且其中一个分支的谓词被常量折叠为Const列时,就会触发该错误。#107719 (Groene AI). - 修复了由于对嵌套在
Variant和Dynamic列中的LowCardinality剥离处理不一致而导致的逻辑错误 (Bad cast) ,例如在concat、format和主键分析中。关闭 #107598。#107773 (Pavel Kruglov). - 修复了并行副本在集群包含不活跃副本时严重的工作分配倾斜问题 (例如自动扩缩容后遗留的陈旧条目) 。这些副本现在不会再被读取协调器计入,因此工作会在在线副本之间均衡分配,而不是堆积在单个副本上。#107805 (Alexey Milovidov).
- 修复了
Not-ready Set is passed as the second argumentException:在构建IN子查询集合时,如果主键分析静默失败 (例如带有overflow_mode = 'break'的子查询超时) ,就可能触发该异常,并使该集合在查询管道中始终无法构建。#107924 (Alexey Milovidov). - 修复了谓词下推 (
enable_optimize_predicate_expression,旧版 analyzer) 中的服务器崩溃问题,该问题会在JOIN ... ON条件中包含UNION子查询时发生。#107930 (Groene AI). - 修复了在读取 S3 或兼容 S3 (例如 GCS) object 的过程中,如果该 object 被原地覆盖,会出现误报的
CHECKSUM_DOESNT_MATCH和Parquet读取错误 (某些 formats 还会静默返回错误结果) 的问题。现在,这类读取会以明确且可重试的错误失败,而不会返回由两个 object 版本拼接而成的数据;此行为由新设置s3_validate_etag_on_read控制 (默认启用) 。#107934 (Shaohua Wang). - 修复了以下问题:对于带有
set数据跳过索引的表,如果 ROW POLICY 使用恒为真的条件并结合对非索引列的检查进行过滤,SELECT可能会因NOT_FOUND_COLUMN_IN_BLOCK而失败。#107971 (Shaohua Wang). - 修复了 executable 用户自定义函数的命令参数解析问题,不再接受名称为空或无效的占位符作为参数。#107983 (Goutam Adwant).
- 修复了
Mapsubcolumn 与PREWHERE搭配使用时的性能回退问题。关闭 #107912。由 #99200 引入。#107988 (Pavel Kruglov). - 修复了从格式错误的
Native块中读取Variant列时可能发生的越界写入问题,其判别值引用了不存在的 variant 索引。#107991 (uwezkhan). - 修复了因错误的主键和分区裁剪而导致查询结果错误的问题:当
toStartOfDay、toStartOfISOYear、toDaysSinceYearZero、toRelativeSecondNum、toRelativeMinuteNum、toRelativeHourNum、toRelativeWeekNum、toRelativeDayNum、toMonthNumSinceEpoch或toYearNumSinceEpoch应用于包含超出函数可表示范围日期的Date32键列时 (尤其是1970-01-01之前的日期) ,就会出现该问题。这些函数会向主索引声明自己是单调的,但此前在这类 argument 上会发生回绕,因此索引可能会裁剪掉实际包含匹配行的粒度;现在,它们会在结果类型的边界处饱和,并在整个Date32范围内保持单调。#108018 (Nihal Z. Miaji). - 修复了元素为
Dynamic/Variant的Tuple在使用accurateCastOrNull时的问题:真实的源NULL之前会被视为转换失败。对于Nullable目标元素,源NULL现在会保留为元素NULL(与普通Tuple(Nullable(...))源的行为一致) ;对于非Nullable目标元素,源NULL现在会将整个Tuple置为NULL,而不是产生元素默认值;解析/溢出失败仍会将整个Tuple置为NULL。#108023 (Groene AI)。同时还修复了在使用accurateCastOrNull或accurateCastOrDefault将嵌套在Tuple内的Dynamic或Variant列转换为非Nullable元素类型时出现的逻辑错误。#108061 (Alexey Milovidov). - 修复了
numericIndexedVectorPointwiseMultiply在与全 1 向量相乘且 BSI (bit-sliced index) 配置不同时返回空结果的问题。#108027 (Alexey Milovidov). - 修复了
toTime64和CAST(... AS Time64)在saturate和ignore溢出模式下,未将超出范围的值钳制到Time64范围内的问题,这可能导致显示相同但比较结果不同的值。#108028 (Alexey Milovidov). getClientHTTPHeader现在会被正确视为非确定性,因此其结果不再被查询结果缓存错误复用。#108029 (Alexey Milovidov).clickhouse-client --port 9440现在会再次自动启用安全 (TLS) 连接;此前一次重构导致端口不再传递给安全连接检查,从而破坏了这一行为。#108032 (Alexey Milovidov).- 只读表的数据分区片段在刷新过程中出现暂时性错误时,不再会导致后台刷新任务永久停止。#108034 (Alexey Milovidov).
- 修复了
system.warnings中 memory/CPU/变更 过载告警滞后一个异步指标周期 (且在第一个周期中缺失) 的问题。#108035 (Alexey Milovidov). mongodb表函数现在接受以命名参数传递的oid_columns(例如oid_columns='_id') ,而不再以BAD_ARGUMENTS拒绝它。#108039 (Alexey Milovidov).- 修复了这样一种情况下的
Bad cast from type DB::ColumnNullable to DB::ColumnVector<...>异常 (逻辑错误) :限定星号 (t.*) 选中了JOIN USING键,且该 JOIN 嵌套在PASTE/CROSS/逗号 JOIN 或外层ONJOIN 之下,同时join_use_nulls = 0。#108043 (Groene AI). - 修复了正则表达式“全部匹配”函数
extractAll,extractAllGroupsVertical,extractAllGroupsHorizontal,countMatches和splitByRegexp中对零宽断言 (\b,^,$) 处理不正确的问题。例如,extractAll('new york is the greatest', '\b(\w)')现在会正确返回每个单词的首字母,而不是每个字母。#108047 (Alexey Milovidov). - 修复了在
Atomic数据库中执行CREATE TABLE ... AS SELECT时,如果查询失败会遗留空表的问题——例如用户无权访问子查询中引用的某个表时。此前重试会报表已存在,而不是返回原始错误。现在会先通过临时表创建,只有在数据完全填充后才会对外可见。#108048 (Alexey Milovidov). - 现在允许对使用
DateTime64、Decimal或浮点范围的range_hashed或complex_key_range_hashed字典,传入与dictGet/dictHas匹配的参数进行查询。此前此类查询会因must be convertible to Int64而失败,并且Decimal/DateTime64范围中的开放区间会错误返回默认值。#108052 (Alexey Milovidov). - 修复了加载带复合键的字典时出现的异常 (
CANNOT_PARSE_TEXT) :当键列不是字典定义中的前几列,且使用带显式查询的本地ClickHouse数据源时,会触发该问题。现在源列会按名称而不是按位置与字典结构匹配。#108053 (Alexey Milovidov). - 修复了
valuestable function 在使用无法被较窄浮点列精确表示的十进制字面量时会因ARGUMENT_OUT_OF_BOUND失败的问题 (例如在Float32列中使用0.1) ,如SELECT * FROM values('x Float32', 0.1)。现在这类值会被接受,并转换为最接近的可表示值,与CAST和INSERT ... VALUES的行为一致。#108055 (Alexey Milovidov). - 修复了在某个表上执行
SELECT count()(或其他简单查询) 时出现LOGICAL_ERROR(No available columns) 的问题:当用户仅被授予该表某个ALIAS列的SELECT权限时会触发该问题。#108056 (Alexey Milovidov). - 修复了
mapFilter、mapSort(及其变体) 和mapConcat会从Map的键类型和值类型中丢失LowCardinality的问题。此前,对Map(LowCardinality(String), String)列执行mapFilter会返回Map(String, String),这可能破坏通过CREATE TABLE ... AS SELECT创建的表的元数据,并导致CHECK TABLE失败。#108057 (Alexey Milovidov). - 修复了在文本索引上使用
hasToken且分词器不是splitByNonAlpha时结果不正确的问题。#108066 (Robert Schulze). - 修复了这样一种卡死问题:当多个在 XML 中定义的 MySQL 字典通过
share_connection共享同一个连接池时,执行SYSTEM RELOAD DICTIONARIES(以及RELOAD DICTIONARY) 会卡住。现在,这类连接池会遵循配置中的connection_pool_size和connection_wait_timeout(默认为 5 秒) ,与通过命名集合定义的字典保持一致。#108083 (Alexey Milovidov). - 现在,仅对字典拥有
SHOW DICTIONARIES权限的用户也可以使用EXISTS <dictionary>(此前还要求SHOW TABLES) 。#108084 (Alexey Milovidov). - 修复了
CREATE TABLE dst AS src SETTINGS ...(以及带有ORDER BY/PARTITION BY但未显式指定ENGINE的类似写法) 会静默丢失源表 engine、存储子句 (如表TTL和键) 以及 settings 的问题。现在,engine 和未被覆盖的存储子句会继承自源表,指定的 settings 则会在源表 settings 的基础上叠加合并。 #108085 (Alexey Milovidov). - 修复了向
MergeTree表执行INSERT时,在 Windows 支持的 filesystem (WSL、CIFS/SMB、Docker Desktop bind mount) 上因分片写入器在分片目录重命名过程中未关闭文件描述符,导致出现filesystem error: in rename: Permission denied的问题。 #108089 (Alexey Milovidov). - 修复了查询不带
WHERE子句的Hive表时发生崩溃 (空指针解引用) 的问题,例如SELECT * FROM hive_table。 #108094 (Alexey Milovidov). - 修复了以下场景中的
LOGICAL_ERROR(“Unexpected return type from if”) :先执行条件为非常量或 false 的ALTER UPDATE col = ... WHERE <cond>,再执行ALTER MODIFY COLUMN col <new type>,之后在apply_mutations_on_fly = 1下读取该列时会报错。 #108128 (Groene AI). - 修复了
toStartOfInterval和dateTrunc在输入精度高于时间间隔单位时,返回的是四舍五入后的值,而不是其所在时间间隔起始值的问题。例如,toStartOfInterval(toDateTime64('2023-10-09 10:11:12.000999', 6), INTERVAL 1 millisecond)之前返回10:11:12.001,而不是10:11:12.000。带显式 origin 的重载版本也受此影响。关闭 #103535。 #108186 (Yarik Briukhovetskyi). - 隐藏
system.query_views_log中view_query列里的敏感信息。 #108214 (Valerii Mordovskii). - 修复了附加了旧版
hypothesis跳过索引 (该索引类型已移除,仅为兼容ATTACH而保留) 的MergeTree表出现卡住的问题。此前,对此类表执行 lightweightDELETE、OPTIMIZE、普通INSERT或带过滤条件的SELECT时,都会因ILLEGAL_INDEX(“Index of type ‘hypothesis’ is no longer supported”) 而失败,并且DELETE变更会无限重试。现在,这个失效索引会被视为惰性的:在 merge/变更 过程中会原样保留,在 insert 和查询计划时会被跳过,并且仍可通过ALTER TABLE ... DROP INDEX删除。 #108217 (Groene AI). - 修复了 setting
type_json_allow_duplicated_key_with_literal_and_nested_object在JSON中对类型化路径不起作用的问题。 #108218 (Pavel Kruglov). - 修复了在带有普通/聚合 projection 的
MergeTree表上使用make_distributed_plan = 1执行查询时出现的LOGICAL_ERROR(Different list of shards in child plans) 问题。 #108256 (Groene AI). - 修复了
replaceRegexpOne和replaceRegexpAll,使.默认可匹配换行符,与其他 regular expression 函数保持一致。 #108265 (linjiayu1025-collab). - 修复了通过
accurateCastOrNull将Array(Dynamic)或Array(Variant)转换为QBit时的逻辑错误,例如accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)')。#108288 (Groene AI) 。 AggregateFunction状态列现在也会遵循index_granularity_bytes。此前,这类列会忽略粒度的字节上限 (例如AggregatingMergeTree表中的uniqExact状态以及聚合 projections) ,从而生成远大于配置上限的粒度,并增加读取放大和查询时的内存占用。#108297 (Groene AI) 。- 修复了 lightweight
UPDATE/DELETE条件会被求值两次的问题,这可能导致非确定性条件出现错误行为,也会让确定性条件产生额外开销。关闭了 #86032。#108323 (ofeliacode) 。 - 修复了预定义 HTTP 处理程序中的一个异常:当某个
headers_regexp正则表达式允许请求头为空值,而该请求头又未出现在请求中时,就会触发此异常。#108324 (Vitaly Baranov) 。 - 修复了
arrayPartialSort在 limit argument 为非常量时的问题。#108327 (Vitaly Baranov) 。 - 修复了已取消或被
KILL的INSERT在构建跳过索引时仍会长时间继续运行的问题 (例如高基数列上无界的set(0)索引) 。现在查询取消后,索引构建会及时停止。#108351 (Shaohua Wang) 。 - 修复了对
primes表函数执行SELECT时无法响应取消的问题:当step(或limit) 较大时,查询在KILL QUERY或超时后仍可能继续运行很长时间。现在会及时停止。#108353 (Shaohua Wang) 。 - 修复了解析名称中包含子串
INT的数据类型名称时的问题 (例如在数据类型位置上使用类似函数的名称quantileInterpolatedWeighted) 。此前,这类名称会被误认为是 MySQL 整数类型,其第一个(...)参数组还会被静默吞掉并作为显示宽度修饰符处理,从而可能破坏查询格式化后的 round-trip。#108354 (Groene AI) 。 - 修复了一处不一致:格式错误的
ARRAY JOIN后面如果跟着逗号和带括号的表列表,之前会被误解析为交叉连接,而不是直接拒绝。#108365 (Raúl Marín) 。 - 当
format_display_secrets_in_show_and_select被禁用 (默认值) 时,在EXPLAIN actions、EXPLAIN header和EXPLAIN PIPELINE的输出中隐藏encrypt、decrypt和HMAC等函数的 secret argument。#108386 (Raúl Marín) 。 - 修复了带
TOtarget 的可刷新materialized view 执行CREATE OR REPLACE时的问题:此前会被错误地拒绝,因为目标表已经归属正在被替换的视图。#108392 (Nikolay Degterinsky) 。 - 修复了一个服务端崩溃问题 (
Received signal 4,非法指令) :格式错误或不同步的原生 TCP 协议流可能触发该问题。现在,在解析之前会先校验客户端提供的初始地址是否为数字形式的host:port,而不是让非数字端口传入存在陷阱的getservbynamelibc 函数。 #108410 (Groene AI). - 修复了关闭过程中发生的一个服务端崩溃问题:当关闭数据库时抛出异常 (例如某个表的 flush 遇到 ZooKeeper 超时) 就可能触发该问题。现在不会再跳过后续关闭流程,因此系统日志会在服务端退出前完成 flush,并等待其线程结束。 #108417 (Groene AI).
- 修复了正则表达式函数 (
match、extract、extractAll、replaceRegexpOne、replaceRegexpAll等) 在模式中包含 NUL (\0) 字节时静默返回错误结果的问题。现在 NUL 会被视为普通字面量字节,与 RE2 保持一致。 #108427 (Alexey Milovidov). - 修复了
clickhouse-local在未配置http_options_response时,对 HTTPOPTIONS请求返回空响应的问题;这会导致 Web UI (/play) 将连接显示为已断开,即使查询实际上可以正常工作。 #108428 (Alexey Milovidov). - 修复了以下场景下的
LOGICAL_ERROR("Invalid action query tree node ...") 异常:分布式查询同时对结构相同的重复ALIAS列进行去重,并引用带有key = value命名集合参数的 table function (例如oss(s3_conn, filename = '...')) 。 #108435 (Groene AI). - 修复了一个服务端崩溃问题 (
LOGICAL_ERROR: 'Unexpected exception in refresh scheduling') :当Replicated数据库中的协调式可刷新materialized view 挂载到不支持MULTI_READfeature flag 的 Keeper 上时 (例如 Keeper 降级后) ,服务端在启动时可能发生该问题。现在该视图会被优雅停止,而不是直接中止服务端。 #108441 (Groene AI). - 修复了在并行副本下从
MergeTree表中选择虚拟列时出现的NOT_FOUND_COLUMN_IN_BLOCK错误 (例如Column _part not found) ,包括在asterisk_include_virtual_columns = 1时通过SELECT *进行选择的场景。 #108451 (Groene AI). SYSTEM RESET DDL WORKER现在需要新的SYSTEM RESET DDL WORKER权限。此前,任何已通过身份验证的用户 (包括readonly用户) 都可以执行它,并反复重置 DDL worker 状态,从而阻塞ON CLUSTERDDL。 #108460 (Groene AI).- 现已将
catboostEvaluate的模型路径限制为user_files目录,与filetable function 和字典源一致。此前,该函数接受任意文件系统路径,且不进行范围检查,这使得用户可以探测user_files之外的文件是否存在,并触发对这些文件的读取。现在模型必须位于user_files内。 #108463 (Groene AI). hasColumnInTable函数现在要求对目标表具有SHOW COLUMNS权限,这与DESCRIBE和SHOW CREATE TABLE所需的授权一致。此前,任何用户都可以调用hasColumnInTable来探测列名,并在没有任何访问检查的情况下测试表和数据库是否存在。 #108464 (Groene AI).- 修复了在为
mannWhitneyUTest、rankCorr、largestTriangleThreeBuckets、quantileGK、sequenceMatch/sequenceCount和groupArrayIntersect反序列化恶意构造的 aggregate function states 时出现的过度内存分配问题。格式错误的状态可能会声明一个巨大的元素数量,导致 server 仅凭几个字节的输入就尝试分配数十 GB 内存;现在这类状态会被以TOO_LARGE_ARRAY_SIZE拒绝。#108465 (Groene AI). - 现会根据
remote_url_allow_hosts(RemoteHostFilter) 校验 S3301 Moved Permanently响应的重定向目标。此前,AWS SDK 在处理 301 时,会跟随响应中由攻击者提供的端点 (Location请求头或<Endpoint>元素) ,却不会执行 host 检查,因此恶意或已被攻陷的兼容 S3 server 可以将 ClickHouse 重定向到任意 host (SSRF) 。307 重定向路径原本就会执行此检查;现在两条路径的行为已保持一致。#108466 (Groene AI). - 修复了凭据泄露问题:
DataLakeCatalogdatabase engine 的旧版storage_aws_access_key_id、storage_aws_secret_access_key、storage_catalog_credential和storage_auth_headersettings 之前会以 plaintext 形式显示在system.databases.engine_full和SHOW CREATE DATABASE中。现在它们会被脱敏为[HIDDEN]。#108470 (Groene AI). - 修复了
ssl_certificate用户识别逻辑,使单个*通配符只匹配恰好一个名称组件 (RFC 6125 6.4.3) 。此前,CN或DNS:SAN subject 中的通配符 (例如*.corp.example.com) 也会匹配多级标签名称,例如evil.deep.corp.example.com,从而让持有更深层 subdomain 证书的用户能够以该通配符用户身份通过认证。URI:SAN 的匹配行为保持不变。#108472 (Groene AI). - 修复了 MySQL wire 协议中的 SQL 注入问题:通过 MySQL interface (端口 9004) 发送的
SHOW TABLE STATUS LIKEargument 和SET <mysql_setting>值,现在会先解析并重新加引号,而不是直接原样拼接到重写后的查询中。同时还修复了通过 MySQL interface 执行KILL QUERY <id>时会静默忽略多位 connection id 的问题。#108474 (Groene AI). - 通过 HTTP 查询字符串参数传递的敏感值 (例如
param_*查询参数绑定,如param_secret_key/param_aws_secret_access_key、passwordparameter,或 S3 风格的signatureparameter) 将不再原样写入system.text_log或 OpenTelemetry spans。Request URI日志行现在会对名称看起来敏感的 parameter 值进行脱敏,将其替换为[HIDDEN]。#108475 (Groene AI). - 在对
urltable function 和URLstorage engine 执行 schema inference 时,现会强制应用http_forbid_headersconfiguration。此前,在推断 schema 时 (例如使用Regexpformat 或DESCRIBE) ,被禁止的请求头仍然会通过网络发送,其 response body 还可能在 parse 错误中被回显,从而泄露 secret。现在,在推断路径上进行任何网络访问之前就会先检查请求头过滤器,这与urlCluster的现有行为保持一致。#108476 (Groene AI). - 修复了将
SELECT ... SAMPLE ...与 query condition cache (settinguse_query_condition_cache,默认启用) 一起使用时会得到错误结果的问题。#108488 (Groene AI). - 修复了当
max_parser_depth设为较大值时,由深度嵌套的表达式 (如[[[ ... ]]]或array(array( ... ))) 导致的服务器崩溃 (栈溢出) 问题。#108493 (Raúl Marín). - 修复了
RabbitMQ表引擎在 broker 因错过心跳且未发送 TCP RST 而关闭 AMQP 连接时,在DROP TABLE或服务器关闭期间无限期卡住的问题。现在所有阻塞式事件循环调用都设有 30 秒超时,因此关闭流程始终能够完成。#108497 (Aly Ayman). - 作为内部查询一部分执行的次级查询现在会被记录为内部查询。#108506 (Miсhael Stetsyuk).
ArrowFlight表引擎和arrowFlight表函数现在会遵循<remote_url_allow_hosts>允许列表。此前不会校验连接的 host 和 port,因此查询可能访问不在允许列表中的 hosts。#108507 (Groene AI).- MySQL wire 协议命令
COM_FIELD_LIST(mysql_list_fields) 和COM_INIT_DB(USE database) 现在会执行与其 SQL 等价命令 (SHOW COLUMNS/DESCRIBE和USE) 相同的访问控制。此前,它们可能泄露用户仅拥有部分列权限的表的列名,并且可在没有SHOW DATABASES权限的情况下切换当前数据库。#108508 (Groene AI). - 现在会以不区分大小写的方式匹配
http_forbid_headers。HTTP 请求头名称不区分大小写,因此禁止Authorization现在也会阻止authorization、AUTHORIZATION以及其他大小写变体。已配置的header_regexp模式现在也会以不区分大小写的方式匹配,无需显式使用(?i)标志。#108509 (Groene AI). - 修复了一个可能导致服务器崩溃 (段错误) 的问题:当 distributed query 将尚未物化的
MATERIALIZEDCTE 作为外部表引用,且远程源以惰性方式创建时,就可能发生该问题。#108547 (Groene AI). - 修复了查询条件缓存 (
use_query_condition_cache = 1) 在为执行了不同跳过索引集合的查询复用由跳过索引得出的 mark 排除结果时导致结果错误的问题,例如使用use_skip_indexes = 0、ignore_data_skipping_indices或不同的use_skip_indexes_for_disjunctions模式时。现在,这类由跳过索引派生的缓存条目会按实际执行的跳过索引集合进行键控。#108548 (Groene AI). - 修复了
changeYear、changeMonth、changeDay、changeHour、changeMinute和changeSecond在使用DateTime64argument 时的多个 bug:结果列会以硬编码的默认标度 3 创建,而不是使用 argument 的标度;当结果传给arrayPushBack/arrayPushFront/arrayConcat时,这会导致LOGICAL_ERROR(writeSlice expects same column types) ;纳秒精度 (标度 9) 输入会抛出DECIMAL_OVERFLOW;以及早于纪元的亚秒输入会返回错误的日历秒。同时还修复了timeSlots处理DateTime64时,在其声明的 return type 中忽略可选Sizeargument 的标度,以及对Size中最大标度返回错误 timestamps 的问题。#108551 (Groene AI). #108681 (Takumi Hara). #108994 (Groene AI). - 修复了在启用
enable_identifier_resolve_cache(默认开启) 时,若复合谓词在GROUP BY中使用了别名并再次被引用,会触发NOT_FOUND_COLUMN_IN_BLOCK错误的问题。#108553 (Groene AI). - 修复了对
STREAM读取执行DISTINCT时出现的逻辑错误 (Equal values are not contiguous within the range assumed to be sorted) (SELECT DISTINCT ... FROM table STREAM) 。读取顺序优化不再应用于STREAM读取,因为它产生的行按提交顺序排列,而不是按排序键顺序排列。#108568 (Groene AI). - 修复了两种情况下,投影返回的是列类型的默认值 (例如
0) ,而不是声明的DEFAULT值 (例如-1) :一是读取在投影创建后通过ALTER TABLE ... ADD COLUMN ... DEFAULT新增的列时 (从 base table 读取原本就是正确的) ;二是在 Wide part 上该列的TTL过期后。#108569 (Shaohua Wang). #109013 (Shaohua Wang). - 修复了向 S3 上传 (例如备份) 时,如果在瞬时读取错误后重试,可能出现
ReadBuffer is canceled. Can't read from it.错误的问题。#108573 (Groene AI). - 修复了
ATTACH PARTITION ... FROM会拒绝主键等价但声明方式不同的表的问题 (一个显式声明了PRIMARY KEY,另一个则由ORDER BY隐式推导) 。#108590 (Jordi Orihuela). - 修复了在多个文本索引处于部分 materialized 状态时,从文本索引直接读取会失败的问题。修复了 #108530。#108607 (Anton Popov).
- 修复了一处元数据泄露问题:
DESCRIBE loop('db', 'table')和DESCRIBE loop(<inner table function>)会绕过SHOW COLUMNS/ 源访问检查,使无权限用户也能读取表的列 schema。#108624 (Groene AI). - 修复了
S3Queue和AzureQueue表引擎中的_etag虚拟列:该列虽已声明,但从未被填充,因此SELECT _etag一直返回空字符串。现在它会像S3engine 和s3table function 一样,返回对象的 ETag。#108625 (Groene AI). - 修复了读取
Arrow、ArrowStream以及基于 Arrow 的ORC文件时的问题:如果其中的 timestamp 列将固定数值 UTC 偏移 (例如+05:30、-08:00、00:00) 或非 IANA 标记fixed作为 timezone,此前会报Cannot load time zone ...(BAD_ARGUMENTS) 错误。#108633 (Groene AI). - 修复了在将
join_algorithm = 'full_sorting_merge'用于SEMI/ANTIjoin 时出现的异常 (LOGICAL_ERROR: Join is supported only for pipelines with one output port或NOT_IMPLEMENTED: MergeJoinAlgorithm is not implemented for strictness Semi) ,包括对相关EXISTSsubquery 去关联后生成的 join。现在,full_sorting_merge会拒绝它无法执行的 strictness/kind 组合,因此规划器会回退到其他已启用的算法,或报告该 join 无法执行。#108658 (Groene AI). - 修复了在使用
positions = 1为包含大量不同短 token 的数据构建 text index 时出现的 heap buffer overflow。#108659 (Groene AI). - 现在,当从 S3 读取或向 S3 写入数据的查询在某个 S3 请求仍在进行中时被取消 (例如通过
KILL QUERY) ,系统会将其报告为已取消,而不是误导性的网络/S3 错误。特别是,向 S3 执行 backup 或从 S3 执行 restore 被取消后,现在会在system.backups中报告为BACKUP_CANCELLED/RESTORE_CANCELLED。#108673 (Julia Kartseva). - 修复了一个启动失败问题:由旧版本 (25.12 或更早) 创建且带有格式错误
auth_header的DataLakeCatalogdatabase,在升级到 26.2 或更高版本后无法 attached,导致 server 无法启动。现在仅在CREATE时验证auth_header;而在ATTACH时,catalog 改为在首次使用时才延迟构建,而不是在启动期间构建,因此单个配置错误或无法访问的 catalog database 不会再阻塞 server 启动。#108674 (Groene AI). - 修复了在合并期间出现的逻辑错误 (
Sort order of blocks violated) 以及错误读取问题;该问题发生在将Nullable(Tuple(...))列中的非 NullableLowCardinality元素用作 subcolumn 时 (例如作为排序键) 。#108679 (Groene AI). - 修复了当
SYSTEM FLUSH DISTRIBUTED与对同一个Distributed表执行DROP TABLE并发运行时,可能发生的崩溃 (use-after-free) 。#108684 (Groene AI). - 修复了 Azure account key 的 Base64 解码崩溃问题;当 key 不是有效的 Base64 时,可通过
azureBlobStorage(以及相关的 Azure table functions 和 storages) 触发:字节>= 0x80会导致越界读取,任意无效字节都会引发 undefined behaviour。现在无效 key 会被明确拒绝。#108716 (Groene AI). - 修复了以下情况下出现的
NUMBER_OF_COLUMNS_DOESNT_MATCH错误:对Distributed表的 subquery 读取两个或更多展开为相同 expression 的ALIAS列 (例如a1 String ALIAS toString(x), a2 String ALIAS toString(x)) ,且该 subquery 作为外层查询的输入,例如SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2)。#108725 (Groene AI). - 修复了
CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE会导致新视图未订阅其 source table 的问题,从而静默丢弃 replace 之后插入的每一行。#108728 (Alexey Milovidov). - 修复了一个异常 (
Cannot find sharding key column,并且在 debug 和 sanitizer build 中会导致 server 中止) ,该问题发生在Distributed表的 sharding key 是一个会被 analyzer 做常量折叠的 expression 时,例如if(1, toInt32(id), toInt32(id) + 1),并且设置了optimize_skip_unused_shards = 1。#108737 (Groene AI). - 修复了在
GROUPING SETS/ROLLUP/CUBE中将group_by_use_nulls与LowCardinality常量 grouping key 一起使用时,出现的逻辑错误 (Bad cast from type DB::ColumnNullable to DB::ColumnString) 以及可能产生错误结果的问题。#108771 (Alexey Milovidov). - 修复了这样一个问题:当键中的
LowCardinality(FixedString)(或LowCardinality(Nullable(FixedString))) 键列被函数包裹时,分区和主键裁剪会被静默禁用,例如PARTITION BY sipHash64(k) % N配合WHERE k = 'literal'。此前,这类查询会扫描所有分区,而不是将其裁剪掉。#108777 (Groene AI). - 修复了一个逻辑错误 (在 debug 和 sanitizer 构建中会导致服务器中止) :当通过
Alias表执行INSERT ... SELECT,或向TimeSeries表插入数据时,如果在没有异常的情况下被取消,例如使用timeout_overflow_mode = 'break',就会触发该问题。#108783 (Groene AI). #108796 (Shaohua Wang). - 修复了一个
Bad cast from type DB::ColumnSparse to DB::ColumnString逻辑错误 (在 debug 和 sanitizer 构建中会导致服务器中止) :当groupConcat应用于某个Tuple,且其中的String元素以稀疏方式存储时,就会触发该问题。#108790 (Groene AI). - 修复了
mapFilter、mapSort、mapReverseSort、mapPartialSort和mapConcat中的TYPE_MISMATCH问题:当Map值中包含带有LowCardinality的嵌套Map时会出现该问题,例如mapFilter((k, v) -> 1, map('a'::LowCardinality(String), map('x'::LowCardinality(String), 'y')))。#108798 (Groene AI). - 修复了
insert_quorum = 'auto'的一个问题:当存活的副本少于多数时,系统不会提前拒绝插入。现在,这类插入会立即以TOO_FEW_LIVE_REPLICAS失败,而不是先写入本地分片,之后再因UNKNOWN_STATUS_OF_INSERT超时。#108800 (Gagan Dhakrey). - 修复了一个 bug:
JOIN的WITH TOTALS行可能会包含默认值 (例如0) ,而不是来自 join 一侧常量子查询的常量值。该错误结果只会在某些 JOIN 顺序下,或启用query_plan_join_swap_table设置时出现。#108807 (Vladimir Cherkasov). - 修复了一个可能发生的 segmentation fault (空指针解引用) :当服务器关闭与
S3Queue/AzureQueue表关闭并发进行时,可能会触发该问题。#108810 (Miсhael Stetsyuk). - 修复了一个启动中止问题 (
Cannot allocate ThreadStack、EINVAL) :在 glibc 构建中运行于具有较大 signal-stack 大小的 CPU 上时 (例如搭配支持 AMX 的内核的 Intel Sapphire Rapids / Granite Rapids) ,如果 signal alt-stack 的大小没有向上舍入到页大小的整数倍,就可能触发该问题。#108813 (Groene AI). - 修复了分布式查询偶尔会以
UNEXPECTED_PACKET_FROM_SERVER(expected TablesStatusResponse, got ProfileInfo) 失败的问题:当连接池复用了一个因先前已取消的查询而处于不同步状态的连接时,就会发生该问题。#108854 (Alexey Milovidov). - 修复了一个 logical error (在 release 构建中表现为异常,在 debug 和 sanitizer 构建中表现为 server 中止) :该问题可能出现在分布式表上,对带有多个
LowCardinality参数的函数进行调用时,例如将concatAssumeInjective((SELECT toLowCardinality('p')), s)与remotetable function 一起用作GROUP BY键。相关报错信息为Default functions implementation for LowCardinality is supported only with a single LowCardinality argument或Expected the argument ... to have N rows, but it has M。#108871 (Groene AI). - 修复了
reinterpret(x, 'Decimal128(scale)')(以及目标为Decimal32/Decimal64/Decimal256/DateTime64的情况) 的问题:当 source 和 target 具有相同的物理 type 时,生成的结果列其内部标度使用的是 source 的标度,而不是请求的 target 标度。值本身是正确的,但列表对象在结构上与其声明的 type 不一致。#108878 (Groene AI). - 修复了一个
LOGICAL_ERROR(New empty part is about to materialize but the directory already exist) :在 debug 和 sanitizer 构建中,当对MergeTree表执行DROP/DETACH/MOVE/REPLACE PARTITION,且此前同类操作曾被中断 (例如事务回滚或崩溃) 并遗留了过期的tmp_empty_<part>directory 时,可能导致 server 中止。现在会回收该过期 directory,而不是直接失败。#108879 (Groene AI). - 修复了 ClickHouse Keeper 在
Create2响应的Stat中错误返回dataLength = 0的问题,以及 ClickHouse ZooKeeper 客户端未反序列化Create2响应中Stat的问题。#108909 (unintended). - 修复了
clickhouse-local拒绝接受紧邻=写出的空选项值的问题 (例如--format_csv_null_representation='') ;现在其行为与--format_csv_null_representation ""和SET format_csv_null_representation = ''一致。#108910 (Vismay). - 修复了一个
LOGICAL_ERROR(Inconsistent AST formatting) :在格式化同时包含命名和未命名元素的TupleData type 时 (例如Tuple(a UInt8, UInt16)) ,会导致 server 在 debug 和 sanitizer 构建中中止。#108915 (Groene AI). - 修复了在使用
GROUPING SETS、ROLLUP或CUBE且max_threads > 1时,合并uniqExactaggregate states 会发生 segmentation fault 的问题。#108928 (Raúl Marín). - 修复了在启用 lazy 列复制 (
enable_lazy_columns_replication) 时,如果某个INSERT因批处理中途出错而回滚 (例如在Buffer表、异步插入,或Kafka/RabbitMQ/FileLog引擎中) ,可能导致结果错误或越界 reads 的问题。#108935 (Groene AI). join_any_take_last_row现在会被所有受支持的基于哈希的 join 路径正确应用,包括使用自动落盘的 join。#108936 (János Benjamin Antal).- 修复了 analyzer 中的一个 bug:
JOIN中某个表上的FINAL(例如FROM t1 FINAL JOIN t2) 会被错误地应用到其他参与 join 的表上,从而可能导致此类查询变慢。#108979 (Vladimir Cherkasov). - 修复了一个
LOGICAL_ERROR(“Cannot find__grouping_setcolumn in header of MergingAggregatedTransform with grouping sets” 或 “Chunk info was not set for chunk in MergingAggregatedTransform”) :在禁用 analyzer 的情况下,对于UNION ALL/INTERSECT/EXCEPT查询,如果一个分支在并行副本下使用GROUP BY GROUPING SETS,另一个分支使用FINAL,就可能触发该问题。#109003 (Groene AI). - 修复了自动并行副本规划器中的一个
LOGICAL_ERROR,该问题可能在启用automatic_parallel_replicas_mode且parallel_replicas_min_number_of_rows_per_replica大于 0 时出现。#109011 (Groene AI). - 修复了
MsgPackformat 在 schema inference 期间过度分配内存的问题:对于损坏的输入,如果其 array/map/string/binary 请求头声明了极大的元素数量,将不再触发单次数 GB 的内存分配,而是会被判定为格式错误的输入并拒绝。这修复了 release 构建中的内存耗尽问题 (以及 sanitizer 下的allocation-size-too-big中止) 。#109019 (Groene AI). - 修复了在服务器端解析的
DateTime/DateTime64字符串字面量中,use_client_time_zone被忽略的问题 (异步INSERT、SELECT字面量) 。现在,当启用use_client_time_zone时,客户端会将其本地时区通过session_timezone传递过去,因此服务器端的解析结果将与同步INSERT路径保持一致。#109051 (Groene AI). - 修复了在启用
query_plan_optimize_lazy_final,且WHERE过滤条件部分下推到PREWHERE(通过optimize_move_to_prewhere_if_final) 时出现的NOT_FOUND_COLUMN_IN_BLOCK错误。#109073 (Groene AI). - 修复了在查询中使用限定星号 (如
b.*) 时的一个错误:当b是表 (或子查询/CTE) 的别名,且其名称与另一张表中的某个非复合列同名时,就会触发该问题。此类查询现在不再失败,并且会正确选择b的所有列。#109078 (Vladimir Cherkasov). - 修复了
JoinStep中的Block structure mismatch逻辑错误 (在 debug 和 sanitizer 构建中会导致 server 中止) :当相关子查询被去相关并转换为 join,且源关系中同一个列名出现多次时,就可能触发该问题,例如在correlated_subqueries_default_join_kind = 'right'的情况下:WITH t AS (SELECT number, * FROM numbers(3)) SELECT *, (SELECT t.number WHERE t.number >= 0) FROM t。#109114 (Groene AI). - 修复了一个卡住问题:通过文件系统缓存读取的查询在被
KILL QUERY取消后,仍可能一直等待一个正在进行的下载;同时,如果某个可刷新materialized view 的刷新过程正卡在这样的等待中,删除该 view 或对其执行SYSTEM STOP VIEW也会被阻塞。#109116 (Murphy). - 修复了向带有 materialized views 的表执行 insert 时,
parallel_view_processingsetting 被忽略的问题——自 25.10 起,无论该 setting 如何,views 都会始终并行运行。#109170 (Antonio Andelic). - 修复了解析器中的一个不一致问题:
INSERT的列列表接受写作t.* LIKE '<pattern>'/t.* ILIKE '<pattern>'的限定列匹配器,却拒绝其规范形式t.COLUMNS('<regexp>'),从而破坏了查询 format 的往返一致性 (并会在 debug 和 sanitizer 构建中导致 server 中止) 。#109176 (Groene AI). - 修复了
ProfileEvents增量非单调的问题:在 socket 超时或 AIO 失败时,NetworkReceiveBytes和AIOWriteBytes计数器可能会按负值递增 (回绕成一个巨大的值) ,并且MemoryOvercommitWaitTimeMicroseconds使用了非单调时钟计时。#109180 (Azat Khuzhin). - 修复了
Arrow、ArrowStream、Avro格式以及旧版ORC和Parquet读取器在对可空结构体列进行 schema inference 时返回Nullable(Tuple)的问题,而Nullable(Tuple)类型并不允许使用 (allow_experimental_nullable_tuple_type已禁用) 。DESCRIBE返回的类型会被CREATE TABLE拒绝,因此使用推断出的 schema 创建表或插入数据时会失败,并报错Nullable Tuple type is not allowed。#109185 (Nihal Z. Miaji). - 修复了关联
EXISTS和标量子查询在关联条件仅出现在子查询投影中、同时带有非关联WHERE子句时返回错误结果的问题 (子查询可能对每一行都求值为 false /NULL) 。修复了 #105760。#109186 (Dmitry Novik). - 修复了
CREATE USER ... HOST LIKE 'a', 'b'(以及等价的ALTER USER) 静默地只保留第一个 pattern 的问题。现在,所有指定的HOST LIKEpattern 都会存储到该用户的主机允许列表中。#109187 (Groene AI). - 修复了定义在
mapValues(map)或mapKeys(map)上的文本索引在通过启用 analyzer 的Distributedengine 表查询时被静默忽略的问题。该索引在本地表以及通过cluster/remotetable function 查询时都能使用,但通过Distributedengine 表查询时会跳过它 (并在force_data_skipping_indices下因INDEX_NOT_USED而失败) 。#109188 (Groene AI). - 修复了一个错误的
LOGICAL_ERROR(There was an error on <host>: Cannot obtain error message (probably it's a bug)) :当在Replicateddatabase 上运行 DDL query,且 Keeper 中按主机划分的finished状态节点已经被清理时,这个错误可能会在 debug 和 sanitizer 构建中导致服务器中止。#109192 (Groene AI). - 修复了指数部分的量级超出
Int32范围的SAMPLE比例 (例如SAMPLE 1e-3000000000) 被静默当作SAMPLE 1处理的问题。#109197 (Raúl Marín). - 修复了
SYSTEM PREWARM PRIMARY INDEX CACHE ... ON CLUSTER的访问检查,该检查此前错误地要求SYSTEM PREWARM MARK CACHEprivilege,而不是SYSTEM PREWARM PRIMARY INDEX CACHE。#109198 (Raúl Marín). - 修复了使用自定义
disksetting (SETTINGS disk = disk(...)) 创建的MergeTree表在执行ALTERqueries 时失败的问题。修复了 #63019。#109199 (Mikhail Artemenko). - 修复了一个服务端崩溃问题:当窗口上下文 (
OVER ()) 和普通聚合中的聚合函数cramersV、cramersVBiasCorrected、contingency或theilsU的状态,经由链式集合操作 (EXCEPT、INTERSECT) 或嵌套的UNION ALL组合后再被读取时 (例如通过-Merge组合器) ,会触发该问题。#109200 (Groene AI). - 修复了常量
ON条件下ANY JOIN的错误结果 (例如t1 ANY INNER JOIN t2 ON 1) :该查询此前返回的是完整笛卡尔积,而不是ANYjoin 结果。#109207 (Vladimir Cherkasov). - 修复了启用 deduplication 的异步 insert 场景下的服务端崩溃问题:当
optimize_on_insert使插入块为空时 (例如在SummingMergeTree中,行求和结果为零) ,会触发该问题。#109229 (Den Kalantaevskii). - 修复了
SYSTEM DROP REPLICA和SYSTEM DROP DATABASE REPLICA ... FROM ZKPATH:现在会在解析阶段以BAD_ARGUMENTS拒绝空的或仅包含根节点的 ZooKeeper 路径,将辅助 Keeper 路径路由到指定的 Keeper,并对 Keeper 路径进行规范化,从而避免本地自保护检查误指向目标副本或被绕过。#109230 (Groene AI). - 修复了 S3 settings 的优先级问题:按 URL 作用域配置的
<s3>endpoint 块现在优先于顶层<s3>默认值。#109251 (Bharat Nallan). - 修复了一个 bug:对于带内联
VALUES数据的INSERT INTO TABLE FUNCTION(例如remote或file) ,当服务端自行解析内联数据时 (send_table_structure_on_insert_with_inline_data = 0) ,列DEFAULT值不会生效。此前,向带有DEFAULT的非Nullable列显式插入NULL时,结果会变成0,而不是声明的默认值。现在其行为已与普通表INSERT和 HTTP 协议保持一致。#109258 (Groene AI). - 修复了在
Replicateddatabase 中,从s3Cluster(以及其他 cluster 表函数,如fileCluster/urlCluster) 执行CREATE TABLE ... AS SELECT时因NOT_FOUND_COLUMN_IN_BLOCK而失败的问题。#109266 (Groene AI). - 修复了
SHOW TABLES和SELECT ... FROM system.tables在数据湖目录数据库上返回结果不一致的问题:ClickHouse 无法读取的表现在会在两者中统一隐藏。#109273 (Smita Kulkarni). - 修复了一个 bug:当启用
enable_block_number_column或enable_block_offset_columnsetting 时,合并带有 projections 的MergeTree表会生成包含多余_block_number/_block_offset列的 projection parts。这样一来,合并后的 projection part 将不再匹配 projection 定义以及由 insert 产生的 projection parts,因此CHECK TABLE和OPTIMIZE ... DRY RUN会将其报告为 corrupted (CORRUPTED_DATA) 。#109284 (Groene AI). - 现已支持将由两个字段组成的
{key, value}记录的 Avroarray读取到 ClickHouse 的Map列中。这是 Iceberg 和 Spark 为非字符串键的MAP<K, V>生成的编码方式 (Avro 原生 map 仅支持字符串键) 。此前,这类文件可以读取为Array(Tuple(key, value)),但不能读取为Map(K, V),并会报错Type Map(...) is not compatible with Avro array。#109289 (Groene AI). - 修复了在
CREATE HYPOTHETICAL INDEX ... TYPE set(以及ngrambf_v1/tokenbf_v1) 中省略必需的索引参数时导致的 server 崩溃。此类语句现在会被拒绝,并返回清晰的错误信息。#109294 (Groene AI). - 修复了一个
LOGICAL_ERROR(Current component is empty) :当启用enforce_keeper_component_trackingserver setting 时,在将 metadata 存储于 Keeper 的MergeTree表上执行KILL MUTATION等变更操作时,可能会触发该错误。#109297 (Groene AI). - 修复了将约 2262 年之后的
ORC时间戳读取到标度小于 9 的DateTime64列时的问题。原生ORC读取器过去会先通过固定的DateTime64(9)中间值转换每个时间戳,这会在纳秒标度下导致Int64overflow,并以VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE拒绝此类值,即使请求的DateTime64标度 (例如 Iceberg 生成的DateTime64(6)) 实际上可以表示该值。现在会直接按请求的标度读取时间戳;如果连目标标度也无法容纳该值,则会遵循date_time_overflow_behavior。#109302 (Groene AI). - 作为 server 运行的
clickhouse-local(执行SYSTEM START LISTEN HTTP后) 现在会使用TabSeparated这一默认 output format 来处理 HTTP connections,与clickhouse-server保持一致,而不再使用交互式的默认格式PrettyCompact。这修复了通过 HTTP 使用clickhouse-connect等驱动连接clickhouse-local时的问题。交互式 terminal 会话仍会以PrettyCompact渲染结果。#109362 (Alexey Milovidov). - 修复了 S3 分段上传中瞬时出现的
Code: 499 ... InvalidPart(S3_ERROR) 故障。MinIO 在执行CompleteMultipartUpload时,可能会短暂地将刚上传的分片报告为缺失;现在这类错误会像已处理的NoSuchKey一样进行重试,重试次数受s3_max_unexpected_write_error_retries限制。#109364 (Groene AI). - 修复了
ALTER TABLE ... DROP COLUMN时报出的UNKNOWN_IDENTIFIER错误:当另一个列包含定义并引用内联 alias 的DEFAULT或MATERIALIZEDexpression 时,会出现此问题。#109374 (Alexey Milovidov). - 修复了在使用 two-level sets 并行 merge
uniqExactaggregate states 时的数据竞争 (以及由此导致的罕见 crash) ,该问题可能在使用GROUPING SETS、ROLLUP和CUBE时发生。#109389 (Groene AI). - 修复了在包含两个或更多分片的 cluster 上,执行从
Distributed表读取数据的CREATE TABLE ... ON CLUSTER ... AS SELECT时出现的错误 (NOT_FOUND_COLUMN_IN_BLOCK,旧版本中则为std::bad_function_call) 。#109407 (Alexey Milovidov). - 修复了带有
TTL ... GROUP BY(rollup) 的表在 merge 时的问题:已经完全聚合的分片可能会被反复重新调度进行 merge,陷入无限循环;同时,带有MATERIALIZED列或启用了持久化虚拟列的表处理也不正确——现在此类列会使用any进行聚合。关闭 #105647。#109410 (Mikhail Artemenko). #109532 (Mikhail Artemenko). - 修复了当
IN的右侧参数直接使用数组列时,会静默返回错误结果 (始终为 false) 或抛出异常的问题;现在x IN arr的行为与has(arr, x)一致。#109416 (Alexey Milovidov). - 修复了在带有基于持久化虚拟列
_block_number/_block_offset的隐式 min-max 索引 (由add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column启用) 的MergeTree表上执行ALTER TABLE操作 (RENAME/ADD/MODIFY COLUMN,以及对包含新插入数据分片的表执行MATERIALIZE INDEX) 时出现的UNKNOWN_IDENTIFIER错误。#109428 (Groene AI). #110236 (Groene AI). - 修复了对非常量
Array(LowCardinality(T))参数执行arrayFold时出现的LOGICAL_ERROR(例如arrayFold((acc, x) -> acc + x, materialize([1, 2, 3]::Array(LowCardinality(Int64))), toInt64(0))) ;此前会报错Arguments of 'plus' have incorrect data types(在 debug 和 sanitizer 构建中会导致服务器中止) 。#109462 (Groene AI). - 修复了在
ReplicatedMergeTree表上执行CHECK TABLE时,如果检查过程中出现瞬时的、可重试的 ZooKeeper 错误 (例如连接丢失) ,会将健康的数据分片误报为损坏的问题;现在这类错误会改为作为可重试的查询错误返回。#109465 (Alexey Milovidov). - 修复了
groupArrayLastMerge和聚合函数largestTriangleThreeBuckets中的段错误:现在会校验聚合函数状态的反序列化,因此损坏的状态不会再导致越界内存访问。#109485 (Miсhael Stetsyuk). #109492 (Miсhael Stetsyuk). - 修复了全局
max_rows_in_join/max_bytes_in_join限制在parallel_hashjoin 算法中未生效的问题;此前设置了join_overflow_mode = 'throw'的查询可能会静默成功,而不是抛出SET_SIZE_LIMIT_EXCEEDED。#109488 (Hechem Selmi). - 修复了读取按
BIGINT列分区且其值无法放入Int32的 Paimon 表时的问题。此前这类分区值会被截断 (例如9223372036854775807会变成-1) ,从而生成错误的分区路径并触发 filesystem 错误。#109510 (Groene AI). - 修复了读取带有 equality delete 文件的 Iceberg 表时发生崩溃的问题。如果某列在 equality delete 文件中为 Nullable,而在表结构中为非 Nullable (或反之) ,则此前从 delete 文件读取的值会通过未经检查的强制转换插入到不同类型的列中 (列类型混淆) ,从而破坏该列并导致服务器崩溃。#109551 (Miсhael Stetsyuk).
- 修复了 MySQL 的
connect_timeout、读超时和写超时不生效的问题:即使设置了connect_timeout = 1,连接无响应的 MySQL 服务器时也可能卡住超过两分钟,因为 Sampling query profiler 的周期性信号会不断重置 MySQL 客户端内部的轮询截止时间。#109592 (Shaohua Wang). - 修复了一个
LOGICAL_ERROR(creation_csn is not set while removal_csn is set to 1) :当非事务性的TRUNCATE与同一张表上一个尚未提交、但已执行插入的事务并发运行时,可能会抛出该错误。现在,这类TRUNCATE不会再移除由尚未提交事务创建的分片。#109598 (Tuan Pham Anh). - 修复了读取物理可空性与请求的 ClickHouse 类型不一致的
Parquetstruct 列时出现的TYPE_MISMATCH错误:现在,非空的Parquetgroup 可以读取为Nullable(Tuple(...)),原生Parquet读取器也可以将物理上可空的 struct (即Parquet的OPTIONALgroup) 读取为Nullable(Tuple(...))。#109615 (Groene AI). #109898 (Groene AI). - 修复了多查询流中在
INSERT ... VALUES后跟尾随 SQL 注释 (例如VALUES (1) -- comment) ,且走服务端内联 insert 解析路径 (send_table_structure_on_insert_with_inline_data = 0) 时会发生静默数据丢失的问题。此前,结束符;后的尾随注释会被扫描为行数据,导致流中的后续查询被静默跳过。#109643 (Groene AI). - 修复了一个段错误:如果启动期间发生错误,那么在 server 关闭过程中的一个极短窗口内有查询到达时,就可能触发该问题。#109675 (Miсhael Stetsyuk).
- 修复了使用
ALTER TABLE ... APPLY PATCHES物化轻量级更新后,跳数索引 (text、bloom_filter等) 和 projections 过期的问题。此前,依赖 patch 更新列的索引和 projection 文件不会被同步更新,因此使用它们的查询可能返回错误结果 (例如hasToken漏掉已更新的行,或在已耗尽的 patch part 被移除后,projection 返回过期的聚合结果) 。#109709 (Groene AI). - 修复了
system.tables的一个问题:当查询只读取name/database列时,对于拥有按 database 授权的用户,会静默跳过某些 database。该问题于 26.2 引入。#109723 (Samay Sharma). - 修复了将
LowCardinality(Time)列写入Arrowformat,且output_format_arrow_low_cardinality_as_dictionary = 1时出现的LOGICAL_ERROR。#109730 (Groene AI). - 修复了
ObjectStorageQueue/AzureQueue(以及azureBlobStoragetable function) 在对象存储返回空列表页但同时附带 continuation token 时静默跳过对象的问题。Azure Blob 存储确实会出现这种情况 (例如列表跨越内部分区边界时) ,而异步列表迭代器此前会将空页视为列表结束并丢弃该 token。现在会继续跟随 continuation token。#109761 (Gal Ben Moshe). - 修复了按时间戳 (
DateTime64) 列分区的 Iceberg tables 在进行分区裁剪时返回空结果的问题。#109764 (Den Kalantaevskii). - 修复了
convfunction 处理FixedString参数时抛出的ILLEGAL_COLUMN异常;现在它们会被正确转换为String。关闭 #109670。#109771 (hp). getClientHTTPHeader函数现在会根据 RFC 9110 将请求头名称视为不区分大小写;尤其是,authorization请求头现在无论大小写形式如何都会被过滤掉。关闭 #103957。#109791 (Mikhail f. Shiryaev) 。- 修复了
max_execution_time(配合timeout_overflow_mode = 'throw') 有时始终不会取消查询的问题:如果内部超时监视器已经在等待一个截止时间更晚的查询,随后注册的、截止时间更早的查询就可能被完全漏掉,导致其在超出时间限制后仍继续运行很长时间。#109792 (Shaohua Wang) 。 - 修复了 gzip 压缩的 Iceberg 元数据文件的文件名问题。ClickHouse 之前将其写为
v{N}.gzip.metadata.json(HTTPContent-Encoding令牌) ,而 Iceberg 规范要求使用gz扩展名,即v{N}.gz.metadata.json。因此,Spark 和其他 Hadoop catalog 读取器无法找到 ClickHouse 写入的元数据。ClickHouse 现在会写入v{N}.gz.metadata.json,同时仍支持读取旧的gzip名称,以保持向后兼容。#109812 (Groene AI) 。 - 修复了在
enable_join_runtime_filters = 1(自 26.2 起默认启用) 时,join 可能抛出的NOT_IMPLEMENTED错误 (“Method getDataAt is not supported for Nullable(String)”) :当构建侧 join 键为包含NULL值的LowCardinality(Nullable(...)),且运行时过滤器回退到其 bloom filter 时,就可能触发该问题。#109824 (Groene AI) 。 - 外部数据库引擎 (例如
PostgreSQL) 不再将UUID列上的范围比较 (>=、>、<=、<) 下推。ClickHouse 与外部数据库对 UUID 的排序方式不同,因此下推这些比较会在结果中静默丢弃行;现在这类 predicates 会改由 ClickHouse 计算。#109833 (Vismay) 。 - 修复了一个服务器崩溃问题:当在高阶函数期望具体值的位置传入 lambda 表达式时 (例如
arrayFold的累加器,即arrayFold(lambda, arr, another_lambda)) ,服务器可能会崩溃。现在,在enable_analyzer = 0时,此类查询会被ILLEGAL_TYPE_OF_ARGUMENT拒绝,而不会导致崩溃。#109840 (Groene AI) 。 - 修复了
icebergLocal表函数和IcebergLocal引擎将其 object storage 类型声明为azure而非local的问题;这会导致它们在通过SETTINGS disk = '...'使用本地 disk 时,无法通过 disk type 检查 (Disk type doesn't match) 。#109872 (Pedro Ferreira) 。 - 修复了读取按同一 source column 多次分区的 Iceberg 表时的问题 (例如
PARTITIONED BY (hours(ts), ts)) 。此前,这类表会报错Cannot add column ...: column with this name already exists (ILLEGAL_COLUMN)。#109895 (Groene AI) 。 - 修复了错误的查询结果问题:对于键列为倒序 (
DESC) 且分片没有 final mark 的表 (非自适应 granularity,index_granularity_bytes = 0) ,primary key index 会错误地裁剪 granule,从而导致查询结果错误。#109901 (Nihal Z. Miaji) 。 - 修复了
generateRandomStructure在类型嵌套超过内部深度限制时,偶尔会生成无效的结构字符串,把两个数据类型拼接在一起 (例如Decimal32(7)IPv4) ,导致结果无法解析的问题。#109928 (Groene AI). - 修复了在
Array(LowCardinality(Nullable(String)))上构建text索引 (包括以这种方式存储的Nested字段) 且被索引的数组包含NULL元素时出现的NOT_IMPLEMENTED错误 (Method getDataAt is not supported for Nullable(String) in case if value is NULL) 。现在,构建索引时会跳过数组中的NULL元素,与Array(Nullable(String))的行为一致。#110055 (Groene AI). - 修复了在
LowCardinality(Nullable(...))列上构建minmax跳过索引时返回错误结果的问题:此前,下推到存储层的WHERE/PREWHERE/HAVING ... IS NULL谓词会剪枝掉所有粒度,即使该列包含NULL值,也会返回 0 行。#110061 (Groene AI). - 修复了
distinct_overflow_mode = 'break':现在,DISTINCT会按文档所述返回达到限制前累积的部分结果,并停止读取源数据。此前,跨过max_rows_in_distinct/max_bytes_in_distinct的 chunk 会被丢弃 (导致结果被截断或为空) ,而且查询仍会继续读取并向哈希集合中插入数据直到输入结束,这可能最终导致MEMORY_LIMIT_EXCEEDED。#110075 (Sergey Kuznetsov). - 修复了对包含非 Parquet 格式 (例如
ORC) 数据文件且该文件比所有位置删除文件都新的 Iceberg 表执行OPTIMIZE TABLE时出现的逻辑错误ChunkInfoRowNumbers does not exist。#110107 (Alexey Milovidov). - 修复了
max_bytes_in_distinct和max_bytes_in_set:字符串键存储在 arena 中,而此前限制检查未将这部分计入,因此基于字符串键的DISTINCT/IN占用的内存可能会超出字节限制,超出的部分最多可达整个键的载荷大小 (键长度本身不受限制) 。现在这些限制会将 arena 计入,与文档描述一致;因此,接近字节限制的字符串键查询现在可能会更早触发限制 (这是正确的行为) 。#110120 (Sergey Kuznetsov). - 修复了当
identity(或标量子查询结果) 包装了包含嵌套LowCardinality的值,且查询使用WITH TOTALS/WITH ROLLUP时出现的LOGICAL_ERROR(Bad cast from type ColumnLowCardinality to ColumnString) 。#110138 (Groene AI). - 修复了读取内部维度大小为零的
Npy文件时的问题:物化的行数现在与优化和未优化的count结果一致。#110146 (Yanjun Qiu). - 修复了按顺序聚合中的二次时间复杂度膨胀问题 (以及对
max_execution_time不响应的问题) ,该问题会出现在按多个键分组且其排序顺序只是 grouping key 前缀时。#110159 (Alexey Milovidov). - 修复了当包含关联子查询 (例如
exists((SELECT ...))) 的过滤条件使用convert_query_to_cnf或optimize_and_compare_chain优化时出现的逻辑错误 (Unexpected number of columns in result sample block) 。#110187 (Alexey Milovidov). - 修复了一个异常 (
UNION mode UNION_DEFAULT must be normalized) :当DELETE或ALTER UPDATE变更在其WHERE条件或UPDATE赋值中使用子查询内的集合运算 (UNION/UNION ALL/UNION DISTINCT/EXCEPT/INTERSECT) 时,会触发该异常。#110196 (Alexey Milovidov). - 修复了
ReadBuffer is canceled. Can't read from it.逻辑错误 (会在 debug/sanitizer build 中导致 server 中止) :如果此前对同一 zip 归档的一次读取在流中途失败,那么之后再次读取该 zip 归档时 (例如从 zip 备份执行RESTORE期间) 可能会出现此问题。#110197 (Groene AI). - 修复了以下问题:当包含
x IN (subquery)的变更在主键分析期间构建子查询 Set 时,server 关闭缓慢且KILL MUTATION无响应;现在 Set 的构建会被及时取消。#110198 (Alexey Milovidov). - Keeper 现在会拒绝将协调设置
max_requests_batch_size和max_requests_append_size设为0,而不是像以前那样在多节点环境中卡在无限 append-entries 循环里。#110200 (Alexey Milovidov). - 修复了在元组表达式上使用
GROUP BY ALL并结合ORDER BY时出现的NOT_FOUND_COLUMN_IN_BLOCK错误。#110206 (Alexey Milovidov). - 修复了向带有引用子列的
CHECK约束的表执行INSERT时出现的NOT_FOUND_COLUMN_IN_BLOCK错误 (例如Nullable列的x.null或Array的arr.size0) 。#110208 (Alexey Milovidov). - 修复了读取默认 sort order 引用了需要加引号的列 (例如
@timestamp) 的 Iceberg 表时的问题。这类表此前无法读取,因为自动生成的存储ORDER BY是基于原始列名构建的,解析时会因SYNTAX_ERROR失败。#110233 (Groene AI). - 修复了
DataLakeCatalog(Iceberg/Glue) database 的system.tables在单个表的 metadata 无法解析时,会中止整个查询或静默丢掉该表的问题。现在,这类表仍会按名称列出;对于需要打开存储对象才能获取的列 (engine、total_rows等) ,会显示默认值/NULL,而与database_datalake_require_metadata_access无关。直接访问损坏的表仍会报错。#110242 (Groene AI). - 修复了一个可能导致崩溃的问题 (heap-buffer-overflow) :当
quantileTDigest系列聚合函数的状态列被用作GROUP BY键,并由多个 threads 并发序列化时,可能触发该问题。#110263 (Groene AI). - 修复了向 Microsoft Fabric / OneLake
DataLakeCatalog表执行INSERT时失败并报IncorrectEndpointError(HTTP 400) 的问题:原因是 ADLS Gen2 (DFS) 写入被路由到了.blobhost,而不是.dfs端点 host。注意:使用remote_url_allow_hosts时,必须将.blob(读取) 和.dfs(写入) 这两个 Fabric host 都加入INSERT的允许列表。#110290 (Mohammad Lareb Zafar). - 修复了解析某些 PRQL 查询 (
SET dialect = 'prql') 时 server 异常中止的问题。此前,prqlccompiler 内部的 panic 会直接中止进程,而不是作为查询错误报告。 #110316 (Groene AI). - 修复了这样一种静默返回错误查询结果的问题:当 projection 的列集合发生变化之前写入的 projection part (例如,跨版本升级后对
ALIAS列源列的materialize方式发生变化,或在ALTER TABLE ... MODIFY COLUMN之后,projection 使用的ALIAS列重新指向了其他源列) 通过 projection 被读取或参与 merge 时,缺失列会被默认值填充,而不是真实数据。现在,这类 part 会改为从 base table 读取,merge 也会基于基础数据重建 projection。 #110328 (Shaohua Wang). - 修复了
ORDER BY ... WITH FILL在生成大范围填充值时 (尤其是在使用INTERPOLATE时) 不遵守max_execution_time,且取消响应较慢的问题。 #110332 (Alexey Milovidov). - 修复了在 Iceberg table 上执行多命令
ALTER(如UPDATE ..., DELETE ...) 时出现的逻辑错误 (在 debug/sanitizer build 中会导致 server 中止) 。现在,这类 mutations 会被拒绝,并返回明确的NOT_IMPLEMENTED错误。 #110347 (Groene AI). - 修复了一个 parser 缺陷:当
SELECT查询在裸表标识符后直接结束时 (例如... FROM t COMMENT 'x') ,COMMENT会被错误地当作隐式别名解析,导致报出误导性的语法错误,而不是将 comment 应用到 view/table。 #110372 (Aditya Kumar). - 修复了在复制或销毁深度嵌套的
Array/Tuple/Map/Object字面量时 server 崩溃 (原生栈溢出) 的问题,例如在提高max_parser_depth后,查询中包含了极深层嵌套的字面量。 #110393 (Raúl Marín). - 修复了 vector search 可能返回少于预期行数的两种情况:小于 1.0 的
vector_search_index_fetch_multiplier值可能会将计算出的拉取数量截断为 0,从而产生空结果 (现在这类值会被拒绝) ;此外,对于LIMIT ... WITH TIES查询,现在会跳过 vector search optimization,因为该 optimization 会将搜索范围严格限制为 N 个候选项,从而丢弃与第 N 行并列的行。 #110452 (Tamish Mhatre). #110453 (Tamish Mhatre). - 修复了
IN (subquery)场景下的逻辑错误Expected CommonSubplanReferenceStep to reference CommonSubplanStep、错误Subplan cannot be used to build pipeline,以及逻辑错误Trying to extract chunk from ChunkBuffer before all inputs are finished;该问题出现在 subquery 包含 correlated subquery,且 Set 在 index analysis 期间构建时。 #110491 (Alexey Milovidov). - 修复了在命名
WINDOW子句定义中替换 query parameters 的问题。此前,这里的参数会静默地保持未替换状态,而未设置的Identifierparameter 还可能在EXPLAIN SYNTAX期间触发异常Logical error: '!part.empty()'。 #110506 (Alexey Milovidov). - 修复了 object storage disk 上
MergeTree表的 server 启动失败问题:当残留的txn_version.txt.tmp文件破坏了 disk 级 metadata 时,会导致启动失败。 #110519 (Alexey Milovidov). - 修复了文件系统缓存中的一个逻辑错误 (
Expected file ... not to exist) :当后台缓存下载因非文件系统错误而失败时 (例如在 Iceberg 表上运行OPTIMIZE时) ,可能会留下一个空的孤儿缓存文件,进而触发该错误。#110549 (Groene AI). - 修复了读取已损坏的
Native格式 stream 时的问题:当其Dynamictype 计数或JSON/Object路径计数接近SIZE_MAX时,这类格式错误的输入现在会被明确地以INCORRECT_DATAerror 拒绝,而不再触发未捕获的std::length_error。#110590 (Alexey Milovidov). - 修复了
MaterializedPostgreSQL数据库引擎中的服务端崩溃问题:当某个表仍在同步队列中时,如果该表被 detached (或其结构发生变化) ,就可能触发该问题。#110596 (Alexey Milovidov). - 修复了客户端中的
SET param_<name>(以及--param_<name>标志) 在参数名与内置 setting name (如limit、offset、max_threads或log_comment) 冲突时行为异常的问题。根据冲突的 setting 不同,查询可能因CANNOT_PARSE_QUOTED_STRING而失败,值可能被静默归一化 (例如max_threads=0变为auto(N)) ,或者 setting 别名名称丢失。此类参数还会导致同一会话中后续所有SET param_*都失效。#110597 (Raúl Marín). - 修复了读取带有
DEFAULTexpression 且未在 part 中 materialized 的列的 subcolumns 时的问题 (例如在ALTER TABLE ADD COLUMN之后,或在ALTER TABLE MATERIALIZE COLUMN期间) :此前 subcolumn 会被填充为类型默认值,而不是计算后的DEFAULTexpression;并且在这类QBit列上使用转置向量距离函数 (cosineDistanceTransposed等) 时,会报SIZES_OF_ARRAYS_DONT_MATCHerror。此修复关闭了 #110634。#110636 (Alexey Milovidov). - 修复了一个
LOGICAL_ERROR:Invalid partition key size: 0。当向启用了non_replicated_deduplication_window的分区MergeTree表执行INSERT时,如果某个 async insert 批次只被部分去重 (某些insert_deduplication_token值重复,而另一些是新的) ,则可能导致插入失败。#110651 (Groene AI). - 后台 asynchronous insert flush 现在在通过
KILL QUERY终止时会立即停止;此前,大型缓冲负载的 flush 会一直解析到末尾,并忽略取消信号。#110652 (Shaohua Wang). - 修复了在
partial_mergeJOIN 之上使用optimize_aggregation_in_order的GROUP BY以及使用optimize_distinct_in_order的DISTINCT返回错误结果的问题。按序读取优化被传播到了 partial-merge join,但后者会按 join key 对左侧输入重新排序,因此不会保留左侧 stream 的原始顺序,最终导致行分组错误。#110671 (Groene AI). - 修复了
toStartOfInterval中的有符号整数溢出问题:当在Date/Date32/DateTime64值上使用极大的MONTH、WEEK或DAY时间间隔计数时,可能触发该问题。#110688 (Groene AI). - 修复了在并行副本以
custom_key_sampling/custom_key_range模式运行时,FROM中包含子查询的查询会报NOT_FOUND_COLUMN_IN_BLOCK错误的问题。此类查询 (例如SELECT * FROM (SELECT id, k, v FROM t WHERE id < 20) ORDER BY k) 此前会因Not found column __table2.id in block ...而失败。#110690 (Groene AI). - 修复了
readWKT会拒绝带前导空白的 WKT 字符串 (例如readWKT(' POINT(1 2)')) 的问题,而带类型的readWKTPoint/readWKTPolygon/… 读取器以及 WKT 语法本身都接受这类字符串。#110706 (Groene AI). - 修复了一个逻辑错误 (
Column ... already added for reading,会在 debug/sanitizer 构建中导致 server 中止) :当查询一个位于Distributed表之上的Merge表,并在查询的PREWHERE和WHERE中同时使用同一个文本索引谓词时,会触发该错误。#110710 (Groene AI). - 修复了在启用并行副本时,对
QBit列调用转置距离函数 (例如cosineDistanceTransposed) ,并传入标量子查询或常量参考向量时出现的NOT_FOUND_COLUMN_IN_BLOCK错误。此修复关闭了 #110719。#110729 (Alexey Milovidov). - 修复了
ReplicatedMergeTree上一个罕见的LOGICAL_ERROR(Unexpected number of parts to remove from parts_queue;会在 debug/sanitizer 构建中导致 server 中止) :当两个分区操作 (例如两个MOVE PARTITION/REPLACE PARTITION查询,或其中一个与后台DROP_RANGE竞争) 同时取消对重叠范围的后台 parts 检查时,就会触发该问题。#110738 (Groene AI). - 修复了一个可能出现的
Hash is not set for serialization逻辑错误:当带有Quantized(...)codec 的列被包裹在另一层 serialization 中时,就可能发生这种情况;例如在一个Merge表中,其 sources 里的同名列类型不同 (并合并为一个Variant) 。#110776 (Groene AI). - 修复了将
median/quantileaggregate function 的状态与超大的整数常量相乘时 server 挂起的问题 (例如medianState(x) * 18446744073709551615) 。该查询会对取消操作失去响应,并且可能无限期运行。#110779 (Groene AI). - 修复了在消耗一个长度为零的配额时间间隔时 server 崩溃的问题 (整数除零,例如
CREATE QUOTA q FOR INTERVAL 0 SECOND MAX queries = 1000) 。现在,在创建配额时会拒绝非正的配额时间间隔时长。#110846 (Pedro Ferreira). - 修复了当
col为LowCardinality时,throwIf(notLike(col, pattern))(以及其他作用于函数结果的throwIf) 会无条件抛出的问题。默认的LowCardinality实现会对整个字典运行throwIf``,而该字典即使没有任何行引用,也始终包含保留的默认值,因此这个未使用槽位中的非零值会导致throwIf` 对实际上并不满足该条件的数据也抛出异常。#110864 (Groene AI). - 将查询的已启用角色 (
SET ROLE或role参数) 传递到使用 interserver secret 保护的集群中、在 parallel-replica 和Distributed读取时的远程节点;此前远程节点会回退到用户的默认角色,导致其评估行策略时与发起节点不一致。#110867 (Nikolay Degterinsky). - 修复了 Iceberg 表在初始 schema 包含嵌套 field (
Tuple/Array/Map) 时,执行ALTER TABLE ... ADD COLUMN后生成重复 field ID 的问题。现在last-column-id会记录已分配 field ID 的最大值 (包括嵌套子项) ,因此后续新增的列不再重用嵌套 field ID,读取时也不会再因ICEBERG_SPECIFICATION_VIOLATION(Duplicate field id) 而失败。#110884 (Groene AI). - 修复了在 FIPS 构建中使用 Ed25519 SSH key (
CREATE USER ... IDENTIFIED WITH ssh_key ... TYPE 'ssh-ed25519',或在users.xml中使用此类 key) 时发生的崩溃。Ed25519 不属于 FIPS 批准的算法;现在这类 key 会被明确地以LIBSSH_ERRORerror 拒绝。#110891 (Konstantin Bogdanov). - 修复了对
QBit列 (cosineDistanceTransposed、L2DistanceTransposed、dotProductTransposed) 执行转置距离函数时结果精度下降的问题。此前,截断到precisionbit planes 的值会通过将丢弃的比特补零来重建,这会使每个重建值都向零偏移,并在低精度下出现退化:对于QBit(BFloat16)且 precision 为 1 时,只剩下符号位,因此每个值都会被重建为±0.0,距离对每一行都是相同的常数,不包含任何排序信息。现在,截断值会被重建到剩余精度单元的有界中点 (原始Int8编码重建到其单元中心;精确的零值和无穷大保持不变) ,因此较小的precision只是以准确性换取速度,而不会产生严重偏置的结果。全精度结果不受影响。此修复关闭了 #110898。#110911 (Alexey Milovidov). - 修复了一个 server 崩溃问题 (use-after-free) :在同时使用 temporary tables 的会话中查询过 Iceberg 表后,执行优雅关闭时会触发该问题。#110914 (Miсhael Stetsyuk).
- 修复了在合并以旧版 (version 0) 状态格式序列化、且包含
Bool值的sumMap/sumMapWithOverflow/sumMapFilteredaggregate states 时出现的LOGICAL_ERROR: Cannot sum Bools问题 (在 debug/sanitizer 构建中会导致 server 中止) 。同一修复还纠正了 version-0Boolstate 的两个静默错误结果场景:类型为Bool的 map key 在不同 state 之间不会被去重,以及零值合并整理会丢弃错误的条目。#110922 (Groene AI). - 修复了 aggregate function 配合
-Tuple组合器、使用RESPECT NULLS并生成中间 state (-State、分布式 aggregation、WITH ROLLUP/WITH CUBE) 时发生的崩溃。此前,组合后的函数以错误的 state 变体命名,导致其序列化后的AggregateFunctiontype 在 round-trip 后重新解析为不兼容的内存布局。#110930 (Groene AI). - 修复了一个问题:对于因 schema evolution 而重命名的 Iceberg 列,
PREWHERE(以及行级 policies) 在旧数据文件上会静默返回0行。现在此类查询会返回正确的行,与WHERE一致。#110941 (Groene AI). - 修复了一个
LOGICAL_ERROR(LazyMaterializingTransform: Number of rows in lazy chunk N does not match number of offsets M) :在vector_search_with_rescoring = 1且启用 lazy materialization 的向量搜索查询中,如果有多个距离并列,可能会触发该错误。#111003 (Groene AI). - 修复了读取由 Apache Arrow Java < 19.0.0 (随 Apache Spark 一起打包) 生成的
Arrow/ArrowStream数据时的问题;这类数据包含空的嵌套Array/Map列,此前会因 offsets 缓冲区过小而报INCORRECT_DATA错误并被拒绝。#111101 (Raúl Marín). - 修复了在启用 page cache 的
plain_rewritabledisk 上出现的 stale reads 问题。#111105 (Mikhail Artemenko). - 修复了在 distributed queries 以及启用并行副本的查询中,
Variant类型 (包括Geometry) 常量触发的CANNOT_CONVERT_TYPE错误。#111136 (Nikita Fomichev). - 修复了一个 bug:从 HDFS 读取大文件时,如果单个读取请求超过
hdfsPread的 32 位大小限制 (INT_MAX) ,可能会失败或读取错误。#98470 (Arup Chauhan). - 修复了使用空 needle 进行相等比较时,text index 使用不正确的问题。#108340 (Robert Schulze).
- 修复了
SYSTEM SYNC MERGES在使用Manual合并选择器时卡住的问题:当计划中的 merge 无法放入已满的 background pool 时,就会出现该问题。#108770 (Alexey Milovidov). - 修复了
ATTACH TABLE ... AS REPLICATED的问题:如果某个数据分区片段上残留了 stale 的txn_version.txt.tmp文件,就可能丢弃已 committed 的数据,并恢复到变更前的行。#108772 (Alexey Milovidov). - 修复了非复制表
MergeTree表中ALTER TABLE ... MOVE PARTITION TO TABLE的一个潜在竞态条件。此前由于被移动 parts 的 commit 与 block number 分配不在同一把 lock 的保护下,可能会产生相交的数据分区片段。#108922 (Mikhail Artemenko). - 修复了读取由 Databricks UniForm 写入的
Iceberg表时的问题;这类写入会在 manifest files 中写入退化的 placeholder schema (字段列表为空) 。#108945 (Konstantin Vedernikov). - 修复了使用多线程读取非分区
Hive表时的 use-after-free 问题。#109164 (Alexey Milovidov). - 修复了设置
logger.startup_console_log_level后,server 启动完成后 console 日志级别未恢复的问题:此前错误地从别的 configuration 键读取了级别,导致 console 在 server 的整个 lifetime 内一直保持在提升后的 startup level。关闭 #103472。#109858 (Garrett Thomas). - 修复了
plain_rewritabledisk metadata 事务中的 snapshot isolation 异常。修复 #92055。#110948 (Mikhail Artemenko). - 修复了
clickhouse-client --login中的一个中止错误 (front() called on an empty vector) :当主机不是通过显式--host参数传入,而是来自--connection、配置文件或CLICKHOUSE_HOST环境变量时,会触发该问题。关闭了 #103603。#110279 (Christoph Wurm) 。 - 修复了这样一种逻辑错误 (
!part.empty()) :lambda 参数是一个用反引号括起来、且名称中包含点的标识符 (例如__table1.) 时会触发。此前,这类查询在 release 构建中会抛出一个已处理的异常,并在格式化错误消息时导致服务器在 debug 和 sanitizer 构建中中止。#108735 (Groene AI) 。 - 修复了以下场景中的
LOGICAL_ERROR(No set is registered for key) :表中存在ALIAS列,且其表达式使用了INoperator (包括经由另一个ALIAS列间接使用) 时,执行ALTER TABLE ... DROP COLUMN、ALTER TABLE ... DELETE/UPDATE变更以及轻量级DELETE FROM会触发该错误。#111039 (Pedro Ferreira) 。 - 修复了异步插入与去重 (
async_insert=1,async_insert_deduplicate=1) 场景下的静默数据丢失问题。当多个insert_deduplication_token值不同的 async-insert 条目被合并为一次 flush,且写入互不相交的分区时,每个标记都会被登记到此次 flush 涉及的所有分区的去重日志中,而不是只登记到其自身行实际写入的分区。这样一来,后续如果在某个它实际上从未写入过的分区中复用其中一个标记进行插入,该插入就会被静默去重。现在,标记只会登记到其行实际写入的分区。关闭了 #111031。#111049 (Groene AI) 。 - 修复了在 experimental setting
make_distributed_plan = 1下,查询基于Distributed表或视图的Merge表时出现的LOGICAL_ERROR异常 (ScatterExchangeStep should have one source shard, got 8) 以及重复行问题。关闭了 #107946。#108401 (Groene AI) 。 - 将
Nullable(Tuple(...))列序列化为单个CSV字段,而不是将其展平为多个列。此前,非 NULL 值会被写成多个CSV字段,而NULL则写成单个\N,导致列数因行而异,从而破坏了CSVWithNames/CSVWithNamesAndTypes头部以及 round-trip。#108959 (Groene AI) 。 - 修复了
Parquetv3 读取器中的一个逻辑错误 (KeyCondition uses PREWHERE output) :当格式级别的键条件引用了一个未从Parquet文件读取的列时会触发该错误。#109267 (Groene AI) 。 - 修复了在
serialize_query_plan = 1下,带有FINAL或SAMPLE的表函数读取返回错误结果的问题。同时还修复了表函数的 aggregation 哈希表统计缓存键,使不同表函数不再共享同一个预分配条目。#109847 (Azat Khuzhin) 。 - 修复了在最终完成前失败的
BACKUP ... TO Memory(...)的清理问题:失败的备份此前会一直保持已注册状态,因此其名称无法复用。#109947 (Julia Kartseva) 。 - 修复
WITH FILL STEP和add*/subtract*日期/时间 interval 函数中的极端 interval 运算问题:超出范围的 delta 不再依赖有符号溢出,使用巨大YEARstep 的WITH FILL也不再因日历向后推进而卡住。#110158 (Groene AI). - 修复来自 Azure 服务的
411 Length Required错误:基于 Poco 的 Azure HTTP 传输现在会根据 request body 为未自行设置Content-Length的 SDK clients 设置该值,例如 Azure Key Vault。#110299 (Konstantin Bogdanov). - lazy
FINAL优化 (query_plan_optimize_lazy_final,默认禁用) 在查询按 sorting-key 顺序读取时不再应用,因为其替代查询计划无法保留该顺序,可能返回顺序不正确的结果。此外,当小于待读取行数的LIMIT直接作用于读取步骤时,也不再应用该优化,因为强制执行的 Set 构建过程会抵消提前终止带来的收益。#110576 (Nikolai Kochetov). - 修复
readWKT和readWKTPoint在处理POINT EMPTY时返回未初始化的 (标量) 或前一行残留的 (向量化) 坐标的问题。由于 ClickHousePoint是固定的Tuple(Float64, Float64),没有空值表示,因此POINT EMPTY现在会以CANNOT_PARSE_TEXT被拒绝。#110692 (Groene AI). - 修复在 hash joins 中 materializing 右侧列时 timezone 处理错误的问题。关闭 #111033。#111074 (Yarik Briukhovetskyi).
- 修复当
String(或更窄的FixedString) 键或 minmax 跳过索引 与更宽的FixedString常量比较进行过滤时,出现错误count()结果和行丢失的问题,例如toFixedString('abc', 257) = string_col。主键和 minmax pruning 会基于经 NUL 填充的常量构建范围,并错误地跳过匹配的粒度。#111106 (Groene AI). - 修复异步
Native格式 inserts 的问题:在ALTER ... MODIFY COLUMN之后变得不兼容的单个缓冲条目,不再导致整个批次失败。关闭 #111064。#111108 (Mikhail f. Shiryaev). - 修复将字典 与另一类对象执行
CREATE OR REPLACE时的问题:替换已 committed 后,会因CANNOT_DETACH_DICTIONARY_AS_TABLE失败,并留下一个孤立的_tmp_replace_*表。#111142 (Nikolay Degterinsky). - 修复在
Joinengine 表上执行ANYjoin 时出现的INCOMPATIBLE_TYPE_OF_JOIN:当右侧列上的WHERE过滤器 允许 planner 将 join Rewrite 为SEMI或ANTI时会触发该问题。Joinengine 表具有固定声明的 strictness,无法更改,因此现在会拒绝对此类表执行该转换。#111362 (Groene AI). - 修复
formattable function 在输入数据 parse 后为零行时不返回任何列的问题 (例如空 JSON 文档,或不包含任何 feature 的 GeoJSONFeatureCollection) 。现在它会返回带有正确列的空结果,而不是抛出NOT_FOUND_COLUMN_IN_BLOCK。关闭 #111390。#111428 (Groene AI).
构建/测试/打包改进
- Sanitizer 构建现在会将 sanitizer 报告捕获到全局缓冲区
sanitizer_report中,以便 core dump 分析器能够从 core dump 中读取该报告。#109333 (Miсhael Stetsyuk) 。 - 改为从源码构建
musl,不再使用 vendored 二进制文件。#97452 (Konstantin Bogdanov) 。 - 使用 LLVM-libc 提供的 SIMD
memcmp/memcpy/memmove/memset/bcmp/memmem实现。#107566 (Konstantin Bogdanov) 。修复了在支持 AVX-512 的机器上,-O0调试构建 (-DDEBUG_O_LEVEL=0) 中memmove发生静默损坏的问题。#110904 (Konstantin Bogdanov) 。 - 移除了代码库及捆绑第三方库中对
curl库的使用。#108296 (Konstantin Bogdanov) 。 - 将
mariadb-connector-c更新至 3.4.9。#108328 (Konstantin Bogdanov) 。 - 将
libssh更新至 0.12.0。#108329 (Konstantin Bogdanov) 。 - 修复了 macOS 上事务
COMMIT时发生卡顿的问题。#108375 (Raúl Marín) 。 - 新增了
COMPRESS_DEBUG_SECTIONSCMake 选项,用于压缩目标文件中的 DWARF 调试段 (-gz) ;在编译器支持时会自动启用,以缩小 Debug 构建目录;最终二进制文件保持未压缩,因此不会影响运行时堆栈跟踪的符号化。#109306 (Murphy) 。此外,捆绑的 LLVM 工具链现已使用 zlib 构建,因此其 clang 支持-gz=zlib,并补上了缺失的clang++-21符号链接。#109596 (Murphy) 。 - Debug 构建现在会以精简调试信息 (
debug = 1,cargo 的limited级别) 且不使用增量缓存 (REDUCE_RUST_DEBUG_INFO,默认开启) 的方式编译 vendored Rust crate,从而缩小 Rust 构建制品体积 (全新构建时约从 12 GB 降至 7 GB) ,并防止 cargo 缓存在重复构建过程中无限增长。设置-DREDUCE_RUST_DEBUG_INFO=OFF可恢复完整 DWARF 和增量编译。#109471 (Murphy) 。 - 支持 macOS 上的流式分布式查询交换和
STREAM读取。#109769 (Raúl Marín) 。 - 将
libarchive从 3.8.7 升级至 3.8.8。#109874 (Robert Schulze) 。 - 将
c-ares从 1.34.6 升级至 1.34.8。#109905 (Robert Schulze) 。 - 更新
krb5以修复 CVE-2026-40355 和 CVE-2026-40356。#109910 (Robert Schulze) 。 - 移除了
libpng这一第三方依赖。FORMAT PNG现在改用一个小型内置 PNG 编码器 (由随附的 zlib 提供支持) 。#110051 (Alexey Milovidov). - 在 macOS 上,通过封装 jemalloc 的 malloc zone,可在 memory tracker 中跟踪原始 C 内存分配 (不经过
operator new) ,从而对这部分内存强制执行 memory limit。#110370 (Raúl Marín). clickhouse-server和clickhouse-keeper的-distrolessDocker image 现在从不含 shell 的 production stage 构建;此前它们是从 debug stage 构建的,并包含/busybox/sh。关闭 #105677。#105678 (ashishch432).- 将
abseil-cpp更新至 LTS20260526.0。#108991 (Konstantin Bogdanov).
向后不兼容的变更
- 此项变更移除了
allow_experimental_query_deduplication功能。该功能长期处于实验阶段,没有测试,也不会再提供支持 (最初的测试不稳定,已在 #49579 中移除) 。#99398 (Igor Nikonov) 。 - 基于 XRay 的
SYSTEM INSTRUMENT功能现已使用arguments替代parameters:system.instrumentation.parameters列已重命名为arguments,SYSTEM INSTRUMENT ADD ... HANDLER PARAMETERS ...语法也已改为SYSTEM INSTRUMENT ADD ... HANDLER ARGUMENTS ...。使用旧列名或旧语法的查询及自动化脚本必须更新为新名称;旧名称已不再受支持。#103854 (Pablo Marcos) 。 - 设置
show_data_lake_catalogs_in_system_tables已重命名为show_remote_databases_in_system_tables,且适用范围已扩大:当其值为 0 (默认值) 时,除了数据湖目录之外,MySQL和PostgreSQL数据库也会从system.tables、system.columns和system.completions中隐藏。旧设置名保留为别名。#104416 (Pablo Marcos) 。 - 默认的 x86 构建现已以 x86-64-v3 (AVX2) 为目标,而不是 x86-64-v2 (SSE4.2) 。这要求 CPU 支持 AVX2 (Intel Haswell 或更新架构,AMD Excavator 或更新架构) 。如果你的 CPU 不支持 AVX2,请使用以标准 x86-64 为目标的
amd64compat构建。#105019 (Raúl Marín) 。 - 在
min/max聚合和minmax索引中,现会拒绝嵌套的Dynamic/Variant。此前只会检查顶层的Dynamic/Variant。关闭 #104747。#105468 (Pavel Kruglov) 。 icebergHash和icebergBucket现在会对Int128、UInt128、Int256、UInt256和Decimal256参数显式报错并拒绝处理。此前它们会静默截断更宽的值,从而产生哈希冲突。Iceberg spec 仅定义了 32/64 位整数以及精度最高为 38 的 Decimal 的哈希;对于能够容纳的值,可转换为Int64或Decimal128以保持之前的行为。#105866 (Raúl Marín) 。- 在命令行客户端中新增了对查询回显的细粒度控制。
--echo选项现在可接受可选布尔值,并且在交互模式和批次模式下都可用。新增的--echo-formatted和--echo-query-id选项分别控制是否格式化回显的查询,以及是否打印query_id。--hilite/--highlight选项现在也会控制回显查询的高亮显示。连带影响是,--echo现在是一个布尔值选项,因此紧跟在裸--echo后面的定位查询会被视为它的值;请改用--echo --query "..."或--echo=false。#106191 (Alexey Milovidov) 。 - 已移除实验性的 KQL (Kusto) 函数
array_sort_asc和array_sort_desc,以及它们的 SQL 后端kql_array_sort_asc和kql_array_sort_desc。这些函数属于实验性功能,实现质量较低,并且是正确性问题和解析器错误的来源。现在,使用这些名称的查询将返回UNKNOWN_FUNCTION。#108101 (Groene AI) 。 - 当源表在所请求的分区中没有 parts 时,
ALTER TABLE ... REPLACE PARTITION ... FROM ...不再静默删除目标端分区中的数据。此前,这类请求会删除目标端分区,却不会写入任何替代内容——这很容易误操作导致数据丢失。现在默认会以BAD_ARGUMENTS拒绝该操作。若要恢复此前的静默清空行为,请设置新设置allow_replace_partition_from_empty_source = 1,或将compatibility设为26.5或更低;若要显式删除目标端数据,请使用ALTER TABLE ... DROP PARTITION。#104939 (Groene AI). - 服务器级设置
insert_deduplication_version的默认值已从compatible_double_hashes更改为new_unified_hash。插入去重现在基于整个插入块 (每次 insert) 生效,而不是基于每个 part/分区:对同一次 insert 的 retry 仍会被去重,但两个不同的 insert 即使生成了相同的 part,也不再进行跨 insert 去重;此外,相同行以不同顺序插入时,也不再被去重。将insert_deduplication_version = compatible_double_hashes可恢复此前的行为。对于从默认值为old_separate_hashes的版本直接升级的实例,在依赖new_unified_hash之前,应先使用compatible_double_hashes运行,直到相关的最长去重窗口结束。#107886 (Sema Checherinda).
新特性
- 新增了对
MergeTree表上连续查询的支持,该功能通过一系列快照读取实现。这是朝着全面支持流式查询迈出的第一步。#105114 (Mikhail Artemenko). - 新增了假设 (what-if) 跳过索引。使用
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ...定义会话级的虚拟跳过索引,然后使用EXPLAIN WHATIF SELECT ...在无需实际 materialize 的情况下估算其跳过率和成本。已定义的索引可在新的system.hypothetical_indexes表中查看。#104608 (Yarik Briukhovetskyi). - 在
clickhouse-server中新增了内嵌的/schemaWeb UI,用于可视化表、materialized view、可刷新materialized view、字典、分布式表和视图之间的依赖关系图。#105276 (Nikita Mikhaylov). - 新增了对
PNG输出格式的支持,允许将查询结果直接渲染为 PNG 图像。#74691 (Maksim Dergousov). - 新增了对调用
clickhouse-client或clickhouse-local的 AI 编码 agent (Claude Code、Cursor、Codex、Gemini CLI、Goose 等) 的检测,依据为环境变量。检测到的 agent 会记录在system.query_log、system.query_thread_log和system.processes的新client_agent列中。#106619 (Alexey Milovidov). - 新增了系统表
system.documentation,将系统通用组件 (函数、表引擎、数据类型、settings、formats 等) 的内嵌参考文档汇总到一张表中,文档以 Markdown 形式呈现。#107463 (Alexey Milovidov). - 新增了
GeoJSON输入格式,用于读取 GeoJSONFeatureCollection文档,并为每个 feature 生成一行,其中包含id(String)、geometry(Geometry) 和properties(Nullable(JSON)) 列。Point、LineString、MultiLineString、Polygon和MultiPolygon几何体会被读入 ClickHouse 原生的Geometry类型。默认情况下,GeometryCollection和MultiPoint(Geometry类型无法表示这两种类型) 会引发异常;也可以通过input_format_geojson_unsupported_geometry_handling设置将其存储为NULL。此项改进对 #91533 有所贡献。#98124 (Mark Needham). - 新增了可直接通过 SQL 提供 Mapbox 矢量瓦片的函数:
MVTEncodeGeom会将几何体投影到 slippy map 瓦片的像素空间并进行裁剪,MVTEncode会将一组投影后的几何体聚合为单图层瓦片的二进制字节,而MVTBoundingBox/MVTBoundingBoxMercator会返回瓦片的 bounding box,以便将行限制在该范围内。支持 Point、line 和 polygon 几何体。同时也提供 PostGIS 别名ST_AsMVTGeom和ST_AsMVT。#106107 (Saarthak Gupta). clickhouse-local现在支持SYSTEM START LISTEN和SYSTEM STOP LISTEN查询,使其能够转变为接受 TCP 和 HTTP 连接的服务器。#101143 (Alexey Milovidov).- 为
clickhouse-client和clickhouse-local新增了交互式help命令。输入help <name>(也可使用/help、man、/man) 后,会在终端中显示函数、表引擎、数据类型、格式、设置或其他组件的文档,文档由 Markdown 渲染,并带有 SQL 语法高亮。若名称有歧义,则会显示所有匹配项;若未找到,则会提示相近名称。#108042 (Alexey Milovidov). - 支持写入 Azure Data Lake Storage Gen2。#105406 (Konstantin Vedernikov).
- 新增
RowBinaryWithNamesAndTypesAndDefaults格式,以更好地支持 schema evolution。#105736 (Mark Zitnik). - 在
ALTER TABLE查询中实现了ADD ENUM VALUES,从而简化向现有Enum类型追加新值的操作,无需再次指定当前所有Enum值。#93830 (Ilya Golshtein). - 可刷新materialized view 现已支持
REFRESH DEPENDS ON,可在另一个 RMV 刷新时触发刷新,而不再依赖基于时间的调度。 (REFRESH EVERY ... DEPENDS ON之前已存在,但无法在该用例中可靠使用。) 请参阅CREATE MATERIALIZED VIEW文档。#104440 (Michael Kolupaev). - 新增支持按名称模式选择列,可使用
* LIKE '<pattern>'和* ILIKE '<pattern>',也包括限定形式,例如table.* LIKE '<pattern>'和table.* ILIKE '<pattern>'。LIKE按区分大小写方式匹配列名,ILIKE按不区分大小写方式匹配。#104569 (Yue Ni). - 新增
ESCAPE语法,可在LIKE模式中定义自定义转义字符,从而将%和_视为普通字符而非通配符。#99774 (Ilya Yatsishin). - 新增
materialize_projections_on_insert和materialize_projections_on_merge两个MergeTree表设置。当materialize_projections_on_insert = 0时,INSERT会跳过构建 projection parts,从而提升拥有大量 projections 的表的插入吞吐量。当materialize_projections_on_merge = 1时,如果某个 projection 在其所有源 parts 中都缺失,则 merge 会重建该 projection,因此 projections 可以在 merges 期间构建,而不是在 insert 时构建。merges 仍然只会合并具有相同 projection 集合的 parts。#100993 (Christoph Wurm). - 新增一个不可变的
MergeTree设置allow_tuple_element_aggregation,默认禁用。启用后,SummingMergeTree、AggregatingMergeTree和CoalescingMergeTree会递归展平Tuple列,并在 merges 期间对每个叶子元素分别进行聚合,就像它们是顶层列一样——SummingMergeTree对其求和,AggregatingMergeTree合并其聚合函数状态,而CoalescingMergeTree保留其最后一个非 NULL 值。该设置必须在建表时指定;对于不支持该设置的引擎,会静默忽略。#98039 (johnjing). - 新增函数
quantizeBFloat16ToInt8和dequantizeInt8ToBFloat16:一种标量编解码器,使用 256 级高斯 Lloyd-Max 量化器将 embedding 分量压缩为 8 比特,并可通过比特截断从中提取 Int4/Int2/binary 编码。#108102 (Alexey Milovidov). - 添加函数
arrayTopK和arrayBottomK:-arrayTopK(k, array)按降序返回最大的 K 个元素 -arrayBottomK(k, array)按升序返回最小的 K 个元素。#104563 (Vitaly Baranov) 。 - 新增系统表
system.iceberg_files,用于公开Iceberg表的每文件元数据;在每个表的当前快照中,每个数据文件或删除文件各对应一行。此项关闭了 #98777。#104415 (Asya Shneerson) 。 - 新增
system.constraints表,提供所有表上的全部CHECK和ASSUME约束信息,包括约束名称、类型和表达式。#105337 (Pedro Ferreira) 。 - 新增
system.dictionary_layouts表,列出可用的字典布局及其内嵌文档 (description、syntax、examples、introduced_in、related) 。#106182 (Alexey Milovidov) 。 - 新增
system.dictionary_sources表,列出可用的字典源及其内嵌文档 (description、syntax、examples、introduced_in、related) 。#106184 (Alexey Milovidov) 。 - 新增
system.data_skipping_index_types表,列出可用的数据跳过索引类型及其内嵌文档 (description、syntax、examples、introduced_in、related) 。#106186 (Alexey Milovidov) 。 - 新增
system.disk_types表,列出可用的磁盘类型及其内嵌文档 (description、syntax、examples、introduced_in、related) 。#106187 (Alexey Milovidov) 。 - 实现了
SYSTEM RESTART DISK <name>:现在它会重新加载磁盘的内存中元数据,并重新扫描位于其上的只读副本表的数据分区片段。这样一来,位于共享plain_rewritable存储上的表的只读副本便可按需感知另一台服务器写入的数据,而无需等待refresh_parts_interval或重启服务器。#106645 (Jordi Villar) 。 - 现已支持 PostgreSQL 风格的
expr OP SOME(array)/expr OP ALL(array)(右侧为非 subquery) 。对于=/<>,会将其重写为has/NOT has;对于其他 comparison operators,则会重写为arrayExists/arrayAlllambda。由于any同时也是 aggregate function,因此 array form 不接受ANY;请改用SOME。ANY/SOME/ALL的 subquery form 仍会被降为IN/NOT IN。#105129 (Alexey Milovidov) 。 - 新增两种
load_balancing策略:hostname_longest_common_prefix和hostname_longest_common_suffix。它们会优先选择与 initiator 的 hostname 具有最长公共前缀 (或后缀) 的副本。当数据中心被编码在 hostname 的前缀或后缀中,且其中数字段长度可变时,这些策略非常有用;在这种情况下,现有的nearest_hostname和hostname_levenshtein_distance策略可能会选错副本。#107360 (Denny [DBA at Innervate]) 。 - 向
system.session_log表添加了 TLS 客户端证书信息 (subject、序列号、签发方和有效期) ,以提升基于证书的身份验证的可观测性。#107679 (Alexey Milovidov) 。 - 为
S3的基于角色的访问新增了可选的external_id凭证。#106941 (Elian Gidoni) 。 - 新增了
S3Queue设置after_processing_move_preserve_path。当它与after_processing='move'和after_processing_move_prefix一起启用时,已处理对象在移动时会保留其在目标前缀下的完整源路径,而不是被扁平化为仅保留文件名。#105354 (Asya Shneerson) 。 - 新增
message_queue_disable_insertion服务器设置,用于禁用消息队列引擎 (Kafka、RabbitMQ、NATS) 向已附加的 materialized view 插入数据。适用于只读副本场景。#104911 (JIaQi Tang) 。 - 新增了
LOCALTIME和LOCALTIMESTAMP(SQL 标准 / PostgreSQL 语法) 。LOCALTIMESTAMP是now()的别名 (返回DateTime) ;LOCALTIME返回当前时刻的当日时间,类型为Time。#106139 (Thomas Cabral) 。 - 新增
date_part('unit', expr),作为EXTRACT(unit FROM expr)的语法糖。支持所有标准时间间隔类型,以及 PostgreSQL 的扩展项 (epoch、dow、doy、isodow、isoyear、century、decade、millennium) 。#105127 (Alexey Milovidov) 。 - 新增与 PostgreSQL 兼容的
EXTRACT(TIMEZONE_HOUR FROM dt)和EXTRACT(TIMEZONE_MINUTE FROM dt),用于提取时区偏移的小时和分钟部分;同时支持EXTRACT(<unit> FROM INTERVAL n <unit>)/date_part('<unit>', INTERVAL n <unit>),用于从时间间隔中提取值。#106227 (Vinayak Joshi) 。 - 为
argMin和argMax新增了聚合别名min_by和max_by。#105712 (Joey Yu) 。这些别名很蠢,真正的工程师都用 ClickHouse 原本的名称。 - 新增
REGEXP_SUBSTR,作为regexpExtract的不区分大小写别名,以兼容 Oracle/MySQL/Snowflake。#105122 (Alexey Milovidov) 。 - 新增
SESSION_USER,作为currentUser()的不区分大小写别名,以兼容 PostgreSQL / SQL 标准。#106081 (Takumi Hara) 。 - 现在支持在
ALTER TABLE ... ADD/MODIFY COLUMN中使用末尾的NULL/NOT NULLmodifier,与CREATE TABLE保持一致。#106150 (Takumi Hara) 。 - 现在可以使用 h3 的
h3PolygonToCellsWithContainment函数来采用其新算法,该算法支持基于中心、完全包含和重叠这几种包含模式。#104455 (Youssef Kadry) 。 - 当按
IP_ADDRESS或FORWARDED_IP_ADDRESS进行键控时,新增IPV4_PREFIX_BITS and IPV6_PREFIX_BITS标志。#89270 (Aditya Chopra) 。 formatReadableTimeDelta现在接受除Month和Year之外其他类型的INTERVAL表达式作为输入。#64315 (Francisco J. Jurado Moreno) 。- 用户现在可以为
formatReadableSize、formatReadableDecimalSize和formatReadableQuantity函数指定可选的 precision 参数,用于控制小数点后的位数。默认值为 2,保持原有行为不变。#104648 (Antonio Filipovic) 。 - 新增
output_format_float_precision设置,用于控制浮点文本输出中的小数位数。#99721 (phulv94) 。 - 新增设置
output_format_always_write_decimal_point_in_float_and_decimal,用于在文本格式中始终为浮点数和Decimal数值输出小数点,即使该值是整数也是如此。例如,输出1.而不是1。默认禁用。#62614 (Ilya Yatsishin) 。 - 新增对 HTTP handler 配置元素
<url_prefix>和<full_url_prefix>的支持 (匹配基础路径下的所有路径,例如对 Prometheus handlers 很有用) ,以及<url_regexp>、<full_url_regexp>和<headers_regexp>。旧的<url>regex:...</url>形式现已废弃。#107492 (Vitaly Baranov) 。 - 支持
basicstatistics,这是一种紧凑的按列统计信息,可在适用时存储数值最小/最大值、字符串平均长度以及 NULL 计数。#106048 (Han Fei) 。 - ClickHouse Keeper 现支持 TTL 节点,可通过
create_ttlfeature flag 选择启用。#100397 (Konstantin Vedernikov) 。 - 为工作负载引入内存预留功能。请参阅工作负载调度文档。#82414 (Sergei Trifonov) 。
Experimental 功能
- 多阶段分布式查询执行:规划器将查询计划拆分为多个阶段,这些阶段通过 scatter / broadcast / gather / shuffle exchanges 连接,并将查询计划片段分发到 worker 节点。阶段之间的数据可通过 TCP 进行流式传输,也可通过共享对象存储中的临时 File 传递;该路径支持分布式 shuffle 和 broadcast hash join、shuffle 聚合以及分布式排序。该功能属于 Experimental,默认禁用。#106020 (Alexander Gololobov)。实验性的分布式查询计划引擎 (
make_distributed_plan) 现在可为每个 worker 使用不同的任务分发端口和流式 exchange 端口,这些端口可在<remote_servers>中按副本通过stateless_worker_port和streaming_exchange_port配置。未设置时,将使用此前的服务器级端口 (stateless_worker_client.port和distributed_query.streaming_exchange_port) 。这使得在一台主机上运行多个 worker 成为可能。#107885 (Alexander Gololobov)。 - 新增实验性的
dphypjoin 重排序算法,用于 inner joins,可作为query_plan_optimize_join_order_algorithmsetting 的一个选项;同时新增query_plan_optimize_join_order_max_searched_planssetting,用于限制 join 顺序搜索范围,并在超出上限时回退到链中的下一个算法;将其设为0可保留此前不设上限的搜索行为。#98798 (Alexander Gololobov)。 - 新增
aiEmbed函数,可在 ClickHouse 内部调用 LLM API 生成嵌入。#102922 (George Larionov)。 - 新增实验性的 Linux OOM canary:这是一个牺牲型子进程,会在主服务器进程之前成为 Linux OOM killer 的目标。启用
oom_canary_enable后,它会通过清理分配器缓存、取消查询、取消合并,以及在system.crash_log中记录事件来缓解内存压力。OOM 响应需要 cgroup v2memory.events中存在 OOM-kill 证据。#101942 (Peng)。 /webterminal上的 Web terminal 界面现已成为生产可用功能,并默认启用。它由新的enable_webterminalserver setting 控制;原有的allow_experimental_webterminalsetting 已弃用,但出于 backward compatibility 仍会生效。要禁用该端点,请将enable_webterminal设为false。#106255 (Alexey Milovidov)。- PromQL HTTP 端点现已支持通过 URL 查询参数指定 database 和表 (
database=、table=或table=db.table) 。此前隐式回退到default.prometheus表的行为已移除:如果 handler config 和 URL 都未指定表,handler 现在会返回The time series table name is not set。要保留旧行为,请配置<table>default.prometheus</table>,或在 URL 中传递table=...。#107553 (Vitaly Baranov)。 - 在
prometheusQuery和prometheusQueryRangetable functions 中新增对 PromQLhistogram_quantile函数的支持。这使得可以基于由le标签标识的经典 Prometheus 直方图桶计算分位数。#103477 (Joe Smith)。 - 为 text index 新增惰性倒排列表应用模式。通过
SET allow_experimental_text_index_lazy_apply = 1和SET text_index_posting_list_apply_mode = 'lazy'启用后,倒排列表会按需在打包块粒度上采用基于游标的方式解码,而不是完整物化为 Roaring Bitmaps,从而降低选择性 text index queries 的内存占用和 CPU 开销。#100035 (Peng)。 - 新增对 WebAssembly UDF 的 AssemblyScript ABI 支持。你可以通过基于浏览器的 playground 试用 AssemblyScript ABI,无需在本地安装工具链;它会编译 AssemblyScript 代码,并将生成的 WebAssembly 模块加载到本地 ClickHouse 中。#104606 (Vladimir Cherkasov).
- 允许在主 HTTP 端口上挂载 Prometheus 处理程序,并支持可选前缀。#104975 (James Cunningham).
- 新增 Experimental
MergeTreesettingpacked_skip_index_max_bytes,会将较小的跳过索引子流打包到每个分片的单个skp_idx.packed归档中,从而在表上定义大量跳过索引时降低 inode 压力。是否打包会在写入时按子流决定:序列化后大小低于阈值的子流会进入归档,较大的则继续使用独立的skp_idx_<name>.idx2/.mrk2布局。单个分片可以混合使用这两种布局。全文索引不受支持,始终按文件存储。默认值为 0 (禁用打包) 。#105321 (Raúl Marín). - 为使用
ABI BUFFERED_V1的 WebAssembly UDF 新增对Buffersserialization 的支持,并将webassembly_udf_enable_fuel添加为持久化的 WASM UDF 函数 setting。#105574 (Antonio Andelic). - 新增 Experimental
use_reader_executorsetting (默认关闭) ,将读取切换为通过新的基于管道的ReaderExecutor,而不是 legacy 的读取缓冲区链。#106570 (Sema Checherinda). 还为 Experimentaluse_reader_executor读取路径新增了可观测性指标,包括一个建模的读取成本 KPI (ReaderExecutorModeledCostMsPerRequestedMiB) 。#106968 (Sema Checherinda). 此外,在 Experimentaluse_reader_executor读取路径后新增了ChainedBuffers缓冲区,并提供ReaderExecutorChainedBufferBytes指标。#107210 (Sema Checherinda). MergeTreesorting key 中的降序 sort order (例如ORDER BY (time DESC, key)) 现在始终受支持,不再需要 Experimental settingallow_experimental_reverse_key;该 setting 已变为 Obsolete。#106440 (Nikita Mikhaylov).Nullable(Tuple(...))现已进入 Beta。默认禁用,设置enable_nullable_tuple_type = 1即可使用。#107754 (Nihal Z. Miaji).
性能提升
- 对 Keeper 进行了多项改进,使其整体速度提升约 2 倍 (包括更高效的批处理、向 leader 发送消息的流水线化,以及日志追加的流水线化) 。#101757 (Michael Kolupaev).
- 降低了简单
SELECT查询的单次开销 (解析、分析和规划) 。例如,通过单个连接执行SELECT count() FROM hits现在大约快了 50%。#104513 (Raúl Marín). - 针对较长和高基数主键,优化了主键索引分析。对于较长的主键,索引分析的运行时间现在主要取决于查询过滤器的复杂度 (即实际用到的键列) ,而不再取决于主键长度——因此,对于只按其中少数几列进行过滤的查询,扩展排序键几乎不会给索引分析带来额外开销。对于高基数主键,ClickHouse 仅在内存中保留具有筛选作用的键列前缀,而不会加载后续列;现在索引分析只处理这部分内存中的前缀,而不是整个键。该优化默认启用,也可以通过新设置
use_lightweight_primary_key_index_analysis将其关闭。关闭了 #65103。#91836 (Nihal Z. Miaji). - 默认的 x86 build 现在以 x86-64-v3 (AVX2) 为目标,而不是 x86-64-v2 (SSE4.2)。这要求 CPU 支持 AVX2 (Intel Haswell 或更高版本,AMD Excavator 或更高版本) 。如果你的 CPU 不支持 AVX2,请使用面向标准 x86-64 的
amd64compatbuild。#105019 (Raúl Marín). - 将
ipnsort和driftsort(稳定排序) ——Rust 标准库排序实现的 C++ 移植版本——用于通用比较排序。这提升了非数值列上的ORDER BY和稳定排序性能,并消除了逆序输入时的一种最坏情况。#106650 (Alexey Milovidov). - 针对高基数且分布均匀的键,新增了
GROUP BY优化:通过对分组键进行哈希,将行分散到各个线程,使每个线程聚合互不重叠的一部分键,从而无需 merge 阶段。设置enable_sharding_aggregator = 1即可启用。#104233 (Nihal Z. Miaji). - 为字符串键的
GROUP BY查询启用了哈希表预取,使高基数字符串聚合性能提升约 8%。#101007 (Le Zhang). - 在 merge 包含大型 aggregate state (例如
groupArray) 的部分 two-level aggregation 结果时,通过在 merge 过程中逐步释放每个 bucket 的源状态,而不是一直保留到 merge 完成,降低了峰值内存占用。#102330 (Yuri Fedoseev). - 优化了
EnumDataType的内存表示。对于包含Enum类型的表,Enum组件的内存占用最多可降低 10 倍。按值 (数字) 检索名称的耗时相当或更快。按名称搜索会略慢一些,但这种访问方式较少见。#95668 (Ilya Yatsishin). - 添加了标识符解析缓存,以避免在查询分析期间重复进行标识符解析。#88043 (Max Justus Spransy).
- 提升了针对多列表的查询分析性能:在不需要时,不再计算列节点的哈希值 (其中包含整个源表表达式) 。现在,分析针对约 1200 列表的嵌套
SELECT *子查询,速度提升约 50 倍。#106957 (Dmitry Novik). - 通过从函数解析缓存中移除冗余的查询树哈希,提升了包含大量函数调用或函数调用深度嵌套的查询的查询分析速度。#107516 (Dmitry Novik).
- 修复了在大量访问控制实体 (行策略、角色、配额、profile) 同时发生变更时,replicated access storage 中登录和查询启动长时间卡顿的问题。现在,每个实体缓存对于每个通知批次只会重新计算一次,而不是对每个发生变更的实体都重新计算一次,从而消除了原本可能让访问锁持有数分钟的二次复杂度开销。#107672 (Azat Khuzhin).
- 在 probe 侧将 hash join 的
FixedHashMap共享为 JOIN runtime filter。当 build 侧哈希表是 (或可转换为)FixedHashMap时,它会作为运行时过滤器发布,并替换原本由BuildRuntimeFilterStep安装的Set/BloomFilter。该行为由新设置join_runtime_filter_from_fixed_hash_table控制 (默认值为true) 。#105640 (Xiaozhe Yu). - 当
JOIN后接选择性的LIMIT、TopN或另一个JOIN时,对 selector 索引和复制索引采用惰性应用。要控制启用惰性 selector 索引所需的负载列数量,请使用设置query_plan_min_columns_for_join_lazy_indexing(0 表示禁用该优化) 。要控制应用该优化的LIMIT,请使用设置query_plan_max_limit_for_join_lazy_indexing。#106566 (Hechem Selmi). - 现在,并行副本已支持 DP (动态规划) JOIN 重排序。#105889 (Nikita Taranov).
- 改进了 JOIN 使用运行时过滤器 (默认启用
enable_join_runtime_filters) 时的查询计划:join 重排序成本模型现在能够穿透右子树中的WindowTransform(以及其他保持行不变的查询计划步骤) ,使用底层行数和每列 NDV,而不再回退为无统计信息。#107229 (UnamedRus). - 通过批次方式处理 RIGHT 和 FULL join 中未匹配行的输出,去除了其中的虚函数调用开销。#105679 (Hechem Selmi).
HashJoin现已支持 packedkeys32和keys64方法。#107202 (Nikita Taranov).Set现已支持 packedkeys32和keys64方法。#107564 (Nikita Taranov).- 优化了 aggregation 中对 Nullable 列的处理。#106015 (Nikita Taranov).
- 提升了
LIMIT BY查询的性能。#103349 (Nihal Z. Miaji). - 当
LIMIT BY的列是ORDER BY的前缀时,在Sort阶段对每个并行已排序流内部执行LIMIT BY,从而加速ORDER BY ... LIMIT BY查询。这可以减少流经最终排序合并以及后续管道步骤的行数。该优化由新设置query_plan_push_limit_by_into_sort控制 (默认启用) 。#104000 (Nihal Z. Miaji). - 当
<cols>是表排序键的前缀,或在WHERE col = const固定了前导列后成为其前缀时,可加速SELECT ... LIMIT N BY <cols>查询。启用后,MergeTree会按主键顺序读取数据,并先以流式模式执行LIMIT BY过滤,每个已排序流仅使用 O(1) 内存,从而过滤掉大部分数据;最后再对缩减后的数据执行普通LIMIT BY,得到最终结果。该优化由新设置optimize_limit_by_in_order控制 (默认启用) 。#105135 (Nihal Z. Miaji). - 通过在每个分区的流内并行执行
LIMIT BY,而不是先将所有流合并为一个再应用限制,可加速分区MergeTree表上的LIMIT BY查询。这适用于分区表达式是LIMIT BY列的确定性函数的情况,因此不会有任何LIMIT BY分组跨越两个分区。该优化由新设置allow_limit_by_partitions_independently控制 (默认启用) 。#105126 (Nihal Z. Miaji). - 通过移除冗余键表达式来加速
LIMIT BY查询:如果某个键是其他键的确定性函数,则会被去掉 (例如LIMIT 5 BY x, f(x)会变为LIMIT 5 BY x) ;如果某个键是另一个键的单射函数,则会被替换为其参数 (例如LIMIT 5 BY toString(x)会变为LIMIT 5 BY x) 。这样可减少每行需要计算的表达式数量,并降低计算成本。该优化由新设置optimize_limit_by_function_keys和optimize_injective_functions_in_limit_by控制,二者默认均启用。#106818 (Nihal Z. Miaji). - 通过使用利用硬件 CRC32C 的 kernel 替换按 chunk 进行的逐列哈希计算,加速分片聚合、
grace_hashjoin 分桶以及并行窗口分区。#106538 (Harikrishnan Prabakaran). - 在 x86-64-v4/v3 上,针对数组参数使用多目标自动向量化,优化
L1Distance、L2Distance、L2SquaredDistance、LinfDistance和cosineDistance。对于非常量数组参数,除使用带运行时 exponent 的std::pow的LpDistance外,其余函数现在都可以使用由 compiler 向量化的 kernel。现有针对L2Distance和cosineDistance的 AVX-512 与 Sapphire RapidsBFloat16常量参数快速路径予以保留。#101310 (Peng). - 提升了
{Norm}Distance和dotProduct函数的性能。#106007 (Nikita Taranov). - 提升了
arrayNorm函数的性能。#106211 (Nikita Taranov). - 在某些情况下,
dotProduct的性能有所提升。#106210 (Nikita Taranov). - 当数组长度恰好能被向量化处理宽度整除时,优化了
L2Distance和cosineDistance在Array(Float32)、Array(Float64)和Array(BFloat16)上的 AVX-512 左侧常量路径性能。#104625 (Sergey Kuznetsov) 。 - 为 AMD 启用了 AVX-512 代码生成,并进一步改进了
arrayDistance的代码生成。#106505 (Nikita Taranov) 。 - 提升了
QBit数据类型下L2DistanceTransposed和cosineDistanceTransposed函数的性能。#106701 (Raufs Dunamalijevs) 。 - 将
encrypt、decrypt、tryDecrypt、aes_encrypt_mysql和aes_decrypt_mysql函数的性能最高提升了一个数量级,恢复了从 BoringSSL 迁移到 OpenSSL 3.x (24.4) 期间损失的性能。#107339 (Konstantin Bogdanov) 。 - 通过避免 OpenSSL 3.x 中隐式的逐行 OpenSSL 提供商查找,提升了
encrypt、decrypt和halfMD5函数的性能。#99105 (Konstantin Bogdanov) 。 - 为
SHA1新增了 SIMD 实现,利用 AVX-512 并行计算多个输入的哈希,从而提升吞吐量。#105459 (Joanna Hulboj) 。 - 为多缓冲
MD5实现新增了 AArch64 ASIMD/NEON 后端。#105563 (Venkata Vineel ) 。 - 在
MATERIALIZE PROJECTION期间,计算 projection 之前先合并源块,以减少临时 projection parts 的数量和 merge 开销。在一个 5000 万行的表上,速度提升约 3.4 倍。#100047 (Amos Bird) 。 - 对在
ORDER BY列上使用跳过索引的MergeTree表,通过避免在写入 part 时进行冗余的列置换,降低了INSERT延迟 (在链路追踪类工作负载上约降低 17%) 。#101101 (Amos Bird) 。 - 启用了 Arrow 的 SIMD 代码路径 (ARM 上为 NEON,x86 上为 SSE4.2/AVX2/AVX512) ,并利用这些代码路径加速了解码采用
BYTE_STREAM_SPLIT编码的 ParquetFLOAT/DOUBLE列。#106376 (Raúl Marín) 。 - 提升了带有
bloom_filter索引的LowCardinality列的插入性能。#106410 (Michael Jarrett) 。 - 在
DiskObjectStorageTransaction::copyFile中,使用每个 disk 的线程池并行复制 blob。#105089 (Asya Shneerson) 。 - 在对
file、s3等类文件 table function 使用One输入格式时,避免读取文件内容。#105157 (Yue Ni) 。 - 通过不导出动态符号,将 macOS 上
clickhouse的启动速度提升了约 3 倍;否则动态链接器会在每次启动时处理这些符号。#107768 (Raúl Marín) 。 - 通过避免为每个缓存键重复打开目录,加快了启动时文件系统缓存的加载速度。#107414 (Alexey Milovidov).
- 通过让负责列出目录的线程在完成列出后协助加载缓存元数据,而不是让半数线程闲置,加快了启动时文件系统缓存的加载速度。#107416 (Alexey Milovidov).
- 通过更新随附的 WasmEdge 库,降低了
clickhouse进程的启动开销;该库不再在每次启动时于全局初始化器中生成随机哈希密钥。#107869 (Raúl Marín). MergeTree主键和跳过索引现在可以对由ifNull或coalesce包裹条件的过滤器裁剪粒度,例如ifNull(key = 0, 0)或coalesce(key = 0, 0)。这类谓词通常由查询生成器生成,用于将可能为NULL的比较转换为明确的布尔值;此前索引分析无法识别它们,因此也无法跳过粒度。这扩展了现有的allow_key_condition_coalesce_rewrite设置 (默认启用) 。关闭 #106264。#106272 (Andy Zhao).- 在 26.6 中,对
DateTime64类型进行跳过索引求值时的 CPU 消耗应更低。#107707 (Shankar Iyer). - 通过优化对罕见标记的处理,提升了多标记搜索中文本索引分析的性能。#98226 (Anton Popov).
- 为文本索引的 posting list 压缩分段加入了缓存。#106299 (Anton Popov).
- 提升了针对选择表中大段连续范围的查询执行通用排除搜索时的性能。#93813 (Michael Jarrett).
- 具有相同端点和 bucket 的
S3客户端现在会共享缓存,从而避免重复进行区域发现。关闭 #92482。#96802 (Andrey Zvonov). - 如果查询包含
has(<constant array>, <expr>),analyzer会在可行时将该节点转换为使用更快的in实现。#97341 (Shankar Iyer). - 当在
ThreadPool中调度新的 job 时,会唤醒最近一个进入空闲状态的工作线程 (LIFO) ,而不是任意唤醒一个线程。这可减少每线程 allocator 缓存造成的内存碎片。job 的处理顺序不会改变。#100177 (Alexey Milovidov). - 提升了近似运行时过滤器和布隆过滤器索引的性能。#100201 (Christoph Viebig).
- 允许
ASOF JOIN使用parallel_hashjoin algorithm,从而可在不同等值键之间并行构建。此前ASOF会无条件禁用parallel_hash。#105375 (Greg Maher). - 当空输入已足以确定结果为空时,避免为
INTERSECT和EXCEPT查询读取无界输入。#105393 (Yue Ni). - 为多个
MemoryTracker阻塞器添加了constinit。 #105490 (Azat Khuzhin). - 通过在范围检查期间避免重复调用
rb_max,提升了非UInt64groupBitmap状态下bitmapContains的性能。 #105960 (Yue Ni). - 对于由单个字典支持的
LowCardinality列,不连续查询的速度更快。 #103662 (Ivan Babrou). - 当块中仅有一行时,为
HashJoin的 probe 增加了快速路径。 #106008 (Nikita Taranov). - 来自如下查询的 predicates:
SELECT ... FROM view(SELECT ... FROM remote(...)) WHERE ...,现可下推到发送至远程分片的查询中。此前,优化项allow_push_predicate_ast_for_distributed_subqueries缺少对 table functions 的处理。 #105986 (Nikolai Kochetov). - 默认启用
enable_join_transitive_predicates。 #103724 (Alexander Gololobov). - text indexes 新增对函数
multiSearchAny、multiSearchAnyUTF8和multiMatchAny的支持。同时改进了函数match的 text index analysis:现在,包含可选分组的 patterns 可以跳过更多 granules。 #106279 (Anton Popov). - 允许在初始 PREWHERE 选择之后引入的 filters (predicate pushdown、运行时过滤器,或显式 PREWHERE 加上规划器设置的 WHERE) 在优化器第二次遍历时合并到现有 PREWHERE 中,而不是继续作为位于
MergeTree读取之上的独立 Filter 步骤。 #105445 (Yarik Briukhovetskyi). QueryConditionCache现在会单独记录被过滤掉的粒度,即使在部分通过 PREWHERE 的读取批次中也是如此,从而减少后续具有相同 condition 的查询需要重新读取的 marks 数量。 #105335 (Han Fei).- 新增 Keeper 设置
nuraft_use_bg_thread_for_snapshot_io,默认启用,使NuRaft改为从后台线程而非 Raft worker threads 读取 snapshot 对象。 #106285 (Antonio Andelic). - 在 ClickHouse Keeper 中使用
KeeperMemoryStorage应用接收到的 snapshots 时,可降低峰值内存占用。 #105851 (Antonio Andelic). - 将 LLVM/JIT allocations 路由到专用的 jemalloc arena。这样可减少长期存在的 JIT bookkeeping 与短生命周期的查询 allocations 交错造成的 RSS 碎片。为可观测性新增异步指标
jemalloc.jit_arena.active_bytes、jemalloc.jit_arena.dirty_bytes、CompiledExpressionCacheBytesMax和CompiledExpressionCacheCountMax。SYSTEM DROP COMPILED EXPRESSION CACHE现在还会删除底层 CHJIT 实例并清空 JIT arena。 #104113 (Raúl Marín). - 修复了使用原生 V3 读取器从
Parquet读取稀疏字典编码的Nullable(String)列时内存预留过多的问题。 #102805 (Francisco). - 修复了加密磁盘上的
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM)会复制数据而非创建硬链接的问题。#106731 (Nikita Mikhaylov). - 改进了查询计划优化器中的基数估算:由确定性单参数函数 (例如
toYear(date)) 生成的列,现在会将其参数的不同值数量作为上界继承,而不再处于缺少统计信息的状态,从而使 join 重排序更准确。#107757 (Alexander Gololobov). - 在高日志速率下,降低了异步日志的 CPU 开销:现在仅在队列从空变为非空时通知日志消费者,而不是每条消息都通知。#107352 (Nikita Mikhaylov).
- 在更多场景下消除了查询执行期间的重复计算。#106113 (Yarik Briukhovetskyi).
- 将递归 CTE 结果的处理并行化:对大型
WITH RECURSIVE结果执行GROUP BY或其他操作时,不再受限于单线程。#107694 (Alexey Milovidov). - 通过在 ARM 上新增 NEON SIMD 路径,并在 x86 上采用更宽的 AVX2 内核,提升了不区分大小写的子串搜索 (
positionCaseInsensitiveUTF8、ILIKE、multiSearchAnyCaseInsensitiveUTF8及相关函数) 的性能。#107882 (Raúl Marín). - 修复了 ARM 上
FPC浮点 codec 约 16% 的吞吐量回退问题;该问题是在其预测器表开始使用VectorWithMemoryTracking后引入的。#108182 (Groene AI).
改进
- 后台
MemoryWorker现在会根据当前内存使用量以及内核报告的可用内存量,定期更新 server 的硬内存限制,从而让 ClickHouse 为同一主机上的其他进程预留空间。公式为(resident memory + system MemAvailable) * max_server_memory_usage_to_ram_ratio。同一个max_server_memory_usage_to_ram_ratioserver setting 同时控制启动时上限和动态调整;将其设为0即可同时禁用两者。若只保留静态的启动/重载上限 (即旧版本的行为) ,请将新的 server settingmemory_worker_dynamic_hard_limit设为0。#104964 (Alexey Milovidov). - 在
PostgreSQLprotocol 中支持 C# PostgreSQL client。这解决了 #18611。#80785 (Konstantin Vedernikov). - 变更现在使用 analyzer。#98884 (Nikolai Kochetov).
- 在命令行客户端中新增了对查询回显的细粒度控制。
--echo选项现在接受可选的布尔值,并且在交互模式和批次模式下都可使用。新选项--echo-formatted和--echo-query-id分别控制是否格式化回显的查询,以及是否打印query_id。--hilite/--highlight选项现在也会控制回显查询的高亮显示。一个连带影响是,--echo现在是一个布尔值选项,因此如果在未带值的--echo后直接跟一个位置参数查询,它会被视为该选项的值;请改用--echo --query "..."或--echo=false。#106191 (Alexey Milovidov). - 支持数据湖目录的 schema evolution,并同时支持并发一致性检查。#106102 (Konstantin Vedernikov).
- 允许数据湖 table engines 使用 cache disk。#102017 (RinChanNOW).
- 修复了
catalog_type = 'onelake'的DataLakeCatalogdatabases 读取表数据的问题:现默认使用 OneLake Blob endpoint (.blob.fabric.microsoft.com) 。将onelake_use_blob_endpoint = false可保留此前使用 DFS endpoint (.dfs.fabric.microsoft.com) 的行为。#106843 (Konstantin Vedernikov). - 将
S3(Azure)Queuesettingpersistent_processing_node_ttl_seconds的默认值从1 hour调整为6 hours(表示因服务异常重启等情况导致的清理时间) 。此前的默认值对于 processing nodes ttl 是合适的,但它也用于 bucket lock ttl,而后者可能需要持有更长时间,因此 1 小时并不足够。#106838 (Kseniia Sumarokova). - 将
Icebergmetadata cache 的默认大小从 1 GB 降至 128 MB。#106492 (Konstantin Vedernikov). - 将
S3Queue流式任务的query_id传递给依赖表的 inserts。#106494 (Christoph Wurm). - 通过
DataLakeCatalog查询表时,在system.query_log中用 storage engine 名称填充used_storages。#100706 (Melvyn Peignon). - 你可以检查 Iceberg 的 snapshots 包含哪些 ‘operation’ 和 ‘summary’。这对测试和调试很有帮助。#106246 (Den Kalantaevskii) 。
- 通过任务跟踪器异步完成最终的
S3分段上传请求,使其可以与最后一个分片的上传并行进行,而不是在 finalize 中串行执行。#105487 (Asya Shneerson) 。 - 新增了四个
MergeTree表设置,用于控制文本索引的默认参数:text_index_dictionary_block_size、text_index_dictionary_block_frontcoding_compression、text_index_posting_list_block_size和text_index_posting_list_codec。这些设置允许你在表级别调优文本索引的行为,而不必在每个索引定义中单独指定参数。索引级显式指定的参数仍然优先。#100626 (Anton Popov) 。 - 允许投影覆盖除
index_granularity之外的更多MergeTree设置 (压缩、分片格式、序列化) ,并提供允许设置项的白名单和校验机制。#101170 (Amos Bird) 。 - 向
system.merges添加current_projection、current_projection_progress、projections_completed和projections_remaining列,用于展示投影合并进度。#102611 (Amos Bird) 。 - 修复了主键列上带
IN子查询的PREWHERE未使用主键索引进行粒度剪枝的问题;该问题会导致执行全表扫描,而不是只读取相关粒度。#102570 (Nikita Mikhaylov) 。 - 函数
h3PolygonToCells现在会对MultiPolygon中所有 Polygon 统一执行最大数组大小限制,校验底层 H3 库的返回码,并拒绝MultiLineString参数,而不是静默返回空结果。#106399 (Raúl Marín) 。 - 新增一个仅 Keeper 可用的
system.keeper_snapshots表,包含本地 ClickHouse Keeper 快照的信息。#105571 (Miсhael Stetsyuk) 。 - 新增一个仅 Keeper 可用的
system.keeper_changelogs表,包含本地 ClickHouse Keeper 更新日志 (Raft 日志) 文件的信息。#105617 (Miсhael Stetsyuk) 。 - 新增一个仅 Keeper 可用的
system.keeper_cluster表。当前 Keeper 视角下的每个 Raft 集群成员各对应一行。#105646 (Miсhael Stetsyuk) 。 - 为 watches 添加更多 Keeper profile 事件 (服务器端 + 客户端) 。关闭 #97703。#105336 (Konstantin Vedernikov) 。
- 为
NuRaft未提交日志条目的准入限制和 append-entries 反向探测限流新增 Keepercoordination_settings。#106108 (Antonio Andelic) 。 - 为
mysql表函数、MySQL表引擎、MySQLdatabase engine、字典SOURCE(MYSQL)以及命名集合新增enable_compression设置。启用后,ClickHouse 会为通过该连接传输的所有数据协商使用 MySQL 协议级压缩。#103229 (Bernard Lim) 。 - 降低了通过 PostgreSQL wire 协议运行的查询取消延迟:
KILL QUERY现在可在单个数据块内中断输出序列化,而不必等整个数据块发送到客户端后才中断。#106535 (Roman Vasin) 。 - 降低了通过 MySQL wire 协议运行的查询取消延迟:
KILL QUERY现在可在单个数据块内中断输出序列化,而不必等整个数据块发送到客户端后才中断。#107228 (Roman Vasin) 。 - 修复了 MySQL 握手过程中
auth_response长度的读取问题:当长度字节>= 128时,由于被读取为有符号char,会被误解释为数 GB 的值。#107384 (uwezkhan) 。 MaterializedPostgreSQL现在会将精度大于 76 的 PostgreSQLnumeric(p, 0)列 (例如用于 256 位整数的numeric(78, 0)) 映射为 ClickHouseInt256,而不再因 “Precision too big” 失败。无法装入Int256的值会以明确的错误被拒绝。#107431 (Alexey Milovidov) 。- 当 TCP 连接建立失败时,会向客户端发送异常。#107317 (Nikolai Kochetov) 。
- 用户现在可以插入用于 8 位/16 位/32 位/64 位整数变体的
AvroFixed字段。#98139 (Patrick Pichler) 。 AvroConfluent格式现在会在遇到瞬时故障 (传输超时、连接被拒绝、DNS 错误、HTTP5xx/408/429) 时,对 Confluent Schema Registry HTTP 客户端按指数退避策略进行重试,而不是在第一次网络抖动时就中止 INSERT。新设置format_avro_schema_registry_max_retries(默认5) 和format_avro_schema_registry_retry_initial_backoff_ms(默认100) 用于控制该策略。Schema 校验错误 (HTTP409、格式错误的 Avro JSON) 仍会被视为致命错误。#106661 (Groene AI) 。- 在
system.query_log.used_privileges中记录所有已授予访问检查的特权,包括通过非抛出式isGranted路径 (checkAccessWithFilter) 执行的检查。此前,只有通过抛出式入口点 (checkAccess/checkGrantOption) 检查的特权会被记录,这使得对于使用file/s3/azure/url表函数的DESCRIBE、CREATE TABLE AS及类似查询,READ ON FILE/READ ON S3/READ ON AZURE/READ ON URL在审计日志中不可见。访问控制行为保持不变。#104693 (Alexey Bakharew) 。 - 新增异步指标
TotalUncompressedBytesOfMergeTreeTables和TotalUncompressedBytesOfMergeTreeTablesSystem,用于报告存储在 MergeTree 家族表中的数据总未压缩大小。#106364 (Alexey Milovidov) 。 - 新增
GlobalMemoryLimitExceededprofile event,便于运维人员监控何时触及服务器范围的内存限制。#106466 (Sacheendra Talluri) 。 - 为
executable_poolUDF 填充ExecutableUserDefinedFunction*ProfileEvents计数器。现在可在system.query_log.ProfileEvents中查看每次调用的调用次数、总耗时与池等待时间、子进程 CPU 和峰值内存占用,以及 stdin/stdout 字节数。#105010 (Xu Jia) #105618 (Ilya Andreev). - 新增异步指标
ExecutableUserDefinedFunctionMemoryResidentBytes和ExecutableUserDefinedFunctionProcesses,用于报告executable和executable_pool用户自定义函数的常驻内存 (VmRSS) 及存活进程数,其中包括 descendant processes 和空闲池工作线程。#107300 (Hanzi Jiang). - 新增三个仅限 Linux 的 async 指标——
MemoryThreadStacksCount、MemoryThreadStacksVirtual和MemoryThreadStacksResident——将 pthread 栈内存与其余匿名内存分开报告。通过asynchronous_metrics_enable_heavy_metrics启用。需要 Linux 5.17+ (prctl(PR_SET_VMA_ANON_NAME)) 以及可读的/proc/self/smaps;否则这些指标不会出现,且该限制会记录在system.warnings中。#106230 (Raúl Marín). - 在 macOS 上公开
MemoryThreadStacks*异步指标 (线程栈的常驻/虚拟大小及数量) 。#107752 (Raúl Marín). - 表引擎现已附带嵌入式文档,可通过
system.table_engines表新增的description、syntax、examples、introduced_in和related列进行内省。#106177 (Alexey Milovidov). - 数据库引擎现已附带嵌入式文档,可通过
system.database_engines表新增的description、syntax、examples、introduced_in和related列进行内省。#106178 (Alexey Milovidov). - 数据类型现已附带嵌入式文档,可通过
system.data_type_families表新增的description、syntax、examples、introduced_in和related列进行内省。#106180 (Alexey Milovidov). - 输入/输出格式现已附带嵌入式文档,可通过
system.formats表新增的description、examples、introduced_in和related列进行内省。#106181 (Alexey Milovidov). - 聚合函数组合器现已附带嵌入式文档,可通过
system.aggregate_function_combinators表新增的description、syntax、examples、introduced_in和related列进行内省。#106185 (Alexey Milovidov). - 为
clickhouse-client、clickhouse-local和嵌入式客户端新增了--chime命令行选项。当查询运行至少 N 秒后结束时 (无论成功还是报错) ,客户端都会向 stderr 写入 ASCIIBEL控制字符 (\x07) 。终端会根据用户偏好决定是发出声音还是闪烁提示。默认启用,阈值为 5 秒;可通过--chime N自定义阈值,或使用--chime 0禁用。关闭 #92718。#104545 (Groene AI). - 在
clickhouse-client中,当终端不支持 bracketed paste 时,粘贴的多行查询中的换行现在会折叠到同一个编辑缓冲区中,而不会为每一行都切换到续行提示符。粘贴的查询会保留在单个提示符下,方向键也可以在各行之间移动。这是一项尽力而为的改进,依赖于典型的 TTY 缓冲粘贴行为。#104299 (Alexey Milovidov)。现在在禁用语法高亮 (--highlight 0) 时也可正常工作。#106665 (Alexey Milovidov)。 - 为
clickhouse-client/clickhouse-local添加了类似 MySQL 的运行时 pager 控制。#105706 (Azat Khuzhin)。 clickhouse-client现在可正确处理非 UTF-8 终端:当终端字符编码不是 UTF-8 时 (例如使用LANG=C) ,Pretty格式会回退为 ASCII 网格边框,而不是输出会破坏终端显示的 Unicode 盒线字符。#106213 (Alexey Milovidov)。- 在
clickhouse-client的Hellopacket 处理逻辑中,会对 server 提供的显示字符串 (server 名称、time zone、显示名称、password-rule patterns 和消息) 进行清理,这样恶意 server 就无法注入会被 client 原样渲染的字节;同时还限制了这些字符串的大小,以防止无界内存分配。#105243 (Raúl Marín)。 - 现在,当查询使用图像 output format (例如
FORMAT PNG) 时,Web UI 会将结果显示为图像,而不是将 raw bytes 显示为表。#107638 (Alexey Milovidov)。 - 新增设置
output_format_pretty_use_nbsp_for_padding:当output_format_pretty_grid_charset为UTF-8时,在表格样式的Pretty格式中使用U+00A0NO-BREAK SPACE 渲染表格布局中的 padding。这有助于在会折叠普通空格的工具中复制Pretty输出时保持表格对齐。该设置默认禁用,而ASCII字符集输出仍使用普通空格。#103559 (Ashrith Bandla)。 - 通用安装脚本现在还会在 Linux 和 macOS 上将
clickhousectl安装到~/.local/bin,并创建一个chctl符号链接。设置CLICKHOUSE_ONLY=1可跳过此步骤。#105399 (Alasdair Brown)。 - 修复了一个偶发的伪
Syntax error: Unterminated quoted string错误:当通过curl https://clickhouse.com/ | sh安装 ClickHouse 且当前目录中已存在clickhousebinary 时,可能会间歇性触发该错误。#106417 (Alexey Milovidov)。 - 修复了
play.html页面在 Web 终端打开时左侧面板的高度问题,使底部的终端切换按钮始终可见。#105087 (Alexey Milovidov)。 - 修复了在 Web UI 中运行后自动选中唯一查询的问题。#105711 (Joey Yu)。
- 现在,当查询高度最多只比当前编辑器高度高 30% 时,Web SQL UI 会自动展开查询编辑器。#105713 (Joey Yu)。
- 在 Web UI 中,当左侧面板展开时,将底部菜单图标 (Web 终端和 GitHub) 横向排列,为数据库和表列表腾出更多垂直空间。#106427 (Alexey Milovidov).
- 在 Web UI (
play.html) 中,按下Escape现在会取消当前选中的结果表单元格。#107777 (Alexey Milovidov). - 改进 Web SQL UI (Play) 中的数据库面板:为数据库图标添加工具提示、增加隐藏面板按钮、让数据库/表名称整行均可点击,并修复滚动条出现时面板宽度发生偏移的问题。#108013 (Alexey Milovidov).
- 添加一个服务器设置 (
min_allocation_size_to_throw_on_memory_limit) ,允许任意内存分配抛出MEMORY_LIMIT_EXCEEDED,这有助于防止 OOM。#105265 (Azat Khuzhin). - 允许 SSH 使用
NONE身份验证 (可避免向no_password用户询问密码) 。#105476 (Azat Khuzhin). - 在降权前,于
clickhouse su中重置补充组列表,使其行为与/bin/su和sudo一致。此前,降权后的进程会继承调用者的补充组。#105247 (Raúl Marín). - 为数值谓词函数 (
isFinite、isNaN) 添加BFloat16支持。#105391 (Mohamed Hussain S). - 降低多边形字典 (
polygon_index_cell、polygon_index_each) 的内存使用量,并让system.dictionaries.bytes_allocated能正确反映其构建的查找索引。#105431 (Raúl Marín). - 修复 Kafka 表引擎消费者在分区分配后仍持续使用较短 poll interval 的问题,使其恢复为配置的
kafka_poll_timeout_ms,从而避免在 rebalance 后出现过多空轮询、更小的已插入分片以及额外的 merge 开销。#100431 (sugaf1204). - 在查询计划中移除未使用列时,按位置而非按名称识别列。这样即使存在重复列名,也能移除未使用列。#100586 (János Benjamin Antal).
- 对于尝试在复制引擎上使用
table_readonly的情况,ClickHouse 现在会抛出正确的异常,并改进与该设置相关的 DDL 查询 (以及DatabaseReplicated) 的异常处理。#100950 (alesapin). 当目标表设置了table_readonly = 1时,OPTIMIZE TABLE ... ON CLUSTER和其他 DDL 不会再挂起。该设置现在会抛出一个新的专用错误码TABLE_IS_PERMANENTLY_READ_ONLY,DDLWorker会将其视为不可重试 (不同于临时ReplicatedMergeTreeZooKeeper 断开连接期间出现的瞬态TABLE_IS_READ_ONLY) 。现在也会明确拒绝对ReplicatedMergeTree使用table_readonly,无论是在创建时还是通过ALTER MODIFY SETTING进行设置。后续跟进见 #97652。#105109 (Alexey Milovidov). - 修复了可刷新materialized view 的刷新问题:目标表被替换后 (例如通过
EXCHANGE TABLES或删除后重建) ,刷新可能会因UNKNOWN_TABLE失败;现在刷新会按名称解析目标表,不再依赖过期的 UUID。#102724 (Seva Potapov). - 新增设置
wait_for_part_commit_in_dependent_materialized_views(默认值为false) 。当 materialized view 的SELECT会回读其自身源表时 (例如通过对源表执行INNER JOIN) ,级联过程中可能会漏掉当前正在插入的行,因为插入的分片只有在依赖视图运行后才会提交。启用此设置后,会在触发依赖视图前先提交该分片,使其能够看到这条正在插入的行,但代价是插入并行度会降低。#105943 (Elmi Ahmadov). - 不再在
tryDeserialize中吞掉致命错误 (例如MEMORY_LIMIT_EXCEEDED) 。#106808 (Azat Khuzhin). - 在
InverseDictionaryLookupPass中延迟检查CREATE TEMPORARY TABLE授权。#107098 (Azat Khuzhin). - 修复了分布式查询在设置
serialize_query_plan = 1且包含带常量参数的 lambda (例如arrayMap(t -> t.2, ...)) 时出现ILLEGAL_TYPE_OF_ARGUMENT错误的问题。现在,在查询计划序列化期间会保留ActionsDAGINPUT节点的常量列。#107124 (Alexey Milovidov). - 现在,对
contingency、cramersV、cramersVBiasCorrected和theilsUaggregate functions 状态的反序列化会校验存储的计数是否构成一致的列联表,否则将抛出CORRUPTED_DATA异常。关闭了 #106899。#107185 (Nihal Z. Miaji). - 保留封装在
arrow::Status中的异常的原始错误代码。#107267 (Azat Khuzhin). - 为静态服务器配置 (
users.xml) 中定义的配额支持keyed_by_normalized_query_hash,与现有CREATE QUOTA ... KEYED BY normalized_query_hashDDL 语法保持一致。#107654 (Alexey Milovidov). - 兼容性设置不再应用已废弃设置,因此不会将其标记为已更改,也不会产生已废弃设置警告。#107737 (Maxim Orlovsky).
- 异步插入不再在
trace/debug级别记录完整的query_id列表;自 26.2 起,这可能导致高异步插入流量服务上的text_log急剧膨胀。现在详细日志会记录在test级别。#107852 (Sema Checherinda). - 文件系统缓存改进:防止已失效的 priority 条目持续占用
KeyMetadata。这是对 #106387 的后续修复。#107903 (Kseniia Sumarokova). FileCache指标改进。#106116 (Kseniia Sumarokova).- 当堆栈跟踪实际上为空时,不再在异常消息中打印 “Stack trace (when copying this message, always include the lines below):” 这段前导文字。#106524 (Alexey Milovidov).
- 修复了在为超大偏移量计算文件系统缓存边界对齐时,
roundUpToMultiple中可能发生的溢出问题。#92579 (Bharat Nallan). EXPLAIN SYNTAX现在会在 explain 输出中一致地将运算符格式化为函数调用 (例如使用plus(1, 2)而不是1 + 2) 。#94681 (Mohamed Abdelhalim ).- 改进了错误消息中的表名提示:不再建议完全相同的名称,并且会在建议中包含数据库名 (例如:“Maybe you meant
other_db.my_table?”) 。#95116 (Mathuranath Metivier). - 改进了不含
FROM子句的查询中未解析标识符的错误消息,提示可添加一个FROM子句。#101769 (Yash ). - 为
EXPLAIN PIPELINE添加了一个用于压缩重复处理器链的选项。#104662 (Yue Ni). - 修复了构造语法错误消息时的一处堆缓冲区溢出读取问题 (
UTF8::computeWidthImpl经由parseQuery.cpp) ,该问题发生在解析器回溯到第一个分号 / 流结束标记之前时;发行版构建会把相邻堆内存中的字节拼接到显示的错误内容中,而 ASan 构建则会直接中止。#105086 (Groene AI). - 在兼容性设置
file_like_engine_default_partition_strategy下,默认使用 hive 分区策略。#86746 (Kseniia Sumarokova). - 在 macOS 上使用更大的 (8 MiB) 线程栈,以匹配 Linux 默认值,修复了 JIT 编译期间因栈溢出导致的罕见服务端崩溃问题。#107033 (Raúl Marín).
clickhouse-local的临时存储大小限制不再硬编码为 1 GiB。默认值已提高到 1 TiB,并且可通过max_temporary_data_on_disk_size服务器设置进行配置。#106689 (Alexey Milovidov).- 为
clickhouse-disks添加了read-checksums命令。它会读取MergeTreeDataPart的checksums.txt文件,并以便于人类阅读的制表符分隔表形式打印出来。#106901 (Asya Shneerson). - 为
clickhouse-disks添加了read-bitmap命令。#107834 (murphy-4o). - Chdig:为安全连接启用 TLS (此前会导致 “unknown setting
skip_verify” 或 “connection reset by peer”) 。#105864 (Azat Khuzhin). chdigv26.5.1。#105918 (Azat Khuzhin).chdigv26.6.1 -{asynchronous_,}metric_log、查询模式、热力图,以及存储在磁盘上的日志/链路追踪 (此前 1 小时的链路追踪可能会占用 >40GiB) 。#107678 (Azat Khuzhin).- 服务器配置 (
programs/server/config.xml) 现将keep_alive_timeout设为 30 (此前为 10) ,与文档记录及实际实现的默认值保持一致。#107779 (Dan Checkoway). - 服务器级配置项
disk_connections_rcvbuf的默认值已从0(内核 TCP 自动调优) 改为204800(200 KB) ,用于限制对象存储 (S3/Azure/GCS) disk 连接中每个套接字的 TCP 接收缓冲区大小。#107859 (Sema Checherinda). PREWHERE优化器现在会在估算选择性之前,先将引用同一列集合的合取项分组,因此像a > 2500 AND a < 2502这样的条件会作为一个组合范围一起计算,而不是作为两个独立谓词计算,从而得到更准确的选择性估算。#106337 (Han Fei).- 添加了支持 silk fiber 感知的安全套接字和普通套接字实现。#107680 (Miсhael Stetsyuk).
- 修复了
nested函数中的一条错误消息显示错乱问题 (参数顺序颠倒) 以及一个拼写错误。#108031 (Alexey Milovidov). - 为
clickhouse-disks新增了一个sed命令,可对给定路径原地应用 sed 表达式。#107131 (Asya Shneerson). - 为
MaterializedPostgreSQLdatabase engine 新增了创建时配置项materialized_postgresql_use_extended_date_and_time_types。默认情况下 (启用时) ,PostgreSQL 的date/timestamp列会被推断为Date32/DateTime64;如果在CREATE DATABASE时将其设为0,则会推断为更窄的Date/DateTime类型。#107428 (Alexey Milovidov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 支持删除带有
tryN后缀的 detached parts。#58957 (János Benjamin Antal). - 修复了在启用并行副本时,嵌套子查询中包含重复投影别名 (例如
SELECT *, day + 365 AS day) 的查询触发MULTIPLE_EXPRESSIONS_FOR_ALIAS异常的问题。#80310 (Alexey Milovidov). - 修复了
splitMultipartQuery在查询以分号后的注释结尾时抛出 “Empty query” 错误的问题。#85491 (Yarik Briukhovetskyi). - 修复了
ARRAY JOIN的一个异常:当使用LowCardinality数值类型时,会出现Function writeSlice expects same column types for GenericArraySlice and GenericArraySink(issue #57243) 。#91784 (Jimmy Aguilar Mena). - 修复了在新 analyzer 中,将
LIMIT BY与常量列、DISTINCT和ORDER BY一起使用时出现的NOT_FOUND_COLUMN_IN_BLOCK异常。#93195 (Ashrith Bandla). - 修复了当
data_type_default_nullable = 1且表是在Replicated数据库中创建或通过ON CLUSTER创建时,NOT NULL列会被静默创建为Nullable的问题。#97572 (xiaohuanlin). - 通过增加自动重试机制和重连逻辑来处理与 Hive Metastore 通信时的 TTransportException 错误,提升了 HiveCatalog 连接的稳定性。#98471 (Dmitriy Borisenko).
- 修复了
nested函数 (由ARRAY JOIN在内部使用) 会从列类型中去掉LowCardinality的问题,导致输出中的Array(LowCardinality(String))变为Array(String)。关闭了 #95582。#98974 (Yash ). - 修复了在启用并行副本的查询中使用
url、s3或类似表函数时出现的 “Distributed task iterator is not initialized” 异常。#100146 (Alexey Milovidov). - 修复了读取由外部工具 (例如 Spark) 升级过 format version 的 Iceberg 表时出现的 logical error 异常。#100407 (Alexey Milovidov).
like、ilike、notLike、notILike和match函数现在支持常量 haystack 与非常量 needle (例如'foo' LIKE pattern_column) ,而此前这会抛出ILLEGAL_COLUMN。#100479 (Yash ).- 修复了当视图将一个整数列映射为
Bool列时,query_plan_enable_optimizations = 0的MaterializedView查询返回行数错误的问题。#100692 (Maksim Moisiuk). - 修复了在启用 PREWHERE optimization 时,读取包含 ORC 数据文件的 Iceberg 表时出现的异常 (
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it') 。#101206 (Groene AI). - 修复 RestCatalog 中的竞态问题。#101216 (Smita Kulkarni).
- 修复从带有普通 projection 的表上的 VIEW 进行查询时出现
NOT_FOUND_COLUMN_IN_BLOCK错误的问题。#101218 (Amos Bird). - 修复文件被删除后重新创建时 FileLog 中 metadata 过期的问题。#101408 (Azat Khuzhin).
- 修复在与另一张表进行逗号 join (cross) 时,join 重排序会静默丢弃
RIGHT/LEFT JOIN未匹配行的问题,例如t1 RIGHT JOIN t2 ON t1.c = t2.c, t3。此前,该查询返回的是 inner join 结果,而不是 outer join 结果。#101684 (Groene AI). - 修复在
EXPLAIN INSERT INTO ... SELECT ... FORMAT ...中,FORMATclause 被INSERT消费,而不是应用到EXPLAIN输出上的问题。#101772 (Yash ). - 修复在显式配置表级
default_compression_codecsetting 时,MergeTreeparts 选择压缩 codec 不正确的问题。on insert 写入的 parts、merge 期间的 parts 以及 projections 使用的是服务器级默认 codec,而不是表级 setting (现在也涵盖了完全删除型 mutation 生成的空 part) 。#101784 (Yash ). - 拒绝
max_bytes_per_second、max_cpus等 workload settings 中的负Float64值 (例如-100.5) 。此前仅校验负整数,导致负浮点数可能静默创建损坏的 scheduler 节点。关闭 #101825。#101842 (Groene AI). - 修复执行包含 JOIN 且其中 VIEW 内有 aggregation 的查询时,可能出现的
LOGICAL_ERROR(“Port is not connected”,代码 49) 。#102574 (Jimmy Aguilar Mena). - 修复对使用非默认 serialization 的列执行 mutations 后,part metadata 不一致的问题。#102817 (Eduard Karacharov).
- 修复在执行 mutation 之前更新 metadata 的问题,并解决了 #96806。#102882 (Smita Kulkarni).
- 修复在并发
INSERT运行时,SELECT 查询显著变慢的问题。此前,INSERT管道会在查询开始时预留最多max_threads个 CPU 插槽,即使其中大多数实际上从未使用,从而挤占并发 SELECT 的资源。现在 CPU 插槽分配改为按需进行:该管道仅在实际推送可并行化工作时才会请求插槽。这同时适用于并发控制以及 workloads 的抢占式 CPU scheduler。新增 server settingconcurrent_threads_lazy_allocation(默认值为true) 可作为 rollback 开关。#102928 (Seva Potapov). - 修复了读取从
Nullable(Tuple(...))列中提取的子列时NULL传播不正确的问题。例如,对于tup Nullable(Tuple(s Nullable(String))),SELECT tup.s现在会在外层 Tuple 为NULL的行中正确返回NULL,而不是垃圾值。这涵盖了所有可表示NULL的元素类型:Nullable、Dynamic、Variant和LowCardinality(Nullable(...))。关闭 #105356。#102942 (Nihal Z. Miaji). - 当客户端提供的 Native format 数据被截断或格式不正确时,抛出
INCORRECT_DATA而不是LOGICAL_ERROR。#102975 (János Benjamin Antal). - 为 ObjectStorage 读取操作添加了取消检查。关闭 #98165。#103016 (Smita Kulkarni).
- 在解码 aggregate function 参数时遵循
input_format_binary_max_type_complexity。关闭 #102903。#103026 (Pavel Kruglov). - 修复了基于 Arrow 的 Parquet reader 中 geo 列的 nullable 推断问题。关闭 #101845。#103032 (Pavel Kruglov).
- 修复了
recursiveRemoveLowCardinality会清除自定义 geometry type name (例如LineString与Ring、MultiLineString与Polygon) 的问题,该问题会导致 geometry type 被错误解释。关闭 #103207。#103041 (Joanna Hulboj). - 修复了在
max_insert_block_size_bytes为0(默认值) 时,INSERTparsing 过程中input_format_max_block_size_bytes被静默忽略的问题。该 setting 现在会正确限制由行 input formats 生成的块大小。#103068 (Kirill Kopnev). - 修复了 ClickHouse 因错误剥离尾随 null byte 而偶尔生成无效 GSSAPI 标记的问题。#103114 (Michael Jarrett).
- 修复了 analyzer 阶段对短路函数 (
if、multiIf、and、or等) 的常量折叠问题,因此静态上不可达的分支不再在分析阶段触发异常。例如,WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n))现在会正确返回0,而不是因除零错误失败。#103157 (Peng). EXPLAIN SYNTAX会展开 parameterized views。#103263 (Jordi Villar).- 修复了通过
INSERT INTO FUNCTION hdfs(...)向 HDFS 写入 Parquet (以及其他带尾部标记的格式,如 ORC 和 Arrow) 时发生的数据损坏问题。自 26.1 起,WriteBufferFromHDFS不会在finalize()时刷新其工作缓冲区,因此每个文件末尾最多DBMS_DEFAULT_BUFFER_SIZE字节都会被静默丢失,其中包括 Parquet 的PAR1footer。读取此类文件会返回Not a Parquet file (wrong magic bytes at the end of file)。#103268 (Groene AI). - 修复了在同时设置 join 大小限制 (
max_rows_in_join/max_bytes_in_join) 和join_overflow_mode = 'break'时,相关子查询可能产生错误结果以及潜在逻辑错误的问题。现在,内部为评估相关子查询而创建的 join 会忽略这些用户限制,因此不再会提前停止并丢弃行。#103322 (Groene AI). - 修复了一个 bug:在
EmbeddedRocksDB表上执行ALTER TABLE ... MODIFY SETTING时,即使服务器拒绝了该查询,也可能将无效的设置值持久化到表元数据文件中。下一次服务器重启时,该表会因CANNOT_PARSE_BOOL(或类似的解析错误) 而无法附加;而在将加载失败视为致命错误的数据库中,服务器将拒绝启动。现在会在写入任何元数据之前先拒绝无效的设置值。#103417 (Groene AI). - 修复了在使用不受支持的参数数量创建对象存储引擎 (
AzureBlobStorage,DeltaLakeAzure,S3,HDFS) 表时服务器中止的问题。现在,服务器会返回明确的NUMBER_OF_ARGUMENTS_DOESNT_MATCH错误,而不是在 debug/sanitizer 构建中中止。#103544 (Groene AI). - 修复了
JSON和Dynamic数据类型参数解析中的服务器崩溃问题:当抽象语法树 (AST) 在结构上格式错误时 (例如由 AST fuzzer 生成) ,equals(name, value)参数表达式可能只剩少于两个子节点,而DataTypeObject和DataTypeDynamic随后会在没有边界检查的情况下解引用它。#103545 (Groene AI). - 修复了 analyzer 在 PREWHERE 中使用 lambda 时因列名冲突导致的逻辑错误。关闭 #103584。#103627 (Pavel Kruglov).
- 修复了在异步加载元数据期间,当
Iceberg引擎表在常规数据库中加载时,DataLakeConfiguration::getCatalog偶发抛出Logical error: 'Database <name> not found'的问题。#103775 (Groene AI). - 修复了在启用并行副本且
parallel_replicas_local_plan = 0时,运行引用PREWHERE/WHERE/HAVING/QUALIFY中投影别名的查询 (例如SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c) ,或对列名重叠的自连接执行SELECT *时,远程副本抛出MULTIPLE_EXPRESSIONS_FOR_ALIAS错误的问题。关闭 #74324。#103806 (Groene AI). - 修复了当查询在具有多个
minmax跳过索引且use_skip_indexes_for_disjunctions = 1的MergeTree表上使用嵌套coalesce/ifNull比较 (例如WHERE coalesce(a, b, coalesce(c, d), e) = const) 时服务器中止的问题。现在,针对<op>(coalesce(...), const)的跳过索引重写会递归应用到内部 coalesce 参数,因此每个索引的KeyConditionRPN 会与模板的 RPN 匹配,这正是析取跟踪代码原本假定的行为。#103929 (Groene AI). - 修复在新 analyzer 下,
GLOBAL IN和GLOBAL JOIN查询中max_rows_to_transfer与max_bytes_to_transfer被静默忽略的问题。现在,当物化的外部表超过配置限制时,这些设置会触发SET_SIZE_LIMIT_EXCEEDED(或根据transfer_overflow_mode中断) ,与旧 analyzer 的行为一致。关闭 #103333。#104119 (Groene AI). - 修复在启用
show_data_lake_catalogs_in_system_tables时,DataLake catalog 数据库中的INSERT或 DDL 语句引用不存在的表而导致过度读取 catalog/S3 元数据的问题。拼写提示建议路径会为整个 catalog 加载每个表的完整 Iceberg 元数据,这在大型 catalog 上可能耗尽内存。#104124 (DQ). - 修复一个崩溃问题 (在调试构建中表现为
LOGICAL_ERROR“Columns are assumed to be of identical types, but they are different in Nullable”,在 release 构建中表现为ColumnString::compareAt空指针 SIGSEGV) 以及一个错误结果问题;当查询使用directjoin_algorithm,且右侧表为MergeTree时,如果查找查询计划在优化过程中重排列,就可能出现这些问题。右侧列可能会落入名称错误的槽位,因此对连接键的过滤器或比较会读取到类型错误的列。该问题由 AST fuzzer 以 STID 2139-5111 发现,并在 #107272 中报告。#104174 (Groene AI). - 修复对
Date的越界整数分区 ID 的处理:现在会直接拒绝,而不是在ALTER时发生静默溢出或报出LOGICAL_ERROR。#104250 (Azat Khuzhin). - 在并行副本、analyzer 且没有查询计划序列化的情况下禁用
additional_table_filters。此前这可能导致错误结果。#104296 (Azat Khuzhin). - 修复
dictGetOrNull在使用Nullable键列且其值在字典中缺失时,会静默用NULL覆盖SELECT投影中其他列的问题。该函数此前会原地修改一个输入别名的 null map;现在它会在变更前深拷贝结果列。关闭 #73633。#104327 (Groene AI). - 修复在执行
ALTER TABLE ... DROP PARTITION ID 'patch-...'后再执行DETACH/ATTACH TABLE时损坏的 patch part 问题。此前,空的 covering part 在写入时缺少partition.dat和source_parts.dat,导致下一次 attach 或服务器重启后,system.detached_parts中出现broken-on-start_patch-...条目。关闭 #93132。关闭 #102103。#104353 (Groene AI). - 修复
HTTP接口以及INSERT SELECT FROM input的流式INSERT在配合input_format_max_block_wait_ms时的问题,使部分输入块会在请求结束前刷写出去。#104534 (Alexey Milovidov). - 修复了一个 bug:在
JOIN之后将arrayJoin与ORDER BY ... LIMIT组合使用的查询,可能会静默返回零行。由于arrayJoin可能改变行数,因此当被上提的表达式中包含arrayJoin时,不再应用将函数求值提升到SortingStep之上的查询计划优化。关闭 #82279。#104558 (Groene AI). - 修复了销毁
MergeTree系列表时罕见的 server 中止问题。当shutdown在后台作业调度器完全停止前抛出异常时,可能会触发该中止:如果后台任务恰好在这段极短的时间窗口内运行,就会通过一个已部分销毁的存储对象分派一次 virtual 调用,并触发__cxa_pure_virtual。#104561 (Groene AI). - 修复了
JSON组合 subcolumn 与包含 null value 的 type hint 结合使用时结果不一致的问题。#104584 (Pavel Kruglov). - 修复了当聚合投影中包含多个带不同
IN (...)条件的sumIf聚合时,结果错误或遗漏 projection 的问题。#104765 (Jimmy Aguilar Mena). - 修复了在
JOIN ON中使用arrayJoin()时返回行数错误的问题:结果会额外再乘一次数组长度。#104785 (Shaohua Wang). - 修复了
deltaSumTimestamp在有符号整数类型跨越零点时返回错误结果的问题。解决了 #104750。#104830 (Konstantin Bogdanov). - 修复了使用 NULL 常量进行过滤下推后,UnionStep 中 block 结构不匹配的问题。关闭 #104821。#104853 (Pavel Kruglov).
- 修复了对刚附加、且其元数据文件已损坏或无法加载的
Iceberg、DeltaLake或Hudi表执行DELETE FROM时抛出的Logical error: 'Metadata is not initialized'。现在会改为报告常规的用户可见异常,server 也会继续运行。关闭 #104891。#104917 (Groene AI). - 修复了配置变更时
max_memory_usage_soft_limit不会动态更新的问题。此前,软内存限制只会在启动时计算一次并缓存,因此后续配置重载不会生效。修复后,每次配置重载时都会立即重新计算并应用该限制,无需重启 Keeper。#104940 (Kai Zhu). - 修复了 macOS 上的 JIT 符号解析问题,因此 sort、expression 和 aggregate 的 JIT 编译不再因
CANNOT_COMPILE_CODE: Could not find symbol _<name>而失败。#104946 (Alexei Fedotov). - 修复了在新 analyzer 下启用
optimize_skip_unused_shards_rewrite_in时,执行如下形式查询会出现的异常 (即向量加固中的Received signal 6 (abort),表现为对空向量调用Tuple::back()) :SELECT ... FROM <Distributed table> WHERE/HAVING/GROUP BY ... (sharding_key_column IN tuple())。#104966 (Alexey Milovidov). - 修复了在 debug / sanitiser 构建中,类似
CREATE TABLE t (c0 Int CODEC(not((not(materialize(1), materialize(2)))), ZSTD)) ENGINE = Memory这样的查询触发Logical error: 'Inconsistent AST formatting'并导致服务器中止的问题 (STID 1941-1bfa) 。格式化器现在不再为出现在CODEC/STATISTICS/BACKUP_NAME参数列表中的多参数tuple(...)函数调用生成多余的外层括号 (这些位置禁用了操作符形式(a, b)) ,从而保持 format-parse-format 往返稳定。 #104991 (Groene AI). - 修复了
ALTER TABLE ... MATERIALIZE INDEX在 25.8 创建、且包含基于通过单独ALTER TABLE ... ADD COLUMN添加的列所建跳过索引的分片上抛出NOT_FOUND_COLUMN_IN_BLOCK的问题。现在在强制重新计算期间,变更会正确读取该分片上所有既有跳过索引和 PROJECTION 所需的每一列。关闭 #104872。 #105039 (Groene AI). - 修复了启用
enable_materialized_cte的查询中会抛出的两类LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized情况:(1) 一个被复用的 materialized CTE,且通过另一个 materialized CTE 上的IN (subquery)进行过滤;(2) 一个 materialized CTE 既被直接引用,又在命中 MergeTree 主键的嵌套 IN-subquery 中作为WHERE ... IN (...)过滤条件的一部分被引用。对相同查询执行EXPLAIN也会受到影响,因为这些 bug 会在计划优化阶段触发。关闭 #101940,关闭 #102320。 #105041 (Dmitry Novik). - 修复了
Float32列的countmin统计信息在PREWHERE中的选择性估算问题。两个 bug 会导致countmin统计信息对Float32列静默地产生错误估算:ConditionSelectivityEstimator在列类型 (Float32) 比字面量类型 (Float64) 更窄时会完全跳过统计信息,回退到默认选择性并忽略 sketch;而StatisticsCountMinSketch::estimateEqual会对Field对象前 N 个字节进行哈希,但Field将Float32存储为Float64(NearestFieldType<Float32>=Float64) ,因此查询时使用的字节模式与构建期间存储的实际Float32字节并不一致。 #105047 (Han Fei). - 对于提供了存储子句 (
ORDER BY、PARTITION BY、PRIMARY KEY、SAMPLE BY、TTL、UNIQUE KEY或引擎SETTINGS) 但未提供ENGINE的ATTACH TABLE name <clauses>;查询,现在会抛出BAD_ARGUMENTS,而不是静默地按已存储定义重新附加该表并丢弃用户提供的子句。查询级会话SETTINGS(例如log_comment) 仍会生效。可使用ATTACH TABLE t;按已存储的 metadata 重新附加,或在ATTACH之后使用ALTER TABLE t MODIFY SETTING ...修改设置。 #105068 (Groene AI). - 修复了
runningAccumulate在对聚合函数返回其自身状态的列调用时出现的 use-after-free 问题 (例如uniqStateOrDefaultState、sumStateOrDefaultState、uniqStateForEachState) 。 #105085 (János Benjamin Antal). - 修复了 Web UI (
play.html) 中的一个 bug:当光标位于唯一一个末尾;之后时运行查询,会报出 “empty query”,而不是执行该查询。 #105107 (Alexey Milovidov). - 修复了
Replicateddatabase 中的一个问题:当CREATE TABLE ... AS SELECT从system.current_roles或system.enabled_roles读取时,会报错LOGICAL_ERROR: 'No user in current context, it's a bug'。现在,该查询在这个内部 DDL worker 上下文中可以成功执行,并返回空结果集。#105150 (Groene AI). - 修复了在合并
quantileExactWeightedInterpolated、quantileDD或quantilePrometheusHistogramaggregate states 与其对应的复数形式quantilesXxxMerge时出现的ILLEGAL_TYPE_OF_ARGUMENT错误 (反之亦然) 。这三个 quantile 系列的单数和复数变体共享相同的内部 aggregate state,但之前未被列入内部名称映射表,因此跨函数的状态合并——以及这些系列的函数融合 optimization——都会被拒绝。#105189 (Groene AI). - 修复了
toStartOfWeek、toLastDayOfWeek、toMonday、toStartOfMonth、toLastDayOfMonth、toStartOfQuarter和toStartOfYear在处理结果超出Date范围的Date32和DateTime64argument 时返回错误结果的问题:现在结果不再溢出到任意日期,而是将早于1970-01-01的结果限制为1970-01-01,将晚于2149-06-06的结果限制为2149-06-06。这也修复了当这些函数在WHERE中作用于包含越界值的Date32或DateTime64key 时产生的错误查询结果 (即错误裁剪的 parts 和 granules) 。#105244 (Yarik Briukhovetskyi). - 修复了
arrayRemove中的一个逻辑错误:当第一个 argument 是Variant数组,且其所有备选类型都与第二个 argument 的类型不兼容,同时禁用了variant_throw_on_type_mismatch时,就会触发该问题。现在该函数会将比较视为“永不相等”,并原样返回数组,而不是触发 server-sideassertTypeEquality失败。#105248 (Groene AI). - 即使
FileCache在 disk 上为 caching 创建某些 directory 失败,查询现在也仍然可以成功执行。#105250 (Den Kalantaevskii). - 修复了
ExtremesTransform中导致 server 中止的问题:当启用extremes = 1的查询在转换器基于首个 chunk 构建 extremes columns 时遇到异常 (例如MEMORY_LIMIT_EXCEEDED) ,会触发Assertion 'px != 0' failed。现在客户端会收到原始异常,而不会导致 server 崩溃。#105264 (Groene AI). LEFT ANTI JOIN现在会为未匹配的行正确返回右侧连接键列的默认值,而不是重复左侧键值。此前,SELECT a.x AS l, b.x AS r FROM a LEFT ANTI JOIN b ON a.x = b.x在未匹配行中可能返回r = a.x,而正确结果应为默认值 (Int32为0,String为'',Nullable为NULL) 。只有连接键列受此问题影响;右侧的非键列此前已经能正确返回默认值。当优化器交换两侧时,RIGHT ANTI JOIN中也会出现同样的 bug。关闭 #99959。#105278 (Groene AI).- 修复了
clickhouse-local在使用非default的--default_database反复启动时发生的数据丢失问题 (例如clickhouse-local --path X -- --default_database=mydb) :持久化数据库 UUID 的查找路径被硬编码为metadata/default,因此每次重启都会生成新的 UUID,导致上一次运行中的表变得不可见。关闭 #101831。#105284 (Groene AI). - 修复了运行
ALTER TABLE <memory_table> APPLY PATCHES或ALTER TABLE <memory_table> APPLY DELETED MASK时触发的逻辑错误Mutation ofMemorytable produced incomplete output。Memory表并不拥有 patch parts 或 deletion masks,因此这两个命令现在都会被正确视为无操作。#105286 (Groene AI). - 通过在查询请求中传递
table_id参数,修复了 Unity Catalog 中长时间运行查询的问题。#105303 (Konstantin Vedernikov). - 修复了在
distributed_group_by_no_merge=1时,Distributed上两层Merge的CANNOT_CONVERT_TYPE问题。#105330 (Azat Khuzhin). - 修复了
clickhouse local和clickhouse client在同时提供位置参数形式的文件参数时,会静默忽略--query/-q的问题。现在这两种形式都会一致地返回BAD_ARGUMENTS。#105334 (Raúl Marín). - 修复了
REPLACE TEMPORARY TABLE在目标不存在时静默创建新表的问题。现在它会抛出UNKNOWN_TABLE,与REPLACE TABLE的语义一致。若要保留 create-or-replace 行为,请使用CREATE OR REPLACE TEMPORARY TABLE。#105373 (Groene AI). - 修复了从
catalog_type = 'glue'的DataLakeCatalog数据库执行长时间读取操作 (例如INSERT ... SELECT) 时可能失败的问题:当在加载表元数据时获取的 STS 会话凭证过期后,会报ExpiredToken错误。现在 AWS STS 凭证会在查询执行过程中刷新,因此这类读取可在标记过期后继续进行。#105381 (Pratima Patel). - 修复了在某些情况下配合
ARRAY JOIN使用负数LIMIT BY时出现的逻辑错误。#105403 (Nihal Z. Miaji). - 修复了读取 Parquet 文件时被高估的
read_bytes(以及system.query_log、进度条等中显示的派生 bytes/s) 。此前的实现会在每个 chunk 上报整个行组的总压缩后大小,因此读取 N 列中的 K 列时会按N / K高估。现在只会对所选列求和。还修复了 Iceberg 表的文件级进度跟踪问题,此前它从不报告数据文件大小。#105413 (Groene AI). - 修复了 cluster 表函数 (
s3Cluster、urlCluster、fileCluster、…) 中的一个潜在服务器段错误:当规划器生成带有recursive_with标志但没有WITHexpression 的SELECT时,可能会触发该问题。关闭 #105370。#105433 (Groene AI). - 修复了在
count_distinct_optimization = 1时,Nullable列上的countDistinct/uniqExact结果错误问题 (此前错误地将 NULL 分组计入统计) 。#105439 (Raúl Marín). - 修复了读取 Arrow 或 ArrowStream 文件时的堆缓冲区溢出问题:当二进制列或字符串列中的中间 offsets 损坏时会触发;同时还修复了读取带地理标签的 Arrow 列时的空指针解引用问题。#105449 (Raúl Marín).
- 在 window
PARTITION BY中校验Dynamic/Variant类型;此前在禁用allow_suspicious_types_in_group_by时,不会进行这项检查。关闭 #105028。#105450 (Pavel Kruglov). - 修复
input_format_json_empty_as_default在 JSONStrings* formats 中不起作用的问题。关闭 #104913。#105453 (Pavel Kruglov). - 修复在表达式 parsing 期间,通过
VALUESformat 向Variant列 insertNULL的问题。关闭 #104909。#105455 (Pavel Kruglov). - 修复
dictGetOrDefault抛出CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN的问题:当默认 argument 为Nullable表达式,且启用了short_circuit_function_evaluation,同时字典 key 同时包含可找到和找不到的情况时会触发。#105461 (Raúl Marín). - 修复
Dynamic列中静默发生的值截断问题:当Quoted(Values) 文本 reader 对Map(Array(Nothing), ...)这类未完整推断的 types 回退到String时会出现该问题。此前,这种回退会通过简单的'...'concatenation 包装原始 field,因此内部的单引号 (这类回退中始终存在) 会提前结束带引号的字符串,导致后续值丢失。#105463 (Groene AI). - 修复在
ALTER之后,从压缩的Memory表读取Dynamicsubcolumns 时出现的 SIGSEGV。关闭 #104901。#105464 (Pavel Kruglov). - 修复
toFloat64/toUInt32/toString/etc. 对Dynamic的处理忽略cast_keep_nullable的问题。关闭 #104789。#105467 (Pavel Kruglov). - 在
WithNamesformats 的 schema cache key 中加入skip_first_lines。关闭 #104527。#105469 (Pavel Kruglov). - 修复在配合
GROUP BY ... WITH ROLLUP、WITH CUBE或WITH TOTALS使用,且 argument 为 Nullable 时,uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(以及uniq上类似的组合器链) 导致的 server segfault 问题。#105470 (Groene AI). - 修复在启用 analyzer 时,同时使用
ORDER BY ... WITH FILL INTERPOLATE和LIMIT N BY会导致NOT_FOUND_COLUMN_IN_BLOCKException 的问题。关闭 #103474。#105481 (Yakov Olkhovskiy). - 修复
toStartOfMillisecond和toStartOfMicrosecond在负数 (epoch 之前) 的DateTime64值上返回结果偏差近一秒的问题,并修复UndefinedBehaviorSanitizer在toStartOfSecond、toStartOfMillisecond和toStartOfMicrosecond中对接近INT64_MIN的DateTime64输入报出的有符号整数溢出问题。 #105482 (Groene AI). - 新增兼容性设置
analyzer_compatibility_prefer_alias_over_subcolumn(默认禁用) 。启用后,新的 analyzer 在解析多部分标识符时,会优先按 alias 前缀来解释,而不是匹配Tuple子列 / 点号列,从而恢复旧解释器的行为。这可避免以下情况下出现AMBIGUOUS_IDENTIFIER(及相关) 错误:查询 join 了一个表,而该表名恰好与某个 CTE/子查询中的内部表同名,且该 CTE/子查询在 join 结果上使用了SELECT *。否则,由星号重命名的列 (如b.id) 会将内部表标识符泄漏到外层作用域。 #105491 (Vladimir Cherkasov). - 使用 index only 优化执行的 vector search 查询,现在如果
SELECT列表中包含L2Distance(),将返回正确的值。此前该函数错误地返回了 L2-squared 距离值。请注意,vector search 查询返回的结果排序本身一直是正确的;只有那些明确获取并解释L2Distance()值的应用程序,才会看到这个平方后的值。 #105495 (Shankar Iyer). - 修复新 Kafka table engine 中一个罕见问题:在 topic 分区重新分配期间,消息可能会被错误处理,从而在 offset 回滚后可能导致消息被跳过。 #105500 (János Benjamin Antal).
- 修复当主体为 correlated subquery 的
MATERIALIZEDCTE 被用作IN右侧时出现的异常 (Trying to execute PLACEHOLDER actionlogical error) 。现在,这类 CTE 会在分析阶段被拒绝,这与在FROM中直接引用该 CTE 时对相同模式的处理保持一致。 #105518 (Groene AI). - 修复显式指定 format 时未应用 stdout/stdin 压缩的问题。关闭 #104441。 #105528 (Pavel Kruglov).
- 修复
JSON类型在singleValueOrNull反序列化时出现的段错误。关闭 #103630。 #105535 (Pavel Kruglov). - 修复
clickhouse-format --backslash静默丢弃INSERTVALUES数据的问题。关闭 #103533。 #105536 (Pavel Kruglov). - 修复
variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false在函数执行期间未捕获异常的问题。关闭 #103484。 #105543 (Pavel Kruglov). - 修复向
JSON中的 shared data 插入数据时忽略input_format_try_infer_datetimes的问题。关闭 #103221。 #105544 (Pavel Kruglov). - 修复
histogram在小规模未排序输入下产生错误结果的问题。关闭 #103109。#105548 (Pavel Kruglov) 。 - 修复
JSONExtract和文本反序列化中,超出范围的值导致DateTime回绕的问题。关闭 #103094。#105551 (Pavel Kruglov) 。 - 修复启用
optimize_trivial_insert_select时,table functions 中 insertion table 的使用问题。关闭 #103083。#105555 (Pavel Kruglov) 。 - 修复
CASE表达式在表达式本身和某个WHEN值都为NULL时,返回ELSE分支而不是匹配的THEN分支的问题。#105556 (Raúl Marín) 。 - 修复
replxx因触发select的FD_SETSIZE限制而导致的崩溃 (现已改为使用poll) 。此前,启用 SSH 或 Web 终端 时,这可能导致 server 崩溃。#105559 (Azat Khuzhin) 。 - 在执行表达式前,先在
executePartitionByExpression中物化 subcolumns。关闭 #103057。#105573 (Pavel Kruglov) 。 - 修复
TTL表达式引用 subcolumn 时触发的NOT_FOUND_COLUMN_IN_BLOCKException。#105578 (Pavel Kruglov) 。 - 修复一个 server 崩溃 (SIGSEGV) 问题:任何拥有
CREATE TABLE权限的用户,都可通过 HTTP 或 native protocol 发送不带ENGINEclause 的CREATE TABLE ... TO INNER UUID '...'来触发该问题。相同的 bug 也会导致 client 崩溃。parser 现在会正确报告BAD_ARGUMENTSerror,而不是解引用空指针。#105579 (Groene AI) 。 - 修复
estimateCompressionRatiowindow function 在行与行之间丢失累计数据的问题。关闭 #101738。#105581 (Pavel Kruglov) 。 - 修复向
String列插入同一 VALUES clause 中大小不同的 tuples 时发生的崩溃。关闭 #101727。#105582 (Pavel Kruglov) 。 - Hive 分区值提取现在会遵循
cast_string_to_date_time_modesetting,并且默认接受 partition key 中带有 timezone 后缀的 ISO 8601 timestamps (例如+0000、+00:00、Z) 。#105584 (Alexey Milovidov) 。 - 修复
DateTime搭配包含NULL值的 Timezone 调用toString时出现的NOT_IMPLEMENTEDerror。关闭 #103712。#105587 (Yarik Briukhovetskyi) 。 - 修复 flattened
Dynamic列在Native反序列化中的 OOB 读取问题。#105666 (Pavel Kruglov) 。 - 修复了对
if表达式进行查询计划时触发的LOGICAL_ERROR(Unexpected return type from if) :当结果类型为Variant,且第二或第三个分支是一个基于可放入Int64的UInt64字面量的常量条件if时,会出现该问题。关闭 #105649。#105680 (Groene AI). - 修复了在另一个未启用该设置的 writer (例如
icebergLocal/icebergS3表函数) 推进表之后,使用iceberg_use_version_hint = 1读取 Iceberg 表时结果错误的问题。现在只要该文件存在,每个 writer 都会保持version-hint.text同步,因此后续使用该 hint 的读取器都能看到最新的 snapshot。#105682 (Groene AI). - 修复了在
use_query_condition_cache = 1(默认) 时,SELECT查询会静默少计数的问题。对带有 bloom-filter 跳过索引的列执行形如PREWHERE pk_prefix = X WHERE non_pk IN (...)的查询时,会污染pk_prefix = Xpredicate 对应的QueryConditionCache,从而导致后续正常的SELECT count() ... WHERE pk_prefix = X返回错误的偏少结果。影响所有 26.x 发行版。#104781。#105686 (Groene AI). - 修复了
singleValueOrNullMerge在合并已经观察到多个不同值的状态时,返回具体值而不是NULL的问题。#105734 (Minh Vu). - 修复了
Template输入格式在遇到格式错误的行后进行错误恢复时的问题。#105735 (Yue Ni). - 修复了
mongodb表函数、MongoDB 存储和 MongoDB 字典源中,当 collection 名称为空或包含 NUL 字节时发生崩溃的问题。#105776 (Raúl Marín). - 修复了
Keeper在写入失败后的 snapshot 清理问题,使不完整的 snapshot 能被安全清理,并且失败的写入可在不推进latest_snapshot_meta的情况下重试。#105779 (Antonio Andelic). - 修复了显式
SummingMergeTree和CoalescingMergeTree的columns_to_sum列不允许执行ALTER TABLE ... CLEAR COLUMN的问题。#105785 (Antonio Andelic). - 修复了在创建数据库名称通过查询参数提供的参数化视图时,
DatabaseCatalog::tryGetDatabase中的断言失败问题 (以及在发布构建中由此导致的UNKNOWN_DATABASE错误) ,例如CREATE VIEW {db:Identifier}.v AS SELECT {p:UInt64}。现在,CREATEstatement 的 DDL 部分中的参数会在创建时替换,而 SELECT 主体中的参数仍可在调用视图时替换。#105799 (Groene AI). - 修复了对
Nested(... Nullable(Decimal(P, S)))列上的sumMap和sumMapWithOverflow进行 aggregate state 序列化时 (例如并行副本、通过二进制状态格式说明符的sumMapState、external aggregation) ,出现Bad get: has Decimal32, requested Decimal128的问题。#105816 (Groene AI). - 修复了在表上使用
apply_mutations_on_fly = 1时,如果在ALTER MODIFY COLUMN ... LowCardinality(...)变更之前,队列中已有待处理的即时UPDATE/DELETE变更,会出现Expected ColumnLowCardinality, got String/Bad cast from type DB::ColumnString to DB::ColumnLowCardinality错误的问题。#105847 (Raúl Marín). - Iceberg 现在会在
Nullable(T)分区列写入时保留 NULL 值。此前,由 ClickHouse 写入的 NULL 在被 Spark 或其他 Iceberg reader 读回时,会显示为内部类型的默认值 (int为0) 。关闭 #105852。#105862 (Groene AI). - 修复了
Parquet和ORC针对IN (subquery)谓词的过滤器下推问题,使 row-group/page/bloom-filter 剪枝可用于file、url、s3和对象存储读取。#105863 (Arsen Muk). - 修复了
Merge表的按序读取问题 (在使用新的 analyzer 时) 。#105867 (Nikolai Kochetov). - 修复了 Iceberg v2 merge-on-read position deletes 在单个删除文件引用多个数据文件,且多个此类删除文件同时作用于同一个数据文件时返回错误行的问题。流式 reader (
use_roaring_bitmap_iceberg_positional_deletes = 0) 现在会在 C++ 中按file_path过滤删除文件中的行,而不再依赖 Parquet row-group 剪枝,从而恢复 position 递增这一 invariant。#105888 (Groene AI). - 修复了新的 analyzer 在分布式查询中使用
IN Array(...)过滤器时出现Cannot find column错误的问题。#105894 (Nikolai Kochetov). - 修复了在
MergeTree表上执行ALTER TABLE ... MODIFY COLUMN ... Nullable(...)时可能出现的 SIGSEGV 问题:当带有STATISTICS的列被另一个ALTER并发删除时,会触发该问题。关闭 #105912。#105917 (Groene AI). - 修复了一个可能导致服务器崩溃的问题:当通过 postgresql table function、PostgreSQL table engine,或使用 PostgreSQL 源的字典从 PostgreSQL 读取的查询被取消 (例如使用 KILL QUERY) ,且取消远端 PostgreSQL 查询失败时,就可能发生该问题。#105949 (Rory Shanks).
- 修复了
SYSTEM INSTRUMENT ADD的 formatting,使处理器参数之间只用一个空格分隔;同时会拒绝无效的SLEEPinstrumentation 参数列表,例如包含超过两个值,或范围中最小值大于最大值的情况。#105984 (Pablo Marcos). - 修复了某些查询可能返回错误结果的问题:当查询将外连接与后续引用该外连接 null-supplying side 的内连接组合使用时,join 重排序可能会选出一种执行计划,将内连接条件拉入外连接的 ON 子句中。#105992 (Vladimir Cherkasov).
- 修复了由于查询中发送了过大的字符串字面量而可能导致崩溃的问题。#105996 (Nikita Taranov).
- 修复在
ORDER BY中使用排序前缀并启用use_with_fill_by_sorting_prefix时,配合INTERPOLATE ()(空) 会触发INVALID_WITH_FILL_EXPRESSION异常的问题。现在会正确地将排序前缀列排除在隐式插值集合之外,与显式指定的INTERPOLATE (col)行为一致。#106001 (Yakov Olkhovskiy). - 修复
Bool分区键的ALTER TABLE分区操作会静默失败的问题。关闭 #101722。#106004 (Pavel Kruglov). - 修复带默认值的类型化
JSON路径中JSONExtractRaw和JSONHas的问题。关闭 #101721。#106005 (Pavel Kruglov). - 修复数据湖配置中为空的 basepath 被错误添加 ’/’ 前缀的问题。关闭 #105989。#106013 (thewisenerd).
- 修复
IcebergLocal表引擎在经历DETACH+ATTACH循环或服务器重启后变为只读的问题,这会导致之后每次INSERT都因Local object storage Local is readonly. (READONLY)而失败。#106016 (Groene AI). - 修复
Keeper在 follower catch-up 期间发生故障的问题:新的请求分发器响应队列可能会在线程启动前就被填满。#106049 (Antonio Andelic). - 改进与旧版 analyzer 的兼容性。如果表中有类似
x.a Array, x.b Array, x String的列,则对ARRAY JOIN x会优先选择数组。#106069 (Nikolai Kochetov). - 修复 Azure Blob 存储上的文件系统缓存被静默禁用的问题 (例如 Azure 上的 Delta Lake 表) ,原因是对象元数据中未包含 blob ETag。#106091 (thewisenerd).
- 修复在部分撤销
SHOW DICTIONARIES权限时,system.dictionaries返回 0 行的问题。#106105 (Pavel Kruglov). - 修复在启用
allow_experimental_delta_kernel_rs且凭证或选项包含无效字节时,查询 DeltaLake 表会导致服务器崩溃的问题 (Rust FFI 在extern "C"边界发生 panic) 。#106109 (Raúl Marín). - 修复对
ORDER BY包含单调递减函数 (如(c0 / -42)或intDiv(c0, -42)) 的表进行查询时结果错误的问题。底层列上的谓词 (例如c0 < 0) 可能会错误地裁剪包含匹配行的粒度,从而导致结果缺失。关闭 #106084。关闭 #106124。关闭 #106080。#106136 (Nihal Z. Miaji). - 修复对在
MATERIALIZED VIEW定义中使用WASMSQL UDF 的支持问题。#106161 (Yue Ni). - Iceberg 分区剪枝现在可以正确处理
WHERE partition_col = (SELECT ... FROM ...)过滤条件:在这种情况下,analyzer 会将标量子查询结果包装为内部_CAST(Const, 'TargetType'),且源类型与目标类型一致。此前,这类过滤条件会禁用分区剪枝并触发全表扫描。#106204 (Groene AI). - 修复了 clickhouse local 的
--query_id参数,使其支持指定自定义 Query id。#106205 (Yue Ni). - 修复了在
S3disks 和 object storage 上,通过分段上传写入对象时忽略 S3 storage class (s3_storage_class/s3_storage_class_name) 的问题,这会导致大对象以默认的STANDARD类别创建。现在,对 disks、object storage 和 backups,s3_storage_class与s3_storage_class_name这两个选项名都可以使用。#106214 (Alexey Milovidov). - 修复了 Keeper 在启动时有时会卡住的问题,该问题会在将 setting
nuraft_max_log_gap_in_stream设为非默认值时出现 (默认值为 0,即禁用append_entriesrequests 的流水线处理) 。#106220 (Michael Kolupaev). - 改为在插入时校验损坏的
DDSketchaggregate-function state (bin keys) ,不再接受格式错误的数据。#106236 (Yarik Briukhovetskyi). - 修复了当 subqueries 覆盖顺序设置时 coordinator 模式不匹配的问题。#106243 (Nikita Taranov).
- 修复了以下问题:当通过
Merge表或mergetable function 查询Distributed表,且 predicate 应用于其上层时,optimize_skip_unused_shards不生效 (以及force_optimize_skip_unused_shards会错误失败) 。#106250 (Nikolai Kochetov). - 修复了在旧 analyzer 下,如果
ORDER BYcolumns 在SELECT列表中使用了别名,INTERPOLATE ()会抛出INVALID_WITH_FILL_EXPRESSION的问题。关闭 #106248。#106252 (Yakov Olkhovskiy). - 修复了从
RowBinary输入或 query parameter 反序列化格式错误的AggregateFunction(uniqTheta, ...)state 时会中止的问题。现在,这类错误输入会以明确的CORRUPTED_DATA被拒绝,而不会以std::exception形式逃逸并通过abortOnFailedAssertion中止进程。#106260 (Groene AI). - 在
RowBinaryWithNamesAndTypes类型解码期间 (input_format_binary_decode_types_in_binary_format = 1) ,现在会拒绝超出范围的IntervalKind字节,并返回明确的INCORRECT_DATA错误;不再构造 kind 无效的DataTypeInterval,从而避免后续在哈希路径中触发未定义行为。#106261 (Groene AI). - 修复了
26.1+中SLRU降级失败时的回滚问题。修复了启用keep_free_space_ratiofeature 时System/Datacache 拆分优先级的问题。#106286 (Kseniia Sumarokova). - 在
Nullable(JSON)中,将null子列作为JSON路径读取,而不是作为 null-map 读取。关闭 #106085。#106295 (Pavel Kruglov) 。 - 修复了当 Iceberg REST catalog 包含表时,
RestCatalog::empty返回错误结果的问题。#106301 (Lefteris) 。 - 修复了在启用
enable_parallel_replicas、query_plan_use_new_logical_join_step和query_plan_optimize_join_order_algorithm = 'greedy'时,左侧MergeTree表为空的INNER JOIN查询抛出异常的问题。#106338 (Nikolai Kochetov) 。 - 修复了将非正规
Float16值错误转换为Float32的问题 (例如从 Numpy.npy文件中读取时) ;其原因是尾数移位差了一位。#106343 (Joanna Hulboj) 。 - 修复了在基于约束的优化 (
optimize_using_constraints) 与相关子查询一起使用时,可能导致崩溃和NOT_FOUND_COLUMN_IN_BLOCK错误的问题。#106349 (Raúl Marín) 。 - 修复了在对某一列计算哈希时,如果该列中的数组全部为空且 key 不是常量,
sipHash64Keyed、sipHash128Keyed和sipHash128ReferenceKeyed中会发生越界读取的问题。#106355 (Raúl Marín) 。 - 修复了
SYSTEM RELOAD CONFIG丢弃各 endpoint 的 Azure Blob 存储设置 (例如use_native_copy) 的问题,这会导致在服务器重启前,为BACKUP/RESTORE配置的磁盘设置无法生效。#106357 (Julia Kartseva) 。 - 修复了
regexpExtract(haystack, pattern):当 pattern 不包含 capturing group 时,返回整个匹配结果,而不是抛出INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE。#106374 (Groene AI) 。 - 修复了缓存预下载期间出现的
LOGICAL_ERROR异常,该问题会在远程 S3 对象于列出和读取之间被较短内容覆盖时发生。#106375 (Nikita Fomichev) 。 - 修复了文件系统缓存中的内存使用量增长问题。#106387 (Kseniia Sumarokova) 。
- 修复了 Arrow IPC format 读取器 (
ArrowColumnToCHColumn) 中的多个堆越界读取漏洞。格式错误的 Arrow 文件可能声明的行数超过其缓冲区实际包含的行数,声明与父对象不一致的 list/struct/map 子项长度,提供非单调递增的 list offsets,或截断子项有效性 bitmap,从而导致读取越过 heap allocations 的末尾。任何拥有SELECT权限的用户都可通过file()、format()、表函数或 ArrowFlight 输入触发此问题。现在,在进行任何原始指针访问之前,都会先验证所有 data、offsets、view-struct 和 validity-bitmap 缓冲区,并检查 list/struct/map 的形状和 offsets 是否一致。#106395 (Raúl Marín) 。 - 修复了以下情况下备份因
FILE_DOESNT_EXIST失败的问题:在 Replicated 或 Shared database 中收集可刷新materialized view 的 REPLACE 目标时,如果该 materialized view 尚未在发起备份的副本上实例化,就会出现此问题。#106411 (Julia Kartseva) 。 - 修复一个逻辑错误:当变更 (
DELETE/UPDATE) 的 predicate 包含IN/EXISTS子查询,且该子查询从嵌套在另一个子查询中的默认表表达式读取数据时,会出现Column identifier ... is already registered。#106414 (Alexey Milovidov) 。 - 修复 JOIN 顺序优化器中的一个逻辑错误 (
Left and right columns have same names) :当使用并行副本执行 join,且 join 图中的两个 relation 具有相同的列名时,可能会触发该错误。#106418 (Alexey Milovidov) 。 - 修复从包含
NaN或 infinite 点坐标的源数据构建 polygon dictionary 时的一个逻辑错误。现在这类坐标会被明确拒绝,并返回清晰的错误信息。#106423 (Alexey Milovidov) 。 - 修复一个 bug:
system.query_log的used_privileges和missing_privileges列中,可能包含泄露自其他用户、数据库或会话中更早且无关查询的 privilege 字符串。#106425 (Alexey Milovidov) 。 base58Encode、base58Decode和tryBase58Decode现在在处理大输入时会遵守max_execution_time和查询取消,并且会拒绝大于 10 KB 的输入,而不是长时间运行。该限制可通过新设置function_base58_max_input_size配置 (0表示禁用) 。#106428 (Alexey Milovidov) 。- 修复在
read_in_order_use_virtual_row_per_block = 1且max_block_size较小时,以逆序读取 wide parts 时,ORDER BY ... DESC查询偶发返回错误结果的问题。#106429 (Vladimir Cherkasov) 。 - 修复查询 Iceberg 或 S3 表时出现的
NOT_FOUND_COLUMN_IN_BLOCK异常:在使用 Parquet V3 读取器、且复合WHERE条件中对一个不在SELECT列表中的列使用IS NOT NULL时,会触发该问题。#106443 (Shaohua Wang) 。 - 允许用户使用 named collections 为
HTTPDictionary指定 headers。#106459 (Jan Rada) 。 - 修复一种情况:当
CurrentThread::attachToGroup在执行过程中部分失败后,worker thread 可能仍会附着在一个过期的 thread group 上,导致后续在同一线程上的任务因Thread is already attached to a group而失败。#106462 (Mikhail f. Shiryaev) 。 - 修复 vector search 查询在使用 vector index、同时使用另一个跳过索引 (如
minmax) ,且use_skip_indexes_on_data_read = 1时出现的异常。#106473 (Shankar Iyer) 。 - 现在会校验格式错误的
Avroenum 值,并在反序列化损坏的Avro数据时直接报错并拒绝处理,而不是导致越界读取并中止。#106476 (Miсhael Stetsyuk) 。 - 修复在使用
_file或_path过滤器从 Iceberg tables 读取时,进度报告被夸大的问题。此前,total_bytes_to_read进度会包含清单中的所有文件,而不考虑过滤条件。#106491 (Pedro Ferreira) 。 - 修复了 Redis 字典在使用
STORAGE_TYPE 'simple'、采用cache/directlayout 且仅有一个字符串 (复杂) 键时出现的Bad cast exception;这类字典现已可正常工作,而基于simplestorage 的复合键现在会报出明确的错误。#106501 (Vladimir Cherkasov). - 修复了错误结果问题:对于使用
ORDER BY f(c0)的表,当f(const)的计算结果为 NaN 时,例如带负常量的ORDER BY sqrt(c0),WHERE c0 = const会返回空结果。此前主键分析错误地剪枝了每个粒度,并污染了后续查询的 query condition cache。#106507 (Groene AI). - 修复了
LIMIT WITH TIES和分数形式的LIMIT WITH TIES在判定并列时未遵循ORDER BY ... COLLATE中 collation 规则的问题。按 collation 规则相等的行 (例如 numeric collation 下的'1'和'01') 此前是按字节比较的,因此部分并列行会被错误地从结果中丢弃。#106539 (Nihal Z. Miaji). - 修复了
DISTINCTin order 和LIMIT BYin order optimization (包括负数LIMIT BY) 在输入按带有 collation 的方式排序 (ORDER BY ... COLLATE) 时返回错误结果的问题。按 collation 规则相等的行 (例如在不区分大小写的 collation 下的'a'和'A') 会按 collation 键排序,因此在值上并不相邻,所以现在使用 collator 时会跳过 in order optimization。#106564 (Nihal Z. Miaji). - 修复了针对带有隐式
_minmax_count_projection、显式 aggregate projection 或普通 projection 的表执行SELECT c, count() FROM t WHERE c GROUP BY c时返回错误结果的问题:此前每个分组都会坍缩为一行,带有常量键,计数值则为总行数。#106590 (Groene AI). - 修复了一个 bug:当第二个参数是非常量元组时,用户无法在
IN的第一个参数中使用 scalar subqueries。#106610 (Yarik Briukhovetskyi). - 修复了在对
Memoryengine 执行对每行数据没有实际影响的ALTER TABLE <memory_table>命令时抛出的异常Mutation ofMemorytable produced incomplete output,具体包括APPLY PATCHES、APPLY DELETED MASK、MATERIALIZE STATISTICS、MATERIALIZE INDEX、MATERIALIZE PROJECTION和REWRITE PARTS。Memory表并不拥有这些结构,因此这类命令现在会被视为 no-op。#106621 (Groene AI). - 修复了将
LowCardinality(DateTime)列序列化为 text formats (CSV、TSV、JSONEachRow 等) 时忽略session_timezone的问题。此前,在某个 server 上首次写入LowCardinality(DateTime)列后,之后每个写出此类列的查询都会使用首次遇到的 timezone 来渲染 wall-clock 字符串,而不考虑session_timezone。#106634 (Groene AI). - 修复了这样一种查询触发的
LOGICAL_ERROR“Trying to get name of not a column:ExpressionList”:将星号作为multiIf内的参数传递给 table function 参数,例如numbers(multiIf(*, ...), 2)。现在该查询会以UNSUPPORTED_METHOD拒绝这个无法解析的 matcher。#106647 (Groene AI). - 修复了这样一个问题:当
MergeTree表的某个跳过索引分片粒度为 0,且磁盘上的 marks 文件非空时,服务器启动会失败,并报错Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0)。#106675 (Groene AI). - 拒绝会在目录列表中导致无限递归的异常
fileglob pattern。现在强制最大递归深度为 1000;超过该限制的查询会报出TOO_DEEP_RECURSION,而不是因栈溢出导致服务器崩溃。#106676 (Groene AI). - 修复了这样一个问题:当
if/multiIf条件经常量折叠后变为Const(Nullable(Nothing))时 (例如对空数组进行越界下标访问,如arraySort(x -> x, [])[toNullable(1)]) ,服务器会在FunctionIf::executeForConstAndNullableCondition中因Bad cast from type DB::ColumnNothing to DB::ColumnVector<char8_t>而中止。#106678 (Groene AI). - 修复了这样一个问题:当表函数
input被包装在一个在查询中被多处引用的非 MATERIALIZED CTE 中时,会抛出异常'Trying to read from input() twice.'。现在会在规划阶段以明确的INVALID_USAGE_OF_INPUT错误拒绝该查询。input是一次性的 client 流,在查询计划中只能由单个 source 消费。#106682 (Groene AI). - 使
FORMAT也可应用于EXPLAIN ... INSERT ... SELECT ... FORMAT ...的EXPLAIN输出,即使SETTINGS位于FORMAT之前,或者输出 format 为Values。这是对 #101772 的后续修复。#106686 (Alexey Milovidov). - 修复了一个罕见的误报
RESOURCE_ACCESS_DENIED错误 (“Scheduler queue with resource request is about to be destructed”) :查询实际上已经获得了 workload resource 的访问权限,但由于复用的线程本地 request 对象保留了前一个 request 的失败状态,仍然报错。#106690 (Alexey Milovidov). - 修复了 NATS 库中通过 callbacks 调用
INATSConsumer::onMsg与销毁INATSConsumer对象之间的竞争条件。#106692 (Miсhael Stetsyuk). - 修复了
match、extract、extractAll和countMatches在包含十六进制或八进制转义的 regular expression 中返回错误结果的问题。#106709 (ofeliacode). - Keeper 的内部 Raft TLS 现在会遵循
openSSL.client.verificationMode设置。此前,无论该设置如何,Keeper 之间 Raft 通信的 peer 证书验证始终处于启用状态,因此none会被静默忽略。现在,none会显式禁用 Raft peer 证书验证,而未设置该项时则保持此前默认安全的行为。升级后,显式设置none的配置将停止验证 Raft peer 证书,从而与配置意图保持一致。#106726 (Antonio Andelic). - 修复了
SYSTEM RELOAD CONFIG中启动 scripts 的 logical error。此外,现在会在SYSTEM RELOAD CONFIG时加载启动 scripts (当前仅为私有功能) 。#106727 (Miсhael Stetsyuk). - 回退了一项变更:该变更会使
sumMap/-Map组合器拒绝自定义命名的数值类型 (如SimpleAggregateFunction(sum, T)和Bool) ,并报错ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed,从而破坏了此前可正常工作的聚合计算。#106729 (Nikita Fomichev). - 修复了多个可由不可信输入触发的格式读取器中的内存安全和资源耗尽问题:包括原生 Parquet reader 的
DataPageV2definition/repetition level-length 处理中的堆越界读取、在具有深度嵌套 schema 的 Parquet files 上出现的栈溢出,以及在解析 GeoParquet WKB/WKT geometry 和 Avro strings/bytes 时忽略max_memory_usage的 allocations。#106739 (Raúl Marín). - 修复了
decodeHTMLComponent中的一个 heap buffer overflow (导致 server crash) :解码包含会展开的 HTML entities≫⃒或≪⃒的字符串时即可触发,任何用户只需执行一次SELECT即可利用该问题。#106741 (Raúl Marín). - 对于跳过索引,在
CREATE TABLE、ALTER TABLE ADD INDEX和CREATE INDEX中使用GRANULARITY 0时,现在会以明确的BAD_ARGUMENTSerror 拒绝。此前这会在 debug 构建中触发Inconsistent AST formattingexception。#106783 (Groene AI). - 修复了 Azure BACKUP/RESTORE 在旧式
azure_blob_storagedisk 上忽略端点设置的问题。#106784 (Julia Kartseva). - 修复了按
MinMaxstatistics 裁剪 parts 时出现的Bad castexception:当 key column 为LowCardinality,且 predicate constant 为LowCardinality(Nullable(...))时会触发该问题。#106793 (Groene AI). - 修复了解析过程中发生 exception (即
MEMORY_LIMIT_EXCEEDED) 时导致列不一致的问题 (后续会引发LOGICAL_ERROR) 。#106802 (Azat Khuzhin). - 修复了在配置
keeper_server.http_control.secure_port后,server 在向 HTTPS 客户端提供服务时却返回 HTTP 响应的问题。#106822 (linjiayu1025-collab). - 修复了
parseDateTime在处理非 ASCII 输入字节时的 logical error。#106856 (Pavel Kruglov). - 修复了
SHOW CREATE ROW POLICY输出restrictive/permissive时使用小写而非大写、与其他关键字不一致的问题。#106865 (Valery Petrov). - 修复了这样一种情况:由于
UNION中存在空表,导致并行副本未能应用到包含UNION的视图上。#106900 (Igor Nikonov). - 修复了在读取截断的
Protobuf数据且input_format_allow_errors_num > 0时发生的 server crash (SIGSEGV) 。#106905 (Andrey Tsarevskiy | Андрей Царевский ). - 修复了分布式查询中的
THERE_IS_NO_COLUMNexception:当涉及optimize_rewrite_aggregate_function_with_ifoptimization,且 aggregate function argument 需要转换为Nullabletype 时会触发该问题。#106908 (Yakov Olkhovskiy). - 修复了以下异常:当 join key 在
Tuple、Array或Map中嵌套了Variant或Dynamic类型,且 join 右侧只有一个 distinct 值时,JOIN 运行时过滤器会触发异常 (LOGICAL_ERROR) 。#106931 (Groene AI). - 修复了
arrayLevenshteinDistanceWeighted和arraySimilarity中的有符号整数溢出 (未定义行为) 问题,该问题会在权重数组包含较大整数值时出现。现在,对于整型权重,加权距离会累加到更宽的整数类型中,因此大整数权重不再溢出,并且仍能保持精确。#106934 (Groene AI). - 修复了以下服务器崩溃问题 (空指针解引用) :对 RocksDB 句柄已释放的
EmbeddedRocksDB表执行TRUNCATE或DROP时会发生崩溃,例如先前执行过TRUNCATE导致数据目录被清空的read_only表。#106940 (Groene AI). - 修复了从
*Cluster表函数 (如urlCluster) 读取数据时的异常 (被报告为LOGICAL_ERROR的std::length_error) ,该问题会在max_streams_for_files_processing_in_cluster_functions设置过大时出现。现在,流数量会被限制在合理范围内。#106946 (Groene AI). - 修复了以下服务器崩溃问题 (
DB::IConnections空指针解引用) :当分布式查询恰好在发送到分片前被取消时,RemoteQueryExecutor会发生崩溃。#106950 (Groene AI). - 修复了异步 insert flush (
AsyncInsertFlush) 查询在system.processors_profile_log和system.query_log中elapsed_us始终为 0,以及read_rows/read_bytes统计偏少的问题。#106982 (Christoph Wurm). - 修复了在合并包含
Variant列的已排序块时发生的崩溃 (Source column is not Map/SIGSEGV) ,该问题会在某个Map变体的本地存储顺序与全局顺序不一致时出现。#107011 (Groene AI). - 修复了向
ReplicatedMergeTree表同步插入时触发的逻辑错误conflicted_part_name.has_value():当插入块已被完全去重,且冲突分片的去重节点已经被移除时 (例如被并发的DROP PARTITION删除) ,就会出现该问题。#107026 (Groene AI). - 修复了
INSERT时发生的异常 (逻辑错误this->visited_views == right->visited_views) :当同一源表上的两个 materialized view 写入同一个目标表,且某个依赖视图又读取该目标表时,在启用materialized_views_squash_parallel_inserts的情况下会出现该问题。#107027 (Groene AI). - 修复了
Block structure mismatch in UnionStep stream逻辑错误 (在 debug/sanitizer 构建中会导致服务器中止,在 release 构建中表现为Code: 49) ,该问题发生在UNION/INTERSECT/EXCEPT的某个分支以Sparse序列化形式读取某列,而同级分支将同一列读取为完整形式时 (例如在推送到 materialized view 时) 。#107041 (Groene AI). - 修复了向 DeltaLake 表插入数据时出现的
LOGICAL_ERROR异常:当列与其写入 schema 不匹配时 (例如会展平为子列的Nested列,或显式指定列子集的表函数) ,此类插入现在会返回面向用户的INCOMPATIBLE_COLUMNSerror,而不再是LOGICAL_ERROR。关闭了 #87402。#107058 (Groene AI). - 修复了
ORDER BY <numeric column> ... LIMIT n查询中的TYPE_MISMATCHerror (“Cannot convert string … to type …”) :当 lazy materialization 将另一列排在排序列之前时会触发该问题。现在 top-K threshold 会从正确的排序列中读取。#107060 (Groene AI). - 修复了当
SHOW ROW POLICIES或SHOW MASKING POLICIES后跟FORMAT、SETTINGS或INTO OUTFILE子句时出现的语法错误 (例如SHOW ROW POLICIES FORMAT TabSeparated) 。#107061 (Groene AI). - 修复了复合
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a在不同类型的列之间复用已释放列名 (即“交换”) 时的问题。materialized 分片记录了错误的列类型,导致后续SELECT失败并报出Conversion between numeric types and IPv6 is not supported(或者在 debug 构建中加载分片时中止) 。#107064 (Groene AI). - 修复了当边界数组包含
NaN时,roundDown函数结果具有非确定性的问题。相同的输入值可能会因批次中周围的行不同而返回有限边界或NaN。现在会忽略NaN边界,因此结果只取决于有限边界。#107065 (Groene AI). - 修复了
quantileTDigest和quantileTDigestWeighted在Date和DateTimeargument 上,当插值后的 quantile 为小数但仍在范围内时抛出DECIMAL_OVERFLOW的问题 (例如quantileTDigestWeighted(date, weight)用于所有值都适配该类型的情况) 。现在小数结果会被截断为结果类型,与quantilesTDigestWeighted保持一致;真正超出范围的值仍会抛出 error。关闭了:#106722。#107066 (Groene AI). - 修复了
trimLeft、trimRight和trimBoth(以及别名ltrim、rtrim、trim) 在自定义 trim character set 长度超过 16 个字符时抛出TOO_LARGE_STRING_SIZE的问题。现在再次支持任意长度的 trim 集合。#107071 (Nikita Fomichev). - 修复了
Enum8/Enum16类型定义中超出范围的整数值被静默截断的问题。Enum8('a' = 200)现在会抛出ARGUMENT_OUT_OF_BOUND,而不是静默创建Enum8('a' = -56)。#107081 (Groene AI). - 修复了多列
ORDER BY ... LIMIT查询在按Nullable列排序时、当多行在前导列上并列时出现的行顺序错误问题 (以及 debug 构建中的LOGICAL_ERROR“Rows are not sorted with permutation”) 。#107094 (Groene AI). - 修复在对通过基于
Dynamic的 JOIN 构造出的Dynamic列执行函数时出现的LOGICAL_ERROR(Expected the argument N to have X rows, but it has Y) 问题 (例如RIGHT/FULL JOIN中未匹配到的行,或被去关联改写为 join 的相关EXISTS子查询) 。#107095 (Groene AI). - 修复配置重载时误重新创建 ZooKeeper 会话的问题。#107096 (Azat Khuzhin).
- 修复在刷新访问 entities 时,在 ZooKeeper 读取期间一直持有互斥锁的问题。#107097 (Azat Khuzhin).
- 修复向
MergeTree表执行INSERT时,如果adaptive_write_buffer_initial_size设置得过大,会触发Logical error: Too large size passed to allocator异常的问题。现在自适应写入缓冲区的初始大小会被限制为不超过缓冲区最大值。#107104 (Groene AI). - 修复当包含
LowCardinality成员的Variant常量与键列比较时出现的LOGICAL ERROR(Bad cast from type DB::ColumnString to DB::ColumnLowCardinality) 问题;其中该键列的键表达式是非单调确定性函数 (例如基于sipHash64(col)的minmax跳过索引) 。#107111 (Groene AI). - 修复当限定 asterisk (
t.*) 作用于JOIN ... USING键并传给 aggregate function,且 OUTER JOIN 另一侧的键为Nullable(并且join_use_nulls = 0) 时出现的Bad cast from type DB::IColumn const* to DB::ColumnNullable const*logical error。#107129 (Groene AI). - 修复
ALTER TABLE ... ON CLUSTER批处理中混用MODIFY SETTING/RESET SETTING与注释变更 (例如MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123) 时,只会应用到 leader 副本、导致其他副本状态不一致的问题。同时还修复了将带位置参数或按列SETTINGS的MODIFY COLUMN ... COMMENT误判为仅本地注释元数据变更的问题;这会导致列重排未写入 replicated metadata,并可能在副本重启时引发INCOMPATIBLE_COLUMNS。#107142 (Groene AI). - 修复当限定星号匹配器 (例如
x.*) 在自身递归项中按名称引用递归 CTE 时触发的LOGICAL_ERROR(“Table expression … data must be initialized”) 。现在,这类匹配器会像该位置上的限定列 (x.a) 或非限定匹配器 (*) 一样,展开递归表的列。#107144 (Groene AI). - 修复查询条件缓存导致返回错误查询结果的问题:当即时变更 (
apply_mutations_on_fly) 或补丁分区片段在PREWHERE之前过滤行时,就会出现该问题。使用apply_mutations_on_fly = 1读取的查询可能会污染缓存,导致后续使用apply_mutations_on_fly = 0且具有相同 predicate 的查询跳过本应读取的 marks,从而返回过少的行。同一修复也涵盖行级安全策略,这些策略会作为PREWHERE之前的过滤器 预先添加:在受限行策略下运行的查询,可能会污染后续未使用该策略但使用相同 predicate 的查询缓存。#107145 (Groene AI). - 修复了从
BACKUP到AzureBlobStorage的复制问题:在备份内复制数据文件时,目标对象会被写到备份目录之外。现在,对S3目标端中 Backup 对象是否存在的检查改为使用精确的HeadObject请求,而不是按前缀列举,从而避免将前缀相似的键误判为匹配。#107153 (Pablo Marcos). - 修复了
quantileExactExclusive、quantilesExactExclusive、quantileExactInclusive和quantilesExactInclusive中的有符号整数溢出问题;当Int64输入跨度很大时,该问题可能导致结果错误。#107154 (Groene AI). - 修复了一个
LOGICAL_ERROR(“Unexpected exception in refresh scheduling”) :当可刷新materialized view 存在REFRESH ... DEPENDS ON <name>依赖,且其非限定名称与某个临时表或 CTE 名称匹配时,重启后该错误可能导致服务器进入崩溃循环。#107156 (Groene AI). - 确保在重新加载配置时不会运行启动脚本,因为这在语义上是错误的,也不符合用户预期——并且已知容易引发错误。#107187 (Miсhael Stetsyuk).
- 限制预留时
queue_size的最大值。#107205 (Elian Gidoni). - 修复了在启用
group_by_use_nulls设置时,使用grouping函数的查询会报出Argument ... of GROUPING function is not a part of GROUP BY clause错误的问题。#107206 (Nikolai Kochetov). - 修复了在启用
optimize_read_in_order且由于max_streams_for_union_step设置导致 union pipeline 被收窄时,UNION ALL上ORDER BY的结果顺序不正确的问题;现在,如果执行计划依赖已排序的 UNION 输出流,则会跳过收窄。关闭 #106880。#107208 (Vladimir Cherkasov). - 修复了在服务器后期关闭阶段解析代理配置时,可能发生的空指针解引用问题。#107231 (Pedro Ferreira).
- 修复了在非复制表
MergeTree表上启用旧版并行副本时,lightweightUPDATE查询的问题。#107246 (Groene AI). - 修复了向
Iceberg表执行 insert 时服务器异常中止的问题 (std::out_of_rangelogical error) :当其写入块的列名与最新 schema 的字段 id 不匹配时 (例如在iceberg_metadata_staleness_ms窗口内,并发写入方重命名了某一列之后) ,会触发该问题。现在,insert 会以明确的查询错误失败,而不会导致服务器崩溃。#107279 (Groene AI). - 修复了
server和local在关闭时卡住的问题:如果max_*_thread_pool_free_size > 0,静态线程池会无限期保留空闲线程。#107291 (Miсhael Stetsyuk). - 修复了
s3table function 会静默忽略小写位置参数partition_strategy(例如hive) 的问题。#107297 (Julia Kartseva). - 修复了并行块编组中
low_cardinality_allow_in_native_format=0的处理问题。#107319 (Azat Khuzhin). - 修复了在启用
use_skip_indexes_for_top_k优化,并且排序列所在的某个 part 带有minmax跳过索引、且其中部分行已通过 lightweightDELETE删除时,ORDER BY <col> LIMIT n返回错误结果 (通常为空) 的问题。现在,该优化不会再将经过 lightweight 删除的 part 的过期 minmax 排在包含有效 top 行的 part 之前。#107320 (Groene AI). - 修复了 ClickHouse Keeper 中的一个 bug:通过
last_snapshot(以及mntr中的zk_latest_snapshot_size) 报告的 snapshot metadata,在安装过期或重复的 snapshot 后可能会回退;这还可能导致同一索引的本地 snapshot 在仍向对等节点流式传输或上传到 S3 时,原地覆盖已注册的 snapshot file。#107321 (Antonio Andelic). - 修复了读取深度嵌套的 schema 或
MsgPack、BSON、ORC、Parquet、JSON、DeltaLake、Iceberg和Paimonformats 中的值时,可能发生的 server 栈 overflow (崩溃) 问题。现在,这类深度嵌套的输入会被直接拒绝,并抛出异常。#107341 (Raúl Marín). - 修复了
SYSTEM SYNC DATABASE REPLICA ... STRICT中可能出现的 logical error,并使STRICTmodifier 真正对 database replicas 生效。#107344 (Pedro Ferreira). - 修复了在 debug/sanitizer 构建中读取
DeltaLake表时 server 异常中止的问题:当 ClickHouse schema 中声明了 Delta 列映射中不存在的列时 (例如某列已在 Delta log 中被重命名或删除) ,就会触发该问题。现在,这类查询会改为失败并返回可捕获的INCORRECT_DATA错误。#107347 (Groene AI). - 修复了当填充列之前的某个
ORDER BY列使用COLLATEcollation 时,ORDER BY ... WITH FILL会生成额外行的问题。现在会使用该 collation 按 sorting prefix 对行进行分组,与 sort order 保持一致。#107365 (Groene AI). - 修复了读取 Iceberg table 时的崩溃问题 (在 debug 构建中表现为
LOGICAL_ERROR) 以及静默产生错误结果的 bug (在 release 构建中) :当其 metadata 在不同 metadata 版本之间将现有schema-id重新绑定到不同的 schema 时,就会出现该问题。现在,这类 metadata 会因ICEBERG_SPECIFICATION_VIOLATION而被拒绝。#107370 (Groene AI). - 修复了这样一种
LOGICAL_ERROR(Variant N (T) has size X, but expected Y) :当toString或concat等函数应用于Variant或Dynamic列,且该列包含单个非空 variant 和若干 NULL,同时函数原样返回其输入列时,就会触发该错误。#107374 (Groene AI). - 修复了并行副本场景下可能出现的
Logical error: 'Duplicate announcement received for replica number N':当某个 scalar subquery 包含读取同一表的嵌套 subqueries 时,就可能触发该问题。#107381 (Groene AI). - 修复了
getServerSetting,使其对可在 runtime 中修改的 server settings (如max_server_memory_usage、mark_cache_size、max_concurrent_queries、thread pool 大小等) 返回当前实际生效的值,与system.server_settings报告的内容保持一致。#107388 (Alexey Milovidov). - 修复
arrayResize使用Decimal类型的大小参数时的问题:现在会按其实际值解释大小 (例如arrayResize([1, 2, 3], 1.5::Decimal(2, 1))返回 1 个元素) ,而不是按原始未缩放表示来解释。#107389 (Alexey Milovidov). - 修复在启用
use_strict_insert_block_limits时,向Alias表执行异步INSERT会触发LOGICAL_ERROR(block.rows() == getRows()) 的问题。#107400 (Groene AI). - 修复一个逻辑错误 (
Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8) :当析取 (部分谓词) 下推优化把条件下推到一个因 JOIN 而扩宽类型的USING键上时会触发。还修复了解析器中的 server 崩溃 (段错误) :在解析JOIN ... USING查询中的标识符时,如果查询中包含引用未知标识符且可做常量折叠的if/multiIf分支,就会发生该问题。#107407 (Groene AI). - 修复了
windowFunnel中的堆缓冲区溢出 (server 崩溃) 问题:使用超出范围的事件类型完成一个精心构造的聚合函数状态时会触发,任何用户只需一次SELECT即可触达该路径。#107412 (uwezkhan). - 修复了一个未定义行为:当把非有限浮点值 (如
nan或inf) 作为prometheusQuery/prometheusQueryRangetable functions 的 timestamp/duration 参数传入时会发生。现在这类参数会报出BAD_ARGUMENTS,而不是生成无效的 timestamp。#107417 (Groene AI). - 修复
MaterializedPostgreSQL在 PostgreSQL 数据库名或表名包含大写字母时,会静默停止复制变更的问题 (pgoutput消费者请求了一个未加引号且被转换为小写的 publication 名称,因此与保留大小写的 publication 不匹配) 。#107423 (Alexey Milovidov). - 修复一个异常 (
Logical error: Not-ready Set is passed as the second argument for function 'in') :当某个键表达式 (ORDER BY、PRIMARY KEY、PARTITION BY或 skipINDEX) 包含右侧为表的INoperator 时会触发,例如ORDER BY (x IN some_table)。现在这类键表达式会在建表时被拒绝。#107424 (Groene AI). - 修复
optimize_rewrite_aggregate_function_with_if优化对保留NULL载荷值的 aggregate functions 产生错误结果的问题 (即*_respect_nulls系列:anyRespectNulls、first_value_respect_nulls、anyLast_respect_nulls、last_value_respect_nulls) 。现在对于这类函数,该优化不再将f(if(cond, x, NULL))Rewrite 为-If形式。#107430 (Groene AI). - 修复在列出本地磁盘 object storage 目录 (例如
localdisk 上的 Iceberg 表) 时,文件正被并发替换会导致误报filesystem error: in last_write_time: No such file or directory异常的问题。现在,并发删除的条目会在列表结果中被忽略,而不是导致列出操作中止。#107432 (Groene AI). - 修复在
optimize_if_transform_strings_to_enum = 1,且优化后的基于字符串字面量的if/transform表达式作为 Distributed 表或并行副本上的GROUP BY或ORDER BY键时出现的THERE_IS_NO_COLUMN错误。#107455 (Groene AI). - 修复了
DISTINCT处理过程中的一个罕见服务器崩溃问题:在初始化 distinct 键集合时,如果发生 allocation 失败 (例如触及 memory limit) ,就可能触发该问题。#107467 (Groene AI). - 修复了在表上使用
apply_mutations_on_fly = 1时出现的LOGICAL_ERROR: Unexpected return type from materialize(以及类似的类型不匹配错误) :如果存在一个待处理的即时UPDATE,并且其目标列在更早的即时UPDATE中也被作为函数输入读取,且这一切发生在ALTER MODIFY COLUMN ... LowCardinality(...)变更之前,就会触发该问题。#107475 (Groene AI). - 修复了通过
S3读取DeltaLake表时 AWS STS credentials 过期的问题:现在,该 engine 在刷新快照时会保留使用最新 credentials 的S3client,因此长时间运行的读取在 STS token’s TTL 到期后不再失败。STS assume-role credentials provider 现在也会对任何通过 STS 访问S3的场景正确处理 credential 刷新。#107480 (Elmi Ahmadov). - 修复了在通过
CREATE TABLE ... CLONE AS、ATTACH PARTITION ... FROM或MOVE PARTITION ... TO TABLE将分片从普通MergeTree引入ReplacingMergeTree、SummingMergeTree或AggregatingMergeTree后,SELECT ... FINAL和OPTIMIZE TABLE ... FINAL返回 duplicate rows 的问题。现在,当源 engine 与目标端 engine 不同时,引入分片的合并级别会重置为 0,这样目标端会在下一次 merge 时对其去重。#107481 (Groene AI). - 修复了 PostgreSQL wire protocol parser 中的一个整数 underflow 问题:当消息的长度字段小于 4 时,会导致
size - 4回绕,并产生过大的resize/ignore。#107485 (uwezkhan). - 现在,在 ReplicatedMergeTree 中等待 quorum 时,对查询取消的跟踪更加完善了。#107513 (Nikita Taranov).
- 修复了查询带有
PARTITION BY键的表时出现的Not-ready Set is passed as the second argument for function 'in'(LOGICAL_ERROR) 问题;当IN/NOT IN子查询被包裹在更大的 expression 中时,例如WHERE (c0 IN (SELECT ...)) != 0,就会触发该问题。#107515 (Groene AI). - 修复了
currentUser()、user()、SESSION_USER和authenticatedUser()在 asynchronous insert 刷新路径上 (即async_insert = 1时) 求值为空字符串的问题。这会影响引用这些函数的DEFAULT/MATERIALIZED列 expressions 和 materialized views;此前它们会静默存储空字符串,而不是执行 inserting 的用户。#107541 (Groene AI). - 在
enable_analyzer = 1(默认值) 时,如果按裸名称查询某个表,而该表实际上只存在于另一个数据库中,现在会提示正确的 right table,例如SELECT * FROM functions会报告Maybe you meant system.functions?。此前,新的 analyzer 只会给出不带提示的Unknown table expression identifiererror,而旧的 analyzer 已经能够提供这个有用的建议。#107550 (Groene AI). - 现在会将 rapidjson 库 (在
prettyPrintJSON、JSONMergePatch和 rapidjson JSON parser 中) 使用的内存计入 memory tracker,因此异常输入会以MEMORY_LIMIT_EXCEEDED被拒绝,而不是无限制地持续分配内存。#107555 (Raúl Marín). - 修复了在启用
optimize_prewhere_after_pushdown时,查询file()、url()或对象存储 source 且同时使用显式PREWHERE和WHERE时触发的LOGICAL_ERROR(updateFormatPrewhereInfo called more than once) 。#107568 (Groene AI). - 修复了在本地执行 distributed query plan (
make_distributed_plan+distributed_plan_execute_locally) 且log_formatted_queries = 1时可能发生的崩溃 (空指针解引用) 。#107570 (Groene AI). - 修复了在清理 distributed-plan 查询 (
make_distributed_plan = 1) 期间发生的 server 中止问题 (std::terminate,信号 6) :当 worker 状态检查未能重新调度下一次检查时 (例如关闭期间出现CANNOT_SCHEDULE_TASK或MEMORY_LIMIT_EXCEEDED) 。现在查询会正常失败,server 会继续运行。#107575 (Groene AI). - 在 Elf 和 DWARF 解析中补充了缺失的 bounds 检查。#107579 (Michael Kolupaev).
- 在 ORC 读取器中补充了缺失的 bounds 检查。#107580 (Michael Kolupaev).
- 修复了在
Replicateddatabase 中,对包含TimeSeries表的对象执行RENAME TABLE、RENAME DATABASE或CREATE OR REPLACE TABLE时可能发生的异常 (Digest does not matchlogical error) 。现在已支持重命名TimeSeries表。#107583 (Groene AI). - 修复了 MySQL protocol 端口上一个未经身份验证即可触发的内存耗尽型拒绝服务问题。#107599 (Shaohua Wang).
- 修复了
Replicateddatabase 中TimeSeries表的DROP TABLE问题;此前该操作会泄漏内部表,并导致后台 drop task 无限重试 (DROP TABLE ... SYNC会一直挂起) 。#107604 (Groene AI). - 修复了 replicated part 拉取 protocol 中的两个路径遍历问题,这些问题可能允许恶意副本将文件写入 part directory 之外。#107606 (Antonio Andelic).
- 修复了通过 Azure 读取 Delta Lake table 时出现的 ‘Account must be specified error’ 问题。#107620 (Smita Kulkarni).
- 修复了普通
MergeTree表上的ALTER TABLE ... REPLACE PARTITION在 server 重启后会让被替换掉的分片重新出现的问题,导致该表同时返回替换后的行和过期的旧行。#107623 (Groene AI). - 修复了在使用
enable_analyzer = 0运行查询时,读取目标为Distributed表的 materialized view 会导致 server 崩溃的问题。#107653 (Groene AI). - 当同一用户或角色被分配了多个 quotas 时,现在会同时对所有 quotas 生效 (只要其中任意一个超限,查询就会被拒绝) ,而不再只是以非确定性方式选择并执行其中一个 quota。
SHOW QUOTA和system.quota_usage现在会显示对 current user 生效的所有 quotas。#107664 (Alexey Milovidov). - 修复了当键值参数重复时,
s3和其他 object storage 表函数抛出LOGICAL_ERROR而不是BAD_ARGUMENTS的问题,例如s3('http://...', format = 'CSV', format = 'TSV')。 #107670 (Groene AI). - 修复了 MySQL interface 在
MySQL Connector/J8.2.0 及更高版本 (包括 9.x) 中无法使用的问题。OK数据包的info字段现在改为长度编码,与 MySQL 服务器保持一致,因此 JDBC 驱动现已可以连接。 #107693 (Alexey Milovidov). - 修复了当带有
make_distributed_plan = 1的查询在函数包装的键上进行 join,且两侧没有共同类型时出现的LOGICAL_ERROR(“Input nodes size mismatch in dag”) 问题 (例如右侧键为UInt64时,使用ON intDiv(-1, t1.key) = t2.key) 。 #107701 (Groene AI). - 读取由 Apache Arrow Java < 19.0.0 (包括 Apache Spark) 生成的、含有空
String/Binary列的 Arrow/ArrowStream 数据时,不再抛出INCORRECT_DATA。 #107764 (Raúl Marín). - 修复了
countmin列统计信息估算中的BAD_GET异常 (“Bad get: has String, requested UInt64”) :当查询将某列与一个未预先强制转换且类型不同的 literal 进行比较时,例如numeric_col IN (SELECT '5')或string_col IN (SELECT 5)。 #107793 (Groene AI). - 修复了在推断远程表结构期间,如果 bridge 失去响应,
odbc和jdbc表函数会卡住数分钟并忽略查询取消 (KILL QUERY、max_execution_time) 的问题。 #107809 (Alexey Milovidov). - 修复了在格式化格式错误的查询时出现的异常 (
Logical error: 'index >= result.start') :该查询混用了s3/gcs表函数 secret 参数的按位置和按名称两种写法,例如s3('url', 'a', 'b', secret_access_key = 'c')。 #107818 (Groene AI). - 修复了 Set 跳过索引在
LowCardinality列上无法剪枝粒度的问题。 #107868 (Konstantin Bogdanov). - 修复了在 server setting
insert_deduplication_version = new_unified_hash下,insert deduplication 对String和Array列计算出错误哈希的问题:相同的 inserts 可能无法去重,因为去重哈希依赖于该行在插入块中的位置。 #107915 (Sema Checherinda). - 修复了在 macOS (Apple Silicon) 上,对
Nullable列使用多个排序键执行ORDER BY时结果不正确的问题,原因是 JIT-compiled 排序比较器中缺少符号扩展。 #107973 (Raúl Marín). - 修复了使用多个 threads 读取
Dynamic列时的性能回退问题。由 #100730 引入。关闭 #107942。 #107997 (Pavel Kruglov). - 已弃用的数据湖设置
storage_catalog_url现在会被 catalog guard 正确拦截 (此前只检查storage_catalog_type和storage_aws_access_key_id) ,而且错误消息会列出所有已弃用的设置。#108040 (Alexey Milovidov). - 修复了当
LIKE查询通过 direct-read 回退路径从text索引读取以稀疏方式存储的列时,出现的Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>logical error。#108068 (Groene AI). - 即使批次为空,也始终运行访问缓存的批次完成 handlers。#108124 (Azat Khuzhin).
- 修复了某些包含
UNION ALL的查询中的LOGICAL_ERROR(Column identifier is already registered) 。#100770 (Shaohua Wang). - 修复了 server 关闭期间 workload storage mutex 的 use-after-free 问题。#101447 (Tuan Pham Anh).
- 修复了
Sharedcatalog 中ALTER DATABASE MODIFY COMMENT的死锁问题。#103683 (Nikolay Degterinsky). - 空的 Unicode 引号标识符现在会引发
SYNTAX_ERROR,而不再是CANNOT_PARSE_QUOTED_STRING。#104173 (leonard9893). - 保留
timeSeries*聚合函数的原始 parameter 类型,以确保AggregateFunctiontype 在表重新 Attach 以及并行副本场景下都能正确 round-trip。#104812 (Vitaly Baranov). - 修复了在并行副本下,启用
serialize_query_plan时 materialized CTE 的LOGICAL_ERROR。#104896 (Igor Nikonov). - 修复了当 staleness (window) parameter 接近
INT64_MAX时,timeSeries*ToGrid函数中的有符号整数溢出问题。#105319 (Groene AI). compatibility设置值不再把apply_row_policy_after_final恢复为false,因此在使用FINAL时始终能正确应用行策略。#105637 (Yarik Briukhovetskyi).- 通过让
posix_spawnstub 遵循SETPGROUP/RESETIDS/SETSIGDEF,修复了clickhouse chdig client。#105858 (Azat Khuzhin). - 修复了在 merge/mutate executor 未初始化时,对 projections 执行 merge-tree 健全性检查期间发生的异常。#105919 (Mikhail Artemenko).
- 在对 projections 进行索引分析时,
minmax索引现在会从 projection 本身加载,而不是从父 part 加载,从而得到正确结果。#105940 (Mikhail Artemenko). - 修复了
materialize(monotonic_chain(...))中addMonotonicChain的异常。#106050 (Nikolai Kochetov). - 修复了
RESTORE在包含MASKING POLICY依赖对象的备份上失败的问题。#106086 (Julia Kartseva) 。 - 修复了启用
prefer_column_name_to_alias时,展开 SQL 用户自定义函数可能导致内存损坏的问题。#106121 (Nikolai Kochetov) 。 - 现在,使用 bridge 连接的字典会在服务器重启后重新加载并重新建立连接。关闭了 #106151。#106152 (Pedro Ferreira) 。
- 修复了
LocalObjectStorage的文件系统缓存问题。#106239 (Kseniia Sumarokova) 。 - 修复了启用
use_delayed_remote_source时表函数的延迟远程 source 问题。#106470 (Nikolay Degterinsky) 。 - 修复了
timeSeriesLastToGrid对网格起始时间之前及窗口外时间戳的处理问题。#106504 (Vitaly Baranov) 。#106577 (Vitaly Baranov) 。 - 修复了函数名中包含查询参数时触发的
LOGICAL_ERROR(Inconsistent AST formatting) 问题。#106635 (Vitaly Baranov) 。 - 修复了在分布式查询计划任务反序列化前删除表时出现的逻辑错误。#106944 (Alexander Gololobov) 。
- 对
NullableGROUP BY键使用精确比较。#107050 (Nikolai Kochetov) 。 - 修复了当表函数参数不是列表达式时触发的
LOGICAL_ERROR(Trying to get name of not a column) 问题 (例如来自multiIf/CASE的未解析*匹配器) 。#107411 (Alexey Milovidov) 。 - 修复了处理大量不同的无效时区名称时,时区缓存 (
DateLUT) 无界增长的问题。#107464 (Alexey Milovidov) 。 - 在将普通
MergeTree变更标记为完成前,先写入part_log条目。#107741 (Azat Khuzhin) 。 arrayFold现在会对其 Array 参数执行健全性检查,以防输入格式错误。#107932 (Michael Kolupaev) 。- 修复了
MergeTree分片中缓存的 skip-index archive reader 上罕见的数据竞争以及可能的释放后使用问题;当查询读取 skip indices 而该分片正在被移动或重命名时,可能会触发该问题。#107995 (Raúl Marín) 。 - 修复了
PREWHERE与Map子列一起使用时的性能回退问题。#107988 (Pavel Kruglov) 。 - 修复了带时区的
parseDateTimeBestEffort在toString(Nullable(DateTime64))的 NULL 行上抛出CANNOT_PARSE_DATETIME的问题。#108310 (Yarik Briukhovetskyi). - 修复了
ArrowFlight表函数和引擎在使用省略可选dataset键的命名集合时,会报出No such key 'dataset'错误并拒绝该集合的问题。#108041 (Alexey Milovidov). - 修复了在
CODEC或引擎声明中使用无参数窗口函数时出现的Inconsistent AST formatting逻辑错误 (例如CODEC(cume_dist() OVER (...))) ;现在这类函数会保留括号,因此查询可以顺利经过 format/parse round-trip。#107806 (Alexey Milovidov). - 修复了
hasToken在 needle 包含分隔符时,静默地通过 text index 返回结果,而不是抛出BAD_ARGUMENTS的问题。#108189 (Jimmy Aguilar Mena). - 现在可通过
compatibilitysetting 将设置use_skip_indexes_on_data_read恢复为 26.1 之前的默认值 (false) ,作为性能回退时的兜底方案;此前在 on-data-read 路径下,minmax/set/bloom_filter跳过索引的 mark-range pruning 会失效。#108330 (egor romanov). - 修复了当传递给
remote/remoteSecure的命名集合中的database/db覆盖项不是常量数据库名称时,可能发生的崩溃 (空指针解引用) 问题,例如remote(nc, database = (SELECT 1))。现在查询会返回明确的错误,而不是直接崩溃。#108271 (Groene AI). - 修复了可刷新materialized view 在错误时机丢失 ZooKeeper connection 时可能卡住的问题。#108234 (Michael Kolupaev).
- 修复了读取值由默认值填充的
Array(Tuple(...))列时出现的Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple问题,例如在动态应用ALTER TABLE ... ADD COLUMN之后,或在未完成的ALTER TABLE ... CLEAR COLUMNmutation 之后。#107232 (Groene AI). - 修复了当显式引用共同超类型为
Dynamic的JOIN ... USING键,并将其传递给聚合函数时出现的Bad cast from type DB::ColumnDynamic to DB::ColumnNullable逻辑错误,例如count(t.key) IGNORE NULLS。#107289 (Groene AI). - 修复了普通 (非复制表)
MergeTree在对仍有未应用 lightweightUPDATEpatch 的分区执行REPLACE PARTITION、MOVE PARTITION、DETACH PARTITION或DETACH PART时,可能发生静默数据丢失的问题。现在这些操作会直接拒绝该命令,与ReplicatedMergeTree的现有行为一致。#107386 (Groene AI). - 修复了在
Dynamic键的Map上,使用LowCardinality类型的查找参数执行has时发生的崩溃问题 (release 构建中为 SIGSEGV,debug 构建中为类型不匹配断言) ,例如has(map('a'::Dynamic, ...), toLowCardinality('b'))。#107956 (Groene AI). - 修复了向 materialized view 插入数据时出现的
LOGICAL_ERROR(“Block structure mismatch … betweenConvertingTransformandRemovingReplicatedColumnsTransform”) :当其TO目标表中声明的某列使用了比视图SELECT结果更宽的Enum时,会触发该问题。现在会正确应用合法的Enum扩宽。 #107648 (Groene AI). - 修复了查询
Distributed表 (或使用并行副本) 时的NUMBER_OF_COLUMNS_DOESNT_MATCH错误:当存在多个会展开为同一表达式的ALIAS列,并在ORDER BY/GROUP BY/HAVING中同时引用它们时,就会触发该问题。 #107913 (Yakov Olkhovskiy). - 修复了
detectCharset和detectLanguageUnknown函数中的未定义行为 (向memcpy传入空指针) :当输入字符串超过 32768 字节且无法检测到任何字符集时会触发该问题。 #108250 (Groene AI). - 修复了
dateDiff在使用hour和minute单位时的signed integer overflow(未定义行为) 问题,该问题会在接近Int64取值范围边界的极端DateTime64值上发生。 #108229 (Groene AI). - 修复了空 merged part 上文本索引触发的
Too many marks问题。 #106867 (Azat Khuzhin). - 修复了以下场景下读取列时出现的
LOGICAL_ERROR(“Unexpected return type from if”) :在apply_mutations_on_fly = 1的情况下,先执行带有非常量条件或 false 条件的ALTER UPDATE col = ... WHERE <cond>,再执行ALTER MODIFY COLUMN col <new type>。 #108128 (Groene AI). - 修复了将
Array(Dynamic)或Array(Variant)通过accurateCastOrNull转换为QBit时导致 server 中止的问题 (IColumn::insertFrom中的Logical error) ,例如accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)')。 #108288 (Groene AI). - 修复了在
DESCRIBE TABLE (...) AS ...中,子查询后跟别名时会出现的语法错误。 #100205 (Yarik Briukhovetskyi). getClientHTTPHeader现在会被正确视为非确定性,因此其结果不再被查询结果缓存错误地复用。 #108029 (Alexey Milovidov).
构建/测试/打包改进
- 使用
default-engine-native-tlsfeature 构建delta-kernel-rs,以便其自身的 HTTP 客户端 (reqwest) 能复用 ClickHouse 已链接的 OpenSSL。这只是对native-tls的部分启用:object_store仍会强制使用reqwest/rustls-tls-native-roots,因此reqwest最终会同时带上native-tls和rustls两种后端。delta-kernel-rs目前在 MSan 下仍保持禁用,因为ring仍会通过object_store被编译进来 (既会经由rustls的传递依赖引入,也会直接用于 AWS request HMAC signing) ,而其手写汇编不会生成 MSan 所需的符号 (上游跟踪见 arrow-rs-object-store#585) 。#96856 (Austin Bonander). - 为
clickhousebinary 添加 PGO (profile 引导优化) 和 BOLT (Binary Optimization and Layout Tool) 链接后优化。profiles 从 CI workloads 中收集,并在 release builds 期间以尽力而为的方式应用——如果 profile 已过时或不兼容,这两个 stage 都会回退到未优化的输出。截至目前,PGO 还未带来收益。#100938 (Alexey Milovidov). - 为
clickhouse keeper-bench添加--storagemode,用于对KeeperStorage进行 in-process benchmark (无网络、无 raft、无 state machine) ,并使用与网络 mode 相同的setup/generatorconfig sections。#103081 (Michael Kolupaev). - 修复
ENABLE_AWS_S3=OFF时的构建问题。#105390 (Yue Ni). - 将
mongo-cxx-driver更新至 r4.3.0。#105522 (Konstantin Bogdanov). - 修复与 RapidJSON 的构建兼容性问题。#105674 (Ilya Golshtein).
- 通过移除广泛使用的 base/ 请求头中的传递包含,并从 vendored
Poco/Logger.h中剥离未使用代码,加快构建速度。#105702 (Raúl Marín). - 将
libxml2从 2.15.1 更新至 2.15.3。#105985 (Konstantin Bogdanov). - 在 Poco 内部使用
expat2.8.1。#105988 (Konstantin Bogdanov). - 将
thrift升级至v0.23.0。#105993 (Konstantin Bogdanov). - 使用
postgres标签REL_18_4。#105994 (Konstantin Bogdanov). - 将
krb5升级至 1.22.2。#106076 (Konstantin Bogdanov). - 将捆绑的
curl更新至 8.20.0。#106077 (Konstantin Bogdanov). - 将
mariadb-connector-c升级到 3.1.29。保留了所有与 ClickHouse 相关的补丁。 #106287 (Nikita Mikhaylov). - 更新 distroless 基础 image 的摘要,以修复 libssl3t64 的 CVE 漏洞。 #106360 (Rahul Nair).
- 使用
wasmtimev45.0.1。 #106836 (Konstantin Bogdanov). - 将
openssl升级到 3.5.7。 #106844 (Konstantin Bogdanov). - Distroless Docker 构建现在也会更新
:X.Y-distroless和:X.Y.Z-distroless这两个浮动标签,而不再只更新完整版本标签。 #106932 (Rahul Nair). - 禁用未使用的
curl功能,例如 NTLM 认证、cookies、alt-svc、HSTS、DNS-over-HTTPS、netrc、MIME、AWS SigV4。 #107226 (Konstantin Bogdanov). - 更新了
NuRaft,修复了当 snapshot IO 在后台线程中运行时出现的 snapshot-install 活锁问题。nuraft_use_bg_thread_for_snapshot_io这个 Keeper setting 默认仍处于禁用状态;CI 现在会将其随机化,以覆盖两种模式。 #107338 (Antonio Andelic). - 修复了当 ClickHouse checkout path 中包含与某个 header extension 匹配的子串时,
abseil构建失败的问题。 #107349 (zhiqiang). - 在 x86_64 上,改为通过
CPUID确定 L2 cache size,而不是使用 glibc 特有的sysconf(_SC_LEVEL2_CACHE_SIZE),因为后者在 musl libc 下不可用。 #107469 (Konstantin Bogdanov). - 将 musl 构建的栈大小增加到 8 MiB,以支持深度嵌套的查询。 #107470 (Konstantin Bogdanov).
- Rust 静态库中被本地化的 C library symbols 集合,现改为根据实际的 reference libraries 推导,而不是依赖手动维护的允许列表,这样就能覆盖所有 compiler-rt builtins 和平台 libm 函数。 #107571 (Raúl Marín).
- 将 distroless server 和 keeper images 切换到
gcr.io/distroless/base-nossl-debian13,这样它们只会包含 ClickHouse 实际链接的库,不再带入那些我们自行静态链接的库。 #107837 (Rahul Nair). - 在 macOS (
arm_darwin) 上重新启用此前因过时而被跳过的 50 个 stateless tests,并在 macOS 上使用fsync而不是F_FULLFSYNC来同步 directory。 #107887 (Raúl Marín).
向后不兼容的变更
- 将
date_time_input_format和cast_string_to_date_time_mode的默认值从basic改为best_effort。此前无法解析非 basic 日期时间字符串 (例如2024 April 4、Apr 15, 2020 10:30:00) 的查询,现在默认可能会成功。若要保持原先的严格解析行为,请将这些设置设为basic(或使用compatibility) 。#89334 (Alexey Milovidov). - 现在禁止将 Tuple 元素命名为
null,因为它会与 Nullable 的 null Map 使用的子列名称冲突,导致子列解析产生歧义。#98377 (Alexey Milovidov). - 新增设置
dynamic_disk_allow_from_env、dynamic_disk_allow_from_zk和dynamic_disk_allow_include,用于禁止在动态 disk 中使用from_env、from_zk和include。这是一项向后不兼容的变更,因为它默认禁止了此前默认允许的行为。#99138 (Kseniia Sumarokova). - 不能再使用已废弃的基于 Arrow 的 Parquet reader 和 writer,系统将改用原生实现。#100949 (Alexey Milovidov).
SHOW CREATE TABLE t现在会在同时存在名为t的永久表和 temporary table 且未指定 database 时,优先选择 temporary table,这与现有的DESCRIBE TABLE行为一致。此外,现已支持DESCRIBE TEMPORARY TABLE语法。#100966 (Alexey Milovidov).- 将默认的
http_max_fields从 1,000,000 降至 1,000,并将http_max_field_name_size从 128 KB 降至 4 KB,以限制 HTTP connections 在身份验证前的内存使用量。新增了http_max_request_header_size和http_headers_read_timeout设置。依赖先前较高限制的用户可通过设置将其恢复。#103285 (Sema Checherinda). - 为
system.metric_log新增了一个histograms嵌套列,用于在每一行中记录所有已注册 histogram metric 的快照,并新增system_metric_log_show_zero_values_in_histograms设置以控制是否输出零值。这意味着system.histogram_metric_log表已被弃用。#103770 (Miсhael Stetsyuk). - 现在,在未显式指定 time zone 的情况下,将
CAST转换为DateTime或DateTime64时,会保留源 argument 的 time zone (前提是源值为带显式 time zone 的DateTime/DateTime64) ,与toDateTime/toDateTime64函数的行为一致。关闭 #55072。#104433 (Alexey Milovidov). - 移除了
kqltable function。请使用SET dialect = 'kusto'以 KQL 方言运行查询。#105101 (Alexey Milovidov). - window functions
RANK和DENSE_RANK现在会拒绝 arguments,并抛出NUMBER_OF_ARGUMENTS_DOESNT_MATCH,以符合 SQL 标准。此前,诸如RANK(x) OVER (ORDER BY id)这样的查询会被静默接受,但其中的 argument 会被忽略。若要恢复先前较宽松的行为,请设置allow_rank_dense_rank_arguments = 1。关闭 #49526。#104324 (Groene AI).
新特性
- 新增设置
max_bytes_ratio_before_external_join,与max_bytes_ratio_before_external_group_by和max_bytes_ratio_before_external_sort相对应。它将哈希 JOIN 的落盘阈值表示为可用内存的一个比例;与绝对值max_bytes_before_external_join结合使用时,将采用两者中较小的阈值。#103862 (Alexey Milovidov) 。新的max_bytes_ratio_before_external_join设置现已默认启用,默认值为 0.5,与max_bytes_ratio_before_external_group_by和max_bytes_ratio_before_external_sort保持一致。哈希 JOIN 会在右侧数据超过可用系统内存一半时自动落盘到 grace hash join (在配置了内存限制时) 。#104285 (Alexey Milovidov) 。 - 新增表函数
filesystem。它可将目录结构表示为一张表,从而用 SQL 查询文件的元数据和内容。最初由 @perst20 在 #42039 中提出。参见 #42039。参见 #50208。#53610 (Alexey Milovidov) 。 - 允许将裸函数名传递给高阶函数,如
arrayMap、arrayFilter等。例如,arrayMap(negate, [1, 2, 3])现在等价于arrayMap(x -> negate(x), [1, 2, 3])。#101033 (Alexey Milovidov) 。 - 新增设置
send_table_structure_on_insert_with_inline_data和客户端选项--inline-insert-data,允许服务器通过原生协议自行解析内联 INSERT 数据,从而避免为了接收表结构而发生一次往返通信,并提升大量小批量插入的性能。#101034 (Alexey Milovidov) 。 - 新增
tokenizeQuery和highlightQuery函数,用于 SQL 查询的标记化和语法高亮。tokenizeQuery返回带有字节偏移和标记类型的词法分析标记;highlightQuery返回基于解析器的语法高亮范围及高亮类别 (keyword、identifier、function、number、string 等) 。#101054 (Alexey Milovidov) 。 - 新增
url_base设置,用于在url表函数和URL表引擎中解析相对 URL,并遵循 RFC 3986 语义。#101113 (Alexey Milovidov) 。 LIMIT BY子句现支持负值,以便从每个分组的末尾而非开头选取行。例如,LIMIT -2 BY id会返回每个id的最后两行。还支持负偏移量 (LIMIT -1 OFFSET -1 BY id) 以及混合符号 (LIMIT -2 OFFSET 1 BY id) 。#103222 (Nihal Z. Miaji) 。json_value函数现支持以tuple和array形式输出,以提升多个 JSON 查询的性能。#78362 (kevinyhzou) 。JSON_VALUE、JSON_EXISTS和JSON_QUERY现支持多路径Tuple/ArrayJSONPath 参数,由 @KevinyhZou 提供。#101102 (Alexey Milovidov) 。- 新增
kafka_autodetect_client_rack参数。设置后,会通过云平台能力探测可用区,并将其作为librdkafka的client.rack参数传递,以避免跨可用区通信。#81323 (Ilya Golshtein) 。 - 为
system.blob_storage_log新增Read事件类型,用于跟踪对象存储读取操作,由新设置enable_blob_storage_log_for_read_operations控制。#96867 (Alexey Milovidov) 。 - 现在,用户可以通过新的
system.zookeeper_watches表查看clickhouse-server发出的 ZooKeeper watches。#99277 (Den Kalantaevskii) 。 - 新增
Shardsprofile event,用于统计分布式查询中涉及的分片数量,并对所有表的结果求和。#99470 (Alexey Milovidov) 。 WASMUDF 现可声明为DETERMINISTIC,并可参与常量折叠。#100005 (Vasily Chekalkin) 。- 新增
parallel_replicas_prefer_local_replica设置:禁用时,并行副本将完全由负载均衡算法选择,因此即使max_parallel_replicas = 1的查询也可能被路由到另一台主机。#100139 (Alexey Milovidov) 。 - 新增
{disk,storage,http}_connections_rcvbuf和{disk,storage,http}_connections_sndbuf服务器设置,用于控制出站 HTTP 连接的 TCP socket buffer 大小,让运维人员能够覆盖内核 autotuning,并限制每个连接的内存使用量。#100478 (Sema Checherinda) 。 - 支持
CREATE OR REPLACE MATERIALIZED VIEW,其原子交换语义与CREATE OR REPLACE TABLE相同。适用于内部表、TO表、POPULATE、REFRESH和ON CLUSTER。#100539 (DQ) 。 - 新增
s3_read_request_duration_microseconds和s3_read_request_bytes直方图指标,用于观测 S3 GET 请求连接生命周期及消耗的字节数,可在system.histogram_metrics和 Prometheus 端点中查看。#102058 (Sema Checherinda) 。 - 新增
Paimon、PaimonS3、PaimonAzure、PaimonHDFS和PaimonLocal表引擎,支持基于 Keeper 快照进度跟踪的增量读取。增量模式仅返回自上一个已提交快照以来的新行。可通过paimon_target_snapshot_id执行定向快照增量读取,并通过max_consume_snapshots为每个查询设置快照上限。后台元数据刷新可通过paimon_metadata_refresh_interval_sec配置。该功能受allow_experimental_paimon_storage_engine控制。#102343 (XiaoBinMu) 。 - 新增 Kafka 表设置
kafka_map_virtual_columns_on_write。启用后,Kafka 表 schema 中名为_key、_timestamp、_headers.name和_headers.value的列会在INSERT时映射为对应的 Kafka 消息 key、timestamp 和 headers,并从消息负载中排除。#103243 (Alexey Milovidov) 。 - 为可刷新materialized view 新增了
SYSTEM PAUSE VIEW [db.]name和SYSTEM PAUSE VIEWS查询。与SYSTEM STOP VIEW不同,SYSTEM PAUSE VIEW不会中断当前正在进行的刷新——进行中的刷新会正常完成,只会阻止后续刷新。可通过SYSTEM START VIEW或SYSTEM START VIEWS恢复,这两个命令现在都会统一清除 stopped 和 paused 两种状态。#103252 (Nikita Mikhaylov). - 新增函数
regexpPosition(以及与 PostgreSQL 兼容的别名regexpInstr和regexp_instr) ,用于返回字符串中第 N 次 Regex 匹配的字节位置。支持起始偏移、匹配后返回模式、Regex 标志以及捕获组选择。#104172 (Abhinav Agarwal). - 新增用于质数判断的函数
isPrime和isProbablePrime。isPrime可对最大至UInt64的无符号整数返回精确结果。isProbablePrime还支持UInt128和UInt256;对于这些更宽的类型,0表示确定为合数,1表示可能为质数。isProbablePrime的可选第二个参数rounds用于控制置信度 (上限为256) ;默认25轮可将随机合数的假阳性率控制在10^-15以下,并且isProbablePrime支持取消。#104234 (Nihal Z. Miaji). #104639 (Alexey Milovidov). #104806 (Nihal Z. Miaji). clear和/clear现在会清空 clickhouse 命令行工具中的终端,而不再被误当作查询执行。#104318 (Tyler Hannan).- 允许
file表函数在SELECT查询中接受路径数组Array(String)。#104442 (Yue). - 向
system.functions表新增了deterministic和higher_order列。#104479 (Pedro Ferreira). - 为
bech32Encode新增可选的编码 Variant 参数 (bech32/bech32m) ,并为bech32Decode新增原始解码模式,用于非 SegWit 地址编码 (例如 Cosmos SDK、Injective、Osmosis) 。#98986 (Yash ). - 现在可以写入
AvroConfluent格式的数据,而它此前仅支持输入。这使得可以直接从 ClickHouse 生成带有 Confluent Schema Registry 帧的 Avro 消息,例如在写入 Kafka 时。schema 会自动注册到 registry。可使用新的output_format_avro_confluent_subject设置来指定 subject 名称。#101935 (János Benjamin Antal). - 新增
prettyPrintJSON函数,可将 JSON 字符串格式化为便于阅读的形式。适用于仪表盘或报告,因为此前这类美化通常需要在客户端额外处理一步。关闭了 #62523。#102594 (Dmitry Prokofyev). - 新增
STRING_AGG,作为groupConcat的不区分大小写别名,以兼容 PostgreSQL / SQL 标准。#105125 (Alexey Milovidov) 。 - 现在可以在特定子查询上使用
SETTINGS use_query_cache = true,从而单独缓存各个子查询的结果,而无需缓存整个外层查询。新设置query_cache_for_subqueries = true可将use_query_cache批量应用到所有子查询。注意:外层查询上的use_query_cache现在不再自动传播到子查询。#99804 (Vincent Voyer) 。 - 为 Web UI (
play.html) 中的查询编辑器新增了基于词法分析的语法高亮,颜色风格参照clickhouse-client。#105105 (Alexey Milovidov) 。
Experimental 功能
- 新增了一个 Experimental 的 Web 终端界面,位于
/webterminal,可通过 WebSocket 在浏览器中提供交互式clickhouse-client会话。默认禁用;可通过allow_experimental_webterminal服务器设置启用。可在这里查看。 #100277 (Alexey Milovidov). #105191 (Alexey Milovidov). #105059 (Alexey Milovidov). Kafka2引擎 (Experimental,使用基于 Keeper 的 offset 存储) 现已支持直接SELECT查询以及kafka_commit_on_select设置。 #100276 (Alexey Milovidov).WASMUDFs 现在可强制转换更多数值类型:较小的整数可转换为更宽的整数 (例如Int8到UInt64) ,任意整数都可转换为浮点数 (例如Int32到Float32) 。 #100435 (Vasily Chekalkin).- 支持在
DELETE FROM system.webassembly_modules查询中使用LIKE函数。 #104397 (Vladimir Cherkasov). - 为
Iceberg增加了对 Geo 类型的支持。 #103113 (Konstantin Vedernikov). - 为 ArrowFlight SQL server 添加了预处理语句功能。 #103047 (Yakov Olkhovskiy).
- 通过在 KQL 解析器各阶段之间保留解析深度和回溯计数器,提升了 KQL 解析器 (用于支持 Kusto 语言) 的稳健性,从而能够对复杂 KQL 查询一致地跟踪解析器限制。 #103528 (Yakov Olkhovskiy).
性能提升
- 通过
file表函数或File表引擎读取本地 Parquet 文件时,可复用 Parquet 页脚元数据缓存。此前,该缓存仅会用于对象存储后端。#104260 (Alexey Milovidov) 。 - 当排序键只引用 join 保留侧的列时,可将
ORDER BY ... LIMIT n下推到LEFT/RIGHTjoin 之下,从而限制保留侧输入在连接前需要产出的行数。该行为由新设置query_plan_top_k_through_join控制 (默认启用) 。#104268 (Alexey Milovidov) 。 - 默认启用
use_top_k_dynamic_filtering和use_skip_indexes_for_top_k设置,以提升ORDER BY ... LIMIT N查询的性能。#99537 (Alexey Milovidov) 。默认将use_top_k_dynamic_filtering限制为仅适用于定长排序列,以避免在ORDER BY <var-length-column> LIMIT N查询中出现性能回退,因为逐行进行阈值比较的成本会超过节省的 I/O 开销。此前的行为仍可通过新设置use_top_k_dynamic_filtering_for_variable_length_types启用。#104216 (Alexey Milovidov) 。 - 使用
jemalloc的 oversize-arena 特性来减少缺页错误。#103958 (Nikita Taranov) 。 - 限制
UNION ALL中同时活跃的流,以降低峰值内存占用。#100176 (Alexey Milovidov) 。 - 对用户态页缓存进行了小幅优化。#100300 (Alexey Milovidov) 。现在,用户态页缓存始终优于 OS page cache。
- 通过用户态页缓存 (
use_page_cache_for_object_storage = 1) 读取对象存储中的冷数据时,现在速度显著提升,因为连续的缓存未命中会被合并为一次 HTTP 请求,而不是每个page_cache_block_size块发起一次请求。#104230 (Alexey Milovidov) 。 - 加快涉及类型转换和函数应用的索引分析。修复 #55653。#100366 (Alexey Milovidov) 。
- 加快在包含大量底层表的
Merge表上执行超大查询的速度。修复 #32465。#100369 (Alexey Milovidov) 。 - 从设置字段类型中移除 vtable,将
Settings的拷贝大小减少约 28 倍,并通过适用于所有设置类型的类型化数组布局提升缓存局部性。#102269 (Raúl Marín) 。 - 新增
max_threads_min_free_memory_per_thread和max_insert_threads_min_free_memory_per_thread设置,以便在服务器可用内存不足时自动降低查询并行度。#100383 (Alexey Milovidov) 。 - 降低低内存系统 (< 4 GiB) 上的内存占用。#100389 (Alexey Milovidov) 。
- 新增
OptimizeTrivialGroupByLimitPass。对于简单的SELECT ... FROM t GROUP BY k LIMIT n查询 (不含HAVING、ORDER BY或窗口函数) ,analyzer 现在会设置max_rows_to_group_by = n + offset和group_by_overflow_mode = 'any',因此 aggregation 会在产出n个不同键后停止,而不是对整个输入完成分组。由新设置optimize_trivial_group_by_limit_query控制 (默认启用) 。#104473 (Amos Bird) (Alexey Milovidov). - 为
_part_offset和_block_number虚拟列新增粒度级隐式 min-max 索引,也包括 projections。可基于虚拟列谓词快速对粒度进行 pruning。#103952 (Mikhail Artemenko). #104746 (Mikhail Artemenko). #105137 (Mikhail Artemenko). - 对于
prealloc_serialized家族的 aggregation 方法,在批次序列化阶段预先计算每行的哈希,并将其用于:(a) 在emplaceKey/findKey中跳过重复哈希计算,以及 (b) 对下一行的 bucket 执行软件预取。通过隐藏哈希表缓存未命中延迟,加速多键字符串/序列化 aggregation。#104475 (Amos Bird) (Alexey Milovidov). - 为
Iceberg表新增查询条件缓存。#102115 (Konstantin Vedernikov). - 优化
cramersV、cramersVBiasCorrected、theilsU和contingency与窗口函数配合使用时的性能。关闭 #83521。#93384 (Nihal Z. Miaji). - 新增一项查询优化,将
tupleElement(dictGet('dict', ('a', 'b', 'c'), key), N)重写为dictGet('dict', 'a', key),避免拉取不必要的字典属性。由optimize_dictget_tuple_element设置控制 (默认启用) 。#100186 (Alexey Milovidov). - 为带排序的分布式查询,在发起端的排序步骤启用缓冲。#100661 (Nikita Taranov).
- 提升
partial_mergeJOIN 的性能。#100945 (Artem Zuikov). - 略微减少了
partial_mergeJOIN 中的内存过量分配。#100963 (Artem Zuikov). - 通过缓存 sampling settings 而不是遍历整个 memory-tracker 层级,优化分配/释放操作。#101267 (Azat Khuzhin).
- 通过预分配内部跟踪容器,降低 S3 分段上传期间的内存分配开销。#101799 (Gagan Dhakrey).
- 在 hash join 探测阶段添加软件预取,以降低大型哈希表的内存访问延迟,由设置
enable_software_prefetch_in_join控制。#102444 (Xiaozhe Yu). - 优化
MemoryTracker布局,性能提升约 25%。#103464 (Azat Khuzhin). - 在索引分析前重写
coalesce(a, b, ...) <op> const和ifNull(a, b) <op> const谓词,使每个参数对应列上的主键和跳过索引都能裁剪粒度。由新设置allow_key_condition_coalesce_rewrite控制 (默认开启) 。#103468 (Manuel). - 通过优化转义斜杠的处理,显著提升了读取带有大型 JSON 元数据文件的 Iceberg 目录时的查询性能。#103998 (Mohaidoss).
- 在缓存被禁用时,避免了索引未压缩缓存的额外开销 (server setting
index_uncompressed_cache_size = 0,默认即为此值) 。#104063 (Michael Kolupaev). - 修复了
ORDER BY ... LIMIT查询在搭配非选择性WHERE过滤器且 limit 较小时会读取过多粒度的问题。此前,按序读取之上的任何过滤器都会禁用按 mark range 拆分任务,因此管道无法在粒度之间取消,并会为每个 stream 读取整个分片。#104112 (Vladimir Cherkasov). - 修复了在重新调整 JOIN 两侧顺序后,未能复用 hash table 大小缓存的问题。#104131 (Nikita Taranov).
- 启用
fsync_after_insert后,现在会通过 IO thread pool 并行对分片文件执行 fsync,从而加快宽表上 insert 的收尾过程。完整的 ClickBenchhits载入速度提升约 22%。#104137 (Alexey Milovidov). - 在 AArch64 上使用 NEON 对
find_first_symbols、find_first_not_symbols、find_last_symbols_or_null、find_last_not_symbols_or_null和splitInto进行了向量化。此前这些 helpers 仅在 x86 (SSE2 / SSE4.2) 上有 SIMD 路径,在 ARM 上则会退回到标量循环。在 ClickBenchhits数据集上,TSV parsing 提速约 2 倍,URL functions 和splitByChar提速约 1.3 倍;而对于非常密集的 JSON parsing (字段间隔小于 16 字节) ,性能会略有下降,这与现有 SSE2 的权衡一致。#104228 (Alexey Milovidov). - 现在,通过简单
ALIAS列读取数据 (例如some_alias['key'],其中some_alias ALIAS m) 时,会走与直接引用底层列相同的按 subcolumn 读取路径,从而重新获得Map、Array、Tuple和Nullable别名列可带来的大量 I/O 节省。#104245 (Raúl Marín). - 通过将每个查询的
AsyncReadCounters改为无锁实现,降低了异步远程 FS 读取路径上的锁竞争。#104374 (Nikita Mikhaylov). - 小幅优化了 projections 按序扫描的查询计划。#103723 (Mikhail Artemenko).
- 扩展
optimizeUseNormalProjections,使其也能处理这样一种特定情况:虽然没有过滤掉任何内容,但 projection 的 sorting key 可以从查询计划中去掉排序步骤。#104680 (Mikhail Artemenko). - 允许
json.path[]语法糖和显式类型提示在带类型的JSON路径上正常工作。#99179 (Pavel Kruglov) 。 - 将
json.path[N].nested.path(会展开为tupleElement(tupleElement(json.path[N], 'nested'), 'path')) 优化为json.path[].nested.path[N],从而减少读取的数据量。#99802 (Pavel Kruglov) 。 - 通过将数据库级别的 grant 检查移出逐表循环,优化
system.parts中的SHOW TABLES访问检查。#100860 (Shaohua Wang) 。 - 移除
system.tables中SELECT name/SELECT database, name快速路径里冗余的逐表SHOW TABLES访问检查。#100881 (Shaohua Wang) 。 - 在 macOS 上启用 JIT 编译。#100947 (Alexey Milovidov) 。
- 当行策略仅依赖排序键列且具有确定性时,跳过在
FINAL之后延后应用该行策略;同时跳过该情况下由行策略强制触发的相应PREWHERE延后处理。#102884 (Yarik Briukhovetskyi) 。 - 新增支持将
hasAny和hasAll作为文本索引中的过滤谓词。#103266 (Anton Popov) 。 - 将长期存在的 MergeTree 堆状态 (每个 parts 和每张表的元数据) 分配到专用的 jemalloc arena 中,并通过
jemalloc.mergetree_arena.*异步指标对外暴露。这样可以减少稳定运行状态下默认 arena 的碎片化,并避免每个 parts 中长期存活的对象占住原本可衰减回收的页。#104136 (Raúl Marín) 。 - 改进高负载下 ZooKeeper 客户端的超时处理,适用于单个会话上有大量请求以管道化方式发送的场景。ZooKeeper 客户端现在使用基于进度的超时机制:只要在
session_timeout_ms内从服务端收到任何数据,就会延长等待时间。每个请求仍受3 * session_timeout_ms的硬上限约束,以限制调用方延迟。关闭 #100466。#104351 (Antonio Andelic) 。 - 将每个事件的 trace 标志移到单独的数组中,并按需延迟分配,从而降低
ProfileEventstracing 的开销。#105030 (Azat Khuzhin) 。 - 为
ColumnDecimal添加compareTrackAt,提升Decimal列的比较性能。#105110 (Artem Zuikov) 。 - 新增
MD5的 SIMD 实现 (AVX2/AVX512) ,可并行计算多个输入的哈希,从而提升吞吐量。#105161 (Joanna Hulboj) 。
改进
- 改进了所有 ClickHouse 应用程序的帮助输出:
--help现在会稳定返回退出码0、输出到stdout,并且顶层clickhouse --help会列出所有子命令。为clickhouse start/restart新增了--no-sudo选项 (在 Docker 中很有用) ,以及clickhouse help子命令。这是来自 @qoega 的 #58244 的后续工作。#98148 (Alexey Milovidov) 。 input_format_column_name_matching_mode的默认值已从match_case更改为auto。对于会将输入列名与表 schema 进行匹配的输入格式 (JSONEachRow、CSVWithNames、JSONColumns、BSONEachRow、RowBinaryWithNames等) ,现在会先尝试区分大小写匹配;如果未匹配到,再回退为不区分大小写匹配。此前的严格行为会在compatibility模式下保留。#104320 (Alexey Milovidov) 。- 新增
STDDEV,作为stddevSamp的不区分大小写别名,以兼容 PostgreSQL/SQL 标准。#105120 (Alexey Milovidov) 。 - 新增
array_to_string,作为arrayStringConcat的不区分大小写别名,以兼容 PostgreSQL。#105121 (Alexey Milovidov) 。 - 新增
unnest,作为arrayJoin的不区分大小写别名,以兼容 PostgreSQL (函数调用形式) 。#105124 (Alexey Milovidov) 。 clickhouse-client中的进度条现在会在 RAM 旁显示磁盘临时数据的使用情况 (例如外部排序、aggregation 或 JOIN) ,其中还包括分布式查询按 host 细分的信息。#105190 (Alexey Milovidov) 。- 新增
system.predicate_statistics_log,这是一个新的采样日志,用于记录每个查询的 predicate 过滤器选择性,以及 MergeTree 索引粒度剪枝。默认禁用;可通过predicate_statistics_sample_rateserver setting 启用。这是自动索引和 projection 推荐所必需的。#98727 (Yarik Briukhovetskyi) 。 - 启用
skip_unavailable_shards时,如果本地 shard 缺少表,则允许跳过该 shard。#100141 (Alexey Milovidov) 。 - 当 Linux mdraid 阵列正在重新同步或处于降级状态时,会添加启动警告 (可在
system.warnings中查看) ,因为这两种情况都可能影响磁盘 I/O 性能,或表明磁盘存在故障。#100941 (Alexey Milovidov) 。 - WASM UDFs 现在会显示在
system.functions中,并且其origin(WasmUserDefined) 、syntax、arguments和returned_value列会根据其 ClickHouse 类型元数据正确填充。此前它们要么缺失,要么因origin错误而作为重复项列出。#101053 (Vasily Chekalkin) 。 generate_seriestable function 现在支持使用负 step 值生成降序 sequence,例如SELECT * FROM generate_series(99, 0, -1)。#101056 (Alexey Milovidov) 。- 修复某些函数 (
dotProduct、formatRow、structureToCapnProtoSchema/structureToProtobufSchema、用户自定义函数) 在DEFAULT/MATERIALIZED表达式、表引擎设置等延迟执行路径中使用时抛出的Context has expired异常:在需要时确保这些函数持有强引用的上下文。#101109 (Alexey Milovidov). - 修复对零限制创建的优先级误报
Cache limits violated逻辑错误的问题 (例如启用enable_filesystem_query_cache_limit时按查询划分的文件系统缓存优先级) 。#101428 (Alexey Milovidov). - 为
s3express端点自动检测区域。#101520 (Pradeep Chhetri). - 支持在向
Iceberg写入时为数据文件指定字段 ID。关闭 #102322。#102362 (Konstantin Vedernikov). - web UI (
play.html) 中的左侧面板现在支持独立滚动,页面滚动时仍保持可见,并且点击某个表后会滚动到查询区域。#102498 (Alexey Milovidov). - 现在可以通过 Ctrl/Cmd/Shift+单击或鼠标中键单击左侧面板中的 ClickHouse 徽标,在新选项卡中打开 Play UI。#102501 (Alexey Milovidov).
- 新增指标,用于跟踪所有表中投影主键和投影索引粒度占用的内存。#102587 (Narasimha Pakeer).
- 将
max_network_bandwidth_for_user和max_network_bandwidth_for_all_users应用于远程文件系统的读写。#103080 (Azat Khuzhin). - 在 Refreshable Materialized Views 持续刷新的情况下,基于快照中表的状态而非全局状态进行决策,从而提升备份的健壮性。#103384 (Nikita Mikhaylov).
SELECT * FROM system.databases现在无论show_data_lake_catalogs_in_system_tables设置如何,都会始终列出数据湖 catalog 数据库。此前默认会隐藏它们,这与始终显示它们的SHOW DATABASES不一致。#103444 (Alsu Giliazova).- 使代码中的服务器设置
concurrent_threads_soft_limit_ratio_to_cores默认值与随附config.xml中的值 (2) 保持一致,因此即使未使用随附的config.xml,默认的max_min_fair并发线程调度器也会开箱即用地将查询处理线程限制为 CPU 核心数的 2 倍。#103446 (Alexey Milovidov). - 提升解析器和字符串函数在边界情况的 sanitizer 稳健性:在
getURLScheme中处理空输入;在Lexer::nextToken的max_query_size检查中避免空指针算术运算;以及在解码前对空 haystack 的 UTF-8 子序列评估进行短路处理。#103489 (Yakov Olkhovskiy). - 改进了对
divide(0, x)和intDiv(0, x)的单调性推断准确性:此前这些函数会被无条件视为单调,但0 / x在任何包含 0 的范围内都是非单调的,因为0 / 0未定义 (对divide而言会得到NaN/Inf,对intDiv而言则会抛出除零异常) 。这一错误判断会导致KeyCondition::applyMonotonicFunctionsChainToRange生成left > right的范围;当主键上的IN/NOT IN表达式将键包裹为divide(0, key)或intDiv(0, key)时,会在调试构建中触发LOGICAL_ERRORInvalid binary search result in MergeTreeSetIndex。发布构建不受影响——该断言受#ifndef NDEBUG控制。#103621 (Groene AI). - 将
HTTPConnectionPool*TCP{Rcv,Snd}BufBytes_{p50,p75,p90,p95}异步指标替换为system.histogram_metrics中基于 bucket 的直方图http_pool_tcp_buf_bytes(标记为group、direction) 。各组的异步指标总量仍予以保留。#103704 (Sema Checherinda). system.server_settings现会将服务器设置{disk,storage,http}_connections_{rcvbuf,sndbuf}标记为可在无需重启的情况下修改。其值可通过SYSTEM RELOAD CONFIG更新;运行时生效路径自 #100478 起就已具备。#103772 (Sema Checherinda).- 在
flameGraph中新增对已解析符号 (Array(String)) 的支持。#103816 (Azat Khuzhin). - CLI 客户端现在可以在其配置中指定
<rainbow_parentheses>false</rainbow_parentheses>,用于终端颜色与括号显示冲突的环境 (类似地,clickhouse format现在也支持--no_rainbow_parentheses) 。#103851 (Larry Snizek). - 修复了
MultiVolnitsky的 UTF-8 不区分大小写搜索:在失败时回滚部分putNGram插入,并将失败的 needles 切换为 fallback searcher,从而避免状态不一致。#103864 (Yakov Olkhovskiy). - 在与 glibc 兼容的 musl 中,通过
rseqTLS 实现sched_getcpu。#104016 (Azat Khuzhin). - APPEND 模式下的 Replicated 可刷新materialized view 在刷新期间如果与 ZooKeeper 的连接短暂中断,将不再发生重复刷新两次的问题。#104051 (Michael Kolupaev).
- 允许未显式指定列列表的分布式表根据推断出的远程表结构来校验分片键。#104111 (Yue).
- 修复带有
Azureabfss路径的 REST catalog。#104120 (Konstantin Vedernikov). - 在 Keeper S3 snapshot client 中支持
role_arn和role_session_name身份验证设置,使 snapshot 上传能够使用基于 STSAssumeRole的身份验证。#104140 (Alexey Milovidov). - 修复了运行带有
MATERIALIZEDCTE 的查询时出现的内存泄漏问题。#104153 (Alexey Milovidov). - 修复了
lowerUTF8/upperUTF8在处理大型非 ASCII 数据集时 (例如构建文本索引期间) 抛出异常的问题:当累计输出缓冲区超过 2 GiB 时会出错;现在会以明确的错误信息拒绝超长单行。#104229 (Shaohua Wang). - 增强了 MergeTree 列统计信息加载在瞬时 I/O 故障下的健壮性,避免受影响的 parts 永久禁用基于统计信息的优化。#104372 (zoomxi).
INSERT INTO ... SELECT FROM input(...)不再需要CREATE TEMPORARY TABLEgrant。#104470 (Alexey Milovidov).- 新增 MergeTree setting
concurrent_part_removal_threshold_for_remote_disk(默认值为16) :当待删除的 parts 中至少有一个存储在远程 disk 上时,将使用该设置替代concurrent_part_removal_threshold。此前的阈值100可能导致对象存储后端上的DROP TABLE及其他 part 删除操作卡顿数十秒,因为即使每次删除都是一次独立的网络往返,这些删除仍会串行执行。新 setting 会让远程存储更早进入并行删除路径,同时保持本地 disk 的行为不变。#104676 (Groene AI). - 新 setting
defer_partition_pruning_after_final(默认值为1) 使 26.3 中引入的在FINAL下跳过 partition pruning 的行为变为可选择退出。将其设为0可恢复 26.3 之前的 partition pruning——对于相同 PK 的行不会跨分区的事件日志 workload,速度会明显更快。compatibility = '26.2'会自动将其切换为0。#104705 (Nikita Fomichev). - 修复了
intExp2对超出范围的输入返回错误结果的问题 (包括 JIT 下>= 64的移位,以及两条代码路径中绝对值超过INT_MAX的整数) 。#105054 (Raúl Marín). - 在
clickhouse install和clickhouse git-import中,为基于 CLI 选项和解析后输入构建的 shell arguments 添加引号,从而能够正确处理包含空白字符或 shell 元字符的路径、用户/组名称以及 commit 哈希。#105232 (Raúl Marín). Aliastable engine 现已不再属于 Experimental,无需allow_experimental_alias_table_enginesetting 即可使用。#103488 (Alexey Milovidov).- 为
clickhouse-benchmark添加了--queries-format选项,可在默认的制表符转义、每行一条查询的输入格式 (tsv) 与将标准输入解析为由;分隔的多查询脚本 (script) 之间进行选择。#99972 (Aleksandr Musorin). - 逐元素的 Tuple operators
tuplePlus、tupleMinus、tupleMultiply、tupleDivide、tupleModulo、tupleIntDiv和tupleIntDivOrZero现在支持可变参数,可接受两个或更多大小相同的 tuples,并以左折叠方式逐元素应用。此前它们只能接受恰好两个参数。#104659 (Aruj Bansal). - 在
/processors-profile新增了一个内置 Web UI,可将任意历史SELECT查询的管道以热力图形式可视化,数据来自system.query_log和system.processors_profile_log。每个处理器都会根据其elapsed_us着色,并在悬停时显示该处理器的统计信息 (行数、字节数、等待时间) 。#104614 (Nikita Mikhaylov). - 设置
query_plan_use_logical_join_step(及其别名query_plan_use_new_logical_join_step) 现已废弃且不再生效;现在始终使用逻辑 join 步骤。#104017 (Vladimir Cherkasov). play.html以及其他内置网页 (dashboard.html、jemalloc.html、merges.html、binary.html、webterminal.html) 中的user输入框不再预填字面文本default。现在会显示user占位提示,且默认留空。留空时,页面不会发送user=URL 参数 (WebTerminal 的认证 JSON 也会省略user字段) ,因此服务器会按其常规回退逻辑使用default用户——而且通过其他渠道提供的 HTTP 凭据 (X-ClickHouse-User、HTTP Basic、每个 handler 的<handler><user>configuration) 也不再会被覆盖。#105254 (Alexey Milovidov).ORCreader:将基于偏移量的读取 (readBigAt) 与use_prefetch解耦,因此HDFS上经过 EC 编码的数据即使在use_prefetch = false时 (例如由 Gluten 设置) 也能被正确读取。#103348 (zhanglistar).- 现在,从
play.html以CSVWithNames格式下载的文件会使用.csv文件扩展名。#103737 (JackFielding). - 为 BigLake catalog 增加了更多输入校验。#105117 (Konstantin Vedernikov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 通过记住表达式是否带括号,修复格式不一致的问题。#92340 (Alexey Milovidov).
- 修复
Decimal与 Float 类型之间无法准确比较的问题。#94293 (zoomxi). - 允许在分布式查询中使用位置参数。#94359 (simonmichal).
- 修复删除并重新创建同名 materialized view 时,
DatabaseCatalog::updateDependencies中出现的断言失败;同时修复在引用依赖为空时,RENAME TABLE或EXCHANGE TABLES过程中视图依赖被静默丢失的问题。#98779 (Alexey Milovidov). - 修复一个服务器中止问题 (
DatabaseCatalog::getTableImpl中的断言失败) :当通过ON CLUSTER创建表,且其 UUID 与现有数据库的 UUID 相同时,会触发该问题。#98861 (xiaohuanlin). - 修复启用设置
use_skip_indexes_on_data_read时,数据读取阶段使用跳过索引以及处理由轻量级更新创建的现有补丁分区片段时的问题。#99543 (Alexey Milovidov). - 修复当查询优化器将带有
IN (subquery)的过滤器下推到 PREWHERE 时出现的 “Not-ready Set” 异常。#100375 (Alexey Milovidov). - 修复在单条
ALTER TABLE语句中同时使用ADD COLUMN和RENAME COLUMN时出现的 “Cannot find column” 错误。#100387 (Alexey Milovidov). - 修复视图在混合使用
UNION和INTERSECT/EXCEPT运算符时,于DETACH/ATTACH或服务器重启后返回错误结果的问题。#100390 (Alexey Milovidov). - 修复在 IN 子句中出现关联子查询时,使用 AST fuzzer 进行压力测试期间可能发生的 “Trying to execute PLACEHOLDER action” 异常。#100398 (Alexey Milovidov).
- 修复向按
year、month或daytransform 分区、且包含Date列的 Iceberg table 插入数据时出现的 logical error 异常。#100404 (Alexey Milovidov). - 修复在
ALTER TABLE MODIFY COLUMN更改列类型后,跳过索引仍用于不兼容数据的问题,这可能导致 sanitizer 构建中的服务器崩溃或查询结果错误。#100526 (Alexey Milovidov). - 修复
paimonCluster、paimonS3Cluster、paimonAzureCluster和deltaLakeS3table function 在query_log中泄露凭据的问题。#100529 (JIaQi Tang). - 修复 Kafka 引擎表执行
DROP TABLE时,因rd_kafka_consumer_close中的死锁而可能无限期挂起的问题。#100604 (Alexey Milovidov). - 将硬编码的
source_table_engines列表替换为通过StorageFactory和DatabaseFactory在 runtime 中查找。为DatabaseFactory::EngineFeatures添加source_access_type,使使用源引擎 (PostgreSQL、MySQL、S3 等) 的CREATE DATABASE与CREATE TABLE一样需要相同的源授权。修复了在table_engines_require_grant=false时GRANT TABLE ENGINE ON *执行失败的问题。关闭 #71544。#100746 (pufit). - 修复了读取某些表时可能发生的 server crash:这些表的
ALIAS列中包含嵌套在函数调用内的关联子查询 (例如ALIAS toString(intDivOrZero(x, (SELECT ...)))) 。现在,CREATE TABLE和ALTER TABLE会以THERE_IS_NO_DEFAULT_VALUE拒绝出现在DEFAULT/ALIAS/MATERIALIZED列表达式中、任意嵌套深度的任何子查询。此前,浅层校验会放过嵌套子查询,因此关联场景会在读取时崩溃,而嵌套的非关联场景虽然看似可用,却可能导致异常行为;现在这两类情况都会在 DDL 阶段被拒绝。#100753 (Groene AI). - 修复了一个 server crash (
Logical error: Bad cast from type DB::FunctionNode to DB::ColumnNode) :当对带有CONSTRAINT ... ASSUME定义的表执行包含关联子查询的查询,且启用了optimize_substitute_columns和convert_query_to_cnfsettings 时,可能会触发该问题。#100756 (Groene AI). - 修复了向 JSON column 插入一行时可能出现的异常:该行在引入新动态字段的同时,还为某个类型化字段提供了不兼容的值,并且该列随后被用作 GROUP BY 键。#100758 (Jimmy Aguilar Mena).
- 修复了通过
DiskObjectStorageTransaction路径进行的 S3/对象存储写入会被静默绕过 workload IO scheduling 的问题 (该路径用于s3_with_keeperdisks,以及在use_fake_transaction=false时显式使用) 。此前,向这类 disk 上的 MergeTree tables 执行 INSERT 写入时,会忽略CREATE RESOURCE/CREATE WORKLOADthrottling,因为事务性写入路径从未将资源链接注入WriteSettings。#100777 (JIaQi Tang). - 修复了
Protobuf与ProtobufList共用 schema-cache 时的冲突问题:先以FORMAT Protobuf读取消息,再以FORMAT ProtobufList读取时可能失败,因为ProtobufList会强制将缓存的 schema 转换为其 envelope 形式。现在,当没有可用的 envelope schema 时,ProtobufList会回退到缓存的消息类型。#100849 (Callum Cooper). - 修复了 Rust CXX bridge 中因
std::exceptionABI 不匹配导致的 heap-buffer-overflow。#100931 (Azat Khuzhin). FunctionVariantAdaptor现在会在所有Variant备选类型都与函数不兼容时抛出ILLEGAL_TYPE_OF_ARGUMENT,而不是静默返回Nullable(Nothing)。此前,如果没有任何备选类型兼容,WHERE function(variant_col)predicate 会在不报错的情况下返回 0 行,而等效的SELECT上下文则已经会正确抛出错误。#100939 (Vasily Chekalkin).- 当 database 中包含视图时,
TRUNCATE ALL TABLES不再失败。#100943 (Alexey Milovidov). - 修复
optimize_rewrite_array_exists_to_has优化,使其能够正确处理类型不兼容的情况 (如 Date 与 String) ,并默认重新启用该优化。#100944 (Alexey Milovidov). - 修复 S3 设置优先级:
storage_configuration的磁盘设置现在会覆盖全局<s3>部分,而用户/profile/查询级别的设置会覆盖前两者。#100975 (Alexey Milovidov). - 修复 BFloat16、Float32 和 Float64 列在稀疏序列化过程中丢失负零 (-0.0) 符号的问题。#100983 (Takumi Hara).
- 修复读取 WKT 编码的 GeoParquet 和 Arrow 文件时所用 WKT 几何解析器中的两个 bug:
MULTILINESTRING几何对象此前会被错误解析为Polygon(导致类型化列抛出异常,并使混合Geometry列发生静默数据损坏) ;此外,不包含类型关键字的格式错误 WKT 字符串此前会触发未定义行为,而不是返回明确的错误。#100997 (Vasily Chekalkin). - 修复单个 shard 上分布式表的
grouping/GROUPING SETS查询失败,并报错 “Method executeImpl is not supported for ‘grouping’ function” 的问题。#101030 (Alexey Milovidov). - 修复 planner 中的
LOGICAL_ERROR“Column identifier is already registered”,该问题可能在同一个表表达式被多次处理时出现。#101048 (Alexey Milovidov). - 修复在
additional_result_filter设置与 UNION 或 EXCEPT 查询一起使用时出现的 LOGICAL_ERROR 异常 “Column identifier is already registered”。#101051 (Alexey Milovidov). - 修复将
* APPLY与 aggregate functions 以及group_by_use_nulls=1配合 GROUPING SETS、ROLLUP 或 CUBE 使用时发生的 server crash (Logical error: Bad cast from ColumnVector to ColumnNullable) 。#101062 (Groene AI). - 修复当
input_format_csv_skip_first_lines或input_format_tsv_skip_first_lines超过文件总行数时出现的无限循环问题。#101111 (Alexey Milovidov). - 修复 lazy materialization optimization 中的越界访问问题,该问题可能会在调试构建中导致异常。#101144 (Alexey Milovidov).
- 修复递归 CTE 中的 type inference:现在会通过
getLeastSupertype在UNION ALL的非递归部分和递归部分之间迭代扩展列类型,直到收敛,从而避免x + 1这类表达式中的整数 overflow。#101155 (Alexey Milovidov). - 将 MergeTree 压缩块大小设置 (max_compress_block_size、min_compress_block_size、marks_compress_block_size、primary_key_compress_block_size) 限制为 256 MiB,以防止通过 CREATE TABLE SETTINGS 设置极端值时发生 server crash。#101159 (Groene AI).
- 修复当 ROW POLICY 在其
USINGclause 中使用标量子查询 (例如USING (SELECT 1)) 时,QueryAnalyzer::resolve()发生的 LOGICAL_ERROR 崩溃。关闭 #100695。#101263 (Groene AI) 。 - 修复
MergeTreeDataPartWriterCompact::cancel在流分配失败时的未定义行为。#101292 (Alexey Milovidov) 。 - 修复 ALTER 语句中赋值时未包含时区的情况。关闭 #101328。相关:https://github.com/ClickHouse/ClickHouse/pull/100647。[#101403](https://github.com/ClickHouse/ClickHouse/pull/101403) (Yarik Briukhovetskyi) 。
- 修复当 SELECT 管道产生多个流时,带有 ORDER BY ALL 的 INSERT SELECT 查询会导致服务器崩溃 (LOGICAL_ERROR) 。#101443 (Groene AI) 。
- 修复因 join 重排序将 INNER JOIN 过滤器 (仅引用 outer join 的保留侧) 推入 outer join 的 ON 子句而导致的错误查询结果。#101504 (Vladimir Cherkasov) 。
- 对包含 arrayJoin 的执行计划跳过应用 lazy materialization,否则可能导致 LIMIT 未生效。关闭 #101608。#101644 (Vladimir Cherkasov) 。
- 修复
mergeFilterIntoJoinCondition优化在静默丢弃类型不匹配的 WHERE 等值条件时,导致 JOIN 查询结果错误的问题。#101652 (Xiaozhe Yu) 。 - 修复
error测试提示对 syntax/parsing error 不生效的问题——此前,对于格式错误的查询,使用-- { error SYNTAX_ERROR }会报出 “Expected server error”,而不是匹配客户端 parse error。#101675 (Groene AI) 。 - 修复
INTO OUTFILE ... TRUNCATE实际并未使用原子重命名的问题——数据会直接写入原始文件,而不是临时文件,因此查询失败时原有内容会被破坏。现在数据会先写入临时文件,只有成功后才会重命名。#101884 (Pablo Marcos) 。 - 修复读取 schema 包含 varchar(n) 或 char(n) 列类型的 Delta Lake 表时出现的异常
Unsupported DeltaLake type: varchar(n)。这些类型现在会映射为 String,这与 Delta Lake 协议在 Parquet 中将其存储为普通字节数组的方式一致。#101973 (Flavio Malavazi) 。 - 修复从 S3 读取 tar 归档且
schema_inference_mode=union并包含异构 Parquet schema 时发生的静默数据丢失问题——Parquet 元数据缓存错误地将第一个文件的元数据复用于归档中的后续所有文件。#101990 (Ahaan Limaye) 。 - 修复在同一服务器生命周期内,如果某个 Iceberg 表此前未执行过 SELECT 或 INSERT,则对其执行 ALTER TABLE UPDATE/DELETE 会导致服务器崩溃 (LOGICAL_ERROR) 的问题。#102113 (Alexey Milovidov) 。
- 修复了在内存数据库中的表 (例如临时表) 上执行 ALTER 查询时可能发生崩溃的问题。#102360 (Den Kalantaevskii).
- 修复了
formatQuery在格式化同一 source 上向后兼容的 READ/WRITE 授权时,会生成重复授权 (如GRANT FILE ON *.*, FILE ON *.* TO x) 而非GRANT FILE ON *.* TO x的问题。#102411 (Groene AI). - 修复了当
max_streams_to_max_threads_ratio大于 1 时,read-in-order 查询后的聚合失去并行性的问题。#102467 (Alexey Milovidov). - 修复了从 Buffer 表引擎中选择子列 (例如 Nullable 的
.null、Array 的.size0、Tuple 元素或 map 键/值) 时发生的崩溃问题 (LOGICAL_ERROR: Unknown virtual column) 。#102470 (Groene AI). - 修复了在 join 重排优化中,当带有
join_use_nulls的 LEFT/RIGHT JOIN 与其他涉及两个以上表的 JOIN 组合时出现的异常 “Cannot fold actions for projection”。#102516 (Alexey Milovidov). - 修复了 numericIndexedVector 上标量按元素操作 (例如
numericIndexedVectorPointwiseAdd) 在标量超出范围时的静默溢出问题。现在这类输入会抛出INCORRECT_DATA,而不是返回损坏的值。#102546 (FriendLey). - 修复了带有 SAMPLE 和查询级 OFFSET 的 INSERT 语句 AST 格式不一致的问题。关闭 #102523。#102547 (zoomxi).
- 修复了
groupConcat在反序列化格式错误的 aggregate function 状态时触发LOGICAL_ERROR异常的问题。#102558 (Christoph Wurm). - 现在,当
input_format_csv_use_default_on_bad_values=0时,不再接受 Time64 CSV 值末尾的垃圾内容。关闭 #102490。#102596 (Yarik Briukhovetskyi). - 修复了向具有 Enum 类型路径的 JSON 列插入默认值时出现 UNKNOWN_ELEMENT_OF_ENUM 异常的问题。关闭 #102359。#102687 (Pavel Kruglov).
- 修复了在某些情况下,列重命名期间
columns_substreams.txt损坏的问题。关闭 #102259。#102689 (Pavel Kruglov). - 修复了 JSON 解析期间向 Time 数据类型插入数据的问题。关闭 #102016。#102690 (Pavel Kruglov).
- 修复了缓存的 schema 文件名中内容样本十六进制编码的问题。关闭 #101904。#102703 (Pavel Kruglov).
- 修复了
SummingMergeTreemerge 期间的排序顺序违例问题:当ORDER BY键是基于包含 signaling NaN 值的Float32列的哈希表达式时,会在 debug 版本中崩溃、在 release 版本中静默导致数据损坏。#102791 (Groene AI). - 使
DETACH DATABASE ... SYNC以及其他调用waitDetachedTableNotInUse的操作可通过KILL QUERY取消,并能响应服务器关闭,从而避免并发查询持有表引用时无限期挂起。#102804 (Antonio Andelic). - 修复了
ANY RIGHT JOIN可能返回错误结果的问题。#102893 (Nikita Taranov). - 修复了 S3 请求失败后未进行重试、而是直接报出
ios_base::clear: unspecified iostream_category error的问题,原因是 Poco 的BufferedStreamBuf::flushBuffer未处理来自套接字层的短写入。#102894 (Sema Checherinda). - 修复了
input('auto')表函数在 INSERT SELECT 查询中通过 HTTP 接口调用时失败的问题。#102902 (Miсhael Stetsyuk). - 在存在行策略/additional_table_filters 时禁用简单的 LIMIT 优化 (以支持并行索引分析) 。#102921 (Azat Khuzhin).
- 在
HMACSQL 函数中隐藏 secret key。修复 #102927。#102997 (Mikhail f. Shiryaev). - 修复了启用
optimize_syntax_fuse_functions时,分布式查询中多次引用同一个quantile调用 (例如在SELECT、HAVING和ORDER BY中) 会触发MULTIPLE_EXPRESSIONS_FOR_ALIAS异常的问题。#103014 (tanner-bruce). - 修复了 CI 发现的一种情况:当过滤器依赖左侧列时,传入了一个尚未就绪的 Set。关闭 #102966。#103029 (Yarik Briukhovetskyi).
- 修复了 castOrNull 在某些情况下转换为 JSON 时的问题。关闭 #101818。#103036 (Pavel Kruglov).
- 修复了
SELECT DISTINCT静默返回不完整结果的问题:当聚合 projection 与查询匹配,但表中的某些 parts 没有 projection 数据时 (例如在表中已有数据后才添加 projection,且未运行MATERIALIZE PROJECTION) 。关闭 #102951。#103052 (Nihal Z. Miaji). - 修复了 analyzer 在进行公共表达式提取时,如果
WHEREpredicate (例如AND(OR(A, A), A)) 折叠为单个顶层 argument,会触发TOO_FEW_ARGUMENTS_FOR_FUNCTION异常的问题。#103072 (Peng). - 修复对包含
QBit元素的 tuple、map 或 array 求值if/ifNull时触发的逻辑错误Function writeSlice expects same column types for GenericArraySlice and GenericArraySink。ColumnQBit::structureEquals错误地将一个QBit列的内部 tuple 与另一个QBit列的外层包装进行比较,导致结构相同的QBit列被误判为不同。#103084 (Groene AI). - 修复在持有表引用时,启用
database_atomic_wait_for_drop_and_detach_synchronously的DETACH DATABASE不响应KILL QUERY、而是无限期挂起的问题。#103095 (Alexey Milovidov). - 修复使用非标识符 predicate (例如
WHERE 1=1) 删除 WASM 模块时发生的 segfault。#103101 (Joe Redfern). - 修复向较新 server 通过
remote()或分布式表执行 insert 时的向后兼容性问题:由于processInsertQuery末尾无条件调用sendProgress,旧客户端会报UNEXPECTED_PACKET_FROM_SERVER错误而失败。#103148 (Sema Checherinda). - 当 IN 的第二个参数是非常量 tuple 时,不得将 tuple 元素 CAST 为更窄的 LHS 类型,否则可能导致 overflow。关闭 #103055。#103169 (Yarik Briukhovetskyi).
- 修复 protocol function 中使用未初始化值的问题。#103187 (Pavel Kruglov).
- 修复 MergeTree 索引分析期间出现的
LOGICAL_ERROR(Bad cast … to ColumnLowCardinality) :当WHERE子句将LowCardinality键列与一个 CAST 为包含嵌套LowCardinality的类型的常量进行比较时 (例如Variant(LowCardinality(Date), String)) 。#103211 (Groene AI). - 修复
timeSeries*ToGridaggregate function 家族 (例如timeSeriesResampleToGridWithStaleness、timeSeriesChangesToGrid、timeSeriesResetsToGrid、timeSeriesRateToGrid) 在使用极端 timestamp 参数调用时出现的Logical error: 'index < bucket_count'。这类参数会在计算 bucket count 时导致有符号 64 位算术 overflow。同时将 grid buckets 总数限制为最多 1600 万,以防止对抗性输入意外触发大内存分配。#103223 (Groene AI). - 修复
ReplacingMergeTree的 lazyFINAL路径中,在管道扩展期间抛出的Logical error: 'Port is already connected'异常。该 bug 会影响设置了query_plan_optimize_lazy_final = 1的查询:当ReadFromMergeTree::initializePipeline插入内部 transforms (例如Resize) 并将子管道中的 processors 连接起来时,LazyUnorderedReadFromMergeTreeSource::expandPipeline会尝试再次连接已经连接的输出 ports。#103230 (Groene AI). - 修复当输入是已排序 subqueries 的
UNION ALL时,LIMIT BY和DISTINCT返回错误结果的问题。查询计划优化器错误地将这类 union 视为全局有序,因此返回了额外的行。#103231 (Nihal Z. Miaji). - 修复在启用 lazy replication 的 Map type 上计算 statistics 时可能发生的崩溃。关闭 #102390。#103273 (Pavel Kruglov).
- 修复 ClickHouse、MySQL、PostgreSQL 和 XDBC 字典源中的一个数据竞争问题:
clone() const会读取同一个invalidate_query_response字符串,而isModified() const会向其写入。 #103277 (Miсhael Stetsyuk). - 修复
Date32的单调性检测错误。关闭 #101265。 #103283 (Yarik Briukhovetskyi). - 将认证前 TCP Hello 数据包中的字符串限制为 64 KB,并新增
handshake_timeout_milliseconds服务器设置来限制总握手时间,防止未认证客户端占用过多内存或无限期占用线程。 #103284 (Sema Checherinda). - 修复 Parquet ColumnIndex 统计信息中 String 列出现
min_value > max_value的问题。 #103334 (Saurabh Kumar Ojha). - 修复
flattenTuple和tupleToNameValuePairs在处理Nullable(Tuple(...))输入时对 NULL 行处理不正确的问题。flattenTuple现在会保留外层 null map,因此 NULL 行会保持为 NULL。tupleToNameValuePairs现在会在输入为Nullable(Tuple(...))时,尽可能将结果的值类型改为Nullable(T),这样 NULL 行会生成[('a', NULL), ('b', NULL)],而不是[('a', 0), ('b', 0)]。当元素类型无法包装为Nullable(例如Array) 时,将使用默认值而非 NULL。关闭 #103312。 #103383 (Nihal Z. Miaji). - 在 Native format 中检查格式错误的展平 Dynamic 数据。 #103392 (Pavel Kruglov).
- 修复快照同步后因过时 RPC 导致复制停滞的问题。 #103406 (Seva Potapov).
- 修复一个会导致 server 中止的
LOGICAL_ERROR“Cannot pop N rows from X” 问题 (出现在 debug / sanitizer 构建中) :此前在读取格式错误的 BSON 文档时,如果其中某个值的 BSON 类型与Nullable(T)或Array(Nullable(T))列内的目标列类型不兼容,就会触发该错误。现在,这类格式错误的行会按预期产生明确的ILLEGAL_COLUMN异常。 #103418 (Groene AI). - 修复
arrayFill和arrayReverseFill应用于首行为空的Array(String)列且配合恒为 false 的 lambda 时导致的 server 中止问题。聚合 / 子数组循环中,size_t索引发生 underflow 变为SIZE_MAX,随后在ColumnString::doInsertManyFrom内部导致越界读取。属于与 #12263 相同的 bug 家族。 #103424 (Groene AI). - 修复以下问题:当上游 REPLACE RMV 的 EXCHANGE 在解析过程中途切换目标存储 identity 时,下游带有 SQL SECURITY DEFINER 的 APPEND RMV 中会出现 ACCESS_DENIED / UNKNOWN_TABLE。 #103427 (Alexander Gololobov).
- 从
urltable function 填充_time列。 #103437 (Nikita Taranov). - 修复在处理位宽无效的畸形输入时,
ALPcodec 解压路径中可能出现的越界读取。 #103457 (Raufs Dunamalijevs). - 修复了一个 bug:
SYSTEM SYNC FILESYSTEM CACHE '<name>' ON CLUSTER ...在格式化查询时可能丢失缓存名称,导致远程节点同步所有文件系统缓存,而不只是请求的那个缓存。 #103469 (Asish Kumar). - 修复
deltaLakeAzure中对 URL 编码路径的处理。关闭 #103509。 #103525 (Smita Kulkarni). - 修复将
AggregateFunction状态与整数相乘时的 heap-use-after-free 问题 (例如quantilesExactState(...) * N) 。平方求幂循环会将该状态与自身合并,而当聚合函数的merge重新分配其内部存储时,这种行为是未定义的。关闭 STID 0988-40af。 #103536 (Groene AI). - 修复了一个罕见问题:在
ReplicatedMergeTree表启动期间,如果磁盘上两个空的异常 parts 的 block 范围发生重叠但互不包含,就会触发LOGICAL_ERROR“Part X intersects previous part Y”。该异常会中止表 attach 线程,导致表无法启动。 #103537 (Groene AI). - 修复
Logical error: Incorrect mark rows for part ...(仅在调试版本中触发的断言) 的问题。该问题由MergeTree表上的 mutations 触发:这些表使用非自适应索引粒度 (index_granularity_bytes = 0) ,且最后一个数据标记不完整 (最可靠的复现方式是先执行DETACH/ATTACH,再执行 lightweightDELETE) 。 #103538 (Groene AI). - 修复
clickhouse-local通过file()table function 读取/proc和/sys伪文件时静默返回 0 行的问题 (例如SELECT * FROM file('/proc/cpuinfo', 'RawBLOB')) 。 #103548 (Ashrith Bandla). - 修复
GenerateRandom表引擎中max_string_length参数的处理。 #103550 (Alex Kuleshov). - 修复在日志中屏蔽嵌套 credentials 的问题。 #103552 (Vitaly Baranov).
- 修复在 SVE 不可用时仍使用 SVE 指令进行检测的问题。 #103568 (Raúl Marín).
- 修复
GenerateRandom存储参数的解析。 #103574 (Konstantin Bogdanov). - 修复
WITH FILL在数据以 ±inf 开头时出现无限循环的问题。 #103580 (Konstantin Bogdanov). - 修复了
JSONExtract提取到Variant类型时静默截断 JSON 小数的问题。此前,JSONExtract('{"x": 3.14}', 'x', 'Variant(Int64, Float64)')返回Int64=3,而JSONExtract('{"x": 3.14}', 'x', 'Variant(String, Int64)')返回Int64=3,导致小数部分丢失。现在小数值可无损保留:如果存在Float64/Decimal成员,则由其接收该值;否则由String成员保留原始 JSON。仅包含整数成员的Variant类型 (例如Variant(Int64, Int32)) 以及直接提取整数 (JSONExtract(json, 'Int64')、JSONExtractInt等) 的行为不变。#103620 (Groene AI). - 修复了不带参数的
SYSTEM INSTRUMENT REMOVE会产生std::bad_optional_access(错误码 1001) 而不是SYNTAX_ERROR(错误码 62) 的问题。#103622 (Pablo Marcos). - 修复了
windowID和tumblewindow view 在将时区字符串作为第 3 个参数调用时出现的 logical error / 未定义行为。#103641 (Alexey Milovidov). - S3 client 日志现在会将带有非空 x-amz-bucket-region 请求头的 HTTP 400 响应 (SigV4 签名区域错误) 视为信息性的区域错误场景,并输出更清晰的日志,而不是走通用的错误处理路径。只有在配置了 web identity 时,才会将 STS web identity credentials provider 添加到 S3 credentials chain 中,从而减少未使用该功能的部署中出现的无关警告。关闭 #99140。#103673 (MeltonSmith).
- 修复了
SYSTEM SYNC REPLICA <db>.<tbl> IF EXISTS在数据库不存在时静默成功,使其与表不存在时的现有行为以及DROP TABLE IF EXISTS所确立的先例保持一致。此前,尽管指定了IF EXISTS,查询仍会抛出UNKNOWN_DATABASE。关闭 #103629。#103689 (Groene AI). - 修复了这样一个问题:当
MergeTree表的排序键中包含Array(LowCardinality(...)),且WHERE子句对该列与元素类型不同的Array常量使用plus/minus时,FunctionBinaryArithmetic::executeImpl2会抛出 logical errorArguments of 'plus' have incorrect data types。KeyCondition::getMonotonicityForRange现在会在调用内部数值分发前递归去除LowCardinality。#103701 (Groene AI). - 修复了 26.1+ 中动态 cache 调整大小时的竞态问题。#103702 (Kseniia Sumarokova).
- 修复了一个问题:对于表达式中包含捕获常量的 lambda 的
ALIAS列 (例如arrayMap((k, v) -> concat(k, '=', v), mapKeys(m), mapValues(m)))) ,其上的 text 和 bloom_filter 跳过索引会被静默忽略。#103708 (Anton Popov). - 修复了
position和positionCaseInsensitive在start_pos接近UINT64_MAX时,因指针运算溢出而卡住或导致段错误的问题。#103766 (Raúl Marín). - 修复了解析带有双重小数部分的 dateTime 时的未定义行为。#103773 (Yarik Briukhovetskyi).
- 修复了 26.x 中一个数据正确性回归问题:当 JIT 编译的
if和multiIf的结果类型为Decimal,且某个分支中包含非Decimal(整数或浮点) 字面量时,会在无报错的情况下返回一个比正确值小10^scale倍的结果。慢速 (非 JIT) 路径不受影响。受影响版本的临时规避方法:SET compile_expressions = 0。#103809 (Groene AI). - 修复了将分词器从文本索引传递给受支持函数的问题。#103826 (Elmi Ahmadov).
- 修复了
numbers、generate_series以及类似遵循范围约束的源在WHERE子句中对某个元组使用IN或NOT IN,且其元素去重后归并为单个键列时返回错误结果的问题 (例如,WHERE tuple(number, number) NOT IN (tuple(1, 2))) 。关闭 #103660。#103835 (Groene AI). - 让自动 spilling 的 hash join 实际内存峰值保持在
max_bytes_before_external_join之下。此前,由统计信息驱动的预分配、原地哈希表翻倍扩容,以及无界的GraceHashJoin内存桶都可能分别导致查询超出配置上限并触发MEMORY_LIMIT_EXCEEDED。#103838 (Alexey Milovidov). - 修复了在配置系统日志 (如
text_log或filesystem_cache_log) 时,clickhouse-local在关闭过程中卡住的问题。SystemLogs::flushImpl会调用BaseDaemon::instance().flushTextLogs(),而该调用在clickhouse-server之外会抛出std::bad_cast,导致保存线程持续运行,直到pthread_cond_destroy阻塞了系统日志队列的销毁。#103874 (Alexey Milovidov). - 现在,对于其 body 在不同引用中推断出不同列类型的
MATERIALIZEDCTE 查询,会明确报出TYPE_MISMATCH错误并拒绝执行,而不再因Bad castLOGICAL_ERROR导致 server 崩溃。此前,这种情况会在 CTE body 引用了外层作用域中的标识符 (例如调用方子查询投影中的别名) ,且这些标识符在每次引用时被内联为不同常量时发生。#103879 (Groene AI). - 修复了 JOIN 转换查询计划优化器 (
tryConvertAnyOuterJoinToInnerJoin、tryConvertAnyJoinToSemiOrAntiJoin) 中的未初始化值使用问题;当ANYOUTERJOIN上层的过滤器包含rand、now或rowNumberInAllBlocks等非确定性函数时会触发该问题。优化器现在不再尝试对此类过滤器进行常量折叠,并保持 JOIN 不变,这也避免了错误地将其转换为INNER/SEMI/ANTI JOIN而在无提示的情况下丢弃行。#103880 (Groene AI). - 修复了
StorageKafka2中的一个释放后使用问题:当 Keeper session 被替换,而消费者持有临时 topic-partition 锁时,可能导致 server 崩溃。#103890 (Groene AI). - 修复了一个会抛出
LOGICAL_ERROR“Primary key type mismatch”的问题:当通过JOIN ... USING (key)将EmbeddedRocksDB表与一个 key 列类型 (例如Nullable(UInt64)、Int64、Decimal) 不同于存储主键类型的子查询进行连接时,就会出现该错误。现在,planner 在类型不匹配时会拒绝DirectKeyValueJoin,并回退到可处理类型转换的HashJoin。#103928 (Groene AI). SET max_threads = DEFAULT(max_final_threads和max_parsing_threads同样如此) 不再丢失自动状态。此前,重置这些设置之一后,system.settings会显示解析后的 CPU 核心数 (例如32) ,而不是'auto(32)',并且 server 会表现得像该值已被显式固定一样。#103991 (Groene AI) 。- 修复了读取
AggregateFunction(topK(N), String)列时出现SIZES_OF_ARRAYS_DONT_MATCH的问题;当其持久化的alpha_size因一次 25.12 之前的 deserialize+serialize 循环而增大时,就会触发该问题。#104002 (Raúl Marín) 。 - 修复了 PostgreSQL、Cassandra 和 XDBC 字典源中的 SQL 注入漏洞:此前,包含单引号的字符串键会被转义为
\'(反斜杠) ,而这些 backend 会将其视为字面反斜杠,而不是转义序列,从而允许将任意 SQL 注入到字典 lookup 查询中。现在,ExternalQueryBuilder会为这些 backend 生成符合 SQL 标准的''转义;ClickHouse 和 MySQL 字典源则继续使用反斜杠转义。#104009 (Shaohua Wang) 。 - 修复了聚合中的潜在类型不匹配问题;当列类型在 LowCardinality 与非 LowCardinality 之间变更,且 min-max projection 未重建时,就可能出现该问题。#104013 (Nikita Taranov) 。
- 修复了因合并 expression 时未传递“防止移除未使用列”的标记而导致的查询优化无限循环问题。#104083 (János Benjamin Antal) 。
- 修复了批量重命名流式表 (S3Queue、Kafka、RabbitMQ) 时,
StreamingStorageRegistry::renameTable中出现的LOGICAL_ERROR:改为使用基于 UUID 的 identity 跟踪,而不是基于名称的跟踪。#104101 (Nikita Taranov) 。 - 修复了以下场景下的错误结果:由
UNION ALL构造的 CTE 包含一个SELECT DISTINCT分支,而外层查询只投影该 CTE 的部分列。新的 analyzer 中的RemoveUnusedProjectionColumnsPass错误地从内部DISTINCTprojection 中移除了未被引用的列,导致原本应保持 distinct 的行 (投影列值相同,但被删除列值不同) 被合并成一行。#104114 (Groene AI) 。 - 修复了设置
optimize_inverse_dictionary_lookup中多个边界场景下的正确性问题;在这些情况下,该优化可能会悄然丢弃行或抑制异常。关闭 #103270。关闭 #103085。#104133 (Nihal Z. Miaji) 。 - 修复了反序列化
quantileTiming状态时发生的越界写入问题。#104141 (Alexey Milovidov) 。 - 修复了将越界的
Float64值转换为宽整数类型 (UInt64、Int64、Int128、UInt128、Int256、UInt256) 时的未定义行为。此前,等于Float64(numeric_limits<T>::max())的值 (会向上舍入到一个超过实际最大值的值) 会绕过边界检查,并在后续类型转换中产生 UB。这会影响聚合函数参数解析 (topK、histogram、uniqUpTo、groupArrayInsertAt等) 以及通过SET <setting> = <Float64>设置的整数类型配置项。关闭 #103817。#104154 (Groene AI) 。 - 修复了将嵌套的
Tuple(Tuple(Nullable(...)))(或更深层嵌套) 与String字面量比较时出现的LOGICAL_ERROR异常:“Unexpected return type from comparison. ExpectedUInt8. GotConst(Nullable(UInt8))”。现在,比较结果的返回类型会被正确推断为Nullable(UInt8),与运行时行为一致。#104171 (Groene AI). - 修复了在
query_plan_optimize_lazy_final = 1时,执行SELECT ... FROM <ReplacingMergeTree(version, is_deleted)> FINAL PREWHERE is_deleted = <expr> AND <other column expr>会导致 server 中止的问题 (UndefinedBehaviorSanitizer: reference binding to null pointer,并在 release 构建中发生 segfault) 。lazy-FINAL 的非相交读取步骤丢失了输出头信息中的is_deleted列,因为 prewhere 将其作为输入消耗后,没有重新将其作为输出暴露出来。随后,下游的addIsDeletedFilter步骤解引用了一个空的ActionsDAG::Node指针。#104177 (Groene AI). - 修复了调用 system.failpoints 表时会使用一个 failpoint,从而可能将其禁用的问题。#104237 (Pedro Ferreira).
- 修复了当输入包含一个恰好在缓冲区边界结束的 UTF-8 字符时,
detectLanguage*函数中的MemorySanitizer: use-of-uninitialized-value问题。#104257 (Raúl Marín). - 修复了一个逻辑错误 (
Bad cast from type DB::CachedObjectStorage to DB::S3ObjectStorage) :当对底层对象存储被文件系统缓存等装饰器包装的 disk 使用SETTINGS disk = '...'调用数据湖表函数和引擎 (icebergS3、deltaLakeS3等) 时,该错误会中止参数解析。关闭 #89300。#104258 (Groene AI). - 修复了对名为
values的列使用带括号的下标表达式时的解析问题,例如(values['a']),使其不再被解释为 SQL 标准的VALUES表表达式。#104312 (Desel72). - 修复了文件系统缓存后台逐出线程 (
SLRUFileCachePriority::collectEvictionInfo) 中的 server 中止/LOGICAL_ERROR:当keep_free_space_size_ratio或keep_free_space_elements_ratio足够高,以至于在所有缓存条目都已提升到 SLRU protected queue (probationary 为空) 时触发逐出,就可能出现该问题。#104313 (Groene AI). - 修复了将 projections 与 UNION ALL 视图、窗口函数或别名列名冲突一起使用时出现的异常 (
NOT_FOUND_COLUMN_IN_BLOCK、LOGICAL_ERROR、AMBIGUOUS_COLUMN_NAME) 。这是由 #88798 引入的回归问题。#104317 (Amos Bird). - 修复了解析 Postgres 数组时可能出现的 underflow 问题。#104322 (Grant Holly).
- 返回非
Nullable类型 (如Array、Tuple或Map) 的函数现在也支持Nullable参数。受影响的函数包括extractAll、extractAllGroups、extractAllGroupsHorizontal、extractAllGroupsVertical、extractGroups、splitByChar、splitByString、splitByRegexp、splitByWhitespace、splitByNonAlpha和alphaTokens。对于NULL输入行,现在会返回结果类型的默认值 (例如空数组) ,而不是抛出 “Nested type is not allowed inside Nullable type”。#104326 (Alexey Milovidov). - 修复了带分区的 Iceberg 表的统计信息问题。此更改关闭了 #104321。#104329 (Konstantin Vedernikov).
- 修复了 macOS (以及类似的 jemalloc 构建) 上 server 启动时的一个致命 logical error:由于可选的
background_thread/max_background_threadsmallctl 不存在,Jemalloc::verifySetup会错误报告jemalloc_enable_background_threads不匹配;现在,如果这些 mallctl 不可用,则会跳过校验,且getValue在失败时也不再让输出保持未初始化状态。关闭了 #102183。#104330 (SAYON DEEP). - 修复了一个正确性回归问题:带有
max_rows_to_read_leaf和read_overflow_mode_leaf = 'throw'的SELECT查询,即使跳过索引本可将读取量降到叶子节点上限以下,也可能错误抛出TOO_MANY_ROWS。对应的非叶子节点设置 (max_rows_to_read/read_overflow_mode) 此前已正确处理。#104331 (Groene AI). toUUID、toUUIDOrNull、toUUIDOrZero、toUUIDOrDefault、到UUID和Nullable(UUID)的CAST、到UUID的accurateCastOrNull,以及从文本解析 UUID 的输入格式 (Avro、MsgPack、JSONExtract等) 现在会拒绝长度正确但包含非十六进制字符的字符串。此前,这类输入会因为越过十六进制数字查找表末尾而被静默转换为伪造的 UUID;现在toUUID会抛出CANNOT_PARSE_UUID,而Or*变体会返回NULL/ 零 UUID / 提供的默认值。#104370 (Groene AI).- 修复了
caseWithExpression(以及 SQLCASE expr WHEN ... THEN ... ELSE ...) 中的Bad castLOGICAL_ERROR:当仅 THEN 分支的 supertype 与 (THEN + ELSE) 的 supertype 落在不同的ColumnDecimal存储中时,会触发该问题——例如 THEN 值为(UInt16, Int8),而 ELSE 为Decimal(9, 2)。关闭了 #104335。#104378 (Groene AI). - 通过
logExceptionBeforeStart报告的内部故障 (asynchronous insert 刷写、materialized-view 刷新、内部查询期间抛出的解析错误) 现在会正确增加FailedInternalQuery、FailedInternalSelectQuery和FailedInternalInsertQuery这几个 ProfileEvents,同时也会增加用户可见的FailedQuery、FailedSelectQuery和FailedInsertQuery计数器。此前,这些内部计数器对于在查询执行开始前发生的故障始终保持为零,导致一大类内部故障被少计。#104399 (Groene AI). - 修复了在
BACKUP或RESTORE语句的base_backupsetting 中使用查询参数时抛出的Code: 36. BAD_ARGUMENTS Expected literal, got {name:Type}错误 (例如BACKUP ... SETTINGS base_backup = S3({backup_name:String}, ...)) 。该回归问题由 PR #99205 在26.1.5中引入。关闭 #103324。#104413 (Groene AI). - 修复了
IcebergLocal/IcebergS3写入时的 server 中止问题:当执行ALTER TABLE ... DROP COLUMN后,再执行一个iceberg_metadata_staleness_ms大于 0 的INSERT时会触发该问题。现在ALTER会使本地 Iceberg 元数据文件缓存失效,因此后续读写都能看到新的 schema。#104419 (Groene AI). - 修复了
DROP ROLE、DROP USER、DROP SETTINGS PROFILE、DROP ROW POLICY、DROP QUOTA和DROP MASKING POLICY,使其在删除某个 entity 时,也会从所有引用该 entity 的其他 access entity 中移除相关引用 (例如用户的DEFAULT ROLE列表、settings profile 的TO列表、row policy 的 grantees) ,并将清理结果持久化到 disk。此前SHOW CREATE会过滤未知 UUID,因此内存状态看起来是正确的;但磁盘上的.sql文件仍保留了悬空的ID('<dropped-uuid>')条目,这些引用会在下次 server 重启时重新出现,并在 distributed query execution 期间表现为ACCESS_ENTITY_NOT_FOUND错误。#104427 (Groene AI). - 修复了
azureBlobStorage、AzureBlobStorage-engine 以及 Azure 上的 DeltaLake 在使用 connection string 时可能触发的 server 中止问题:当其中BlobEndpointURL 的端口为空、非数字或超出范围时 (例如BlobEndpoint=http://host:abc/) ,就会出现该问题。现在 server 会返回明确的BAD_ARGUMENTS错误,而不再在 debug/sanitizer 构建中中止。#104460 (Groene AI). - 允许在
remote和remoteSecuretable functions 中使用未加引号的标识符作为用户名,这与 database 和 table arguments 接受未加引号标识符的方式一致。此前,这类查询会因一条误导性的身份验证错误而失败,并错误地指向default用户。#104465 (Alexey Milovidov). - 修复了当 SQL 用户自定义函数的函数体中包含带括号的内部
UNION ALL时触发的Logical error: Incorrect ASTSelectWithUnionQuery (modes: M, selects: N)(例如CREATE FUNCTION f AS x -> (SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1))) 。#104477 (Groene AI). - 修复了
uniqThetaIntersect的问题:当第二个 argument 为空uniqTheta状态时,它会返回第一个 argument 的 cardinality,而不是0——例如uniqThetaMergeStateIf(s, predicate)的结果,其中 predicate 会排除所有行。#104529 (Groene AI). - 修复了
SHOW TABLES和system.tables在列出由 Iceberg REST 目录 (iceberg-rest、onelake、biglake) 支持的DataLakeCatalog数据库时静默截断列表的问题。当目录 server 对 list-tables 或 list-namespaces 响应进行分页时 (例如 Microsoft Fabric / OneLake 中每个命名空间超过约 50 张表时) ,后续页面中的表在SHOW TABLES和system.tables中会静默消失,尽管仍可通过直接SELECT查询。RestCatalog现在会遵循 Iceberg REST OpenAPI 规范中定义的next-page-token延续标记,与PaimonRestCatalog和UnityCatalog的现有行为保持一致。#104531 (Groene AI). inputtable function 现在会在外围INSERT查询的FORMATclause 使用固定 schema 的 format (如LineAsString、RawBLOB、JSONAsString等) 时,从该子句推断其结构,因此用户不再需要为这些 format 重复写出input('line String')这样的结构定义。#104532. #104533 (Groene AI).- 将 Iceberg history 中字段的数据类型从
Int32更新为Int64。关闭 #94176。#104579 (Smita Kulkarni). - 修复了解析函数调用时 (当逗号后跟着 lambda 时) 出现的
Inconsistent AST formattingLOGICAL_ERROR,例如SELECT substring(x, `x` -> `x`)。parser 过去会静默地把前面的 arguments 合并到 lambda 的左侧,生成单参数调用,导致无法重新解析回相同的 AST。现在会保留函数原始的参数个数。#104626 (Groene AI). - 当未给出 database 限定符时,
CHECK TABLE t现在会优先选择同名的TEMPORARY表,而不是永久表,这与SHOW CREATE TABLE、DESCRIBE TABLE、OPTIMIZE TABLE和ALTER TABLE已采用的优先级规则一致。此前CHECK TABLE t会完全跳过 temporary tables,因此即使这些引擎支持CHECK,对 temporary日志或File 表引擎表执行时仍会因UNKNOWN_TABLE而失败。这是对 #100966 的后续修复。#104637 (Groene AI). - 修复了当向未配置
<placement>的 Keeper 发送带有quorum_reads=true的get /keeper/availability_zone时,Keeper 终止并进入重启循环的问题。#104663 (myeongjun). - 修复了
FutureSetFromTuple::buildOrderedSetInplace中会导致 logical error 的 TOCTOU data race。#104673 (Miсhael Stetsyuk). - 修复了若干函数对相同输入会因 arguments 以列或常量形式传入而返回不同结果的问题:
bitRotateLeft/bitRotateRight(边界移位计数) 、length(FixedString)/concatWithSeparator配合LowCardinality(Nullable)输入、作用于 NaN 的roundDown,以及作用于无效 UTF-8 的rightUTF8。#104710 (Raúl Marín). - 修复了当最频繁的值是列默认值且数据分布在多个
MergeTreeparts 中时,anyHeavy会返回非 heavy 值的问题 (稀疏列读取路径) 。#104712 (Raúl Marín). - 修复设置约束处理中的多个缺陷:声明在设置规范名称上的
MergeTreeSettings约束,可通过写入该设置的别名来绕过;此外,disallowed_values约束检查在 clamp 路径 (次级查询、ON CLUSTER工作线程、SQL SECURITY DEFINER视图) 上会抛出异常,而不是静默丢弃该更改。#104737 (Raúl Marín) 。 - 修复了惰性附加的
Iceberg/IcebergLocal/DeltaLake/Hudi表在执行OPTIMIZE TABLE、ALTER TABLE ... DELETE、ALTER TABLE ... ADD COLUMN及其他 ALTER 变体时触发的LOGICAL_ERROR异常 (Metadata is not initialized) :当时 metadata 尚未加载 (常见于 server 重启后,或之前 metadata 写入失败并在磁盘上留下损坏的 metadata 文件之后) 。现在,如果 metadata 成功加载,操作会正常继续;如果加载失败,则会将底层加载失败作为常规的用户可见异常抛出,而不再在 debug / sanitizer 构建中导致 server 中止。#104738 (Groene AI) 。 - 修复
AvroConfluentRowInputFormat中 use-after-free 缺陷导致的 segfault。#104751 (Miсhael Stetsyuk) 。 numericIndexedVectorPointwiseMultiply、numericIndexedVectorPointwiseDivide、numericIndexedVectorPointwiseEqual和numericIndexedVectorPointwiseNotEqual的标量变体现在会在传入大于Int64::max的UInt64标量时抛出INCORRECT_DATA。#104784 (FriendLey) 。- 修复一个问题:应用
compatibility设置后,如果通过别名手动覆盖某个设置 (例如使用SET enable_analyzer = 1而不是SET allow_experimental_analyzer = 1) ,则后续再修改compatibility设置时,可能会把该覆盖还原掉。#104829 (Raúl Marín) 。 - 修复在 https://github.com/ClickHouse/ClickHouse/commit/0e8ad4355c9d 之后 AWS 日志记录器被禁用的问题。#104837 (Konstantin Bogdanov) 。
- 修复另外三个函数的问题:同样的输入,结果会因 argument 是以列还是常量形式传入而不同:默认值为常量
Date/Date32/Enum/FixedString的transform(以及经由它调用的caseWithExpression) 、String与常量FixedString之间的比较运算符,以及条件为常量时带有FixedString分支的if/ifNull/nullIf。#104858 (Raúl Marín) 。 - 修复
MergeTree表在执行分区裁剪时出现的Bad cast from type DB::ColumnConst to DB::ColumnNullableserver 中止问题;当分区表达式中包含会折叠为单个常量值的函数事件链时,就会触发该问题 (例如floor(NULL, toRelativeYearNum(...))) 。#104861 (Groene AI) 。 - 修复
ContextData复制构造函数中的一个ThreadSanitizerdata race:复制table_function_results时未获取table_function_results_mutex,因此并发的Context::executeTableFunction写入可能会与复制构造函数中未同步的读取发生竞争。#104879 (Groene AI) 。 - 修复对具有动态结构的类型进行数据分区片段一致性检查的问题,并可检测损坏的 columns_substreams.txt。这是对 https://github.com/ClickHouse/ClickHouse/pull/103858 的重新提交,包含额外更改。#104888 (Pavel Kruglov) 。
- 修复了 DatabaseCatalog 中
DROP与UNDROP之间的竞态问题。#104915 (Azat Khuzhin). - 修复了文件系统缓存动态调整大小时对部分已下载分段的处理问题,包括在驱逐失败后恢复相关统计计数。#104921 (Antonio Andelic).
- 现在,对 temporary table 执行
DETACH TABLE(不带TEMPORARY关键字) 时,会正确抛出SYNTAX_ERROR,与DETACH TEMPORARY TABLE的行为一致。此前,它会静默设置内部is_detached标志并直接返回,不报错。要删除 temporary table,请使用DROP TEMPORARY TABLE或DROP TABLE(后者会通过Context::ResolveExternal解析该 temporary table) 。关闭 #103475。#104943 (Groene AI). - 使
filesystemtable function 在加载文件内容时遵守max_memory_usage/max_server_memory_usage限制。此前,读取大型内容或进行大量并行内容读取时,可能会在未抛出MEMORY_LIMIT_EXCEEDED的情况下突破限制,最终被 OOM 杀死。#104956 (Alexey Milovidov). - 修复了按
uuid过滤system.detached_tables时抛出的LOGICAL_ERROR(例如SELECT count() FROM system.detached_tables WHERE uuid = '...') 。现在,该查询会返回预期结果,而不是导致 server 中止。#104979 (Groene AI). - 对嵌套结构仅包含空
Tuple()叶子的 tuple 调用flattenTuple时,不再抛出LOGICAL_ERROR(例如Tuple(c0 Array(Tuple()))或Tuple(c0 Tuple())) 。现在,这类输入会产生面向用户的ILLEGAL_TYPE_OF_ARGUMENT异常,明确说明展平结果将是一个空 tuple。#104989 (Groene AI). - 修复了在使用
GROUP BY查询loop(remote(...))(或任何包装了可延迟 aggregation 的存储的loop()) 时,会导致 server 中止以及静默返回错误结果的问题。外层 planner 之前会根据内层存储报告的 processing stage 添加MergingAggregatedStep,但LoopSource总是以QueryProcessingStage::Complete物化其内部 select,并输出普通列 chunks,因此在enable_parallel_replicas = 1时,MergingAggregatedTransform会触发LOGICAL_ERROR(Chunk info was not set for chunk in MergingAggregatedTransform) ;在其他情况下,则会静默丢弃外层 aggregation。#105001 (Groene AI). clickhouse-benchmark --reconnect(裸用、不带值) 在 25.4 中因某项变更而被意外破坏:该变更将--reconnect改成了整数选项,必须提供值。现在,裸用形式已再次可用,并且等价于--reconnect=1(每个查询都重新连接) 。#105006 (Groene AI).- 修复了列名以不完整 UTF-8 序列结尾时导致 JSON 输出格式错误的问题。#105012 (Pablo Marcos).
- 修复了对 materialized view 的 source table 执行
EXCHANGE TABLES或CREATE OR REPLACE TABLE后出现的静默数据丢失问题。现在,MV的 source-view dependency edge 会保留在原始名称上,因此仍会在 inserts 时触发。该回归由 #98779 引入;现已恢复到回归前的行为。#105029 (Sema Checherinda). - 修复在 JIT 编译将
Float转换为UInt128的表达式时出现的CANNOT_COMPILE_CODE Could not find symbol __fixunsdfti问题,例如toUInt128(<Float64 expression>)。原因是 JIT 符号解析器中缺少用于无符号 128 位浮点转整数的 compiler-rt builtin 符号。关闭 #105031。#105048 (Raúl Marín)。 - 修复在设置
send_logs_level时,clickhouse-local不输出失败查询日志消息的问题。#105067 (Alexey Milovidov)。 - 修复同一 parameterized view 在同一个查询中以不同 argument values 被多次引用时结果不正确的问题。此前,analyzer 会将这些调用折叠成一个,静默丢弃除第一个过滤器外的所有过滤器。#105170 (Alexey Milovidov)。
- 修复
play.htmlweb UI 中,TOTALS行在结果表底部被渲染两次的问题。#103803 (Alexey Milovidov)。 - 在向量搜索期间拒绝非有限向量 (
NaN、±Inf) (无论是待搜索向量还是参考向量) ;此前它们会导致usearch中出现未定义行为。#104079 (Groene AI)。 - PromQL:修复空向量上的 aggregation 运算符问题。#104425 (Vitaly Baranov)。
- PromQL:修复 Prometheus 查询 API 中的错误处理问题。#104741 (Vitaly Baranov)。
- 修复
MergeTreeTransaction::afterCommit中的一个竞态问题:如果在将提交CSN写入 ZooKeeper 后、事务完成前 connection 丢失,COMMIT响应可能会在新的creation_csn/removal_csn出现在system.parts中之前先到达 client。#104708 (Tuan Pham Anh)。 - 修复 KQL parser 在转换嵌套数组索引 (
arr[arr[arr[...]]]) 时内存呈指数级增长的问题。#105142 (Alexey Milovidov)。 - 修复
RIGHT ANY JOIN在右表每个键对应多行,且输出块因大小限制被拆分时结果不正确的问题。关闭 #99431。#102064 (Vladimir Cherkasov)。 - 在嵌套类型反序列化期间,为
Avro读取器增加栈溢出检查。#102417 (Pavel Kruglov)。 - 修复
MergeTreesettings 的system.completions中出现重复行的问题——每个 setting 名称都会出现两次,因为虽然两者的设置名称相同,getMergeTreeSettings和getReplicatedMergeTreeSettings的结果仍都被转储了。关闭 #102013。#102015 (Groene AI)。 - 修复
StorageObjectStorageQueue(S3Queue、AzureQueue) 在关闭时被阻塞的问题:此前必须等对象存储中部分已处理文件被完整读取后才能关闭。现在源会在关闭时立即中止读取;借助去重机制,关闭前已流式写入目标表的行,在下次启动重试该文件时不会重复。#103126 (Tuan Pham Anh) 。 - 修复对
Alias表引擎使用insert_deduplication_token进行多块插入时只保留部分块的问题,现在会保留所有块。#103246 (Enric Calabuig) 。 - 修复原生
JSON列上的JSONHas和JSONExtractBool返回提取出的值 (转换为UInt8) 而不是0/1的问题。#103313 (zxuhan7) 。 - 修复
CustomSeparated输入格式在面对省略format_custom_row_after_delimiter的畸形或恶意数据时防护不足的问题。此前,标头检测、schema 推断以及可变列数的行会无限制累积字段,并可能在失败前分配数 GB 内存。现在,只要单行包含超过 1,000,000 个字段,读取就会以INCORRECT_DATA失败。#103404 (Groene AI) 。 - 修复复制
MergeTree表执行RESTORE时的问题:恢复后的数据分片附加操作现在使用backup_restore_keeper_max_retries,而不是常规插入的 Keeper 重试次数预算。#104610 (Pablo Marcos) 。 - 修复
MergeTree表上WHERE p AND <LowCardinality(Nullable(int)) constant>返回错误结果的问题。此前,这类查询会返回零行,因为分片裁剪会从LowCardinality(Nullable(...))类型推导出默认NULL,并构造出notEquals(x, NULL)保护条件,从而裁掉所有分片。#104767 (Groene AI) 。 - 修复按某列的非单射函数分组且该列同时又是分区键时,聚合结果错误的问题 (例如
PARTITION BY a且GROUP BY intDiv(a, 2)或a % 2) 。此前,来自不同分区但映射到同一分组的值不会被合并,导致在allow_aggregate_partitions_independently = 1下出现重复的分组行。#104869 (Nihal Z. Miaji) 。 - 修复
Keeper快照传输中的竞态问题:在向正在恢复的 follower 发送快照时,快照可能被删除或移动。#104941 (Antonio Andelic) 。 - 修复
hilbertEncode和mortonEncode中一个静默产生错误结果的问题:当第一个参数 (范围掩码) 是非常量Tuple时,每一行的位移计算都会错误地使用第 0 行的值。现在,这些函数会按行计算掩码值,因此结果不再依赖输入是否为常量,也不再依赖块大小。#104992 (Groene AI) 。 - 修复
clickhouse-local在从./clickhouse-local.xml、~/.clickhouse-local/config.xml或/etc/clickhouse-local/config.xml自动发现配置文件时,会静默忽略用户级配置 (profiles、users、quotas、访问控制设置) 的问题。此前,只有传入--config-file或当前目录存在./config.xml时,这些设置才会生效;现在所有发现路径的行为都已保持一致。#105008 (Groene AI) 。 - 修复了
BFloat16列与字符串字面量比较时静默返回零匹配的问题 (例如WHERE bf16_col = '49.9') 。#105042 (Raúl Marín). - 修复了
SummingMergeTree、AggregatingMergeTree和CoalescingMergeTree在合并过程中处理CLEAR COLUMN和 TTL 时的问题:当合并所需的列缺失或已过期时会出错。已关闭 #101953。#105203 (Antonio Andelic). - 通过在解引用
shared->clusters_config前添加显式空值检查,修复了DNSCacheUpdater::run与Context::reloadClusterConfig之间的竞态问题。#105220 (Mikhail f. Shiryaev). - 修复了
toDateTime64在ms和ns精度下的best_effort日期时间解析问题。#105233 (Kaviraj Kanagaraj). - 修复了
OSIOWaitMicroseconds错误地上报线程生命周期的 I/O 等待时间,而不是每次查询的 I/O 等待时间的问题。#105246 (Mikhail f. Shiryaev). Hudi表引擎现在在表目录中的 Parquet 文件不符合 Hudi[FileId]_[FileWriteToken]_[Timestamp].[extension]命名约定时,会抛出INCORRECT_DATA(普通的查询级异常) ,而不是LOGICAL_ERROR。此前,这类文件名会在调试构建中触发异常。#105266 (Groene AI).- 修复了
ParallelFormattingOutputFormat在调度失败时的死锁问题:当scheduleFormatterThreadForUnitWithNumber抛出异常时 (例如CANNOT_SCHEDULE_TASK) ,该单元会停留在READY_TO_FORMAT状态,且没有格式化线程继续处理,最终导致挂起。现在,调度调用已包装在try/catch中,任何失败都会通过onBackgroundException处理,从而让收集器正常退出。#105275 (Azat Khuzhin). - 修复了
Distributed异步插入在异常关闭后恢复时发生的静默数据丢失问题:如果保存的批次中最后一个.bin文件完好,但中间某个文件已损坏,DistributedAsyncInsertBatch::recoverBatch过去只会校验最后一个文件的文件头,随后sendBatch会将整个批次——包括完好的文件——都标记为损坏,导致其中的行丢失。现在会逐个校验每个文件的文件头,因此只有实际损坏的文件会被移到broken/,其余未损坏的行会发送到远程分片。#105281 (Groene AI). - 修复了
clickhouse extract-from-config --try中的一个回归问题:当配置使用from_env属性且没有include_from元素 (或该元素指向不存在的文件) 时,所有from_env替换都会被静默丢弃并返回空字符串。这破坏了 26.2.5 中 Docker 入口点的端口发现。已关闭 #101704。#105283 (Groene AI). - 修复了向
SQLite表执行INSERT INTO时因 SQLite 语法错误而失败的问题:当插入值为Enum、JSON或AggregateFunction,且其文本表示中包含单引号时,就会触发该问题。现在,相应的序列化也会遵循output_format_values_escape_quote_with_quote设置 (此前只有String和FixedString支持该设置) 。#105285 (Groene AI). - 修复了这样一个问题:在
allow_push_predicate_ast_for_distributed_subqueries = 1(默认值) 时,如果GLOBAL IN元组与一个投影中包含重复列名的子查询匹配,例如(x, y) GLOBAL IN (SELECT number, number FROM numbers(5)),分布式查询会抛出Code: 44. ILLEGAL_COLUMN: Cannot add column ...: column with this name already exists。#105290 (Groene AI) 。 - 修复了
reinterpret应用于Array(LowCardinality(...))时在运行时返回令人困惑的NOT_IMPLEMENTED错误的问题;现在会在类型检查阶段返回ILLEGAL_TYPE_OF_ARGUMENT。#105301 (Raúl Marín) 。 minMap/maxMap(数组形式) 和minMappedArrays/maxMappedArrays现在对NaN的处理与ORDER BY一致:NaN被视为排在最后 (仅当所有值都是NaN时才会返回) 。此前,由于 IEEE 754 的无序比较语义,结果会受NaN在数据中位置的影响,并且与已在 #100448 中修复的minMap/maxMap的Map参数形式不一致。#105331 (Raúl Marín) 。- 修复了带有
Nested列的MergeTree家族表中按表划分的ColumnsDescription缓存内存泄漏问题。在share_nested_offsets = 1(默认值) 时,条目在经历ALTER ADD COLUMN/DROP COLUMN循环后也从未被淘汰。#105376 (Groene AI) 。 - 修复了这样一个问题:当带有
TYPE set(N)跳过索引的SELECT包含一个结果类型为Float、BFloat16或其他任意非整数类型的WHERE原子表达式时 (例如WHERE c0 + 0.1或WHERE log(c0)) ,会抛出BAD_ARGUMENTS异常 “It’s a bug! Only integer types are supported by__bitWrapperFunc”。现在在这种情况下,跳过索引会回退到常规过滤路径。#105384 (Groene AI) 。
构建/测试/打包改进
- 停止使用系统
compiler-rt库和头文件。关闭 #91475。#102857 (Konstantin Bogdanov). - 更新 distroless Docker 基础镜像,以修复
libssl3t64中的 OpenSSL CVE。#103583 (Rahul Nair). - 在发布过程中,通过串联多个 Ubuntu 密钥服务器来可靠获取 GPG 密钥,避免在
keyserver.ubuntu.com上超时。#103834 (Mikhail f. Shiryaev). - 移除并禁止构建时的
CMake检查 (check_*、try_compile、try_run) 。由于编译器和工具链是固定的,因此没有必要在配置阶段进行功能检测;现在项目范围内已全面禁止此类做法,任何与特定版本相关的行为都必须显式以CMAKE_CXX_COMPILER_VERSION为条件控制。#103980 (Alexey Milovidov). - 将
libarchive从 3.8.6 升级到 3.8.7。#104047 (Robert Schulze). - 将
mongo-c-driver更新到 2.3.0。#104300 (Raúl Marín). - 为 22.x 更新 LLVM 依赖项。#104381 (Joshua Carp).
- 通过使用可移植的 POSIX
posix_openpt/grantpt/unlockpt,并移除仅限 Linux 的#if保护,使 embedded-client 和 PTY 描述符类能够在 macOS 和 FreeBSD 上构建。#104436 (Alexey Milovidov). - 将
librdkafka升级到 2.14.1 版本。#105222 (János Benjamin Antal).
向后不兼容的变更
IN运算符现在对Bool类型采用精确值语义:集合中只有0和1才会与Bool值匹配。此前,与Bool比较时,IN集合中大于255的数值会被错误地钳制为 true,因此SELECT CAST(1, 'Bool') IN (256)会返回 1。现在它会正确返回0。关闭了 #92980。#93115 (Ashrith Bandla) 。- H3 库已更新到 v4,这提高了长度、面积等度量计算的精度。此更改不向后兼容,因为新结果与之前不同。#100348 (Alexey Milovidov) 。
- 不再允许在
WITH表达式列表元素中将SELECT用作裸标识符。#101059 (Aruj Bansal) 。 - 此补丁更改了 Merge 表处理虚拟列的方式。如果底层表包含
_table或_database,则会从存储中读取这些列;否则,这些列会在读取步骤之后通过表达式步骤填充。#101742 (Mikhail Artemenko) 。 IN运算符现在也会拒绝复合类型 (Tuple、Array、Map) 内部发生的有损Decimal转换,使其行为与顶层标量比较保持一致。此前,精度检查仅对顶层标量值生效:例如,CAST('33.3', 'Decimal64(1)') IN (33.33)会正确返回0,但CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33])会错误地返回1,因为有损转换发生在Array内部。现在这两种情况都会正确返回0。#101812 (Nihal Z. Miaji) 。- 将默认
http_max_fields从 1,000,000 下调到 1,000,并将http_max_field_name_size从 128 KB 下调到 4 KB,以限制 HTTP 连接在身份验证前的内存占用。新增了http_max_request_header_size和http_headers_read_timeout设置。依赖此前较高限制的用户可通过设置将其恢复。#103285 (Sema Checherinda) 。
新特性
- 新增自动落盘机制:达到内存限制时,哈希 join 和并行哈希 join 会自动转换为 grace hash join。此行为由
max_bytes_before_external_join控制。#97813 (János Benjamin Antal) 。 - 新增对 Arrow Flight SQL 的支持。#91170 (Yakov Olkhovskiy) 。
- 为
Paimon表引擎新增增量读取支持,使用 Keeper 支持的快照进度跟踪机制,包括通过paimon_target_snapshot_id定向读取快照增量,并扩展类型映射、分区裁剪和增量读取场景的测试覆盖范围。#93655 (XiaoBinMu). stem函数现已不再处于 Experimental 状态 (此前必须启用allow_experimental_nlp_functions设置) 。#102399 (Jimmy Aguilar Mena) 。现在,您可以使用stem函数,轻松对String、FixedString、Array([Fixed]String)、Nullable、LowCardinality和Const列中的所有单词/标记进行词干提取。#99137 (Jimmy Aguilar Mena) 。- 在兼容性设置
use_strict_insert_block_limits下,为max_insert_block_size_rows、max_insert_block_size_bytes、min_insert_block_size_rows、min_insert_block_size_bytes引入了 squashing 过程中的新行为。#94207 (Kirill Kopnev) 。 - 新增函数
arrayAutocorrelation(arr [, max_lag]),用于计算数值数组在各个滞后值下的归一化自相关。支持整数、Float 和 Decimal 数组类型。#94776 (Wenyu Chen) 。 - 新增 SQL 函数
obfuscateQuery。关闭 #98010。#98305 (Xuewei Wang) 。 - 新增支持将 Map 和 JSON/Object 类型用作字典属性。现在,字典可在 FLAT 和 HASHED 布局中存储和读取复杂类型,包括 Map(String, String)、Map(String, Array(String))、JSON 和 Nullable(JSON)。#98627 (yanglongwei).
- 新增了两个新的 MergeTree 设置——
replicated_fetches_min_part_level和replicated_fetches_min_part_level_timeout_seconds——允许副本跳过从其他副本拉取新近插入的 (未合并的) parts,从而在高负载摄取期间降低复制开销。#98625 (tanner-bruce). - 为使用 JSONAllPaths 且采用 bloom_filter、tokenbf_v1、ngrambf_v1 和 text (倒排) 索引类型的 JSON 列新增 MergeTree 跳过索引支持,从而能够根据每个粒度中存在的 JSON 路径集合跳过相应粒度。#98886 (Pavel Kruglov).
printf函数现已支持非常量格式字符串,因此可根据列值为每一行使用不同的格式模板。#98991 (Yash ).- 新增一个名为
commit_order的投影索引,用于按插入顺序重组数据。#99004 (Mikhail Artemenko) 。 - 新增
highlight函数,可将文本字符串中出现的搜索词用 HTML 标签包裹起来 (默认为<em>/</em>) 。支持 ASCII 不区分大小写匹配、自动合并重叠的匹配项,以及自定义开始/结束标签。#99131 (Peng). - 通过按归一化查询哈希实施配额,保护公网 ClickHouse 服务免遭滥用。1. 支持将
NORMALIZED_QUERY_HASH用作配额键类型——为每个唯一的归一化查询单独划分配额桶,因此CREATE QUOTA q KEYED BY normalized_query_hash会分别跟踪每条不同的查询。2. 支持将QUERIES_PER_NORMALIZED_HASH用作配额资源类型——限制在一个时间间隔内任意单条归一化查询的最大执行次数,因此MAX queries_per_normalized_hash = 100可防止任何单一查询模式的运行次数超过 100 次。#99586 (Alexey Milovidov). - 现在,用户可以使用
NATURAL JOIN语法编写 join 查询,该语法会自动基于所有同名列进行匹配,并在结果中对这些列去重。#99840 (Peter Nguyen). - 支持将
SET TIME ZONE 'tz'用作SET session_timezone的别名。#99883 (phulv94). - 在 Web UI (
play.html) 中新增了对参数化查询的支持:系统会检测诸如{name:Type}这样的查询参数,并显示可用于填写其值的输入字段。#100041 (Alexey Milovidov) 。 - 支持在
FROM中将 SQL 标准VALUES子句作为表表达式使用,例如SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(id, val)。#100143 (Desel72). - 为
EXTRACToperator 新增与 PostgreSQL 兼容的单位:EPOCH、DOW、DOY、ISODOW、ISOYEAR、WEEK、CENTURY、DECADE、MILLENNIUM。同时修复了此前会报错的EXTRACT(WEEK FROM date)。#100274 (Alexey Milovidov). - 新增了对带有
TO范围限定符的 SQL 标准复合时间间隔字面量的支持,例如INTERVAL '1:30' HOUR TO MINUTE。在内部,它会被分解为多个时间间隔之和。#100453 (Desel72). - 为 HTTP 连接池套接字的内核 TCP 接收和发送缓冲区内存 (
sk_rmem_alloc,sk_wmem_alloc) 新增异步指标,并按每个连接组以 p50/p75/p90/p95 分位数和总量形式上报。#100575 (Sema Checherinda). - 为 ClickHouse Keeper 新增了 jemalloc profiling web UI,可通过 HTTP 控制端口上的
/jemalloc访问。 #100606 (murphy-4o). - 新增命令
SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x',适用于 ordered 模式和 unordered 模式。#100709 (Bharat Nallan) 。 - 新增函数
JSONAllValues,可将JSON列中的所有值以Array(String)形式返回;这些值会按路径名称排序,并以文本形式序列化。新增对JSON列上JSONAllValues表达式的文本索引支持。当在JSONAllValues(json_column)上创建文本索引时,该索引会自动用于过滤针对JSON子列的查询 (例如json_column.key1 = 'value') 。#100730 (Anton Popov). - 新增设置
input_format_column_name_matching_mode,允许为输入格式采用不同的大小写匹配方式。#99346 (manerone) 。 - 为
clickhouse-keeper-client新增watch命令,并为get、exists和ls命令添加 watch 支持。 #100834 (Den Kalantaevskii). - 为 ClickHouse Keeper 新增了
getChildrenRecursive(ListRecursive) 请求,并为clickhouse-keeper-client新增了lsr命令。此更改关闭了 #99916。#100998 (Konstantin Vedernikov) 。 - 新增函数
arrayTranspose,可接受二维数组 (矩阵) 并对其进行转置:SELECT arrayTranspose([[1, 2, 3], [4, 5, 6]])。#101214 (Vitaly Baranov) 。 auto_statistics_types mergetree设置的默认值为'minmax, uniq'—— 系统会为新表中所有合适的列自动创建 minmax 和 uniq 统计信息 -materialize_statistics_on_insert的默认值为 false —— 现在统计信息会在合并期间构建,而不是在写入时构建,从而降低写入开销。使用SET materialize_statistics_on_insert = 1可恢复旧行为。#101275 (Han Fei).- 为 materialized view 依赖链新增
prefer_dependency_replica刷新设置,以减少跨副本复制延迟导致的数据缺失。#101591 (Seva Potapov) 。 - 新增
hasPhrase(别名matchPhrase) 函数,用于短语搜索 (连续的标记序列) 。搜索采用穷举方式,也就是说,文本索引暂未支持该功能。#101997 (Elmi Ahmadov) 。 - 新增
s3_read_request_duration_microseconds和s3_read_request_bytes直方图指标,用于观测 S3 GET 请求连接的存续时间以及消耗的字节数,可在system.histogram_metrics和 Prometheus 端点中查看。 #102058 (Sema Checherinda). - 现在可以使用
+运算符将Date和Date32值与Time和Time64值相加,得到DateTime或DateTime64结果。例如,SELECT toDate('2024-01-15') + toTime('14:30:25')会返回2024-01-15 14:30:25。结果会按照会话时区计算,超出范围的结果则根据date_time_overflow_behavior设置处理。关闭 #95914。#102421 (Nihal Z. Miaji). - 文本索引现已正式可用,并且无论
compatibility设置如何都会保持启用状态,从而避免在备份恢复期间或以兼容模式运行时被意外禁用。#101518 (Nikita Fomichev) 。
Experimental 功能
- 为 Iceberg 表新增
ALTER TABLE ... EXECUTE remove_orphan_files,用于识别并从对象存储中删除未被引用的文件。#99127 (murphy-4o). - 新增
query_plan_optimize_join_order_randomize设置,用于将 join 重排序所依据的统计信息随机化,便于测试。#100643 (Vladimir Cherkasov). - 为 ClickHouse 新增 AI 函数支持,允许用户通过 SQL 调用 OpenAI 和 Anthropic 端点。
aiGenerate是首个此类函数。#100831 (George Larionov). - 新增 AI 函数:
aiClassify、aiExtract和aiTranslate,用于在 ClickHouse 中调用 LLM API。#100832 (George Larionov). - 新增
system.histogram_metric_log,这是一个新的系统表,会定期对所有直方图指标创建快照 (例如 S3/Azure 延迟、Keeper 请求处理各阶段的耗时) 。此外,system.histogram_metrics的value列改为Float64,因为这样更灵活,也更兼容 Prometheus 数据模型。#103046 (Miсhael Stetsyuk). 该表结构很可能会在未来的发行版中发生变化。
性能提升
- ClickHouse 现已能够在
SELECT查询中基于最小/最大统计信息剪枝整个数据分区片段。#94140 (zoomxi). - 减少已完成变更的 ReplicatedMergeTree 表在执行只读操作时的锁竞争。#95771 (Eduard Karacharov).
- 读取投影时遵循
optimize_read_in_order。修复 #89453。#95885 (Andrey Zvonov) 。 - 对 Hash Join 和 Concurrent Hash Join 进行了一些小优化。#96663 (Yarik Briukhovetskyi) 。
- 通过在输入数据几乎全为唯一值时禁用
LowCardinality列优化,优化DISTINCT转换。#97113 (Nihal Z. Miaji) 。 - 来自 #97723 的
LIKE查询性能优化:现在这类查询可以使用文本索引。#98149 (Elmi Ahmadov) 。 - 向量化数学函数 (
exp、log、sigmoid、tanh) 现已在 AArch64 (使用 NEON/SVE) 以及 FreeBSD/Darwin 上获得加速;此前这些平台使用的是较慢的标量回退实现。 #98230 (Raúl Marín). - 对于按
MergeTree主键列进行过滤、且使用字面字符串正则表达式交替分支 (例如^(abc-1|abc-2)) 的查询,如今只要这些备选分支具有共同前缀,就可以利用主键裁剪。#98988 (Yash ). - 将
ORDER BY ... LIMIT的 top-k 动态过滤扩展为支持Nullable、String和COLLATE类型。#99033 (murphy-4o) 。 - 对键值范围较小的
Int32和Int64键,使用直接索引哈希表来加速哈希连接。 #99275 (Hechem Selmi). - 使用单个字典的
LowCardinality列在非连续查询场景下速度更快。#99285 (Ivan Babrou). - 通过对内部循环去虚拟化,加快
Float64列上var*Stable和stddev*Stable函数的执行速度。注意:这会启用编译器优化 (FMA/寄存器) ,从而在 ULP 级别改变浮点结果。#99460 (Riyane El Qoqui) 。 - 对 32/64 字节的输入使用优化后的 Firedancer base58 编码 (对
base58Encode自动启用) 。如果解码结果为 32/64 字节,则可使用优化后的 base58 解码 (需显式指定,如base58Decode('...', 32)或类似形式) 。#99461 (Joanna Hulboj) 。 - 启用基于链接器节的优化 (
-ffunction-sections、-fdata-sections、--icf=all) ,以减小可执行文件体积并提高指令缓存利用率。#99474 (Alexey Milovidov) 。 - 修复了在多核机器上,带聚合的短查询出现负向扩缩容的问题。当查询读取的标记较少时,管道在聚合后将不再扩展到
max_threads,从而避免了大部分流几乎为空所带来的额外开销。#99493 (Alexey Milovidov). - 通过正确选择读取任务大小,利用并行副本提升查询性能。#99801 (Nikita Taranov).
- 允许在通过用户态页缓存读取远程文件时执行预取。#99919 (Alexey Milovidov) 。
- 在枚举子列时,避免了对 String
.size子列的不必要计算。#99941 (Pavel Kruglov) 。 - 在酒店网络环境下使用拥有大量副本的集群时,减少 clickhouse-client 进度条的抖动。#100145 (Alexey Milovidov) 。
- 当启用页缓存时,在
clickhouse-local中启动MemoryWorker,以便真正使用用户态页缓存。#100306 (Alexey Milovidov) 。 - 将
LIMIT子句下推至UNION ALL中,以优化查询。#100364 (Alexey Milovidov) 。 - 为
ORDER BY中String和FixedString列的比较新增 JIT 编译支持,使以字符串为主的排序键在合并阶段的排序性能提升了 6–17%。与 @lgbo-ustc 共同完成。#100577 (Raúl Marín). - 当启用
read_in_order_use_virtual_row并配合新的read_in_order_use_virtual_row_per_block设置时,现在每次从MergeTree读取完一个块后都会输出虚拟行边界信息,使merge能够在流处理中途重新调整 source 的优先级,适用于其数据被WHERE/PREWHERE/JOIN完全过滤掉的 parts。关闭 #99945。#100603 (Vladimir Cherkasov) 。 - 通过以兼容 dragonbox 的舍入方式扩展
itoa的快速路径,加快了大整数值的 Float 到 String 转换。#100649 (Raúl Marín). - 将
dragonbox替换为zmij,使 Float 到 String 的转换速度提高 1.5 倍至 3 倍。#100650 (Raúl Marín) 。 - 通过以 Barrett reduction 替代软件除法并展开转换循环,加快了
Int128/UInt128到字符串的转换。#100671 (Raúl Marín) 。 - 避免在
uniqExact并行合并时生成冗余线程。#100686 (Jiebin Sun) 。 - 为
uniqExact增加批次并行合并支持。#100687 (Jiebin Sun) 。 - 对于通过并行副本执行、且底层为
MergeTree表的简单视图查询,并行化效果更佳。#100815 (Igor Nikonov) 。 - 实现了在
parallel_replicas_allow_view_over_mergetree=1时对简单视图启用并行副本的支持 (包括基于MergeTree表、符合条件的UNION ALL视图) 。这样可以并行化视图的外层查询,而不是内层查询,从而提升跨节点的查询并行度。#100958 (Igor Nikonov) 。 - 当查询计划中存在带有
IN的过滤器时,优化full_sorting_merge按主键顺序读取的性能。 #101261 (Nikita Taranov). - 通过缓存采样设置而非遍历整个 memory tracker 层级结构,优化内存分配/释放。#101267 (Azat Khuzhin).
- 修复在
deduplicate_insert = 'enable'(自 26.2 起默认为启用) 时显著的 INSERT 性能下降问题:将数据哈希计算从 squashing 阶段推迟到 sink,并通过updateHashWithValueRange按批次对列进行哈希计算,使 22 列、500 万行数据的开销从约 2.5 秒降至约 0.5 秒。#101494 (Sema Checherinda) 。 - 通过使用
try_lock避免为无竞争获取计时,并移除持有时间测量,降低锁分析的额外开销。#101502 (Antonio Andelic) 。 - 将
arrayDotProduct中手写的 AVX-512 内建函数替换为与平台无关、可自动向量化的循环,并新增对 AVX2 和 ARM NEON 的支持。#101571 (Peng). - 当值以转义字符串形式传入时 (例如
'{\'key\':1}') ,优化INSERT VALUES中Map、Array和Tuple列的性能,避免不必要地回退到 SQL 表达式解析器。#102119 (Joanna Hulboj) 。 - 修复了
RabbitMQ表引擎 CPU 占用过高的问题。#102711 (Jaap Elst) 。 - JOIN 顺序优化器现在可以根据现有 JOIN 条件推断传递性的等值 JOIN 谓词。例如,给定
A.x = B.x AND B.x = C.x,就能识别出等价关系A.x = C.x,从而让优化器可以考虑在通过传递关系相连的表之间直接执行 JOIN。这可以提升星型和雪花 schema 的 plan 质量,因为在这类 schema 中,维度表通过共享的事实表相连。该功能由新的enable_join_transitive_predicates设置控制 (默认关闭) 。#98479 (Alexander Gololobov) 。 - 通过预先并行取消合并操作,优化
TRUNCATE DATABASE TABLES LIKE。#98597 (Shaohua Wang) 。 - 为乘法增加单调性支持,从而使
key * constant表达式也能进行主键剪枝。#98983 (Amos Bird). - 缓存字典在
hasKeys中不再使用独占锁;改为在缓存读取时使用共享锁,从而减少锁竞争。#100796 (liuguangliang). - 在查询树中内联 VIEW 子查询,从而可对 VIEW 应用更多优化。#100830 (Dmitry Novik) 。
- 优化服务器启动时的缓存加载。#101500 (Kseniia Sumarokova) 。
- 当谓词选择性足够高时,为带有 FINAL 的 ReplacingMergeTree 实现延迟列物化。#101647 (Nikolai Kochetov) 。
- 重新启用
optimize_rewrite_array_exists_to_has优化 (自 23.10 起默认关闭) 。它会将arrayExists(x -> x = elem, arr)重写为快得多的has(arr, elem);现在,当数组元素类型与elem不兼容、无法用于has时 (例如Date与String) ,会正确跳过此重写,因此此前会报错的查询现在仍可正常工作。关闭了 #71431。#100944 (Alexey Milovidov) 。
改进
- 改进了 EXPLAIN PLAN pretty=1 的输出:打印顶层查询的输出列,显示 join 关系的标签/符号以及预估结果行数和本地性,并包含 join/source 步骤中每一步的输出列。这些变更涵盖了 #98117 中的 Information Deficit 部分。#99462 (Kirill Kopnev) 。
- 新增 MergeTree 表设置
share_nested_offsets(默认值为true) 。当其设为false时,带点号名称的 Array 列 (例如n.a、n.b) 会被视为彼此独立的列,而不再按旧版Nested语义共享偏移量文件,也不再校验数组大小是否相等。#98416 (Amos Bird) 。 - 现在,用户可以在 users.xml/yaml 配置中指定多种身份验证方法 (SQL 中一直都支持) 。#91998 (Flip-Liquid).
- 自动重新加载启用 TLS 的 Raft 节点间连接。#93455 (Evgeny).
- 将
cast_keep_nullable扩展为支持 Dynamic/JSON 类型。启用后,对可为 Nullable 的类型中的 NULL 进行类型转换时会返回 NULL;否则会抛出CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN错误。#96504 (Seva Potapov) 。 - 通过引入对象池,降低了内部数据结构 (
ISerialization对象) 的内存占用。#96563 (Nikita Mikhaylov) 。 - 为 keeper-client 的 XML 配置新增对
password和identity字段的支持。#96800 (Grigorii Sokolik) 。 - 改进对 Unity Catalog 的
Iceberg写入支持。#98162 (Konstantin Vedernikov). - 新增设置
finalize_projection_parts_synchronously,支持在 INSERT 期间同步完成 projection parts 的最终化;默认仍保留现有的异步行为,同时可降低具有大量 projections 的表的峰值内存占用。#98228 (Amos Bird) 。 - 向
system.part_log添加projections_duration_ms列,用于记录各投影合并/重建的耗时 (以毫秒为单位) 。#98292 (Amos Bird) 。 - 改进了在 clickhouse-client 中通过 KILL QUERY 和取消查询 (Ctrl+C) 来取消使用 ExpressionTransform 和 NumbersRangedSource 的查询。#98908 (Roman Vasin).
- 将硬编码的
source_table_engines列表替换为通过StorageFactory::getAllStorages()进行运行时查找。这为一些此前缺失的表引擎补充了访问检查,并关闭了 #71544。#98984 (pufit) 。 - 新增一个设置,用于控制 Variant 和 Dynamic 的类型不匹配处理方式 (抛出异常或返回 NULL) 。#99085 (Bharat Nallan).
- 改进
Iceberg与 Spark 的兼容性:修复因混用存储路径和元数据路径而导致的路径处理不一致问题;强制Iceberg表写入的表位置必须为 URL 或绝对路径;由于某些 ClickHouse 读取器在遍历后不支持按字节计数,因此为Azure中的文件大小统计添加回退机制;以与 Spark 兼容的方式处理version-hint.txt;引入类型级抽象,使今后更不容易混淆不同的路径类型;为Azure和Local添加测试,以验证无需中间上传/下载即可实现跨引擎互操作;修复 position delete 的使用问题,此前它依赖基于路径推断的启发式方法,而这种做法在这里并不适用。 #99163 (Daniil Ivanik). #100420 (Daniil Ivanik). - 修复了在 https://github.com/ClickHouse/ClickHouse/pull/92844 中引入的
IPartitionStrategy::cached_result中可能存在的竞态条件。#99400 (Arthur Passos) 。 - 现在,用户可以在 Arrow 格式中写入 ClickHouse 的 Interval 数据类型。#99519 (Peter Nguyen) 。
- 新增了在
Arrow和Parquet格式中导入和导出UUID数据类型的原生支持。现在,用户无需手动将其转换为字符串或采用其他变通方法,即可在 ClickHouse 与其他数据工具之间直接查询和传输 UUID 数据。支持自动推断顶层 UUID 的逻辑类型,并支持为嵌套 UUID 显式提供 schema 提示。#99521 (Ivan). - 支持对象存储上的
7z归档文件。解决了 #70968。#99600 (Alexey Milovidov) 。 - 添加
ObjectStorageListedObjects、ObjectStorageGlobFilteredObjects、ObjectStoragePredicateFilteredObjects和ObjectStorageReadObjectsProfileEvents,用于查看对象存储 (S3、Azure等) 文件列举和读取管道的内部信息。#99778 (Sema Checherinda) 。 - 修复了在查询并非所有底层分布式/远程表都包含的列时,
merge表函数因UNKNOWN_IDENTIFIER错误而失败的问题。#99833 (Alexey Milovidov). - 现在,我们将 commit 时间计入 ReplicatedMergeTree 的变更总执行时间指标中。该时间在 #96376 之后丢失了。#99936 (alesapin).
- 为
MetadataStorageFromDisk中待移除的 blob 对象添加预写日志,在删除对象时提高元数据与远程对象存储之间的持久性和一致性。#100019 (Maksim Kita) 。 - 在嵌入式客户端 (SSH 和 WebSocket 协议) 中禁用 AI SQL 生成 (
??命令) ,以防止访问服务器环境变量。#100290 (Alexey Milovidov) 。 - 调整通过 catalog 进行 Iceberg 插入的接口。废弃以下设置:
storage_catalog_type、storage_aws_access_key_id等。#100334 (Konstantin Vedernikov). - 粘贴到 clickhouse-client 时,将制表符转换为 4 个空格。修复了 #100405。#100416 (Raúl Marín) 。
- 当
show_data_lake_catalogs_in_system_tables被禁用时,避免为了“Maybe you meant …”表提示而扫描整个远程数据湖目录。#100452 (Alsu Giliazova) 。 - 在分区裁剪后再应用
distributed_index_analysis_min_indexes_bytes_to_activate。#100477 (Azat Khuzhin) 。 - 修复在使用空 IN/NOT IN 子句时,Parquet bloom 过滤器下推导致的断言失败。#100543 (zoomxi).
- MinMax 列统计信息现在将最小值和最大值存储为 Field (带类型) ,而非 Float64。序列化格式除这些值外,还会包含列的类型名称。统计信息文件版本已升级到 V2;由旧版本写入的文件需要重新物化 (ALTER TABLE … MATERIALIZE STATISTICS ALL) 。修复 #53140。#100605 (Han Fei) 。
- 更新
cppkafka,包含了消费者关闭死锁问题的修复。#100612 (Azat Khuzhin) 。 - 用于解析 Iceberg 中数据文件的对象信息现在包含从 manifest 文件中解析得到的文件行数以及以字节为单位的文件大小。#100645 (Daniil Ivanik).
- 新增
use_separate_cache_arena配置参数,以便控制是否将缓存内存分配区分离。#100664 (Seva Potapov) 。 - 新增原生支持将 Apache Arrow 的
StringView和BinaryView数据类型导入到 ClickHouseString列中,提升了基于 Arrow 的摄取兼容性。#100762 (Ivan). - 如果在运行时更改了配置文件,一些 Keeper server 设置现在支持热重载:max_requests_batch_size、max_requests_batch_bytes_size、max_request_size、quorum_reads。#100773 (Michael Kolupaev) 。
- 在 release build 中增加
MemoryAllocatedWithoutCheck/MemoryAllocatedWithoutCheckBytes这两个 profile events 的计数。#100899 (Pavel Kruglov) 。 - Cgroupv2 内存跟踪现在会将内核内存中的
slab_reclaimable排除在外,从而能更准确地衡量不可回收的内存使用量。#100901 (Antonio Andelic) 。 use_partition_pruning = 0现在不仅会禁用基于分区键的剪枝,还会禁用MinMax索引剪枝以及针对分区键列的计数优化。#100904 (Nihal Z. Miaji) 。- 在
EXPLAIN [PLAN]中,pretty=1现在会以更易于阅读的格式输出 expression。#100927 (Kirill Kopnev) 。 accurateCastOrNull和accurateCastOrDefault现已支持Tuple目标类型,包括元素为Nullable的嵌套Tuples。此前,这些函数会拒绝Tuple目标类型,因为Tuple不能位于Nullable内。已关闭 #100820。#100942 (Nihal Z. Miaji) 。- 修复了在浅色与深色主题间切换时 Play UI 中图表重复显示的问题。#101058 (Alexey Milovidov).
- 将 chdig 更新到 v26.3.1 (perfetto UI,为 CPU/内存/合并/查询摘要添加迷你图、system.warnings,以及日志中的正则搜索) 。#101092 (Azat Khuzhin) 。将 chdig 更新到 v26.4.3 (perfetto 改进、修复通过 pastila.nl 共享的问题、火焰图差异对比、实时修改设置) 。#103145 (Azat Khuzhin) 。
- 现在,
WITH子句在SELECT查询前可以带尾随逗号。#101093 (Aruj Bansal) 。 - 新增
compress_per_column_in_compact_partsMergeTree setting,用于控制 Compact parts 内压缩块的组织方式。当为true(默认值,保持当前行为) 时,每列都会开启一个新的压缩块,从而支持选择性解压。当为false时,一个粒度内的所有列都会打包到同一个压缩块中,从而为始终读取全部列的 workloads 提升压缩率和读取性能。#101114 (Amos Bird) 。 - 仅在鼠标悬停于表名上时,才在 Play UI 中显示表信息气泡,而不是在悬停于整行时显示。#101118 (Alexey Milovidov).
- 为 Play UI 侧边栏添加引擎专属图标,并优化表列表的使用体验。#101134 (Alexey Milovidov).
- 支持
Arrow、ArrowStream、ORC和旧版Parquet格式中的Nullable(Tuple)。 #101272 (Nihal Z. Miaji). - 在 web UI (play.html) 中将 TOTALS 行显示在表格页脚。#101286 (Alexey Milovidov) 。
- 在 web UI (
play.html) 中支持多查询模式:可一次运行多个查询,支持并行执行类似SELECT的查询,并分别显示每个查询的结果。#101290 (Alexey Milovidov) 。 - 修复将结果表重构为 Web 组件后,play.html web UI 中列宽调整失效的问题。#101295 (Alexey Milovidov).
- 支持按时间间隔限制在 MEMORY_LIMIT_EXCEEDED 时 jemalloc profile 的刷写次数。#101396 (Azat Khuzhin) 。
- 新增 Keeper 设置
nuraft_streaming_mode(默认值为false) 、nuraft_max_log_gap_in_stream和nuraft_max_bytes_in_flight_in_stream。已关闭 #90743。#101427 (Kseniia Sumarokova) 。 - 新增了异步指标
CGroupMemoryUsedWithoutPageCache,用于报告排除了内核 OS page cache 和 ClickHouse 用户态页缓存后的 cgroup 内存使用量,对应于MemoryResidentWithoutPageCache。同时还明确了CGroupMemoryUsed指标的说明。#101513 (Francesco Ciocchetti). - 在解析器层面为 SQL 标准
OVERLAY函数语法添加语法糖。overlay函数已存在;此次新增了对基于关键字形式的支持,使用PLACING、FROM和FOR作为分隔符。#101681 (Desel72). - 为系统表
information_schema.tables新增了列别名INDEX_LENGTH,与该表中现有的大写别名保持一致。#101705 (Robert Schulze) 。 - 系统表
information_schema.tables现在会忽略非活跃的表 parts。这使显示的表大小数值更接近实际。#101706 (Robert Schulze) 。 ngrams函数现在会拒绝无效的 ngram 长度。示例:SELECT ngrams('abc', 0)现在会报错。#101922 (Robert Schulze) 。- 对 #91820 和 #90837 的后续改进:从错误信息中滤除不受支持的算法;在 FIPS 构建中运行 FIPS 专用测试。#102067 (Mikhail f. Shiryaev) 。
- 将 Web UI (
play.html) 中的单元格高度限制为最多三行,并支持点击展开。#102154 (Alexey Milovidov). - 新增了一个选项,可强制 S3 端点使用 (virtual/path) 风格。解决了 #82019;#76007,是 https://github.com/ClickHouse/ClickHouse/pull/83168 的延续。 #102378 (Konstantin Vedernikov).
- 现在,
restore_replace_external_engines_to_null设置也会跳过恢复使用外部引擎 (例如DataLakeCatalog、MySQL、PostgreSQL、S3) 的数据库,而不再失败或发起外部连接。#102400 (Nikita Fomichev) 。 - 通过
HINT模式为hasPhrase函数新增文本索引分析支持。#102438 (Elmi Ahmadov) 。 - 在 ColumnDependency 中将 STATISTICS 设为只读,以修复执行 MATERIALIZE STATISTICS ALL 期间出现的 LOGICAL_ERROR。#102627 (Konstantin Bogdanov) 。
- 在 keeper-as-server 模式下创建并填充
system.asynchronous_metric_log。#102664 (Miсhael Stetsyuk) 。 - 新增
default_system_log_flush_policy.skip_alias_columns配置选项,允许在系统日志表中省略 ALIAS 列,从而修复以 S3 为后端且不接受 ALIAS 列的系统日志问题。#102669 (Miсhael Stetsyuk) 。 - 不要为系统表启用自动统计信息,因为它们几乎没有机会用到这些统计信息。#102862 (Han Fei).
- 为 LIKE 优化增加对
array分词器的支持。#102880 (Elmi Ahmadov) 。 - 即使在正式版构建中,也会发送 MemoryAllocatedWithoutCheck。#103064 (Azat Khuzhin) 。
- 在 system.stack_trace 中提供每个线程的 untracked_memory 信息。#103065 (Azat Khuzhin) 。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了因 Lazy materialization 返回多余列而导致的
Block structure mismatch in stream错误。修复 #95191。#96682 (Nikolai Kochetov) 。 - 修复了使用
ON CLUSTER的数据脱敏策略查询中的逻辑错误。#97594 (Bharat Nallan) 。 - 修复了在 GCS 上使用 Unity Catalog 时的一个 bug。#98456 (Melvyn Peignon) 。
DataLakeCatalog现在在验证auth_header设置时,会遵循服务器上的http_forbid_headers配置。 #98827 (Michael Anastasakis).- 修复 S3 花括号展开通配符中的 N+1
HeadObject调用问题。#99219 (Konstantin Bogdanov). - 当引擎本身也支持设置时,验证 CREATE 查询中的设置变更。#99279 (János Benjamin Antal) 。
- 修复了以下问题:当表中包含一个表达式依赖于 EPHEMERAL 列的 MATERIALIZED 列时,
ALTER TABLE UPDATE/DELETE会因Missing columns错误而失败。#99281 (Yash ). - JDBC、ODBC 和 NATS 连接字符串中的凭据现在会在查询日志和
SHOW CREATE输出中被屏蔽,从而避免敏感信息意外泄露。对于 URI 样式的连接字符串 (例如{scheme}://{user}:{password}@{host}) ,现在仅屏蔽密码部分,其余内容仍然可见,以便于调试。nats_token设置现在也会被屏蔽。#99344 (János Benjamin Antal) 。 - 修复了 parseDateTimeBestEffort 在 DD-month-YYYY 格式中将以月份前缀开头的单词错误解析的问题。关闭 #99345。#99350 (Pavel Kruglov) 。
- 修复了在非 analyzer 下会忽略 TABLE_UUID_MISMATCH 的问题。#99380 (Azat Khuzhin) 。
- 修复了一个问题:在同一请求中与
compatibility一起发送显式设置时,如果其值与服务器默认值相同,这些设置可能会被静默忽略。#99402 (Raufs Dunamalijevs) 。 - 修复了 hive 分区路径中带有前导零的数字导致报错的问题。修复了 #98801。#99458 (Yarik Briukhovetskyi) 。
- 修复在表被删除的同时仍有读取查询在运行时的 heap-use-after-free 问题 (过去 90 天内在 CI 中出现 19 次) 。#99483 (Alexey Milovidov) 。
- 修复了 Keeper 中的一个 bug:如果同一 server 上另一个不相关的 session 恰好在错误的时机被关闭,读取请求可能会卡住 (导致 session 超时) 。#99484 (Michael Kolupaev).
- 在应用补丁前验证列结构。#99531 (Seva Potapov) 。
- 修复在包含
Dynamic列的表执行合并期间,快速切换SYSTEM STOP/START MERGES时出现的垂直合并rows_sources断言失败问题。#99532 (Alexey Milovidov). - 修复了
toWeek()的分区裁剪错误:在按toYYYYMM(date)分区的表上,带有WHERE toWeek(date, mode) = N的查询在第 49–52 周会返回空结果。#99542 (Takumi Hara). - 修复了在处理由 JOIN 生成的未引用行时,对 ColumnReplicated 进行操作的函数中出现的异常。#99564 (Hechem Selmi) 。
- 修复
CLEAR COLUMN不会重建 projections,也不会重新计算依赖被清除列的 materialized 列的问题,否则可能在后续合并期间导致异常或数据损坏。#99565 (Desel72) 。 - 修复了
ConditionSelectivityEstimator中的一个异常 (Bad get: has Tuple, actual type String) :当查询在已启用use_statistics且具有列统计信息的表上,对单个标量查询参数使用 IN 时 (例如WHERE col IN ({p:String})) ,会触发该异常。#99614 (Ilya Yatsishin). - 带有未知投影的分片不应被标记为永久丢失。#99623 (Sema Checherinda) 。
- 修复了一个罕见的逻辑错误异常:并发执行
SYSTEM STOP MERGES和SYSTEM START MERGES时,可能会在 vertical merge 期间抛出该异常。#99628 (Desel72). - 修复
injectRequiredColumns中的悬空引用,避免在合并期间导致崩溃。#99679 (Tuan Pham Anh). - 修复了 Avro 格式读取器在读取超出目标列类型可表示范围的数值时的未定义行为。现在发生溢出时,查询会直接失败,而不再静默产生错误的值。 #99697 (asyablue22).
- 修复了
executable表函数参数中 shell 风格引号的解析错误。#99794 (Nikita Semenov) 。 - 修复了
NativeReader在反序列化行数不匹配的 Native 格式 stream 时误报abort的问题:将其从LOGICAL_ERROR改为INCORRECT_DATA,使该错误按数据错误处理,而不会在 sanitizer/debug 构建中触发abort()。#99822 (Rahul Nair). - 修复当二进制流中的序列化类型为
DETACHED时,Tuple列在反序列化过程中导致进程中止的问题。#99823 (Rahul Nair). - 修复了在文件系统缓存动态调整大小期间,由于 SLRU 子队列提升中的竞态条件而误触发
LOGICAL_ERROR异常的问题。#99850 (Alexey Milovidov) 。 - 修复 async insert 查询在
query_log和客户端输出中将written_rows、read_rows和result_rows误报为 0 的问题。#99879 (Sema Checherinda) 。 - 修复了
KILL QUERY中的异常 “Bad cast from type X to Y”:当针对系统表的内部查询返回由ColumnConst包装的列时,会出现该问题。#99881 (Alexey Milovidov) 。 - 修复
untuple参数中关联子查询的逻辑错误。#99917 (Vladimir Cherkasov) 。 - 修复了调用
right、rightUTF8或其他子串函数时传入长度为 INT64_MIN (-9223372036854775808) 的值所引发的异常;此前由于整数溢出,会导致未定义行为。现在,这些函数会正确报告 ARGUMENT_OUT_OF_BOUND 错误。#99934 (Jimmy Aguilar Mena) 。 - 现在 ClickHouse 应该能够正确处理 Spark 风格的表 (即每个文件都有完整的绝对路径,或相对于公共表路径的相对路径) 。修复了 #92348。#99935 (alesapin) 。
- 修复以下问题:当
ALTER语句本身也带有SETTINGS时,对于包含带有SETTINGS的嵌套子查询的ALTER TABLE ... MODIFY QUERY,会抛出“AST 格式不一致”异常。#99938 (Nikita Mikhaylov) 。 - 由于疑似出现性能回退,撤销 #97114 “将 join step 的行数估算提前到检查是否只有 1 个子节点之前”。#99957 (Alexander Gololobov) 。
- 修复了一个 bug:如果对文件发起的 HEAD 请求响应中缺少
Content-Length请求头 (例如由于 GCS 中的解压转码) ,ClickHouse 可能会跳过这些文件。#99971 (Yarik Briukhovetskyi). - 修复在将
NumericIndexedVector聚合状态与偶数整数常量相乘时发生的断言失败问题 (在 debug 构建中会抛出异常,在 release 构建中会产生错误结果) ;其原因是pointwiseAddInplace中带别名的 Roaring bitmap 发生了自异或。#99976 (Desel72). - 防止在链式
JOIN USING的旧版过滤器下推中,因JOIN转换后键类型发生变化而触发Unexpected return type异常。#99999 (Alexey Milovidov) 。 - 修复了在未解析的表函数参数中使用标量子查询时出现的
LOGICAL_ERROR异常“表表达式的节点类型异常……实际为 IDENTIFIER”,例如SELECT * FROM remote('localhost', view(SELECT 2 AS x), concat(x, (SELECT 1)))。#100014 (Alexey Milovidov) 。 - 修复了这样一个问题:当数据后的下一行带有尾随 SQL 注释 (
--或/* */) 时,INSERT配合VALUES会失败。现在会跳过该注释,而不会将其解析为另一行。#100016 (Pratima Patel) 。 - 修复了
arrayRemove在比较包含 NULL 值的元组时出现异常的问题。#100017 (Alexey Milovidov) 。 - 修复
system.asynchronous_inserts中的跨用户数据泄露问题:任何对该表具有SELECT权限的用户都可能看到其他用户待处理的异步 insert 条目。现在,这些条目会按当前用户进行过滤,除非该用户拥有SHOW_USERS权限。#100024 (Shaohua Wang) 。 - 修复了将 Time64 转换为 UInt64 时,值可能被限制在 24 小时内的问题。#100025 (Yarik Briukhovetskyi) 。
- 修复了以下问题:当 CREATE DICTIONARY 的定义中包含带有不存在函数的列表值时,本地服务器会崩溃。#100036 (Yakov Olkhovskiy) 。
- 修复了
CSV、MsgPack格式无法正确解析Nullable(Tuple)的问题。关闭 #99753。#100038 (Nihal Z. Miaji) 。 - 修复在将带有 WITH 函数表达式别名 (例如
tuple(...)) 作为IN右侧使用时,CREATE VIEW因UNKNOWN_IDENTIFIER而失败的问题。#100042 (Peng) 。 - 修复时间序列聚合函数 (例如
timeSeriesResampleToGridWithStaleness) 在并行副本下配合initializeAggregation或AggregatingMergeTree使用时,会因报错ILLEGAL_TYPE_OF_ARGUMENT而失败的问题。#100053 (Alexey Milovidov) 。 - 修正 NumericIndexedVectorDataBSI 内部负值处理的问题。 #100086 (Daniil Ivanik).
- 修复
accurateCastOrDefault和to*OrDefault函数在输入为常量时无法保留 Const 列类型的问题。#100132 (Alexey Milovidov) 。 - 省略的
LowCardinality(Nullable(T))类型查询参数现在会像Nullable(T)一样,正确默认使用 NULL。#100144 (Denys Melnyk) 。 - 修复
StringSearcher.h中使用未初始化值的问题。#100225 (Konstantin Bogdanov) 。 - 允许通过 Ctrl+C 取消标量子查询及其他分析阶段的管道。此前,在长时间运行的标量子查询执行期间按下 Ctrl+C 不会有任何效果,必须等到子查询完成后才行。同时还修复了进度条和 JSON 统计信息,使其能够在
clickhouse-client和clickhouse-local中正确报告标量子查询执行期间读取的行数。与 @YjyJeff 共同完成。#100230 (Raúl Marín) 。 - 修复了涉及
Dynamic列、交叉连接和运行时过滤器的查询中出现的LOGICAL_ERROR异常。该问题的原因是,ColumnVariant::filter在hasOnlyNulls优化路径中共享了 Variant 列指针,而不是对其进行克隆。关闭 https://github.com/ClickHouse/ClickHouse/pull/100147。 #100234 (Pavel Kruglov). - 修复了 Variant 数组的一个 bug:调用
arrayFirst/arrayLast函数时,可能会错误地重新解释数据类型。例如,之前当实际底层的 Variant 类型为Date时,Array(Variant(Date, Bool))会被转换为Bool。#100255 (timothygk) 。 - 函数有一些小幅调整:h3 函数现在能更好地校验边界;readWKB 会检查大小限制 (新增设置
max_wkb_geometry_elements) ;随机生成器函数会限制计算中的最大迭代次数。这是对 #93543 的后续修复。#100270 (Alexey Milovidov) 。 - 修复了一个问题:当某些参数名是其他参数名的子字符串时,
cutURLParameter可能会错误地跳过这些参数。#100280 (Nikita Semenov) 。 - 修复了 Iceberg metadata 文件路径设置中包含空字节时触发的异常。#100283 (Alexey Milovidov) 。
- 修复了在
distributed_index_analysis与包含IN子查询的谓词一同使用时,实际执行的查询数量呈二次增长的问题。#100287 (Anton Popov). - 修复在将
GROUP BY ... WITH TOTALS HAVING与UNION DISTINCT及 Nullable 表达式组合使用时出现的 “Block structure mismatch” 异常。 #100293 (Alexey Milovidov). - 修复了当
block_size_bytes参数大到极端时,estimateCompressionRatio中出现LOGICAL_ERROR异常的问题。#100298 (Alexey Milovidov). - 修复在调试构建中使用
GROUP BY CUBE(...) WITH ROLLUP或类似组合时触发的“AST 格式化不一致”异常。#100376 (Alexey Milovidov). - 修复了使用列别名以及
SELECT *或EXCEPT/INTERSECT查询创建视图时出现的异常。#100386 (Alexey Milovidov) 。 - 修复了这样一个问题:在发生心跳错误后,如果消费者卡在重平衡过程中,Kafka 引擎表上的
DROP TABLE会无限期挂起。#100388 (Alexey Milovidov). - 修复了在使用 zip 归档执行备份/恢复操作时出现的
ReadBuffer is canceled. Can't read from it.异常。#100400 (Alexey Milovidov) 。 - 修复了以下
TOO_MANY_ROWS异常:当数据分散在多个粒度边界不对齐的 parts 中时,带有max_rows_to_read/force_primary_key的SELECT count()查询会触发该异常。#100408 (Alexey Milovidov). - 修复
system.completions,使其能够在所有权限授予组合下根据访问权限正确过滤数据库、表和列:按表、按库授权,以及按列 revoke。#100432 (Shaohua Wang). - 修复 NuRaft 中由竞态条件导致的 SEGFAULT。 #100444 (Pablo Marcos).
min/max/argMin/argMax现在对 NaN 的处理与ORDER BY一致:NaN 始终会被跳过 (仅当所有值均为 NaN 时才返回) 。此前,由于 IEEE 754 的无序比较语义,结果取决于 NaN 在数据中的位置。#100448 (Raúl Marín) 。- 修复了一个复制粘贴导致的 bug:如果只设置了
delta_lake_snapshot_end_version而未设置delta_lake_snapshot_start_version,此前会被静默忽略,而不是报出BAD_ARGUMENTS错误。 #100454 (Mohammad Lareb Zafar). StorageRabbitMQ::shutdown不是幂等的 (它会无条件地访问弱指针,然后销毁相应的共享指针) ,但现在会被调用两次:一次在StreamingStorageRegistry中,随后一次在DatabaseCatalog中。此次修复使该方法变为幂等,并添加了防御性的空值检查。#100455 (Miсhael Stetsyuk) 。- 修复了将
accurateCastOrNull与QBit目标类型一起使用时触发的LOGICAL_ERROR异常。#100470 (Raufs Dunamalijevs). - 修复了在
optimize_on_insert=0的 wide parts 中,向包含嵌套Array(JSON)列的表插入数据时出现的 LOGICAL_ERROR 异常 “Stream … not found”。#100475 (Pavel Kruglov). - 在
RESTORE期间,对备份 metadata 中的文件条目路径进行校验,以拒绝路径遍历、绝对路径和空名称。#100483 (Pablo Marcos) 。 - 修复
LIMIT m OFFSET n WITH TIES语法无法生效的问题。该语法等同于LIMIT n, m WITH TIES,后者此前已可正常使用。#100491 (Nihal Z. Miaji). - 修复了在对带有命名字段且元素为
LowCardinality的Nullable(Tuple)列使用IN时出现的异常 “No set is registered for key”。#100523 (Alexey Milovidov) 。 - 修复了 usearch
sorted_buffer_gt::insert()中的堆缓冲区溢出问题;该问题可能导致在执行向量相似性搜索时发生崩溃,或静默地损坏内存。#100537 (Dustin Healy) 。 - 修复了
EXECUTE AS会忽略查询中指定的FORMAT和INTO OUTFILE子句的问题。#100538 (pufit). - 修复 SAMPLE 在查询级 OFFSET 下 AST 格式不一致的问题。关闭 #100576。#100579 (Pavel Kruglov) 。
- 修复 Azure 上的 Polaris 目录问题。自 25.12 起,该目录在 Azure 上会在路径开头附加 bucket。例如,会变成
abfss://polaris-polaris@<some_url>.windows.net/polaris-polaris/<other-path>,而不是abfss://polaris-polaris@<some_url>.windows.net/<other-path>。此 PR 会从路径中去掉 bucket。#100583 (Konstantin Vedernikov) 。 - 修复了在某些块中默认列为 const 时,transform 中的类型不匹配异常。关闭了 #100574。#100616 (Pavel Kruglov) 。
- 修复了以下 NOT_FOUND_COLUMN_IN_BLOCK 情况:projection 的 SELECT 部分包含查询原始 SELECT 部分中不存在的列。关闭 #100194。#100623 (Yarik Briukhovetskyi) 。
- 根据文件大小和溢出限制校验 Npy 格式的形状维度,以防止恶意构造、维度大得不合理的
.npy文件导致拒绝服务。同时还会拒绝空形状,并将每行内存限制在 2 GiB。#100625 (Raúl Marín). - 修复了在异步插入 (TCP) 以及所有通过 HTTP 进行的插入中解析
DateTime值时忽略session_timezone的问题。#100647 (Sema Checherinda) 。 - 当使用表函数作为 source 时,允许向
cluster()和clusterAllReplicas()表函数传递 sharding key (例如cluster('name', view(...), sharding_key)) 。#100665 (Sergey Veletskiy) 。 - 修复使用带有 Array 组合器和 NULL 参数的参数化聚合函数时导致的服务端崩溃 (断言失败) 问题,例如
quantileIfArrayArray(0.5)([[NULL]], [[1]])。#100679 (nerve-bot) 。 - 修复在启用
use_variant_as_common_type时,计算空元组和非空元组的共同超类型时出现的异常。#100699 (Antonio Andelic) 。 - 当配置了 Azure Blob 存储 disk,但端点暂时无法访问 (例如 DNS 故障) 时,服务器不再启动失败。#100701 (Raúl Marín) 。
- 修复了
positiveModulo中的未定义行为:当无符号除数超出有符号结果类型的表示范围时,会出现该问题。#100705 (Raúl Marín). - 修复了在启用
use_top_k_dynamic_filtering且ORDER BY列为Dynamic或Variant类型时发生的服务器崩溃问题 (逻辑错误“来自 __topKFilter 的返回类型异常”) 。#100742 (Groene AI) 。 - 修复在包含 LowCardinality 元素的 Tuple 键上,结合 PREWHERE/WHERE 使用
has()函数时导致的 server 崩溃问题。#100760 (Groene AI) 。 - 修复在存在并发写入时,从 S3 对象存储上的
Log或StripeLog表读取数据时出现的file_offset_of_buffer_end <= getFileSize()断言失败问题 (会在调试构建中抛出异常) 。#100763 (Alexey Milovidov) 。 - 修复了一个异常:当 WHERE 子句在已启用统计信息的表中包含函数表达式 (例如
toDecimal64(col, 3)) 时,统计信息选择性估算器会触发该异常。现在,估算器会跳过此类谓词,而不再尝试进行无效的类型转换。#100764 (Han Fei) 。 - 修复了一个罕见问题:带重排序的 join 可能产生错误结果。#100790 (Yarik Briukhovetskyi) 。
- 修复了优化后的简单 count 中
AggregateFunction参数类型错误的问题;此前,在分布式表上查询诸如count(v0 + v1)之类的表达式时,会触发NUMBER_OF_ARGUMENTS_DOESNT_MATCH异常。#100794 (YjyJeff). - 某些目录可能会在
select * from system.databases查询结果的SETTINGS部分暴露一些敏感信息。此 PR 可防止这种情况发生。#100800 (Konstantin Vedernikov). - 修复了
toStartOfInterval在使用 Week、Quarter 或 Year 时间间隔、指定 origin 参数且时间间隔值极端时出现的未定义行为 (有符号整数溢出) 。 #100817 (Raúl Marín). - 修复了
If、Distinct、DistinctIf、IfState聚合函数组合器在返回类型为Tuple且一个或多个参数为Nullable时,因引入Nullable(Tuple)而无法读取旧版已序列化状态的问题。关闭了 #98917。#100826 (Nihal Z. Miaji) 。 - 修复了因连接池释放后仍被使用而导致的 s3Cluster 和分布式查询段错误。#100837 (Konstantin Bogdanov) 。
- 修复服务器关闭期间加载字典时,因空指针解引用而导致的 segfault。
Context::getUserDefinedSQLObjectsStorage(会解引用user_defined_sql_objects_storage) 会被字典线程并发调用,而此时主线程会调用Context::shutdown(将user_defined_sql_objects_storage设为 null) 。我们需要确保在执行Context::shutdown之前,先在字典加载器中禁用后续更新、终止当前正在运行的字典查询,并等待字典加载线程结束。做法与普通查询类似。#100839 (Miсhael Stetsyuk) 。 - 修复了
ULIDStringToDateTime在输入包含非 ASCII 字节时发生的缓冲区溢出问题。#100843 (Konstantin Bogdanov). - 修复了在启用
distributed_group_by_no_merge=1时,查询封装多个表 (包括Distributed表) 的Merge表 (或merge()表函数) 时发生的崩溃 (LOGICAL_ERROR) 问题。#100859 (Groene AI). - 启用 Cast_keep_nullable 后,将 dynamic null 转换为 variant 时不会抛出异常。#100864 (Seva Potapov) 。
- 修复了
clickhouse-keeper-client的get、exists和ls命令将重复的watch_id错误消息输出到 stdout 而非 stderr 的问题。#100893 (Mohammad Lareb Zafar). - 修复了
intDiv/intDivOrZero在 Nullable Tuple 数组上抛出的异常,例如SELECT intDiv([divide((1, 2), ... AND NULL)], 2). #100895 (Raúl Marín). - 在存储
StorageAlias的定义之前,先对其引擎参数进行求值,这样像currentDatabase()这样的表达式在保存到数据库前就会被解析为字面量。#100902 (Nikolay Degterinsky). - 修复在
query_plan_merge_expressions = 0且ExpressionStep直接位于ReadFromMergeTree之上时,processAndOptimizeTextIndexFunctions的问题。修复了 #100879。#100909 (Jimmy Aguilar Mena) 。 - 更新 replxx,纳入对 do_complete_line 中越界访问问题的修复。#100925 (Azat Khuzhin) 。
- 修复了启用 shard-by-PK 优化的 JOIN 在使用查询条件缓存、且部分 parts 被缓存条件过滤掉时会返回错误结果的问题。 #100926 (Groene AI).
- 修复了在某些情况下,
divide和intDiv在索引分析期间用于过滤表达式时返回ILLEGAL_DIVISION的问题。#100928 (Nihal Z. Miaji) 。 - 修复了异步启动期间因启动依赖顺序错误,导致带内部表的 materialized view 出现“目标表不存在”错误的问题。 #100946 (Nikolay Degterinsky).
- 修复了
parseDateTimeBestEffort在解析小数秒超过 18 位的日期时间字符串时出现的未定义行为 (有符号整数溢出) 。#100948 (Vasily Chekalkin) 。 - 修复了这样一种崩溃:使用文本搜索索引时,如果
IN子句包含 Tuple 子查询,例如WHERE (id, str) IN (SELECT (id, str) FROM ...),或者子查询中的列数与IN左侧元组中的列数不一致,就会触发该问题。#100959 (Anton Popov). - 修复了从使用稀疏列序列化的
MergeTree表构建 Polygon 字典时的崩溃问题。#100964 (Anton Popov). - 修复将
INTERSECT ALL/UNION ALL与常量折叠表达式一起使用时出现的逻辑错误 “Invalid action query tree node”。#100977 (Alexey Milovidov) 。 - 修复了
sumCountOrDefault聚合函数的一个问题:在引入Nullable(Tuple)后,当存在一个或多个Nullable参数时,无法读取旧版序列化状态。关闭 #100882。#101021 (Nihal Z. Miaji). - 修复了合并算法中的崩溃问题 (
Logical error: isConst/isSparse/isReplicated assertTypeEquality) :当惰性列复制 (enable_lazy_columns_replication) 生成的ColumnReplicated列流入归并排序管道,且部分输入延迟到达时,会触发该问题。#101036 (Groene AI). - 修复了在
SELECT中同一别名用于多个表达式时误报UNKNOWN_IDENTIFIER错误的问题;现在会正确报告MULTIPLE_EXPRESSIONS_FOR_ALIAS错误。#101040 (Alexey Milovidov) 。 - 修复了这样一个问题:当声明的时区与表达式中的时区不一致时,
DateTime/DateTime64类型的 ALIAS 列不会应用时区转换。#101043 (Alexey Milovidov) 。 - 修复了
query_log未记录视图、子查询和INSERT ... SELECT所涉及行策略的问题。尽管行策略在查询计划阶段已生效,但此前不会为了记录日志而从子规划器传递到父规划器。现在,行策略 (仅用于日志记录) 会保存在QueryAccessInfo中,以便规划器和子规划器都能对其进行填充。#101044 (Narasimha Pakeer). - 修复
DirectJoinMergeTreeEntity中的异常:当管道块包含ColumnConst列,且与普通列合并时,会触发该异常。#101046 (Alexey Milovidov). - 修复 CTE 列别名格式中的多余空格 (
WITH t (a, b)→WITH t(a, b)) 。#101049 (Alexey Milovidov). - 修复启用 analyzer 时,
remote/cluster表函数与merge等嵌套表函数一起使用时失败的问题。#101055 (Alexey Milovidov). - 修复了在
prefer_localhost_replica=1时,分布式查询中OFFSET被重复应用两次、导致返回行数少于预期的问题。#101071 (Nihal Z. Miaji). - 修复了在
format_regexp设置中使用无效正则表达式时,使用Regexp格式会导致崩溃的问题。 #101074 (Nihal Z. Miaji). - 修复在并行副本场景下使用
serialize_query_plan=1时,timeseries 聚合函数报出“Illegal type Decimal64 of start parameter”错误的问题。#101083 (Groene AI). - 修复了在带有 PREWHERE 的投影配合
ORDER BY ... LIMIT使用时,optimizeLazyMaterialization中出现的异常。#101115 (Anton Popov) 。 - 修复了在启用
aggregate_functions_null_for_empty = 1设置时,使用仅限内部使用的Null组合器 (例如sumNull、avgNull) 的聚合函数会导致服务器崩溃 (SIGABRT) 的问题。#101147 (Groene AI). - 修复了文件系统缓存写入路径中的一个释放后使用问题;该问题可能会在为已完成的 File 段记录日志时导致从已释放的内存中读取 (由 BuzzHouse 中的 MemorySanitizer 检测到) 。#101161 (Groene AI) 。
- 修复了以下服务器崩溃问题:当分布式索引分析遇到一个 GLOBAL IN 谓词,且其集合是在未显式指定元素的情况下构建时,会触发 “Trying to attach external table to a ready set without explicit elements”。#101178 (Groene AI).
- 修复了在启用 JIT 编译时 (达到编译阈值后) ,
Decimal列上的MAX/MIN聚合函数返回错误结果的问题。#101203 (Raúl Marín). - 修复以下问题:执行轻量级删除后,
minmax_count_projection和简单的COUNT(*)优化会被永久禁用,即使所有带有轻量级删除掩码的 parts 都已合并消除。#101212 (Anton Popov). - 修复了一种情况:远程对象在
list与read之间被覆盖时,先前会产生过期的对象元数据,从而导致缓存报出Having zero bytes, ...逻辑错误。#101219 (Kseniia Sumarokova). - 修复了查询带有
ORDER BY CAST(lc_column, 'Type')的 MergeTree 表时的服务器崩溃问题 (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) ,其中lc_column的类型为 LowCardinality。#101220 (Groene AI). - 修复
S3Queue中失效处理节点的清理问题。#101230 (Kseniia Sumarokova) 。 - 修复了当
optimizations参数无效时mergeTreeAnalyzeIndexes()中的 UB 问题。 #101253 (Azat Khuzhin). - 修复在分区 Iceberg 表上连续执行
ALTER TABLE UPDATE时出现的Logical error: 'partitions_count > 0'异常。#101278 (Desel72). - 修复了在 MergeTree 表中,当大整数常量 (例如 256、2147483648) 在带有 AND 的 WHERE 子句中作为布尔谓词使用时导致查询结果错误的问题。例如,
SELECT count() FROM t WHERE (2147483648 > b) AND 2147483648之前会错误地返回 0,而不是匹配所有行。#101287 (Groene AI). - 修复在使用 Replicated MergeTree 的 Delta Lake 集群上执行 insert-select 时出现的问题。#101299 (Konstantin Vedernikov) 。
- 修复了以下崩溃问题:当标量子查询引用一系列存在依赖关系的 materialized CTE 时,会出现“逻辑错误:在 materialized CTE 完成物化之前读取它”。#101305 (Groene AI) 。
- 修复
IStorage::getDependentViewsByColumn中storage_id的数据竞争问题。#101385 (Nikolay Degterinsky) 。 - 修复 BACKUP FROM SNAPSHOT AST 的格式化和克隆相关问题。#101405 (Pablo Marcos) 。
- 修复在启用
enforce_keeper_component_tracking时查询system.part_moves_between_shards会触发 LOGICAL_ERROR 崩溃,并显示 “Current component is empty” 的问题。#101462 (Groene AI) 。 - 修复了在 fuzzer 生成格式错误的 Dynamic 类型 AST 时,DataTypeDynamic::create() 中出现的段错误。 #101464 (Groene AI).
- 在未启用 DeltaKernel 的情况下使用
delta_lake_snapshot_version或 CDF 版本设置时,将抛出错误,而不是悄然返回错误数据。#101489 (Desel72). - 修复了在启用
analyzer_compatibility_join_using_top_level_identifier设置时,同时使用 ARRAY JOIN 和 JOIN USING 会触发的NOT_FOUND_COLUMN_IN_BLOCK异常。关闭 #101240。#101507 (Vladimir Cherkasov) 。 - 修复了以下问题:当表使用
iceberg_metadata_file_path创建且目标元数据版本已存在时,Iceberg INSERT 重试循环会失败。#101548 (Groene AI) 。 - 在 arrayIntersect 及相关函数的结果列中去除 Nullable,以避免序列化/反序列化不一致。#101569 (George Larionov) 。
- 修复从基于 IcebergLocal 表引擎的 materialized view 执行 SELECT 时服务器崩溃 (LOGICAL_ERROR) 的问题。#101577 (Groene AI) 。
- 修复了使用 NaN 参数调用
intExp10时错误消息有误的问题——原本显示为intExp2,而不是intExp10。#101582 (Krishna Chaitanya) 。 - 修复了在 #100288 重构后,
allow_statistics=0无法阻止ALTER TABLE ADD STATISTICS和ALTER TABLE DROP STATISTICS的问题。#101585 (Krishna Chaitanya) 。 - 修复
KeeperMapCREATE TABLE在处理 25.1 之前部分 drop 操作遗留的 ZooKeeper 节点时,若缺少drop_lock_version节点,会因“无法为表创建元数据”而失败的问题。#101623 (Antonio Andelic) 。 - 修复了读取 Map 子列时可能出现的逻辑错误。关闭了 #100769。关闭了 #101336。#101641 (Pavel Kruglov).
- 修复
getSubcolumnData中精确子列匹配的优先级,使其高于前缀匹配,以避免可能发生的崩溃。关闭 #101271。#101645 (Pavel Kruglov) 。 - 修复了在禁用
use_variant_default_implementation_for_comparisons时,将LowCardinality列与VariantNULL 常量比较时发生的崩溃问题 (LOGICAL_ERROR: “ColumnUnique 不能包含 null 值”) 。#101690 (Groene AI). - 内容:为 Bzip2ReadBuffer 增加了空 stream 保护,因此当内部 stream 为空时,将返回 EOF,而不是抛出 UNEXPECTED_END_OF_FILE。 #101691 (ClickGap AI Bot) 。
- 内容:修正了
system.s3_queue_settings和system.azure_queue_settings中alterable列说明文本前后颠倒的问题——将0和1的含义对调,使其与实际代码行为一致。#101703 (ClickGap AI Bot) 。 - 修复 positiveModulo(tuple, number) 被错误分派到除法而非取模运算的问题。#101709 (ClickGap AI Bot) 。
- 修复了在经缓存封装的 disk 上配置
thread_pool_size时发生的 crash。此前,FileCacheSettings::loadFromConfig()会将thread_pool_size识别为未知设置,从而导致 server 无法启动。该设置是一个有效的IDiskparameter,用于控制在后台分片 moves 过程中执行 disk 间复制操作时使用的线程数量。#101712 (Francisco). - 修复了
RANGE_HASHED字典创建时静默接受不存在的MAX范围属性,以及在最小和最大范围属性类型不一致时使用错误类型配置的问题。该 bug 源于buildRangeConfiguration中的一处复制粘贴错误:查找最大属性时误用了min_attr_name,而不是max_attr_name。#101732 (Yakov Olkhovskiy) 。 - 修复 CPU 租约调度器中的 use-after-free 崩溃:当等待计时器的生命周期长于其引用的
ProfileEvents::Counters所属工作线程时,会触发该问题。#101761 (Antonio Andelic). - 修复了 arrayLevenshteinDistanceWeighted 和 arraySimilarity 函数中的错误。已关闭 #101725。#101767 (Mikhail f. Shiryaev) 。
- 修复了 Prometheus 查询 API 忽略 POST 表单请求体的问题。#101794 (James Cunningham) 。
- 修复因 S3
Client::~Client析构函数中的异常逸出而导致服务器终止的问题。#101798 (Gagan Dhakrey) 。 - 修复了在并行反序列化
Object类型动态路径时的 use-after-scope 问题;读取包含大量动态路径的表时,该问题可能导致崩溃。 #101823 (Antonio Andelic). - 修复了在某些 (非默认) 格式设置下,函数
formatDateTime使用格式说明符%W时输出错误的问题。#101847 (Robert Schulze) 。 - 修复了
SYSTEM INSTRUMENT ADD中shouldPatchFunction的假阴性问题:当搜索字符串首次出现在经反修饰的符号名的模板参数中时,会出现该问题。#101885 (Pablo Marcos). - 修复在周期性刷新期间因 ZooKeeper 会话过期导致 UDF registry 丢失的问题——在完全刷新成功之前,所有用户自定义函数都可能无法使用。#101891 (Nikita Fomichev).
- 修正了
system.codecs中AES_256_GCM_SIV的描述,将其显示为AES-256而非AES-128。#101917 (Jimmy Aguilar Mena) 。 - 修复了在 JSON 列上创建的 min-max 索引因使用错误极值而导致查询结果错误的问题。关闭 #101700。#101918 (Pavel Kruglov).
splitByString分词器现在会拒绝空字符串分隔符。#101928 (Robert Schulze) 。- 修复了
materialize_skip_indexes_on_merge=false在合并期间未能禁止构建文本 (全文) 索引的问题。此前,只有非文本跳过索引 (minmax、set、bloom_filter) 会被禁止构建;文本索引仍会继续构建,造成 CPU 和 I/O 浪费。#101932 (Groene AI) 。 sparseGrams分词器生成的标记长度超过了指定的最大长度 (原因是实现中将+2硬编码了进去) 。#101934 (Elmi Ahmadov) 。- 修复
MergeTreeDataPartWriterWide::cancel中的 SIGSEGV:当流构造函数在addStreams期间抛出异常时,column_streams中会留下一个空条目。#101936 (Antonio Andelic) 。 - 修复了在启用
query_plan_direct_read_from_text_index时,查询带有全文索引的 Merge 或 Distributed 表且组合过滤条件中同时混用has*Tokens和 LIKE 时出现的异常。#101939 (Jimmy Aguilar Mena). - 修复了解析原生协议查询数据包时,
QueryProcessingStage值无效所导致的未定义行为。#101972 (Raúl Marín). - 当初始查询解析期间发生异常时,会关闭 TCP 连接,以防止从失去同步的流中读取无效数据。#101989 (Raúl Marín) 。
- 修复 26.1+ 版本中文件系统缓存的 SLRU 竞争问题,该问题可能导致空间预留逻辑错误。在调试构建中,还可能触发断言失败:
'Previous state is Evicting, but expected state to be Active while setting Evicting flag for 2c1e3484ecdc6b78a8978fa5b17c5097:0:339 (state: Evicting)'.。#101991 (Kseniia Sumarokova) 。 - 修复了将带有尾随数据的字符串转换为空
Tuple()类型时触发的异常。 #102011 (Alexey Milovidov). - 修复了在使用 ORDER BY 和 grace_hash join 算法的查询中,行顺序不正确的问题。受影响的查询可能会以错误顺序返回结果,从而在无任何提示的情况下产生错误输出。#102036 (János Benjamin Antal).
- 修复了一个 LOGICAL ERROR (索引类型大小异常) 问题:配置了
max_bytes_in_join设置时,RIGHT JOIN 和 FULL JOIN 查询中可能会出现该错误。#102042 (Jimmy Aguilar Mena) 。 - 修复了
Time包含负值时与日期时间比较会返回错误结果的问题。关闭了 #101670。#102056 (Yarik Briukhovetskyi) 。 - 修复了 UDF refresh 中的崩溃问题:
ZooKeeperRetriesControl在未续订已失效 (expired) 的 ZooKeeper 会话时进行了 retry,因而导致崩溃。#102059 (Nikita Fomichev). - 修复格式化解锁快照时空格缺失的问题。关闭 https://github.com/clickhouse/clickhouse/issues/101723。 #102063 (Han Fei) 。
- 修复查询带有 WHERE 子句的视图时发生的崩溃 (SIGSEGV) 问题:当内部查询生成的列类型与视图元数据不一致时 (例如,启用
join_use_nulls的 LEFT JOIN 产生的 Nullable) ,会触发该问题。#102085 (Miсhael Stetsyuk). - 修复了因缓存键不匹配,移除分片后
VectorSimilarityIndexCache缓存项始终无法被淘汰的问题。 #102152 (Seva Potapov). - 使用 rabbitmq 存储时,对损坏消息进行 NACK。 #102157 (Seva Potapov).
- 修复在解析错误的空元组字符串时的逻辑错误。#102289 (Nihal Z. Miaji) 。
- 修复了在使用
optimize_aggregation_in_order=1时,若 GROUP BY 列的顺序与表的排序键不同,会导致聚合结果错误 (出现重复行) 的问题。#102299 (Groene AI). - 修复了在使用 Avro 格式时,
IcebergLocalALTER TABLE ... UPDATE发生崩溃的问题,原因是LowCardinality/Nullable包装类型在序列化前未先解包。#102337 (Desel72). - 修复了在对不带表达式的 materialized 列执行变更时发生的段错误。关闭了 #102185。#102342 (zoomxi) 。
- 修复了 Coalescing merge tree 对 Array 类型的处理问题。此更改关闭了 #89509。#102384 (Konstantin Vedernikov) 。
- 修复了在启用 bloom filter 下推、且
WHERE 子句包含等值/不等条件时读取 Parquet 文件会触发 segfault (或在调试构建中触发 LOGICAL_ERROR) 的问题。该崩溃是由 Parquet 预取器拉取 bloom filter 数据时发生越界内存访问导致的,还可能造成非确定性的错误查询结果。#102385 (Groene AI). - 修复了 SLRU 文件系统缓存动态调整大小期间发生的
LOGICAL_ERROR异常中止问题;其原因是子队列之间共享了淘汰统计信息,以及对失败候选项采用了错误的恢复路径。#102396 (Antonio Andelic). - 修复了 Database Replicated 中不带目标表的别名表在新副本上初始化失败的问题。关闭 #101320。#102397 (Nikolay Degterinsky) 。
- 修复了在字符串搜索函数 (
countSubstrings、position等) 中,搜索由 null byte 完全构成的 needle 时发生的越界读取问题。#102401 (Raúl Marín). - 当
compatibility设置指向早于 26.1 的版本时,全文索引设置 (enable_full_text_index、allow_experimental_full_text_index、use_skip_indexes_on_data_read) 将不再被禁用。此前,这可能会导致SharedDatabaseCatalog无法创建带有文本索引的表。#102422 (Nikita Fomichev) 。 - 修复
printf在末尾带有%时发生的越界读取问题。#102472 (Raúl Marín) 。 - 修复了 AsynchronousMetrics 中调试构建里的一个 chassert 异常
ReadBuffer is canceled,其原因是 rewind 没有重置缓冲区的取消标志。 #102524 (Yuri Fedoseev). - 修复了在带有文本索引的列上,
hasToken/hasTokenOrNull处理仅由分隔符组成的 needle (例如'()'、'!!!') 时的问题:此前,索引会悄然跳过所有粒度,而不是抛出BAD_ARGUMENTS(对hasToken而言) 或返回NULL(对hasTokenOrNull而言) 。#102544 (Jimmy Aguilar Mena) 。 - 修复 keeper 中超大 multi 请求导致的 OOM。对于 OpenTelemetry tracing,我们此前会在
ZooKeeperRequest对象中无条件为 OpenTelemetry spans 分配 >1 KiB 的空间——这意味着,对于特别大的 multi 请求,可能会额外尝试分配 >10 GiB 的内存。为解决这一问题,我们现在将 shared data 保存在静态内存中,并在ZooKeeperOpentelemetrySpans中使用std::unique_ptr替代std::optional。#102586 (Miсhael Stetsyuk) 。 - 修复了以下问题:对现有 collection 执行
CREATE NAMED COLLECTION IF NOT EXISTS时,会导致NamedCollection的 CurrentMetric 被错误抬高;此外,从配置或 SQL 存储加载的 collection 在启动时不会被初始化。关闭 #102507。#102598 (Pablo Marcos) 。 - 修复了在并发 DDL 导致本地分片返回空列时,
getStructureOfRemoteTable中抛出的异常。#102604 (Alexey Milovidov) 。 - 修复了多个并发
CREATE TABLE IF NOT EXISTS查询针对同一个 Shared database 上的S3Queue表时触发的LOGICAL_ERROR异常。#102610 (Nikita Taranov). - 修复了在使用 WHERE 过滤器读取 Nullable 列时,原生 Parquet V3 读取器中出现的 LOGICAL_ERROR 崩溃问题:“列子块中的行数异常”。#102628 (Groene AI) 。
- 修复了
AzureWriteMicrosecondsprofile 事件描述中将 “write” 误写成 “read” 的问题。#102639 (Miсhael Stetsyuk). - 修复了在某些特殊情况下 row policy 会触发 ‘Not found column in block’ 异常的问题。#102648 (Yarik Briukhovetskyi) 。
- 修复了 ClusterDiscovery 中的一个服务端异常:当静态集群 (在 config 中定义) 暂时没有存活节点时,会触发该异常。#102661 (Kseniia Sumarokova) 。
- 修复了时区调整后发生溢出时日期数据类型推断错误的问题。关闭 #102601。#102674 (Pavel Kruglov).
- 修复了在等待过程中删除可刷新materialized view 时,
SYSTEM WAIT VIEW会一直挂起的问题。#102681 (Nikolay Degterinsky). - 修复了 CASE 搭配 Dynamic 表达式时对所有行都返回 ELSE 的问题。关闭 #102511。#102684 (Pavel Kruglov) 。
- 修复了使用二进制编码数据类型时,扁平化 Dynamic 类型的序列化问题。关闭了 #101911。#102692 (Pavel Kruglov).
- 修复了 format_schema_source=‘query’ 静默忽略多行结果的问题。关闭 #101905。#102698 (Pavel Kruglov) 。
- 通过 SSH 客户端报告实际退出码,而不是将所有错误统一映射为
1。关闭 #101741。#102700 (Konstantin Bogdanov) 。 - 修复动态/预定义查询处理程序中 HTTP 请求头丢失的问题。关闭 #101846。#102706 (Konstantin Bogdanov) 。
- 对折叠后的 jemalloc 堆内存剖析应用泊松采样校正,使其与 jeprof 的输出一致。此前,折叠格式由于未计入采样概率,低估了实际分配大小。#102759 (Antonio Andelic).
- 修复了函数
hasPhrase在参数为NULL时发生崩溃的问题。#102802 (Nikita Taranov) 。 - 修复了在读取包含循环符号类型引用的递归 schema 的 Avro 文件时 server 发生崩溃 (SIGSEGV) 的问题。现在会检测并拒绝此类 schema,并返回清晰的错误消息,而不是直接崩溃。#102853 (Groene AI).
- 修复服务器崩溃问题 (
LOGICAL_ERROR断言) :当Variant列上的函数在FunctionVariantAdaptor中对结果进行类型转换时触发内存限制或其他非类型转换异常,异常现在会被正确传播,而不再被误归类为内部错误。#102855 (Groene AI). - 修复了在调试/sanitizer 构建中,若在 schema 推断期间抛出
std::length_error(例如由于input_format_msgpack_number_of_columns值极端或输入数据格式错误) ,导致服务器崩溃的问题。#102859 (Groene AI) 。 - 使复制列和稀疏列在序列化时的 null 表示遵循相关设置 (例如 format_tsv_null_representation) 。#102888 (Hechem Selmi) 。
- 已在 #103499 中回移:修复了这样一个问题:由于 Poco
BufferedStreamBuf::flushBuffer未处理来自套接字层的短写,导致 S3 请求失败且不会重试,而是报出ios_base::clear: unspecified iostream_category error。#102894 (Sema Checherinda) 。 - 修复了这样一个问题:执行轻量级删除后,
minmax_count_projection和简单的COUNT(*)优化会被永久禁用,即使所有带有轻量级删除掩码的 parts 都已合并掉,也不会恢复。#102900 (Anton Popov). - 修复了因 LTO 导致的 jemalloc 随机崩溃问题。#102913 (Azat Khuzhin) 。
- 在新的 analyzer 中,将行策略中的 OR 链优化为 IN。 #102915 (Azat Khuzhin).
- 修复了因 page cache 以错误对齐方式释放内存而导致的 jemalloc metadata 损坏问题,该问题可能会引发 crash。#102918 (Azat Khuzhin) 。
- 不带 materialized views 的普通 INSERTs 不再会请求过多的 ConcurrencyControl 槽位和线程 (使用
max_threads而不是max_insert_threads) ,从而避免在高 INSERT 吞吐量的集群上出现 CC 槽位饥饿和线程数暴涨。#102961 (Sema Checherinda) 。 - 重新引入 ArrowMemoryPool,以便在达到内存限制时抛出 MEMORY_LIMIT_EXCEEDED,从而避免内核 OOM。 #102999 (Azat Khuzhin).
- 修复了将
CAST转换为Nullable(DateTime)时忽略cast_string_to_date_time_mode的问题。关闭 #101840。#103035 (Pavel Kruglov). - 文本索引直接读取优化现已支持
ALIAS列。#103037 (Anton Popov) 。 - 已在 #103454 中回移:修复了以下问题:当聚合投影与查询匹配,且表中的某些 parts 没有投影数据时,
SELECT DISTINCT会在无提示的情况下返回不完整的结果 (例如,在已包含数据的表上添加了该投影,但未运行MATERIALIZE PROJECTION) 。关闭 #102951。#103052 (Nihal Z. Miaji) 。 - 修复了在
MergeTree表上使用WHERE x AND toNullable(N)时返回错误结果的问题:当N是位宽大于UInt8的整数 (例如256、65535、2147483648或任何负整数) 时,就会出现该问题。由于splitFilterNodeForAllowedInputs在将化简后AND的Nullable余项转换为布尔值时错误地使用了NULL作为零值,导致在三值逻辑下比较结果变为NULL,从而错误地丢弃了所有行。#103077 (Groene AI). - 修复了字符串搜索函数 (例如
locate、position) 在参数顺序颠倒传递时 (locate(needle, haystack)且function_locate_has_mysql_compatible_argument_order = 1) ,在错误消息中报告错误参数类型的问题。#103102 (Alex Kuleshov). - 修复了这样一个问题:当 failpoint 处没有线程暂停时调用 disableFailPoint,可能导致 waitForPause 一直挂起。 #103119 (Shaohua Wang).
- 将预认证 TCP Hello 数据包中的字符串大小限制为 64 KB,并新增
handshake_timeout_milliseconds服务器级设置,用于限制握手总时长,防止未认证客户端占用过多内存或无限期占用线程。#103284 (Sema Checherinda) 。 - 修复 Parquet ColumnIndex 统计信息中 String 列出现 min_value > max_value 的问题。#103334 (Saurabh Kumar Ojha) 。
- 检查 Native 格式中格式不正确的扁平化 Dynamic 数据。#103392 (Pavel Kruglov) 。
- 支持从
url表函数填充_time列。#103437 (Nikita Taranov) 。 - 修复了在 SVE 指令不可用时仍用其进行检测的问题。 #103568 (Raúl Marín).
构建/测试/打包改进
- Libstemmer (Snowball) 依赖现已升级到较新的 v3.0.1 版本。#99256 (Jimmy Aguilar Mena) 。
- 在 clickhouse-test 中将以下设置随机化:
use_skip_indexes_for_top_k、use_top_k_dynamic_filtering、query_plan_max_limit_for_top_k_optimization。#91782 (Nikita Fomichev) 。 - 为函数实现了压力测试,用于检查其各项属性的健全性。#93543 (Michael Kolupaev) 。
- 为
llvm-project提供自有的 CMake 配置,而不是导入上游配置。#97453 (Konstantin Bogdanov) 。 - 在测试基础设施中对更多
optimize_*设置进行随机化,以提升查询优化各个 pass 的覆盖率。#97547 (Alexey Milovidov) 。 - 使用 Rust 工具链 nightly-2026-03-22。#98602 (Konstantin Bogdanov) 。
- 采用
wasmtimev42.0.1。#98603 (Konstantin Bogdanov) 。 - 改用
llvm-project22.1.1。#98882 (Konstantin Bogdanov) 。 - 将用于夜间按测试统计覆盖率的
SANITIZE_COVERAGE(自定义 sanitizer 回调、符号级粒度) 替换为基于 LLVM 源代码的覆盖率 (WITH_COVERAGE,-fprofile-instr-generate -fcoverage-mapping) 。现在,server 会在启动时从 ELF 段中读取自身的覆盖率映射,并通过新的SYSTEM SET COVERAGE TEST 'name'命令为每个测试收集(file, line_start, line_end)元组。定向 CI check 中的测试选择会针对新的checks_coverage_linesCIDB 表执行行范围查询,并按候选测试覆盖的变更 diff 行数进行排序。#99513 (Nikita Fomichev). - 修复了 -O0 构建中的 llvm-libc 链接错误。#100023 (Zheguang Zhao) 。
- 修复了容器启动时的两条错误消息:当配置中未包含
logger.log和logger.errorlog设置时 (例如,所有日志消息都应输出到 STDOUT/STDERR 的情况下) 。#100239 (Simon) 。 - 在 macOS 构建中,优先使用
ld64.lld,而不是 Apple 的ld(cctools-port ld64) 。这应能显著缩短 Darwin 的链接时间,因为 cctools-port 的 ld64 在使用-ffunction-sections和-dead_strip时非常慢。如果ld64.lld不可用,则回退到ld。#100275 (Alexey Milovidov) 。 - 用于确保目录不会注册任何机密信息的测试 (REST + Glue) 。#100307 (Konstantin Vedernikov) 。
- 在不同的随机化设置下重复运行近期修改过的测试。#100385 (Alexey Milovidov) 。
- 在 CMake 中跟踪
#embed文件依赖项,并启用 ccache 的 depend 模式,以确保正确重建。#100411 (Alexey Milovidov) 。 - 为 TPC-H 查询新增正确性测试。#100580 (Raufs Dunamalijevs) 。
- 使用
aws-sdk-cpp1.11.771 版本。 #100582 (Konstantin Bogdanov). - 允许性能测试 XML 通过
file属性引用外部 SQL 查询文件及设置。#100747 (Raufs Dunamalijevs) 。 - 通过在
LowerUpperImpl.h中补充缺失的TargetSpecific.hinclude,修复了使用-march=x86-64-v4时的编译问题。#100932 (Alexey Milovidov) 。 - 通过在 cxxflags 中添加 —no-default-config,修复了 Gentoo 上的构建问题。#100973 (Isak Ellmer) 。
- 新增
utils/auto-bisect/——这是一个基于 shell 的二分定位框架,可下载预构建的 CI 二进制文件,并运行用户提供的测试脚本,以找出首次引入回归的提交,无需在本地 build。 #100989 (Nikita Fomichev). - 在 CMake 中默认禁用 ThinLTO,这样开发者的本地构建将不再隐式启用它。CI 的发布构建不受影响,因为它们会显式传递
-DENABLE_THINLTO=1。#101041 (Alexey Milovidov) 。 - 在性能测试中新增 TPC-DS SF1 基准测试。#101209 (Raufs Dunamalijevs) 。
- 新增了针对 MergeTree 轻量级删除的无状态测试,覆盖:
has_lightweight_delete标志的生命周期、启用optimize_trivial_count_query时COUNT(*)的正确性、MATERIALIZED/DEFAULT列的完整性、ReplicatedMergeTree标志的恢复、已删除行场景下的read_in_order、多次删除/合并循环、_row_exists列隐藏、多种谓词,以及ALTER DELETE的 RBAC 权限控制执行。#101792 (Nikita Fomichev) 。 - 现在,Distroless Docker 镜像已针对带标签的发行版提供 ubuntu 和 alpine 两种变体。#101941 (Rahul Nair).
- 堆栈跟踪现在会显示干净的纯相对路径 (例如
src/Common/Exception.cpp) ,而不再是夹杂构建目录的路径 (例如./ci/tmp/fast_build/./src/Common/Exception.cpp) 。#102000 (Raúl Marín) 。 - 新增一项 CI 风格检查,禁止将大于 5 MB 的文件提交到仓库,并为现有的合法测试数据设置白名单。移除未使用的 14 MB
zookeeper_log.parquet。#102080 (Raúl Marín) 。 - 从头文件中移除约 400 条未使用的
#include指令,以缩短编译耗时。#102585 (Raúl Marín) 。 - 使用
wasmtimev43.0.1。 #102603 (Konstantin Bogdanov) 。 - 使用
openssl3.5.6。#102606 (Konstantin Bogdanov) 。 - 使用
xz5.8.3。 #102607 (Konstantin Bogdanov) 。 - 将 distroless Docker 镜像的基础从 Debian 12 (glibc 2.36、OpenSSL 3.0) 升级到 Debian 13 (glibc 2.41、OpenSSL 3.5) ,将 CVE 暴露面缩减至零可达漏洞。#101678 (Rahul Nair) 。
向后不兼容的变更
- 升级后再降级可能会导致数据丢失。数据类型的序列化版本现在会传播到嵌套数据类型中。例如,String 序列化版本
with_size_stream以前仅应用于顶层 String 列和 Tuple 元素;现在它会应用于任意嵌套类型中的任何 String 类型,例如Array/Map/Variant/JSON/等。此行为由 MergeTree settingpropagate_types_serialization_versions_to_nested_types控制,该设置现已默认启用。此变更后,新创建的数据分区片段将无法被旧版本读取,但旧的数据分区片段可以在新版本中正常读取。升级是安全的,但降级不是——如果你在升级到 26.3 后需要回滚,26.3 在包含嵌套类型的列中写入的数据将无法读取! 详情参见 #101429。#94859 (Pavel Kruglov) 。 - 移除
hypothesis跳过索引类型。它是一个较为冷门的 Experimental 功能,实际用途有限。现在,使用INDEX ... TYPE hypothesis创建表会报错。#96874 (Alexey Milovidov) 。 - 移除实验性的
detectProgrammingLanguage函数。#99567 (Alexey Milovidov) 。 - 修复
NOT运算符的优先级,使其符合 SQL 标准:NOT现在的结合优先级低于IS NULL、BETWEEN、LIKE和算术运算符。例如,NOT (x) IS NULL现在会被解析为NOT (x IS NULL),而不是(NOT x) IS NULL。这可能会改变依赖此前 (非标准) 行为的查询结果。#97680 (Alexey Milovidov). - 修复了普通投影的元数据,以便正确识别具有多列排序键的投影。基于 #90429。#91352 (Amos Bird) 。
- 修复了跳过索引文件未遵循 replace_long_file_name_to_hash 设置的问题;该问题会导致出现“File name too long”错误,并使长名称索引无法正常读取。现在,当跳过索引文件名超过 max_file_name_length 时,会像列文件一样对文件名进行哈希处理。此更改向后兼容 (新服务器可以读取旧 parts) ,但降级 (或在滚动升级期间使用旧服务器) 时,长名称索引可能会被忽略。#97128 (Raúl Marín).
- 默认启用异步插入。ClickHouse 现在默认会将所有小型插入按批次处理。此设置在 compatibility 中配置。如果你设置
compatibility=<version less than 26.2>,则默认值会恢复为之前的false。你可以在多个级别关闭/开启异步插入:在 users profiles 的 config 中、在 session 级别、在查询级别,或在 MergeTree 表级别。#97590 (Sema Checherinda). - 将
mysql_datatypes_support_level的默认值从空改为decimal,datetime64,date2Date32,默认启用将 MySQLDATE正确映射为Date32、将DECIMAL/NUMERIC映射为Decimal,以及将带精度的DATETIME/TIMESTAMP映射为DateTime64。此前,MySQLDATE列会映射为Date,而Date无法表示 1970-01-01 之前的日期,从而导致数据损坏。#97716 (Alexey Milovidov). mergeTreeAnalyzeIndexes{,UUID}现已接受分片名称数组而非 regexp,因为 regexp 较慢 (Experimental 功能) 。#98474 (Azat Khuzhin) 。- 将可执行 UDF 的默认
stderr_reaction从throw调整为log_last。对于向 stderr 写入警告的 UDF,只要退出码为 0,就不再报错。现在,退出码异常中会包含 stderr 的内容。#99232 (Xu Jia) 。
新特性
- 为 MergeTree 中的 Map 列新增了分桶序列化 (
map_serialization_version = 'with_buckets') 。键会按基于哈希的桶拆分,因此读取单个键 (m['key']) 时只需读取一个桶,而不必读取整个列;根据 Map 的大小不同,单键查找可获得 2-49 倍的加速。桶的数量以及分桶策略可通过新的 MergeTree 设置进行控制:map_serialization_version、max_buckets_in_map、map_buckets_strategy、map_buckets_coefficient和map_buckets_min_avg_size。#99200 (Pavel Kruglov) 。 - 支持 materialized CTE。允许在查询执行期间仅计算一次 CTE,并将结果存储在临时表中。关闭了 #53449。#94849 (Dmitry Novik) 。
- 出于兼容性考虑,允许某些符合 SQL 标准的函数省略括号使用,例如
NOW。关闭 #52102。#95949 (Aly Kafoury) 。 - 现在可以将自然排序键函数用作
naturalSortKey(s)。#90322 (Nazarii Piontko) 。 - 现在,JSONExtract 函数已支持使用原生 JSON/Object 作为输入。修复了 #88370。#96711 (Fisnik Kastrati) 。
- 如果某个查询参数的类型为
Nullable,且未指定该参数,我们将假定其值为NULL。#93869 (Vikash Kumar) 。 - 支持
Replicateddatabase 使用辅助 ZooKeeper。 #95590 (RinChanNOW). - 支持对 JSON 类型使用
has函数来检查路径是否存在,类似于 Map。#96927 (DQ). - 新增了
mergeTreeTextIndex(database, table, index)表函数,支持直接从文本索引中读取数据。该函数可用于查看内部信息,或基于文本索引数据执行聚合。#97003 (Anton Popov). - 新增
table_readonlyMergeTree setting,用于将表标记为只读,防止插入和修改。#97652 (Alexey Milovidov) 。 - 新增设置
use_partition_pruning及其别名use_partition_key。将其设为false可禁用基于分区键的分区裁剪。#97888 (Nihal Z. Miaji) 。 - 支持对 Iceberg 表执行
ALTER TABLE ... EXECUTE expire_snapshots('<timestamp>')。 #97904 (murphy-4o)。 #99130 - 允许
<protocols>中的每个type=http条目指定一个自定义<handlers>键,使其指向单独的<http_handlers_*>config 部分,从而可为每个端口启用不同的 HTTP 路由规则。#98414 (Amos Bird) 。 - 为
EXPLAIN新增pretty=1选项,以生成树状缩进输出;并新增compact=1,用于折叠Expression步骤,使查询计划更易读。#98500 (Kirill Kopnev) 。 - 新增
restore_access_entities_with_current_grants服务器设置。启用后,从 backups 中恢复的用户/roles,其授权将限制在执行 restoring 的用户有权授予的范围内 (与GRANT CURRENT GRANTS的语义相同) ,而不会因ACCESS_DENIED失败。#98795 (pufit). - 新增
caseFoldUTF8和removeDiacriticsUTF8函数,用于 Unicode 大小写折叠和去除变音符号。#98973 (George Larionov). - 新增
normalizeUTF8NFKCCasefold字符串函数,用于执行 NFKC_Casefold Unicode 规范化,即将 NFKC 规范化与大小写折叠结合起来。#99276 (George Larionov) 。 - 为全文索引和
tokens函数新增unicode_word分词器。它依据 Unicode 单词边界规则拆分文本:ASCII 单词可包含连接符字符 (下划线、冒号、点、单引号) ,而非 ASCII 的 Unicode 字符则会被拆分为单字符标记。注意:26.3 仅接受名为unicode_word的此分词器;在 26.4 中它被重命名为asciiCJK。#99357 (Amos Bird) 。 - 新增了
max_skip_unavailable_shards_num和max_skip_unavailable_shards_ratio设置,用于限制在启用skip_unavailable_shards时可静默跳过的分片数。如果不可用分片的数量或占比超过配置的阈值,则会抛出异常,而不是静默返回不完整的结果。#99369 (Alexey Milovidov). - 用户现在可以在子查询表达式中使用
SOME关键字,其行为与ANY完全一致。#99842 (Artem Kytkin). - 新增
output_format_trim_fixed_string设置,用于在文本输出格式中去除FixedString值末尾的 null 字节。#97558 (NeedmeFordev). - 支持在 FROM 子句中使用带括号的表 JOIN 表达式,例如
SELECT * FROM (t1 CROSS JOIN t2)。#97650 (Alexey Milovidov) 。 - 实现函数
toDaysInMonth:返回指定日期所在月份的天数。#99227 (Vitaly Baranov) 。
Experimental 功能
- 新增对基于 WebAssembly 的用户自定义函数 (UDF) 的实验性支持,允许使用 WebAssembly 实现自定义函数逻辑,并在 ClickHouse 内执行。特别感谢 Alexey Smirnov 贡献了 Wasmtime 后端支持。#88747 (Vladimir Cherkasov) 。另外,WASM UDF 支持也得到了持续改进。#99373 (Vasily Chekalkin) 。
- 新增通过
polyglot库支持外部 SQL 方言的功能。#99496 (Alexey Milovidov) 。 - 新增
ALP浮点压缩编解码器 (对于不可压缩的 double,不带 ALP_rd 回退机制) 。#91362 (Nazarii Piontko) 。 - 为
JSON列新增实验性的惰性类型提示。通过allow_experimental_json_lazy_type_hints启用后,ALTER TABLE ... MODIFY COLUMN json JSON(path TypeName)这类仅添加或修改类型提示的操作会立即完成,作为仅元数据操作执行,无需重写历史数据。对于旧 parts,类型提示会在查询时应用;在 INSERT 和后台 merges 期间则会被 materialized。#97412 (tanner-bruce) 。 - 启用从 YTsaurus table engine 进行并行读取。#97343 (MikhailBurdukov) 。
性能提升
- 提升数据湖性能。在早期版本中,从对象存储读取数据时,管道不会按处理线程数进行扩缩。这在多核机器上带来了数量级的性能提升 (约 40 倍) 。#99548 (Alexey Milovidov) 。
- 现在,
enable_parallel_replicas与automatic_parallel_replicas_mode之间的关系如下:只有当enable_parallel_replicas > 0时,查询才能使用并行副本。此外,如果automatic_parallel_replicas_mode=1,则是否使用并行副本会在规划阶段根据之前收集的统计信息来决定。如果automatic_parallel_replicas_mode=0,则所有受支持的查询都会使用并行副本,而不受任何统计信息影响。一个值得注意的例外是使用并行副本的 distributed insert-select:在这种情况下,查询始终会按automatic_parallel_replicas_mode=0的方式执行。#97517 (Nikita Taranov). - 当谓词中包含任意比较运算符 (
=,<,>,!=) ,且分区键外层套有确定性函数链时,可进行分区剪枝 (例如,PARTITION BY x,以及cityHash64(x) % 5 > 2、toYYYYMM(x) < 2026、toYYYYMM(x) = 2026或toYYYYMM(x) != 2026这样的谓词,都会利用分区键进行剪枝) 。关闭 #28800。#98432 (Nihal Z. Miaji) 。 - 当
CAST的目标类型为Nullable且转换具有单调性时,可启用按序读取优化和主键剪枝;例如,在PRIMARY KEY x的情况下,ClickHouse 可对ORDER BY x::Nullable(UInt64)使用按序读取优化,并对WHERE x::Nullable(UInt64) > 500000这类谓词应用主键剪枝。#98482 (Nihal Z. Miaji). - 当整型列与浮点数字面量比较时,现在支持索引裁剪和过滤器下推;例如,
WHERE x < 10.5这类谓词现在可以利用主键进行裁剪,而prime < 1e9或number < 1e5这类过滤器现在也可下推到primes()和numbers()表函数,而不再导致无界执行。关闭 #85167。#98516 (Nihal Z. Miaji) 。 - 新增了一个用于 Parquet 元数据的 SLRU 缓存,无需仅为读取元数据而重新下载文件,从而提升了读取性能。#98140 (Grant Holly).
- 支持根据优化器统计信息交换 ANTI、SEMI 和 FULL join 的左右两侧。#97498 (Hechem Selmi) 。
- 优化大型多边形场景下
pointInPolygon的粒度跳过,并修复pointInPolygon索引分析在主键剪枝期间抛出异常的问题。#91633 (Nihal Z. Miaji) 。 - 优化
levenshteinDistance函数的性能。#94543 (Joanna Hulboj) 。 - 通过避免对每个元素单独调用函数,优化批次 Decimal 类型转换。 #95923 (Konstantin Bogdanov).
- Iceberg 表现已支持通过
iceberg_metadata_async_prefetch_period_ms表设置异步预取元数据,该设置会定期预填充元数据缓存。此外,iceberg_metadata_staleness_ms查询设置允许 SELECT 查询在缓存元数据的新鲜度高于指定 staleness 时直接使用缓存,从而避免在请求处理期间调用 Iceberg catalog。#96191 (Arsen Muk). S3Queueordered 模式使用 S3 ListObjectsV2 StartAfter,以避免重新列出此前前缀下的全部历史对象,从而减少 ListObjects 调用。#96370 (Venkata Vineel ).- 降低插入去重的内存占用。通常,去重需要保留原始块,但对于同步插入,可以省略它,从而真正节省内存。#96661 (Sema Checherinda) 。
- 缓存行大小改为使用与架构相关的值,而不是硬编码为 64。#97357 (Nikita Taranov) 。
- 对文本索引字典的读取进行了小幅优化,提升了文本索引分析的整体性能。#97519 (Anton Popov).
- 提升 ARM 上 16 字节块的
LZ4解压缩速度。#97774 (Raúl Marín) 。 - 将分词重构为新的高性能接口,以替换旧的迭代器风格 API,从而支持 SIMD 和有状态分词器。属于 #90268 的一部分。#97871 (Amos Bird) 。
- 改进了对同时包含已建立文本索引列和未建立索引列的组合条件查询进行文本索引分析时的性能。此前,在这种情况下,索引分析过程中的提前退出优化会被错误地禁用。#98096 (Anton Popov).
- 提升包含会生成超长数组或 Map 的常量表达式的查询性能。#98287 (Alexey Milovidov).
- 修复了
DateTime64主键与整数常量比较时的键条件分析问题;此前会导致无法进行粒度剪枝。#98410 (Amos Bird). - 设置
optimize_syntax_fuse_functions默认处于启用状态。#98424 (Alexey Milovidov) 。 - 通过使用本地累加器,而不是按行经由聚合状态进行存储转发,优化了
avgWeighted聚合函数,对 Nullable 输入的性能最高可提升 27%。#98793 (Antonio Andelic) 。 - 在某些场景下,可提升并行窗口函数的性能并降低内存占用;对于含大型数组的
arrayFold工作负载也是如此。这还可以减轻缺页压力,并在内存限制较严时提高受影响查询的稳定性。#98892 (filimonov). - 优化有序合并性能。#99013 (Artem Zuikov) 。
- 优化了
INTERSECT ALL和EXCEPT ALL。#99097 (Raufs Dunamalijevs) 。 - 支持在逆序读取时使用
read_in_order_use_virtual_row优化。#99198 (Vladimir Cherkasov) 。 - 通过在写入前检查 JoinUsedFlags 是否已设置,减少
RIGHT和FULLJOIN 中的缓存争用。#99274 (Hechem Selmi). - 通过将浮点运算替换为纯整数运算,优化
PrefetchingHelper::calcPrefetchLookAhead,从而优化指令缓存布局,并减少聚合循环中的 CPU 周期开销。#99327 (Riyane El Qoqui) 。 - 通过将用于存储节点子节点的
absl::flat_hash_set替换为CompactChildrenSet,降低了 Keeper 的内存占用。新容器可将 0–1 个子节点以内联方式存储,无需堆分配,这覆盖了绝大多数 Keeper 节点。这样可将KeeperMemNode的大小从 144 字节缩减到 128 字节。#99860 (Antonio Andelic) 。 - 现已在视图中正确支持聚合投影。修复了 #32753。#88798 (Amos Bird) 。
- 支持在使用
join_use_nulls时将 OUTER JOIN 转换为 INNER JOIN 的优化。关闭 #90978。#95968 (Vladimir Cherkasov) 。 - 通过在读取前正确计算大小,优化了子列读取。这减少了内存占用,并加快了子列读取速度。#96251 (Pavel Kruglov).
- 让标记缓存、未压缩缓存和页缓存使用各自独立的 jemalloc arena,以避免将短生命周期的内存分配 (即查询和请求的内存分配) 与缓存的长生命周期内存分配混用时产生内存碎片。 #96812 (Seva Potapov). #98812. #99021
- 带有
DELETE TTL规则的表现在也可以使用纵向合并算法。#97332 (murphy-4o). - 在分布式索引分析中应用数据跳过索引。#97767 (Azat Khuzhin) 。
- 启用
prewarm_mark_cache设置后,次级索引的标记现会被预热 (即在拉取数据分区片段期间以及表启动时加载到索引标记缓存中) 。#97772 (Anton Popov). - 降低了访问控制期间的锁争用。#97894 (Nikita Taranov) 。
- 当 apply_row_policy_after_final 或 apply_prewhere_after_final 处于启用状态时,行策略和 PREWHERE 中的复合 AND 条件现在会被拆解,以提取其中的排序键原子条件,用于主键索引分析。此前,如果延后应用的过滤条件同时包含排序键谓词和非排序键谓词 (例如 x > 1 AND y != ‘foo’) ,整个表达式都会被排除在索引分析之外。现在,即使在嵌套的 AND 表达式中,也可以提取排序键原子条件 (如 x > 1) 并将其用于粒度剪枝。#98513 (Yarik Briukhovetskyi).
- 通过让任务资源在无需获取锁的情况下释放,减少 MergeTreeBackgroundExecutor 中的锁竞争。关闭 #93620。#98604 (Dmitry Novik) 。
- 修复了在读取非 Arrow 数据时进行 format 自动检测期间内存占用过高 (约 514 MiB) 的问题 (例如来自
url或file且未显式指定 format 的 JSON) ;原因是 ArrowStream 读取器将起始字节误识别为一个巨大的 metadata 长度。#98893 (Konstantin Bogdanov).
改进
- 支持解析在同一列中包含不同 Geo 类型的 GeoParquet 文件。#97851 (Mark Needham).
- 引入
tokensForLikePatternSQL 函数,用于对 LIKE 模式进行标记拆分,同时遵循通配符语义:%和_视为通配符,转义后的通配符 (\%、\_) 视为字面量,与未转义通配符相邻的标记会被丢弃。#97872 (Amos Bird) 。 - 为 S3 表引擎新增
{_schema_hash}占位符,用于将表列定义的哈希值插入到 S3 路径中。#98265 (Miсhael Stetsyuk) 。 SymbolIndex、addressToSymbol、system.symbols和buildId现已可在 macOS 上通过解析 Mach-O 符号表使用。#99014 (Alexey Milovidov) 。- 现在,
system.stack_trace表已支持 macOS,可用于查看所有 server 线程的堆栈跟踪内部信息。#98982 (Alexey Milovidov) 。 - 新增每服务器级别的 LDAP 配置选项
<follow_referrals>(默认值为false) ,用于控制 LDAP 客户端是否跟随转介。禁用转介跟随可避免从 Active Directory 域根 base DN 开始搜索时出现超时和挂起。与转介相关的日志消息已从warn调整为trace。#96765 (paf91) 。 - 我们现在会在 query_log 表新增的
skip_indices列中,记录查询执行期间使用的所有数据跳过索引。修复了 #78676。原始作者为 @pheepa。#87862 (Grant Holly)。 - 除非用户有权查看所有必需的列,否则
ACCESS_DENIED提示将不再暴露列名;数据库/表名在提示中仍然可见。#91067 (filimonov). - 为 MergeTree 增加一个专用清理线程,避免在高 merge 负载下出现清理延迟。此更改修复了 #86181。#91574 (Amos Bird) 。
- 仅当本地服务器主机名对应的 IP 发生变化时,才重新加载集群配置,而不是在任意主机的 IP 发生变化时都重新加载。修复了 #81215、#70156 和 #65268。#93726 (Zhigao Hong) 。
- 允许 optimize_aggregators_of_group_by_keys 在 GROUPING SETS 查询中正确地优化聚合函数。#93935 (Xiaozhe Yu).
- Keeper-bench:在指标中报告错误,并为 —input-request-log 模式生成 JSON 指标文件。#95748 (Mohammad Lareb Zafar).
- 为 CREATE USER 新增 ROLE 子句。#97074 (Vitaly Baranov) 。
- 现在,您可以为由 Replicated database 创建的集群设置 internal_replication 参数。#97228 (Pervakov Grigorii) 。
- 新设置
allow_nullable_tuple_in_extracted_subcolumns用于控制从Tuple、Variant、Dynamic和JSON中提取的Tuple(...)子列返回为Nullable(Tuple(...))(缺失行返回NULL) ,还是返回为Tuple(...)(缺失行返回默认的 Tuple 值) 。该设置默认禁用,并且只能通过重启服务器进行更改。#97299 (Nihal Z. Miaji) 。 - 在 EXPLAIN 查询输出中,将延迟过滤器的信息单独列出 (在配合行策略/PREWHERE 使用 FINAL 时) 。相关内容:#91065。#97374 (Yarik Briukhovetskyi)。
- 默认启用
type_json_allow_duplicated_key_with_literal_and_nested_object。这样可以避免在解析诸如{"a" : 42, "a" : {"b" : 42}}这类 JSON 时因重复键而报错;这类 JSON 可由 ClickHouse 根据原始 JSON 数据{"a" : 42, "a.b" : 42}格式化生成。#97423 (Pavel Kruglov) 。 - Keeper 改进:
find_super_nodes是一个非常有用的命令,可用于调试 Keeper 中节点数量异常增长的问题。遗憾的是,如果存在多个超级节点,几乎不可能找出一个以上,因为该命令在遍历遇到的第一个超级节点的子节点时会一直卡住。此 PR 禁止遍历超级节点的子节点。#97819 (pufit). - 为
clickhouse-keeper-client提供初始补全支持。#97828 (Konstantin Bogdanov) 。 - 在发生崩溃时,刷新异步日志缓冲区。 #97836 (Azat Khuzhin).
- 默认启用 impersonate 特性 (参见 EXECUTE AS target_user) 。#97870 (Vitaly Baranov) 。
- 改进了在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 来取消 SQLite 表引擎查询的功能。#97944 (Roman Vasin) 。
- 新增服务器级设置
jemalloc_profiler_sampling_rate,用于控制 jemalloc 的lg_prof_sample,并将其作为异步指标jemalloc.prof.lg_sample对外暴露。#97945 (Antonio Andelic) 。 - 为并发有界队列实现增加权重支持。#97962 (Daniil Ivanik) 。
- 将 sslmode 添加到 PostgreSQL 字典源的允许键中。此前,sslmode 不在 PostgreSQLDictionarySource.cpp 的 dictionary_allowed_keys 允许列表内,因此无法为 PostgreSQL 字典连接配置 SSL 模式。这导致字典无法连接到要求使用 SSL 的 PostgreSQL 服务器 (例如默认强制启用 SSL 的 AWS RDS) ,因为连接会在 TLS 协商阶段失败,而服务器会拒绝未加密的回退连接。#98014 (mcalfin).
- 向
clickhouse或clickhouse-local传入不存在的文件路径时,显示清晰的 “no such file” 错误,而不是令人困惑的通用消息。#98048 (Raúl Marín). - 现在可在
Nullable([Fixed]String)和Array(Nullable([Fixed]String))列上构建文本索引。#98118 (Jimmy Aguilar Mena). - 避免删除被字典源依赖的命名集合。#98127 (Pablo Marcos).
- 针对带有
totals的查询,启用grace_hashJOIN 算法。#98144 (János Benjamin Antal) 。 - 在 ordinary shared merge tree 的 DROP DATABASE 操作中提前取消后台合并。#98161 (Shaohua Wang) 。
- 改进了在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 来取消 MongoDB 和 MySQL 查询的能力。#98187 (Roman Vasin).
- 移除 NetlinkMetricsProvider,改为仅使用 procfs 收集每线程的 taskstats 指标。基于 Netlink 的收集方式在容器化环境中存在问题,而且在发生争用时,尾延迟表现更差。#98229 (Amos Bird) 。
- 重构了 Iceberg manifest 文件处理逻辑,修复了 manifest 文件缓存相关问题。#98231 (Daniil Ivanik).
- 现在我们也会考虑这样一种情况:表的排序键可以是像
toDate(time)这样的 expression;如果这类 expression 属于过滤器的一部分,我们就可以决定不延迟对它们的处理。#98237 (Yarik Briukhovetskyi) 。 - 新增
MaxAllocatedEphemeralLockSequentialNumber指标,用于表示 ZooKeeper 中为临时锁 znode 分配的最大顺序编号。#98243 (Miсhael Stetsyuk). - 将 ClickStack 更新至 2.20.0 版本。#98252 (Aaron Knudtson) 。
- 新增了一个新的 profile 事件
KeeperRequestTotalWithSubrequests,会将多请求中的每个子请求分别计数,从而更清楚地反映实际的 Keeper workload。现有的KeeperRequestTotal事件则仍然将每个多请求计为一次请求。#98348 (Antonio Andelic) 。 SYSTEM RELOAD DICTIONARIES现在会按拓扑顺序重新加载字典,因此将其他字典作为数据源的字典在重新加载后也能读取到最新数据。#98356 (Alexey Milovidov).- 更改 MergeTree 设置后,重启统计缓存。#98520 (Han Fei) 。
- 只有“存活”的 (即能够连接的) 副本会参与分布式索引分析。#98521 (Azat Khuzhin) 。
- 新增设置
access_control_improvements.disallow_config_defined_profiles_for_sql_defined_users(默认值为 disabled/allowed) ,禁止为通过 SQL 定义的用户使用在 config 中定义的 profile (defaultprofile 除外) 。#98662 (Alexander Tokmakov) 。 - 将自动并行副本启发式所使用的节点数上限设为集群中的实际节点数 (而不再仅由
max_parallel_replicas设置决定) 。#98668 (Nikita Taranov). - 为分布式索引分析引入对冲请求和异步读取。#98724 (Azat Khuzhin) 。
- 现在,二进制
AggregateFunction状态的反序列化要求必须完整读取全部输入。如果存在多余的尾随冗余字节,ClickHouse 将抛出异常,而不再接受格式不正确的状态数据。#98786 (Nihal Z. Miaji) 。 - 让 TRUNCATE DATABASE 能响应查询取消。#98828 (Shaohua Wang).
- 为
keeper-bench增加请求流水线、预热阶段、按操作划分的统计信息、可复现的种子以及更完善的错误处理。#98906 (Antonio Andelic) 。 - 分布式索引分析现已支持 SAMPLE 子句。 #98931 (Azat Khuzhin).
- 即使查询返回空结果或发生错误,也会在仪表板中显示图表标题。#98975 (Yash ).
- analyzer 错误消息不再输出表中的所有列 (这可能会导致产生 150KB+ 的异常信息) 。列列表现在最多只显示 10 项。#99002 (Yash ).
- 正确返回包含 joins 的子查询中的列统计信息,以便父查询可利用这些信息对 join 顺序进行重排。#99096 (Alexander Gololobov).
- 在终结过程开始时,立即将 ZooKeeper session 标记为已过期,而不是等待发送线程退出。这样一来,其他线程就能立即建立新的 session,而无需等待。#99102 (Raúl Marín).
- 开始使用 LLVM-libc 中更多数学函数:
exp、exp2、expm1、fabs、fabsl、floor、fmodl、log、log2、logf、pow、scalbn、scalbnl、copysignl、nan、nanf、nanl,以及explogxf共享常量。#99118 (Konstantin Bogdanov) 。 - 降低
system.jemalloc_profile_text折叠格式下的内存占用,并修复潜在的重复输出问题。#99121 (Antonio Andelic) 。 - 向
system.aggregated_zookeeper_log添加is_subrequest列,用于区分独立请求与 Multi/MultiRead 请求中的子请求。此前,子请求会与独立请求聚合到同一个桶中,而由于每个子操作记录的都是整个多请求的总耗时,因此平均延迟具有误导性。现在,子请求的延迟为零。#99169 (Miсhael Stetsyuk) 。 - 允许在不指定列类型的情况下执行
ALTER TABLE MODIFY COLUMN x TTL ...命令。#99208 (Nikolay Degterinsky). - 跳过已断开连接的会话对应的过时 Keeper 请求,避免不必要的 Raft 往返。已跟踪的已结束会话数量上限由协调设置
max_finished_sessions_cache_size控制。#99246 (Antonio Andelic) 。 - 支持对基于
mapValues(map)构建的文本索引使用IN运算符。#99286 (Anton Popov) 。 - 在 clickhouse keeper-client 中支持类似 Shell 的自动补全 (支持补全引号中的参数,即
'foo ba';支持转义参数,即foo\ ba;如果节点名中包含空白字符,则让ls输出带引号的节点名) 。#99312 (Azat Khuzhin). - 防止 Keeper
mntr命令因锁竞争而发生卡顿。#99472 (Antonio Andelic). - 通过在 mutex 作用域之外调用回调函数并分发读取请求,减少 Keeper 分发器中的锁竞争,并添加带 profile 的锁保护机制以增强可观测性。#99751 (Antonio Andelic).
- 允许 Parquet 文件最后一个块末尾缺少填充。 #99857 (Seva Potapov).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了当别名表目标未使用完全限定名称时,将其保存为 DDL 依赖的方式:现在会保存为别名表所在的数据库,而不是会话数据库。 #95175 (Enric Calabuig).
- 修复读取 ALIAS 列的子列时返回错误结果或抛出异常的问题。#95408 (Pavel Kruglov) 。
- 修复了在使用旧 analyzer 时,JOIN 中使用非标准标识符别名导致列缺失的问题。修复了 #25594、#47288 和 #53263。#95679 (Zhigao Hong).
- 修复了 Kusto 方言函数
bin()、bin_at()、extract()和indexof()在传入空参数时发生崩溃的问题。#95736 (NeedmeFordev) 。 - 禁止在 clickhouse-client 中将 local_object_storage (用于基于本地文件系统的数据湖,也可能被 LocalDisk 使用) 挂载到 user_files_path 以外的任何位置。 #96201 (Daniil Ivanik).
- 修复
DeltaLake表引擎中快照版本变更时的逻辑竞态问题,并去除冗余且高开销的快照重新加载。#96226 (Kseniia Sumarokova) 。 - 修复了 MergeTree 中附加分片时的一个逻辑错误:如果在 detach 和 attach 之间经历了多次连续重命名,就会触发该问题。#96351 (Alexey Milovidov).
- 修复了一个问题:在同一请求中与
compatibility一并发送显式设置时,如果其值恰好与服务器默认值相同,这些设置可能会被悄然忽略。#97078 (Raufs Dunamalijevs). - 修复了以下问题:当启用并行解析的 INSERT 遇到无效数据时,客户端会报告
NETWORK_ERROR,而不是实际的解析错误 (并带有正确的行号) 。#97339 (Alexey Milovidov). - 修复了在引入
Nullable(Tuple)后,sumCount聚合函数无法读取旧版已序列化状态的问题。关闭 #97370。#97502 (Nihal Z. Miaji) 。 - 修复在配合
GROUPING SETS和ORDER BY使用时,包含Nothing类型元素的元组比较中出现的异常 (例如与NULL元组元素比较时) 。#97509 (Alexey Milovidov) 。 - 修复了在使用多个压缩编解码器时,Compact MergeTree parts 的
uncompressed_hash计算非确定性问题,该问题可能导致去重行为不正确。#97522 (Alexey Milovidov). - 修复了在共享数据中使用 JSON 和桶执行 INSERT SELECT 时,stream 缺失导致的逻辑错误。关闭 #97331。#97523 (Pavel Kruglov) 。
- 修复了在 SummingMergeTree 和 CoalescingMergeTree 合并过程中,将
MEMORY_LIMIT_EXCEEDED异常误报为CORRUPTED_DATA的问题。#97537 (János Benjamin Antal) 。 - 修复了包含
url()等表函数的关联子查询中出现的 “Context has expired” 异常。#97544 (Alexey Milovidov). - 修复了
optimize_syntax_fuse_functions在聚合投影、Date 类型以及列名保留方面的异常和错误行为。#97545 (Alexey Milovidov) 。 - 移除了将
replaceRegexpOne查询重写为extract的错误优化,该重写在正则表达式不匹配时会产生错误结果;同时修复了在replaceRegexpOne与GROUP BY ... WITH CUBE及group_by_use_nulls=1一起使用时出现的异常。#97546 (Alexey Milovidov). - 修复了在查询被终止时,启用
database_atomic_wait_for_drop_and_detach_synchronously的DROP DATABASE可能会无限期挂起的问题。#97586 (Alexey Milovidov). - 修复了
KILL QUERY无法终止卡在WITH FILL生成、通过dictGet加载字典,或在ReplicatedMergeTree上执行带有mutations_sync=1的ALTER DELETE时卡住的查询的问题。#97589 (Alexey Milovidov) 。 loop表函数此前直接调用inner_storage->read(),绕过了解释器层;而行策略、列级授权及其他安全检查正是在这一层执行的。因此,即使直接执行 SELECT 返回零行,受行策略限制的用户仍可通过loop(table)读取所有行。#97682 (pufit) 。- 修复了在对纪元前的 DateTime64 使用
toDate()函数时,分区裁剪不正确的问题。 #97746 (Yarik Briukhovetskyi). - 应用此补丁后,如果数据分区片段集合中存在另一个分区 ID 更高的分区,
hasPartitionId将返回 false。#97748 (Mikhail Artemenko) 。 - 修复读取 JSON 中高级共享数据的空粒度时可能发生的崩溃。关闭 #97563。#97778 (Pavel Kruglov) 。
- 修复因
DROP与INSERT之间的竞争条件,导致向Distributed执行INSERT时出现Cannot schedule a fileLOGICAL_ERROR错误的问题。#97822 (Azat Khuzhin) 。 - 修复了在调用
mapContainsKey/mapContainsKeyLike且使用tokenbf_v1跳过索引时,ClickHouse 服务器崩溃/断言的问题。#97826 (Shankar Iyer) 。 - 修复了在
concatWithSeparator、format、IN子查询、GLOBAL IN以及带运行时过滤器的连接操作中,由复合类型 (Variant、Dynamic、Tuple) 内的LowCardinality引发的 LOGICAL_ERROR 异常。#97831 (Raúl Marín). - 修复了在多个分布式表上使用
ARRAY JOIN、merge()表函数并结合GROUP BY时出现的LOGICAL_ERROR异常:Chunk info was not set for chunk in MergingAggregatedTransform。#97838 (Raúl Marín) 。 - 修复了在高并发情况下,连接组达到硬性上限时,HTTP 连接池析构函数中的未捕获异常导致的服务端崩溃 (
std::terminate) 问题。在将连接回收到连接池时,异常HTTP_CONNECTION_LIMIT_REACHED可能会从~PooledConnection中泄出,进而导致SIGABRT。#97850 (Antonio Andelic). - 修复了在使用
grace_hash算法进行非等值连接时,若由于连接结果的大小约束导致左侧块无法被完全处理而产生错误结果的问题。#97866 (János Benjamin Antal). - 修复了在 #96686 中引入的 DeltaLake 元数据扫描性能问题。#97880 (Kseniia Sumarokova) 。
- 修复了 ZooKeeper 客户端中 sendThread 与 receiveThread 之间的数据竞争问题。#97887 (Pablo Marcos) 。
- 修复了一个 bug:此前无法在 distributed insert select 中使用 CTE。延续 https://github.com/ClickHouse/ClickHouse/pull/87789 中的修复。关闭了 #95837。#97889 (Yarik Briukhovetskyi) 。
- 修复
CachedOnDiskReadBufferFromFile::readBigAt中的异常。关闭 #97325。#97890 (Kseniia Sumarokova) 。 - 修复了
Alias引擎中因列不匹配导致的带有物化列的LOGICAL_ERROR异常。关闭了 #97907。#97921 (Kai Zhu) 。 - 修复了在使用 Azure Blob 存储并将
s3_plainmetadata 用于日志存储时,Keeper 重启后出现的数据丢失问题。#97987 (Antonio Andelic). - 修复了
sign函数在比Int8更宽的整数类型上的 JIT 误编译问题——超出 -128..127 范围的值可能会得到错误的符号。#98012 (Alexey Milovidov) 。 - 修复了读取使用列映射 “name” 模式的 Delta Lake 表时出现的
DUPLICATE_COLUMN异常,以及对名称中包含点号的 struct 字段无提示地返回 NULL 的问题 (例如STRUCT<`a.foo`: STRING, `b.foo`: STRING>) 。#98013 (Caio Ishizaka Costa) 。 - 修复轻量级更新和次级索引后的变更问题。#98044 (Raúl Marín) 。
- 修复混用主键和非主键跳过索引时 FINAL 查询结果错误的问题。#98097 (Raúl Marín) 。
- 对标量 file() 和 DESCRIBE TABLE file() 强制进行 READ ON FILE 权限检查。#98115 (Nikolay Degterinsky) 。
- 修复了一个崩溃问题:使用 glob 模式查询文件 (例如
file('dir/**', 'LineAsString')) 时,如果目录中包含悬空符号链接,会抛出未处理的文件系统异常 (STD_EXCEPTION) 。现在会静默跳过悬空符号链接,查询将返回所有有效文件的结果。#98143 (Mark Andreev). - 修复了在过滤表达式中使用
arrayJoin将外连接转换为内连接时,查询计划优化中发生的 segfault。#98147 (Alexey Milovidov) 。 - 修复了
ProtobufList格式因消息间读取状态未重置而无法与 Kafka 引擎正常配合的问题。#98151 (Alexey Milovidov) 。 - 修复了 analyzer_compatibility_join_using_top_level_identifier 与 ARRAY JOIN 相关的逻辑错误,关闭 #98164。#98179 (Vladimir Cherkasov) 。
- 将
aggregated_zookeeper_log中watch响应的组件字段设为Watch,而不是留空。#98202 (Antonio Andelic) 。 - 如果分区键列未包含在排序键中,那么分区裁剪可能会错误地跳过那些包含在 FINAL 去重过程中本应被保留的行的分区。 #98242 (Yarik Briukhovetskyi).
- 修复了在以常量数组参数调用
kql_array_sort_asc/kql_array_sort_desc时出现的逻辑错误 “Bad cast from type DB::ColumnConst to DB::ColumnArray”。#98251 (Alexey Milovidov) 。 - 修复了
ColumnConst::getExtremes中的越界访问问题;在启用extremes = 1时,该问题可能导致崩溃。#98263 (Alexey Milovidov) 。 - 修复了一种潜在死锁问题:当两个并发的
MOVE PARTITION操作在同一对表之间沿相反方向执行时,可能会发生死锁。#98264 (Alexey Milovidov). - HTTP 服务器现在会在因请求头格式错误而导致的 400 Bad Request 响应体中返回错误消息,而不再返回空响应体。#98268 (Alexey Milovidov).
- 修复了分布式索引分析 (Experimental 功能) 和查询条件缓存中的错误结果问题。#98269 (Azat Khuzhin) 。
- 修复了 LOGICAL_ERROR 异常 “
MergeTreeSetIndex中的二分查找结果无效”:当对数据跨越 65535 边界的键列执行toDate转换时会触发该异常。#98276 (Alexey Milovidov) 。 - 修复了在旧版 join 步骤代码路径中,被包裹在 CROSS JOIN 中的 RIGHT JOIN 被
query_plan_join_swap_table优化交换时触发的LOGICAL_ERROR异常。#98279 (Alexey Milovidov) 。 - 在
DDSketch反序列化期间对损坏数据进行校验,以防在读取已损坏的quantilesDD聚合函数状态时出现段错误、异常、无限循环和 OOM。 #98284 (Alexey Milovidov). - 修复了在
arrayMap等 lambda 函数中引用外层查询中的关联列时出现的 LOGICAL_ERROR “Trying to execute PLACEHOLDER action”。 #98285 (Alexey Milovidov). - 修复了
caseWithExpression中的逻辑错误异常:当CASE表达式涉及materialize(NULL)或其他Nullable(Nothing)参数时会触发该异常。#98290 (Alexey Milovidov) 。 - 修复在
merge表函数中过滤_table虚拟列时出现的错误类型转换异常。#98291 (Alexey Milovidov) 。 - 修复了一个偶发的去重故障:由于
blocks/与deduplication_hashes/这两个 ZooKeeper 目录的清理顺序不一致,重新插入的数据会被错误地去重。#98293 (Alexey Milovidov). - 修复了
ORDER BY ... WITH FILL与LIMIT BY一起使用时触发的异常。#98361 (Alexey Milovidov) 。 - 修复将 Parquet/Arrow
Date列插入Enum列时的静默数据损坏问题——现在会正确拒绝不兼容的类型转换,而不会存储无效的枚举值。#98364 (Alexey Milovidov). - 修复了将带有
Array列的 Arrow 文件读入带有Nested列的表时出现的异常。#98365 (Alexey Milovidov) 。 - 修复了以下问题:如果在索引或投影对应的变更完成前将其删除,
MATERIALIZE INDEX和MATERIALIZE PROJECTION变更会卡住。#98369 (Alexey Milovidov) 。 - 修复了读取
Nullable(Tuple(...))时出现的异常:Tuple 元素名称与 Nullable 的null子列发生冲突。#98372 (Alexey Milovidov) 。 - 修复将
Merge表 (底层为Distributed表) 与另一张表连接时出现的异常 “Column … query tree node does not have valid source node”。#98376 (Alexey Milovidov) 。 - 修复 native V3 读取器中将 Parquet
Bool错误转换为FixedString的问题,此问题会产生 raw bytes,而不是字符串表示形式。#98378 (Alexey Milovidov). - 修复
tryGetColumnDescription:按父列类型筛选子列,使其与其他列查找方法保持一致。#98391 (Alexey Milovidov). - 支持在 HTTP Basic Auth 中接受不带填充的 base64 凭据。某些 HTTP 客户端会省略
Authorization: Basic请求头末尾用于填充的=,此前这会导致身份验证失败。#98392 (Amos Bird). - 修复了合并带有
Nullable分区键列的 parts 后,因 min-max 索引边界错误导致的分区裁剪结果不正确问题。#98405 (Amos Bird). - 修复了管道执行器中的一个罕见异常:当管道扩展与查询取消发生竞态时,可能会表现为
Received signal 6(仅在调试构建中出现) 。#98428 (Alexey Milovidov) 。 - 修复在
count_distinct_optimization与QUALIFY子句一起使用时出现的 “Column identifier is already registered” 异常。#98433 (Alexey Milovidov) 。 - 修复了将
IN/NOT IN与LowCardinality列参数一起使用时出现的异常“cannot be inside Nullable type” (例如a NOT IN (b),其中a的类型为LowCardinality(String)) 。 #98443 (Alexey Milovidov). - 修复了
full_sorting_mergejoin 中的 “Pipeline stuck” 异常:当FilterBySetOnTheFly优化与MergeJoinTransform形成循环依赖时,PingPongProcessor中的死锁会触发该异常。#98454 (Alexey Milovidov). - 修复在合并带有会删除所有行的生存时间 (TTL) 且具有常量
GROUP BY键的聚合投影的 parts 时出现的LOGICAL_ERROR异常 “Projection cannot increase the number of rows in a block”。#98458 (Alexey Milovidov). - 修复了同时使用
CROSS JOIN和INNER JOIN USING时出现的逻辑错误异常。#98459 (Alexey Milovidov). - 修复了
dictGetOrDefault在键参数为Nullable时的空指针解引用问题。#98460 (Alexey Milovidov) 。 - 修复了这样一种情况下
DISTINCT查询中的异常:使用聚合投影时,materialize会导致查询与投影之间的LowCardinality类型不一致。#98462 (Alexey Milovidov). - 修复了这样一个问题:启用
join_use_nulls时,在 OUTER JOIN 的过滤表达式中使用arrayJoin会触发 LOGICAL_ERROR 异常。#98464 (Alexey Milovidov) 。 - 修复在并行副本配合
optimize_aggregation_in_order使用时出现的逻辑错误异常 “副本决定以 WithOrder 模式读取,而不是 ReverseOrder”。#98467 (Alexey Milovidov) 。 - 修复了 ClickHouse Keeper 在处理
addWatch请求后断开 Java ZooKeeper 客户端连接的问题。Java 客户端期望在addWatch响应中收到一个 4 字节的ErrorResponse响应体,但 Keeper 发送的却是空响应体,从而导致EOFException并使会话断开。这会导致 Apache Curator 的CuratorCache以及任何使用持久 watch 的 Java 应用程序无法正常工作。修复 #98079。#98499 (Antonio Andelic) 。 - 修复了当跟随者宕机时,
zk_followers和zk_synced_followers这两个 Keeper 指标不会随之减少的问题。在mntr四字母命令中新增了zk_learners和zk_synced_non_voting_followers指标。修复 #54173。#98504 (Antonio Andelic) 。 - 修复了
renameAndCommitEmptyParts中的 LOGICAL_ERROR 异常:在使用 MergeTree 事务时,若TRUNCATE TABLE与OPTIMIZE TABLE并发执行,可能会触发该异常。#98508 (Alexey Milovidov) 。 - 修复了 Keeper 的安全 Raft 端口忽略
openSSL配置中的cipherList和dhParamsFile、一律使用默认值而非用户指定值的问题。关闭 #51188。#98509 (Antonio Andelic) 。 - 修复了具有误导性的 Keeper 日志消息,例如 “Receiving request for session X took 9963 ms”:其中显示的时间实际上是两次心跳之间在
poll()中空闲等待的耗时,而非操作本身的执行时间。修复了 #79026。#98510 (Antonio Andelic) 。 - 修复 read_in_order_use_virtual_row 与单调函数配合使用时出现的意外结果,关闭 #97837。#98514 (Vladimir Cherkasov) 。
- 修复了在 MergeTree 表上配合
IN子查询使用PREWHERE时出现的LOGICAL_ERROR: Not-ready Set is passed as the second argument for function 'in'问题。#98522 (Alexey Milovidov). - 修复了 Keeper TCP 连接未响应关闭信号,导致服务器无法优雅关闭的问题。 #98525 (Alexey Milovidov).
- 修复了在启用
query_plan_convert_join_to_in且query_plan_merge_expressions = 0时出现的异常:“在 ActionsDAG 的输出中未找到排序列”。 #98526 (Alexey Milovidov). - 修复了使用命名集合时 MongoDB 字典源失效的问题。关闭 #97840。#98528 (Pablo Marcos) 。
- 修复了参数替换后 Identifier 为空时触发的 LOGICAL_ERROR。 #98530 (Pervakov Grigorii).
- 修复同时使用
sort_overflow_mode = 'break'和窗口函数时出现的管道死锁问题。#98543 (Alexey Milovidov) 。 - 修复了 Buffer 引擎在追加新块时处理异常过程中的列回滚问题。旧逻辑可能导致列的内存状态损坏。#98551 (Pavel Kruglov) 。
- 修复了在常量
Dynamic或Variant列与NULL进行 NULL 安全比较 (<=>/IS NOT DISTINCT FROM) 时出现的异常Bad cast from type ColumnConst to ColumnDynamic。同时还修复了Dynamic/Variant与NULL进行IS DISTINCT FROM比较时始终错误返回 0 的问题。#98553 (Alexey Milovidov). - 修复了文本索引与其他跳过索引一起使用时的问题。此前,当查询过滤器同时使用文本索引和其他常规跳过索引时,可能会抛出诸如 “Trying to get non-existing mark” 之类的逻辑错误。#98555 (Anton Popov) 。
- 修复了逻辑错误 “在表达式上下文中不允许使用 TABLE_FUNCTION”:当带有别名的表函数在同一查询作用域中出现多次时 (例如同时出现在
PREWHERE和QUALIFY子句中) 。 #98557 (Alexey Milovidov). - 修复了 PK 中针对表达式 (而不只是列) 进行分布式索引分析的问题 (否则会导致远程副本上的冗余粒度完全无法被过滤) 。#98561 (Azat Khuzhin).
- 当某列的子列被用于其他列的默认值/别名表达式时,禁止删除该列,并在 alter drop column 操作中对默认表达式使用 analyzer。#98569 (Nikita Mikhaylov) 。
- 修复了 HTTP 客户端在遇到不可重试错误 (包括
HTTP_CONNECTION_LIMIT_REACHED) 时,仍错误重试 S3 请求的问题。#98598 (Sema Checherinda) 。 - 修复了使用 DateTime64 进行分区裁剪时出现的十进制溢出问题。 #98628 (Yarik Briukhovetskyi).
- 修复 JIT 表达式编译中的两个 bug:
nativeCast类型检查里的一处复制粘贴错误,导致整数到整数和 Float 到 Float 的 cast 分支不可达;以及向 LLVMPassBuilder传入了错误的nullptrTargetMachine,致使无法注册特定目标的优化 pass。#98660 (Alexey Milovidov) 。 - 修复了一个 RBAC 绕过漏洞:用户此前可通过指向 localhost 的
remote()、remoteSecure()、cluster()或clusterAllReplicas()对任意表执行DESCRIBE,且无需SHOW_COLUMNS权限。#98669 (pufit). - 修复了以下问题:当非布尔表达式 (例如
sin(col)) 在包含 JOIN 的 WHERE 和 SELECT 中同时使用时,过滤器下推优化会破坏共享 DAG 节点,从而导致BAD_GET异常和错误的查询结果。#98681 (Alexey Milovidov) 。 - 修复在使用
read_in_order_through_join和并行副本时出现的 LOGICAL_ERROR:“副本决定以 Default 模式读取,而不是 WithOrder”。 #98685 (Alexey Milovidov). - 修复将
input表函数用作remote参数时出现的异常 “Bad cast from typeDB::TableFunctionNodetoDB::QueryNode”。#98694 (Alexey Milovidov) 。 - 修复了因错误清理空的覆盖数据分区片段而导致过期数据分区片段“复活”的问题。 #98698 (Shaohua Wang).
- 修复了
LogicalExpressionOptimizerPass中的一个异常:在equals比较中,如果布尔函数返回Variant类型,就会报异常。#98712 (Alexey Milovidov). - 修复
parseDateTimeBestEffort错误地解析以月份/星期前缀开头的单词的问题。关闭 #97965。#98742 (Pavel Kruglov) 。 - 修复在启用新 analyzer 时,对具有不同参数 (例如不同
SKIP字段) 且包含引用 JSON 子路径的 ALIAS 列的 JSON 列使用merge()表函数或Merge引擎进行查询时出现的UNKNOWN_IDENTIFIER异常。关闭了 #97812。#98753 (Pavel Kruglov) 。 - 修复了在
View中使用Distributed存储时,analyzer 对optimize_skip_unused_shards优化处理不正确的问题。#98754 (Nikolai Kochetov). - 修复了在
clickhouse-client中,通过--external传入的外部表无法按名称访问 Tuple 子列的问题 (例如,对Tuple(a UUID, b Int32)使用SELECT x.a) 。关闭 #96925。#98755 (Pavel Kruglov) 。 - 修复
reverseUTF8在无效 (截断的) UTF-8 输入上抛出异常的问题。#98770 (Alexey Milovidov) 。 - 修复在带有 false (即 or(x, 0)) 的或谓词中检测 Set 跳过索引有效性的问题。#98776 (Azat Khuzhin) 。
- 修复一个
LOGICAL_ERROR异常 (removeUnusedColumns中出现块结构不匹配) ,该异常可能会在FINAL+PREWHERE+ 常量WHERE表达式 + 与列无关的聚合 (如count()) 的情况下发生。#98778 (Alexey Milovidov). - 为 ClickHouse 字典自动重新加载生成的
system.trace_log条目添加非空查询 ID。#98784 (Miсhael Stetsyuk) 。 - 修复了一个崩溃问题:对于在
IDatabaseTablesIterator::table()调用中对表进行快照之后、并在后续迭代期间被另一线程更改的那些表之间这段时间里创建的系统表,我们可能会解引用空指针。 #98792 (Grant Holly). - 修复
SYSTEM START REPLICATED VIEW无法唤醒刷新任务的问题。#98797 (Pablo Marcos) 。 - 修复了在另一个 JOIN 内使用包含 JOIN 的
view()表函数时出现的异常 “表名不一致” (仅在旧 analyzer 下) 。#98809 (Alexey Milovidov) 。 - 修复了通过 pending_signals 调整 RLIMIT_SIGPENDING 时的问题。#98829 (Azat Khuzhin) 。
- 修复
loop与 cluster 表函数组合使用时触发的异常。#98860 (Konstantin Bogdanov) 。 - 使用多个连接键列的 LEFT ANTI JOIN 在
enable_join_runtime_filters=1(默认开启) 时会返回错误结果。#98871 (Alexander Gololobov) 。 - 修复
WITH FILL STALENESS在分多个数据块读取数据时 (例如,index_granularity较小时) 产生额外填充行的问题。#98895 (Alexey Milovidov). - 修复了 “RPNBuilderFunctionTreeNode has A arguments, attempted to get argument at index B” LOGICAL_ERROR。#98900 (Azat Khuzhin) 。
- 修复了由失败的内存分配未回滚、
nallocx(0)的未定义行为以及全局峰值跟踪中的差一错误导致的内存跟踪偏差。并将跟踪范围扩展到io_uring的 Ring buffer。#98915 (Antonio Andelic). - 禁止附加用户路径之外的本地数据湖表,而不只是禁止创建这些表。#98936 (Daniil Ivanik) 。
- 修复了一个竞态条件:在使用
urlCluster或类似 cluster 表函数的查询中,它可能导致出现 “ReadBuffer is canceled” 异常。#98955 (Alexey Milovidov) 。 - 修复了在传入
BFloat16类型参数时,财务函数 (financialNetPresentValue、financialInternalRateOfReturn等) 中出现的LOGICAL_ERROR异常。#98958 (Alexey Milovidov) 。 - 修复在禁用查询计划表达式合并时 (
query_plan_merge_expressions = 0或query_plan_enable_optimizations = 0) ,跳过索引 (以及主键条件) 无法应用于 ALIAS 列的问题。#98960 (Peng). - 异步插入现在也会增加
InsertQueryProfileEvent 计数。关闭 #98626。#98962 (Narasimha Pakeer) 。 - 修复了在调试构建中,当主键包含 NaN 浮点数值时出现的异常 “Inconsistent KeyCondition behavior”:通过让
accurateLess和accurateEquals按照与 ClickHouse 排序顺序一致的方式处理 NaN。关闭 #98075。#98964 (Alexey Milovidov) 。 - SummingMergeTree 不再对 Bool (以及其他 domain 类型) 的列进行求和。Bool 值会保持原样,不再进行算术求和。#98976 (Yash ).
- 修复了在设置
optimize_const_name_size且enable_scalar_subquery_optimization= 0 时,查询远程分片会出现Scalar doesn't exist异常的问题。远程查询中被替换为__getScalar引用的大型常量未发送到分片,导致查询失败。#98979 (andriibeee) 。 - 修复了某些查询中的
NOT_FOUND_COLUMN_IN_BLOCK问题;这些查询带有GROUP BY,且表达式中包含反向字典查找、Date/DateTime转换比较以及元组比较。关闭 #98888。#98980 (Nihal Z. Miaji) 。 - 修复了在 MergeTree 引擎中将 version/sign/is_deleted 列修改为
EPHEMERAL或ALIAS时出现的未定义行为 (空指针解引用) 问题。现在此类修改会被正确拒绝。#98985 (Alexey Milovidov). - 修复了一个问题:
system.grants在access_object列中遗漏了URL和S3授权对应的正则表达式参数。#98987 (DQ). - 已修复 Iceberg BigLake 读取问题:ADC 凭据现会传递给 GCS S3 客户端 (修复了 403 错误) ;OAuth2 凭据会在发送前进行 URL 编码 (修复了包含特殊字符的令牌导致的身份验证失败) ;命名空间遍历在遇到 BigLake HTTP 400 响应时也不再中止。#98998 (Nikita Fomichev) 。
- 修复了
clickhouse-client在TZ环境变量使用 POSIX 文件路径语法时 (例如TZ=:/etc/localtime) 无法切换时区的问题。#99000 (Yash ). - 修复了将
startsWith、LIKE、NOT LIKE用于FixedString列时出现的剪枝不正确或剪枝不足问题。此外,包裹键列的FixedString到String类型转换函数现在也可以进行粒度剪枝。关闭 #98940。#99001 (Nihal Z. Miaji) 。 - 修复了
windowFunnel在遇到重复事件时,启用strict_deduplication会返回错误级别的问题。#99003 (Yash ). - 修复了一个问题:EXISTS 会忽略子查询中的 LIMIT 和 OFFSET 子句,导致当子查询因 OFFSET 或 LIMIT 为 0 而未返回任何行时,结果不正确。关闭 #88722。#99005 (andriibeee) 。
- 修复在使用
GROUPING SETS时,过滤器下推优化遇到可短路为常量的 AND 表达式时触发的 “Block structure mismatch” 异常。 #99010 (Alexey Milovidov). - 修复了在查询计划中未包含
_part_offset列时,读取补丁分区片段 (轻量级更新) 会触发异常的问题。 #99023 (Alexey Milovidov). - 对于类似
SELECT * FROM table WHERE pk_id = ''这样的查询,如果pk_id是主键且类型为String,现在会正确使用主键索引来过滤粒度。 #99027 (Shankar Iyer). - 修复了一个问题:当 materialized view 在后台线程流式传输数据时被 detach,Kafka 引擎会抛出
DEPENDENCIES_NOT_FOUND异常。#99028 (Alexey Milovidov) 。 - 修复了在创建包含与虚拟列 (如
_part_offset) 同名的EPHEMERAL列的表时触发的异常。#99031 (Alexey Milovidov). - 修复了通过带有通配符模式的
url()表函数读取不存在的压缩文件时,误导性的 “inflate failed: buffer error” 报错。现在,当启用http_skip_not_found_url_for_globs时,会按预期返回空结果。#99034 (Alexey Milovidov). - 修复了在 schema 变更 (例如 ADD COLUMN) 后,对 patch part 执行
ALTER TABLE ... DROP PART时发生的 server 崩溃 (std::terminate) 问题。该崩溃是由于空 coverage part 的 metadata 中缺少系统列 (_part) ,从而导致在NOEXCEPT_SCOPE内部抛出未被捕获的异常。#99036 (Peng) 。 - 如果在 缓存磁盘读取 期间因超出内存限制而抛出异常,ClickHouse 服务器进程可能会崩溃。该问题现已修复。#99042 (Shankar Iyer) 。
- 修复了在使用
dictGet查询同时具有 ROW POLICY 和 ALIAS 列的表时出现的LOGICAL_ERROR。该问题是由于在新的 analyzer 中解析 ALIAS 列期间过早访问表表达式所致。#99065 (Peng). - 修复了用户在仅查询使用 Avro 格式存储数据的 Iceberg 表虚拟列时出现的越界错误。这种情况极其罕见,因此未将其标记为严重问题。修复 #88238。#99080 (alesapin).
- 修复了递归 CTE 中使用
remote()+view()时出现的段错误。 #99081 (Konstantin Bogdanov). - 应用按序读取优化时,跳过不必要的额外索引分析。#99084 (Vladimir Cherkasov) 。
- 修复了在应用 patch part 期间因抛出内存限制异常而导致的崩溃。#99086 (Anton Popov).
- 修复了
DDLWorker中的调试断言问题:在重新初始化恢复期间,ZooKeeper 条目被删除后,first_failed_task_name变为过期状态,从而触发该问题。#99099 (Antonio Andelic) 。 - 修复了带有生存时间 (TTL) 的合并过程中重建文本索引的问题。#99107 (Anton Popov).
- 修复 Iceberg 表引擎中
ALTER TABLE ... REMOVE SETTINGS查询导致的崩溃问题。修复了 #86330。#99108 (alesapin) 。 - 修复了
query_plan_convert_any_join_to_semi_or_anti_join优化中的一个 bug,该 bug 会导致不匹配的行返回错误结果。相关链接:https://github.com/ClickHouse/ClickHouse/pull/95995。[#99112](https://github.com/ClickHouse/ClickHouse/pull/99112) (Yarik Briukhovetskyi). - 修复
ASTColumnsExceptTransformer::transform中的 LOGICAL_ERROR 异常。#99119 (Pablo Marcos) 。 - 修复了一个 RBAC 绕过漏洞:该漏洞允许用户在未具备所需 source 访问特权的情况下,通过对表函数 (
mysql()、postgresql()、sqlite()、arrowFlight()、jdbc()、odbc()等) 执行DESCRIBE TABLE或CREATE TABLE AS来获取表结构。对于那些从远程服务器推断 schema 的函数,这还会导致用户在未经授权的情况下触发出站连接 (SSRF) 。#99122 (pufit). - 修复 Keeper 在动态重新配置和 leader 切换期间发生的崩溃问题 (NuRaft 中的 segfault) 。#99133 (JIaQi Tang) 。
- 修复了在目标端不支持 SAMPLE 时使用 Buffer 表导致崩溃的问题。#99141 (Kseniia Sumarokova).
- 修复因补丁分区片段列顺序不一致导致的 LOGICAL_ERROR。#99164 (Pablo Marcos) 。
- 修复了一个极少见的崩溃问题:当 Iceberg 表包含混合格式 (ORC 和 Parquet) 的文件时可能会发生。修复了 #88126。#99168 (alesapin).
- 修复了备份/恢复时未应用 max_execution_time 的问题。 #99205 (Kseniia Sumarokova).
- 修复了在未使用
ORDER BY ALL的INSERT SELECT查询中,insert_deduplication_token会被悄然忽略的问题。此前,对于未排序的INSERT SELECT,即使提供了显式的用户标记,也会完全禁用去重。现在,只要提供insert_deduplication_token,无论是否使用ORDER BY ALL,都足以启用去重。 #99206 (Desel72). - 修复
InverseDictionaryLookupPass优化过程中权限检查过多的问题:不再对遍历到的每个节点都检查一次CREATE_TEMPORARY_TABLE权限,而是在该 pass 开始前只检查一次。#99210 (Mikhail Artemenko)。 - 修复了
clickhouse format --obfuscate因混淆跳过索引类型、压缩编解码器名称、数据库引擎名称以及字典布局和数据源定义而生成无效 SQL 的问题。#99260 (Raúl Marín) 。 - 修复了一个 bug:在某些情况下,
Time[64]与DateTime[64]类型之间的比较结果容易引起混淆;现在,遇到这类情况时,会通过添加日期部分1970-01-01,将Time[64]值提升为DateTime[64]。#99267 (Yarik Briukhovetskyi) 。 - 在 DDL 工作线程中收紧分布式 DDL 查询的设置约束。#99317 (Pablo Marcos).
- 修复 TOTP 身份验证中的一些小问题:
--one-time-passwordCLI 选项在密码为空时的问题,以及对<digits>和<period>配置值的校验。#99322 (Vladimir Cherkasov) 。 - 修复了 Avro 输出格式中的逻辑错误
unordered_map::at: key not found:序列化值不在枚举定义内的Enum8/Enum16列时会报错。#99332 (Desel72). - 修复了在包含 Dynamic 的 Tuple 中使用稀疏序列化时 CHECK TABLE 的问题。关闭 #96588。#99351 (Pavel Kruglov).
- 修复了文本索引预处理器验证过于严格的问题。#99359 (Anton Popov) 。
- 修复带有隐式 minmax 索引的复制表从 25.10 升级到更高版本时的兼容性问题。 #99392 (Raúl Marín).
- 移除了文本索引分析对否定函数 (
notEquals、notLike、notIn) 的支持。这些函数本来就无法跳过任何粒度,因此为它们进行索引分析只会徒增开销,毫无收益。#99393 (Anton Popov) 。 - 修复了在 IN 子查询中使用
Distributed表时,新 analyzer 下optimize_skip_unused_shards的问题。#99436 (Nikolai Kochetov). - 修复当查询产生重复列名时,
INTERSECT/EXCEPT中的 heap-use-after-free 问题。#99471 (Alexey Milovidov) 。 - 修复了
ALTER TABLE ... DROP PART在使用带类型的查询参数作为分片名称时的逻辑错误。#99489 (Alexey Milovidov) 。 - 修复了
NOT_FOUND_COLUMN_IN_BLOCK异常:当通过别名在SELECT和WHERE子句中同时引用文本索引谓词 (如hasAllTokens) 时,会触发该异常。#99504 (Anton Popov). - 修复了在对具有各自独立文本索引的列执行 OR 操作时使用
hasAllTokens会导致结果不正确的问题。#99505 (Anton Popov). - 在
clickhouse-local中初始化页缓存,使page_cache_max_size设置生效。#99510 (Alexey Milovidov) 。 - 修复了一个罕见问题:在执行
DETACH/ATTACH TABLE查询后,可能会错误地将数据分区片段标记为损坏并将其分离。#99529 (Anton Popov). - 修复了通过 HTTP 接口使用 Pretty 格式查询空系统表时触发的
std::length_error异常。#99541 (Alexey Milovidov). - 修复了使用
ALTER TABLE ADD COLUMN创建与虚拟列 (如_part_offset) 同名的EPHEMERAL列时触发的LOGICAL_ERROR。#99549 (Alexey Milovidov) 。 - 修复了因缓存键不匹配导致在移除分片后
VectorSimilarityIndexCache条目始终无法被淘汰的问题。#99575 (Seva Potapov). - 禁止从本地文件读取 Google 凭据。此设置存在安全隐患,因为一旦知道文件路径,就可能读取其他凭据。#99584 (Konstantin Vedernikov).
- 修复 analyzer 中的性能劣化问题。移除 ARRAY JOIN 中未使用的列。#99587 (Dmitry Novik) 。
- 修复了在已启用轻量级删除和行策略的表中读取文本索引时的问题。#99661 (Anton Popov) 。
- 修复 Parquet 读取器在 filter-in-decoder path 遇到已过滤页面时的 nullptr 解引用问题。关闭了 #99676。#99677 (Alexey Milovidov).
- 修复了 AsynchronousReadBufferFromFileDescriptor 在使用 O_DIRECT 时错误的寻道操作。关闭了 #99358。#99678 (Pavel Kruglov)。
- 修复了解压格式错误的压缩数据时,
CompressionCodecT64中的堆缓冲区溢出,以及CompressionCodecMultiple中的进程中止问题。这两个问题均由新的 libFuzzer 目标发现。现在这些编解码器会抛出异常,而不是发生崩溃。#99680 (Rahul). - 将处理推迟到服务器完成所有表的加载之后。#99700 (Seva Potapov) 。
- 修复 MySQL 字典源在内联 DDL 参数场景下绕过
RemoteHostFilter的问题。#99720 (Shaohua Wang) 。 - 修复遍历
system.tables中的数据湖表时出现的逻辑错误。#99739 (Konstantin Vedernikov) 。 - 修复了带有预处理器的文本索引在分析使用
IN函数的谓词时的问题。修复了文本索引中搜索标记发生冲突的问题,这可能导致结果不正确。#99755 (Anton Popov) 。 - 修复读取形状维度为负数的
Npy格式文件时出现的无限循环问题。#99812 (Desel72) 。 - 修复了在查询计划头部计算过程中、按零行进行求值时,
CRC32函数处理FixedString参数会触发的 global-buffer-overflow 问题。 #99835 (Alexey Milovidov) 。 - 修复在 Iceberg 表上执行
ALTER TABLE ... MODIFY COLUMN ... COMMENT时因空指针解引用导致的崩溃。#99838 (Desel72). - 修复了
aggregate_functions_null_for_empty设置,使其可与返回非Nullable类型 (如Array或Map) 的聚合函数配合使用 (例如groupArray、sumMap) 。#99839 (Alexey Milovidov) 。 - 修复了在
midpoint函数使用有符号/无符号混合整数类型调用时触发的 LOGICAL_ERROR 异常。#99867 (Alexey Milovidov) 。 - 修复带有 HAVING 子句的查询中出现的 “块结构不匹配” 异常:当过滤表达式同时包含由会生成 NULL 的函数包装的聚合,以及
materialize(0)时,会触发该问题。#99915 (Alexey Milovidov). - 修复了当
data参数为键类型为 Array 的 Map 或其他嵌套 Array 类型时,sipHash128Keyed(以及类似的带密钥哈希函数) 中的断言失败问题。#99921 (Alexey Milovidov) 。 - 修复在使用
convertAnyJoinToSemiOrAntiJoin优化查询计划期间,IN函数中出现的LOGICAL_ERROR异常 “Set 未就绪”。#99939 (Alexey Milovidov) 。
构建/测试/打包改进
- 通过移除重量级头文件包含,并将高开销的模板实例化移出头文件,缩短编译时间。#97893 (Raúl Marín).
- 通过缩减模板分发矩阵并移除重量级包含,缩短算术函数及相关头文件的编译时间。#98204 (Raúl Marín).
- 使用
mongo-c-driver2.2.2。#98304 (Konstantin Bogdanov). - 使用
postgresREL_18_3。#98306 (Konstantin Bogdanov). - 为 UBSan 构建启用 jemalloc 分配器,以避免因 glibc malloc 内存回收能力较差而导致 RSS 累积。#98444 (Alexey Milovidov).
- 使用 Rust v0 符号修饰,并从 PRQL 库中剥离内部符号,以减少解析器组合器库带来的符号名膨胀。#98446 (Alexey Milovidov).
- 向
tests/benchmarks添加 TPC-H 基准测试套件和 TPC-DS README。#98495 (Raufs Dunamalijevs). - 为全部 99 个 TPC-DS 查询添加正确性测试。#99204 (Raufs Dunamalijevs).
- 添加一个集成测试,用于复现离线副本场景下 DDL CREATE TABLE + ALTER 的 bug (#44070) ,并将其标记为预期失败。#99259 (Raufs Dunamalijevs).
- 以
je_前缀集成 jemalloc,并移除对链接器--wrap的使用。#99342 (Azat Khuzhin).
向后不兼容的变更
- 默认情况下,所有插入操作都启用去重。此前,异步插入和 MV 的默认去重是关闭的,而同步插入则默认开启。此更改的目的是让这两种插入方式使用相同的默认设置。如果你在集群上显式禁用了去重,则必须显式设置
deduplicate_insert='backward_compatible_choice'以保留原有行为。deduplicate_blocks_in_dependent_materialized_views也是如此。#95970 (Sema Checherinda) 。 - 统计信息的存储格式已优化。现在,所有统计信息都存储在一个文件中。#93414 (Anton Popov) 。如果你没有明确启用表统计信息,可以忽略此项。
- 限制 S3(Azure)Queue 在内存中保存的元数据。系统表已从
azure_queue更名为azure_queue_metadata_cache,并将system.s3queue更名为s3queue_metadata_cache。#95809 (Kseniia Sumarokova) 。 - 此前,对
Variant列应用函数时,如果变体子类型与函数不兼容,会静默返回 NULL;现在则会抛出异常,这可能会导致依赖这种静默返回 NULL 行为的查询失效。 #95811 (Bharat Nallan). - 来自 PostgreSQL 的
DATE列现在在 ClickHouse 中会推断为Date32(在之前的版本中,它们会被推断为Date,这会导致超出较小范围的值发生溢出) 。现已支持将Date32值再插入 PostgreSQL。关闭 #73084。#95999 (Alexey Milovidov) 。 do_not_merge_across_partitions_select_final设置的语义现在更加明确了。此前,如果未在 config 中显式设置该 setting,这一功能可能会被自动启用。这一行为反复引发困惑,而且遗憾的是,还在生产环境中导致了一些问题。现在,规则更简单了:do_not_merge_across_partitions_select_final=1会无条件启用该功能。如果do_not_merge_across_partitions_select_final=0,则仅当新的 settingenable_automatic_decision_for_merging_across_partitions_for_final=1时才会使用自动模式,否则不会使用。为了尽可能保留旧行为,默认值被设置为do_not_merge_across_partitions_select_final=0和enable_automatic_decision_for_merging_across_partitions_for_final=1。#96110 (Nikita Taranov) 。- 现在,在创建显式指定列的 S3 表时,ClickHouse 会验证这些列名是否确实存在于远程文件的 schema 中。此前列名不匹配时仍可正常运行的查询,现在会在建表时失败。此更改修复了 #96089。#96194 (Konstantin Vedernikov) 。
- 禁止在 ORDER BY 和其他表键表达式中使用子查询。#96847 (Alexey Milovidov) 。
- 默认启用
apply_row_policy_after_final。最初,当optimize_move_to_prewhere_if_final=0时,ROW POLICY 和 PREWHERE 都会遵循 FINAL,并在 FINAL 之后生效。#87303 破坏了这一行为,因为它在 ROW POLICY 过滤器上忽略了optimize_move_to_prewhere_if_final。为修复此问题,此 PR 启用了 #91065 中引入的设置apply_row_policy_after_final。启用apply_row_policy_after_final后,ROW POLICY 将像之前一样默认继续遵循 FINAL。此 PR 属于不兼容变更,因为它改变了optimize_move_to_prewhere_if_final=1时的行为。现在,如果要让 ROW POLICY 在 FINAL 之前生效,应使用apply_row_policy_after_final,而不是optimize_move_to_prewhere_if_final。#97279 (Nikolai Kochetov) 。 Date类型现在在 Arrow/ArrowStream 格式中会序列化为 Arrow 原生的date32类型,而不再是uint16。像 PyArrow 这样的工具现在可以正确地将该列识别为日期类型。旧行为可通过output_format_arrow_date_as_uint16设置恢复。仍然支持读取旧版 Arrow 文件,这些文件对Date列使用了uint16。#96860 (Alexey Milovidov).
新特性
- 用户现在可以直接在 ClickHouse 中使用 ClickStack (一款可观测性 UI) ,这对调试和本地开发很有帮助。#96597 (Aaron Knudtson) 。
- 支持将基于时间的一次性密码 (TOTP) 用作身份验证方法。#71273 (Vladimir Cherkasov) 。
- 新增
lazy_load_tables数据库设置。启用后,数据库启动时不会加载表,而是先创建一个轻量级的StorageTableProxy,并在首次访问时再将真实的表引擎 materialized。#96283 (xiaohuanlin) 。 - 新增了
input_format_max_block_wait_ms设置,以便在超时后输出数据块,并允许在 HTTP 连接意外关闭时继续处理剩余数据。#94509 (Mostafa Mohamed Salah). - Google BigLake catalog 集成。已关闭 #95339。#97104 (Konstantin Vedernikov) 。
- 新增系统表
system.tokenizers,用于展示所有可用的分词器。#96753 (Robert Schulze) 。 - 新增系统表
system.user_defined_functions,用于监控 UDF 的加载状态及其配置。#90340 (Xu Jia) 。 - 新增
system.jemalloc_stats表,用于公开 jemalloc 内存分配器的统计信息 (通过malloc_stats_print) ,以便诊断使用 jemalloc 构建的服务器上的内存使用情况。另在 ClickHouse HTTP interface 上新增了/jemalloc.htmlHTTP 端点,用于以交互方式可视化这些统计信息。#97077 (Antonio Andelic). - 新增了
system.jemalloc_profile_text表,用于读取和分析 jemalloc 堆内存剖析数据。输出格式由jemalloc_profile_text_output_format设置控制 (raw、symbolized 或 collapsed;默认为 collapsed) 。内联帧解析由jemalloc_profile_text_symbolize_with_inline控制 (启用时,会包含内联帧,但符号化速度会变慢;禁用时,则会跳过内联帧以加快输出) 。对于 collapsed 格式,jemalloc_profile_text_collapsed_use_count控制技术栈是按存活分配次数 (true) 还是按存活字节数 (false,默认) 加权。这使 jemalloc 堆内存剖析的内存分析和火焰图可视化更加便捷。修复了 #93248。#97218 (Antonio Andelic) 。 - 新增
default_dictionary_database设置,使 ClickHouse 能够在指定的默认数据库中解析未带数据库限定符的 external dictionaries 引用。这简化了从以 XML 定义的全局字典迁移到以 SQL 定义的按数据库划分的字典——让现有的字典查询 (例如 dictGet(‘name’, …)) 无需修改即可继续使用。#91412 (Dmitrii Plotnikov) 。 - 为
DatabaseReplicated添加对辅助 ZooKeeper 的支持。#91683 (RinChanNOW) 。 - 新增了表函数
primes和系统表system.primes,其中包含按升序排列的质数。关闭 #90839。#92776 (Nihal Z. Miaji) 。 - 异步插入支持并行 quorum。插入的数据会复制到满足 quorum 的副本上。如果发现重复项,查询会等待,直到先前插入的数据也完成复制。#93356 (Sema Checherinda).
- 新增函数
colorOKLABToSRGB和colorSRGBToOKLAB,用于在 sRGB 与 OKLAB 之间相互转换值。#93361 (Pranav Tiwari). - 新增
deduplicate_insert设置,用于覆盖insert_deduplicate和async_insert_deduplicate。#94413 (Sema Checherinda) 。 - 服务器级设置
insert_deduplication_version支持迁移到统一的去重哈希。#95409 (Sema Checherinda) 。 - 新增
xxh3_128哈希函数。#96055 (Raúl Marín) 。 - 新增了
OPTIMIZE <table> DRY RUN PARTS <part names>查询,可在不提交结果分片的情况下模拟合并操作。它可用于测试场景:验证新版本中合并操作的正确性、确定性地复现与合并相关的 bug,以及可靠地对合并性能进行基准测试。#96122 (Anton Popov). - 新增一项默认启用的检查,可通过设置
check_named_collection_dependencies控制,以避免删除被表使用的命名集合。#96181 (Pablo Marcos) 。 - 新增了
system.fail_points,可用于查看服务器中现有的 failpoint 以及它们是否已启用。这将有助于实现测试自动化。#96762 (Pedro Ferreira) 。 - 为 Glue catalog 添加基于角色的访问。使用
aws_role_arn设置,以及可选的aws_role_session_name设置。#90825 (Antonio Andelic) 。 - 新增设置
add_minmax_index_for_temporal_columns;启用后,会自动为所有Date、Date32、Time、Time64、DateTime和DateTime64列创建 MinMax 索引。#93355 (Michael Jarrett) 。 - 支持用于 JOIN 的扩展表别名 (例如
SELECT * FROM (SELECT 1) AS t(a) JOIN (SELECT 1) AS u(b) ON a = b这样的查询) 。已关闭 #95131。#95331 (Yarik Briukhovetskyi) 。 - 新增了对 Iceberg 表执行
ALTER TABLE RENAME COLUMN的支持。此前仅支持ADD COLUMN, DROP COLUMN, and MODIFY COLUMN。#97455 (murphy-4o) 。
Experimental 功能
- 文本索引现已 GA。#96794 (Robert Schulze)。
- 用于量化位打包向量存储 (用于近似最近邻搜索) 的
QBit数据类型现已正式可用,不再需要启用实验性设置。#95358 (Raufs Dunamalijevs)。 - ClickHouse 中的向量搜索现在可以利用集群中的副本来_分摊_负载,并搜索向量索引 parts。这使 ClickHouse 能够支持超出单台 VM 内存容量的大型向量索引。#95876 (Shankar Iyer)。
- 新增由
ast_fuzzer_runs和ast_fuzzer_any_query设置控制的服务端 AST fuzzer。启用后,服务器会在每个查询正常执行完毕后,对其随机变更版本再次执行,并丢弃结果。#97568 (Alexey Milovidov)。 - 在实验性的 KQL 方言中新增
iif函数。#94790 (happyso)。 - schema 推断现在会遵循
allow_experimental_nullable_tuple_type。启用后,推断出的 Tuple 类型可以为Nullable(Tuple(...)),这样缺失的嵌套对象就会变为NULL,而不是由NULL元素组成的 Tuple。#95525 (Nihal Z. Miaji)。 use_statistics_cache设置现已默认启用,因此列统计信息会缓存在内存中,从而加快查询优化,而无需从每个 part 重新加载。#95950 (Han Fei)。
性能提升
- 允许将主键中的任何确定性表达式用于数据跳过 (例如
ORDER BY cityHash64(user_id)/ORDER BY length(user_id)) 。对于确定性表达式,ClickHouse 可以将该表达式应用到查询常量上,并在主键索引中使用其结果来处理=、IN和has等谓词。如果该表达式还是单射的 (例如ORDER BY hex(p)或ORDER BY reverse(tuple(reverse(p), hex(p)))) ,我们还可以有效地将索引用于其否定形式:!=、NOT IN和NOT has。解决了 #10685。解决了 #82161。#92952 (Nihal Z. Miaji) 。 - 优化了统计信息的存储格式。现在,所有统计信息都存储在一个文件中。#93414 (Anton Popov) 。
- 支持对文件系统缓存中的远程表引擎/函数进行并行读取。#71781 (Kseniia Sumarokova) 。
- 允许在本地文件和对象存储表函数中使用用户态页缓存。#77874 (Michael Kolupaev) 。
- 避免用户态页缓存中不必要的 memcpy 操作。#77884 (Michael Kolupaev) 。
concurrent_threads_scheduler的默认值现已由fair_round_robin改为max_min_fair。这一调整通过优先处理已分配槽位较少的查询,提升了高负载下的公平性,从而避免短时查询因长时查询而吃亏。#95300 (Sergei Trifonov).- 如果某个
FINAL查询先使用主键条件进行过滤,再对其他条件使用跳过索引,那么PrimaryKeyExpand处理步骤现在只会检查最初筛选出的主键范围是否相交。#94903 (Shankar Iyer) 。 - 当并行副本与
s3(...)等表函数配合使用时,仅包含一个封装该表函数的子查询的查询现在也会自动在各个副本间并行执行;而此前只有直接引用表函数的查询才会并行执行。关闭 #92264。#96332 (phulv94). - 支持将缓存中的数据文件和系统文件分别拆分到独立的分段中。#87834 (MikhailBurdukov) 。
- 通过为
ColumnVector::replicate实现动态分派,提升了某些哈希 join 操作的速度。#79573 (Raúl Marín) 。 - 针对复杂谓词场景下的并行哈希连接进行了性能提升。此前,未连接的行仅由单个线程处理,这样的效率并不理想;此次优化的思路是将未连接行的处理并行化,分配到多个线程中执行。可通过
parallel_non_joined_rows_processing设置控制。默认启用。 #92068 (Yarik Briukhovetskyi). - 小幅优化 JSON 类型的解析。#93614 (Pavel Kruglov) 。
- 优化 AST 的内存占用。在未启用高亮且不解析 VALUES 时,这些字段不会被使用,因此这项优化是合理的。#93974 (Ilya Yatsishin) 。
- 优化命名 Tuple AST 对象的内存占用。将列名作为字符串存放在 tuple 对象中,而不是存放在通用的 AST 字面量节点中。#94704 (Ilya Yatsishin) 。
- 通过增加额外的链接器选项,去虚拟化得到了改进。#94737 (Nikita Taranov).
- 通过批量处理 ZooKeeper 请求,提升包含大量 parts 的 ReplicatedMergeTree 表的副本克隆性能。#94847 (c-end) 。
- 当 read step 已有 PREWHERE 过滤器时,就无法再添加新的过滤器。此更改将 PREWHERE 优化推迟到 JOIN 运行时过滤器优化之后,以便也能将运行时过滤器下推到 PREWHERE。 #95838 (Alexander Gololobov).
- 通过在 x86 上使用动态分派,加速
T64编解码器的压缩。 #95881 (Raúl Marín). - 在可能的情况下,通过对插入操作进行批处理来加速数值类型上的
uniq(非 NULL、非 -If、无 GROUP BY、无 IPv6 或 String) 。#95904 (Raúl Marín) 。 - Keeper 的底层优化:经发现,
ZooKeeper::observeOperations占 ZooKeeper 接收线程 CPU 占用的 >20%。此次更改通过以下方式对此进行优化:1. 对于AggregatedZooKeeperLog::stats,使用CityHash64替代SipHash,速度快 >10 倍。2. 对于Coordination::ErrorCounter,使用std::array<std::atomic<UInt32>, N>替代std::unordered_map和std::mutex。#95962 (Miсhael Stetsyuk) 。 - 取消 ProfileEvents::Counter 的 64 字节对齐以节省内存。#96097 (Azat Khuzhin) 。
- 内存优化:将
CachedOnDiskReadBufferFromFile结构体的大小缩小了 50 倍。#96098 (Azat Khuzhin). - 如果哈希表为空,调整大小时不要复制旧数据。#96180 (Raúl Marín).
- 支持在
RIGHT OUTERJOIN 中使用运行时过滤器。#96183 (Hechem Selmi) 。 - 优化项
enable_join_runtime_filters现在默认启用。#89314 (Alexey Milovidov) 。 - 此前,只有当所有 parts 都具有 materialized 文本索引时,才会应用文本索引直接读取优化。此 PR 新增了部分支持:如果某些 parts 具有 materialized 文本索引,这些 parts 将使用该索引;而没有 materialized 文本索引的 parts 则会回退到执行原始过滤表达式。#96411 (Anton Popov).
- 为系统日志表中的时间列添加了
minmax次级索引,并为query_id/initial_query_id列添加了bloom_filter索引,以提升过滤速度。#96712 (Alexey Milovidov). - 现在,惰性物化优化已扩展到
UNION ALL查询的所有分支,不再仅作用于第一个分支。对于通过UNION ALL组合来自不同MergeTree表的多个已排序且带 LIMIT 的读取操作的查询,现在每个分支都能受益于延迟列读取,从而减少 I/O。#96832 (Federico Ginosa). - 通过移除不必要的数据拷贝,并为数值列启用向量化的最小/最大值计算,优化 INSERT 期间 minmax 跳过索引的计算。#97392 (Raúl Marín).
DeltaLake存储现会从 Delta Lake 元数据中获取count()的结果,并在 system.tables 中显示正确的表统计信息 (总字节数/总行数) 。#96190 (Kseniia Sumarokova) 。- 如果从 MergeTree 读取,未使用的列也会在读取阶段被移除。当过滤器被下推到
PREWHERE时,这项优化尤其有用。#89982 (János Benjamin Antal) 。 - 通过仅拉取表名,优化了
SHOW TABLES查询的处理,并改进了 getLightweightTablesIterator,使其仅返回包含表名的结构。解决了 #93835。#94467 (Smita Kulkarni) 。 - 改进
assumeNotNull、coalesce和ifNull:当键列被这些函数包裹时,可针对范围谓词启用主键和跳过索引剪枝。关闭 #94689。#94754 (Nihal Z. Miaji) 。 - 为 Keeper 的 getChildren 请求添加 with_data 和 with_stat 扩展。这样一来,一次操作不仅可以拉取子节点列表,还能获取它们的
stat和/或data。#94826 (Nikolay Degterinsky) 。 - 无论最终执行的是本地 plan,还是带有并行副本的 plan,索引分析 (在大多数情况下) 都只需进行一次。 #94854 (Nikita Taranov) 。
- 支持根据 parts 数量 (
distributed_index_analysis_min_parts_to_activate) 和索引大小 (distributed_index_analysis_min_indexes_size_to_activate) 启用分布式索引分析。#95216 (Azat Khuzhin) 。 - 为 Iceberg 表启用 PREWHERE 优化。#95476 (Konstantin Vedernikov) 。
- 降低某些 AST 类的内存占用。#95514 (Raúl Marín) 。
- 限制在启用
split_intersecting_parts_ranges_into_layers时生成的管道流数量,以避免内存消耗过高。#96478 (Nikita Taranov). - 为多个连接实现等价集合优化。包含多个连续
INNER JOIN操作的查询现在可受益于改进后的过滤器下推优化。当表基于等价列进行连接时 (例如,t1 JOIN t2 ON t1.id = t2.id JOIN t3 ON t2.id = t3.id WHERE t1.id > 10) ,应用于该连接链中任意表的过滤器都会自动下推到所有表。关闭 #96550。#96596 (Vladimir Cherkasov) 。 - 优化 delta lake 元数据扫描。采用了 delta-kernel PR https://github.com/delta-io/delta-kernel-rs/pull/1827 中的变更。#96686 (Kseniia Sumarokova) 。
- 在 Replicated database 中,不必为每个虚拟查询都更新已缓存的集群。#96897 (Tuan Pham Anh) 。
- 如果前缀只包含 ASCII 字符,则在使用
startsWithUTF8进行过滤时会使用主键索引。#97055 (vkcku).
改进
- 为 Keeper 请求添加 OpenTelemetry 链路追踪。#91332 (Miсhael Stetsyuk) 。
- 新的配置选项:
logger.startup_console_level&logger.shutdown_console_level,分别用于在 ClickHouse 启动和关闭期间覆盖控制台的日志级别。#95919 (Garrett Thomas) 。 - 重新加载配置时遵循命令行覆盖设置。关闭 #80294。#80295 (Alexey Milovidov) 。
- 允许在
mongodb表函数中以键值对方式覆盖命名集合参数。#89616 (vanchaklar). - 现在,Iceberg 表的按序读取优化也支持
icebergBucket和icebergTruncate这类复杂排序函数,不再局限于简单的列引用。#90256 (Konstantin Vedernikov) 。 - 在 system.mutations 中新增一个名为 parts_postpone_reasons 的列,以增强诊断能力,用于显示 parts 的延迟原因。#92206 (Shaohua Wang).
- 在
DataflowStatisticsCache中跟踪待读取行数的变化 (由插入/删除操作或查询条件缓存的使用导致) 。#93636 (Nikita Taranov) 。 - 支持 SYSTEM RESET DDL WORKER [ON CLUSTER] 查询。该查询会请求在 DDLWorker 的主线程中重置其状态。当 host ID 更新时,这有助于刷新副本的活跃状态。#93780 (Tuan Pham Anh) 。
- 在
system.part_log中为MUTATE_PART和MUTATE_PART_START事件类型添加了对mutation_ids的支持。#93811 (Shaohua Wang) 。 - 后台操作 (Mutate、Merge) 现在可通过 ‘background’ profile 单独配置。此前,这类操作通过 ‘default’ profile 与常规查询共用设置。#93905 (Arsen Muk).
- 向
system.crash_log中添加更多信息。#94112 #95857 (Miсhael Stetsyuk) 。 - 新增了
QueryNonInternal指标,用于跟踪当前正在执行的非内部查询数量。该指标以ClickHouseMetrics_QueryNonInternal的形式暴露,帮助运维人员针对max_concurrent_queries限制监控查询并发度,而该限制仅适用于非内部查询。#94284 (Ashwath Singh). - 在
RuntimeDataflowStatisticsCacheUpdater中支持收集来自 compact parts 的列的输入字节统计信息。#94626 (Nikita Taranov) 。 - 增加一项检查,用于发现可能导致集群组建失败的 Keeper 配置错误。关闭了 #60932。#94682 (Konstantin Bogdanov) 。
- 改进分片加载期间对 JSON 前缀的反序列化。#94848 (Pavel Kruglov) 。
- 将写入流程重构为使用完整的 INSERT 管道,以触发目标表上的 materialized views。 #94890 (Kai Zhu).
- 仅当搜索列上存在索引时,才使用向量相似性搜索的查询计划优化。#94998 (Eduard Karacharov) 。
- 在用户身份验证之前检查总内存限制;如果总限制超过允许值,则抛出
(total) memory limit exceeded。#95003 (Nikolai Kochetov) 。 - 新增了
throw_on_unmatched_row_policies配置选项;启用后,如果用户查询的表存在行策略,但其中没有任何一条适用于该用户,则会抛出异常,从而避免因访问控制配置错误而返回所有行这种语义含糊的行为。 #95014 (Vitaly Baranov). - 在使用 Unity Catalog 的长时间运行查询中动态更新 S3 访问令牌。此更改关闭了 #93981。#95069 (Konstantin Vedernikov).
- 如果 ClickHouse 持续处于内存压力下达
memory_worker_decay_adjustment_period_ms毫秒,则禁用 jemalloc 的脏页衰减。如果 ClickHouse 在相同时间内恢复正常运行,则重新启用 jemalloc 的脏页衰减。#95145 (Antonio Andelic) 。 - S3Queue 现已支持辅助 ZooKeeper,可使用 s3Queue 中的
keeper_path设置。#95203 (Diego Nieto) 。 - 在生存时间 (TTL) drop part merge 中遵循
max_parts_to_merge_at_once限制。#95315 (Kseniia Sumarokova) 。 - 向 query_log 添加
connection_address和connection_port,以反映物理连接 (当通过 proxy 连接且 auth_use_forwarded_address=1 时,address和port会被替换) 。#95471 (Yakov Olkhovskiy) 。 - 修复了查询条件缓存的内存统计错误。问题的关键在于,之前没有将由多个字符串组成的缓存键计入统计 (例如 part_name、表 ID 以及整个 SQL 条件) 。#95478 (Nikita Mikhaylov) 。
- 使用嵌入式配置启动的服务器将像常规配置一样,支持管理用户和授权,并将其保存到
access目录中。这改进了测试体验。此外,还在嵌入式配置和 clickhouse-local 中启用了所有 access_control_improvements。#95481 (Alexey Milovidov). - 改进了 S3 身份验证错误消息:当访问被拒绝时,会提示检查凭据。#95648 (Gerald Latkovic) 。
- 启用统计信息缓存,并将缓存更新周期设置为 300 秒。#95841 (Han Fei).
- 为
system.aggregated_zookeeper_log添加组件名称。#95882 (Antonio Andelic) 。 - 从
system.tables查询DeltaLake表时,跳过对对象存储的读取。#95899 (Antonio Andelic) 。 - 当
compatibility设置为26.2或更高版本时,默认启用enable_max_bytes_limit_for_min_age_to_force_merge。#95917 (Christoph Wurm) 。 - Delta Lake 现已可在 macOS 上使用。修复 #95979。#95985 (Alexey Milovidov) 。
- 在先前版本中,将存在冲突的 ALTER 表达式与 UPDATE 和 RENAME COLUMN 组合使用时,抛出的是逻辑错误,而不是正确的异常。关闭了 #70678。#96022 (Alexey Milovidov) 。
- 改进所有 ClickHouse 应用程序的帮助输出,新增
--no-sudo选项,并修复了一些问题。这是对 Ilya Yatsishin 提交的 #58244 的延续。#96025 (Alexey Milovidov) 。 - 为
cosineDistance新增distanceCosine别名,因为其他所有距离函数都已有这种形式的别名。#96065 (Raufs Dunamalijevs) 。 - 新增对
with_dataKeeper 扩展的支持,以改进 Database Replicated 中的表拉取能力。#96090 (Nikolay Degterinsky). - 将 chdig 更新至 v26.2.1 (新增功能并支持 MacOS) 。#96113 (Azat Khuzhin) 。
- 改进了
numbers和primes的过滤器下推。现在,当无法推导出精确边界时,ClickHouse 可以根据WHERE条件推导出保守的取值边界,并据此限制序列生成 (例如,对于WHERE number % 5 < 2 AND number > 100 AND number < 300,ClickHouse 只会生成 100 到 300 之间的数字,然后再应用谓词) ,从而避免无界扫描。关闭 #84853。关闭 #93913。#96115 (Nihal Z. Miaji) 。 - 此前,当存在
COMMENT子句时,为避免解析歧义,格式说明符会用括号将 SELECT 括起来。现在改为在AS SELECT之前输出COMMENT,无需加括号也能消除歧义。#96293 (Alexey Milovidov). allow_impersonate_user配置项现已移至access_control_improvements部分中,不再作为独立的服务器级设置。#96451 (Vitaly Baranov).- 使
core_dump.size_limit配置项支持热重载,避免为使配置更改生效而必须重启服务器。#96524 (Miсhael Stetsyuk) 。 - 改进了 CPU 和实时 Profiler 与套接字超时机制之间的兼容性。#96601 (Sergei Trifonov) 。
- 如果在 DROP COLUMN 变更后很快执行 ADD COLUMN,可防止已删除的数据重新出现。#96713 (Alexey Milovidov) 。
- 将
system.instrumentation中的function_id类型从 LowCardinality(Int32) 改为 Int32。#96726 (Copilot) 。 - 同步等待变更时,将遵循查询取消和时限。#96756 (Alexey Milovidov).
- 新增了系统命令
SYSTEM RELOAD DELTA KERNEL TRACING <level>,可用于调整 delta-kernel 日志,这在调试时可能很有帮助。#96763 (Kseniia Sumarokova) 。 - 按 IP 地址家族进行过滤 (即
dns_allow_resolve_names_to_ipv4/ipv6设置) 即使在禁用 DNS 缓存时也会生效。#96810 (c-end) 。 - 改进 jemalloc 内部信息。#96840 (Azat Khuzhin) 。
- 修复
/playWeb UI 查询系统表时抛出QUERY_CACHE_USED_WITH_SYSTEM_TABLE的问题。#96869 (Alexey Milovidov). - 改进 Web UI:更改 favicon 以指示查询运行状态;显示辅助查询 (加载数据库和表) 返回的错误,而不是悄悄忽略它们。关闭 #85055。#96883 (Alexey Milovidov) 。
- 使
/playUI 中的左侧面板支持点击,以切换数据库列表的显示状态。#96884 (Alexey Milovidov) 。 DROP DATABASE现在会按依赖关系的逆序删除表,从而在数据库包含存在加载依赖项的表 (例如使用joinGet的Distributed表) 时提高崩溃安全性。#97057 (Alexey Milovidov).- 升级 yaml-cpp,以防无效的 YAML 被跳过。#97333 (Azat Khuzhin) 。
- 在拉取表期间,在
play.html侧边栏显示加载指示器。#97531 (Alexey Milovidov) 。 - 在内置 web UI (play.html) 中,为原始查询结果新增了一个复制到剪贴板的按钮。#97532 (Alexey Milovidov) 。
- 修复查询混淆器 (
clickhouse-format --obfuscate) ,使其在更多情况下生成可被解析的 SQL。#97584 (Alexey Milovidov) 。
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 在仅修改 metadata 的 ALTER 操作 (例如扩展枚举的元素) 之后,使用投影优化聚合时最终可能会导致异常。#84143 (Alexey Milovidov) 。
- materialized views 现在会使用其创建所在的 database 作为执行上下文,这意味着:- 可以在视图的 select 查询中省略所引用名称的显式 database 限定 - 如果未显式指定 database 限定,则默认使用创建 materialized view 时所在的同一个 database。 #88193 (Dmitry Kovalev).
- 修复了在使用 ON CLUSTER 时,CREATE USER 身份验证方法中的查询参数替换问题。身份验证方法中的查询参数 (例如密码) 此前不会被替换,导致远程节点上出现 UNKNOWN_QUERY_PARAMETER 错误。#92777 (xiaohuanlin).
- 修复了
has、mapContainsKey和mapContainsValue函数在文本索引分析中的结果不一致问题。此前,使用这些函数的查询在表达式通过文本索引求值或不通过文本索引求值时,可能返回不同的结果。#93578 (Anton Popov). - 修复了在将表附加到
MaterializedPostgreSQL数据库时,若dropReplicationSlot在栈展开过程中抛出异常而导致崩溃的问题。#96871 (Alexey Milovidov) 。 - 如果同时对同一文件执行大量彼此冲突的备份操作,可能会导致服务器崩溃。#93659 (Alexey Milovidov).
- 修复了在使用并行副本且对非 MT 表执行 JOIN 时的查询问题。关闭 #92056。#93902 (Igor Nikonov) 。
- 修复了一个问题:当 Iceberg 列名中包含点号时,其值会返回为 NULL。#94335 (Mikhail Koviazin).
- 修复了
stringJaccardIndexUTF8中 UTF8 字符串处理的问题,并提升了性能。#94613 (Joanna Hulboj) 。 - 修复
WITH FILL STALENESS中可能发生的溢出问题 (会导致 UB 和/或无限循环) 。修复因跨度过大而导致的潜在无限循环。新增对旧 analyzer 的支持 (主要用于压力测试) 。#94663 (Azat Khuzhin). - 修复了在主机名解析到多个地址且远程副本冻结时,分布式查询可能挂起的问题。#94726 (c-end).
- 修复在连接多个表表达式时,当最左侧的表表达式为
-Cluster表函数时结果无效的问题。解决了 #89996。#94748 (Konstantin Bogdanov) 。 - 修复涉及
toWeek、toYearWeek、toStartOfWeek、toLastDayOfWeek和toDayOfWeek的谓词时,主键和跳过索引剪枝不正确的问题,并修复其中部分函数在对LowCardinality(String)执行有效查询时抛出异常的问题。#94816 (Nihal Z. Miaji). - 移除了对启用 SQL Security 的视图执行
ATTACH查询时不必要的权限检查跳过逻辑。这可防止用户在未验证所需访问权限的情况下附加带有 definer 的视图时发生潜在的权限提升。#94865 (pufit). - 修复了
ReplicatedMergeTree启动期间因并发移除delete_tmp_*目录而导致的崩溃。#94892 (myeongjun). - 修复了对带有 materialized view 的 Iceberg 表执行
INSERT时丢失去重信息并导致异常的问题。 #94938 (Daniil Ivanik). - 修复了一个 bug:
SYSTEM DROP QUERY CACHE TAG 'TAGNAME' ON CLUSTER <CLUSTERNAME>原本会删除整个集群上的全部缓存。#94978 (Rory Crispin). - 在 Vertical merge 后保留恒定的索引粒度 (use_const_adaptive_granularity) (包括修复了 Nested 的 v2 以及一般情况) 。#95013 (Azat Khuzhin) 。
- 修复了在 [ClickHouse/ClickHouse#82764](https://github.com/ClickHouse/ClickHouse/pull/82764) 之后,26.1 版本中文件系统缓存的竞争问题。#95042 (Kseniia Sumarokova) 。
- 修复在 clickhouse-client 中使用 KILL QUERY 和取消查询 (Ctrl+C) 时,无法取消 postgresql() 表函数的问题。#95136 (Roman Vasin).
- 修复了在使用多个 join 且带有
USING子句时,对源表中带限定名前缀的列进行类型推断的问题。此前,后续 join 会错误地将底层源列的类型更新为共同超类型,即使该列并未参与该 join (例如,在SELECT t2.a FROM t1 LEFT JOIN t2 USING (a) LEFT JOIN t3 USING (a)中,t2.a列仅用于第一个 join,因此其类型应为t1.a和t2.a的超类型,不应包含t3.a) 。当函数预期的列类型与执行计划中实际出现的类型不一致时,这可能会导致逻辑错误或崩溃。#95157 (Vladimir Cherkasov) 。 - 在获取清单 .avro 列表和文件内容时,仅对列执行一次转换。#95164 (Daniil Ivanik).
- 修复了 JSON 列大小计算错误的问题,此问题可能导致内存占用过高或列统计信息错误。#95207 (Azat Khuzhin).
- 修复了在轻量级更新后应用大型补丁分区片段时内存统计不准确的问题。此前,应用大型补丁可能导致内存占用过高,并使服务器进程被 OOM killer 杀死。#95231 (Anton Popov).
- 修复了一处未定义行为:当启用
max_parallel_replicas的分布式查询在索引分析期间回退到本地副本时,可能导致结果错误或抛出异常。 #95263 (Azat Khuzhin). - 修复在
group_by_overflow_mode设为any时,sum和时间序列对稀疏列的聚合问题。#95301 (Mikhail Koviazin) 。 - 修复了
plain_rewritabledisk policy 中的一个可靠性问题:如果在解除元数据文件链接的过程中途发生网络错误,可能会导致存储处于不一致状态。#95302 (Mikhail Artemenko) 。 - 将 Iceberg 的 Date 替换为 Date32。#95322 (Konstantin Vedernikov) 。
redis表函数的密码参数现在会在日志和系统表 (例如:query_log) 中进行脱敏处理。#95325 (János Benjamin Antal) 。- 修复了一个 bug:在分布式查询仍在访问某些表时,这些表可能被删除或修改,从而导致异常或错误结果。#95356 (Azat Khuzhin) 。
- 修复了某些情况下在分布式查询中使用负数
LIMIT/OFFSET时的逻辑错误。#95357 (Nihal Z. Miaji) 。 - 修复了一个问题:通过 ssh 连接时,clickhouse-client 会要求输入两次密码。 #95372 (Isak Ellmer).
- 修复存储 S3(Azure)Queue 中的数据竞争问题。#95385 (Kseniia Sumarokova) 。
- 修复了由 prewhere 中的 lambda 表达式引发的 prewhere 过滤器错误。#95395 (Xiaozhe Yu) 。
- 修复
optimize_syntax_fuse_functions:当聚合参数为Nullable时,不再将sum/count/avg重写为sumCount()。关闭 #95390。#95441 (Nihal Z. Miaji) 。 - 避免在取消时分布式查询可能发生的崩溃。#95466 (Aleksandr Musorin) 。
- 修复 S3(Azure)Queue 引擎流式传输时的去重问题。#95467 (Kseniia Sumarokova) 。
- 修复了在分布式查询中更新分配给初始用户的行策略时出现的问题。#95469 (Vitaly Baranov) 。
- 修复 plain_rewritable 上加密磁盘的检查问题 (修复了可能出现的
It is not possible to register multiple plain-rewritable disks with the same object storage prefix) 。#95470 (Azat Khuzhin) 。 mergeTreeProjection表函数此前缺少访问检查,导致没有某个表的 SELECT 权限 (但拥有表函数权限) 的用户仍可从其投影中读取数据。此修复补充了与mergeTreeIndex和mergeTreeAnalyzeIndexes已具备的相同访问检查。#95480 (Alexey Milovidov) 。- 修复了从 Dynamic/JSON 类型的动态子列中读取 size 子列时可能出现的逻辑错误。#95573 (Pavel Kruglov) 。
- 修复了由 #94262 引入的 (Experimental) 零拷贝复制回归问题:共享 parts 可能会在其他副本完成拉取前被删除。#95597 (filimonov) 。
- 修复对 JSON 数组使用
tupleElement时发生的崩溃。关闭 #95581。#95647 (Pavel Kruglov) 。 - 修复了在带有 USING 的 JOIN 中,当在 VALUES 子句中的 lambda 函数内使用匹配器 (
*) 时会抛出逻辑错误异常的问题。关闭 #93675。#95661 (Vladimir Cherkasov) 。 - 修复了在等待分布式 DDL 且同时删除 Replicated 数据库时出现的
There was an error: Cannot obtain error message逻辑错误。修复 #95539。#95664 (Alexander Tokmakov) 。 - 修复了在启用
transform_null_in时,IN函数对NULL值返回不正确结果的问题。关闭 #65776。#95674 (Nihal Z. Miaji) 。 - 当设置
cast_keep_nullable启用时,在CAST中正确处理 LowCardinality Nullable 类型。修复了 #95670。#95747 (Alexey Milovidov). - 修复分区 delta lake 数据在 squashing 过程中的问题。#95773 (Kseniia Sumarokova).
- 修复运行时过滤器中 Nullable join 列的竞态条件。#95775 (Hechem Selmi) 。
- 修复了这样一种查询中可能出现的逻辑错误:当
USING列在表和选择列表中的类型不同时,查询使用了匹配器 (*、table.*) 和analyzer_compatibility_join_using_top_level_identifier。关闭 #90477。#95808 (Vladimir Cherkasov) 。 - 修复并行线程池操作 (备份、聚合、分布式查询) 中的内存安全问题;这些问题可能会在任务调度期间发生错误时引发异常。 #95818 (Raúl Marín).
- 修复了这样一个崩溃问题:在与使用即将被删除的 workload 的查询并发执行时运行 DROP WORKLOAD,可能会导致崩溃。#95856 (Alexey Milovidov) 。
- 修复了当用户仅在许多数据库上具有受限授权时,查询系统表性能缓慢的问题。关闭 #89371。#95874 (pufit)。
- 修复了在带有嵌套路径的 JSON 上执行 tupleElement 时的问题,此前该问题可能导致查询结果错误。#95907 (Pavel Kruglov).
- 修复了在空 MergeTree 表上使用
directjoin 算法时可能出现的NOT_SUPPORTED错误。#95935 (Vladimir Cherkasov) 。 - 修复客户端不会为设置项建议并自动补全别名的问题,关闭 #92190。#95945 (phulv94) 。
- 修复 system.asynchronous_metric_log 中的 event_date 问题。 #95947 (Raúl Marín) 。
- 修复了 JSON 数据类型中的 skipping paths 问题。此前,使用
JSON(SKIP path)时,所有以前缀path开头的 JSON 键都会被跳过,甚至包括"pathpath"这样的键,因此在插入时可能导致这些 paths 的数据丢失。现在该问题已修复,只有键"path"会被跳过。#95948 (Pavel Kruglov) 。 - 包含未知投影的分片不应被永久标记为丢失。#95952 (Mikhail Artemenko).
- 修复
Join表中使用Nullable(String)键时空字符串变为NULL的问题。关闭 #71414。#96002 (Alexey Milovidov) 。 - 现在,PostgreSQL 引擎已能正确读取
BOOLEAN[]。修复了 #72754。#96006 (Alexey Milovidov) 。 - 修复了从空文件读取时
ProtobufList格式的问题。关闭 #70059。#96007 (Alexey Milovidov) 。 - 修复
ProtobufListformat 在空表中产生幽灵记录的问题。关闭 #72596。#96010 (Alexey Milovidov) 。 - 修复了在涉及 distributed queries、PREWHERE 和类型推断的一种特殊情况下,
if函数在UInt64与Int32之间的类型不匹配问题。关闭 #70017。#96012 (Alexey Milovidov) 。 - 修复了涉及
Bool类型的JIT编译查询问题。#96013 (Alexey Milovidov) 。 - 修复了从 SQLite 的 TEXT 列读取 UUID 列时出现的逻辑错误。已关闭 #71263。#96016 (Alexey Milovidov).
- 修复 SQLite 引擎对
DateTime、Date、UUID等类型的转换问题。关闭 #73481。#96017 (Alexey Milovidov) 。 - 在对外部数据库 SQLite 和 PostgreSQL 的查询中,
FixedString值的转义方式不正确。已关闭 #73519。与 @jh0x 共同完成。#96019 (Alexey Milovidov) 。 - 修复了 WindowTransform 在 PRECEDING 偏移量过大时触发的断言失败。已关闭 #75852。#96026 (Alexey Milovidov).
- 修复了一个可能导致数据损坏的问题:当并发异步插入使用相同的参数名但包含不同的值时,会出现该问题。 #96035 (Seva Potapov).
- 修复全局性能分析器的周期设置问题 (由
global_profiler_real_time_period_ns和global_profiler_cpu_time_period_ns控制) 。此前使用的是截断后的值,而不是设定值,导致性能分析器的唤醒频率高于预期。#96048 (Antonio Andelic) 。 - 此前,如果用于 position delete 的 Iceberg manifest 文件中,引用的数据文件在某个条目里存在但其值为 NULL,我们就无法获取对应数据文件的正确范围。此 PR 修复了这个 bug。#96061 (Daniil Ivanik) 。
- 修复撤销默认角色时出现的问题。#96103 (Vitaly Baranov) 。
- 修复了索引分析中的释放后使用问题,该问题会在罕见情况下出现:禁用
use_primary_key,且使用索引的条件析取数量非常大。#96112 (Alexey Milovidov) 。 - 修复了
Gorilla编解码器中的一个回归问题:当显式指定的大小与数据类型大小不一致,且缓冲区大小过小时,先前版本会在解压缩时抛出异常。关闭 #78253。#96118 (Alexey Milovidov) 。 - 避免在字典加载时出现死锁:当某个字典引用了一个又递归引用该字典的 Merge 表时。关闭 #78360。#96120 (Alexey Milovidov) 。
- 修复了
formatDateTime在使用非固定宽度格式说明符 (如 MySQL 和 JODA 风格) 时会使用未初始化值的问题。#96133 (Alexey Milovidov). - 设置
use_const_adaptive_granularity与index_granularity_bytes的组合 (即“非自适应粒度”) 会导致待读取行数计算错误,并引发异常。#96143 (Alexey Milovidov) 。 - 在对象存储的类文件表 (如 S3 和 Azure) 上执行无效的 ALTER UPDATE 变更,可能会导致空指针解引用。已关闭 #92994。#96162 (Alexey Milovidov) 。
- 修复
AccessRights::contains在部分撤销权限时返回错误结果的问题。#96170 (pufit) 。 - 修复了 CTE 折叠常量导致的查询条件缓存哈希冲突问题,该问题可能会导致查询结果错误。关闭 #96060。#96172 (Alexey Milovidov) 。
- 修复 ProcessList 中可能出现的死锁问题。当我们向 cancellation checker 添加任务时,如果此时触发了内存 overcommit 跟踪器,可能会因潜在的锁顺序反转而导致这种情况发生。#96182 (Antonio Andelic).
- 修复了一个错误:当包含外连接 (LEFT、RIGHT 或 FULL) 的查询与多个 INNER JOIN 结合使用时,由于不合法的 JOIN 重排序,可能会返回错误结果。当外连接的 ON 条件引用了之前已连接的多个表中的列时,优化器未能正确考虑所有表依赖关系,因此可能错误地重排 JOIN,导致部分行丢失。关闭 #95972。#96193 (Vladimir Cherkasov) 。
- 当表未定义统计信息时,ClickHouse 不应尝试加载这些统计信息。这样可避免为检查统计信息文件是否存在而带来的额外开销 (100+ms) 。 (issue #96068) 。#96233 (Han Fei) 。
- 修复
optimize_syntax_fuse_functions:当聚合参数为LowCardinality(Nullable)时,不再将sum/count/avg重写为sumCount()。关闭 #95390。#96239 (Nihal Z. Miaji) 。 - 修复了某些情况下
not IN和not has函数的分区裁剪错误。#96241 (Nihal Z. Miaji) 。 - 修复向量相似度索引中的
stack-use-after-scope错误。#96259 (Alexey Milovidov) 。 - 修复了在查询前有 SQL 注释时,测试运行器无法识别错误提示注释的问题。#96336 (Yakov Olkhovskiy) 。
- 修复了以下逻辑错误:当表的主键为 Nullable,且查询使用了
coalesce函数并且其第一个参数为常量时,KeyCondition 会出现逻辑错误。#96340 (Alexey Milovidov) 。 GROUPING SETS、group_by_use_nulls以及内部包含LowCardinality的Tuple数据类型相互作用时,可能会在查询管道中产生异常的块结构,进而导致逻辑错误。这个问题是在引入NullableTuple之后出现的。#96358 (Alexey Milovidov) 。- 此前可以创建将空表达式
()用作索引的表,这会导致无效的内存访问。#96363 (Alexey Milovidov). - 修复了旧版 analyzer 在 JOIN 与重复别名同时出现时的崩溃问题。#96405 (Ilya Golshtein).
- 修复了因对 Variant 列进行错误的原地过滤优化而导致的
Nested columns sizes are inconsistent with local_discriminators错误。#96410 (Alexey Milovidov). - 修复
CREATE TABLE ... CLONE AS ...忽略源表完整限定名称的问题。#96415 (Hasyimi Bahrudin) 。 - 修复在 clickhouse-client 中通过 KILL QUERY 和取消查询 (Ctrl+C) 取消
mysql表函数时的问题。#96437 (Roman Vasin) 。 - 修复了高
max_execution_time值查询的取消检查线程中的活锁问题。#96450 (Sergei Trifonov). - 修复了在某些情况下,分布式查询中使用带小数的
LIMIT/OFFSET时出现的逻辑错误。#96475 (Nihal Z. Miaji) 。 - 修复某些包含 lambda 函数的表达式中的空指针解引用问题。#96479 (Alexey Milovidov) 。
- 修复将
LowCardinality列转换为Nullable时结果错误的问题。#96483 (Nihal Z. Miaji). - 修复了创建 Iceberg 表时的崩溃问题:
ORDER BY子句引用了不存在的列,或使用了位置参数。已关闭 #93280。#96484 (Konstantin Vedernikov). - 修复了带有 Nullable 子字段的 Tuple 列触发的运行时过滤器异常。#96509 (Alexey Milovidov) 。
- 修复了 Parquet V3 原生读取器中的
LOGICAL_ERROR异常:当用于PREWHERE过滤的列包含非布尔 UInt8 值时,会触发该异常。#96594 (Alexey Milovidov) 。 - 修复了在元数据变更期间复制表中隐式索引重新生成的问题。#96600 (Raúl Marín).
- 修复了执行 DROP WORKLOAD 时的竞态条件。#96614 (Sergei Trifonov).
- 修复了 Iceberg 表写入中的一个缺陷:分区插入可能导致数据在各分区文件间分布不正确。#96620 (Konstantin Vedernikov) 。
- 修复了在带约束的
CREATE TABLE中出现的heap-use-after-free问题。#96669 (Nikita Taranov). - 在 bech32 中校验 witness version,以避免缓冲区溢出。#96671 (Raúl Marín) 。
- 修复在使用无效的
auth_header设置创建数据湖 REST catalog 时,system.tables报错的问题。#96680 (Han Fei). - 修复在生存时间 (TTL) 合并后,当一个块中的所有行都被过滤掉时,
_minmax_count_projection会使min(timestamp)返回纪元 (1970-01-01) 的问题。 #96703 (Raquel Barbadillo). - 改进了对
iceberg_metadata_file_path设置项的校验,以防止路径遍历,并确保指定的元数据文件位于表目录内。#96754 (Daniil Ivanik) 。 - 修复了在
GROUP BY中使用Variant参数时ifNull崩溃的问题。#96790 (Alexey Milovidov). - 修复了启用
table_disk=1设置的表之间发生的缓存键冲突。#96818 (Raufs Dunamalijevs) 。 - 修复了因竞态条件导致 MemoryWorker 的清理线程卡住的问题。#96819 (Antonio Andelic).
- 不要在 Iceberg 目录中记录包含凭据的数据。#96831 (Konstantin Vedernikov) 。
- 修复
clickhouse-client在发生服务器错误后的退出状态。#96841 (Vitaly Baranov). - 使用 CROSS JOIN 且启用并行副本的查询可能会返回错误结果。修复了 #74337。#96848 (Igor Nikonov) 。
- 修复了这样一个问题:如果此前已在同一列上执行过轻量级更新,
ALTER TABLE DROP COLUMN查询会失败。#96861 (Anton Popov). - 修复在向
plain_rewritable对象存储磁盘创建基于归档的备份 (.zip、.tzst) 时发生的栈溢出 (崩溃) 问题。#96872 (Alexey Milovidov) 。 - 修复了当目标端文件系统磁盘已满或发生其他 I/O 错误而导致备份失败时,server 崩溃的问题。#96873 (Alexey Milovidov).
- 修复了
EXCEPT ALL和INTERSECT ALL忽略行重数、表现得与对应的DISTINCT版本相同的问题。#96876 (Alexey Milovidov) 。 - 修复了使用不兼容类型调用
indexOfAssumeSorted时触发的std::terminate异常 (例如,在IPv4数组中使用整数作为搜索值) 。#96877 (Alexey Milovidov) 。 - 修复了在使用窗口函数且
group_by_use_nulls = 1并配合 CUBE/ROLLUP/GROUPING SETS 时出现的异常Bad cast from type DB::ColumnNullable to DB::ColumnString。#96878 (Alexey Milovidov) 。 - 修复了 JIT 已编译表达式将
DateTime转换为DateTime64时结果不正确的问题 (例如,在混用 DateTime 类型的CASE/if/multiIf中) 。该值此前被重新解释,而不是按正确标度进行缩放,导致表达式编译生效后生成错误的时间戳。#96879 (Alexey Milovidov). - 修复了
CoalescingMergeTree在跳过索引表达式生成常量列时抛出逻辑错误异常的问题 (例如,对整型列上的ifNotFinite(1, c0)使用bloom_filter) 。#96880 (Alexey Milovidov) 。 - 修复了在误用 HTTP 连接启用 TLS 的原生协议端口时,错误消息中端口号显示错误的问题。#96881 (Alexey Milovidov) 。
- 修复了在 CTE 和子查询中,按子查询设置的
SETTINGS未应用到file等表函数上的问题。#96882 (Alexey Milovidov) 。 - 修复读取 X509 证书时 BIO 对象发生的内存泄漏问题。#96885 (Alexey Milovidov) 。
- 修复了查询分析器中的
LOGICAL_ERROR异常:当在应传入具体值的位置传入 lambda 表达式时,会触发该异常 (例如作为arrayFold的 accumulator 参数) 。#96892 (Alexey Milovidov) 。 - 修复对复杂嵌套类型 (Array 中包含 Nullable Tuple,而该 Tuple 又包含带有 Nullable 枚举值的 Map) 进行类型转换时出现的
ColumnNullable is not compatible with original异常。#96924 (Alexey Milovidov) 。 - 修复了分片
HASHED字典并行加载中的一个竞态条件,该问题偶尔会导致某些行未能加载。#96953 (Alexey Milovidov) 。 - 修复了
REPLACE PARTITION与后台变更之间的竞态条件,该问题可能导致替换后新旧数据同时可见。#96955 (Alexey Milovidov) 。 - 修复了
arrayJoin函数在与 INNER JOIN 和 WHERE 子句一起使用时产生重复行的问题。其原因是部分谓词下推优化错误地将包含arrayJoin的过滤器下推到 JOIN 之下。#96989 (Alexey Milovidov). - 修复了
clearCaches中的崩溃 (SEGFAULT) :由于BlockIO::operator=未移动query_metadata_cache,导致已缓存的存储快照被过早销毁,并引发对MergeTreeData存储的释放后使用。 #96995 (Alexey Milovidov). - 修复了
IfTransformStringsToEnumPass中的断言失败:当if或transform函数返回Nullable(String)时会触发该问题 (例如使用GROUP BY ... WITH CUBE且group_by_use_nulls = true时) 。#97002 (Alexey Milovidov) 。 - 修复了在包含
UNION ALL和JOIN的INSERT ... SELECT中写入错误数据的问题:常量字符串列在块合并后可能会写入错误的值。#97019 (Hasyimi Bahrudin). - 修复在
ALTER TABLE MODIFY COLUMN更改列类型后构建列统计信息时触发的assert_cast异常 (或在 release 构建中导致静默数据损坏) 问题。#97027 (Alexey Milovidov). - 修复 Azure Blob 存储、SSH 协议和 Arrow Flight 接口中读取未初始化内存的问题。#97053 (Alexey Milovidov).
- 修复了在带有 ROW POLICY/PREWHERE 和 FINAL 的查询中,索引会对结果产生影响的问题。#97076 (Yarik Briukhovetskyi) 。
- 修复了
MergeTree表中REPLACE PARTITION与后台变更之间仍然存在的竞态条件,该问题可能导致旧数据重新出现。#97105 (Alexey Milovidov) 。 - 修复包含别名列的隐式索引,并在创建前执行完整验证。#97115 (Raúl Marín) 。
- 修复了
FunctionVariantAdaptor在处理需要常量参数的函数 (如arrayROCAUC) 时出现的逻辑错误。#97116 (Bharat Nallan) 。 - 修复以下问题:当
PartCheckThread为已变更的 part 重新将GET_PART入队时,会导致变更卡住,并在parts_to_do中留下幽灵条目。#97162 (Alexey Milovidov) 。 - 修复了带有
ORDER BY ... LIMIT的子查询在查询计划中的行数估算问题,该问题可能导致优化器选择次优的 JOIN 顺序。#97193 (Alexander Gololobov). - 修复了
FunctionVariantAdaptor中的LOGICAL_ERROR异常:当作用于 Variant 列的函数返回Nothing类型时,可能会出现该问题;这种情况可能发生在UNION ALL查询中的空数组场景下。#97213 (Alexey Milovidov) 。 - 修复了 S3 多部分复制操作 (例如向 S3 执行
BACKUP/RESTORE时) 中的数据竞争问题,该问题在并发访问时可能导致异常。#97227 (Azat Khuzhin). - 修复了这样一个
LOGICAL_ERROR异常:当WHERE子句中的arrayJoin引用JOIN两侧的列时会触发该异常。#97239 (Alexey Milovidov). - 修复在带有 PREWHERE 的 Tuple 中读取稀疏
Nullable(String)的.size子列时触发的LOGICAL_ERROR异常。#97264 (Alexey Milovidov) 。 - 修复在使用
ORDER BY ... LIMIT从采用非自适应索引粒度 (index_granularity_bytes = 0) 的表读取数据时,LazyMaterializingTransform中出现的异常 “lazy chunk 中的行数与 offsets 数量不一致”。#97270 (Alexey Milovidov). - 修复了一个问题:当因非 ZooKeeper 异常 (例如
memory limit) 导致表重建失败时,SYSTEM RESTART REPLICA会使该表从数据库中丢失,从而导致DatabaseReplicated中的元数据摘要不匹配。#97276 (Alexey Milovidov) 。 system.merge_tree_settings中的readonly字段现在会正确显示某些 merge tree 设置 (例如index_granularity) 为无条件只读。#97277 (Robert Schulze).- 修复了在对
MergeTree表进行count()优化时的崩溃问题:当存储快照是在没有数据的情况下创建时,会触发该问题。 #97281 (Pablo Marcos). - 修复了在从堆栈跟踪的调试信息中解析函数名时可能发生的崩溃问题。#97294 (Azat Khuzhin) 。
- 修复
analyzer_compatibility_join_using_top_level_identifier与 ALIAS 列有关的逻辑错误。关闭 #96228。#97297 (Vladimir Cherkasov) 。 - 修复了在配合
QUALIFY子句使用带有文本索引的列时,applyOrder中出现的LOGICAL_ERROR异常。#97313 (Alexey Milovidov) 。 - 系统表
system.functions现在会将内部函数显示为categories = 'Internal',而不是categories = ''。#97315 (Robert Schulze) 。 - 启用并行副本时,包含 RIGHT JOIN 链的查询可能会产生错误结果。修复了 #74341。#97316 (Igor Nikonov) 。
- 修复了在可刷新materialized view 以及其他表被重命名的场景中可能出现的误报
TABLE_UUID_MISMATCH错误。#97323 (Azat Khuzhin) 。 - 修复
StorageKeeperMap备份中的 segfault,原因是在惰性备份批次中对悬空存储指针发生了释放后使用。 #97336 (Alexey Milovidov). - 修复了在启用
mutations_execute_subqueries_on_initiator时,ALTER UPDATE/DELETE中带有标量子查询的exists函数。此前该标量子查询会被错误地求值,可能导致报错,或生成损坏的变更命令,从而使表在下次服务器重启时无法加载。#97347 (Kirill Kopnev). - 修复了在将 NULL 与包含 LowCardinality 类型的 Variant 列比较时出现的逻辑异常
Unexpected return type from equals. Expected Nullable(UInt8). Got Const(LowCardinality(Nullable(UInt8)))。 #97379 (Alexey Milovidov). - 修复了在启用分片查询缓存时并行执行
EXCHANGE TABLES可能引发的竞态条件。#97411 (Konstantin Vedernikov) 。 - 修复了 Array 到
QBit转换中的LOGICAL_ERROR异常:当外层Tuple包装器中的nullable_source以不匹配的列类型替换已转换的数组列时,会触发该异常。关闭 #97389。#97413 (Alexey Milovidov) 。 - 修复括号内带别名的元组字面量在 AST 格式化往返时出现的不一致问题。例如,
(('a', 'b') AS x)之前会被错误地重新格式化为tuple(('a', 'b') AS x)。#97418 (Alexey Milovidov). - 修复了在启用去重的异步插入过程中,因解析失败生成零行空块时引发的异常。 #97460 (Sema Checherinda).
- 修复在使用
ORDER BY ... LIMIT从采用非自适应索引粒度 (index_granularity_bytes = 0) 的表读取数据时,LazyMaterializingTransform中出现的异常 “lazy chunk 中的行数与 offsets 数量不匹配”。 #97482 (Alexey Milovidov). - 修复向 Iceberg 插入数据的相关设置问题。为
allow_experimental_insert_into_iceberg设置添加别名。#97483 (Konstantin Vedernikov) 。 - 修复了一个问题:当
optimize_inverse_dictionary_lookup优化重写dictGet(...)谓词时,没有CREATE TEMPORARY TABLE权限的用户会收到ACCESS_DENIED。ClickHouse 现在会跳过该重写,执行原始表达式。关闭 #97269。#97484 (Nihal Z. Miaji) 。 - 修复了
Set和MergeTreeIndexSet在处理包含内部稀疏子列的列时触发的断言失败问题 (在 debug/sanitizer 构建中表现为异常) ,例如来自具有不同稀疏序列化 profile 的 MergeTree parts 的Tuple列。#97493 (Alexey Milovidov). - 修复了 StorageKafka2 中一个可能的释放后使用 (use-after-free) 问题。#97520 (Bharat Nallan).
- 修复当输出路径包含目录时,
INTO OUTFILE与TRUNCATE及into_outfile_create_parent_directories设置配合使用时的问题。#97549 (Alexey Milovidov) 。 - 修复了在启用 analyzer 时,通过
merge()表函数查询其 ALIAS 列中包含 lambda 表达式的表时出现的BAD_ARGUMENTS错误。#97551 (Alexey Milovidov) 。 - 修复 Keeper zxid 为 0 时
system.zookeeper_info抛出异常的问题。#97553 (Alexey Milovidov) 。 - 修复了
ip_trie字典在键类型不是String时可能存在的逻辑错误。#97555 (Bharat Nallan). - 修复了基础
RestCatalog的 REST catalog OAuth 身份验证失效的问题 (此前仅对OneLakeCatalog等派生 catalog 生效) 。这导致在引入 BigLake catalog 后,默认 REST catalog 无法正常工作。 #97561 (Konstantin Vedernikov). - Geometry 函数 (
perimeterSpherical、areaSpherical等) 现在除了GeometryVariant 类型外,也接受单独的几何子类型 (Polygon、Ring、Point等) 。#97571 (Alexey Milovidov) 。 - 修复了在对
Nullable(Tuple(... Nullable(T) ...))类型的子列使用isNull/isNotNull时触发的LOGICAL_ERROR异常。关闭 #97224。#97582 (Alexey Milovidov) 。 - 修复了在轻量级更新期间应用补丁分区片段时的空指针解引用问题。#97583 (Alexey Milovidov).
BaseSettings::readBinary将accessor.find返回的索引直接传给field_infos[],但没有检查“未找到”的哨兵值 (即-1) ,这可能导致std::vector越界访问。这个问题得益于 libcxx 的加固机制才被发现。它很可能发生在查询计划反序列化期间:较新的服务器向较旧的服务器发送了后者无法识别的 setting。基于字符串的读取方法已经正确处理了这种情况;readBinary则缺少同样的检查。#97585 (Miсhael Stetsyuk).- 修复了
UNION ALL查询在某个分支的谓词恒为假时返回错误结果的问题——该分支本应不返回任何内容,却会错误地读取数据。#97620 (Bharat Nallan). - 修复了
IN (col)在仅引用单个列时会失败并报UNSUPPORTED_METHOD错误的问题。#97646 (Alexey Milovidov) 。 - 修复了在
GROUP BY ... WITH ROLLUP/CUBE期间,当键在Nullable(Tuple(...))内包含LowCardinality(Nullable(...))时出现的逻辑错误异常。#97647 (Alexey Milovidov) 。 - 修复了
NOT (1, 1, 1)的 AST 格式化不一致问题,该问题可能会在调试构建中触发LOGICAL_ERROR。#97653 (Alexey Milovidov) 。 - 修复
keeper-converter在遇到空的 ZooKeeper 事务日志文件时发生异常的问题。 #97673 (Alexey Milovidov).
构建/测试/打包改进
- ClickHouse 现已可使用 clang-23 (master) 构建。#95578 (Alexey Milovidov).
- 修复:当配置了
bind_host时,强制将is_local设为 false,并改为使用集成测试。对 #74741 的后续跟进。#93109 #96018 (Zhigao Hong) 。 - 压力测试:修复 CI 中的压力测试和升级测试;忽略
no-{build}标签;增加兼容性随机化。#94693 (Nikita Fomichev) 。 - 从构建产物中发布 parser_memory_profiler 二进制文件。该工具可用于分析 AST 的内存占用。#95826 (Ilya Yatsishin).
- 为
parser_memory_profiler工具新增--symbolize标志,使其在结果中生成包含已解析符号的.heap.sym文件。#96477 (Ilya Yatsishin). - 将集成测试中使用的第三方 Docker 镜像固定为特定版本。#96500 (Alexey Milovidov).
- 恢复了对
OpenSSL进行动态链接的能力。不建议这样做,而且任何生产构建都不会使用它,但互联网上的爱好者仍然可以使用这个选项。#96506 (Govind R Nair). - 通过为
Coordination::OpNum进行按类型特化,将magic_enum的范围从 [-100, 1000] 缩小到默认的 [-128, 127],从而缩短构建时间。#96632 (Alexey Milovidov). - 从 Function 类中移除不必要的 C++ 模板,以减少构建时间。#96646 (Alexey Milovidov) 。
- 将
StorageSystemLicenses的生成提前到配置时,以提升构建并行度。#96697 (Alexey Milovidov) 。 - 将许可证扫描并行化。#96727 (Raúl Marín) 。
- 新增支持 SSH 协议的无状态功能测试。#96996 (Alexey Milovidov).
- 在无状态功能测试基础设施中新增 Kafka 3.9.0,使得可以使用 ClickHouse Keeper 充当 ZooKeeper,直接测试 Kafka 和 Kafka2 表引擎。六个新的无状态测试涵盖基础的生产/消费、虚拟列、INSERT、多种格式、损坏消息处理,以及基于 Keeper 的偏移量存储。#96997 (Alexey Milovidov) 。
- 新增一个 CI 工作流,用于构建经 PGO+BOLT 优化的 clang 工具链。#96991 (Alexey Milovidov) 。
- 在 CI 中使用经过 PGO 优化的 LLVM/Clang 构建,可将构建速度提高 20..30%。 #97031 (Alexey Milovidov).
- 用 llvm-libc 的实现替换 glibc 中的数学函数。 #90151 (Konstantin Bogdanov).
- 将 Boost 从 1.83 升级到 1.90,修复了调试构建中
devector断言失败的问题。#97037 (Alexey Milovidov) 。 - 将
postgres升级到 REL_18_1。#95189 (Konstantin Bogdanov) 。 - 改用
libexpat2.7.3。#95218 (Konstantin Bogdanov) 。 - 使用
OpenSSL3.5.5。 #95345 (Konstantin Bogdanov) 。 - 使用
simdjsonv4.2.4。#97129 (Konstantin Bogdanov) 。 - 升级到
libarchive3.8.5。#97131 (Konstantin Bogdanov) 。 - 使用
fast_floatv8.2.3。 #97133 (Konstantin Bogdanov) 。 - 使用
abseil-cpp20260107.1,并将s2geometry升级至 v0.13.1。#97134 (Konstantin Bogdanov) 。 - 将
libxml2更新至 2.15.1。 #95574 (Robert Schulze). - 将 7 个 Tier-3 集成测试 Docker 镜像所用的、已停止支持或已移除的基础镜像升级到了当前受支持的版本。#97314 (Rahul) 。
- 新增 TPC-DS 基准测试查询。#97349 (Raufs Dunamalijevs) 。
- 将各个单独的 x86 指令集 CMake 选项 (
ENABLE_SSSE3、ENABLE_AVX2、NO_SSE3_OR_HIGHER、ARCH_NATIVE等) 替换为一个数值型X86_ARCH_LEVEL选项 (1/2/3/4) ,与运行时分发系统已采用的标准 x86-64 微架构级别保持一致。#97354 (Raúl Marín) 。 - 避免在
FunctionBinaryArithmetic中为非除法操作实例化division_by_nullable=true的模板变体,从而缩短编译时间并减小二进制文件体积。#97496 (Raúl Marín) 。 - 通过将
Exception.h从typeid_cast.h、assert_cast.h、Context_fwd.h、IDataType.h以及各类 Column 头文件中移除,缩小Exception.h的包含范围。#97497 (Raúl Marín). - 始终使用随附的
compiler-rt头文件 (sanitizer和 XRay 接口) ,而不要使用宿主编译器的头文件,并且默认从源码构建compiler-rt库。#97499 (Raúl Marín) 。 - 在具备足够
long double支持的平台上,避免在wide_integer_impl.h中包含 boost/multiprecision 头文件,以缩短构建时间。#96633 (Alexey Milovidov). - 实现 LLVM 代码覆盖率任务,并先在 master 分支上启用。#90952 (Alexey Bakharew) 。
- 为正式版构建启用快速 libcxx 加固。这主要用于越界检查。根据性能测试结果,预计不会对性能产生明显影响。#94757 (Miсhael Stetsyuk) 。
向后不兼容的变更
- 修复了因在格式说明符中错误替换别名而导致的格式不一致问题。此项更改关闭了 #82833。此项更改关闭了 #82832。此项更改关闭了 #68296。此项更改可能会带来向后不兼容:当 analyzer 被禁用时,某些在
IN中引用别名的 CREATE VIEW 查询将无法处理。为避免这种不兼容,请启用 analyzer (自 24.3 起默认已启用) 。#82838 (Alexey Milovidov). - 编解码器
DEFLATE_QPL和ZSTD_QAT已移除。建议用户在升级前,将现有使用DEFLATE_QPL或ZSTD_QAT压缩的数据转换为使用其他编解码器压缩。请注意,要使用这些编解码器,必须启用设置enable_deflate_qpl_codec和enable_zstd_qat_codec。#92150 (Robert Schulze) 。 - 通过在
system.query_log.exception中启用 stderr 捕获,改进了 UDF 调试体验。此前,UDF 的 stderr 只会记录到文件中,不会显示在查询日志里,因此几乎无法调试。现在,stderr 默认会触发异常,并且会在抛出前完整收集 (最多 1MB) ,因此完整的 Python 回溯信息和错误消息都会出现在system.query_log.exception中,从而便于故障排查。#92209 (Xu Jia). JOIN USING ()子句中的空列列表现在会被视为语法错误。此前,它原本应在查询执行期间报为INVALID_JOIN_ON_EXPRESSION。在某些情况下,例如与Join存储进行连接时,还会导致LOGICAL_ERROR,修复 #82502。#92371 (Vladimir Cherkasov) 。- 默认在 JSON 类型中对 SKIP REGEXP 使用部分匹配。解决了 #79250。#92847 (Pavel Kruglov) 。
- 撤销“允许向简单 ALIAS 列执行 INSERT” (回退了 ClickHouse/ClickHouse#84154) 。它无法与自定义格式配合使用,也没有任何设置项加以保护。#92849 (Azat Khuzhin) 。
- 新增一项设置:当数据湖目录无法访问对象存储时抛出错误。#93606 (Konstantin Vedernikov) 。
Lazy数据库引擎已移除,不再可用。已关闭 #91231。#93627 (Alexey Milovidov) 。- 移除
metric_log的transposed_with_wide_view模式——由于存在缺陷,该模式不可用。现在已无法再以此模式定义system.metric_log。这部分回退了 #78412 中的更改。#93867 (Alexey Milovidov) 。 - 工作负载的 CPU 调度现已默认采用抢占式。参见
cpu_slot_preemption服务器级设置。#94060 (Sergei Trifonov). - 对索引文件名进行转义,以避免 parts 损坏。此更改后,ClickHouse 将无法加载由旧版本创建、名称中包含非 ASCII 字符的索引。要处理这个问题,你可以使用 MergeTree 设置
escape_index_filenames。#94079 (Raúl Marín) 。 - 格式设置
exact_rows_before_limit、rows_before_aggregation、cross_to_inner_join_rewrite、regexp_dict_allow_hyperscan、regexp_dict_flag_case_insensitive、regexp_dict_flag_dotall和dictionary_use_async_executor现已改为普通设置 (非格式设置) 。这是一项纯内部变更,除非你在 Iceberg、DeltaLake、Kafka、S3、S3Queue、Azure、Hive、RabbitMQ、Set、FileLog 或 NATS 表引擎定义中指定了这些设置 (这种情况不太可能发生) ,否则不会产生用户可见的副作用。在这些情况下,这些设置以前会被忽略,而现在此类定义会报错。#94106 (Robert Schulze). joinGet/joinGetOrNull函数现在会对底层 Join 表强制检查SELECT权限。此变更后,执行joinGet('db.table', 'column', key)时,用户必须同时拥有 Join 表中定义的键列以及要获取的 attribute 列的SELECT权限。缺少这些权限的查询将因ACCESS_DENIED而失败。迁移时,可使用GRANT SELECT ON db.join_table TO user授予整表访问所需的授权;或使用GRANT SELECT(key_col, attr_col) ON db.join_table TO user授予列级访问权限。此变更会影响所有依赖joinGet/joinGetOrNull且此前未显式配置SELECT授权的用户和应用程序。#94307 (Vladimir Cherkasov) 。- 对
CREATE TABLE ... AS ...查询检查SHOW COLUMNS。此前检查的是SHOW TABLES,但对这类权限检查而言,这并不是正确的 grant。 #94556 (pufit). - 使
Hash输出格式不再依赖块大小。#94503 (Alexey Milovidov) 。请注意,与之前的版本相比,这会改变输出的哈希值。
新特性
- ClickHouse Keeper 的 HTTP API 和内嵌 Web UI。 #78181 (pufit 和 speeedmaster) 。
- 异步插入去重现在可用于带有依赖 materialized view 的场景。当发生 block_id 冲突时,系统会先过滤原始块,移除与该 block_id 相关的行,再通过所有相关 materialized view 的 SELECT 查询转换剩余行,从而重建不含冲突行的原始块。#89140 (Sema Checherinda)。当涉及 materialized view 时,现在允许将去重与异步插入结合使用。#93957 (Sema Checherinda)。
- 引入了新的语法和框架,用于简化并扩展投影索引功能。这是对 https://github.com/ClickHouse/ClickHouse/pull/81021 的后续完善。#91844 (Amos Bird) 。
- 新增对
Array列的文本索引支持。#89895 (Jimmy Aguilar Mena) 。 - 默认启用
use_variant_as_common_type,这样你就可以在Array中、在UNION查询中,以及在if/multiIf/case的分支中使用不兼容的类型。#90677 (Alexey Milovidov) 。 - 新增系统表
zookeeper_info。实现 #88014。#90809 (Smita Kulkarni) 。 - 所有函数现已支持
Variant类型。#90900 (Bharat Nallan) 。 - 向 Prometheus 的
/metrics端点添加了ClickHouse_Info指标,其中主要包含版本信息,因此可以构建图表来跟踪详细版本信息随时间推移的变化。#91125 (Christoph Wurm) 。 - 为 keeper 新增了一个四字母命令
rcfg,可用于更改集群配置。与标准的reconfigure请求相比,该命令在配置变更方面提供了更广泛的能力。该命令接受json字符串作为参数。发送到 TCP 接口的完整字节序列应如下所示:rcfg{json_string_length_big_endian}{json_string}。该命令的一些示例如下:{"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}。#91354 (alesapin) 。 - 新增函数
reverseBySeparator,用于将字符串中按指定分隔符分隔的各个子字符串顺序反转。解决 #91463。#91780 (Xuewei Wang) 。 - 新增设置
max_insert_block_size_bytes,可更细致地控制插入块的形成方式。#92833 (Kirill Kopnev) 。 - 如果启用了
ignore_on_cluster_for_replicated_database设置,则可对 Replicated 数据库执行带有ON CLUSTER子句的 DDL 查询。在这种情况下,将忽略集群名称。#92872 (Kirill) 。 - 新增
mergeTreeAnalyzeIndexes函数。#92954 (Azat Khuzhin) 。 - 新增设置
use_primary_key。将其设为false,以禁用基于主键的粒度剪枝。#93319 (Nihal Z. Miaji). - 新增了
icebergLocalCluster表函数。#93323 (Anton Ivashkin) 。 - 新增了
cosineDistanceTransposed函数,可近似计算两点之间的余弦距离。#93621 (Raufs Dunamalijevs) 。 - 为 system.parts 表新增
files列,用于显示每个数据分区片段中的文件数量。#94337 (Match) 。 - 新增了一个用于并发控制的 max-min fair 调度器。在高超额订阅场景下 (即大量查询竞争有限的 CPU 插槽时) ,可提供更好的公平性。短时运行的查询不会因为长期运行、且随着时间推移占用更多插槽的查询而受到影响。可通过将
concurrent_threads_scheduler服务器设置设为max_min_fair来启用。#94732 (Sergei Trifonov) 。 - 支持 ClickHouse client 在连接到服务器时覆盖 TLS SNI。#89761 (Matt Klein) 。
- 支持在
joinGet函数调用中使用临时表。#92973 (Eduard Karacharov) 。 DeltaLake表引擎现已支持删除向量。#93852 (Kseniia Sumarokova) 。- 为
deltaLakeCluster增加对删除向量的支持。#94365 (Kseniia Sumarokova) 。 - 支持 Google 云存储数据湖。#93866 (Konstantin Vedernikov) 。
Experimental 功能
- 将
QBit从 Experimental 调整为 Beta。#93816 (Raufs Dunamalijevs). - 新增对
Nullable(Tuple)的支持。设置allow_experimental_nullable_tuple_type = 1即可启用。#89643 (Nihal Z. Miaji). - 支持 Paimon REST catalog,是对 https://github.com/ClickHouse/ClickHouse/pull/84423 的延续。#92011 (JIaQi Tang).
性能提升
- 设置
use_skip_indexes_on_data_read现已默认启用。该设置支持在读取数据的同时以流式方式进行过滤,从而提升查询性能并缩短启动时间。#93407 (Shankar Iyer) 。 - 提升
LowCardinality列上DISTINCT的性能。关闭 #5917。#91639 (Nihal Z. Miaji) 。 - 优化
distinctJSONPaths聚合函数,使其仅从数据分区片段中读取 JSON 路径,而非整个 JSON 列。#92196 (Pavel Kruglov) 。 - 更多过滤器可下推到 JOIN 中。 #85556 (Nikita Taranov).
- 当过滤器只使用一侧输入时,支持更多将 JOIN ON 条件下推的场景。支持
ANY、SEMI和ANTIJOIN。#92584 (Dmitry Novik) 。 - 允许使用等价集合将过滤器下推到
SEMI JOIN。已关闭 #85239。#92837 (Dmitry Novik). - 当右侧为空时,跳过读取
hash join的左侧。此前,我们会一直读取左侧,直到遇到第一个非空块;而在过滤或聚合开销较大的情况下,这可能会导致大量额外工作。#94062 (Alexander Gololobov). - 在查询管道中使用 “fastrange” (Daniel Lemire) 方法对数据进行分区。这有望提升并行排序和 JOIN 的性能。#93080 (Alexey Milovidov) 。
- 当 PARTITION BY 与排序键一致或为其前缀时,窗口函数性能得到提升。#87299 (Nikita Taranov) 。
- 外层过滤器可下推到视图中,从而能够在本地和远程节点上应用 PREWHERE。已解决 #88189。#88316 (Igor Nikonov) 。
- 为更多函数实现了 JIT 编译。关闭 #73509。#88770 (Alexey Milovidov 与 Taiyang Li) 。
- 如果在
FINAL查询中使用的跳过索引位于主键列上,那么就无需再额外检查其他 parts 中的主键交集,现已不再执行该步骤。解决了 #85897。#93899 (Shankar Iyer) 。 - 优化对小数
LIMIT和OFFSET的性能及内存占用。#91167 (Ahmed Gouda). - 修复 Parquet Reader V3 预取器未使用更快随机读取逻辑的问题。关闭 #90890。#91435 (Arsen Muk) 。
- 提升
icebergCluster性能。关闭 #91462。#91537 (Yang Jiang) 。 - 不要在常量过滤条件中按虚拟列进行过滤。#91588 (c-end) 。
- 通过启用自适应写入缓冲区,利用 wide parts 降低超宽表在 INSERT/merges 时的内存占用。新增对加密磁盘的自适应写入缓冲区支持。#92250 (Azat Khuzhin).
- 通过减少索引中需要搜索的标记数量,提升了使用文本索引和
sparseGrams分词器进行全文检索的性能。#93078 (Anton Popov) 。 - 函数
isValidASCII已针对返回正向结果的情况进行了优化,即输入值全部为 ASCII 时。#93347 (Robert Schulze) 。 - 现在,按序读取优化已能够识别因 WHERE 条件而变为常量的 ORDER BY 列,从而实现高效的逆序读取。这让多租户查询 (如
WHERE tenant='42' ORDER BY tenant, event_time DESC) 也能从中受益,因为它们现在可以使用 InReverseOrder,而无需再进行完整排序。”. #94103 (matanper). - 引入一个专门的 Enum AST 类,以
(string, integer)成对形式存储值参数,替代 ASTLiteral 子节点,从而优化内存占用。#94178 (Ilya Yatsishin) 。 - 支持在多个副本上执行分布式索引分析。对于共享存储场景以及集群中的海量数据尤为有利。该功能适用于 SharedMergeTree (ClickHouse Cloud) ,也可能适用于共享存储上的其他 MergeTree 表类型。#86786 (Azat Khuzhin) 。
- 在以下情况下禁用 join 运行时过滤器,以降低开销:- bloom filter 中置位过多 - 运行时被过滤掉的行过少。#91578 (Alexander Gololobov) 。
- 对关联子查询的输入使用内存缓冲区,以避免被多次求值。属于 #79890 的一部分。#91205 (Dmitry Novik).
- 允许所有副本在并行副本读取期间并行接管孤立范围。这有助于改善负载均衡并降低长尾延迟。#91374 (zoomxi).
- 外部聚合/排序/连接现在会在所有上下文中遵循查询设置
temporary_files_codec。修复了 grace hash join 缺少 profile events 的问题。#92388 (Vladimir Cherkasov) 。 - 提升了在聚合/排序过程中对落盘场景下查询内存使用情况检测的稳健性。#92500 (Azat Khuzhin) 。
- 估算聚合键列的总行数以及 NDV (不同值数量) 统计信息。#92812 (Alexander Gololobov) 。
- 利用 simdcomp 优化倒排列表压缩。#92871 (Peng Jian) 。
- 使用桶机制重构 S3Queue 的 ordered 模式处理流程。这也应提升性能,减少 Keeper 请求次数。#92889 (Kseniia Sumarokova) 。
- 函数
mapContainsKeyLike和mapContainsValueLike现在可分别利用mapKeys()或mapValues()上的文本索引。#93049 (Michael Jarrett) 。 - 降低非 Linux 系统上的内存占用 (启用 jemalloc 脏页的即时清理) 。#93360 (Eduard Karacharov).
- 当脏页大小占
max_server_memory_usage的比例超过memory_worker_purge_dirty_pages_threshold_ratio时,强制清理 jemalloc arena。 #93500 (Eduard Karacharov). - 减少 AST 的内存占用。#93601 (Nikolai Kochetov) 。
- 在某些情况下,我们发现 ClickHouse 在从表中读取数据时不会遵守内存限制。此问题已修复。#93715 (Nikita Mikhaylov) 。
- 默认启用
CHECK_STAT和TRY_REMOVE这两个 Keeper 扩展。#93886 (Mikhail Artemenko) 。 - 解析 Iceberg manifest 文件条目中与位置删除对应的文件名上下界,以便更准确地筛选相应的数据文件。#93980 (Daniil Ivanik).
- 新增两个设置,用于控制 JSON 列中动态子列的最大数量。第一个是 MergeTree 设置
merge_max_dynamic_subcolumns_in_compact_part(类似于已添加的merge_max_dynamic_subcolumns_in_wide_part) ,用于限制合并到 Compact 分片时创建的动态子列数量。第二个是查询级设置max_dynamic_subcolumns_in_json_type_parsing,用于限制解析 JSON 数据时创建的动态子列数量,从而支持在 insert 时指定该限制。#94184 (Pavel Kruglov) 。 - 在某些情况下,对 JSON 列的压缩合并进行了小幅优化。 #94247 (Pavel Kruglov).
- 根据生产环境中的实践经验,下调线程池队列大小。在从 MergeTree 读取任何数据之前,增加显式的内存占用检查。#94692 (Nikita Mikhaylov) 。
- 确保调度器在 CPU 资源严重不足时优先调度 MemoryWorker 线程,因为这可以保护 ClickHouse 进程免受致命威胁。#94864 (Nikita Mikhaylov) 。
- 将 jemalloc 脏页的清理放到独立于 MemoryWorker 主线程的其他线程中执行。如果清理速度较慢,可能会延迟 RSS 使用量的更新,从而导致进程因内存不足而被杀死。引入新的 config
memory_worker_purge_total_memory_threshold_ratio,根据总内存使用量的比例开始清理脏页。#94902 (Antonio Andelic) 。
改进
- 现已支持在 Azure Blob 存储中使用
system.blob_storage_log。#93105 (Alexey Milovidov) 。 - 为 Local 和 HDFS 实现
blob_storage_log。修复了S3Queue在blob_storage_log中记录日志时未使用磁盘名称而导致的错误。为blob_storage_log添加error_code列。拆分测试配置文件,以简化本地测试。#93106 (Alexey Milovidov). clickhouse-client和clickhouse-local现在会在输入时高亮数字字面量中的数字分组 (千位、百万位等) 。此更改解决了 #93100。#93108 (Alexey Milovidov) 。- 为
clickhouse-client增加了对命令行参数中等号前后带空格写法的支持。已关闭 #93077。#93174 (Cole Smith) 。 - 启用
<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap>后,CLI client 现在可以像以前一样使用 Ctrl-R 进行常规搜索,同时 Ctrl-T 用于模糊搜索。#87785 (Larry Snizek). - 用于清除缓存的语句
SYSTEM DROP [...] CACHE容易让人误以为该语句会禁用缓存。ClickHouse 现已支持语句SYSTEM CLEAR [...] CACHE,含义更直观。旧语法仍然可用。#93727 (Pranav Tiwari) 。 - 支持在
EmbeddedRocksDB中使用多列作为主键。已关闭 #32819。#33917 (usurai) 。 - 现在支持对标量使用非常量 IN (例如
val1 NOT IN if(cond, val2, val3)这样的查询) 。#93495 (Yarik Briukhovetskyi) 。 - 防止将
x-amz-server-side-encryption请求头传递到HeadObject、UploadPart和CompleteMultipartUpload的 S3 请求中,因为这些请求不支持该请求头。#64577 (Francisco J. Jurado Moreno). - 为 S3Queue 的 ordered 模式添加对 Hive 分区的跟踪支持。解决了 #71161。#81040 (Anton Ivashkin) 。
- 优化文件系统缓存中的空间预留。
FileCache::collectCandidatesForEviction将在不加 unique lock 的情况下执行。#82764 (Kseniia Sumarokova) 。 - 支持服务器日志的组合轮换策略 (大小 + 时间) 。#87620 (Jianmei Zhang).
- CLI 客户端现在可指定
<warnings>false</warnings>,无需再使用命令行参数--no-warnings。 #87783 (Larry Snizek). - 新增了对
avg聚合函数的支持,可将 Date、日期时间和 Time 值用作参数。解决了 #82267。#87845 (Yarik Briukhovetskyi). - 优化项
use_join_disjunctions_push_down默认处于启用状态。#89313 (Alexey Milovidov) 。 - 关联子查询现已支持更多表引擎和数据源类型。关闭了 #80775。#90175 (Dmitry Novik).
- 如果显式指定了参数化视图的 schema,则会显示该 schema。已关闭 #88875 和 #81385。#90220 (Grigorii Sokolik) 。
- 如果日志早于最后一个已提交索引,能够正确处理 Keeper 日志条目中的空缺。#90403 (Antonio Andelic) 。
- 改进
min_free_disk_bytes_to_perform_insert设置,使其在 JBOD 卷上也能正常工作。#90878 (Aleksandr Musorin) 。 - 现在可以在用于
S3表引擎和s3表函数的 named collections 中指定storage_class_name设置。#91926 (János Benjamin Antal) 。 - 支持通过
system.zookeeper向辅助 ZooKeeper 插入数据。#92092 (RinChanNOW). - 为 Keeper 新增以下指标:
KeeperChangelogWrittenBytes、KeeperChangelogFileSyncMicroseconds、KeeperSnapshotWrittenBytes和KeeperSnapshotFileSyncMicrosecondsprofile events,以及KeeperBatchSizeElements和KeeperBatchSizeBytes直方图指标。#92149 (Miсhael Stetsyuk) 。 - 新增设置
trace_profile_events_list,将trace_profile_event的 tracing 限定为指定的事件名称列表,从而能够在大型工作负载上更精确地收集数据。#92298 (Alexey Milovidov). - 支持可暂停 failpoint 的 SYSTEM NOTIFY FAILPOINT。- 支持 SYSTEM WAIT FAILPOINT fp PAUSE/RESUME。#92368 (Shaohua Wang) 。
- 为
system.data_skipping_indices新增creation(隐式/显式) 列。#92378 (Raúl Marín) 。 - 允许将 YTsaurus dyn tables 的列描述传递给字典源。#92391 (MikhailBurdukov) 。
- 在 #63985 中,我们实现了可按端口分别指定 TLS 配置所需的全部参数 (参见可组合协议) ,因此不再依赖全局 TLS 配置。不过,当前实现仍会隐式要求存在全局
openSSL.server配置节,这与不同端口需要不同 TLS 配置的场景存在冲突。比如,在 keeper-in-server 部署中,我们需要为 keeper 之间的通信和 clickhouse client 连接分别配置独立的 TLS。#92457 (Miсhael Stetsyuk). - 引入新设置
input_format_binary_max_type_complexity,用于限制以二进制格式解码的类型节点总数,以防止恶意载荷。#92519 (Raufs Dunamalijevs) 。 - 在
system.background_schedule_pool{,_log}中体现正在运行的任务。补充文档。#92587 (Azat Khuzhin) 。 - 如果在客户端的 Ctrl+R 搜索中未找到匹配的历史记录,就执行当前查询。#92749 (Azat Khuzhin) 。
- 支持将
EXPLAIN indices = 1用作EXPLAIN indexes = 1的别名。关闭了 #92483。#92774 (Pranav Tiwari). - Parquet 读取器现已支持将 Tuple 或 Map 列按 JSON 读取:
select x from file(f.parquet, auto, 'x JSON')即使f.parquet中的列x类型为 tuple 或 map,也能正常工作。#92864 (Michael Kolupaev) 。 - 支持 Parquet reader 处理空元组。#92868 (Michael Kolupaev) 。
- 当原生复制因 BadRequest 失败时 (例如块列表无效) ,会回退为对 Azure Blob 存储执行读写复制。此前,只有在将 blob 复制到不同存储账户时遇到 Unauthorized 错误,才会执行这种回退。但我们有时也会遇到“指定的块列表无效”错误。因此,现在已更新条件:只要原生复制失败,都会回退到读写方式。#92888 (Smita Kulkarni).
- 修复了在使用 EC2 实例 profile 凭证运行大量并发 S3 查询时,EC2 metadata 端点遭到限流的问题。此前,每个查询都会各自创建一个
AWSInstanceProfileCredentialsProvider,从而并发请求 EC2 metadata 服务,这可能导致超时和HTTP response code: 403错误。现在,凭证提供商会被缓存,并在所有查询间共享。#92891 (Sav). - 调整
insert_select_deduplicate设置,新增保持向后兼容的能力。#92951 (Sema Checherinda) 。 - 将慢于平均水平的后台任务记入日志 (
background_schedule_pool_log.duration_threshold_milliseconds=30) ,以避免记录过多任务日志。#92965 (Azat Khuzhin) 。 - 在早期版本中,
system.trace_log和system.symbols中部分 C++ 函数名显示不正确 (“mangled”) ,而且demangle函数也无法很好地处理这些名称。关闭 #93074。#93075 (Alexey Milovidov) 。 - 引入了
backup_data_from_refreshable_materialized_view_targets备份设置,用于跳过可刷新materialized views 目标表数据的备份。采用 APPEND 刷新策略的 RMV 始终会被备份。 #93076 (Julia Kartseva). #93658 (Julia Kartseva) - 对于较大的编译单元 (如函数) ,使用最少的调试信息,而不是完全禁用调试信息。#93079 (Alexey Milovidov).
- 通过为 MinIO 特有错误实现错误码映射,AWS S3 C++ SDK 现已增加对 MinIO 的兼容性支持。此变更使 ClickHouse 在使用 MinIO 部署而非 AWS S3 时,能够正确处理并重试 MinIO 服务器错误,从而提升在 self-hosted MinIO 集群上运行对象存储的用户的可靠性。#93082 (XiaoBinMu).
- 写入带符号信息的 jemalloc 配置文件 (生成堆内存剖析时无需二进制可执行文件) 。#93099 (Azat Khuzhin) 。
- 恢复
clickhouse git-import工具——此前它在处理过大或无效的提交时会失效。参见 https://presentations.clickhouse.com/2020-matemarketing/。 #93202 (Alexey Milovidov). - 不要在查询日志中显示 URL 存储中的密码。#93245 (Konstantin Vedernikov) 。
- 为
flipCoordinates新增对Geometry类型的支持。#93303 (Bharat Nallan) 。 - 改进 SYSTEM INSTRUMENT ADD/REMOVE 的用户体验:对函数名使用 String 字面量,修正所有匹配的函数,并允许在
REMOVE中使用 function_name。#93345 (Pablo Marcos) 。 - 新增设置
materialize_statistics_on_merge,用于在 merge 期间启用/禁用统计信息物化。默认值为1。#93379 (Han Fei) 。 - ClickHouse 现在可以解析
DESCRIBE SELECT查询中不带括号的SELECT。修复了 #58382。#93429 (Yarik Briukhovetskyi) 。 - 为缓存正确性检查增加了按概率随机执行的机制。#93439 (Kseniia Sumarokova) 。
- 新增设置
type_json_allow_duplicated_key_with_literal_and_nested_object,允许 JSON 中出现重复路径,其中一个为字面量,另一个为嵌套对象,例如{"a" : 42, "a" : {"b" : 42}}。在 https://github.com/ClickHouse/ClickHouse/pull/79317 中引入这一重复路径限制之前,某些数据可能已经创建;现在若继续操作这些数据,可能会导致错误。启用此设置后,这类旧数据仍可继续使用而不会报错。#93604 (Pavel Kruglov). - 不要在 Pretty JSON 中将简单类型的值单独打印成一行。#93836 (Pavel Kruglov) 。
- 当存在大量
alter table ... modify setting ...语句时,可能会在 5 秒内无法获取锁。与其返回logical error,不如返回timeout。#93856 (Han Fei) 。 - 防止在出现语法错误时输出过多内容。此前,它会输出整个 SQL 脚本,其中可能包含大量查询。#93876 (Alexey Milovidov) 。
- 在 Keeper 中,正确计算带统计信息的
check请求的字节大小。#93907 (Mikhail Artemenko). - 新增
use_hash_table_stats_for_join_reordering设置,用于控制在 join 重排序时是否使用运行时哈希表大小统计信息。该设置默认启用,因此会保留collect_hash_table_stats_during_joins的现有行为。#93912 (Vladimir Cherkasov) 。 - 现在,用户可以在
system.server_settings表中部分查看嵌套的全局服务器设置 (例如logger.level) 。这仅适用于具有固定结构的设置 (不包括列表、枚举、重复项等) 。#94001 (Hechem Selmi) 。 QBit现已支持相等比较。#94078 (Raufs Dunamalijevs) 。- 当 Keeper 检测到损坏的快照或不一致的更新日志时,会抛出异常,而不是要求手动中止或自动清理文件。这会让 Keeper 采用更安全的行为,即依赖人工干预。#94168 (Antonio Andelic).
- 修复了
CREATE TABLE失败时可能留下残留内容的问题。#94174 (Azat Khuzhin) 。 - 修复在使用受密码保护的 TLS 私钥时对未初始化内存的访问问题 (OpenSSL 中的一个缺陷) 。#94182 (Konstantin Bogdanov) 。
- 将 chdig 更新至 v26.1.1。#94290 (Azat Khuzhin) 。
- 支持 S3Queue ordered 模式下更通用的分区方式。#94321 (Bharat Nallan) 。
- 为设置
allow_statistics_optimize新增了别名use_statistics。这与现有设置use_primary_key和use_skip_indexes的命名更加一致。#94366 (Robert Schulze). - 启用了设置
input_format_numbers_enum_on_conversion_error,以在从 Numbers 转换为枚举类型时检查元素是否存在。#94384 (Elmi Ahmadov) 。 - 在 S3(Azure)Queue 的 ordered 模式下,借助跟踪限制清理失败节点 (此前仅在 Unordered 模式下对失败节点和已处理节点执行此操作;现在 Ordered 模式下也会执行,但仅限失败节点) 。#94412 (Kseniia Sumarokova).
- 在
clickhouse-local中为default用户启用访问管理。此前,clickhouse-local中的default用户缺少 access_management 权限,导致DROP ROW POLICY IF EXISTS之类的操作会因ACCESS_DENIED错误而失败,尽管该用户本应拥有不受限制的访问权限。#94501 (Alexey Milovidov). - 为 YTsaurus 字典和表启用 named collection 功能。#94582 (MikhailBurdukov).
- 为 BACKUP/RESTORE 添加了对用于 S3 和 Azure Blob 存储的 SQL 定义命名集合的支持。已关闭 #94604。#94605 (Pablo Marcos) 。
- 支持在 S3Queue 的 ordered 模式下按分区键分桶。#94698 (Bharat Nallan) 。
- 新增一个异步指标,用于显示耗时最长的 merge 的运行时间。#94825 (Raúl Marín).
- 在使用 IcebergBitmapPositionDeleteTransform 应用位置删除前,先添加归属文件检查。#94897 (Yang Jiang) 。
- 现在,
view_duration_ms显示的是 group 处于活跃状态的时长,而不是其中各线程耗时的总和。#94966 (Sema Checherinda) 。 - 移除了
hasAnyTokens和hasAllTokens函数中搜索标记最大数量的限制,此前上限为 64。示例:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]);该查询会因包含 65 个搜索标记而报BAD_ARGUMENTS错误。通过此 PR,该限制已被完全移除,因此相同的查询现在可以无错误运行。#95152 (Elmi Ahmadov). - 新增设置项
input_format_numbers_enum_on_conversion_error,用于在从 Numbers 转换为枚举时检查相应元素是否存在。关闭:#56144。#56240 (Nikolay Degterinsky) 。 - 在 Iceberg 表中,在读取数据文件和位置删除文件时共享 format 解析器资源,以减少内存分配。#94701 (Yang Jiang).
缺陷修复 (官方稳定版本中用户可见的异常行为)
- 修复了一个问题:在执行插入时,预定义查询处理程序会将末尾空白解析为数据。#83604 (Fabian Ponce).
- 修复了在 Join 存储上应用 outer to inner join 优化时出现的 INCOMPATIBLE_TYPE_OF_JOIN 错误。解决了 #80794。#84292 (Vladimir Cherkasov) 。
- 修复了在启用
allow_experimental_join_right_table_sorting时使用 hash join 会报出异常 “Invalid number of rows in Chunk” 的问题。#86440 (yanglongwei). - 如果 filesystem 大小写不敏感,则在 MergeTree 中始终将文件名替换为哈希。此前,在使用大小写不敏感 filesystem (如 MacOS) 的系统上,如果多个列/子列名称仅大小写不同,可能会导致数据损坏。#86559 (Pavel Kruglov).
- 在创建阶段,对 materialized view 中的底层查询执行完整的权限检查。#89180 (pufit) 。
- 修复了
icebergHash函数在常量参数情况下发生崩溃的问题。#90335 (Michael Kolupaev) 。 - 修复了以下逻辑错误:无事务的变更会修改处于活动事务中的 parts,而该事务最终会被回滚。#90469 (Shaohua Wang).
- 在普通数据库转换为 atomic 数据库后,
system.warnings会被正确更新。#90473 (sdk2) 。 - 修复了以下断言问题:从 Parquet 文件读取数据时,如果 prewhere 表达式的一部分也在查询的其他位置使用,就会触发该断言。#90635 (Max Kainov).
- 修复了在 split-by-buckets 模式下从 Iceberg 读取时单节点集群发生崩溃的问题。此更改关闭了 #90913。#91553 (Konstantin Vedernikov) 。
- 修复了 Log 引擎在读取子列时可能出现的逻辑错误。关闭 #91710。#91711 (Pavel Kruglov) 。
- 修复 ATTACH AS REPLICATED 期间出现的逻辑错误:‘Storage 不支持事务’。#91772 (Shaohua Wang).
- 修复了在 LEFT ANTI JOIN 带有额外后置条件时,运行时过滤器无法正常工作的问题。#91824 (Alexander Gololobov) 。
- 修复了一个在涉及 Nothing 类型的 NULL 安全比较时出现的错误。关闭 #91834。关闭 #84870。关闭 #91821。#91884 (Yarik Briukhovetskyi) 。
- 修复 native Parquet reader 中影响高度重复字符串数据的 DELTA_BYTE_ARRAY 解码问题。#91929 (Daniel Muino) 。
- 在 schema inference 期间,对于通配符中的文件,仅缓存推断出该 schema 的那个文件的 schema,而不是缓存所有文件的 schema。关闭了 #91745。#92006 (Pavel Kruglov) 。
- 修复了因归档条目大小头部信息错误导致的
Couldn't pack tar archive: Failed to write all bytes错误。修复 #89075。#92122 (Julia Kartseva) 。 - 在 insert select 中释放请求流,以避免关闭 HTTP 连接。#92175 (Sema Checherinda) 。
- 修复了在使用
USING子句和join_use_nulls时,包含多个 JOIN 的查询中的逻辑错误。#92251 (Vladimir Cherkasov) 。 - 修复启用 join_use_nulls 时进行 join 重排序时的逻辑错误,关闭 https://github.com/clickhouse/clickhouse/issues/90795。 #92289 (Vladimir Cherkasov)。
- 修复了
arrayElement与取反字面量一起使用时 AST 格式不一致的问题。关闭了 #92288 关闭了 #92212 关闭了 #91832 关闭了 #91789 关闭了 #91735 关闭了 #88495 关闭了 #92386。#92293 (Pavel Kruglov). - 修复了
join_on_disk_max_files_to_merge设置可能引发崩溃的问题。#92335 (Bharat Nallan). - 相关 issue:#https://github.com/ClickHouse/support-escalation/issues/6365。[#92339](https://github.com/ClickHouse/ClickHouse/pull/92339) (Tuan Pham Anh) 。
- 修复了
SYSTEM SYNC FILE CACHE中遗漏的访问检查。关闭了 #92101。#92372 (Kseniia Sumarokova). - 修复
count_distinct_optimization在窗口函数和多个参数场景下的处理问题。#92376 (Raúl Marín) 。 - 修复了在某些聚合函数与窗口函数一起使用时出现的 “Cannot write to finalized buffer” 错误。关闭 #91415。#92395 (Jimmy Aguilar Mena) 。
- 修复了
CREATE TABLE ... AS urlCluster()与数据库引擎Replicated搭配使用时的逻辑错误。关闭 #92216。#92418 (Kseniia Sumarokova) 。 - 在 MergeTree 中执行变更时,继承源数据分片的序列化信息设置。这样可修复在数据类型序列化发生变化后,查询已变更分片时可能返回错误结果的问题。#92419 (Pavel Kruglov) 。
- 修复列与同名子列之间可能存在的冲突,该问题会导致使用错误的序列化方式并引发查询失败。关闭 #90219。关闭 #85161。#92453 (Pavel Kruglov).
- 修复了一个
LOGICAL_ERROR:其原因是在将 outer join 转换为 inner join 时,对查询计划进行了非预期的修改。同时放宽了该优化的适用条件,使其也能用于在 join 过程中对聚合键应用单射函数的情况。#92503 (János Benjamin Antal). - 修复了对空 Tuple 列排序时可能出现的错误
SIZES_OF_COLUMNS_DOESNT_MATCH。关闭了 #92422。#92520 (Pavel Kruglov) 。 - 检查 JSON 类型中不兼容的类型化路径。关闭 #91577。#92539 (Pavel Kruglov) 。
- 修复对 Backup 数据库执行 SHOW CREATE DATABASE 时出现的死锁问题。#92541 (Azat Khuzhin) 。
- 验证 hypothesis 索引时使用正确的错误代码。#92559 (Raúl Marín).
- 修复 analyzer 中列别名里的动态子列解析问题。此前,列别名中的动态子列会被包裹在
getSubcolumn中,因此在某些情况下可能根本无法解析。关闭了 #91434。#92583 (Pavel Kruglov) 。 - 防止 tokens() 在第二个参数为 NULL 时发生崩溃。#92586 (Raúl Marín) 。
- 修复了一个潜在崩溃问题:其原因是底层 const PREWHERE 列被原地变更。这种情况可能发生在列收缩 (
IColumn::shrinkToFit) 或过滤 (IColumn::filter) 时,并且可能被多个线程同时触发。#92588 (Arsen Muk) 。 - 在包含大型 parts (超过 4,294,967,295 行) 的表上创建和物化文本索引的功能已被暂时禁用。此限制可防止查询结果出错,因为当前的索引实现尚不支持如此大的 parts。#92644 (Anton Popov) 。
- 修复了执行 JOIN 时出现的逻辑错误
Too large size (A) passed to allocator。已关闭 #92043。#92667 (Yarik Briukhovetskyi) 。 - 修复了一个问题:当
ngrambf_v1索引的 ngram 长度 (第 1 个参数) > 8 时,会抛出异常。#92672 (Robert Schulze) 。 - 修复在使用 ZooKeeper 存储时,后台重新加载 named collections 期间出现的未捕获异常。关闭 https://github.com/ClickHouse/clickhouse-private/issues/44180。 #92717 (Kseniia Sumarokova) 。
- 修正了通配符授权的访问授权检查中的错误逻辑。此前的尝试 https://github.com/ClickHouse/ClickHouse/pull/90928 虽然修复了一个严重漏洞,但限制过于严格,导致某些通配符
GRANT语句会因无关的REVOKE操作而失败。#92725 (pufit). - 修复了在
WHERE中使用not match(...)时数据跳过逻辑中的一个缺陷,该缺陷会导致结果错误。关闭了 #92492。#92726 (Nihal Z. Miaji) 。 - 如果在只读磁盘上创建了 MergeTree 表,则启动时不要尝试删除临时目录。#92748 (Alexey Milovidov).
- 修复 ALTER TABLE REWRITE PARTS (v2) 中“无法向空的 ExpressionActionsChain 添加操作”的问题。 #92754 (Azat Khuzhin).
- 避免因从已断开的
Connection中读取而崩溃。#92807 (Raufs Dunamalijevs). - 修复了
S3Queue存储在Ordered模式下的逻辑错误Failed to set file processing within 100 retries。该错误现已改为警告。在 25.10 之前的版本中,如果 Keeper 会话过期,可能会出现此错误;不过在 25.10+ 版本中,它也只会显示为警告,因为理论上在Ordered模式下处理并发较高时,仍有可能触发此错误。#92814 (Kseniia Sumarokova). - 此前,一些在 PK 分片中使用恒假条件的查询会失败。现在已不会。https://github.com/ClickHouse/ClickHouse/pull/89313 需要此修复。#92815 (Yarik Briukhovetskyi) 。
- 修复了
system.parts表中文本索引未压缩大小的计算问题。#92832 (Anton Popov) 。 - 修复了轻量级更新中主索引的使用问题:当
WHERE子句中的谓词包含带子查询的IN子句时,会出现该问题。#92838 (Anton Popov) 。 - 修复了在 JSON 中为路径 ‘skip’ 创建类型提示时的问题。关闭了 #92731。#92842 (Pavel Kruglov) 。
- 在 S3 表引擎中,如果存在非确定性函数,则不应缓存分区键。#92844 (Miсhael Stetsyuk) 。
- 修复了在对设置
ratio_of_defaults_for_sparse_serialization=0.0的稀疏列执行变更后,可能出现FILE_DOESNT_EXIST错误的问题。关闭 #92633。#92860 (Pavel Kruglov) 。 - 修复旧版 Parquet 读取器 (默认不使用) 在 JSON 列位于 Tuple 列之后时的 Parquet schema 推断问题。修复旧版 Parquet 读取器 (默认不使用) 在处理空 Tuple 时失败的问题。#92867 (Michael Kolupaev) 。
- 修复在常量条件下进行多个 join 且启用
join_use_nulls时的逻辑错误,关闭 #92640。#92892 (Vladimir Cherkasov) 。 - 修复在向分区表达式包含子列的表中插入数据时,可能出现的错误
NOT_FOUND_COLUMN_IN_BLOCK。关闭 #93210。关闭 #83406。#92905 (Pavel Kruglov) 。 - 修复了 Merge 引擎在带别名的表上报错
NO_SUCH_COLUMN_IN_TABLE的问题。关闭 #88665。#92910 (Pavel Kruglov) 。 - 修复在 LowCardinality(Nullable(T)) 列上执行 full_sorting_join 时 NULL != NULL 的问题。#92924 (Vladimir Cherkasov) 。
- 修复了
MergeTree表中文本索引合并期间发生的多次崩溃。#92925 (Anton Popov). - 如有需要,在生存时间 (TTL) 聚合期间恢复 SET 表达式结果上的 LowCardinality 封装,以避免在表优化过程中出现异常。#92971 (Seva Potapov) 。
- 修复了在
has函数中使用空数组时,索引分析过程中的逻辑错误。关闭 #92906。#92995 (Nihal Z. Miaji) 。 - 修复终止后台调度池时可能卡住的问题 (可能导致服务器关闭时卡住) 。#93008 (Azat Khuzhin).
- 修复了这样一种可能出现的错误:通过 alter 将设置
ratio_of_defaults_for_sparse_serialization更改为1.0后,在执行稀疏列变更时可能会出现 FILE_DOESNT_EXIST。#93016 (Pavel Kruglov). - 修复了在 WHERE 中使用
not materialize(...)或not CAST(...)时,数据 skipping 逻辑中的缺陷;该问题会导致结果错误。关闭 #88536。#93017 (Nihal Z. Miaji). - 修复因共享 parts 中的 TOCTOU 竞争而可能使用过期分区片段的问题。#93022 (Azat Khuzhin).
- 修复反序列化带有越界偏移量的格式错误
groupConcat聚合状态时发生的崩溃。#93028 (Raufs Dunamalijevs) 。 - 修复了预先取消分布式查询后连接处于异常状态的问题。#93029 (Azat Khuzhin) 。
- 修复了右侧连接键为稀疏列时连接结果出错的问题。此修复解决了 #92920。我只能在
set compatibility='23.3'的情况下复现这个问题。不确定是否应该回移。#93038 (Amos Bird). - 修复
estimateCompressionRatio()中可能出现的Cannot finalize buffer after cancellation错误。修复内容见:#87380。#93068 (Azat Khuzhin). - 修复了基于复杂表达式 (如
concat(col1, col2)) 构建的文本索引在合并时出现的问题。#93073 (Anton Popov). - 修复了过滤器包含子列时无法应用投影的问题。关闭了 #92882。#93141 (Pavel Kruglov)。
- 修复了某些情况下在将 join 运行时过滤器添加到查询计划时触发的逻辑错误。该问题是由于错误地从 join 的一侧返回了重复的 const 列所致。#93144 (Alexander Gololobov) 。
- 用于 join 运行时过滤器的特殊函数
__applyFilter在某些本应有效的情况下会返回 ILLEGAL_TYPE_OF_ARGUMENT。#93187 (Alexander Gololobov) 。 - 当插值列实际上是同一列的别名时,防止不同的插值列在一个块中合并为同一列。#93197 (Yakov Olkhovskiy) 。
- 在与已补齐的右表进行连接时,不要添加运行时过滤器。#93211 (Alexander Gololobov) 。
- 修复 Keeper 在会话失效后未清理持久 watches 的问题。该修复关闭了 #92480。#93213 (Konstantin Vedernikov) 。
- 修复 Iceberg 中 ORDER BY Tuple 的问题。此更改关闭了 #92977。#93225 (Konstantin Vedernikov).
- 修复了 S3Queue 设置
s3queue_migrate_old_metadata_to_buckets中的错误。关闭了 #93392、#93196、#81739。#93232 (Kseniia Sumarokova) 。 - 在合并过程中重建投影时,会移除未使用的列。这可降低内存使用量,并减少临时 parts 的创建。#93233 (Nikolai Kochetov).
- 修复了在存在标量关联子查询时,子查询中未使用列被移除的问题。修复前,如果某一列仅在关联子查询中使用,就可能被误删,从而导致查询报
NOT_FOUND_COLUMN_IN_BLOCK错误而失败。#93273 (Dmitry Novik). - 修复在对源表执行 ALTER 时,MV 中可能缺失子列的问题。关闭 #93231。#93276 (Pavel Kruglov) 。
- 修复了 analyzer 在为
Merge表引擎规划查询时的问题:合并本地表与远程/Distributed 表时,可能会对hostName()抛出 ILLEGAL_COLUMN。关闭 #92059。#93286 (Jinlin) 。 - 修复了使用非常量数组参数时,
NOT IN返回错误值的问题 + 支持非常量 Array 函数。关闭 #14980。#93314 (Yarik Briukhovetskyi). - 修复
use_top_k_dynamic_filtering优化导致的Not found column问题。修复了 #93186。#93316 (Nikolai Kochetov) 。 - 修复了基于子列创建的文本索引在重建时出现的问题。#93326 (Anton Popov) 。
- 修复了
hasAllTokens和hasAnyTokens函数将空数组作为第二个参数时的处理问题。#93328 (Anton Popov). - 修复了在针对右侧表计算 totals 的查询中使用运行时过滤器时出现的逻辑错误。#93330 (Alexander Gololobov).
- 如果使用非常量的分词器参数 (第 2、3、4 个参数) 调用函数
tokens,server 将不再崩溃,例如SELECT tokens(NULL, 1, materialize(1))。 #93383 (Robert Schulze). - 修复了
groupConcat状态反序列化中的整数溢出漏洞;该漏洞可能因精心构造的聚合状态而引发内存安全问题。#93426 (Raufs Dunamalijevs) 。 - 修复了在索引不包含任何标记 (所有数组都为空,或所有标记均被分词器跳过) 时,对数组列进行文本索引分析的问题。#93457 (Anton Popov).
- 当连接字符串中已包含用户名/密码时,避免在 ClickHouse Client 中使用 oauth 登录。#93459 (Krishna Mannem) 。
- 修复 DataLakeCatalog 对 Azure ADLS Gen2 下发凭据的支持:从 Iceberg REST 目录中解析
adls.sas-token.*参数,并修复 ABFSS URL 解析。#93477 (Karun Anantharaman). - 修复了 analyzer 对 GLOBAL IN 的支持问题 (此前会在远程节点上再次创建 set) 。 #93507 (Azat Khuzhin).
- 修复了在反序列化时直接提取到稀疏列中的子列的问题。#93512 (Pavel Kruglov) 。
- 修复了在搜索查询重复时无法从文本索引直接读取的问题。 #93516 (Anton Popov).
- 修复了在启用运行时过滤器且 join 的表中同一列被重复返回多次时 (例如
SELECT a, a, a FROM t) 出现的 NOT_FOUND_COLUMN_IN_BLOCK 错误。#93526 (Alexander Gololobov). - 修复了一个问题:通过 ssh 连接时,clickhouse-client 会要求输入两次密码。 #93547 (Isak Ellmer).
- 确保 ZooKeeper 在关闭时能够正常完成清理 (修复了极少数情况下关闭时可能卡住的问题) 。#93602 (Azat Khuzhin) 。
- 修复恢复 ReplicatedMergeTree 时因去重竞争条件导致的 LOGICAL_ERROR。#93612 (Pablo Marcos) 。
- 修复了在某些输入格式中直接反序列化到 Sparse 列时,使用 Sparse 列更新生存时间 (TTL) 的问题。此修复还解决了可能出现的逻辑错误
Unexpected type of result TTL column。#93619 (Pavel Kruglov) 。 - 修复了
h3 index函数在传入无效输入时有时会崩溃或卡死的问题。#93657 (Michael Kolupaev) 。 - 在非 UTF-8 数据上使用
ngram_bf索引会导致读取未初始化的内存,其中的值可能会出现在生成的索引结构中。修复了 #92576。#93663 (Alexey Milovidov) 。 - 验证解压后缓冲区的大小是否符合预期。#93690 (Raúl Marín) 。
- 防止用户通过
merge表引擎在未检查SHOW COLUMNS权限的情况下获取表的列列表。#93695 (János Benjamin Antal). - 修复了基于子列创建的跳过索引的物化问题。#93708 (Anton Popov).
- 我们将 storages 的共享指针保存在
QueryPipeline::resources::storage_holders中,以确保在PipelineExecutor存活期间,IStorage对象不会被销毁。#93746 (Miсhael Stetsyuk) 。 - 修复了重启后 interserver host 发生变化时无法 Attach Replicated 数据库的问题。#93779 (Tuan Pham Anh) 。
- 修复了在启用缓存时,
ReadBufferFromS3中触发的断言!read_until_position。#93809 (Kseniia Sumarokova) 。 - 修复了在极少数情况下,将空元组用于
Map列时出现的逻辑错误。关闭 #93784。#93814 (Nihal Z. Miaji) 。 - 修复了在合并过程中重建 projections 时
_part_offset损坏的问题,并通过避免对_part_offset列进行不必要的读取,以及在 projection 计算中跳过不需要的列,优化了 projection 处理。这延续了 #93233 中引入的优化。#93827 (Amos Bird) 。 - 移除了对 ‘Bad version’ 的处理逻辑。 #93843 (Anton Ivashkin).
- 修复了当键为有符号整数类型时,
optimize_inverse_dictionary_lookup在 Distributed 查询中不生效的问题。关闭 #93259。#93848 (Nihal Z. Miaji) 。 - 修复了分布式
remote()查询中lag/lead不生效的问题。解决 #90014。#93858 (Nihal Z. Miaji) 。 - 修复 system instrument dispatch 中的缺陷。#93937 (Pablo Marcos) 。
- 在 https://github.com/ClickHouse/ClickHouse/pull/89173 中,我们给
TraceSender通过内部管道发送的结构新增了一个字段。然而,buffer 的大小没有同步更新 (这里) ,因此写入 buffer 的数据量超过了buffer_size,从而导致多次刷写。并且由于TraceSender::send会由不同线程调用,不同线程的刷写可能会交错在一起,破坏了接收端 (TraceCollector) 所依赖的不变量。#93966 (Miсhael Stetsyuk) 。 - 修复带有
USING子句的Join存储在执行 join 操作时转换为超类型的类型转换问题。修复了 #91672。修复了 #78572。#94000 (Dmitry Novik) 。 - 修复了在 Merge 表上应用 join 运行时过滤器时,未正确添加 FilterStep 的问题。#94021 (Alexander Gololobov) 。
- 如果某个
SELECT查询包含针对多个列的谓词,使用了 bloom filter 跳过索引,并且同时存在OR和NOT条件,则可能返回不一致的结果。该问题现已修复。#94026 (Shankar Iyer) 。 - 修复对带有依赖索引的列执行 CLEAR 时出现的问题。#94057 (Raúl Marín).
- 修复
ReadWriteBufferFromHTTP中使用未初始化值的问题。#94058 (Alexey Milovidov) 。 - 修复了对 JSON 中类型化路径的不正确检查。该检查是在 https://github.com/ClickHouse/ClickHouse/pull/92842 中引入的,可能会在现有表启动时导致 error。#94070 (Pavel Kruglov) 。
- 修复在存在 OUTER JOIN 的情况下进行过滤器分析时发生的崩溃。修复了 #90979。#94080 (Dmitry Novik) 。
- 修复在并行使用 UInt8 聚合键时
uniqTheta的精度问题 (max_threads> 1,默认值) 。#94095 (Azat Khuzhin) 。 - 修复了在
SCOPE_EXIT内调用socket.setBlocking(true)时抛出异常而导致的崩溃。#94100 (Miсhael Stetsyuk). - 修复了在 ReplicatedMergeTree 中,
DROP PARTITION删除由后续日志条目创建的 parts 时导致的数据丢失问题。#94123 (Tuan Pham Anh). - 已修复 Parquet reader v3 错误处理跨越页面边界的数组的问题。例如,这种情况会出现在由 Arrow 写入且未启用 page statistics 或 page index 的文件中。仅影响 Array 数据类型的列。可能的症状是,大约每 1 MB 数据就会有一个数组被截断。在此修复发布前,可使用以下设置作为临时解决方法:
input_format_parquet_use_native_reader_v3 = 0。#94125 (Michael Kolupaev) 。 - 修复了 ReplicatedMergeTree 在等待日志条目时 watch 数量过多的问题。#94133 (Azat Khuzhin) 。
- 函数
arrayShuffle、arrayPartialShuffle和arrayRandomSample现支持将常量列物化,从而使不同行得到不同的结果。#94134 (Joanna Hulboj) 。 - 修复了在 materialized view 中对表函数求值时的数据竞争问题。#94171 (Alexey Milovidov) 。
- 修复
PostgreSQL数据库引擎中的 nullptr 解引用问题 (当查询有误时会触发) 。关闭 #92887。#94180 (Alexey Milovidov) 。 - 修复了可刷新materialized views在使用包含多个子查询的
SELECT查询时出现的内存泄漏问题。#94200 (Antonio Andelic) 。 - 修复了
DataPartStorageOnDiskBase::remove与system.parts之间的数据竞争。关闭 #49076。#94262 (Alexey Milovidov) 。 - 移除了 HashTable 复制赋值中错误的
noexcept指定符,该问题在发生内存异常时可能导致程序崩溃 (std::terminate) 。#94275 (Nikita Taranov) 。 - 此前,如果创建的投影在 GROUP BY 中包含重复列 (例如
GROUP BY c0, c0) ,插入数据时在启用optimize_row_order的情况下会触发std::length_error。修复了 #94065。#94277 (Alexey Milovidov) 。 - 修复了 ZooKeeper 客户端在连接时的一个隐蔽问题,该问题会导致卡死和崩溃。#94320 (Azat Khuzhin) 。
- 修复“函数到子列”优化未对子列生效的问题。#94323 (Pavel Kruglov) 。
- 修复在启用
enable_lazy_columns_replication时,嵌套 RIGHT JOIN 可能导致结果不正确的问题。该缺陷会导致启用复制的列中的所有行错误地返回相同的值,而不是各不相同的值。关闭 #93891。#94339 (Vladimir Cherkasov) 。 - 修复了在 SEMI JOIN 中使用等价集合进行过滤器下推的问题。如果参数类型发生变化,则不要下推过滤器。修复了 #93264。#94340 (Dmitry Novik) 。
- 修复在 database DataLake 数据库引擎中使用 DeltaLake CDF 的问题 (delta lake catalogs integration) 。关闭 #94122。#94342 (Kseniia Sumarokova) 。
- 修复了在使用
SLRU缓存策略时,当前指标FilesystemCacheSizeLimit值不正确的问题。#94363 (Kseniia Sumarokova) 。 - 现在,在创建 Backup 数据库引擎时如果提供的参数少于两个,会返回更明确的错误消息 (
Wrong number of arguments,而不是std::out_of_range: InlinedVector::at(size_type) const failed bounds check.) 。#94374 (Robert Schulze). - 忽略在数据库级别对带有 grant option 的全局授权执行这类不可能的撤销操作。#94386 (pufit).
- 修复从 compact parts 中读取稀疏偏移量的问题。关闭 #94385。#94399 (Pavel Kruglov) 。
- 即使启用了
alter_column_secondary_index_mode的throw模式,也不再阻止对使用隐式索引的列执行 ALTER。#94425 (Raúl Marín) 。 - 修复了在多个
receivePacketsExpectQuery调用读取Protocol::Client::IgnoredPartUUIDs时,TCPHandler发生崩溃的问题。 #94434 (Miсhael Stetsyuk). - 修复了
system.functions中敏感数据脱敏的问题。#94436 (Vitaly Baranov) 。 - 修复在禁用
send_profile_events时发生的 nullptr 解引用问题。该特性最近才在 ClickHouse Python 驱动中引入。已关闭 #92488。#94466 (Alexey Milovidov) 。 - 修复合并过程中,文本索引 .mrk 的不兼容问题。#94494 (Peng Jian) 。
- 启用
read_in_order_use_virtual_row时,代码会按完整主键的大小访问索引列,但未检查索引是否已被截断,从而导致释放后使用或使用未初始化内存。关闭 #85596。#94500 (Alexey Milovidov) 。 - 修复了在为带有 GLOBAL IN 的子查询发送外部表时,若类型为 Nullable,因类型不匹配导致的错误。关闭 #94097。#94511 (Alexey Milovidov) 。
- 在早期版本中,对同一表达式包含多个索引条件的查询可能会误报
Not found column异常。关闭 #60660。#94515 (Alexey Milovidov) 。 - 修复运行时过滤器中对 Nullable join 列处理不当的问题。#94555 (Alexander Gololobov) 。
- 在当前正在使用的另一个工作负载中创建工作负载时,不再会导致崩溃。#94599 (Sergei Trifonov) 。
- 修复了在缺失列上计算
isNotNull时,ANY LEFT JOIN 优化期间发生的崩溃。#94600 (Molly). - 修复了在引用其他具有计算默认值的列时,默认表达式求值不正确的问题。#94615 (Alexey Milovidov) 。
- 修复 BACKUP/RESTORE 操作中的权限问题。#94617 (Pablo Marcos) 。
- 修复了在数据类型为
Nullable(DateTime64)时,因类型转换错误导致的崩溃问题。 #94627 (Miсhael Stetsyuk). - 修复了一个错误:某些带有
ORDER BY的分布式查询可能会返回ALIAS列值对调的结果 (即列a显示列b的数据,反之亦然) 。#94644 (filimonov). - 修复将 keeper-bench 结果存储到文件时的问题。#94654 (Antonio Andelic) 。
- 修复了在列包含负浮点值时,MinMax 类型统计信息估算错误的问题。#94665 (zoomxi).
- 修复了当 Map 的键为 struct 时读取 Parquet 文件的问题。#94670 (Konstantin Vedernikov) 。
- 修复在使用复杂 ON 条件时可能产生错误的 RIGHT JOIN 结果。关闭 #92913。#94680 (Vladimir Cherkasov).
- 在 Vertical merge 之后保留固定的索引粒度 (use_const_adaptive_granularity) 。#94725 (Azat Khuzhin) 。
- 修复了变更在处理标量子查询和表依赖项时的缺陷。如果某个表在某一列上存在依赖项 (索引或投影) ,标量子查询可能会在没有数据的情况下被求值并缓存,进而导致错误的变更。#94731 (Raúl Marín).
- 修复 AsynchronousMetrics 中
cpu_pressure在出错时的回退问题。#94827 (Raúl Marín). getURLHostRFC函数在解引用指针前缺少越界检查。当向domainRFC传入空字符串时,它会读取未初始化的内存,从而触发 MSan 错误。#94851 (Alexey Milovidov) 。- 修复加密磁盘只读状态相关的问题。#94852 (Azat Khuzhin) 。
- 修复了在旧 analyzer 中对分布式表使用小数
LIMIT/OFFSET时的逻辑错误。关闭 #94712。#94999 (Ahmed Gouda). - 修复了在默认启用 JOIN 运行时过滤器时,在某些条件下发生崩溃的问题。#95000 (Alexander Gololobov) 。
- 改进表引擎
URL()和表函数url()中所用 URL 里的密码掩码处理。#95006 (Vitaly Baranov) 。 - 函数
toStartOfInterval现在在启用enable_extended_results_for_datetime_functions时,其行为与toStartOfX相同,其中X可以是Day、Week、Month、Quarter或Year。#95011 (Kirill Kopnev) 。 - 修复了常量字符串比较未正确遵循设置
cast_string_to_date_time_mode、bool_true_representation、bool_false_representation和input_format_null_as_default的问题。关闭 #91681。#95040 (Nihal Z. Miaji) 。 - 修复文件系统缓存中的数据竞争问题。#95064 (Alexey Milovidov) 。
- 修复了 Parquet 读取器中的一个罕见竞态条件。 #95068 (Alexey Milovidov).
- 修复了
LIMIT为零时 top K 优化中的崩溃问题。关闭了 #93893。#95072 (Alexey Milovidov) 。 - 从 DateTime/整数转换为 Time64 时,会通过
toTime提取时刻部分,而toTime并不是单调函数。ToDateTimeMonotonicity模板此前误将这种转换标记为单调,导致在调试构建中出现 “Invalid binary search result in MergeTreeSetIndex” 异常。#95125 (Alexey Milovidov). - 仅在必要时才重新创建 manifest 文件条目列表 (此前每次迭代都会执行) 。#95162 (Daniil Ivanik).
构建/测试/打包改进
- 新增一组工具,借助 jemalloc 的堆分析能力,对 ClickHouse SQL 解析器中的内存分配进行 profiling。#94072 (Ilya Yatsishin).
- 新增了一个工具,用于简化解析器中内存分配的调试。它会在将查询解析为 AST 表示之前和之后,使用 jemalloc 的
stats.allocated指标来显示分配了哪些内容。此外,它还支持内存 profiling 模式,可在前后分别转储 profile,以生成分配发生位置的报告。#93523 (Ilya Yatsishin). - 移除通过传递依赖引入的 libc++ 头文件包含。#92523 (Raúl Marín).
- 将一些原本顺序执行的测试改为并行执行:https://github.com/ClickHouse/ClickHouse/pull/93030/changes#diff-c3a73510dae653c9bbfa24300b32f5d6ec663fd4e72cc4a3d5daa6e4342915df。[#93030](https://github.com/ClickHouse/ClickHouse/pull/93030) (Nikita Fomichev).
- 清理一些构建标志。#93679 (Raúl Marín).
- 将 c-ares 从 v1.34.5 升级到 v1.34.6。此次更新处理了 c-ares 的
CVE-2025-62408,但该问题与 ClickHouse 无关。#94129 (Govind R Nair). - 使用
curl8.18.0。#94742 (Konstantin Bogdanov).