向后不兼容的变更
- 默认情况下,来自用户 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).