ClickHouse 26.4 版本,2026-04-30。演示文稿 , 视频
向后不兼容的变更
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,则会从存储中读取这些列;否则,会在读取步骤之后通过 expression 步骤填充这些列。#101742 (Mikhail Artemenko ).
IN 运算符现在也会拒绝复合类型 (Tuple、Array、Map) 内部发生有损的 Decimal 转换,从而使其行为与顶层 scalar 比较保持一致。此前,精度检查仅对顶层 scalar 值生效:例如,CAST('33.3', 'Decimal64(1)') IN (33.33) 会正确返回 0,但 CAST(['33.3'], 'Array(Decimal64(1))') IN ([33.33]) 会因为有损转换发生在 Array 内部而错误地返回 1。现在这两种情况都会正确返回 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 ).
新特性
为哈希连接和并行哈希连接增加自动溢写功能:达到内存限制时,会将其转换为 Grace 哈希连接。此行为由 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 在块压缩合并中的新行为。#94207 (Kirill Kopnev ).
新增函数 arrayAutocorrelation(arr [, max_lag]),用于计算数值数组在各个滞后值下的归一化自相关。支持整数、浮点数和十进制数组类型。#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 ) 。
为 MergeTree 新增了对 JSON 列跳过索引的支持,可将 JSONAllPaths 与 bloom_filter、tokenbf_v1、ngrambf_v1 以及 text (倒排) 索引类型配合使用,从而根据每个粒度中存在的 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 语法编写连接查询;该语法会自动匹配所有同名列,并在结果中对这些列进行去重。#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 ).
为 EXTRACT 操作符新增与 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 性能分析 Web UI,可通过 HTTP 控制端口上的 /jemalloc 访问。#100606 (murphy-4o ).
实现了适用于有序和无序模式的命令 SYSTEM FLUSH OBJECT STORAGE QUEUE db.table PATH 'x'。#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 refresh 设置,以减少跨副本复制延迟导致的数据缺失。#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 ) 。
文本索引现已达到 GA,并且无论 compatibility 设置为何都会保持启用,从而避免在备份恢复期间或以兼容模式运行时意外被禁用。#101518 (Nikita Fomichev ) 。
Experimental 功能
为 Iceberg 表添加 ALTER TABLE ... EXECUTE remove_orphan_files,用于识别并从对象存储中移除未被引用的文件。#99127 (murphy-4o ).
添加 query_plan_optimize_join_order_randomize 设置,用于将连接重排序时使用的统计信息随机化,适用于测试。#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 ). 该表结构在未来版本中很可能会发生变化。
错误修复(官方稳定版本中用户可见的异常行为)
修复了由惰性物化返回不必要的列而导致的 Block structure mismatch in stream 错误。修复 #95191 。#96682 (Nikolai Kochetov )。
修复了在数据脱敏策略查询中使用 ON CLUSTER 时的逻辑错误。#97594 (Bharat Nallan ) 。
修复了在 GCS 上使用 Unity Catalog 时的一个缺陷。#98456 (Melvyn Peignon ) 。
DataLakeCatalog 现在在校验 auth_header 设置时,会遵循服务器的 http_forbid_headers 配置。 #98827 (Michael Anastasakis ).
修复 S3 使用花括号展开的 glob 模式中的 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 ) 。
修复了一个 bug:在同一请求中与 compatibility 一起发送的显式设置,如果其值与服务器默认值相同,可能会被静默忽略。#99402 (Raufs Dunamalijevs ).
修复了 Hive 分区路径中带有前导零的数字导致报错的问题。修复 #98801 。#99458 (Yarik Briukhovetskyi ).
修复了表在与正在执行的读取查询并发删除时发生的 heap-use-after-free 问题 (过去 90 天内在 CI 中出现 19 次) 。 #99483 (Alexey Milovidov ).
修复了 Keeper 中的一个 bug:如果同一服务器上的另一个无关会话恰好在错误的时机被关闭,读取请求可能会卡住 (导致会话超时) 。#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 ) 。
修复了对 ColumnReplicated 执行操作的函数中的异常;该异常由 JOIN 生成的未引用行触发。#99564 (Hechem Selmi ).
修复 CLEAR COLUMN 不会重建投影,也不会重新计算依赖于被清除列的物化列的问题,否则可能在后续合并过程中导致异常或数据损坏。#99565 (Desel72 ).
修复了 ConditionSelectivityEstimator 中的一个异常 (Bad get: has Tuple, actual type String) :当查询在启用了 use_statistics 且具有列统计信息的表上,使用带有单个标量查询参数的 IN (例如 WHERE col IN ({p:String})) 时,会触发该异常。#99614 (Ilya Yatsishin ).
含有未知投影的数据 part 不应被永久视为已丢失。#99623 (Sema Checherinda ) 。
修复了在并发执行 SYSTEM STOP MERGES 和 SYSTEM START MERGES 时,垂直合并过程中偶发的逻辑错误异常。#99628 (Desel72 ).
修复 injectRequiredColumns 中的悬空引用问题,该问题会在合并过程中导致崩溃。#99679 (Tuan Pham Anh ).
修复了 Avro 格式读取器在读取超出目标列类型范围的数值时的未定义行为。现在,查询在发生溢出时会直接失败,而不再静默产生错误的值。#99697 (asyablue22 ).
修复了 executable 表函数参数中 shell 风格引号的解析问题。#99794 (Nikita Semenov ) 。
修复了 NativeReader 在反序列化 Native 格式流、行数不匹配时发生的误判中止:将 LOGICAL_ERROR 修改为 INCORRECT_DATA,使该错误作为数据错误处理,而不是在 sanitizer/调试构建中触发 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 TABLE ... MODIFY QUERY 包含带有 SETTINGS 的嵌套子查询,且 ALTER 本身也带有 SETTINGS 时,会触发“Inconsistent AST formatting”异常。#99938 (Nikita Mikhaylov ) 。
因疑似出现性能回归,回滚 #97114 "将连接步骤的行数估算提前到检查是否只有 1 个子节点之前"。 #99957 (Alexander Gololobov ).
修复了一个 bug:如果文件的 HEAD 请求响应头中缺少 Content-Length 头 (例如,由于 GCS 中的解压缩转码) ,ClickHouse 可能会跳过这些文件。#99971 (Yarik Briukhovetskyi ).
修复了这样一个断言失败问题:将 NumericIndexedVector 聚合状态与偶数整数常量相乘时,在调试构建中会抛出异常,在发布构建中会产生错误结果。该问题由 pointwiseAddInplace 中存在别名关系的 Roaring 位图发生自异或所致。#99976 (Desel72 ) 。
防止在通过链式 JOIN USING 执行旧版过滤器下推时,因连接转换后键类型发生变化而触发 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 ) 。
修复了以下问题:使用 INSERT 和 VALUES 时,如果数据后的下一行带有尾随 SQL 注释 (-- 或 /* */) ,则会导致失败。现在会跳过该注释,而不是将其解析为另一行数据。#100016 (Pratima Patel ) 。
修复了在比较包含 NULL 元素的元组时,arrayRemove 中出现的异常。#100017 (Alexey Milovidov ).
修复 system.asynchronous_inserts 中的跨用户数据泄漏问题:任何对该表具有 SELECT 权限的用户,都能看到其他用户的待处理异步插入条目。现在,除非用户具有 SHOW_USERS 特权,否则这些条目会按当前用户进行过滤。#100024 (Shaohua Wang ) 。
修复了将 Time64 转换为 UInt64 时,值可能被截断到 24 小时的情况。#100025 (Yarik Briukhovetskyi ).
修复了在 CREATE DICTIONARY 的定义中,列表值包含不存在的函数时本地服务器崩溃的问题。#100036 (Yakov Olkhovskiy ).
修复 CSV、MsgPack 格式无法正确解析 Nullable(Tuple) 的问题。Closes #99753 。#100038 (Nihal Z. Miaji ) 。
修复在将 WITH 函数表达式的别名 (例如 tuple(...)) 用作 IN 右侧时,CREATE VIEW 因 UNKNOWN_IDENTIFIER 而失败的问题。#100042 (Peng ) 。
修复在并行副本下,将 timeseries 聚合函数 (例如 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 ).
修复了一个 LOGICAL_ERROR 异常:在涉及 Dynamic 列、交叉连接和运行时过滤器的查询中,ColumnVariant::filter 在 hasOnlyNulls 优化路径下会共享 Variant 列指针,而不是克隆它们,从而导致该问题。关闭 https://github.com/ClickHouse/ClickHouse/pull/100147。 #100234 (Pavel Kruglov ).
修复了 Variant 数组中的一个缺陷:调用 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 元数据文件路径设置中包含空字节时引发的异常。#100283 (Alexey Milovidov ) 。
修复了在使用 distributed_index_analysis 且谓词中包含 IN 子查询时,执行查询数量出现平方级增长的问题。#100287 (Anton Popov ).
修复将 GROUP BY ... WITH TOTALS HAVING 与 UNION DISTINCT 及可空表达式结合使用时触发的“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 ).
修复在数据分散到多个 parts 且 그래뉼 边界未对齐时,SELECT count() 查询在使用 max_rows_to_read / force_primary_key 时触发 TOO_MANY_ROWS 异常的问题。#100408 (Alexey Milovidov ).
修复 system.completions,使其在所有授权组合下都能根据访问权限正确筛选数据库、表和列:按表授权、按库授权,以及按列撤销。 #100432 (Shaohua Wang ).
修复 NuRaft 中由竞争条件引发的 SEGFAULT。#100444 (Pablo Marcos ) 。
min/max/argMin/argMax 现在对 NaN 的处理方式与 ORDER BY 一致:始终跳过 NaN (仅当所有值均为 NaN 时才返回 NaN) 。此前,由于 IEEE 754 中无序比较的语义,结果会取决于 NaN 在数据中的位置。#100448 (Raúl Marín ).
修复了一个复制粘贴导致的错误:在未设置 delta_lake_snapshot_start_version 的情况下设置 delta_lake_snapshot_end_version 时,之前会被静默忽略,而不会报出 BAD_ARGUMENTS 错误。#100454 (Mohammad Lareb Zafar ).
StorageRabbitMQ::shutdown 不具备幂等性 (它会无条件访问 weak pointers,然后销毁对应的 shared pointers) ,但现在会被调用两次:一次在 StreamingStorageRegistry 中,随后一次在 DatabaseCatalog 中。此修复使该方法具备幂等性,并增加了防御性的空值检查。#100455 (Miсhael Stetsyuk ) 。
修复了使用 accurateCastOrNull 时,将目标类型设为 QBit 会触发 LOGICAL_ERROR 异常的问题。#100470 (Raufs Dunamalijevs ) 。
修复在 optimize_on_insert=0 的 Wide parts 中,向包含嵌套 Array(JSON) 列的表插入数据时出现的 LOGICAL_ERROR 异常“流 ... 未找到”。 #100475 (Pavel Kruglov ).
对备份元数据中的文件条目路径进行验证,在 RESTORE 期间拒绝路径遍历、绝对路径和空名称。#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 ).
修复带有查询级 OFFSET 的 SAMPLE 存在的 AST 格式不一致问题。关闭 #100576 。#100579 (Pavel Kruglov ) 。
修复 Polaris 目录与 Azure 的兼容性问题。自 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 ).
允许在将表函数用作数据源时,向 cluster() 和 clusterAllReplicas() 表函数传入分片键 (例如 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 存储磁盘,但端点暂时不可达 (例如 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() 函数时导致的服务器崩溃问题。 #100760 (Groene AI ).
修复了在 S3 对象存储上存在并发写入时,从 Log 或 StripeLog 表读取数据会触发 file_offset_of_buffer_end <= getFileSize() 断言失败的问题 (调试构建中的异常) 。#100763 (Alexey Milovidov ).
修复了在启用统计信息的表上,当 WHERE 子句包含函数表达式 (如 toDecimal64(col, 3)) 时,统计信息选择率估算器中出现的异常。该估算器现在会跳过此类谓词,而不是尝试进行无效的类型转换。#100764 (Han Fei ) 。
修复了一个罕见问题:连接在重排序时可能会产生错误结果。#100790 (Yarik Briukhovetskyi ).
修复了优化后的简单计数中 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 ).
修复了服务器关闭期间加载字典时因空指针解引用导致的段错误。字典线程会并发调用 Context::getUserDefinedSQLObjectsStorage (该调用会解引用 user_defined_sql_objects_storage) ,与此同时主线程调用 Context::shutdown (将 user_defined_sql_objects_storage 设为 null) 。我们需要确保在执行 Context::shutdown 之前,先在字典加载器中禁用后续更新,终止当前正在运行的字典查询,并等待字典加载线程结束——这与我们处理普通查询的方式类似。#100839 (Miсhael Stetsyuk ).
修复了在输入包含非 ASCII 字节时,ULIDStringToDateTime 中的缓冲区溢出问题。#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 在处理可空元组数组时出现异常的问题,例如 SELECT intDiv([divide((1, 2), ... AND NULL)], 2)。 #100895 (Raúl Marín ).
在存储 StorageAlias 的定义之前,先对引擎参数求值,以便将 currentDatabase() 之类的表达式在保存到数据库前解析为字面量。#100902 (Nikolay Degterinsky ) 。
修复 query_plan_merge_expressions = 0 时 processAndOptimizeTextIndexFunctions 的问题,此时 ExpressionStep 直接位于 ReadFromMergeTree 之上。修复 #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 子句中包含元组子查询,例如 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 ).
修复以下崩溃问题:当惰性列复制 (enable_lazy_columns_replication) 生成的 ColumnReplicated 列流入带有延迟到达输入的归并排序管道时,合并算法会发生崩溃 (Logical error: isConst/isSparse/isReplicated assertTypeEquality) 。#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 ) 。
修复在启用分析器后,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 和并行副本时,时间序列聚合函数出现“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 表时,若 lc_column 为 LowCardinality 类型导致的服务器崩溃问题 (LOGICAL_ERROR: Bad cast from ColumnVector to ColumnLowCardinality) 。#101220 (Groene AI ).
修复 S3Queue 中失效处理中状态节点的清理问题。#101230 (Kseniia Sumarokova ) 。
修复了 mergeTreeAnalyzeIndexes() 在 optimizations 参数无效时导致的未定义行为。 #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 ).
修复了从 Delta Lake 集群向 Replicated MergeTree 执行 insert-select 时的问题。 #101299 (Konstantin Vedernikov ).
修复了这样一个崩溃问题:当标量子查询引用一组存在依赖链的已物化 CTE 时,会出现 "逻辑错误:在物化完成前从已物化 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 崩溃并报错 "当前组件为空" 的问题。#101462 (Groene AI ).
修复了在模糊测试器生成格式错误的 Dynamic 类型 AST 时,DataTypeDynamic::create() 中出现的段错误。 #101464 (Groene AI ).
在未启用 DeltaKernel 的情况下使用 delta_lake_snapshot_version 或 CDF 版本设置时,将抛出错误,而不是静默返回错误数据。#101489 (Desel72 ).
修复在使用 ARRAY JOIN 和 JOIN USING 并启用 analyzer_compatibility_join_using_top_level_identifier 设置时出现的 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 ).
修复了调用 intExp10 时传入 NaN 参数后错误消息显示不正确的问题——显示成了 intExp2,而不是 intExp10。#101582 (Krishna Chaitanya ) 。
修复了在 #100288 中重构后,allow_statistics=0 无法阻止 ALTER TABLE ADD STATISTICS 和 ALTER TABLE DROP STATISTICS 的问题。#101585 (Krishna Chaitanya ) 。
修复 KeeperMap 的 CREATE TABLE 在 25.1 之前部分删除操作遗留的 ZooKeeper 节点缺少 drop_lock_version 节点时,因 "Cannot create metadata for table" 而失败的问题。#101623 (Antonio Andelic ).
修复读取 Map 子列时可能发生的逻辑错误。关闭 #100769 。关闭 #101336 。#101641 (Pavel Kruglov ) 。
修复 getSubcolumnData 中精确子列匹配优先于前缀匹配的优先级问题,以避免可能发生的崩溃。关闭 #101271 。#101645 (Pavel Kruglov ) 。
修复以下崩溃问题:在禁用 use_variant_default_implementation_for_comparisons 时,将 LowCardinality 列与 Variant NULL 常量比较会触发崩溃 (LOGICAL_ERROR: "ColumnUnique can't contain null values") 。#101690 (Groene AI ) 。
内容:为 Bzip2ReadBuffer 增加了空流保护:当内部流为空时,返回 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 ) 。
修复了在带缓存封装的磁盘上配置 thread_pool_size 时发生的崩溃。此前,FileCacheSettings::loadFromConfig() 会将 thread_pool_size 判定为未知设置并拒绝加载,导致服务器无法启动。该设置是有效的 IDisk 参数,用于控制在后台 part 移动期间执行磁盘间复制操作时所使用的线程数。#101712 (Francisco ) 。
修复了 RANGE_HASHED 字典在创建时会静默接受不存在的 MAX 范围属性,以及在最小和最大范围属性类型不一致时使用错误类型配置的问题。该缺陷源于 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 Query 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 的假阴性问题:当搜索字符串首次出现在 demangle 后的符号名模板参数内时,会触发该问题。#101885 (Pablo Marcos ) 。
修复了在 ZooKeeper 会话于定期刷新期间过期时 UDF 注册表丢失的问题——在完整刷新成功之前,所有用户自定义函数都可能不可用。#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 或分布式表,且组合过滤条件中混用了 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 连接算法一起使用时导致的行排序错误。受影响的查询可能会按错误顺序返回结果,从而在无提示的情况下产生错误输出。#102036 (János Benjamin Antal ).
修复了一个 LOGICAL ERROR (索引类型大小异常) :配置了 max_bytes_in_join 设置时,RIGHT JOIN 和 FULL JOIN 查询中可能会出现该错误。#102042 (Jimmy Aguilar Mena ) 。
修复了 Time 带有负值时与 DateTime 比较会返回错误结果的问题。关闭了 #101670 。#102056 (Yarik Briukhovetskyi ) 。
修复了 UDF 刷新时的崩溃问题;原因是 ZooKeeperRetriesControl 在未续订的情况下,对陈旧 (已过期) 的 ZooKeeper 会话进行再试行。#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 ).
修复了因缓存键不匹配,删除 part 后 VectorSimilarityIndexCache 条目始终无法被清除的问题。 #102152 (Seva Potapov ).
使用 rabbitmq 存储时,会对损坏的消息发送 NACK。#102157 (Seva Potapov ).
修复了解析格式错误的空元组字符串时的逻辑错误。#102289 (Nihal Z. Miaji ).
修复在 GROUP BY 列顺序与表的排序键不一致时使用 optimize_aggregation_in_order=1 导致聚合结果错误 (出现重复行) 的问题。#102299 (Groene AI ).
修复了在使用 Avro 格式时,IcebergLocal ALTER TABLE ... UPDATE 发生崩溃的问题;原因是在序列化前未先解包 LowCardinality/Nullable 包装类型。#102337 (Desel72 ).
修复了在没有 expression 的物化列上执行 mutation 时发生的段错误。关闭 #102185 。#102342 (zoomxi ).
修复了 Coalescing MergeTree 对数组类型的处理问题。此修复关闭了 #89509 。#102384 (Konstantin Vedernikov ) 。
修复了在启用 bloom filter 下推且 WHERE 子句包含等值/不等值条件时读取 Parquet 文件会发生段错误 (或在调试构建中出现 LOGICAL_ERROR) 的问题。该崩溃是由于 Parquet 预取器在读取 bloom filter 数据时发生越界内存访问所致,还可能导致非确定性的错误查询结果。#102385 (Groene AI ) 。
修复了 SLRU 文件系统缓存动态调整大小期间出现的 LOGICAL_ERROR 中止问题,其原因是各子队列共享淘汰统计信息,以及失败候选项的恢复路径不正确。#102396 (Antonio Andelic ).
修复 Replicated 数据库中无目标表的别名表在全新副本上初始化失败的问题。关闭 #101320 。#102397 (Nikolay Degterinsky ) 。
修复了在搜索完全由空字节组成的 needle 时,字符串搜索函数 (countSubstrings、position 等) 发生越界读取的问题。#102401 (Raúl Marín ) 。
全文索引设置 (enable_full_text_index、allow_experimental_full_text_index、use_skip_indexes_on_data_read) 在 compatibility 设置指定为早于 26.1 的版本时,不再会被禁用。此前,这可能会导致 SharedDatabaseCatalog 无法创建带有文本索引的表。#102422 (Nikita Fomichev ) 。
修复 printf 在末尾带有 % 时的越界读取问题。#102472 (Raúl Marín ) 。
修复了 AsynchronousMetrics 中调试构建里的一个 chassert 异常 ReadBuffer is canceled,原因是 rewind 未重置缓冲区的取消标志。#102524 (Yuri Fedoseev ).
修复了在带有文本索引的列上,hasToken / hasTokenOrNull 处理仅包含分隔符的 needle (例如 '()'、'!!!') 时的问题:此前,索引会静默地跳过所有 granule,而不是抛出 BAD_ARGUMENTS (对 hasToken 而言) 或返回 NULL (对 hasTokenOrNull 而言) 。#102544 (Jimmy Aguilar Mena ) 。
修复 Keeper 中超大 multi 请求引发的 OOM。对于 OpenTelemetry 追踪,我们会在 ZooKeeperRequest 对象中无条件为 OpenTelemetry spans 分配 >1 KiB 的内存——这意味着,对于特别大的 multi 请求,我们会尝试额外分配 >10 GiB 的内存。为解决这一问题,我们现在将 shared data 保存在静态内存中,并在 ZooKeeperOpentelemetrySpans 中使用 std::unique_ptr 代替 std::optional。#102586 (Miсhael Stetsyuk ) 。
修复在现有集合上使用 CREATE NAMED COLLECTION IF NOT EXISTS 时导致 NamedCollection CurrentMetric 虚增,以及启动时从配置或 SQL 存储加载的集合未初始化的问题。关闭 #102507 。#102598 (Pablo Marcos ) 。
修复了在并发 DDL 导致本地分片返回空列时,getStructureOfRemoteTable 抛出的异常。 #102604 (Alexey Milovidov ).
修复了在 Shared 数据库上,多个并发执行的 CREATE TABLE IF NOT EXISTS 查询针对同一个 S3Queue 表时触发的 LOGICAL_ERROR 异常。#102610 (Nikita Taranov ) 。
修复原生 Parquet V3 读取器在使用 WHERE 过滤条件读取 Nullable 列时出现的 LOGICAL_ERROR 崩溃:“Unexpected number of rows in column subchunk”。 #102628 (Groene AI ).
修复 AzureWriteMicroseconds profile 事件描述中将 "write" 误写成 "read" 的问题。#102639 (Miсhael Stetsyuk ).
在某些特殊情况下,行级策略会触发 'Not found column in block' 异常的问题。 #102648 (Yarik Briukhovetskyi ).
修复了 ClusterDiscovery 中的一个服务器异常:当静态集群 (在配置中定义) 暂时没有可用节点时,会触发该异常。#102661 (Kseniia Sumarokova ).
修复了时区调整后发生溢出时,日期数据类型推断错误的问题。关闭 #102601 。#102674 (Pavel Kruglov ).
修复了以下问题:当可刷新materialized view 在等待过程中被删除时,SYSTEM WAIT VIEW 会一直挂起。#102681 (Nikolay Degterinsky ).
修复了 CASE 在使用 Dynamic expression 时对所有行都返回 ELSE 的问题。关闭了 #102511 。#102684 (Pavel Kruglov ) 。
修复了使用二进制编码的数据类型时,扁平化后的 Dynamic 类型的序列化问题。关闭 #101911 。#102692 (Pavel Kruglov ) 。
修复了 format_schema_source='query' 会静默忽略多行结果的问题。关闭 #101905 。#102698 (Pavel Kruglov ) 。
通过 SSH 客户端返回实际退出码,而不是将所有错误一律映射为 1。解决了 #101741 。#102700 (Konstantin Bogdanov ) 。
修复动态/预定义查询 handler 丢失 HTTP 请求头的问题。已关闭 #101846 。#102706 (Konstantin Bogdanov ) 。
对折叠后的 jemalloc 堆内存剖析应用泊松采样校正,使其与 jeprof 输出一致。此前,折叠格式因未考虑采样概率而低估了实际分配大小。#102759 (Antonio Andelic ).
修复了函数 hasPhrase 在参数为 NULL 时发生崩溃的问题。#102802 (Nikita Taranov ) 。
修复了在读取包含循环符号类型引用的递归 schema 的 Avro 文件时服务器崩溃 (SIGSEGV) 的问题。现在会检测并拒绝此类 schema,并返回清晰的错误消息,而不再导致崩溃。#102853 (Groene AI ).
修复了一个导致服务器崩溃 (LOGICAL_ERROR 断言) 的问题:在 FunctionVariantAdaptor 中进行结果转换时,如果 Variant 列上的函数达到内存限制或发生其他非类型转换异常,就会触发该问题。现在,此类异常会被正确传播,而不再被误判为内部错误。#102855 (Groene AI ) 。
修复在调试/sanitizer 构建中,schema inference 期间抛出 std::length_error 时导致的服务器崩溃问题 (例如,由极端的 input_format_msgpack_number_of_columns 值或格式错误的输入数据引起) 。#102859 (Groene AI ) 。
使复制列和稀疏列在序列化时的 null 表示遵循相关设置 (例如 format_tsv_null_representation) 。#102888 (Hechem Selmi ) 。
已在 #103499 中回移:修复了 S3 请求失败时未重试、反而报出 ios_base::clear: unspecified iostream_category error 的问题,原因是 Poco BufferedStreamBuf::flushBuffer 未处理来自套接字层的短写入。 #102894 (Sema Checherinda ).
修复以下问题:执行轻量级删除后,minmax_count_projection 和简单的 COUNT(*) 优化会被永久禁用,即使所有带有轻量级删除掩码的 parts 都已合并消失。 #102900 (Anton Popov ).
修复了因 LTO 导致的 jemalloc 随机崩溃问题。#102913 (Azat Khuzhin ) 。
在新分析器中,将行策略中的 OR 链优化为 IN。#102915 (Azat Khuzhin ) 。
修复了因 page cache 以错误的对齐方式释放内存而导致的 jemalloc 元数据损坏问题,此问题可能会引发崩溃。#102918 (Azat Khuzhin ) 。
不带 materialized views 的普通 INSERT 操作不再请求过多的 ConcurrencyControl 槽位和线程 (使用 max_threads 而不是 max_insert_threads) ,从而避免高 INSERT 处理量集群中出现 CC 槽位饥饿和线程数暴涨。#102961 (Sema Checherinda ).
重新引入 ArrowMemoryPool,以便在达到内存限制时抛出 MEMORY_LIMIT_EXCEEDED,从而避免内核 OOM。#102999 (Azat Khuzhin ) 。
修复了对 Nullable(DateTime) 执行 CAST 时会忽略 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 ).
修复在故障注入点没有线程处于暂停状态时调用 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 指令不可用时仍使用 SVE 指令进行检测的问题。#103568 (Raúl Marín ).
构建/测试/打包方面的改进
ClickHouse 26.3 LTS 发布,2026-03-26。演示文稿 、视频
不兼容变更
升级后再降级可能会导致数据丢失。将数据类型的序列化版本传递到嵌套数据类型中。例如,String 的序列化版本 with_size_stream 之前仅应用于顶层 String 列和 Tuple 元素。现在,它会应用于任何嵌套类型 (如 Array/Map/Variant/JSON/etc.) 中的任意 String 类型。这种行为由 MergeTree 设置 propagate_types_serialization_versions_to_nested_types 控制,且该设置现已默认启用。此修改后,新创建的数据分区片段无法被旧版本读取,但旧 parts 仍可在新版本中正常读取。升级是安全的,但降级则不安全——如果您在升级到 26.3 后需要回滚,则 26.3 在包含嵌套类型的列中写入的数据将无法读取! 详情请参见 #101429 。#94859 (Pavel Kruglov ).
移除 hypothesis 跳过索引类型。这是一项冷门的 Experimental 功能,实际用途有限。现在,使用 INDEX ... TYPE hypothesis 创建表会报错。#96874 (Alexey Milovidov ) 。
移除处于 Experimental 阶段的 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。您可以在多个层级启用或禁用异步插入:在用户 profile 配置中、在会话级别、查询级别,或在 MergeTree 表级别。#97590 (Sema Checherinda )。
将 mysql_datatypes_support_level 的默认值从空改为 decimal,datetime64,date2Date32,默认启用将 MySQL DATE 正确映射到 Date32、将 DECIMAL/NUMERIC 映射到 Decimal,以及将带精度的 DATETIME/TIMESTAMP 映射到 DateTime64。此前,MySQL DATE 列会被映射到 Date,而后者无法表示 1970-01-01 之前的日期,从而导致数据损坏。#97716 (Alexey Milovidov ).
由于正则表达式较慢,mergeTreeAnalyzeIndexes{,UUID} 现支持接受 part 名称数组,而不是 regexp (Experimental 功能 )。#98474 (Azat Khuzhin ).
将可执行用户定义函数的默认 stderr_reaction 从 throw 修改为 log_last。UDFs 在向 stderr 写入警告且退出代码为 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 ) 。
支持物化 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 ) 。
支持 Replicated 数据库使用辅助 ZooKeeper。#95590 (RinChanNOW ) 。
支持对 JSON 类型使用 has 函数来检查路径是否存在,类似于 Map。 #96927 (DQ ).
新增了 mergeTreeTextIndex(database, table, index) 表函数,可直接从文本索引中读取数据。该函数可用于内省,或基于文本索引数据执行聚合。 #97003 (Anton Popov ).
新增 table_readonly MergeTree 设置,可将表标记为只读,从而防止插入和修改。#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_*> 配置节,从而为各端口启用不同的 HTTP 路由规则。#98414 (Amos Bird ).
为 EXPLAIN 添加 pretty=1 设置以输出树状缩进格式,并添加 compact=1 以折叠 Expression 步骤,让查询计划更易读。#98500 (Kirill Kopnev )。
新增 restore_access_entities_with_current_grants 服务器设置。启用后,从备份中恢复的用户/角色,其授权会被限制在执行恢复操作的用户有权授予的范围内 (语义与 GRANT CURRENT GRANTS 相同) ,而不会因 ACCESS_DENIED 而失败。#98795 (pufit ).
新增 caseFoldUTF8 和 removeDiacriticsUTF8 函数,用于 Unicode 大小写折叠和去除变音符号。#98973 (George Larionov ).
新增 normalizeUTF8NFKCCasefold 字符串函数,用于执行 NFKC_Casefold Unicode 规范化,将 NFKC 规范化与大小写折叠结合起来。#99276 (George Larionov ) 。
为全文索引和 tokens 函数新增 asciiCJK 分词器。它按 Unicode 单词边界规则拆分文本:ASCII 单词可包含连接字符 (下划线、冒号、点号、单引号) ,而非 ASCII 的 Unicode 字符则会被拆分为单字符标记。#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 值末尾的空字节。#97558 (NeedmeFordev ) 。
支持在 FROM 子句中使用加括号的表连接表达式,例如 SELECT * FROM (t1 CROSS JOIN t2)。#97650 (Alexey Milovidov ) 。
实现函数 toDaysInMonth:返回指定日期所在月份的天数。#99227 (Vitaly Baranov )。
Experimental 功能
提升数据湖性能。在之前的版本中,从对象存储读取时,管道不会根据处理线程数自动调整大小。这在多核机器上可带来数量级的性能提升 (约 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,则所有受支持的查询都会使用并行副本,而不考虑任何统计信息。一个值得注意的例外是使用并行副本的分布式 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 连接的两侧进行互换。#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 查询在缓存的元数据比指定的陈旧阈值更新时使用缓存元数据,从而避免在请求处理过程中调用 Iceberg 目录。#96191 (Arsen Muk ) 。
S3Queue 有序模式使用 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 workload 也有帮助。它还可以减轻缺页压力,并在内存限制较紧时提高受影响查询的稳定性。#98892 (filimonov ).
提升有序合并的性能。#99013 (Artem Zuikov ) 。
优化了 INTERSECT ALL 和 EXCEPT ALL。#99097 (Raufs Dunamalijevs ) 。
支持在逆序读取中使用 read_in_order_use_virtual_row 优化。#99198 (Vladimir Cherkasov ) 。
通过在写入前检查 JoinUsedFlags 是否已设置,减少 RIGHT 和 FULL JOIN 中的缓存竞争。#99274 (Hechem Selmi ).
通过将浮点运算替换为纯整数运算,优化 PrefetchingHelper::calcPrefetchLookAhead,从而改进指令缓存布局,并减少聚合循环期间的周期开销。#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 连接转换为 INNER 连接的优化。关闭 #90978 。#95968 (Vladimir Cherkasov ) 。
通过在读取前正确计算大小,优化了子列读取。这减少了内存占用,并提升了子列读取速度。 #96251 (Pavel Kruglov ).
让 mark 缓存、未压缩缓存和页面缓存使用各自独立的 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 数据时在自动检测格式期间内存占用过高 (约 514 MiB) 的问题 (例如,从 url 或 file 读取且未显式指定格式的 JSON) ;原因是 ArrowStream 读取器将起始几个字节误判为超大的元数据长度。#98893 (Konstantin Bogdanov ).
错误修复(官方稳定版本中用户可见的异常行为)
构建/测试/打包改进
ClickHouse 发布 26.2,2026-02-26。 演示 , 视频
不兼容变更
默认情况下,所有插入都会开启去重。此前,异步插入和 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 设置的语义现在更加清晰。此前,如果未在配置中显式设置该参数,此功能可能会被自动启用。这一行为反复引发困惑,而且遗憾的是,还导致了生产环境中的一些问题。现在规则更简单了:do_not_merge_across_partitions_select_final=1 会无条件启用该功能。如果 do_not_merge_across_partitions_select_final=0,则仅在新设置 enable_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 会验证这些列名是否确实存在于远程 File 的 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 File (其中 Date 列使用 uint16) ,仍然支持读取。#96860 (Alexey Milovidov ) 。
新特性
用户现在可以直接在 ClickHouse 中使用 ClickStack (一款可观测性 UI) ,这对调试和本地开发很有帮助。#96597 (Aaron Knudtson ) 。
支持将基于时间的一次性密码 (TOTP) 作为身份验证方式。#71273 (Vladimir Cherkasov ) 。
添加 lazy_load_tables 数据库设置。启用后,表不会在数据库启动时加载——而是改为创建一个轻量级的 StorageTableProxy,并在首次访问时才实例化实际的表引擎。#96283 (xiaohuanlin ).
新增了 input_format_max_block_wait_ms 设置,以便在达到超时时间时输出数据块,并允许在 HTTP 连接意外关闭时继续处理剩余数据。#94509 (Mostafa Mohamed Salah ).
Google BigLake 目录集成。#95339 已关闭。#97104 (Konstantin Vedernikov ) 。
新增系统表 system.tokenizers,用于显示所有可用的 tokenizer。#96753 (Robert Schulze ) 。
新增系统表 system.user_defined_functions,用于监控 UDF 导入状态及配置。#90340 (Xu Jia ) 。
新增了 system.jemalloc_stats 表,通过 malloc_stats_print 暴露 jemalloc 内存分配器的统计信息,用于诊断使用 jemalloc 构建的服务器上的内存使用情况。还在 ClickHouse HTTP 接口中新增了 /jemalloc.html HTTP 端点,用于对这些统计信息进行交互式可视化。#97077 (Antonio Andelic ).
新增 system.jemalloc_profile_text 表,用于读取和分析 jemalloc 堆 profile。输出格式由 jemalloc_profile_text_output_format 设置控制 (raw、symbolized 或 collapsed;默认值为 collapsed) 。内联帧解析由 jemalloc_profile_text_symbolize_with_inline 控制 (启用时会包含内联帧,但会降低符号化速度;禁用时会跳过内联帧,以加快输出) 。对于 collapsed 格式,jemalloc_profile_text_collapsed_use_count 控制栈是按存活分配 count (true) 还是按存活字节数 (false,默认值) 加权。这使得对 jemalloc 堆 profile 进行内存分析和火焰图可视化更加方便。修复了 #93248 。#97218 (Antonio Andelic ) 。
添加 default_dictionary_database 设置,使 ClickHouse 能够在指定的默认数据库中解析未带数据库限定符的外部字典引用。这简化了从 XML 定义的全局字典迁移到 SQL 定义的按数据库划分字典的过程,从而使现有的字典查询 (例如 dictGet('name', …)) 无需修改即可继续工作。#91412 (Dmitrii Plotnikov ) 。
支持为 DatabaseReplicated 配置辅助 ZooKeeper。#91683 (RinChanNOW ).
实现新的表函数 primes 和新的系统表 system.primes,其中包含按升序排列的质数。关闭 #90839 。#92776 (Nihal Z. Miaji ) 。
异步插入支持并行 quorum。已插入的数据会复制到 quorum 副本。如果发现重复项,查询会等待先前已插入的数据也完成复制。#93356 (Sema Checherinda ).
新增了 functions 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> 查询,可在不提交结果 part 的情况下模拟合并。这在测试场景中可能很有用:验证新版本中的合并正确性、确定性复现与合并相关的 bug,以及可靠地对合并性能进行基准测试。#96122 (Anton Popov ) 。
新增一项默认启用的检查,可通过设置 check_named_collection_dependencies 防止删除被表使用的命名集合。#96181 (Pablo Marcos ) 。
新增了 system.fail_points,用于检查服务器中现有的 failpoint 及其是否已启用。这将有助于实现测试自动化。#96762 (Pedro Ferreira ).
为 Glue 目录添加基于角色的访问控制。使用设置 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 ) 。
实验性功能
错误修复(官方稳定版本中用户可见的异常行为)
构建/测试/打包方面的改进
ClickHouse 26.1 版本,2026-01-29。演示 ,视频
不兼容变更
修复由于在 formatter 中错误替换别名而导致的格式不一致问题。修复了 #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 )。
回滚「Allow INSERT into simple ALIAS columns」(回滚 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 )。
对索引文件名进行转义以防止分区片段损坏。应用此更改后,ClickHouse 将无法加载由先前版本创建且名称中包含非 ASCII 字符的索引。要处理这种情况,可以使用 MergeTree SETTING 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 表中定义的键列以及要获取的属性列拥有 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,这对于此类权限检查来说是不正确的权限授予。#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 )。
引入了一种新的语法和框架,用于简化并扩展 PROJECTION 索引功能。该变更是对 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 以禁用基于主键的 granule 剪枝。#93319 (Nihal Z. Miaji )。
添加 icebergLocalCluster 表函数。#93323 (Anton Ivashkin ).
新增了 cosineDistanceTransposed 函数,用于近似计算两点之间的余弦距离 。#93621 (Raufs Dunamalijevs )。
在 system.parts 表中新增 files 列,用于显示每个数据分区片段包含的文件数量。 #94337 (Match ).
为并发控制添加了一个 max-min 公平调度器。在严重 oversubscription 场景下(即大量查询争夺有限的 CPU 槽位时),可以提供更好的公平性。短时运行的查询不会因为那些长时间运行并随时间占用更多槽位的查询而受到惩罚。通过将 concurrent_threads_scheduler 服务器 SETTING 的值设置为 max_min_fair 来启用。#94732 (Sergei Trifonov )。
新增了允许 ClickHouse 客户端在连接服务器时覆盖 TLS SNI 的功能。 #89761 (Matt Klein ).
在 joinGet 函数调用中支持使用临时表。#92973 (Eduard Karacharov )。
支持 DeltaLake 表引擎中的删除向量。 #93852 (Kseniia Sumarokova ).
为 deltaLakeCluster 添加对删除向量的支持。 #94365 (Kseniia Sumarokova ).
为数据湖增加对 Google Cloud Storage 的支持。 #93866 (Konstantin Vedernikov ).
实验特性
Setting use_skip_indexes_on_data_read is now enabled by default. This setting allows filtering in a streaming fashion, at the same time as reading, improving query performance and startup time. #93407 (Shankar Iyer ).
提升在 LowCardinality 列上执行 DISTINCT 时的性能。关闭 #5917 。#91639 (Nihal Z. Miaji )。
优化 distinctJSONPaths 聚合函数,使其仅从分区片段中读取 JSON 路径,而无需扫描整个 JSON 列。#92196 (Pavel Kruglov )。
将更多过滤条件下推到 JOIN 操作中。#85556 (Nikita Taranov ).
在过滤条件仅使用一侧输入时,支持更多从 JOIN 的 ON 条件下推过滤的场景。支持 ANY、SEMI、ANTI JOIN。#92584 (Dmitry Novik )。
允许使用等价 Set 将过滤条件下推到 SEMI JOIN。Closes #85239 。#92837 (Dmitry Novik )。
当哈希 JOIN 的右侧为空时,跳过读取左侧。此前会一直读取左侧直到遇到第一个非空数据块,在存在大量过滤或聚合时可能会做大量无用工作。#94062 (Alexander Gololobov ).
在查询管线内部使用 "fastrange"(Daniel Lemire)方法对数据进行分区。这可以提升并行排序和 JOIN 的性能。#93080 (Alexey Milovidov )。
在 PARTITION BY 子句与排序键完全匹配或为其前缀时,提高窗口函数的性能。#87299 (Nikita Taranov )。
将外层过滤条件下推到视图中,从而可以在本地和远程节点上应用 PREWHERE。解决了 #88189 问题。#88316 (Igor Nikonov )。
Implement JIT compilations for more functions. Closes #73509 . #88770 (Alexey Milovidov with Taiyang Li ).
如果在 FINAL 查询中使用的跳过索引位于主键中的某个列上,那么在其他分区片段中检查主键交集的额外步骤就是多余的,因此现在不会再执行。Resolves #85897 。#93899 (Shankar Iyer )。
Optimize performance and memory usage for fractional LIMIT and OFFSET. #91167 (Ahmed Gouda ).
修复在 Parquet Reader V3 预取器中使用更快随机读取逻辑的问题。Closes #90890 。#91435 (Arsen Muk )。
提升 icebergCluster 的性能。关闭 #91462 。#91537 (Yang Jiang )。
不要在常量过滤条件上使用虚拟列进行过滤。 #91588 (c-end ).
通过启用自适应写缓冲区 (adaptive write buffers),在针对超宽表使用宽分区片段时降低 INSERT/合并操作的内存占用。为加密磁盘新增对自适应写缓冲区的支持。#92250 (Azat Khuzhin ).
Improved performance of full text search with text index and sparseGrams tokenizer by reducing the number of searched tokens in the index. #93078 (Anton Popov ).
Function 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 )。
Reduce overhead of join runtime filters by disabling them in the following cases: - too many bits are set in the bloom filter - too few rows are filtered out at runtime. #91578 (Alexander Gololobov ).
Use an in-memory buffer for correlated subqueries input to avoid evaluating it multiple times. Part of #79890 . #91205 (Dmitry Novik ).
允许所有副本在并行副本读取时抢占孤立区间。这可以改善负载均衡并减少长尾延迟。#91374 (zoomxi )。
外部聚合/排序/JOIN 现在在所有场景下都会遵循查询设置 temporary_files_codec。修复了 Grace 哈希 JOIN 中缺失 profile 事件的问题。#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 )。
Reduce memory usage on non-Linux systems (enable immediate purging of jemalloc dirty pages). #93360 (Eduard Karacharov ).
当脏页大小与 max_server_memory_usage 的比值超过 memory_worker_purge_dirty_pages_threshold_ratio 时,强制清理 jemalloc arena。#93500 (Eduard Karacharov )。
降低 AST(抽象语法树)的内存占用。#93601 (Nikolai Kochetov )。
In some cases we've seen ClickHouse doesn't respect a memory limit when reading from a table. This behaviour is fixed. #93715 (Nikita Mikhaylov ).
默认启用 Keeper 的 CHECK_STAT 和 TRY_REMOVE 扩展。#93886 (Mikhail Artemenko )。
Parse lower and upper bounds of file names corresponding to position deletes from Iceberg manifest file entries for better selection of corresponding data files. #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 数据时创建的动态子列数量,从而可以在插入时指定该上限。#94184 (Pavel Kruglov ).
在部分场景下对 JSON 列的压缩合并进行了小幅优化。#94247 (Pavel Kruglov )。
根据生产环境经验减小线程池队列大小。在从 MergeTree 读取任何数据之前,添加一次显式的内存使用量检查。#94692 (Nikita Mikhaylov )。
确保在 CPU 资源饥饿时,调度器会优先调度 MemoryWorker 线程,因为它可以保护 ClickHouse 进程免受致命威胁。#94864 (Nikita Mikhaylov )。
在与 MemoryWorker 主线程不同的线程中执行 jemalloc 脏页清理。如果清理较慢,可能会延迟 RSS 使用量的更新,从而导致进程因内存不足而被杀死。引入新的配置项 memory_worker_purge_total_memory_threshold_ratio,用于根据总内存使用量的比例启动脏页清理。#94902 (Antonio Andelic )。
system.blob_storage_log 现已可用于 Azure Blob Storage。#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 客户端现在可以像之前一样回退为使用 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 )。
防止在 HeadObject、UploadPart 和 CompleteMultipartUpload S3 请求中继续传递 x-amz-server-side-encryption 头部,因为这些请求不支持该头部。#64577 (Francisco J. Jurado Moreno )。
在 S3Queue 中跟踪有序模式下的 Hive 分区。修复了 #71161 。#81040 (Anton Ivashkin )。
优化文件系统缓存中的空间预留。FileCache::collectCandidatesForEviction 将在不持有独占锁的情况下执行。#82764 (Kseniia Sumarokova )。
支持服务器日志的复合轮转策略(大小 + 时间)。 #87620 (Jianmei Zhang ).
CLI 客户端现在可以指定 <warnings>false</warnings> 以替代命令行参数 --no-warnings。 #87783 (Larry Snizek ).
为 avg 聚合函数添加对 Date、DateTime 和 Time 类型参数的支持。修复了 #82267 中的问题。#87845 (Yarik Briukhovetskyi )。
优化项 use_join_disjunctions_push_down 默认启用。#89313 (Alexey Milovidov )。
在关联子查询中支持更多表引擎和数据源类型。关闭 Issue #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 表函数指定 storage_class_name 设置。#91926 (János Benjamin Antal )。
支持通过 system.zookeeper 插入辅助 ZooKeeper。 #92092 (RinChanNOW ).
为 Keeper 添加新指标:KeeperChangelogWrittenBytes、KeeperChangelogFileSyncMicroseconds、KeeperSnapshotWrittenBytes 和 KeeperSnapshotFileSyncMicroseconds profile events,以及 KeeperBatchSizeElements 和 KeeperBatchSizeBytes 直方图指标。#92149 (Miсhael Stetsyuk )。
新增一个设置项 trace_profile_events_list,将使用 trace_profile_event 的跟踪限制为指定的事件名称列表。这使得在大规模工作负载下可以进行更精确的数据采集。#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 动态表的列描述传递给字典数据源。#92391 (MikhailBurdukov )。
在 #63985 中,我们实现了可以按端口粒度指定 TLS 配置所需的全部参数(参见 composable protocols ),从而不再需要依赖全局 TLS 配置。然而,该实现仍然隐式要求存在一个全局的 openSSL.server 配置段,这与需要为不同端口使用不同 TLS 配置的场景相冲突。例如,在 keeper-in-server 部署中,我们需要分别为 keeper 之间的通信和 ClickHouse 客户端连接配置独立的 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 读取器中添加对空元组的支持。 #92868 (Michael Kolupaev ).
当 Azure Blob Storage 的原生复制因 BadRequest(例如 block 列表无效)失败时,回退到读写复制方式。之前仅在将 blob 复制到不同存储帐户时出现 Unauthorized 错误才会进行此回退。但我们有时也会遇到 “The specified block list is invalid” 错误。因此现在更新了条件,对所有原生复制失败的情况都回退到读写模式。#92888 (Smita Kulkarni )。
修复在使用 EC2 实例角色凭证运行大量并发 S3 查询时对 EC2 元数据端点访问被限流的问题。之前,每个查询都会创建自己的 AWSInstanceProfileCredentialsProvider,导致对 EC2 元数据服务发起并发请求,从而可能引发超时和 HTTP response code: 403 错误。现在,凭证提供程序会被缓存,并在所有查询之间共享。#92891 (Sav )。
重构 insert_select_deduplicate 设置,以支持保留向后兼容性。 #92951 (Sema Checherinda ).
将耗时超过平均水平的后台任务记录到日志中(background_schedule_pool_log.duration_threshold_milliseconds=30),以避免产生过多的任务日志。#92965 (Azat Khuzhin )。
在之前的版本中,一些 C++ 函数名在 system.trace_log 和 system.symbols 中显示不正确(被“mangled”),并且 demangle 函数无法正确处理它们。解决了 #93074 。#93075 (Alexey Milovidov )。
引入了名为 backup_data_from_refreshable_materialized_view_targets 的备份设置,用于在执行备份时跳过可刷新 materialized view。使用 APPEND 刷新策略的 RMV 始终会被备份。#93076 (Julia Kartseva ). #93658 (Julia Kartseva )
Use minimal debug info instead of no debug info for heavy translation units, such as functions. #93079 (Alexey Milovidov ).
通过为 MinIO 特定错误实现错误码映射,为 AWS S3 C++ SDK 添加了对 MinIO 的兼容性支持。此更改使 ClickHouse 在使用 MinIO 部署替代 AWS S3 时,能够正确处理并重试来自 MinIO 服务器的错误,从而提升在自托管 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 的用户体验:对函数名使用字符串字面量,为所有匹配的函数应用补丁,并允许在 REMOVE 中使用 function_name。 #93345 (Pablo Marcos )。
新增一个名为 materialize_statistics_on_merge 的设置,用于启用或禁用在合并过程中物化统计信息。默认值为 1。 #93379 (Han Fei ).
ClickHouse 现在可以解析 DESCRIBE SELECT 查询中不带括号的 SELECT。关闭了 #58382 。#93429 (Yarik Briukhovetskyi )。
Add randomization of cache correctness checks under probability. #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 秒内无法获取到锁。此时返回 timeout 比返回 logical error 更合适。#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 有序模式下支持更通用的分区方式。#94321 (Bharat Nallan )。
为设置 allow_statistics_optimize 新增别名 use_statistics。这与现有设置 use_primary_key 和 use_skip_indexes 更加一致。#94366 (Robert Schulze )。
在从 Numbers 转换为 Enums 时启用了 input_format_numbers_enum_on_conversion_error SETTING,以检查元素是否存在。#94384 (Elmi Ahmadov )。
在 S3(Azure)Queue 的有序模式下,通过跟踪限制来清理失败节点(此前该操作仅在无序模式下同时对失败和已处理节点执行,因此现在也会在有序模式下执行,但只针对失败节点)。 #94412 (Kseniia Sumarokova ).
在 clickhouse-local 中为 default 用户启用访问管理功能。clickhouse-local 中的默认用户缺少 access_management 权限,这会导致诸如 DROP ROW POLICY IF EXISTS 之类的操作因 ACCESS_DENIED 错误而失败,即使该用户本应不受限制。#94501 (Alexey Milovidov )。
为 YTsaurus 字典和表启用命名集合。#94582 (MikhailBurdukov )。
为 S3 和 Azure Blob Storage 的 BACKUP/RESTORE 添加对通过 SQL 定义的命名集合的支持。关闭 #94604 。#94605 (Pablo Marcos )。
在有序模式下,为 S3Queue 提供基于分区键的分桶支持。#94698 (Bharat Nallan )。
新增一个异步指标,用于记录耗时最长的合并操作的已用时间。 #94825 (Raúl Marín ).
在使用 IcebergBitmapPositionDeleteTransform 执行 position delete 操作之前,增加所属文件的检查。 #94897 (Yang Jiang ).
现在 view_duration_ms 显示的是该分组处于活跃状态的持续时间,而不再是其中各线程持续时间的总和。#94966 (Sema Checherinda )。
移除了 hasAnyTokens 和 hasAllTokens 函数中搜索 token 数量上限为 64 的限制。示例:SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]); 此前该查询会因为包含 65 个搜索 token 而抛出 BAD_ARGUMENTS 错误。通过此 PR,该限制已被完全移除,相同查询将不再报错。#95152 (Elmi Ahmadov ).
添加名为 input_format_numbers_enum_on_conversion_error 的 SETTING,用于在将 Numbers 转换为 Enums 时检查元素是否存在。Closes: #56144 。#56240 (Nikolay Degterinsky )。
Share format parser resources between data file and position delete file reading in Iceberg tables to reduce memory allocations. #94701 (Yang Jiang ).
错误修复(官方稳定版本中用户可见的异常行为)
修复了一个问题:预定义查询处理程序在插入数据时会将末尾的空白字符误解释为数据。#83604 (Fabian Ponce )。
修复在 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 ).
如果文件系统不区分大小写,则在 MergeTree 中始终将文件名替换为哈希值。此前在使用不区分大小写文件系统(如 macOS)的系统上,当多个列/子列名仅在大小写上不同时,可能会导致数据损坏。 #86559 (Pavel Kruglov )。
在创建 materialized view 时,对其中的底层查询执行完整的权限检查。#89180 (pufit )。
修复了在常量参数上调用 icebergHash 函数时发生的崩溃。#90335 (Michael Kolupaev ).
修复了这样一个逻辑错误:在没有事务的情况下执行 mutation 时,会修改处于活动事务中的分区片段,而该活动事务最终会被回滚。 #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 does not support transaction'。 #91772 (Shaohua Wang )。
修复在 LEFT ANTI JOIN 带有额外后置条件时运行时过滤器行为异常的问题。#91824 (Alexander Gololobov )。
修复了一个错误,该错误出现在对 Nothing 类型进行空值安全比较时。关闭了 #91834 。关闭了 #84870 。关闭了 #91821 。#91884 (Yarik Briukhovetskyi )。
修复原生 Parquet 读取器中 DELTA_BYTE_ARRAY 解码缺陷,影响对高度重复字符串数据的处理。#91929 (Daniel Muino )。
在使用 globs 进行 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 且启用了 join_use_nulls 的查询中的逻辑错误。#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 )。
相关问题 #https://github.com/ClickHouse/support-escalation/issues/6365。[#92339 ](https://github.com/ClickHouse/ClickHouse/pull/92339)([Tuan Pham Anh](https://github.com/tuanpach))。
修复 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 中执行变更操作(mutation)时继承源 part 的序列化信息设置。这样可以在更改数据类型序列化方式后,修复对已变更 part 执行查询时可能出现的查询结果不正确的问题。#92419 (Pavel Kruglov )。
修复具有相同名称的列和子列之间可能发生的冲突,该冲突可能会导致采用错误的序列化方式,从而引发查询失败。修复 #90219 。修复 #85161 。#92453 (Pavel Kruglov )。
修复由于在将外连接转换为内连接时对查询计划进行非预期修改而导致的 LOGICAL_ERROR。同时放宽该优化的条件,使其也能应用于在 JOIN 过程中对聚合键应用单射函数的情况。#92503 (János Benjamin Antal ).
修复在对空元组列进行排序时可能出现的 SIZES_OF_COLUMNS_DOESNT_MATCH 错误。关闭 #92422 。#92520 (Pavel Kruglov )。
检查 JSON 类型中的不兼容类型化路径。修复 #91577 。#92539 (Pavel Kruglov )。
修复在 Backup 数据库上执行 SHOW CREATE DATABASE 时出现的死锁问题。#92541 (Azat Khuzhin ).
在验证假设索引时使用正确的错误代码。 #92559 (Raúl Marín ).
修复分析器中列别名的动态子列解析问题。此前,列别名中的动态子列会被包装为 getSubcolumn 调用,在某些情况下可能根本无法解析。关闭 #91434 。#92583 (Pavel Kruglov )。
防止在 tokens() 的第二个参数为 NULL 时发生崩溃。#92586 (Raúl Marín )。
修复由于对底层 const PREWHERE 列进行就地修改可能导致的潜在崩溃问题。该问题可能在列收缩(IColumn::shrinkToFit)或过滤(IColumn::filter)时触发,这些操作可能会被多个线程并发执行。#92588 (Arsen Muk ).
当前已暂时禁用在包含大型分区片段(超过 4,294,967,295 行)的表上创建和物化文本索引。此限制是为防止出现不正确的查询结果,因为当前的索引实现尚不支持如此大的分区片段。#92644 (Anton Popov )。
修复在执行 JOIN 时出现的逻辑错误 Too large size (A) passed to allocator。关闭 #92043 。#92667 (Yarik Briukhovetskyi )。
修复了一个错误:当 ngrambf_v1 索引的 ngram 长度(第一个参数)大于 8 时会抛出异常的问题。#92672 (Robert Schulze )。
修复在使用 ZooKeeper 存储时后台重新加载命名集合时出现的未捕获异常。修复 https://github.com/ClickHouse/clickhouse-private/issues/44180。 #92717 (Kseniia Sumarokova ).
修正了通配符授权的访问权限检查中不正确的逻辑。之前的尝试 https://github.com/ClickHouse/ClickHouse/pull/90928 虽然修复了一个严重漏洞,但最终限制过于严格,导致某些带通配符的 GRANT 语句因无关的撤销操作而失败。#92725 (pufit )。
修复在 WHERE 子句中使用 not match(...) 时的数据跳过逻辑错误,该错误会导致结果错误。修复 #92492 。#92726 (Nihal Z. Miaji )。
如果在只读磁盘上创建了 MergeTree 表,则在启动时不要尝试删除临时目录。#92748 (Alexey Milovidov )。
修复在 ALTER TABLE REWRITE PARTS (v2) 中出现的 "Cannot add action to empty ExpressionActionsChain" 错误。 #92754 (Azat Khuzhin ).
避免因为从已断开的 Connection 读取而导致的崩溃。#92807 (Raufs Dunamalijevs )。
修复在 Ordered 模式下存储引擎 S3Queue 中出现的逻辑错误 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 的稀疏列进行 mutation 后可能出现的错误 FILE_DOESNT_EXIST。修复 #92633 。#92860 (Pavel Kruglov )。
修复旧版 Parquet 读取器(默认不启用)在 JSON 列位于 Tuple 列之后时的 Parquet schema 推断问题。修复旧版 Parquet 读取器(默认不启用)在处理空元组时失败的问题。#92867 (Michael Kolupaev )。
修复在常量条件下并开启 join_use_nulls 时执行多个 JOIN 的逻辑错误,关闭 #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(...) 时的数据跳过逻辑错误,该错误会导致结果不正确。关闭 #88536 。#93017 (Nihal Z. Miaji )。
修复由于共享分区片段上的 TOCTOU 竞态条件,可能会误用已过期分区片段的问题。#93022 (Azat Khuzhin )。
修复在反序列化格式错误且包含越界偏移的 groupConcat 聚合状态时发生的崩溃。#93028 (Raufs Dunamalijevs )。
修复在提前取消分布式查询后导致连接处于损坏状态的问题。 #93029 (Azat Khuzhin ).
修复了在右侧 join 键为稀疏列时的 join 结果问题。这解决了 #92920 。我只能在 set compatibility='23.3' 时重现该 bug。不确定是否需要进行回溯(backport)。#93038 (Amos Bird )。
修复在 estimateCompressionRatio() 中可能出现的 Cannot finalize buffer after cancellation 错误。修复: #87380 。 #93068 (Azat Khuzhin )。
修复了基于复杂表达式(例如 concat(col1, col2))构建的文本索引在合并时的问题。#93073 (Anton Popov )。
修复在过滤条件包含子列时应用 PROJECTION 的问题。解决 #92882 。#93141 (Pavel Kruglov )。
修复在将 join 运行时过滤器添加到查询计划时,在某些情况下被触发的逻辑错误。该问题是由于从 join 的一侧错误地返回了重复的常量列而导致的。 #93144 (Alexander Gololobov ).
由 join 运行时过滤器使用的特殊函数 __applyFilter 在某些本应合法的情况下错误地返回错误码 ILLEGAL_TYPE_OF_ARGUMENT。 #93187 (Alexander Gololobov )。
防止在插值列实际上是同一列的别名时,不同的插值列在同一数据块中被折叠到同一列上。#93197 (Yakov Olkhovskiy )。
在与已填充的右侧表进行 JOIN 时,不要添加运行时过滤器。#93211 (Alexander Gololobov )。
修复 Keeper 在会话终止后未清理持久化 watch 的问题。此更改关闭了 #92480 。#93213 (Konstantin Vedernikov )。
修复 Iceberg 中按元组进行 ORDER BY 时的问题。由此关闭 #92977 。#93225 (Konstantin Vedernikov )。
修复 S3Queue 中 s3queue_migrate_old_metadata_to_buckets 设置的 bug。关闭 #93392 、#93196 、#81739 。#93232 (Kseniia Sumarokova )。
在合并过程中重建投影时移除未使用的列。这样可以减少内存使用并降低临时分区片段的数量。#93233 (Nikolai Kochetov )。
修复在存在标量关联子查询时,从子查询中删除未使用列的问题。在修复之前,如果某列仅在关联子查询中使用,则可能会被删除,从而导致查询以 NOT_FOUND_COLUMN_IN_BLOCK 错误失败。 #93273 (Dmitry Novik ).
修复在对源表执行 ALTER 时,物化视图中可能出现的子列缺失问题。关闭 #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 ).
当使用非 const 分词器参数(第 2、3、4 个参数)调用函数 tokens 时,例如 SELECT tokens(NULL, 1, materialize(1)),服务器不再崩溃。#93383 (Robert Schulze )。
修复了 groupConcat 状态反序列化中的整数溢出漏洞,该漏洞可能在处理精心构造的聚合状态时导致内存安全问题。 #93426 (Raufs Dunamalijevs ).
修复了在数组列上进行文本索引分析时,如果索引中不包含任何 token(所有数组为空或所有 token 都被分词器跳过)时的处理逻辑。 #93457 (Anton Popov ).
如果连接字符串中已包含用户名/密码,则在 ClickHouse Client 中不再使用 OAuth 登录。#93459 (Krishna Mannem )。
修复 DataLakeCatalog 中对 Azure ADLS Gen2 下发凭据的支持:从 Iceberg REST 目录中解析 adls.sas-token.* 键,并修正 ABFSS URL 解析。#93477 (Karun Anantharaman )。
修复在使用分析器时对 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 )。
修复一个 bug:使用 SSH 连接时,clickhouse-client 会要求输入两次密码。 #93547 (Isak Ellmer ).
确保在关闭时正确完成 ZooKeeper 的终止(修复在极少数情况下可能发生的关闭挂起问题)。 #93602 (Azat Khuzhin ).
修复在恢复 ReplicatedMergeTree 时,由去重竞态条件导致的 LOGICAL_ERROR。#93612 (Pablo Marcos )。
修复在某些输入格式中,直接反序列化到稀疏列时,用稀疏列执行生存时间 (TTL) 更新的方式。该修复解决了可能出现的逻辑错误 Unexpected type of result TTL column。 #93619 (Pavel Kruglov ).
修复 h3 索引函数在使用无效输入调用时偶发崩溃或卡死的问题。#93657 (Michael Kolupaev ).
对非 UTF-8 数据使用 ngram_bf 索引会导致未初始化内存读取,读取到的值可能被写入到生成的索引结构中。修复了 #92576 。#93663 (Alexey Milovidov )。
验证解压后的缓冲区大小是否符合预期。 #93690 (Raúl Marín ).
防止用户在未经过 SHOW COLUMNS 权限检查的情况下,使用 merge 表引擎从表中获取列列表。 #93695 (János Benjamin Antal ).
修复了针对子列创建的跳过索引在物化时的问题。 #93708 (Anton Popov ).
我们将各存储对象的共享指针保存在 QueryPipeline::resources::storage_holders 中,以确保在 PipelineExecutor 仍然存活时不会销毁 IStorage 对象。 #93746 (Miсhael Stetsyuk ).
修复在重启后 interserver 主机发生变化时附加 Replicated 数据库失败的问题。#93779 (Tuan Pham Anh )。
修复在启用缓存时会在 ReadBufferFromS3 中触发的断言 !read_until_position 问题。 #93809 (Kseniia Sumarokova ).
修复了在极少数情况下将空元组用于 Map 列时的逻辑错误。关闭了 #93784 。#93814 (Nihal Z. Miaji )。
修复了在合并期间重建投影时 _part_offset 出现损坏的问题,并通过避免对 _part_offset 列的不必要读取,以及在投影计算中跳过不需要的列来优化投影处理。此更改延续了在 #93233 中引入的优化。#93827 (Amos Bird )。
移除对 'Bad version' 的处理逻辑。#93843 (Anton Ivashkin ).
修复当键为有符号整数类型时,optimize_inverse_dictionary_lookup 在分布式查询中不生效的问题。修复 #93259 。#93848 (Nihal Z. Miaji )。
修复了在分布式 remote() 查询中 lag/lead 无法使用的问题。关闭 #90014 。#93858 (Nihal Z. Miaji )。
修复系统监控分发问题。 #93937 (Pablo Marcos ).
在 https://github.com/ClickHouse/ClickHouse/pull/89173 中,我们在通过内部管道由 TraceSender 发送的结构体中添加了一个额外字段。但是缓冲区大小并未更新(见这里 ),因此我们向缓冲区写入了超过 buffer_size 的数据,导致缓冲区被多次 flush。并且由于 TraceSender::send 是在不同线程中被调用的,不同线程的 flush 可能交错,从而破坏接收端(TraceCollector)所依赖的不变式。#93966 (Miсhael Stetsyuk )。
修复在使用 USING 子句进行连接操作时,存储引擎 Join 执行向超类型类型转换的问题。修复了 #91672 。修复了 #78572 。#94000 (Dmitry Novik )。
修复在 Merge 表上应用 join 运行时过滤器时未正确添加 FilterStep 的问题。#94021 (Alexander Gololobov )。
包含在多个列上使用谓词、带有 Bloom 过滤器跳过索引,并同时包含 OR 和 NOT 条件的 SELECT 查询,此前可能会返回不一致的结果。该问题现已修复。#94026 (Shankar Iyer ).
修复在存在依赖索引时对 CLEAR 列的处理问题。#94057 (Raúl Marín )。
修复 ReadWriteBufferFromHTTP 中 use-of-uninitialized-value(使用未初始化值)的问题。 #94058 (Alexey Milovidov ).
修复对 JSON 中类型化路径的错误检查。该检查在 https://github.com/ClickHouse/ClickHouse/pull/92842 中引入,可能会在启动现有表时导致错误。 #94070 (Pavel Kruglov ).
修复在存在 OUTER JOIN 时执行过滤分析时出现的崩溃。解决了 #90979 。#94080 (Dmitry Novik )。
修复在并行执行时(max_threads > 1,默认值)使用 UInt8 聚合键时 uniqTheta 的精度问题。#94095 (Azat Khuzhin ).
修复由于在 SCOPE_EXIT 中调用 socket.setBlocking(true) 时抛出异常而导致的崩溃。#94100 (Miсhael Stetsyuk )。
修复在 ReplicatedMergeTree 中,DROP PARTITION 删除由后续日志条目创建的分区片段时导致的数据丢失问题。 #94123 (Tuan Pham Anh )。
修复了 parquet reader v3 在处理跨页面边界的数组时的错误行为。比如,当读取由 Arrow 写出但未启用页面统计或页面索引的文件时会出现这种情况。仅影响 Array 数据类型的列。典型表现是大约每 1 MB 数据就会有一个数组被截断。在此修复之前,可以使用如下设置作为临时解决方案:input_format_parquet_use_native_reader_v3 = 0。#94125 (Michael Kolupaev )。
修复 ReplicatedMergeTree 在等待日志记录时产生过多 watch 的问题。#94133 (Azat Khuzhin )。
函数 arrayShuffle、arrayPartialShuffle 和 arrayRandomSample 用于将 const 列物化,以便不同的行得到不同的结果。#94134 (Joanna Hulboj ).
修复在 materialized view 中执行表函数时的数据竞争问题。#94171 (Alexey Milovidov )。
修复在 PostgreSQL 数据库引擎中因查询不正确而导致的 nullptr 解引用问题。关闭 #92887 。#94180 (Alexey Milovidov )。
修复了在可刷新materialized view 中使用包含多个子查询的 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 客户端在连接时的一个隐蔽 Bug,该问题会导致进程卡死或崩溃。 #94320 (Azat Khuzhin ).
修复“函数下推到子列”优化未真正应用于子列的问题。 #94323 (Pavel Kruglov ).
修复在启用 enable_lazy_columns_replication 的情况下,嵌套 RIGHT JOIN 中可能出现的不正确结果。该缺陷导致在被复制的列中,所有行错误地返回相同的值,而非各自不同的值。关闭 #93891 。#94339 (Vladimir Cherkasov )。
修复基于等价集的 SEMI JOIN 过滤下推。当参数类型发生变化时,不要下推该过滤条件。修复了 #93264 。#94340 (Dmitry Novik )。
修复 DeltaLake CDF 与 DataLake 数据库引擎中数据库的配合使用问题(Delta Lake 目录集成)。关闭 #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 ).
修复从紧凑分区片段读取稀疏偏移量时的问题。关闭 #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 时,代码在未检查索引是否被截断的情况下,仍按完整主键大小访问索引列,从而导致 use-after-free / 未初始化内存问题。修复了 #85596 。#94500 (Alexey Milovidov )。
修复在使用 GLOBAL IN 的子查询发送外部表时,当类型为 Nullable 时产生的类型不匹配错误。关闭 #94097 。#94511 (Alexey Milovidov )。
在之前的版本中,对同一表达式具有多个索引条件的查询可能会错误地抛出异常 Not found column。修复了 #60660 。#94515 (Alexey Milovidov )。
修复在运行时过滤器中对 Nullable JOIN 列的不正确处理。#94555 (Alexander Gololobov )。
在一个正在使用的 workload 内创建另一个 workload 时不再会导致崩溃。#94599 (Sergei Trifonov )。
修复在进行 ANY LEFT JOIN 优化时,对不存在的列计算 isNotNull 会导致的崩溃。#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 合并后保留固定索引粒度(use_const_adaptive_granularity)。#94725 (Azat Khuzhin )。
修复与标量子查询和表依赖相关的 mutation 错误。如果某个表在某列上存在依赖(索引或 PROJECTION),标量子查询可能在没有数据的情况下被求值并缓存,从而导致不正确的变更。#94731 (Raúl Marín ).
修复 AsynchronousMetrics 在出错时回退到 cpu_pressure 的逻辑。#94827 (Raúl Marín )。
在解引用指针之前,getURLHostRFC 函数缺少边界检查。当向 domainRFC 传递空字符串时,它会读取未初始化的内存,从而触发 MSan 错误。#94851 (Alexey Milovidov )。
修复加密磁盘变为只读的问题。#94852 (Azat Khuzhin ).
修复在旧分析器下对分布式表使用分数形式 LIMIT/OFFSET 时的逻辑错误。关闭 #94712 。#94999 (Ahmed Gouda )。
修复在默认启用 join 运行时过滤器时,在某些条件下发生的崩溃。#95000 (Alexander Gololobov )。
改进对表引擎 URL() 和表函数 url() 所使用 URL 中的密码的脱敏处理。#95006 (Vitaly Baranov )。
当 enable_extended_results_for_datetime_functions 启用时,toStartOfInterval FUNCTION 的行为现在与 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 等 SETTING 的问题。关闭 #91681 。#95040 (Nihal Z. Miaji )。
修复文件系统缓存中的数据竞态问题。#95064 (Alexey Milovidov )。
修复 Parquet 读取器中的一个罕见竞态条件。 #95068 (Alexey Milovidov ).
修复在 LIMIT 为零时 top K 优化中发生的崩溃。关闭 #93893 。#95072 (Alexey Milovidov )。
从 DateTime/整数转换为 Time64 会使用 toTime 提取一天中的时间部分,但该函数不是单调的。ToDateTimeMonotonicity 模板错误地将此转换标记为单调的,导致在调试构建中出现 "Invalid binary search result in MergeTreeSetIndex" 异常。#95125 (Alexey Milovidov )。
仅在必要时才重新生成清单文件中的条目列表(此前会在每次迭代时都重新生成)。 #95162 (Daniil Ivanik )。
构建 / 测试 / 打包改进