2022 更新日志
ClickHouse 22.12 版发布,2022-12-15
注意
此版本包含一个有缺陷的 systemd 服务注释,在某些 Linux 发行版上升级时可能会破坏 ClickHouse 的安装。该 systemd 服务会更改 /run/systemd 目录的属主,导致所有后续的 systemd 操作失败。建议跳过升级到此版本,直接升级到更高版本的 ClickHouse。
有关更多详细信息,请参阅 GitHub 上的此 issue: https://github.com/ClickHouse/ClickHouse/issues/48285
升级说明
- 修复了针对
String参数的min,max,any*,argMin,argMax聚合函数状态在(反)序列化方面的向后不兼容问题。该不兼容问题影响 22.9、22.10 和 22.11 分支(分别自 22.9.6、22.10.4 和 22.11.2 起修复)。22.3、22.7 和 22.8 分支的一些小版本也受影响:22.3.13...22.3.14(自 22.3.15 起修复)、22.8.6...22.8.9(自 22.8.10 起修复)、22.7.6 及更新版本(在 22.7 中不会修复,我们建议从 22.7.* 升级到 22.8.10 或更高版本)。如果用户从未使用过受影响的版本,则本发行说明与其无关。不兼容版本在读取上述聚合函数的状态时,会在字符串末尾追加一个额外的'\0'。例如,如果更早的版本将anyState('foobar')的状态保存到state_column,则不兼容版本在执行anyMerge(state_column)时会输出'foobar\0'。同时,不兼容版本在写入这些聚合函数的状态时不会写入末尾的'\0'。包含修复的更新版本在读取由所有版本(包括不兼容版本)写入的数据时都能正确处理,仅有一个极端边界情况例外:如果不兼容版本保存的状态中包含一个实际以空字符结尾的字符串,则更新版本在读取受影响聚合函数的状态时会截断尾部的'\0'。例如,如果不兼容版本将anyState('abrac\0dabra\0')的状态保存到state_column,则更新版本在执行anyMerge(state_column)时会输出'abrac\0dabra'。当不兼容版本在集群中与旧版本或新版本共同工作时,该问题同样会影响分布式查询。#43038(Alexander Tokmakov, Raúl Marín)。注意:所有官方 ClickHouse 构建版本已经包含此修复补丁。对于应当避免使用的非官方第三方构建,则不一定如此。
新功能
- 添加
BSONEachRow输入/输出格式。在这种格式下,ClickHouse 将每一行格式化/解析为单独的 BSON 文档,并将每一列格式化/解析为一个以列名为键的 BSON 字段。#42033 (mark-polokhov)。 - 新增
grace_hashJOIN 算法,可通过SET join_algorithm = 'grace_hash'启用。#38191 (BigRedEye, Vladimir C). - 允许在创建或修改用户时配置密码复杂度规则和校验。#43719(Nikolay Degterinsky)。
- 在日志中对敏感信息进行掩码处理;在
SHOW CREATE TABLE和SELECT FROM system.tables查询的输出中对敏感部分进行掩码处理。同时解决了 #41418。#43227(Vitaly Baranov)。 - 新增
GROUP BY ALL语法:#37631。#42265(刘陶峰)。 - 添加对
FROM table SELECT column语法的支持。#41095 (Nikolay Degterinsky). - 新增了函数
concatWithSeparator,并将concat_ws作为其别名,以提高对 Spark SQL 的兼容性。新增了函数concatWithSeparatorAssumeInjective作为变体,用于启用 GROUP BY 优化,其方式与concatAssumeInjective类似。#43749 (李扬)。 - 添加了用于固定精度 Decimal 运算的
multiplyDecimal和divideDecimal函数。 #42438 (Andrey Zvonov). - 添加了
system.moves表,用于列出当前正在移动的数据部分。 #42660 (Sergei Trifonov)。 - 为 ClickHouse Keeper 添加对内置 Prometheus 端点的支持。 #43087 (Antonio Andelic).
- 支持使用
_作为分隔符的数值字面量,例如1_000_000。#43925 (jh0x)。 - 为
cutURLParameter函数新增了将数组作为第二个参数的支持,从而可以删除多个参数。关闭 #6827。#43788(Roman Vasin)。 - 在
system.data_skipping_indices表中添加一个用于保存索引表达式的列。#43308 (Guillaume Tassery)。 - 向系统表
databases添加列engine_full,以便用户可以通过系统表访问数据库的完整引擎定义。 #43468 (凌涛). - 新增哈希函数 xxh3。同时,得益于库的更新,在 ARM 平台上
xxHash32和xxHash64的性能也得到了提升。#43411(Nikita Taranov)。 - 添加了对为 MergeTree 设置定义约束的支持。例如,你可以禁止用户修改
storage_policy。#43903(Sergei Trifonov)。 - 新增一个设置
input_format_json_read_objects_as_strings,允许在所有 JSON 输入格式中将嵌套 JSON 对象解析为字符串。该设置默认禁用。#44052 (Kruglov Pavel)。
实验性特性
- 支持异步插入的去重。在此变更之前,异步插入不支持去重,因为多个小的插入请求会被合并到同一个插入批次中。修复 #38075。#43304(Han Fei)。
- 为实验性的 Annoy(向量相似度搜索)索引添加余弦距离支持。#42778(Filatenkov Artur)。
- 新增
CREATE / ALTER / DROP NAMED COLLECTION查询。#43252(Kseniia Sumarokova)。该特性仍在开发中,截至 22.12 版本这些查询尚未生效。本变更日志条目仅为避免混淆而添加。将命名集合的默认访问权限限制为config中定义的用户。若要查看它们,需要设置show_named_collections = 1。#43325(Kseniia Sumarokova)。引入了system.named_collections表。#43147(Kseniia Sumarokova)。
性能改进
- 添加设置
max_streams_for_merge_tree_reading和allow_asynchronous_read_from_io_pool_for_merge_tree。设置max_streams_for_merge_tree_reading用于限制 MergeTree 表的读取流数量。设置allow_asynchronous_read_from_io_pool_for_merge_tree会启用一个后台 I/O 池来读取MergeTree表。如果与max_streams_to_max_threads_ratio或max_streams_for_merge_tree_reading一起使用,这可以提升 I/O 受限查询的性能。#43260(Nikolai Kochetov)。在高延迟存储、CPU 数量较少且数据分片数量较多的场景中,这可以将性能提升最多 100 倍。 - 设置
merge_tree_min_rows_for_concurrent_read_for_remote_filesystem/merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem之前未考虑自适应粒度。较“胖”的行不会减少读取的行数(而在merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read中已经进行了这样的处理),这在使用远程文件系统时可能导致高内存使用。#43965(Nikolai Kochetov)。 - 在选择要合并的数据分片时,优化了对 ZooKeeper 或 ClickHouse Keeper 的 list 请求数量。此前在某些情况下可能会产生成千上万次请求。修复 #43647。#43675(Alexander Tokmakov)。
- 如果
max_size_to_preallocate_for_aggregation的值过小,现在将跳过该优化。该设置的默认值已提升至10^8。#43945(Nikita Taranov)。 - 通过避免清理旧数据分片来加速服务器关闭,因为在 https://github.com/ClickHouse/ClickHouse/pull/41145 之后,这一步已不再必要。#43760(Sema Checherinda)。
- 当设置了
enable_memory_bound_merging_of_aggregation_results时,在发起端进行的合并现在会采用与本地聚合结果合并相同的内存受限方式。#40879(Nikita Taranov)。 - Keeper 改进:尝试在复制的同时并行地将日志同步到磁盘。#43450(Antonio Andelic)。
- Keeper 改进:更频繁地对请求进行批处理。批处理可以通过新设置
max_requests_quick_batch_size进行控制。#43686(Antonio Andelic)。
改进
- 在从备份恢复时,实现引用依赖,并利用其按正确顺序创建数据表。#43834 (Vitaly Baranov)。
- 在
CREATE查询中替换 UDF,以避免在启动加载阶段出现失败。此外,现在可以将 UDF 用作列的DEFAULT表达式。#43539(Antonio Andelic)。 - 更改以下查询删除数据分片的行为:TRUNCATE TABLE、ALTER TABLE DROP PART、ALTER TABLE DROP PARTITION。现在,这些查询会创建覆盖旧分片的空分片。这样可以使 TRUNCATE 查询在无需后续获取独占锁的情况下执行,也就意味着并发读不会被阻塞。同时,这些查询都实现了持久性:如果请求成功,则之后不会出现“复活”的分片。请注意,原子性仅能在事务作用域内得到保证。#41145(Sema Checherinda)。
SET param_x查询不再需要手动将参数值序列化为字符串。例如,以前需要写成SET param_a = '[\'a\', \'b\']'的查询,现在可以写成SET param_a = ['a', 'b']。#41874 (Nikolay Degterinsky)。- 在通过客户端的 STDIN 读取数据时,在进度指示中显示已读取的行数。修复 #43423。#43442(Kseniia Sumarokova)。
- 从 S3 表函数/引擎读取数据时显示进度条。#43454 (Kseniia Sumarokova).
- 进度条会显示读取和写入的行数。#43496(Ilya Yatsishin)。
filesystemAvailable及相关函数现在支持一个可选的磁盘名称参数,并将filesystemFree更名为filesystemUnreserved。修复 #35076。#42064(flynn)。- 与 LDAP 的集成:将
search_limit的默认值提升到 256,并新增 LDAP 服务器配置选项,可将其设置为任意值。修复问题:#42276。#42461(Vasily Nemkov)。 - 现在也支持从异常消息中移除敏感信息(参见配置文件中的
query_masking_rules)。修复了 #41418。#42940(filimonov)。 - 支持类似
SHOW FULL TABLES ...的查询以兼容 MySQL。#43910 (Filatenkov Artur). - Keeper 优化:新增 4lw 命令
rqld,用于手动将某个节点指定为 leader。#43026(JackyWoo)。 - 对 Distributed 表的异步 INSERT 应用查询中指定的连接超时设置。#43156 (Azat Khuzhin).
unhex函数现已支持FixedString类型参数。issue42369。#43207(DR)。- 根据 TTL 规则优先删除已完全过期的数据片段,参见 #42869。#43222(zhongyuankai)。
- 在 clickhouse-client 中提供更精确且响应更及时的 CPU 负载显示。#43307 (Sergei Trifonov)。
- 支持从
S3存储和表函数s3中以Parquet、Arrow和ORC格式读取嵌套类型的子列。#43329 (chen)。 - 向
system.parts表添加table_uuid列。 #43404 (Azat Khuzhin). - 为客户端新增选项,用于在非交互模式下显示本地处理的行数(
--print-num-processed-rows)。 #43407 (jh0x). - 在查询计划层实现
aggregation-in-order优化。该优化默认启用(但仅在与默认禁用的optimize_aggregation_in_order一起使用时才会生效)。要使用之前基于 AST 的版本,请将query_plan_aggregation_in_order设为 0。#43592(Nikolai Kochetov)。 - 允许在每次递增时,将
trace_type = 'ProfileEvent'的 profile 事件连同当前调用栈、profile 事件名称和递增的数值一起收集到system.trace_log中。可以通过设置trace_profile_events启用此功能,用于分析查询性能。#43639(Anton Popov)。 - 新增设置
input_format_max_binary_string_size,用于限制 RowBinary 格式中字符串的最大长度。#43842 (Kruglov Pavel)。 - 当 ClickHouse 向远程 HTTP 服务器发出请求且对方返回错误时,异常信息中未正确显示数字形式的 HTTP 状态码。修复该问题,关闭 #43919。#43920(Alexey Milovidov)。
- 即使在进行多个 JOIN 的优化时,也能正确报告查询中的错误。#43583 (Salvatore)。
构建/测试/打包改进
- Systemd 集成现在会正确通知 systemd,该服务已真正启动并已准备好处理请求。#43400 (Коренберг Марк)。
- 新增构建选项,可使用 OpenSSL FIPS Module 构建基于 OpenSSL 的 ClickHouse。此构建类型尚未进行安全性验证测试,且不受支持。#43991 (Boris Kuschel)。
- 升级到新的
DeflateQpl压缩编解码器,该编解码器已在之前的 PR 中实现(详细信息:https://github.com/ClickHouse/ClickHouse/pull/39494)。此补丁在以下方面改进了该编解码器:1. 将 QPL v0.2.0 升级到 QPL v0.3.0 Intel® Query Processing Library (QPL);2. 改进 CMake 文件,以修复 QPL v0.3.0 的构建问题;3. 在构建时将 QPL 库与 libaccel-config 链接,而不是像 QPL v0.2.0 那样在运行时加载(dlopen);4. 修复了 CompressionCodecDeflateQpl.cpp 中的日志打印问题。#44024 (jasperzhu)。
Bug 修复(官方 stable 或 prestable 版本中用户可见的异常行为)
- 修复了在使用异步插入时可能会导致死锁的缺陷。#43233 (Anton Popov)。
- 修复 AST 层级优化
optimize_normalize_count_variants中部分不正确的逻辑。 #43873 (Duc Canh Le). - 修复这样一种情况:当副本之间的校验和不匹配时(例如由于升级引起的数据格式变更),mutation 无法继续执行的问题。 #36877 (nvartolomei).
- 修复了
skip_unavailable_shards优化在与hdfsCluster表函数一起使用时不起作用的问题。#43236 (chen). - 修复 S3 对
?通配符的支持。解决 #42731。#43253(chen)。 - 修复函数
arrayFirstOrNull和arrayLastOrNull在数组包含Nullable元素时对 null 的处理问题。#43274(Duc Canh Le)。 - 修复与 Kafka 表相关的
UserTimeMicroseconds/SystemTimeMicroseconds统计不正确的问题。#42791(Azat Khuzhin)。 - 不要在
web磁盘中抑制异常。修复web磁盘的重试机制。#42800 (Azat Khuzhin). - 修复了 INSERT 与删除物化视图之间的(逻辑)竞态条件。当在执行 INSERT 的同时删除物化视图时,会发生竞态:在执行之初,这些物化视图作为该 INSERT 的依赖存在,但当插入链尝试访问它们时,相应的表已经被删除,从而产生
UNKNOWN_TABLE或TABLE_IS_DROPPED异常,并中止插入。此更改之后,如果依赖已经消失,我们会避免抛出这些异常,而是继续执行插入。#43161 (AlfVII)。 - 修复
quantiles函数中的未定义行为,该行为可能导致使用未初始化的内存。由模糊测试(fuzzer)发现。此更改关闭了 #44066。#44067(Alexey Milovidov)。 - 针对未压缩大小为零的情况,在
CompressionCodecDelta中增加了额外检查。 #43255 (Nikita Taranov)。 - 从 Parquet 中展平数组,以避免数组中数据不一致的问题。这些不正确的文件可能由 Apache Iceberg 生成。#43297 (Arthur Passos)。
- 修复在函数短路执行时,对
LowCardinality列进行错误类型转换的问题。 #43311 (Kruglov Pavel). - 修复了在使用
Merge引擎的表上,带有SAMPLE BY并启用 prewhere 优化的查询。#43315 (Antonio Andelic)。 - 检查并比较
MergeTreeData中format_version文件的内容,以便即使在存储策略发生变更的情况下也能加载表。#43328 (Antonio Andelic)。 - 修复在向
Buffer表执行 INSERT 时可能出现的(几乎不可能发生的)“No column to rollback” 逻辑错误。 #43336 (Azat Khuzhin). - 修复了一个缺陷:在启用
allow_function_parameters时,解析器会错误地将任意数量的圆括号解析到同一个函数中。#43350(Nikolay Degterinsky)。 MaterializeMySQL(实验性功能)支持 DDL:drop table t1, t2,并与 MySQL 中的大多数 DROP DDL 语句兼容。 #43366 (zzsmdfj)。session_log(实验功能):修复了在极少数设置配置文件紊乱的情况下,由于无法创建 session_log 条目而导致无法登录的问题。#42641(Vasily Nemkov)。- 修复了在
if/multiIf函数中可能出现的Cannot create non-empty column with type Nothing错误,关闭了 #43356。#43368(Kruglov Pavel)。 - 修复当行级过滤器使用列默认值时的错误。#43387(Alexander Gololobov)。
- 使用
DISTINCT+LIMIT BY+LIMIT的查询可能返回的行数少于预期。修复了 #43377。#43410(Igor Nikonov)。 - 修复针对
Nullable(Decimal(...))的sumMap。 #43414 (Azat Khuzhin). - 修复 macOS 上针对小时/分钟的
date_diff。关闭 #42742。#43466(zzsmdfj)。 - 修复因 merges/mutations 导致的内存核算错误。 #43516 (Azat Khuzhin).
- 修复了包含
toString(enum)条件的主键分析。#43596(Nikita Taranov)。此错误由 @tisonkun 发现。 - 在分区附加完成后,确保
clickhouse-copier在 Keeper 中更新状态和attach_is_done时保持一致性。#43602 (lzydmxy)。 - 在恢复丢失的
Replicated数据库副本(实验性功能)时,可能会出现需要以原子方式交换两个表名的情况(使用 EXCHANGE)。之前我们尝试使用两个 RENAME 查询,这显然行不通,而且还会导致整个数据库副本的恢复过程失败。#43628(Nikita Mikhaylov)。 - 修复
s3Cluster函数抛出NOT_FOUND_COLUMN_IN_BLOCK错误的问题。关闭 #43534。#43629(chen)。 - 修复在解析包含相同键名但嵌套层级不同的数组的 JSON 对象时可能出现的
Array sizes mismatched逻辑错误。修复了 #43569。#43693(Kruglov Pavel)。 - 修复了在分布式
GROUP BY中,当聚合键中包含ALIAS列时可能发生的异常。#43709 (Nikita Taranov)。 - 修复在启用并使用零拷贝复制(实验特性)时可能导致投影损坏的 Bug。 #43764 (alesapin).
- 修复在 AWS S3 中对超大对象使用分段上传的问题。#43824 (ianton-ru)。
- 修复了带有
ON CLUSTER的ALTER ... RESET SETTING语句之前可能只会应用到单个副本的问题。修复了 #43843。#43848(Elena Torró)。 - 修复在右侧使用
Join表引擎并使用USING子句时的 JOIN 逻辑错误。#43963(Vladimir C)。修复Join表引擎中键顺序不正确的问题。#44012(Vladimir C)。 - Keeper 修复:当 Raft 的 interserver 端口已被占用时抛出异常。 #43984 (Antonio Andelic).
- 修复在对子查询进行列裁剪时对基于位置的 ORDER BY 参数(例如
ORDER BY 1, 2)的处理问题。关闭 #43964。#43987(Kseniia Sumarokova)。 - 修复了当子查询包含 HAVING 但不包含任何聚合时出现的异常。#44051(Nikita Taranov)。
- 修复了 S3 分段上传中的竞态条件。该竞态条件可能会在从备份恢复时导致错误
Part number must be an integer between 1 and 10000, inclusive. (S3_ERROR)。#44065 (Vitaly Baranov)。
ClickHouse 发布 22.11,2022-11-17
向后不兼容的更改
JSONExtract系列函数现在会尝试强制转换为所请求的类型。#41502 (Márcio Martins)。
新功能
- 在与 ClickHouse Keeper 的会话丢失时,为向 ReplicatedMergeTree 插入数据的 INSERT 操作添加了重试支持。除了提高容错能力之外,此功能还旨在提供更好的用户体验——在 Keeper 重启(例如由于升级)时,避免在插入过程中向用户返回错误。#42607 (Igor Nikonov)。
- 新增
Hudi和DeltaLake只读表引擎,仅适用于 S3 上的表。#41054 (Daniil Rubin, Kseniia Sumarokova)。 - 新增表函数
hudi和deltaLake。#43080 (flynn)。 - 支持复合时间间隔。1. 现在可以对 Interval 执行加、减和取反运算。如果 Interval 的类型不同,它们将被转换为由这些类型组成的 Tuple。2. 可以将一个由多个 Interval 组成的 Tuple 加到或减去一个 Date/DateTime 字段。3. 新增对不同类型 Interval 的解析,例如:
INTERVAL '1 HOUR 1 MINUTE 1 SECOND'。#42195(Nikolay Degterinsky)。 - 新增对
**通配符的支持,用于递归遍历文件系统和 S3 的目录。修复 #36316。#42376(SmitaRKulkarni)。 - 为只写一次、多次读取的操作引入
s3_plain磁盘类型。为基于s3_plain磁盘的MergeTree表实现ATTACH操作。#42628 (Azat Khuzhin). - 为
system.query_log添加了已应用行级策略的信息。 #39819 (Vladimir Chebotaryov). - 在 ClickHouse Keeper 中新增了四字母命令
csnp,用于手动创建快照。另新增命令lgif,用于获取特定节点的 Raft 信息(例如最近一次创建的快照的索引、最近一次提交的日志索引)。 #41766 (JackyWoo). - 添加与 Apache Spark 中相同的
ascii函数:https://spark.apache.org/docs/latest/api/sql/#ascii。 #42670(李扬)。 - 添加函数
pmod,根据取模运算返回非负结果。 #42755 (李扬). - 新增函数
formatReadableDecimalSize。 #42774 (Alejandro). - 添加函数
randCanonical,类似于 Apache Spark 或 Impala 中的rand函数。该函数生成在区间 [0, 1) 上独立同分布的伪随机均匀数值。#43124(李扬)。 - 添加
displayName函数,关闭了 #36770。 #37681(hongbin)。 - 添加
min_age_to_force_merge_on_partition_only设置,以仅对整个分区的旧数据块进行优化。#42659 (Antonio Andelic)。 - 为任意结构的具名集合、访问类型以及
system.named_collections添加通用实现。#43147(Kseniia Sumarokova)。
性能改进
- 若条件是基于字符串前缀,
match函数可以利用索引。修复了 #37333。#42458(clarkcaoliu)。 - 在顺序组合时提升 AND 和 OR 运算符的性能。#42214(Zhiguo Zhou)。
- 为
LineAsString输入格式提供并行解析支持。仅略微提升性能。修复了 #42502。#42780(Kruglov Pavel)。 - ClickHouse Keeper 性能改进:在许多不同节点存在未提交状态的场景下提升提交性能。这应有助于解决 follower 节点无法足够快同步的情况。#42926(Antonio Andelic)。
- 像
NOT LIKE 'prefix%'这样的条件可以使用主索引。#42209(Duc Canh Le)。
实验特性
- 支持在其他类型中使用
Object类型,例如Array(JSON)。#36969(Anton Popov)。 - 对于 MaterializedMySQL,忽略 MySQL binlog 的 SAVEPOINT 事件。#42931(zzsmdfj)。在 MaterializedMySQL 中处理(忽略)SAVEPOINT 查询。#43086(Stig Bakken)。
改进
- 带有较小 LIMIT 的简单查询将能够正确预估需要读取的行数,从而能够正确执行阈值检查。关闭了 #7071。#42580(Han Fei)。
- 为 INSERT VALUES 查询添加对交互参数的支持。#43077(Nikolay Degterinsky)。
- 在
system.table_functions中新增字段allow_readonly,以支持在只读模式下使用表函数。修复了 #42414 实现:* 在系统表 system.table_functions 中新增字段 allow_readonly。* 更新代码以使用新字段 allow_readonly,从而允许在只读模式下使用表函数。测试:* 为文件系统添加了测试用例 tests/queries/0_stateless/02473_functions_in_readonly_mode.sh 文档:* 更新了 Table Functions 的英文文档。#42708 (SmitaRKulkarni)。 system.asynchronous_metrics增加了内嵌文档说明。这些说明也会导出到 Prometheus。修复了cache磁盘相关指标的错误——之前只统计了某个任意的缓存磁盘,而没有统计所有缓存磁盘。此更改关闭了 #7644。#43194(Alexey Milovidov)。- 限流算法已更换为令牌桶算法。 #42665 (Sergei Trifonov).
- 在
system.query_log、/var/log/clickhouse-server/*.log以及错误消息中对密码和密钥进行脱敏处理。 #42484 (Vitaly Baranov). - 对拉取到的 part 删除其所覆盖的 parts(以避免可能出现的复制延迟增加)。 #39737 (Azat Khuzhin).
- 如果
/dev/tty可用,clickhouse-client 和 clickhouse-local 会直接在终端中渲染进度,而不会写入 STDERR。这样即使 STDERR 被重定向到文件,也可以获取进度信息,并且该文件不会被终端转义序列污染。可以通过--progress false禁用进度显示。此更改解决了 #32238。#42003(Alexey Milovidov)。 - 为 base64 编码函数增加对
FixedString输入的支持。#42285 (ltrk2). - 为
system.detached_parts新增bytes_on_disk和path列。修复 #42264。#42303(chen)。 - 改进了在表函数中使用插入表结构的机制,现在
use_structure_from_insertion_table_in_table_functions设置新增了一个取值2,表示 ClickHouse 将自动尝试判断是否可以使用插入表的结构。修复了 #40028。#42320(Kruglov Pavel)。 - 修复
INSERT FROM INFILE无进度显示的问题。关闭 #42548。#42634(chen)。 - 重构函数
tokens,以支持为相关函数设置返回的最大 token 数量(默认禁用)。#42673(李扬)。 - 支持在
formatDateTime和FROM_UNIXTIME函数中使用Date32参数。#42737 (Roman Vasin)。 - 将 tzdata 更新到 2022f。墨西哥将不再实行夏令时,靠近美国边境的地区除外:https://www.timeanddate.com/news/time/mexico-abolishes-dst-2022.html。奇瓦瓦州自 2022-10-30 起改为全年使用 UTC-6。斐济不再实行夏令时。参见 https://github.com/google/cctz/pull/235 和 https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1995209。#42796(Alexey Milovidov)。
- 为异步插入添加
FailedAsyncInsertQuery事件指标。#42814 (Krzysztof Góralski)。 - 在查询计划层实现
read-in-order优化。该优化默认启用。将query_plan_read_in_order设为 0 以使用之前基于 AST 的版本。#42829(Nikolai Kochetov)。 - 以指数方式增大备份到 S3 时的上传分块大小,以避免触发 S3 分块上传最多 10 000 个分块数量限制相关的错误。#42833 (Vitaly Baranov).
- 当合并任务持续繁忙且磁盘空间不足时,完全过期的 Part 无法被选中并删除,从而导致磁盘空间持续不足。我的想法是,当整个 Part 过期时,无需再预留额外的磁盘空间,也应保证 TTL 能正常执行。 #42869 (zhongyuankai).
- 添加
oss函数和OSS表引擎(方便用户使用)。oss 与 S3 完全兼容。#43155 (zzsmdfj)。 - 改进
system.asynchronous_metrics表在收集操作系统相关信息时的错误报告。#43192(Alexey Milovidov)。 - 对
INFORMATION_SCHEMA表进行了修改,使 ClickHouse 可以通过 MySQL 兼容协议连接到自身。改为添加列而不是使用别名(相关问题见 #9769)。这将提升与各类 MySQL 客户端的兼容性。#43198(Filatenkov Artur)。 - 为 PowerBI 在通过 MySQL 协议连接时添加了一些兼容性函数 #42612 (Filatenkov Artur)。
- 在执行更改时提升 Dashboard 的易用性 #42872 (Vladimir C).
构建/测试/打包改进
- 对每个 pull request 和提交到 master 分支的变更运行 SQLancer。SQLancer 是一个专注于自动检测逻辑错误的开源模糊测试工具。#42397 (Ilya Yatsishin).
- 更新到最新的 zlib-ng。#42463 (Boris Kuschel).
- 增加对使用 Jepsen 测试 ClickHouse server 的支持。顺带一提,我们已经支持使用 Jepsen 测试 ClickHouse Keeper。本次 pull request 将其扩展到 Replicated 表。#42619 (Antonio Andelic).
- 使用 https://github.com/matus-chochlik/ctcache 对 clang-tidy 结果进行缓存。#42913 (Mikhail f. Shiryaev).
- 在修复之前,用户自定义配置会被 RPM 保存在
$file.rpmsave中。此 PR 修复了该问题,不会再用包中的文件替换用户的文件。#42936 (Mikhail f. Shiryaev). - 从 Ubuntu Docker 镜像中移除部分库。#42622 (Alexey Milovidov).
Bug 修复(官方 stable 或 prestable 版本中用户可见的错误行为)
- 将 normaliser 更新为克隆 alias ast。解决了 #42452。实现:* 更新了 QueryNormalizer,在替换时会克隆 alias ast。之前只是简单赋值为同一个对象,会在 LogicalExpressinsOptimizer 中导致异常,因为会再次插入相同的父节点。* 使用新的 analyser(
allow_experimental_analyzer)时不会出现此 bug,因此无需对其进行修改。我为此添加了一个测试。#42827 (SmitaRKulkarni)。 - 修复
Lazy数据库中表备份的竞态问题。#43104 (Vitaly Baranov)。 - 修复
skip_unavailable_shards:此前它无法与s3Cluster表函数配合使用。#43131 (chen)。 - 修复
s3Cluster中的模式推断,并改进hdfsCluster。#41979(Kruglov Pavel)。 - 修复从 URL 表引擎 / 表函数读取时的重试逻辑(可重试错误可能被过度重试,不可重试错误会在代码中导致断言失败)。#42224 (Kseniia Sumarokova).
- 已发现并修复了一个与 DNS 和 c-ares 相关的段错误。#42234 (Arthur Passos)。
- 修复在 PK 分析(单调性检查)中可能出现的
LOGICAL_ERROR:Arguments of 'plus' have incorrect data types。修复对首个参数为常量的单调二元函数的错误 PK 分析。#42410(Nikolai Kochetov)。 - 修复在键类型不能为 Nullable 时的错误键解析。修复了 #42456。#42469(Amos Bird)。
- 修复了设置名称中的拼写错误,该错误在使用设置
input_format_csv_use_best_effort_in_schema_inference时导致 schema 推断缓存被错误使用。关闭 #41735。#42536(Kruglov Pavel)。 - 修复在数据类型为 LowCardinality 时创建 Set 时使用错误 header 的问题。关闭了 #42460。#42579(flynn)。
(U)Int128和(U)Int256值现在能够在PREWHERE中被正确检查。#42605 (Antonio Andelic).- 修复了函数解析器中的一个错误,该错误可能会导致段错误(segmentation fault)。 #42724 (Nikolay Degterinsky).
- 修复
truncate table中的锁处理。#42728 (flynn). - 修复在
web磁盘上,当文件不存在时(或执行OPTIMIZE TABLE FINAL时,最终也可能触发同样错误)可能发生的崩溃。#42767 (Azat Khuzhin). - 修复
system.session_log中的auth_type映射,将SSL_CERTIFICATE添加到枚举值中。#42782(Miel Donkers)。 - 在启用 ASan 的构建中修复 Create User 查询解析器中的 stack-use-after-return 问题。#42804 (Nikolay Degterinsky).
- 修复在字符跨越 16 字节边界时
lowerUTF8/upperUTF8的问题(当字符串长度大于 16 字节时,这是非常常见的情况)。 #42812 (Azat Khuzhin). - 在 LZ4 解压缩过程中增加了额外的边界检查,以修复在输入数据格式错误时出现的异常行为。 #42868 (Nikita Taranov)。
- 修复在取消查询时极少数情况下可能发生的挂起问题。#42874 (Azat Khuzhin).
- 修复在 hash join 中包含多个析取条件时的不正确行为,关闭 #42832。#42876(Vladimir C)。
- 在对“三表连接”执行
select if as时会产生空指针异常。例如,下面这条 SQL 查询:#42883(zzsmdfj)。 - 修复 Cluster Discovery 中的 MemorySanitizer 报告,关闭 #42763。#42905(Vladimir C)。
- 在遇到空字符串时改进对 DateTime 架构的推断。#42911 (Kruglov Pavel)。
- 修复在理论上可以使用 projection 但实际没有可用 projection 时,偶发出现的
NOT_FOUND_COLUMN_IN_BLOCK错误。此修复解决了 #42771 中的问题。该缺陷最初在 https://github.com/ClickHouse/ClickHouse/pull/25563 中被引入。#42938(Amos Bird)。 - 修复
PostgreSQL数据库引擎中,当表包含 DATETIME 数据类型时的 ATTACH TABLE 操作。关闭 #42817。#42960(Kseniia Sumarokova)。 - 修复 lambda 解析。关闭问题 #41848。#42979(Nikolay Degterinsky)。
- 修复在可为空的键出现在超矩形中间时的键分析错误。此更改修复了 #43111。#43133(Amos Bird)。
- 修复了在对精心构造的聚合函数状态进行反序列化时出现的多个缓冲区越界读取问题。 #43159 (Raúl Marín).
- 修复在处理 NULL 和常量 Nullable 参数时的
if函数。关闭 #43069。#43178(Kruglov Pavel)。 - 修复在使用 “best effort” 算法解析 DateTime 时出现的十进制运算溢出问题。关闭 #43061。#43180(Kruglov Pavel)。
git-import工具生成的indent字段计算有误。参见 https://clickhouse.com/docs/getting-started/example-datasets/github/。#43191(Alexey Milovidov)。- 修复了在子查询和类型转换中使用
Interval类型时的非预期行为。#43193 (jh0x)。
ClickHouse 发行版 22.10,2022-10-25
不向后兼容的变更
- 重命名缓存相关命令:
show caches->show filesystem caches,describe cache->describe filesystem cache。 #41508(Kseniia Sumarokova)。 - 移除对
LIVE VIEW中WITH TIMEOUT部分的支持。解决了 #40557。 #42173(Alexey Milovidov)。 - 从客户端提示符中移除对
{database}宏的支持。如果未指定数据库,该宏显示不正确,并且在执行USE语句时不会更新。解决了 #25891。 #42508(Alexey Milovidov)。
新功能
- 已添加组合式协议配置。现在可以为不同协议配置不同的监听主机地址。像 PROXYv1 这样的协议封装器可以叠加配置在任意其他协议(TCP、TCP secure、MySQL、Postgres)之上。#41198(Yakov Olkhovskiy)。
- 将
S3添加为一种新的备份目标类型。支持按原有路径/数据结构执行到 S3 的 BACKUP。#42333 (Vitaly Baranov), #42232 (Azat Khuzhin). - 新增了函数(
randUniform、randNormal、randLogNormal、randExponential、randChiSquared、randStudentT、randFisherF、randBernoulli、randBinomial、randNegativeBinomial、randPoisson),用于按指定分布生成随机值,由此关闭了 #21834。#42411(Nikita Mikhaylov)。 - 对 ClickHouse Keeper 的一项改进:新增对将快照上传到 S3 的支持。S3 相关信息可以在
keeper_server.s3_snapshot中定义。#41342(Antonio Andelic)。 - 添加了聚合函数
analysisOfVariance(anova),用于对多个正态分布的观测组进行统计检验,以判断各组的均值是否相同。原始 PR #37872。#42131(Nikita Mikhaylov)。 - 支持通过设置
max_temporary_data_on_disk_size_for_user/max_temporary_data_on_disk_size_for_query来限制磁盘上的临时数据量。 #40893 (Vladimir C). - 添加设置
format_json_object_each_row_column_for_object_name,以在 JSONObjectEachRow 格式中将对象名称作为列值进行写入和解析。#41703 (Kruglov Pavel)。 - 在 SQL 中新增 BLAKE3 哈希函数。 #33435 (BoloniniD)。
- 函数
javaHash现已支持整数类型。 #41131 (JackyWoo)。 - 为 ON CLUSTER DDL 添加 OpenTelemetry 支持(需要将
distributed_ddl_entry_format_version设置为 4)。#41484(Frank Chen)。 - 新增系统表
asynchronous_insert_log。其中包含关于异步插入的信息(包括 fire-and-forget 模式(wait_for_async_insert=0)下查询的结果),便于更好地进行排查和分析。 #42040 (Anton Popov)。 - 在 HTTP 的
Accept-Encoding首部中新增对lz4、bz2、snappy方法的支持,这是对 HTTP 协议的一项非标准扩展。#42071(Nikolay Degterinsky)。 - 添加了 Morton 编码(ZCurve)编解码函数。#41753(Constantine Peresypkin)。
- 添加对
SET setting_name = DEFAULT的支持。#42187(Filatenkov Artur)。
实验特性
- 在
allow_experimental_analyzer设置下新增用于查询分析和规划的新基础架构。#31796 (Maksim Kita)。 - 初步实现了 Kusto Query Language。请暂勿使用。#37961 (Yong Wang)。
性能改进
- 放宽 “Too many parts” 阈值。这解决了 #6551。现在,如果分区中平均 part 大小足够大(至少 10 GiB),ClickHouse 将允许该分区中包含更多 part。这样就可以在单个服务器上的单张表的单个分区中存储高达 PB 级的数据,在使用磁盘机架或对象存储时可以实现。#42002 (Alexey Milovidov)。
- 实现运算符优先级元素解析器,以减少所需的栈大小。#34892 (Nikolay Degterinsky)。
- DISTINCT 排序优化利用数据流的排序属性。该改进将在适用时为 DISTINCT 启用按序读取(之前必须为 DISTINCT 中的列显式提供 ORDER BY)。#41014 (Igor Nikonov)。
- ColumnVector:使用 AVX512VBMI 优化 UInt8 索引。#41247 (Guo Wangyang)。
- 优化
ThreadGroupStatus::mutex的锁竞争。在 ICX 设备(Intel Xeon Platinum 8380 CPU,80 核,160 线程)上进行的 SSB(Star Schema Benchmark)性能实验表明,此更改可以将所有子场景 QPS 的几何平均值提升 2.95 倍。#41675 (Zhiguo Zhou)。 - 为 AArch64 构建添加
ldapr能力。在 Graviton 2+、Azure 和 GCP 实例上受支持。它仅在不久前才出现在 clang-15 中,不久前。#41778 (Daniel Kutenin)。 - 改进在比较字符串且其中一个参数为空常量字符串时的性能。#41870 (Jiebin Sun)。
- 优化 ColumnAggregateFunction 的
insertFrom,在某些情况下共享聚合状态(Aggregate State)。#41960 (flynn)。 - 加快写入
azure_blob_storage磁盘的速度(遵循max_single_part_upload_size,而不是针对每个缓冲区大小写入一个块)。相关低效问题见 #41754。#42041 (Kseniia Sumarokova)。 - 使进程列表和 query_log 中的线程 ID 唯一以避免浪费。#42180 (Alexey Milovidov)。
- 在请求的读取范围超过缓存设置
bypass_cache_threashold定义的阈值时,支持完全跳过缓存(既不下载到缓存,也不读取缓存数据,需要通过enable_bypass_cache_with_threshold启用)。#42418 (Han Shukai)。这在本地磁盘较慢的情况下很有用。
改进
- 新增设置
allow_implicit_no_password:与allow_no_password结合使用时,禁止创建无密码用户,除非显式指定IDENTIFIED WITH no_password。 #41341 (Nikolay Degterinsky)。 - 嵌入式 Keeper 将始终在后台启动运行,从而允许 ClickHouse 在未达到仲裁时也能启动。#40991 (Antonio Andelic)。
- 在先前连接过期时,使重新与 ZooKeeper 建立新连接的过程响应更加及时。此前是由一个默认每分钟触发一次的任务来完成这一操作,因此表可能会在最长约一分钟内处于只读状态。#41092(Nikita Mikhaylov)。
- 现在可以将 projection 与零拷贝复制一起使用(零拷贝复制目前为非生产特性)。 #41147 (alesapin)。
- 在子查询中支持使用
(EXPLAIN SELECT ...)表达式。类似SELECT * FROM (EXPLAIN PIPELINE SELECT col FROM TABLE ORDER BY col)的查询现在是有效的。#40630(Vladimir C)。 - 允许在查询范围内修改
async_insert_max_data_size或async_insert_busy_timeout_ms。例如,用户只需要偶尔插入数据,但又无法访问服务器配置来调整默认设置。#40668(Nikita Mikhaylov)。 - 改进了从远程文件系统读取数据的性能,并将读写操作的线程池大小改为可配置。修复了 #41070。#41011(Kseniia Sumarokova)。
- 在 WindowTransform/arratReduce*/initializeAggregation/aggregate 函数版本中支持所有组合子(combinator)的任意组合。此前,
ForEach/Resample/Map等组合子在这些场景下不受支持,使用它们会抛出类似State function ... inserts results into non-state column的异常。 #41107 (Kruglov Pavel). - 添加函数
tryDecrypt,在解密失败时(例如使用错误密钥解密)返回 NULL,而不是抛出异常。#41206(Duc Canh Le)。 - 向
system.disks表中添加unreserved_space列,用于查看每个磁盘上未被预留占用的空间大小。#41254 (filimonov). - 在表函数参数中支持 S3 认证头。 #41261 (Kseniia Sumarokova).
- 在 Keeper 和内部 ZooKeeper 客户端中添加对 MultiRead 的支持(这是对 ZooKeeper 协议的扩展,仅在 ClickHouse Keeper 中提供)。#41410 (Antonio Andelic)。
- 为
IN运算符添加对 decimal 类型与浮点字面量比较的支持。 #41544 (liang.huang)。 - 在缓存配置中允许使用更易读的大小值(例如
1TB)。#41688(Kseniia Sumarokova)。 - ClickHouse 可能会在一段时间内(默认 15 秒)缓存已过期的 DNS 记录,直到缓存异步更新为止。在此期间,ClickHouse 依然会尝试建立连接并产生错误。此行为已被修复。#41707 (Nikita Mikhaylov)。
- 使用类 fzf 的交互式历史搜索工具(fzf/sk)为
clickhouse-client/clickhouse-local添加交互式历史搜索功能(注意可以使用FZF_DEFAULT_OPTS/SKIM_DEFAULT_OPTIONS进一步配置其行为)。#41730 (Azat Khuzhin). - 仅允许连接到使用无效证书的安全服务器的客户端在提供
--accept-certificate标志时继续连接。 #41743 (Yakov Olkhovskiy). - 添加函数
tryBase58Decode,与现有函数tryBase64Decode类似。#41824(Robert Schulze)。 - 改进在使用不同主键替换分区时的反馈信息。修复了 #34798。#41838(Salvatore)。
- 修复并行解析:segmentator 现在会检查
max_block_size。这修复了在并行解析且 LIMIT 较小时出现的内存过度分配问题。#41852 (Vitaly Baranov)。 - 如果在从系统表执行 SELECT 时发生且已被忽略,则不要将 “TABLE_IS_DROPPED” 异常添加到
system.errors。 #41908 (AlfVII). - 改进选项
enable_extended_results_for_datetime_functions,使其对函数toStartOfDay、toStartOfHour、toStartOfFifteenMinutes、toStartOfTenMinutes、toStartOfFiveMinutes、toStartOfMinute和timeSlot返回DateTime64类型的结果。#41910(Roman Vasin)。 - 改进了文本格式中
DateTime类型的推断行为。现在会遵循date_time_input_format设置,并且不再尝试将数字按时间戳解析为日期时间。关闭 #41389 关闭 #42206。#41912(Kruglov Pavel)。 - 当使用
perform_ttl_move_on_insert= false 执行插入时,删除令人困惑的警告。#41980 (Vitaly Baranov). - 允许用户像使用
count(*)一样使用countState(*)。从而关闭了 #9338。#41983(Amos Bird)。 - 修复
rankCorr的大小溢出问题。#42020(Duc Canh Le)。 - 在 Sentry 的配置中新增了一个选项,可以将任意字符串指定为环境名称,以便生成更方便的报告。#42037 (Nikita Mikhaylov)。
- 修复从 CSV 中解析超出范围的 Date 值的问题。#42044(Andrey Zvonov)。
parseDataTimeBestEffort现在支持在日期和时间之间使用逗号。修复 #42038。#42049 (flynn)。- 改进了
ReplicatedMergeTree的落后副本恢复流程。如果落后副本包含某些在健康副本中不存在的 part,但根据健康副本的复制队列这些 part 未来应该会出现,那么该落后副本将保留这些 part,而不是将其分离。 #42134 (Alexander Tokmakov)。 - 为
date_diff函数添加对使用Date32参数的支持。修复在date_diff函数中使用DateTime64参数且起始日期早于 Unix 纪元、结束日期晚于 Unix 纪元时的错误。#42308 (Roman Vasin)。 - 在向 Minio 上传大块数据时,“Complete Multipart Upload” 操作可能会耗时较长。Minio 每 10 秒发送一次心跳信号(参见 https://github.com/minio/minio/pull/7198)。但 ClickHouse 会更早超时,因为默认的发送/接收超时时间被设置为 5 秒。#42321(filimonov)。
- 修复了在使用 Decimal 等复杂类型时,聚合状态类型在极少数情况下发生的无效类型转换问题。此变更修复了 #42408。#42417(Amos Bird)。
- 支持在
dateName函数中使用Date32类型的参数。#42554(Roman Vasin)。 - 现在在索引分析阶段也会使用包含 NULL 字面量的过滤条件。#34063。#41842(Amos Bird)。
- 如果范围内的所有部分都早于某个阈值,则合并这些部分。该阈值可以通过
min_age_to_force_merge_seconds来设置。此更改解决了 #35836。#42423(Antonio Andelic)。这是对 @fastio 实现了大部分逻辑的 #39550i 的延续。 - 在
allow_experimental_analyzer设置下新增了用于查询分析和计划的基础设施。#31796 (Maksim Kita)。 - 缩短恢复丢失 keeper 连接所需的时间。#42541 (Raúl Marín).
构建/测试/打包改进
- 为数据表定义添加模糊测试工具(fuzzer)#40096(Anton Popov)。这是今年迄今为止 ClickHouse 测试方面最大的一项进展。
- 发布 ClickHouse Cloud 服务的测试版:https://console.clickhouse.cloud/。它提供了使用 ClickHouse 的最简便方式(甚至比单命令安装还要稍微简单一些)。
- 为 AST Fuzzer 增加了对
WHERE子句生成的支持,并支持添加或删除ORDER BY和WHERE子句。#38519(Ilya Yatsishin)。 - Aarch64 二进制文件现在至少需要 ARMv8.2(2016 年发布)。最值得注意的是,这使得可以使用 ARM LSE,即原生原子操作。同时增加了 CMake 构建选项
"NO_ARMV81_OR_HIGHER",以便为较旧的 ARMv8.0 硬件(例如 Raspberry Pi 4)编译二进制文件。#41610(Robert Schulze)。 - 允许使用 Musl 构建 ClickHouse(在其已被支持但后来失效后进行的小改动)。#41987(Alexey Milovidov)。
- 增加对
$CLICKHOUSE_CRONFILE文件的检查,以避免在安装时运行sed命令后才得到“文件未找到”的错误。#42081(Chun-Sheng, Li)。 - 将 cctz 更新到
2022e以支持新的时区变更。巴勒斯坦的时区切换现在为星期六 02:00。将乌克兰的三个时区合并为一个。约旦和叙利亚从 +02/+03 加夏令时(DST)的模式切换为全年 +03。(https://data.iana.org/time-zones/tzdb/NEWS)。此变更关闭了 #42252。#42327(Alexey Milovidov)。#42273(Dom Del Nano)。 - 为 ClickHouse 添加对 Rust 代码的支持,并以 BLAKE3 哈希函数库作为示例。#33435(BoloniniD)。
Bug 修复(在官方 stable 或 prestable 版本中对用户可见的异常行为)
- 为包含大整数类型的
LowCardinality选择正确的聚合方法。#42342 (Duc Canh Le). - 对
web磁盘进行了多项修复。#41652 (Kseniia Sumarokova). - 修复了一个问题:当配置中未设置
https_port时,会导致 docker run 失败。#41693 (Yakov Olkhovskiy)。 - 在服务器关闭或执行
SYSTEM STOP MERGES查询时,Mutation 操作未能被正确取消,且其取消过程可能耗时较长,该问题已修复。 #41699 (Alexander Tokmakov). - 修复在启用“按顺序读取”优化(设置
optimize_read_in_order和optimize_aggregation_in_order)时,当对排序键前缀中的列套用单调函数并在查询中使用ORDER BY或GROUP BY所导致的错误查询结果。#41701 (Anton Popov). - 修复在启用
optimize_monotonous_functions_in_order_by设置时,从Merge表执行SELECT语句可能导致的崩溃问题。修复 #41269。#41740(Nikolai Kochetov)。 - 修复了在极其罕见情况下可能出现的 “Part ... intersects part ...” 错误:当副本在刚刚将某个 part 作为损坏数据进行 detach 之后立即重启时,可能会触发该错误。#41741 (Alexander Tokmakov)。
- 不允许创建或修改具有列名
_row_exists的 MergeTree 表,该列名是为轻量级删除保留的。已修复 #41716。#41763(Jianmei Zhang)。 - 修复某些 HTTP 响应未包含 CORS 头部的问题。#41792(Frank Chen)。
- 如果某个
ReplicatedMergeTree表是由 20.3 或更早版本创建且从未进行过修改,则在 22.9 中启动该表时可能会失败,此问题已修复。修复了 #41742。#41796(Alexander Tokmakov)。 - 当批量发送因某些原因失败后,无法自动恢复,如果不及时处理,会导致数据积压,打印的错误信息会越来越长,从而导致 http 线程阻塞。#41813 (zhongyuankai)。
- 修复了在设置压缩标记时的 compact parts 问题。修复了 #41783 和 #41746。#41823(alesapin)。
- 较旧版本的 Replicated 数据库在 [Zoo]Keeper 中没有特殊标记。我们只需要检查该节点是否包含一些异常数据,而不是检查特殊标记。#41875 (Nikita Mikhaylov)。
- 修复 fs 缓存中潜在的异常。 #41884 (Kseniia Sumarokova).
- 修复 s3 表函数的
use_environment_credentials参数。 #41970 (Kseniia Sumarokova). - 修复了在分离损坏的 part 时出现的 “Directory already exists and is not empty” 错误,该错误可能会导致
ReplicatedMergeTree表无法开始复制。修复了 #40957。#41981(Alexander Tokmakov)。 toDateTime64现在对于负整数和浮点数参数返回一致的输出。#42025(Robert Schulze)。- 修复向
azure_blob_storage写入的问题。部分解决 #41754。#42034(Kseniia Sumarokova)。 - 修复特定
bzip2文件的解码问题。#42046 (Nikolay Degterinsky)。 - 修复在扩展范围起始(1900 年 1 月)且启用设置 "enable_extended_results_for_datetime_functions = 1" 时 SQL 函数
toLastDayOfMonth的行为。- 修复在扩展范围末尾(2299 年 12 月)且启用设置 "enable_extended_results_for_datetime_functions = 1" 时 SQL 函数 "toRelativeWeekNum()" 的行为。- 通过避免不必要的索引运算,提高 SQL 函数 "toISOYear()"、"toFirstDayNumOfISOYearIndex()" 和 "toYearWeekOfNewyearMode()" 的性能。#42084 (Roman Vasin)。 - 此前每个表的最大抓取大小被误设为 8,而池大小可能更大。现在每个表的最大抓取大小等于池大小。#42090 (Nikita Mikhaylov)。
- 在检查是否可以在不破坏表之间依赖关系的情况下删除之前,表可能已被停止,字典可能已被分离,此问题已修复。修复了 #41982。 #42106(Alexander Tokmakov)。
- 修复在启用文件系统缓存时使用
remote_filesystem_read_method=read所导致的严重效率低下问题。关闭 #42125。#42129(Kseniia Sumarokova)。 - 修复在 use_hedged_requests = 0 时,分布式查询可能出现的超时异常。#42130 (Azat Khuzhin).
- 修复了在将函数
runningDifference用于Date32类型时的一个小 bug。之前内部使用的是Date类型,这可能会导致一些逻辑错误,例如Bad cast from type DB::ColumnVector<int> to DB::ColumnVector<unsigned short>'。 #42143 (Alfred Xu). - 修复从基础备份中重用大于 4GB 的文件时出现的问题。 #42146 (Azat Khuzhin).
- 当排序键中的第一列包含函数时,按顺序执行的 DISTINCT 会失败并抛出 LOGICAL_ERROR。 #42186 (Igor Nikonov).
- 修复了一个与投影和
aggregate_functions_null_for_empty设置相关的 bug。该 bug 非常罕见,仅在服务器配置中启用了aggregate_functions_null_for_empty设置时才会触发。本次更改关闭了 #41647。#42198(Alexey Milovidov)。 - 修复从
Buffer表按降序读取数据时的读取问题。#42236(Duc Canh Le)。 - 修复了一个错误:当在默认 profile 中设置了
background_pool_size但未设置background_merges_mutations_concurrency_ratio时,会导致 ClickHouse 无法启动的问题。#42315 (nvartolomei)。 - 对列与表结构不同的附加数据部分执行
ALTER UPDATE,可能会在磁盘上生成无效的columns.txt元数据。从此类数据部分读取数据时可能会报错或返回无效数据。修复了 #42161。#42319(Nikolai Kochetov)。 additional_table_filters设置未应用到Distributed存储。修复了 #41692。#42322(Nikolai Kochetov)。- 修复查询完成/取消逻辑中的数据竞争问题。关闭 #42346。#42362(Alexey Milovidov)。
- 此次变更回滚了 #40217,该变更在日期/时间函数中引入了一个回归缺陷。#42367(Alexey Milovidov)。
- 修复在假条件下进行 join 时的 assert 类型转换问题,关闭 #42380。#42407(Vladimir C)。
- 修复了在处理 Decimal 数据类型时的缓冲区溢出问题。此更改解决了 #42451。#42465(Alexey Milovidov)。
AggregateFunctionQuantile现在可以正确处理 UInt128 列。之前,分位数状态会将UInt128列解释为Int128,这可能导致结果不正确。#42473 (Antonio Andelic)。- 修复在对非 Float32 列的
Annoy索引执行 INSERT 操作时触发的bad_cast断言。Annoy索引是一个实验性功能。#42485(Robert Schulze)。 - 在使用 Date 或 DateTime 与 128 或 256 位整数进行算术运算时,会引用未初始化内存。#42453。#42573(Alexey Milovidov)。
- 修复在服务器升级期间,分区键包含别名函数名称时出现的意外表加载错误。 #36379 (Amos Bird).
ClickHouse 版本 22.9,2022-09-22
向后不兼容的变更
- 如果存在任何
ReplicatedMergeTree表,从 20.3 及更早版本升级到 22.9 及更新版本时,应通过一个中间版本进行升级,否则新版本的服务器将无法启动。#40641(Alexander Tokmakov)。 - 移除函数
accurate_Cast和accurate_CastOrNull(它们与accurateCast和accurateCastOrNull的区别在于名称中的下划线,并且不受cast_keep_nullable设置值的影响)。这些函数未被记录在文档中、未测试、未使用且并非必需,仅由于代码泛化而保留存在。#40682(Alexey Milovidov)。 - 添加测试以确保每一个新的表函数都会在文档中进行说明。参见 #40649。将表函数
MeiliSearch重命名为meilisearch。#40709(Alexey Milovidov)。 - 添加测试以确保每一个新的函数都会在文档中进行说明。参见 #40649。函数
lemmatize、synonyms、stem之前由于失误是大小写不敏感的,现在改为大小写敏感。#40711(Alexey Milovidov)。 - 出于安全性和稳定性的考虑,catboost 模型将不再在 ClickHouse 服务器内部进行评估。相反,现在在 clickhouse-library-bridge 中完成评估,该独立进程加载 catboost 库,并通过 HTTP 与服务器进程通信。#40897(Robert Schulze)。
- 使 YAML 配置的解释方式更加符合常规习惯。#41044(Vitaly Baranov)。
新功能
- 支持将
insert_quorum = 'auto'设置为使用多数副本数。#39970(Sachin)。 - 向 ClickHouse 服务器添加内置仪表板。该示例项目展示了如何使用 ClickHouse 特性以 1% 的工作量实现 90% 的效果。#40461(Alexey Milovidov)。
- 添加新的设置约束可写性类型
changeable_in_readonly。#40631(Sergei Trifonov)。 - 增加对
INTERSECT DISTINCT和EXCEPT DISTINCT的支持。#40792(Duc Canh Le)。 - 新增输入/输出格式
JSONObjectEachRow—— 支持导入JSON/JSONCompact/JSONColumnsWithMetadata格式。新增设置input_format_json_validate_types_from_metadata,用于控制是否检查元数据中的数据类型是否与表头中的数据类型一致。—— 新增设置input_format_json_validate_utf8,启用后,所有JSON格式都会校验 UTF-8 序列。该设置默认禁用。注意,该设置不会影响输出格式JSON/JSONCompact/JSONColumnsWithMetadata,这些格式始终会校验 UTF-8 序列(这是出于兼容性原因的特例)。—— 新增设置input_format_json_read_numbers_as_strings,允许在 String 列中将数字解析为字符串,该设置默认禁用。—— 新增设置output_format_json_quote_decimals,允许以双引号形式输出 Decimal,默认禁用。—— 允许在数据导入时解析以双引号包裹的 Decimal。#40910(Kruglov Pavel)。 - 在 DESCRIBE TABLE 查询中支持查询参数。#40952(Nikita Taranov)。
- 通过转换为 DateTime64,增加对 Parquet Time32/64 的支持。Parquet time32/64 表示自午夜起经过的时间,而 DateTime32/64 表示实际的 Unix 时间戳。转换只是简单地从
0偏移。#41333(Arthur Passos)。 - 在 Apache Datasketches 上实现集合操作。#39919(Fangyuan Deng)。注意:没有必要使用 Apache Datasketches,其效果不如 ClickHouse,本身只有在与其他系统集成时才有意义。
- 在读取文本格式(
CSV、TSV)时允许将错误记录到指定文件。#40516(zjial)。
实验性功能
- 基于
Annoy添加 ANN(近似最近邻)索引。#40818(Filatenkov Artur)。#37215(VVMak)。 - 新增存储引擎
KeeperMap,使用 ClickHouse Keeper 或 ZooKeeper 作为键值存储。#39976(Antonio Andelic)。该存储引擎用于存储少量元数据。 - 内存数据部分的改进:移除已完全处理的 WAL 文件。#40592(Azat Khuzhin)。
性能优化
- 实现对 marks 和主键的压缩。关闭 #34437。#37693 (zhongyuankai)。
- 允许使用线程池提前加载 marks。通过设置
load_marks_asynchronously(默认值:0)进行控制。#40821 (Kseniia Sumarokova). - 基于 S3 的虚拟文件系统将使用随机对象名称,并将其拆分为多个路径前缀,以在 AWS 上获得更高性能。 #40968 (Alexey Milovidov).
- 在生成单级聚合结果时考虑
max_block_size的值,从而在执行后续查询计划步骤时可以使用更多线程。#39138 (Nikita Taranov)。 - 在聚合运算中使用软件预取来加速哈希表操作。由设置
enable_software_prefetch_in_aggregation控制,默认启用。#39304(Nikita Taranov)。 - 在应用
WHERE子句后,如果某些排序键列的值始终为常量,则对optimize_read_in_order提供了更好的支持。例如查询SELECT ... FROM table WHERE a = 'x' ORDER BY a, b,其中table的存储定义为:MergeTree ORDER BY (a, b)。#38715(Anton Popov)。 - 在排序之前,使用于
full_sorting_join的连接流相互过滤。#39418(Vladimir C)。 - 通过跳过空字面量的处理优化了 LZ4 解压缩。 #40142 (Nikita Taranov).
- 在可能的情况下使用原生
copy操作加快备份过程,而不是通过clickhouse-server内存中转复制。#40395 (alesapin)。 - 不再为每个 INSERT 块获取存储快照(可略微提升性能)。 #40638 (Azat Khuzhin)。
- 为具有多个可为
NULL参数的聚合函数实现批量处理。#41058 (Raúl Marín). - 加快读取 UniquesHashSet 的速度(例如从磁盘读取
uniqState时)。#41089(Raúl Marín)。 - 修复了在包含大量列的表中对 compact parts 执行 mutation 时出现的高内存占用问题。#41122 (lthaooo)。
- 在 ARM 上启用 vectorscan 库,以加速正则表达式匹配。#41033(Robert Schulze)。
- 将 vectorscan 升级到 5.4.8,该版本包含多项性能优化,可加速正则表达式匹配。#41270 (Robert Schulze)。
- 修复在并发级别极高时出现的错误回退逻辑,该逻辑会跳过针对 VFS(如 S3)的本地文件系统缓存。#40420(Kseniia Sumarokova)。
- 如果行策略过滤器始终为 false,则无需读取任何数据即可立即返回空结果。这一更改关闭了 #24012。#40740(Amos Bird)。
- 针对 Float 数据类型的并行哈希 JOIN 可能不够理想,已进行优化。 #41183 (Alexey Milovidov).
改进
- 在启动和执行 ATTACH 调用期间,在建立 ZooKeeper 连接并完成初始化之前,
ReplicatedMergeTree表将保持只读状态。#40148 (Antonio Andelic)。 - 添加
enable_extended_results_for_datetime_functions选项,当参数为 Date32 或 DateTime64 时,函数 toStartOfYear、toStartOfISOYear、toStartOfQuarter、toStartOfMonth、toStartOfWeek、toMonday 和 toLastDayOfMonth 返回 Date32 类型的结果,否则返回 Date 类型的结果。出于兼容性原因,默认值为 '0'。#41214(Roman Vasin)。 - 出于安全性和稳定性的考虑,CatBoost 模型不再在 ClickHouse 服务器内部进行评估。相反,现在的评估在 clickhouse-library-bridge 中完成,它是一个独立进程,用于加载 catboost 库并通过 HTTP 与服务器进程通信。函数
modelEvaluate()已被catboostEvaluate()所取代。#40897(Robert Schulze)。#39629(Robert Schulze)。 - 为磁盘上的临时数据添加更多指标,关闭 #40206。#40239(Vladimir C)。
- 添加配置选项
warning_supress_regexp,解决 #40330。#40548(Vladimir C)。 - 新增用于取消 kafka_num_consumers 限制的设置。关闭 #40331。#40670 (Kruglov Pavel)。
- 在
DELETE ...查询中支持SETTINGS。 #41533 (Kseniia Sumarokova). - 针对 S3 ObjectStorage、按每次 S3 API 调用拆分的详细 S3 分析事件
DiskS3*。 #41532 (Sergei Trifonov). - 在
system.asynchronous_metrics中新增两个指标:NumberOfDetachedParts和NumberOfDetachedByUserParts。#40779(Sema Checherinda)。 - 允许为 ODBC 和 JDBC 表使用 CONSTRAINT 约束。 #34551 (Alexey Milovidov).
- 在格式化查询时,如果
SETTINGS在原始查询中没有多次出现,则不要多次打印它。 #38900 (Raúl Marín). - 改进 OpenTelemetry 跟踪上下文在线程间的传播。#39010 (Frank Chen).
- ClickHouse Keeper:仅在显式指定时才在 Keeper 中为
interserver_listen_host添加监听器。#39973(Antonio Andelic)。 - 改进 Replicated 用户访问存储在出错后的恢复过程。#39977 (Vitaly Baranov).
- 在
EmbeddedRocksDB中添加对 TTL 的支持。#39986 (Lloyd-Pottiger)。 - 为
clickhouse-obfuscator添加结构自动推断功能,因此不再需要--structure参数。#40120(Nikolay Degterinsky)。 - 改进并修复
Arrow格式中的字典处理。#40173 (Kruglov Pavel). - 对
Date32、DateTime64、Date向更窄类型的转换行为进行了更自然的处理:当值超出正常范围时,会采用正常范围的上界或下界值。#40217 (Andrey Zvonov)。 - 修复在基于
View的Merge表无法使用索引的情况。#40233(Duc Canh Le)。 - JSON 服务器日志的自定义键名。#40251(Mallik Hassan)。
- 现在可以为函数
throwIf抛出的异常设置自定义错误码。#40319 (Robert Schulze)。 - 改进模式推断缓存,并考虑到可能改变模式的格式设置。#40414(Kruglov Pavel)。
- 支持将
Date解析为DateTime和DateTime64。此更改实现了在 #36949 中提出的改进。#40474(Alexey Milovidov)。 - 支持将包含
DateTime64(如2022-08-22 01:02:03.456)的String转换为Date和Date32。支持将包含DateTime(如2022-08-22 01:02:03)的String转换为Date32。关闭了 #39598。#40475(Alexey Milovidov)。 - 改进对 Parquet 格式中嵌套数据结构的支持 #40485(Arthur Passos)。
- 在 Avro 中支持将 Array(Record) 读取为展平的嵌套表。#40534 (Kruglov Pavel)。
- 为
EmbeddedRocksDB添加只读支持。#40543 (Lloyd-Pottiger)。 - 验证 URL 表引擎的压缩方式参数。#40600 (Frank Chen).
- 在文件名后带查询字符串的情况下,为
url表函数/引擎提供更好的格式检测。修复 #40315。#40636(Kruglov Pavel)。 - 在使用 grouping set 时禁用 projection。此前会生成错误结果。本次修复了 #40635。#40726(Amos Bird)。
- 修复
APPLY列转换器格式不正确的问题,该问题在用于表定义时可能破坏元数据。此修复对应 #37590。#40727(Amos Bird)。 - 在
formatDateTime中增加对使用%z描述符格式化时区偏移量的支持。 #40736 (Cory Levy). clickhouse-client的交互模式现在会将.和/视为“重新执行上一条命令”。 #40750 (Robert Schulze)。- 修复在 MySQL 数据库引擎和 MySQL 表函数中传递 MySQL 超时参数的问题。修复 #34168。#40751(Kseniia Sumarokova)。
- 为文件系统缓存目录创建状态文件,以确保缓存目录不会在不同服务器或不同缓存之间共享。#40820 (Kseniia Sumarokova)。
- 为
EmbeddedRocksDB存储引擎添加对DELETE和UPDATE的支持。#40853 (Antonio Andelic)。 - ClickHouse Keeper:修复在长时间提交过程中的关闭问题,并增大允许的请求大小。#40941(Antonio Andelic)。
- 修复 WriteBufferFromS3 中的竞态条件,添加 TSA 注解。 #40950 (Kseniia Sumarokova).
- 在启用
group_by_use_nulls时,grouping sets 应只将键列转换为 Nullable 类型。#40997 (Duc Canh Le). - 改进分布式表上
INSERT操作的可观测性。#41034 (Frank Chen). - 更多用于 S3 交互的底层指标。#41039 (mateng915).
- 支持 HTTP 重定向后
Location首部中的相对路径。修复 #40985。#41162(Kruglov Pavel)。 - 无需重启服务器即可即时对 HTTP 处理程序应用更改。#41177 (Azat Khuzhin).
- ClickHouse Keeper:在关闭时正确结束活动会话。#41215(Antonio Andelic)。这会缩短出现“table is read-only”错误的持续时间。
- 在 clickhouse-client/local 中添加使用
Alt-#自动注释 SQL 查询的功能(类似 readline)。 #41224 (Azat Khuzhin). - 修复在将设置
do_no_evict_index_and_mark_files从 1 切换为 0 或从 0 切换为 1 后导致的缓存不兼容问题。#41330 (Kseniia Sumarokova). - 新增设置项
allow_suspicious_fixed_string_types,用于防止用户创建大小超过 256 的 FixedString 类型列。#41495 (Duc Canh Le)。 - 为 system.parts 添加
has_lightweight_delete字段。 #41564 (Kseniia Sumarokova).
构建/测试/打包改进
- 强制要求为每个设置提供文档。#40644 (Alexey Milovidov)。
- 为每个现有指标强制要求提供文档。#40645 (Alexey Milovidov)。
- 为每个 profile 事件计数器强制提供文档,并补写此前缺失的文档。 #40646 (Alexey Milovidov).
- 通过修正部分依赖关系,实现精简版的
clickhouse-local构建。#40460(Alexey Milovidov)。其大小不足 50 MiB。 - 在测试中计算并报告 SQL 函数的覆盖率。#40593。#40647(Alexey Milovidov)。
- 强制要求为每个 MergeTree 设置提供文档。#40648(Alexey Milovidov)。
- 用于高层级统一服务器组件的嵌入式参考文档原型。#40649(Alexey Milovidov)。
- 我们将检查所有来自已修改性能测试的查询,以确保所有变更的查询都已经过测试。#40322 (Nikita Taranov)。
- 修复 TGZ 包。#40681(Mikhail f. Shiryaev)。
- 修复调试符号。#40873 (Azat Khuzhin)。
- 扩展了 CI 配置,以创建仅面向 SSE2 的 x86 架构构建,对老旧或嵌入式硬件很有用。 #40999 (Robert Schulze).
- 切换到 LLVM/Clang 15。#41046 (Azat Khuzhin).
- 延续 #40938。修复
Loggers类的 ODR(一次定义规则)违规问题。修复 #40398、#40937。#41060(Dmitry Novik)。 - 将 macOS 二进制文件添加到 GitHub 发布资源中,修复了 #37718。#41088(Mikhail f. Shiryaev)。
- c-ares 库现已随 ClickHouse 的构建系统一同打包提供。 #41239 (Robert Schulze).
- 从 ClickHouse 主体代码中移除
dlopen。它仍然保留在 library-bridge 和 odbc-bridge 中。#41428(Alexey Milovidov)。 - 不要在 ClickHouse 主二进制中允许使用
dlopen,因为它有害且不安全。我们本身并不使用它。但某些库可能会用它来实现“插件”。我们强烈反对这种古老的做法,即将第三方、未受控制且危险的库加载到进程地址空间中,因为这简直是疯狂的。#41429 (Alexey Milovidov)。 - 为 DEB 软件包添加
source字段,并更新nfpm。#41531(Mikhail f. Shiryaev)。 - 在自研 DWARF 解析器中新增对 DWARF-5 的支持。#40710 (Azat Khuzhin).
- 在 ZooKeeper 客户端中添加用于测试的故障注入 #30498 (Alexander Tokmakov)。
- 添加基于 S3 存储并支持 debug 和 tsan 的无状态测试 #35262 (Kseniia Sumarokova).
- 在 S3 上尝试压力测试 #36837 (alesapin)。
- 在
clang-tidy中启用concurrency-mt-unsafe检查 #40224 (Alexey Milovidov).
缺陷修复
- 修复由 AWS SDK 中的一个 bug 导致的潜在数据丢失问题。该 bug 仅会在 ClickHouse 通过 S3 使用时被触发。#40506(alesapin)。这个 bug 在 AWS SDK 中已存在 5 年之久,并在我们报告之后才被关闭。
- Native 格式的恶意数据可能会导致崩溃。#41441 (Alexey Milovidov)。
- 聚合函数
categorialInformationValue的属性定义不正确,这可能在运行时导致空指针解引用。本变更关闭了 #41443。#41449 (Alexey Milovidov)。 - 以 Apache
ORC格式写入数据可能会导致缓冲区溢出。#41458(Alexey Milovidov)。 - 如果将 Nullable 的 Array 作为参数使用,会修复函数
encrypt和contingency的内存安全问题。此更改修复了 #41004。#40195(Alexey Milovidov)。 - 修复在 'not_processed' 非空时 MergeJoin 中的缺陷。#40335 (liql2007)。
- 修复在使用
IN运算符时因小数精度丢失而导致结果不正确的问题,参见 #41125。#41130(Vladimir C)。 - 修复多级
Nested列填充时的遗漏问题。 #37152 (Anton Popov). - 修复针对 Ordinary(已弃用)数据库的 SYSTEM UNFREEZE 查询。这是对 https://github.com/ClickHouse/ClickHouse/pull/36424 的修复。 #38262(Vadim Volodin)。
- 修复了由 WITH 语句引入的未使用的未知列问题。此修复对应 #37812。#39131(Amos Bird)。
- 在存在窗口函数的情况下,修正对 ORDER BY 的查询分析。修复了 #38741 和 #24892。#39354(Dmitry Novik)。
- 修复了当用户尝试基于聚合函数计算 WINDOW ORDER BY/PARTITION BY 表达式时出现的
Unknown identifier (aggregate-function)异常。 #39762 (Vladimir Chebotaryov). - 通过设置
max_analyze_depth限制单个查询的分析深度。这样可以防止在包含异常大量子查询的查询上分析时间呈指数级增长。 #40334 (Vladimir C)。 - 修复 MergeTree 引擎族中列级 TTL 的罕见错误:在多次执行纵向合并时,可能会出现错误
Cannot unlink file ColumnName.bin ... No such file or directory.。 #40346 (alesapin). - 如果同时存在 IPv4 和 IPv6,请为二者都使用 DNS 记录。#40353 (Maksim Kita)。
- 允许读取 Hadoop 中使用 Snappy 压缩的文件。 #40482 (Kruglov Pavel).
- 修复在解析包含可变维度数组的
Object类型值(实验性功能)时发生的崩溃。#40483 (Duc Canh Le). - 修复设置
input_format_tsv_skip_first_lines的问题。 #40491 (mini4). - 修复在启动 MaterializedPostgreSQL 数据库/表引擎时出现的缺陷(竞争条件)。#40262。修复在达到 relcache_callback_list 槽位上限时触发的错误。#40511 (Maksim Buren)。
- 修复在解析 DateTime64 时可能出现的 'Decimal math overflow' 错误。 #40546 (Kruglov Pavel).
- 修复在对包含轻量级已删除行的数据分片执行垂直合并时出现的问题。 #40559 (Alexander Gololobov).
- 修复在向启用压缩的 URL 表引擎写入数据时出现的段错误。 #40565 (Frank Chen).
- 修复在对
Map使用arrayElement函数时可能出现的逻辑错误'Invalid Field get from type UInt64 to type String'。 #40572 (Kruglov Pavel)。 - 修复文件系统缓存中可能存在的竞态问题。#40586 (Kseniia Sumarokova).
- 移除了在
MergeTree表中对未受影响分区跳过执行变更(mutation)的逻辑,因为该功能从未正常工作,且可能导致已完成的变更被“复活”。 #40589 (Alexander Tokmakov). - 如果在运行时向配置中添加已被占用的 gRPC 端口,ClickHouse 服务器会崩溃。 #40597 (何李夫)。
- 修复
base58Encode / base58Decode在处理前导 0 / '1' 时的问题。 #40620 (Andrey Zvonov). - keeper-fix:修复在安装快照时访问日志时出现的竞争条件。#40627(Antonio Andelic)。
- 修复
toFixedString函数中的短路执行问题。部分解决 #40622。#40628(Kruglov Pavel)。 - 修复了在 ClickHouse 中将 SQLite 的 int8 列转换为 int64 列时的错误。修复了 #40639。#40642(Barum Rho)。
- 修复了递归
Buffer表中的栈溢出。关闭 #40637。#40643(Alexey Milovidov)。 - 在向
ProcessList插入新查询时会发生内存分配。如果在这些内存分配期间达到了内存限制,我们无法使用OvercommitTracker,因为此时已经持有ProcessList::mutex。修复了 #40611。#40677(Dmitry Novik)。 - 修复在读取标记时由于
max_read_buffer_size=0触发的LOGICAL_ERROR。 #40705 (Azat Khuzhin). - 修复在无查询上下文时从 Kafka/... 向 MVs 推送数据时出现的内存泄漏问题。#40732 (Azat Khuzhin)。
- 修复在 CSV 模式推断过程中可能出现的 “Attempt to read after eof” 错误。 #40746 (Kruglov Pavel).
- 修复直写缓存中的逻辑错误“文件分段的完成只能由下载器执行”。关闭 #40748。#40759(Kseniia Sumarokova)。
- 使 GROUPING 函数的结果与 SQL 及其他 DBMS 中的一致。 #40762 (Dmitry Novik).
- 在 #40595 中,有用户报告称
host_regexp功能在配合/etc/hosts中的名称解析为地址时工作不正常。该问题已修复。#40769(Arthur Passos)。 - 修复 Log 系列表引擎的增量备份问题。#40827 (Vitaly Baranov).
- 修复一个极其罕见的错误,可能在零拷贝复制中导致数据丢失。 #40844 (alesapin).
- 修复在针对不同列构建出的集合表达式相同时,键条件分析发生崩溃的问题。 #40850 (Duc Canh Le).
- 修复嵌套 JSON 对象的 schema 推断。#40851 (Kruglov Pavel).
- 修复了文件系统缓存文件的三位数字前缀目录在为空时未被删除的问题。关闭 #40797。#40867(Kseniia Sumarokova)。
- 修复在连接副本失败时未捕获的 DNS_ERROR 问题。 #40881 (Robert Coelho).
- 修复在子查询中删除不需要的列时的 bug。#40884 (luocongkai)。
- 修复远程读取缓冲区中多余的内存分配。 #40896 (Kseniia Sumarokova).
- 修复了这样一个问题:即使用户被显式撤销了删除数据库的权限,仍然可以删除数据库。#40906 (Nikita Mikhaylov)。
- 针对 ClickHouse Keeper 的修复:在写请求中正确比较路径与 Keeper 内部系统节点路径。#40918(Antonio Andelic)。
- 修复 WriteBufferFromS3 中的死锁。#40943 (Kseniia Sumarokova).
- 修复
DESCRIBE TABLE url()以及其他一些DESCRIBE TABLE <table_function>()的访问权限问题。 #40975 (Vitaly Baranov). - 已移除了针对
WITH GROUPING SETS的错误解析逻辑,该逻辑可能导致对空指针的解引用。 #41049 (Duc Canh Le). - 针对 ClickHouse Keeper 的修复:解决 Keeper 关闭期间可能发生的段错误(segfault)。 #41075 (Antonio Andelic).
- 修复聚合函数组合器中可能发生的段错误、释放后使用堆内存(use-heap-after-free)以及内存泄漏问题。关闭 #40848。#41083(Kruglov Pavel)。
- 修复 Window 视图下的 query_views_log 问题。#41132 (Raúl Marín).
- 默认禁用 optimize_monotonous_functions_in_order_by,以缓解相关问题:#40094。#41136(Denny Crane)。
- 修复了在将数据库引擎从 Ordinary 自动转换为 Atomic 时出现的 “possible deadlock avoided” 错误。#41146(Alexander Tokmakov)。
- 修复 SortedBlocksWriter 在处理空 block 时出现的 SIGSEGV(在启用
optimize_aggregation_in_order且join_algorithm=auto时可能发生)。#41154 (Azat Khuzhin)。 - 修复了在启用 trivial count 优化且使用 ARRAY JOIN 时出现的查询结果错误。修复了 #39431。#41158(Denny Crane)。
- 修复
GetPriorityForLoadBalancing::getPriorityFunc()中的 stack-use-after-return 问题。 #41159 (Azat Khuzhin). - 修复位置参数越界(
Positional argument out of bounds)异常。修复 #40634。#41189(Kseniia Sumarokova)。 - 修复后台清理损坏的分离 part 的逻辑。 #41190 (Kseniia Sumarokova).
- 修复在存在大量带有 WHERE 条件的交叉连接时查询重写复杂度呈指数级增长的问题,并关闭 #21557。#41223(Vladimir C)。
- 修复写穿缓存中可能存在的逻辑错误,该错误是由于未按要求处理所有类型的异常而导致的。关闭 #41208。#41232(Kseniia Sumarokova)。
- 修复 system.filesystem_cache_log 中的 String 类型日志条目。 #41233 (jmimbrero).
- 在子查询中包含
OFFSET子句且在外层查询中包含WHERE子句的查询可能返回不正确的结果,此问题已修复。修复了 #40416。#41280(Alexander Tokmakov)。 - 修复在启用
query_plan_optimize_primary_key时可能产生的错误查询结果。对应修复 #40599。#41281(Nikolai Kochetov)。 - 不要让无效序列影响 lowerUTF8/upperUTF8 中的其他行。#41286 (Azat Khuzhin).
- 修复包含
Object类型列的ALTER <table> ADD COLUMN语句。#41290(Anton Popov)。 - 修复了在配置中没有
distributed_ddl.path时,从system.distributed_ddl_queue查询时出现 “No node” 错误的问题。修复了 #41096。#41296(young scott)。 - 修复磁盘对象存储中错误抛出的
Expected relative path逻辑错误。相关 issue:#41246。#41297(Kseniia Sumarokova)。 - 在 MsgPack 格式中插入 UUID 之前添加列类型检查。#41309(Kruglov Pavel)。
- 修复在异步插入(启用
async_insert设置)格式错误的数据到Object类型列后可能发生的崩溃问题。如果所有异步插入批次中的 JSON 都无效且无法解析,则可能会触发该问题。#41336 (Anton Popov)。 - 修复在使用 async_socket_for_remote/use_hedged_requests 与并发 KILL 时可能出现的死锁问题。#41343 (Azat Khuzhin).
- 默认关闭 optimize_rewrite_sum_if_to_count_if,以缓解相关问题:#38605 #38683。#41388(Denny Crane)。
- 自 22.8 版本起,如果数据库是
Replicated且集群名与数据库名相同,则会忽略ON CLUSTER子句。由于这一行为,DROP PARTITION ON CLUSTER在与Replicated一起使用时表现与预期不符。该问题已修复,现在只对在数据库级别被复制的查询忽略ON CLUSTER子句。修复了 #41299。#41390(Alexander Tokmakov)。 - 修复在取消查询(
KILL QUERY)或服务器关闭时可能出现的挂起/死锁问题。#41467 (Azat Khuzhin). - 修复在使用 JBOD 功能时可能导致服务器崩溃的问题。该修复解决了 #41365。#41483(Amos Bird)。
- 修复从可空固定字符串到字符串的转换。 #41541 (Duc Canh Le).
- 防止在向 groupBitmap* 传递错误聚合状态时发生崩溃。 #41563 (Raúl Marín).
- 带有
ORDER BY且满足1500 <= LIMIT <= max_block_size的查询,可能会返回结果开头缺少若干行的不正确结果。修复了 #41182。#41576(Nikolai Kochetov)。 - 修复在使用物化视图时 X-ClickHouse-Summary 中读取字节数/行数的统计。#41586(Raúl Marín)。
- 修复在带有
OFFSET的查询中可能出现的pipeline stuck(流水线卡住)异常。该错误是在enable_optimize_predicate_expression = 0且WHERE中条件恒为假时被发现的。修复了 #41383。#41588(Nikolai Kochetov)。
ClickHouse 22.8 版发布,2022-08-18
向后不兼容的变更
- 扩展了
Date32和DateTime64的范围,以支持从 1900 年到 2299 年的日期。在之前的版本中,仅支持从 1925 年到 2283 年的区间。实现采用的是前推格里高利历(符合 ISO 8601:2004(第 3.2.1 条“格里高利历”)),而不是考虑从儒略历到格里高利历的历史过渡。此变更会影响超出范围参数的特定实现行为。例如,在之前的版本中,值1899-01-01会被截断为1925-01-01,在新版本中则会被截断为1900-01-01。如果你传入INTERVAL 3 QUARTER,toStartOfInterval的舍入行为最多会改变一个季度,因为区间是从一个与实现相关的时间点开始计数的。关闭 #28216,改进 #38393。#39425(Roman Vasin)。 - 现在,所有相关的字典源都会遵守
remote_url_allow_hosts设置。此前已对 HTTP、Cassandra、Redis 生效。新增对 ClickHouse、MongoDB、MySQL、PostgreSQL 的支持。仅对通过 DDL 创建的字典进行主机检查。#39184(Nikolai Kochetov)。 - 预构建的 ClickHouse x86 二进制文件现在要求支持 AVX 指令,即 CPU 至少为 2011 年发布的 Intel Sandy Bridge / AMD Bulldozer 及之后的型号。#39000(Robert Schulze)。
- 使远程文件系统缓存可组合化,允许对某些文件(如 idx、mrk 等)不进行驱逐,并删除旧的缓存版本。现在可以在 Azure blob storage 磁盘、Local 磁盘、StaticWeb 磁盘等之上配置缓存。由于缓存配置发生了变化,并且为了让缓存正常工作需要更新配置文件,因此此 PR 被标记为向后不兼容。旧缓存在新配置下仍然会被使用。服务器在使用旧缓存配置时也能正常启动。关闭 https://github.com/ClickHouse/ClickHouse/issues/36140。关闭 https://github.com/ClickHouse/ClickHouse/issues/37889。([Kseniia Sumarokova](https://github.com/kssenii))。 #36171)
新功能
- 在 MergeTree 表上支持 SQL 标准的 DELETE FROM 语法,并为 MergeTree 系列表族实现轻量级删除。#37893 (Jianmei Zhang) (Alexander Gololobov)。注意:此新功能并不会使 ClickHouse 成为 HTAP 数据库管理系统 (DBMS)。
- 可以在交互模式下将查询参数设置为
SET param_abc = 'def',并通过原生协议作为设置传递。#39906 (Nikita Taranov)。 - 可以在原生协议中设置 quota 键。#39874 (Yakov Olkhovsky)。
- 新增设置
exact_rows_before_limit(0/1)。启用后,ClickHouse 将为rows_before_limit_at_least统计值提供精确值,但代价是 limit 之前的数据必须被完全读取。修复 #6613。#25333 (kevin wan)。 - 新增对使用
s3Cluster表函数进行并行分布式 insert select 的支持,目标表使用Distributed和Replicated引擎。#34670。#39107 (Nikita Mikhaylov)。 - 新增用于控制从文本格式推断 schema 的设置:-
input_format_try_infer_dates- 尝试从字符串推断日期。-input_format_try_infer_datetimes- 尝试从字符串推断日期时间。-input_format_try_infer_integers- 尝试推断为Int64而不是Float64。-input_format_json_try_infer_numbers_from_strings- 尝试在 JSON 格式中从 JSON 字符串推断数字。#39186 (Kruglov Pavel)。 - 提供以 JSON 格式输出日志的选项。其目的是便于在日志分析工具中更方便地进行日志的摄取和查询。#39277 (Mallik Hassan)。
- 新增函数
nowInBlock,允许在长时间运行的查询和连续查询期间获取当前时间。关闭了 #39522。注意:不存在now64InBlock和todayInBlock函数。#39533 (Alexey Milovidov)。 - 新增对为
executable()表函数指定设置的支持。#39681 (Constantine Peresypkin)。 - 实现了将数据库引擎从
Ordinary自动转换为Atomic。在flags目录中创建一个名为convert_ordinary_to_atomic的空文件,所有Ordinary数据库将在下次服务器启动时自动完成转换。解决 #39546。#39933 (Alexander Tokmakov)。 - 支持
SELECT ... INTO OUTFILE '...' AND STDOUT。#37490。#39054 (SmitaRKulkarni)。 - 新增格式
PrettyMonoBlock、PrettyNoEscapesMonoBlock、PrettyCompactNoEscapes、PrettyCompactNoEscapesMonoBlock、PrettySpaceNoEscapes、PrettySpaceMonoBlock、PrettySpaceNoEscapesMonoBlock。#39646 (Kruglov Pavel)。
性能优化
- 在内存高效合并聚合结果时优化了内存使用。#39429 (Nikita Taranov).
- 增加了并发控制逻辑,以限制查询创建的并发线程总数。 #37558 (Sergei Trifonov)。新增
concurrent_threads_soft_limit参数,通过限制所有查询的线程总数,在高 QPS 场景下提升性能。 #37285 (Roman Vasin)。 - 为未压缩缓存和 marks 缓存添加
SLRU缓存策略。(Kseniia Sumarokova). #34651 (alexX512). 将本地缓存功能与缓存算法解耦。#38048 (Han Shukai). - Intel® In-Memory Analytics Accelerator (Intel® IAA) 是适用于下一代 Intel® Xeon® 可扩展处理器(“Sapphire Rapids”)的硬件加速器。其目标是加速分析中常见的操作,例如数据压缩/解压缩和过滤。ClickHouse 新增了 “DeflateQpl” 压缩编解码器,它利用 Intel® IAA 的卸载技术提供高性能的 DEFLATE 实现。该编解码器使用了 Intel® Query Processing Library (QPL),该库对硬件加速器的访问进行了抽象封装,并在硬件加速器不可用时回退到软件实现。总体而言,DEFLATE 相比 ClickHouse 的默认编解码器 LZ4 提供了更高的压缩率,从而带来更少的磁盘 I/O 和更低的主内存消耗。#36654 (jasperzhu)。#39494 (Robert Schulze)。
- 在结合
ORDER BY使用DISTINCT时:根据输入流的排序描述推导出排序方式,如果输入流已经有序则跳过排序。#38719(Igor Nikonov)。显著改进内存使用和查询执行时间,并在DISTINCT列与ORDER BY列匹配时,对最终的 DISTINCT 使用DistinctSortedChunkTransform,但在EXPLAIN PIPELINE中将其重命名为DistinctSortedStreamTransform→ 这显著改善了内存使用情况,同时移除DistinctSortedChunkTransform的热点循环中不必要的分配。#39432(Igor Nikonov)。仅当排序描述适用于 DISTINCT 列时才使用DistinctSortedTransform,否则回退到普通的 DISTINCT 实现;这同时也减少了在执行DistinctSortedTransform期间所需的检查次数。#39528(Igor Nikonov)。修复:DistinctSortedTransform之前没有利用排序带来的优势。由于clearing_columns检测错误(始终为空),它从不清空 HashSet,因此基本上和普通DISTINCT(DistinctTransform)的行为一样。该修复显著降低了内存使用。#39538(Igor Nikonov)。 - 在执行
cluster及类似的表函数时,优先使用本地节点获取远程表的结构。 #39440 (Mingliang Pan). - 使用 AVX512VBMI2 压缩存储优化数值列过滤。#39633(Guo Wangyang)。对于支持 AVX512 VBMI2 的系统,此 PR 在 SSB 基准测试中,对 3.1、3.2 和 3.3 号查询(SF=100)的性能提升约 6%。在 Intel Ice Lake Xeon 8380 双路服务器上进行了测试。#40033(Robert Schulze)。
- 使用函数表达式优化多线程场景下的索引分析。 #39812 (Guo Wangyang).
- 针对复杂查询的优化:如果没有注册任何 UDF,则不要遍历 AST。#40069(Raúl Marín)。优化 CurrentMemoryTracker 的内存分配和释放。#40078(Raúl Marín)。
- 改进了 Base58 编码和解码功能。#39292(Andrey Zvonov)。
- 改进针对 SSE/AVX/AVX512 的字节到位掩码转换。 #39586 (Guo Wangyang)。
改进
- 规范化
AggregateFunction类型和状态表示,因为诸如 #35788 之类的优化会将count(not null columns)视为count(),这可能会导致分布式解释器报错,错误信息如下:Conversion from AggregateFunction(count) to AggregateFunction(count, Int64) is not supported。#39420(Amos Bird)。具有相同状态的函数可以在物化视图中互换使用。 - 重构并简化
system.backups表,删除internal列,允许用户设置操作 ID,新增列num_files、uncompressed_size、compressed_size、start_time、end_time。#39503(Vitaly Baranov)。 - 改进了
Replicated数据库的 DDL 查询结果表结构(将分片名和副本名拆分为单独的列,状态展示更加清晰)——当distributed_ddl_entry_format_version设置为 3(默认值)时,CREATE TABLE ... ON CLUSTER查询可以先在发起节点进行规范化。这意味着如果发起节点不属于查询中指定的集群,则ON CLUSTER查询可能无法执行。修复了 #37318、#39500 —— 当数据库为Replicated且集群名与数据库名相同时,忽略ON CLUSTER子句。与 #35570 相关 —— 对Replicated数据库引擎进行其他一些杂项小修复 —— 在启动Replicated数据库时检查元数据一致性,如果本地元数据与 Keeper 中的元数据不匹配,则启动副本恢复。解决了 #24880。#37198(Alexander Tokmakov)。 - 在进度报告(
X-ClickHouse-Summary)中添加 result_rows 和 result_bytes。 #39567 (Raúl Marín)。 - 改进 MergeTree 主键分析。#25563 (Nikolai Kochetov)。
timeSlots现已支持 DateTime64;在使用 DateTime64 时可以使用子秒级的持续时间和槽大小。#37951 (Andrey Zvonov)。- 为
EmbeddedRocksDB表新增对LEFT SEMI和LEFT ANTI直接 JOIN 操作的支持。#38956 (Vladimir C). - 为 fsync 操作添加 profile_events 事件。#39179 (Azat Khuzhin).
- 为普通函数
file(path[, default])添加第二个参数,当文件不存在时,函数返回该参数指定的值。 #39218 (Nikolay Degterinsky). - 针对通过 HTTP 读取进行了一些小修复,在返回 200 OK 时允许对部分内容进行重试。#39244(Kseniia Sumarokova)。
- 支持执行形如
CREATE TEMPORARY TABLE ... (<list of columns>) AS ...的查询。 #39462 (Kruglov Pavel). - 为自定义 TLD 添加对
!/*(感叹号/星号)的支持(cutToFirstSignificantSubdomainCustom()/cutToFirstSignificantSubdomainCustomWithWWW()/firstSignificantSubdomainCustom())。 #39496 (Azat Khuzhin). - 为 NATS 新增对 TLS 连接的支持。实现了 #39525。#39527(Constantine Peresypkin)。
clickhouse-obfuscator(用于数据库脱敏,以进行测试和负载生成的工具)现在新增了--save和--load参数,可与预训练模型配合使用。此更改关闭了 #39534。#39541(Alexey Milovidov)。- 修复重启时日志轮转行为不正确的问题。 #39558 (Nikolay Degterinsky).
- 修复在启用外部聚合时构建聚合投影的问题。标记为改进项,因为这种情况较为罕见,并且可以通过修改设置这一简单变通方案来修复。此更改修复了 #39667。#39671(Amos Bird)。
- 允许哈希函数接受
Map类型的参数进行计算。 #39685 (Anton Popov). - 添加一个配置参数,用于在调用栈追踪中隐藏地址。这可能在一定程度上提升安全性,但总体而言是有害的,不应使用。#39690 (Alexey Milovidov).
- 更改 AggregateFunctionDistinct 的前缀大小,以确保嵌套函数数据的内存段对齐。#39696 (Pxl)。
- 对传递给
clickhouse-diagnostic工具的凭证进行正确转义。#39707 (Dale McDiarmid)。 - ClickHouse Keeper 的改进:在退出时创建快照。可以通过配置项
keeper_server.create_snapshot_on_exit控制,默认值为true。#39755 (Antonio Andelic)。 - 支持对
row_policy_filter和additional_filter进行主键分析。这也有助于修复类似 #37454 的问题。#39826(Amos Bird)。 - 修复 Play UI 中的两个可用性问题:- 由于多余的圆角和边距,在 iPad 上无法实现像素级精确显示;- 在首次查询之后的后续查询中不再显示进度指示。此更改关闭 #39957。此更改关闭 #39960。#39961(Alexey Milovidov)。
- Play UI:添加行号;点击单元格时支持选中;为表格单元格添加滞后处理。#39962 (Alexey Milovidov)。
- Play UI:在 textarea 中识别 Tab 键,同时不影响 Tab 导航。#40053(Alexey Milovidov)。
- 客户端将显示服务器端耗时。这对于比较远程数据中心中 ClickHouse 服务的性能非常重要。此更改关闭了 #38070。有关动机参见此处。#39968(Alexey Milovidov)。
- 添加了
parseDateTime64BestEffortUS、parseDateTime64BestEffortUSOrNull、parseDateTime64BestEffortUSOrZero函数,从而关闭了 #37492。#40015(Tanya Bragin)。 - 将
system.processors_profile_log扩展为包含更多信息,例如输入行数。 #40121 (Amos Bird)。 - 自 ClickHouse 22.8 版本起,如果可用,默认在
clickhouse-benchmark中显示服务器端时间。这样可以正确比较不同云环境的性能。可以通过新的--client-side-time命令行选项更改此行为。将--randomize命令行选项从--randomize 1改为不带参数的形式。 #40193 (Alexey Milovidov)。 - 为在设置了查询复杂度限制并触达该限制的场景添加计数器(ProfileEvents),并针对
overflow_mode=break和throw分别提供独立计数器。例如,如果你设置了max_rows_to_read且read_overflow_mode = 'break',通过查看OverflowBreak计数器的值,可以区分不完整的结果。#40205(Alexey Milovidov)。 - 修复在出现 "Memory limit exceeded" 错误时的内存统计问题(此前 [peak] 内存使用量会将分配失败的内存也计入)。#40249 (Azat Khuzhin).
- 为文件系统缓存新增指标:
FilesystemCacheSize和FilesystemCacheElements。#40260(Kseniia Sumarokova)。 - 支持 Hadoop 安全的 RPC 传输(hadoop.rpc.protection=privacy 和 hadoop.rpc.protection=integrity)。#39411 (michael1589)。
- 避免在使用函数 multi(Fuzzy)Match(Any|AllIndices|AnyIndex)() 时出现模式缓存内存占用持续增长的问题。#40264 (Robert Schulze)。
构建/测试/打包改进
- ClickFiddle: 一款用于在读/写模式下测试各个 ClickHouse 版本的新工具(Igor Baliuk)。
- ClickHouse 二进制文件已改为自解压格式 #35775 (Yakov Olkhovskiy, Arthur Filatenkov).
- 将 tzdata 更新为 2022b 以支持新的时区变更。参见 https://github.com/google/cctz/pull/226。智利 2022 年的夏令时(DST)开始时间从 9 月 4 日推迟到 9 月 11 日。伊朗计划在 2022-09-21 回退之后永久停止实行夏令时。对 1977 年 Asia/Tehran 的历史时区信息进行了修正:伊朗是在 1935 年而不是 1946 年采用标准时间。1977 年它在 03-21 23:00 到 10-20 24:00 期间实行夏令时;其 1978 年的切换时间是 03-24 和 08-05,而不是 03-20 和 10-20;其 1979 年春季的切换时间是 05-27,而不是 03-21(https://data.iana.org/time-zones/tzdb/NEWS)。(Alexey Milovidov)。
- 以前的安装包会将
systemd.service文件安装到/etc中。那里的文件被标记为conf,不会被清理或自动更新。此 PR 会将这些遗留文件清理掉。#39323 (Mikhail f. Shiryaev)。 - 确保 LSan 生效。#39430(Azat Khuzhin)。
- 由于 TSAN 在 clang-14 中存在问题(https://github.com/google/sanitizers/issues/1552、https://github.com/google/sanitizers/issues/1540),这里我们使用 clang-15 构建 TSAN 二进制文件。#39450(Mikhail f. Shiryaev)。
- 移除将 ClickHouse 工具构建为独立可执行程序的选项。修复了 #37847。#39520(Alexey Milovidov)。
- 为在 s390x(大端序)架构上构建做了一些小的准备工作。 #39627 (Harry Lee). #39656 (Harry Lee). 修复了 s390x 上 BitHelpers 中的字节序问题。 #39656 (Harry Lee). 为 s390x 架构(ClickHouse 当前不支持)实现了一部分与 SipHash 相关的代码。 #39732 (Harry Lee). 修复了 s390x 架构(ClickHouse 当前不支持)在 Coordination 快照代码中的字节序问题。 #39931 (Harry Lee). 修复了 s390x 架构(ClickHouse 当前不支持)在 Codec 代码中的字节序问题。 #40008 (Harry Lee). 修复了 s390x 架构(ClickHouse 当前不支持)在 ReadHelpers 和 WriteHelpers 代码中读写大端序二进制数据时的字节序问题。 #40179 (Harry Lee).
- 添加对使用
clang-16(trunk)进行构建的支持。此更改关闭了 #39949。#40181(Alexey Milovidov)。 - 为在 CI 中运行准备 RISC-V 64 构建。这是针对 #40141。#40197(Alexey Milovidov)。
- 简化了函数注册宏接口(
FUNCTION_REGISTER*),从而省去了在 registerFunctions.cpp 中添加并调用extern函数的步骤,同时也加快了新函数的增量编译速度。#38615 (Li Yin)。 - Docker:现在 Docker 镜像中的 entrypoint.sh 会为在多磁盘(multidisk)配置中找到的所有文件夹生成并执行 chown 命令 #17717。#39121(Nikita Mikhaylov)。
错误修复
- 修复
CapnProto输入格式中可能出现的段错误。该缺陷由 kiojj 发现并通过 ClickHouse 漏洞赏金计划提交。#40241(Kruglov Pavel)。 - 修复数组下标运算符在极少数情况下的错误行为。此更改关闭了 #28720。#40185(Alexey Milovidov)。
- 修复了加密函数中参数检查不足的问题(由 query fuzzer 发现),从而关闭了 #39987。#40194(Alexey Milovidov)。
- 修复在将
IN运算符与包含多列的ENGINE = Set表一起使用时,列顺序可能不正确的问题。此修复解决了 #13014。#40225(Alexey Milovidov)。 - 修复从加密磁盘读取数据时的 seek 行为。本 PR 修复了 #38381。#39687(Vitaly Baranov)。
- 修复 JOIN 计划中的重复列。最终解决 #26809。#40009(Vladimir C)。
- 修复了在对包含不同日期/时间类型的列执行带有 ORDER BY WITH FILL 的 SELECT 查询时发生的挂起问题。 #37849 (Yakov Olkhovskiy).
- 修复当 ORDER BY 与投影的 ORDER BY 相匹配时的行为(此前会返回未排序的结果)。#38725(Azat Khuzhin)。
- 如果
GROUP BY语句中的函数会与某个表列或表达式同名(shadow)从而将其遮蔽,则不要对这些函数进行优化。修复了 #37032。#39103(Anton Kozlov)。 - 在执行 RENAME TABLE 后修正日志中的错误表名。此更改修复了 #38018。#39227 (Amos Bird)。
- 在进行查询优化时,修复在列裁剪情况下的位置参数处理问题。关闭 #38433。#39293(Kseniia Sumarokova)。
- 修复了在 Protobuf/CapnProto 格式中消息为空时的模式推断(schema inference)错误,该错误会导致创建空
Tuple类型的列。关闭 #39051。新增 2 个设置项input_format_{protobuf/capnproto}_skip_fields_with_unsupported_types_in_schema_inference,允许在对 Protobuf 和 CapnProto 格式进行模式推断时跳过类型不受支持的字段。#39357 (Kruglov Pavel)。 - (Window View 是一项实验性功能)修复在执行
CREATE WINDOW VIEW .. ON CLUSTER ... INNER时出现的段错误,关闭 #39363。#39384(Kseniia Sumarokova)。 - 修复在取消执行 INSERT INTO FUNCTION 时的 WriteBuffer finalize 行为(在早期版本中可能会导致调用 std::terminate)。#39458(Kruglov Pavel)。
- 修复在稀疏序列化中对
Object类型列的存储。#39464(Anton Popov)。 - 修复在使用投影时可能出现的 "Not found column in block" 异常。该修复关闭了 #39469。#39470(小路)。
- 修复 DROP 和 INSERT 与物化视图之间竞态时的异常。 #39477 (Azat Khuzhin).
- Apache Avro 库中的一个缺陷:修复 Avro 格式中的数据竞争以及可能出现的堆缓冲区溢出问题。关闭了 #39094 和 #33652。#39498(Kruglov Pavel)。
- 修复在启用
O_DIRECT(通过设置min_bytes_to_use_direct_io)并使用异步读取方法(将local_filesystem_read_method设置为pread_threadpool)时出现的罕见 bug。#39506 (Anton Popov). - (仅在 FreeBSD 上)修复在 FreeBSD 上启动 ClickHouse 时出现的 "Code: 49. DB::Exception: FunctionFactory: the function name '' is not unique. (LOGICAL_ERROR)" 错误。#39551 (Alexander Gololobov).
- 修复了最近为
splitByChar引入的maxsplit参数未正确生效的问题。#39552 (filimonov). - 修复在启用
enable_optimize_predicate_expression时 ASOF JOIN 的问题,关闭 #37813。#39556(Vladimir C)。 - 修复了在
ON CLUSTER或Replicated数据库中针对ReplicatedMergeTree执行CREATE/DROP INDEX查询时的问题。此前这些查询会在所有副本上执行(导致报错或 DDL 队列卡住)。修复了 #39511。#39565(Alexander Tokmakov)。 - 修复在进行 join 下推时出现的 "column not found" 错误,关闭 #39505。#39575(Vladimir C)。
- 修复
REGEXP_REPLACE的错误别名。此更改修复了 https://github.com/ClickHouse/ClickBench/issues/9。#39592(Alexey Milovidov)。 - 将指数衰减窗口函数的衰减起点固定为窗口中的最后一行值。之前,衰减是通过公式
exp((t - curr_row_t) / decay_length)计算的,当窗口右边界不是CURRENT ROW时这是不正确的。现在改为:exp((t - last_row_t) / decay_length)。对于使用ROWS BETWEEN (smth) AND CURRENT ROW的窗口,计算结果没有变化。#39593 (Vladimir Chebotaryov)。 - 修复 Decimal 除法溢出问题,该问题可以基于操作数的小数位(scale)来检测。#39600(Andrey Zvonov)。
- 修复设置
output_format_arrow_string_as_string和output_format_arrow_low_cardinality_as_dictionary在组合使用时的行为。关闭了 #39624。#39647(Kruglov Pavel)。 - 修复了分布式表读取中默认数据库解析的问题。#39674(Anton Kozlov)。
- (仅在已废弃的 Ordinary 类型数据库中)在使用 mmap I/O 缓存、数据库引擎为 Ordinary 且创建了与已删除表同名的新表时,
SELECT可能会读取到已删除表的数据。该问题已修复。#39708 (Alexander Tokmakov)。 - 修复可能出现的错误
Invalid column type for ColumnUnique::insertRangeFrom. Expected String, got ColumnLowCardinality,对应修复了 #38460。#39716(Arthur Passos)。 - JSON 格式中
meta部分的字段名被错误地进行了双重转义处理。已关闭 #39693。#39747(Alexey Milovidov)。 - 修复在使用元组和运算符
IN时的错误索引分析,可能导致查询结果不正确。 #39752 (Anton Popov). - 修复
EmbeddedRocksDB表在使用参数按键进行过滤时的错误。 #39757 (Antonio Andelic). - 修复因 ARRAY JOIN 优化导致的错误
Invalid number of columns in chunk pushed to OutputPort,解决了 #39164。#39799(Nikolai Kochetov)。 - 针对 Linux 内核中一个 bug 的变通方案。通过将
local_filesystem_read_method设置为pread_threadpool来修复CANNOT_READ_ALL_DATA异常。根据 man,此 bug 仅影响 Linux 内核 5.9 和 5.10 这两个版本。#39800(Anton Popov)。 - (仅限 NFS) 修复在启用 root-squash 的卷上 NFS mkdir 失败的问题。 #39898 (Constantine Peresypkin).
- 在执行 DETACH/DROP 时,从 Prometheus 指标中移除字典。 #39926 (Azat Khuzhin).
- 修复对带有虚拟列的 StorageFile 的读取,关闭 #39907。#39943(flynn)。
- 修复在获取数据时过高的内存占用。修复了 #39915。#39990(Nikolai Kochetov)。
- (实验性特性)修复
hashId崩溃以及 salt 参数没有被使用的问题。#40002 (Raúl Marín)。 - 在使用特定组合的常量列和非常量列时,
EXCEPT和INTERSECT运算符可能会导致崩溃。 #40020 (Duc Canh Le). - 修复了在 INSERT 过慢或合并 / mutation 过程耗时过长时出现的 “Part directory doesn't exist” 和 “
tmp_<part_name>... No such file or directory” 错误。还修复了这样一种情况:如果之前获取数据片段(part)的尝试失败,但未清理tmp-fetch_<part_name>目录,则可能导致某些复制队列条目卡住,而在日志中没有任何错误或警告。 #40031 (Alexander Tokmakov)。 - 修复在
Values格式中解析元组数组时的罕见解析问题。#40034 (Anton Popov). - 修复了 ArrowColumn 格式中 Dictionary(X) 和 Dictionary(Nullable(X)) 分别转换为 ClickHouse 的 LowCardinality(X) 和 LowCardinality(Nullable(X)) 时的问题。 #40037 (Arthur Passos).
- 修复在任务调度失败时向 S3 写入可能发生的死锁问题。 #40070 (Maksim Kita).
- 通过为需要重新计算的索引添加正确的文件扩展名(.idx 或 .idx2),修复
collectFilesToSkip()中的 bug,避免产生不正确的硬链接。已修复 #39896。#40095(Jianmei Zhang)。 - 针对反向 DNS 解析的修复。#40134 (Arthur Passos)。
- 修复在
Array(UInt32)上使用arrayDifference时出现的意外结果。#40211 (Duc Canh Le).
ClickHouse 发布 22.7,2022-07-21
升级说明
- 默认启用
enable_positional_arguments设置。它允许像SELECT ... ORDER BY 1, 2这样的查询,其中 1、2 表示对 SELECT 子句中列位置的引用。如需恢复旧行为,请禁用该设置。#38204(Alexey Milovidov)。 - 默认禁用
format_csv_allow_single_quotes。参见 #37096。(Kruglov Pavel)。 Ordinary数据库引擎以及用于*MergeTree表的旧存储定义语法已弃用。默认情况下,不允许使用Ordinary引擎创建新的数据库。如果system数据库使用Ordinary引擎,它将在服务器启动时自动转换为Atomic。可以通过设置(allow_deprecated_database_ordinary和allow_deprecated_syntax_for_merge_tree)保留旧行为,但这些设置可能会在未来版本中移除。#38335(Alexander Tokmakov)。- 默认强制将逗号 join 重写为 INNER JOIN(将默认值设置为
cross_to_inner_join_rewrite = 2)。如需旧行为,请设置cross_to_inner_join_rewrite = 1。#39326(Vladimir C)。如遇任何不兼容问题,可以将该设置恢复为之前的值。
新功能
- 支持包含窗口函数的表达式。修复 #19857。#37848(Dmitry Novik)。
- 为
EmbeddedRocksDB表添加新的directJOIN 算法,参见 #33582。#35363(Vladimir C)。 - 新增了全排序合并 JOIN 算法。 #35796 (Vladimir C).
- 实现了 NATS 表引擎,支持与 NATS 之间的发布/订阅(pub/sub)。关闭了 #32388。#37171(tchepavel)。(Kseniia Sumarokova)
- 实现
mongodb表函数,允许向MongoDB存储 / 表函数写入数据。 #37213 (aaapetrenko). (Kseniia Sumarokova) - 新增
SQLInsert输出格式。关闭了 #38441。#38477(Kruglov Pavel)。 - 引入了设置
additional_table_filters。使用该设置,可以为表指定在读取数据后立即应用的额外过滤条件。例如:select number, x, y from (select number from system.numbers limit 5) f any left join (select x, y from table_1) s on f.number = s.x settings additional_table_filters={'system.numbers : 'number != 3', 'table_1' : 'x != 2'}。引入了设置additional_result_filter,用于为查询结果指定额外的过滤条件。关闭 #37918。#38475(Nikolai Kochetov)。 - 添加
compatibility设置和system.settings_changes系统表,用于记录跨 ClickHouse 版本的设置变更信息。关闭 #35972。#38957(Kruglov Pavel)。 - 添加函数
translate(string, from_string, to_string)和translateUTF8(string, from_string, to_string),用于将部分字符替换为其他字符。#38935(Nikolay Degterinsky)。 - 支持
parseTimeDelta函数。使用该函数时,;-+,:可以用作分隔符,例如:1yr-2mo、2m:6s:SELECT parseTimeDelta('1yr-2mo-4w + 12 days, 3 hours : 1 minute ; 33 seconds')。#39071(jiahui-97)。 - 新增
CREATE TABLE ... EMPTY AS SELECT查询。它会自动根据 SELECT 查询推断表结构,但在创建后不会向表中填充数据。解决了 #38049。#38272(Alexander Tokmakov)。 - 添加了用于限制远程存储 IO 操作的配置项:
max_remote_read_network_bandwidth_for_server和max_remote_write_network_bandwidth_for_server。#39095(Sergei Trifonov)。 - 添加
group_by_use_nulls设置,使在使用 ROLLUP、CUBE 和 GROUPING SETS 时聚合键列可以为 Nullable。关闭问题 #37359。#38642(Dmitry Novik)。 - 新增在数据导出时指定压缩级别的功能。#38907 (Nikolay Degterinsky).
- 新增选项,要求必须显式授予权限才能对
system数据库执行 SELECT。详情:#38970(Vitaly Baranov)。 - 函数
multiMatchAny、multiMatchAnyIndex、multiMatchAllIndices及其模糊匹配变体现在可以接受非常量的模式数组参数。#38485(Robert Schulze)。SQL 函数multiSearchAllPositions现在可以接受非常量的 needle 参数。#39167(Robert Schulze)。 - 新增设置项
zstd_window_log_max,用于在导入外部文件时配置 zstd 解码的最大内存占用。修复 #35693。#37015(wuxiaobai24)。 - 添加
send_logs_source_regexp设置。发送服务器文本日志时,使用指定的正则表达式匹配日志源名称。留空表示匹配所有来源。#39161 (Amos Bird)。 - 支持对
Hive表执行ALTER操作。#38214 (lgbo)。 - 支持
isNullable函数。该函数用于检查其参数是否可为空,并返回 1 或 0。修复 #38611。#38841(lokax)。 - 新增了 base58 编码/解码函数。#38159 (Andrey Zvonov)。
- 在 Play UI 中添加图表可视化功能。#38197 (Alexey Milovidov)。
- 为数组和元组新增了 L2 平方距离和范数函数。#38545 (Julian Gilyadov)。
- 支持通过 SQL 将 HTTP 头传递给
url表函数 / 表引擎。修复 #37897。#38176(Kseniia Sumarokova)。 - 将
clickhouse-diagnostics二进制文件添加到软件包中。#38647 (Mikhail f. Shiryaev)。
实验性功能
- 新增设置项
implicit_transaction,用于将单条查询作为一个事务来运行。它会自动处理事务的创建和结束(如果查询成功则执行 COMMIT,如果失败则执行 ROLLBACK)。#38344(Raúl Marín)。
性能优化
- 针对已排序列的 distinct 优化。当输入流按照 distinct 中的列进行排序时,使用专门的 distinct 转换。该优化可应用于前置 distinct、最终 distinct,或同时应用于二者。首个实现由 @dimarub2000 完成。#37803(Igor Nikonov)。
- 通过使用
BinaryHeap的批处理版本,提升ORDER BY、MergeTree合并以及窗口函数的性能。#38022(Maksim Kita)。 - 为使用
FINAL的查询提供了更高的并行执行度 #36396(Nikita Taranov)。 - 修复了在 #35616 中引入的严重 join 性能退化问题。有趣的是,像 ssb 查询这样常见的 join 查询在将近 3 个月里一直慢了 10 倍,却没有人反馈。#38052(Amos Bird)。
- 从 Intel Hyperscan 库迁移到 vectorscan,这在非 x86 平台上能加速大量字符串匹配操作。#38171(Robert Schulze)。
- 提高了聚合之后执行的查询计划各步骤的并行度。 #38295 (Nikita Taranov).
- 提升向
JSON类型列插入数据时的性能。 #38320 (Anton Popov). - 对 HashTable 的插入和查找进行了优化。#38413 (Nikita Taranov).
- 修复由 #32493 引起的性能退化问题。#38417(Alexey Milovidov)。
- 使用 SIMD 指令提升对数值列进行 JOIN 时的性能。 #37235 (zzachimed). #38565 (Maksim Kita).
- 数组 Norm 和 Distance 函数的性能提升了 1.2–2 倍。 #38740 (Alexander Gololobov).
- 为 LZ4 解压添加经过 AVX-512 VBMI 优化的
copyOverlap32Shuffle,从而提升 LZ4 解压性能。#37891 (Guo Wangyang)。 ORDER BY (a, b)将与ORDER BY a, b一样享有全部优势。#38873 (Igor Nikonov)。- 通过在 32 字节边界上对齐分支,使基准测试更加稳定。 #38988 (Guo Wangyang)。这在 Intel 平台上平均可带来 1% 到 2% 的性能提升。
- 可执行 UDF、可执行字典以及 Executable 表在等待子进程终止时将不再白白浪费 1 秒钟。#38929(Constantine Peresypkin)。
- 当未选择所有列时,优化对
system.stack_trace表的访问。#39177 (Azat Khuzhin)。 - 优化 isNullable/isConstant/isNull/isNotNull 在 LowCardinality 参数上的性能。 #39192 (Kruglov Pavel).
- 对窗口函数中的 ORDER BY 处理进行了优化。#34632(Vladimir Chebotarev)。
- 表
system.asynchronous_metric_log在存储空间方面进行了进一步优化,从而解决了 #38134。详见 YouTube 视频。#38428(Alexey Milovidov)。
改进
- 支持 SQL 标准的 CREATE INDEX 和 DROP INDEX 语法。 #35166 (Jianmei Zhang).
- 支持为 INSERT 查询发送 ProfileEvents 事件(此前仅支持 SELECT)。#37391 (Azat Khuzhin).
- 为完全物化投影实现按顺序聚合(
optimize_aggregation_in_order)。#37469 (Azat Khuzhin)。 - 移除通过子进程执行的 Kerberos 初始化。新增集成测试。关闭 #27651。#38105(Roman Vasin)。
-
- 添加配置项
multiple_joins_try_to_keep_original_names,从而在多重 JOIN 重写时不再重写标识符名称,关闭问题 #34697。#38149(Vladimir C)。
- 添加配置项
- 改进了 trace visualizer 的用户体验。 #38169 (Sergei Trifonov).
- 在 AArch64 上启用堆栈跟踪采集和查询分析器。 #38181 (Maksim Kita).
- 在加载 SQL 用户自定义函数时,不再跳过
user_defined目录下的符号链接。修复了 #38042。#38184(Maksim Kita)。 - 在
store/中新增了子目录的后台清理功能。在某些情况下,clickhouse-server 可能会在store/中留下无效子目录(例如在建表失败时),而这些目录此前不会被自动删除。修复 #33710。#38265(Alexander Tokmakov)。 - 添加
DESCRIBE CACHE查询,用于显示配置中的缓存设置。添加SHOW CACHES查询,以显示可用的文件系统缓存列表。#38279 (Kseniia Sumarokova)。 - 为
system drop filesystem cache添加访问权限检查,并支持 ON CLUSTER。#38319 (Kseniia Sumarokova)。 - 修复从 21.3 升级到 22.3 时出现的 PostgreSQL 数据库引擎不兼容问题,解决了 #36659。#38369(Kseniia Sumarokova)。
filesystemAvailable等函数现在可以在clickhouse-local中使用,从而解决了 #38423。#38424(Alexey Milovidov)。- 新增
revision函数。 #38555 (Azat Khuzhin). - 修复通过代理隧道访问 GCS 时的问题。 #38726 (Azat Khuzhin).
- 在 clickhouse client/local 中支持
\i file(类似于 psql 的 \i)。#38813 (Kseniia Sumarokova). - 在
EXPLAIN AST中新增选项optimize = 1。如果启用该选项,会显示重写后的 AST,否则显示原始查询的 AST。默认关闭。#38910 (Igor Nikonov)。 - 允许在列列表末尾使用逗号。修复 #38425。#38440(chen)。
- 对
parallel_hashJOIN 方法进行了缺陷修复和性能优化。#37648 (Vladimir C)。 - 支持 Hadoop 安全 RPC 传输(hadoop.rpc.protection=privacy 和 hadoop.rpc.protection=integrity)。#37852 (Peng Liu).
- 在
StorageHive中添加结构体类型支持。#38118 (lgbo)。 - 现在通过
RemoveObjectRequest删除 S3 的单个对象。实现了与 GCP 的兼容性,此前 GCP 不允许有效使用removeFileIfExists,实际上导致大约一半的remove功能不可用。对DeleteObjectsS3 API 进行自动检测,因为 GCS 不支持该 API。这样就可以在配置中不必显式设置support_batch_delete=0也能使用 GCS。#37882(Vladimir Chebotarev)。 - 暴露与 ClickHouse Keeper 相关的基本监控数据(通过 ProfileEvents 和 CurrentMetrics)。 #38072 (lingpeng0314).
- 为 PostgreSQL 引擎连接添加对
auto_close选项的支持。修复 #31486。#38363(Kseniia Sumarokova)。 - 在表函数中定义列时允许使用
NULL修饰符。#38816 (Kruglov Pavel). - 在关闭前停用
mutations_finalizing_task,以避免在关闭过程中出现无害的TABLE_IS_READ_ONLY错误。#38851 (Raúl Marín). - 在存在 INSERT 查询的情况下,如果使用已弃用的
Ordinary数据库,消除了 ALTER 查询之后 SELECT 查询不必要的等待。#38864 (Azat Khuzhin)。 - 在
EXPLAIN AST中新增选项rewrite。如果启用,则显示重写后的 AST,否则显示原始查询的 AST。默认情况下为禁用状态。#38910 (Igor Nikonov)。 - 当这些异常属于预期行为时,不再在 system.errors 中记录 Zookeeper “Node exists” 异常。#38961 (Raúl Marín)。
clickhouse-keeper:添加对实时摘要计算与校验的支持。该功能默认禁用。#37555 (Antonio Andelic)。- 允许在
clickhouse-extract-from-config工具的键名中使用 glob 通配模式,如*或{expr1, expr2, expr3}。#38966 (Nikita Mikhaylov)。 - clearOldLogs: 在并发删除期间不再报告 KEEPER_EXCEPTION。 #39016 (Raúl Marín).
- clickhouse-keeper 改进:将 keeper 服务器的元信息持久化到磁盘。#39069(Antonio Andelic)。这将使在需要同时关闭或重启所有 keeper 节点时的运维更加简单。
- 在使用文件系统缓存时,当磁盘空间不足时不再抛出异常,而是继续运行。 #39106 (Kseniia Sumarokova).
- 处理来自 k8s 的 SIGTERM 信号。 #39130 (Timur Solodovnikov).
- 在 system.part_log 中新增
merge_algorithm列(取值:Undecided、Horizontal、Vertical)。#39181 (Azat Khuzhin). - 当磁盘为非旋转介质时,不要在
system.errors中递增计数器。#39216(Raúl Marín)。 - 在
system.query_log中,针对INSERT查询的指标result_bytes表示插入的字节数。此前该值不正确,而是存储了与result_rows相同的数值。#39225(Ilya Yatsishin)。 clickhouse-client中的 CPU 使用率指标将以更直观的方式展示。修复了 #38756。#39280(Sergei Trifonov)。- 在服务器启动过程中初始化文件系统缓存时重新抛出异常,并提供更清晰的错误信息。#39386(Kseniia Sumarokova)。
- OpenTelemetry 现在默认收集 traces 时不会包含 Processors spans(因为数量过多)。要启用 Processors spans 的收集,请通过设置
opentelemetry_trace_processors来实现。#39170 (Ilya Yatsishin). - 函数
multiMatch[Fuzzy](AllIndices/Any/AnyIndex)- 当 needle 参数为空时将不再抛出逻辑错误。#39012 (Robert Schulze). - 允许声明不带默认参数
x-max-length和x-overflow的RabbitMQ队列。#39259 (rnbondarenko)。
构建/测试/打包改进
- 将 Clang Thread Safety Analysis (TSA) 注解应用到 ClickHouse。#38068 (Robert Schulze).
- 调整通用安装脚本以支持 FreeBSD。#39302 (Alexey Milovidov).
- 为在
s390x平台上构建做准备。#39193 (Harry Lee). - 修复
jemalloc库中的一个 bug。#38757 (Azat Khuzhin). - 硬件基准测试现在支持自动上传结果。#38427 (Alexey Milovidov).
- 在 Mac(Darwin)上,系统表
system.licenses现已正确填充。#38294 (Robert Schulze). - 将
all|noarch软件包改为与架构相关的软件包;修正相应文档;将 aarch64|arm64 软件包推送到 Artifactory 和发行附件中;修复 #36443。#38580 (Mikhail f. Shiryaev).
错误修复(官方稳定版或预发布版本中用户可见的异常行为)
- 修复
Decimal128/Decimal256在小数位(scale)超过 19 位时的舍入问题。#38027(Igor Nikonov)。 - 修复了由于
Hive存储引擎(集成表引擎)中的数据竞争导致的崩溃。#38887 (lgbo)。 - 修复在执行带有 ON CLUSTER 的
GRANT ALL ON *.*时发生的崩溃。该问题是在 https://github.com/ClickHouse/ClickHouse/pull/35767 中引入的。此更改关闭了 #38618。#38674(Vitaly Baranov)。 - 在
{0..10}这种形式下正确进行 glob 展开。修复了 #38498。当前实现与 shell 的行为类似,如 @rschu1ze 在这里提到的那样。#38502(Heena Bansal)。 - 修复了在使用常量 map 参数时
mapUpdate、mapFilter函数发生的崩溃问题。关闭 #38547。#38553(hexiaoting)。 - 修复用于查询优化的
toHour单调性信息,该问题可能导致错误的索引分析并产生不正确的查询结果。此修复对应 #38333。#38675(Amos Bird)。 - 修复检查 S3 存储是否支持并行写入的逻辑,从而导致的 S3 并行写入无法工作的问题。#38792 (chen).
- 使用并行读取缓冲区修复 S3 可随机读取(影响了查询期间的内存使用)。关闭 #38258。#38802(Kseniia Sumarokova)。
- 更新
simdjson。此更新修复了 #38621 —— 在配备最新、支持 AVX-512 VBMI 的 Intel CPU 的机器上出现的缓冲区溢出问题。#38838(Alexey Milovidov)。 - 修复 Vertical merges 中潜在的逻辑错误。 #38859 (Maksim Kita).
- 修复设置配置文件中的秒单位。#38896(Raúl Marín)。
- 修复了在分区键为 Nullable 时分区裁剪不正确的问题。注意:你很可能没有在使用 Nullable 分区键——这是一个非常小众的特性,你不应该使用。Nullable 键本身并不合理,这个特性只是为了满足一些极端用例才存在。本次修复了 #38941。#38946(Amos Bird)。
- 改进用于拉取操作的
fsync_part_directory。 #38993 (Azat Khuzhin). - 修复
OvercommitTracker中可能出现的死锁。对应问题 #37794。#39030(Dmitry Novik)。 - 修复了文件系统缓存中的一个错误,该错误可能在某些边缘情况下、且恰逢缓存容量达到上限时触发。关闭 #39066。#39070(Kseniia Sumarokova)。
- 修复窗口表达式参数解析的一些边缘情况。修复 #38538,允许在窗口表达式中使用高阶函数。#39112 (Dmitry Novik)。
- 在
tuple函数中保留LowCardinality类型。此前,LowCardinality类型会被丢弃,新创建的tuple中各元素将使用LowCardinality的底层类型。#39113(Anton Popov)。 - 修复了在向附加了物化视图的表执行 INSERT 且启用了设置
extremes = 1时可能出现的Block structure mismatch错误。关闭了 #29759 和 #38729。#39125(Nikolai Kochetov)。 - 修复在同时将
optimize_trivial_count_query和empty_result_for_aggregation_by_empty_set设为 true 时出现的意外查询结果。此更改修复了问题 #39140。#39155(Amos Bird)。 - 修复了在带有
PREWHERE和顺序读取优化的 SELECT 查询中出现的错误Not found column Type in block。 #39157 (Yakov Olkhovskiy). - 修复在远程文件系统创建硬链接时出现的极其罕见的竞态条件。唯一可复现的方法是并发执行备份任务。#39190 (alesapin)。
- (zero-copy replication 是一个实验性特性,不应在生产环境中使用)修复在使用
allow_remote_fs_zero_copy_replication获取内存中分片时的问题。#39214 (Azat Khuzhin)。 - (MaterializedPostgreSQL - 实验性功能)。修复 MaterializedPostgreSQL 数据库引擎中的段错误,该问题可能在复制初始化期间发生异常时被触发。关闭 #36939。#39272 (Kseniia Sumarokova)。
- 修复从 PostgreSQL database 引擎错误获取表元数据的问题。修复了 #33502。#39283(Kseniia Sumarokova)。
- 修复当聚合键被嵌套在其他函数中时的投影异常。此更改修复了 #37151。#37155(Amos Bird)。
- 修复某些函数中可能出现的逻辑错误:
... with argument with type Nothing and default implementation for Nothing is expected to return result with type Nothing, got ...。关闭:#37610 关闭:#37741。#37759(Kruglov Pavel)。 - 修复
UNION子查询的列顺序不正确问题(当子查询中存在重复列时,可能导致结果不正确)。#37887 (Azat Khuzhin). - 修复当列名包含点号时
MODIFY ALTER Column工作不正确的问题。关闭 #37907。#37971(Kruglov Pavel)。 - 修复从将数据存储在 S3 上的
MergeTree表中读取稀疏列时的问题。#37978 (Anton Popov). - 修复在从配置中移除副本时,
Distributed表上的异步插入操作可能发生崩溃的问题。#38029 (Nikolai Kochetov). - 修复在对未指定别名的 CTE 执行 GLOBAL JOIN 时出现的 "Missing columns" 错误。#38056(Azat Khuzhin)。
- 在向后兼容模式下,将 tuple 函数重写为元组字面量。#38096 (Anton Kozlov)。
- 修复在执行
ORDER BY时为输出数据块进行冗余内存预留的问题。 #38127 (iyupeng). - 修复数组映射函数中可能出现的逻辑错误
Bad cast from type DB::IColumn* to DB::ColumnNullable*,并关闭 #38006。#38132(Kruglov Pavel)。 - 修复部分合并连接中的临时名称冲突,关闭 #37928。#38135(Vladimir C)。
- 修复了针对类似
CREATE TABLE nested_name_tuples (aTuple(x String, y Tuple(i Int32, j String))) ENGINE = Memory;的查询的一些小问题 #38136 (lgbo)。 - 修复了嵌套短路函数中的一个 bug,该 bug 会导致在条件为 false 时仍然执行参数。关闭了 #38040。#38173(Kruglov Pavel)。
- (Window View 是一项实验性功能)修复结构不正确的 WINDOW VIEW 导致的 LOGICAL_ERROR。 #38205 (Azat Khuzhin)。
- 更新
librdkafka子模块,修复在设置了OAUTHBEARER刷新回调时出现的崩溃问题。#38225(Rafael Acevedo)。 - 修复由于 ProfileEvents 导致对 Distributed 表的 INSERT 操作挂起的问题。 #38307 (Azat Khuzhin).
- 修复 PostgreSQL 引擎中的重试逻辑。#38310 (Kseniia Sumarokova)。
- 修复
PartialSortingTransform中的优化问题(可能引发 SIGSEGV 并产生错误结果)。 #38324 (Azat Khuzhin). - 修复在使用基于 PeekableReadBuffer 的格式时的 RabbitMQ 问题。关闭 #38061。 #38356 (Kseniia Sumarokova)。
- MaterializedPostgreSQL - 实验性特性。修复可能在 MaterializedPostgreSQL 中出现的
Invalid number of rows in Chunk问题。关闭 #37323。#38360 (Kseniia Sumarokova). - 修复使用连接字符串设置的 RabbitMQ 配置。关闭 #36531。#38365(Kseniia Sumarokova)。
- 修复 PostgreSQL 引擎在获取数组维度大小时未使用 PostgreSQL 模式(schema)的问题。关闭 #36755。关闭 #36772。#38366(Kseniia Sumarokova)。
- 修正包含
DISTINCT和LIMIT的分布式查询可能产生的不正确结果。修复了 #38282。#38371(Anton Popov)。 - 修复对包含 0 字节的模式使用 countSubstrings() 和 position() 时产生错误结果的问题。#38589 (Robert Schulze)。
- 现在可以启动 ClickHouse 服务器,并且即使是 IPv4/IPv6 表示值不正确的表,也可以执行表的 attach/detach 操作。这是对问题 #35156 的妥善修复。#38590 (alesapin)。
- 当某些参数为 NaN 时,
rankCorr函数现在也能正确工作。这修复了 #38396。#38722(Alexey Milovidov)。 - 修复
parallel_view_processing=1与optimize_trivial_insert_select=1的组合使用问题。修复在向视图写入数据时对max_insert_threads的处理。 #38731 (Azat Khuzhin). - 修复带有
Map组合器的聚合函数中的 use-after-free 错误,从而导致结果不正确。 #38748 (Azat Khuzhin).
ClickHouse 发布 22.6,2022-06-16
向后不兼容的变更
- 移除对 SQL 中八进制数值字面量的支持。在之前的版本中,它们会被解析为 Float64。#37765(Yakov Olkhovskiy)。
- 更改对类型为
seconds的设置项的解析方式,以支持浮点数值(例如:max_execution_time=0.5)。Infinity 或 NaN 值将抛出异常。#37187(Raúl Marín)。 - 更改实验性类型
Object列的二进制序列化格式。新格式更便于第三方客户端实现。#37482(Anton Popov)。 - 默认开启设置
output_format_json_named_tuples_as_objects。这允许在 JSON 格式中将具名元组序列化为 JSON 对象。#37756(Anton Popov)。 - 现在不再允许使用以转义字符('\')结尾的 LIKE 模式串(符合 SQL 标准要求)。#37764(Robert Schulze)。
- 如果你在具有 AArch64 CPU 的集群上运行不同版本的 ClickHouse,或者在一个集群中混用 AArch64 和 amd64,并且在使用分布式查询、对多个定长类型键进行 GROUP BY 时,这些键可以容纳在 256 位中但不能容纳在 64 位中,而且查询结果集非常大,那么在升级期间,这些查询的结果数据将不会被完全聚合。变通方案:使用停机升级,而不是滚动升级。
新功能
- 添加
GROUPING函数,用于在包含ROLLUP、CUBE或GROUPING SETS的查询中对记录进行消歧。修复 #19426。#37163 (Dmitry Novik)。 - 用于浮点数据压缩的全新编解码算法 FPC。#37553 (Mikhail Guzov)。
- 新增以下列式 JSON 格式:
JSONColumns、JSONCompactColumns、JSONColumnsWithMetadata。关闭 #36338 和 #34509。#36975(Kruglov Pavel)。 - 添加了一个基于 D3.js 的 OpenTelemetry Trace 可视化工具。#37810 (Sergei Trifonov)。
- 新增对向
system.zookeeper表执行 INSERT 的支持。关闭 #22130。#37596(Han Fei)。 - 支持
LIKE、ILIKE和match函数使用非常量模式参数。 #37251 (Robert Schulze). - 可执行用户自定义函数现在支持参数。例如:
SELECT test_function(parameters)(arguments)。修复了 #37578。#37720(Maksim Kita)。 - 向
system.part_log表添加merge_reason列。 #36912 (Sema Checherinda)。 - 为 Avro 格式添加对 Map 和 Record 类型的支持。新增设置
input_format_avro_null_as_default,允许在 Avro 格式中将 null 作为默认值插入。关闭 #18925、#37378、#32899。#37525(Kruglov Pavel)。 - 添加
clickhouse-disks工具,用于检查和操作为 ClickHouse 配置的虚拟文件系统。#36060(Artyom Yurkov)。 - 添加 H3 单向边函数。#36843(Bharat Nallan)。
- 新增基于无符号整数计算 hashids 的支持。#37013 (Michael Nutt)。
- 现在允许在
CREATE USER <user> IDENTIFIED WITH sha256_hash中显式指定SALT。 #37377 (Yakov Olkhovskiy). - 新增两个设置项
input_format_csv_skip_first_lines/input_format_tsv_skip_first_lines,用于在 CSV/TSV 格式文件中跳过开头指定数量的行。#37537(Kruglov Pavel)。 showCertificate函数用于显示当前服务器的 SSL 证书。#37540 (Yakov Olkhovskiy)。- Named Collections 中的 Data Dictionaries 现已支持 HTTP 源。#37581(Yakov Olkhovskiy)。
- 新增窗口函数
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL x SECOND])。 #37628 (Andrey Zvonov). - 实现了修改
ReplicatedMergeTree表注释的功能。#37416(Vasily Nemkov)。 - 新增了
SYSTEM UNFREEZE查询,可删除整个备份,而不管相应的表是否已被删除。#36424 (Vadim Volodin).
实验性功能
- 为
WINDOW VIEW启用POPULATE。 #36945 (vxider). - 添加对
WINDOW VIEW中ALTER TABLE ... MODIFY QUERY的支持。 #37188 (vxider). - 此 PR 更改了
WINDOW VIEW中ENGINE语法的行为,使其与MATERIALIZED VIEW中的行为一致。 #37214 (vxider).
性能优化
- 为 ARM NEON 添加了多项优化 #38093(Daniel Kutenin、Alexandra Pilipyuk)。注意:如果你在带有 ARM CPU 的集群上运行不同版本的 ClickHouse,并使用分布式查询,对多个定长类型键(总大小能容纳在 256 位内但不能容纳在 64 位内)执行 GROUP BY,那么在升级过程中聚合查询的结果会不正确。解决方法:采用停机升级,而不是滚动升级。
- 在仅选择部分列时,改进 Native、Protobuf、CapnProto、JSONEachRow、TSKV 以及所有带有 WithNames/WithNamesAndTypes 后缀的格式的性能和内存占用。此前从这些格式的文件中只选择部分列时,实际上会读取并将所有列存储到内存中。现在只会读取所需的列。此 PR 将
input_format_skip_unknown_fields默认启用,否则在只选择部分列的情况下会抛出异常。#37192 (Kruglov Pavel). - 现在在 join 中可以下推更多过滤条件。#37472 (Amos Bird)。
- 在读取宽部件(wide parts)时,仅为需要的列加载标记(marks)。 #36879 (Anton Kozlov)。
- 在使用稀疏列(可通过在
MergeTree表中启用实验性设置ratio_of_defaults_for_sparse_serialization来开启)作为聚合函数参数的情况下,聚合性能得到了提升。#37617 (Anton Popov)。 - 优化仅包含两个参数的
COALESCE函数。 #37666 (Anton Popov). - 当
multiIf只有一个条件时,将其替换为if,因为if函数的性能更好。 #37695 (Anton Popov). - 提升
dictGetDescendants、dictGetChildren函数的性能:在查询期间按查询创建一次临时父子层级索引,而不是在查询过程中为每次函数调用都创建。允许为HIERARHICAL属性指定BIDIRECTIONAL,字典会在内存中维护父到子的索引,这样dictGetDescendants、dictGetChildren函数在每个查询时就不需要再创建临时索引。修复并关闭 #32481。#37148(Maksim Kita)。 - 聚合状态的销毁现在可以提交到线程池中执行。对于包含 LIMIT 且聚合状态较大的查询,这一改动带来了显著的加速,例如
select uniq(number) from numbers_mt(1e7) group by number limit 100的执行速度提升了约 2.5 倍。 #37855 (Nikita Taranov). - 提升按单列排序的性能。#37195 (Maksim Kita)。
- 通过针对排序队列的特化实现来提升单列排序性能。 #37990 (Maksim Kita)。
- 将数组范数和距离函数的性能提升了 2 至 4 倍。#37394 (Alexander Gololobov)。
- 使用动态派发提升数值比较函数的性能。#37399 (Maksim Kita)。
- 改进 ORDER BY 与 LIMIT 组合时的性能。#37481(Maksim Kita)。
- 使用动态分派基础设施改进
hasAll函数的性能。#37484 (Maksim Kita)。 - 提升
greatCircleAngle、greatCircleDistance、geoDistance函数的性能。#37524 (Maksim Kita)。 - 当
ORDER BY包含多列时,提高向 MergeTree 插入数据的性能。#35762(Maksim Kita)。 - 修复在表很多时后台 CPU 过高占用的问题。#38028(Maksim Kita)。
- 使用动态分派优化
not函数的性能。#38058 (Maksim Kita)。 - 对 re2 模式的内部缓存进行了优化,这些模式会出现在 LIKE 和 MATCH 等函数中。#37544(Robert Schulze)。
- 使用 AVX-512 指令改进并统一过滤位掩码生成函数的实现。 #37588 (yaqi-zhao).
- 为 Hive 集成引擎启用
threadpool读取方式。这将显著加快读取速度。#36328(李扬)。 - 当要读取的所有列均为分区键时,通过文件的行号构造列,无需实际读取 Hive 文件。#37103 (lgbo)。
- 支持为 Hive 文件缓存使用多个磁盘。 #37279 (lgbo).
- 对每个查询设置最大缓存使用上限,可以有效防止缓存池被污染。相关 Issue。#37859(Han Shukai)。
- 目前,ClickHouse 会将所有远程文件直接下载到本地缓存(即使只读取一次),这会频繁触发本地磁盘的 I/O。在某些场景下,这些 I/O 可能并非必要,且容易导致负向优化。如下图所示,当我们运行 SSB Q1–Q4 时,缓存机制的表现已经造成了负向优化。#37516(Han Shukai)。
- 允许在从 S3 读取数据时,通过
_file和_path等虚拟列对文件列表进行筛选。对应 #37174、#23494。#37356(Amos Bird)。 - 在函数 CompressedWriteBuffer::nextImpl() 中,在插入数据时会频繁执行一个不必要的写入拷贝步骤。下面展示了应用此补丁前后的差异: - 之前: 1. 将 "working_buffer" 压缩到 "compressed_buffer" 2. 写入拷贝到 "out" - 之后: 直接将 "working_buffer" 压缩到 "out"。
改进
- 在 ROLLUP、CUBE 和 GROUPING SETS 中支持具有非标准默认值的类型。修复了 #37360。#37667(Dmitry Novik)。
- 修复 ARM 架构上的堆栈跟踪采集。关闭 #37044。关闭 #15638。#37797(Maksim Kita)。
- 客户端会依次尝试 DNS 解析得到的每个 IP 地址,直到成功建立连接为止。#37273 (Yakov Olkhovskiy).
- 允许在 Arrow/Parquet/ORC 格式中使用 String 类型而非 Binary 类型。此 PR 为此引入了 3 个新设置项:
output_format_arrow_string_as_string、output_format_parquet_string_as_string、output_format_orc_string_as_string。所有这些设置的默认值均为false。#37327(Kruglov Pavel)。 - 将设置
input_format_max_rows_to_read_for_schema_inference应用于通过 globs 匹配到的所有文件的总体读取行数。此前,设置input_format_max_rows_to_read_for_schema_inference会分别应用于 glob 中的每个文件,在存在大量 null 的情况下,我们可能会从每个文件中读取前input_format_max_rows_to_read_for_schema_inference行却仍然无法推断出模式。同时,将该设置的默认值提高到 25000。 #37332 (Kruglov Pavel). - 添加单独的
CLUSTER授权(并新增access_control_improvements.on_cluster_queries_require_cluster_grant配置指令,为了向后兼容,默认值为false)。 #35767 (Azat Khuzhin). - 为
hdfsCluster添加了 schema 推断支持。#35812 (Nikita Mikhaylov)。 - 在卷内磁盘(多磁盘配置)上实现
least_used负载均衡算法。#36686 (Azat Khuzhin). - 将 HTTP 端点修改为在
send_progress_in_http_headers=0时,通过X-ClickHouse-Summary头返回完整统计信息(此前会全部返回为零)。- 将 HTTP 端点修改为在已发送进度信息(send_progress_in_http_headers=1)时返回X-ClickHouse-Exception-Code头。- 将 HTTP 端点修改为在出现TIMEOUT_EXCEEDED错误时返回HTTP_REQUEST_TIMEOUT(408),而不是HTTP_INTERNAL_SERVER_ERROR(500)。#36884 (Raúl Marín)。 - 允许用户查看其从已授予角色继承的权限。#36941 (nvartolomei).
- 不要通过数值方法计算积分,而应改用 CDF 函数。这样可以加快执行速度并提高精度。此更改修复了 #36714。#36953(Nikita Mikhaylov)。
- 为函数添加了对
Nothing类型的默认实现。现在,大多数函数在任一参数为Nothing时将返回类型为Nothing的列。这也解决了诸如arrayMap/arrayFilter等函数在其参数为空数组时的问题。之前类似select arrayMap(x -> 2 * x, []);的查询会失败,因为 lambda 内的函数无法处理Nothing类型;现在此类查询会返回类型为Array(Nothing)的空数组。同时为arrayFilter/arrayFill等函数添加了对可空类型数组的支持。之前类似select arrayFilter(x -> x % 2, [1, NULL])的查询会失败,现在可以正常工作(如果 lambda 的结果为 NULL,则该值不会包含在结果中)。关闭 #37000。#37048(Kruglov Pavel)。 - 现在,如果某个分片存在本地副本,我们会同时创建一个本地执行计划,以及一个从所有远程副本读取的执行计划。它们共享同一个发起方,用于协调读取。#37204 (Nikita Mikhaylov)。
- 如果未显式设置配置选项 "mark_cache_size",服务器启动将不再因此中止。 #37326 (Robert Schulze)。
- 允许在列声明中在类型之后直接指定
NULL/NOT NULL。#37337 (Igor Nikonov)。 - 优化获取文件段 PARTIALLY_DOWNLOADED 的读取缓冲区。 #37338 (xiedeyantu).
- 尝试改进对短路函数的处理,以修复压力测试中的问题。 #37384 (Kruglov Pavel).
- 关闭 issue #37395。对应 PR #37415(Memo)。
- 修复在零拷贝复制中拉取数据分片(part)时极其罕见的死锁问题。修复 #37423。#37424(metahys)。
- 禁止创建使用未知数据格式的存储。#37450 (Kruglov Pavel).
- 将
global_memory_usage_overcommit_max_wait_microseconds的默认值设置为 5 秒。在 OOM 异常信息中添加OvercommitTracker的相关信息。新增MemoryOvercommitWaitTimeMicrosecondsprofile 事件。#37460(Dmitry Novik)。 - 在 clickhouse-client 中不再显示
-0.0CPU 时间。该现象可能是由舍入误差导致的。由此关闭了 #38003。由此关闭了 #38038。#38064(Alexey Milovidov)。 - Play UI:当页面水平滚动时保持控件位置不变。即使表格很宽并且已经向右滚动很远,也能让编辑更加方便。该特性由 CaspianDB 的 Maksym Tereshchenko 提出。#37470(Alexey Milovidov)。
- 修改 play.html 中的 query div,使其高度不再受 20% 的限制,可以继续向下扩展。对于非常长的查询,能够扩展 textarea 元素很有帮助,但目前由于 div 高度是固定的,当 textarea 被拉大时,会遮挡下面的 data div。通过此修复,扩展 textarea 元素时会将 data div 向下/向上推移,从而避免被扩展后的 textarea 遮挡。同时,即使用户调整 query textarea 的大小,也能保持查询框宽度为 100%。 #37488 (guyco87).
- 新增
ProfileEvents计数器,用于分析已写入(插入或合并)分片的类型(Inserted{Wide/Compact/InMemory}Parts、MergedInto{Wide/Compact/InMemory}Parts)。在system.part_log中新增part_type列。解决了 #37495。#37536(Anton Popov)。 - clickhouse-keeper 改进:将损坏的日志文件移动到带时间戳的文件夹中。#37565 (Antonio Andelic).
- 在后续合并中不再写入 TTL 已过期的列(此前只有对该数据片段的首次 merge/optimize 不会写入 TTL 已过期的列,之后的所有操作都会写入)。 #37570 (Azat Khuzhin).
- 当存在 LowCardinality 或 Sparse 列时,
dumpColumnStructure杂项函数的结果现在更加精确。在之前的版本中,该函数会在返回结果前将参数转换为完整列。此更改是为了解答 #6935 中的问题所必需的。#37633(Alexey Milovidov)。 - clickhouse-keeper:仅为 watch 存储唯一的会话 ID。 #37641 (Azat Khuzhin).
- 修复可能出现的“Cannot write to finalized buffer”错误。#37645 (Azat Khuzhin)。
- 为
DiskS3添加设置support_batch_delete,以禁用多对象(批量)删除调用,因为 Google Cloud Storage 不支持该功能。#37659 (Fred Wulff)。 - 在 ODBC bridge 中增加一个选项,用于禁用连接池功能。#37705(Anton Kozlov)。
- 函数
dictGetHierarchy、dictIsIn、dictGetChildren、dictGetDescendants新增了对字典中可为空(nullable)的HIERARCHICAL属性的支持。修复了 #35521。#37805(Maksim Kita)。 - 在
system.build_options表中公开 BoringSSL 版本相关信息。#37850(Bharat Nallan)。 - 现在,clickhouse-server 在服务器启动时会删除
delete_tmp目录。修复了 #26503。#37906(alesapin)。 - 在超时后清理损坏的已分离数据部分。修复 #25195。#37975(Kseniia Sumarokova)。
- 现在,在 MergeTree 表引擎家族中,移动失败的 part 会被立即删除。#37994 (alesapin)。
- 现在,如果为 ReplicatedMergeTree 启用了
always_fetch_merged_part设置,合并操作将会尝试从其他副本获取数据片段,从而减少对 [Zoo]Keeper 的负载。#37995 (alesapin)。 - 同时也支持带有 GRANT OPTION 的隐式授权。例如,
GRANT CREATE TABLE ON test.* TO A WITH GRANT OPTION现在允许A执行GRANT CREATE VIEW ON test.* TO B。#38017(Vitaly Baranov)。
构建 / 测试 / 打包改进
- 在构建中使用
clang-14和 LLVM 基础设施版本 14。解决了 #34681。#34754(Alexey Milovidov)。注意:clang-14在 ThreadSanitizer 中存在一个 bug,会降低我们的 CI 效率。 - 允许在启动时放弃特权(降权)。这简化了 Docker 镜像。解决了 #36293。#36341(Alexey Milovidov)。
- 在 CI 中新增文档拼写检查。#37790(Vladimir C)。
- 修复过于激进的 strip 过程导致移除了用于检查可执行文件一致性的嵌入哈希的问题。#37993(Robert Schulze)。
Bug 修复
- 修复包含常量字符串类型的
SELECT ... INTERSECT和EXCEPT SELECT语句。#37738 (Antonio Andelic)。 - 修复在对具有
AggregateFunction类型的列执行GROUP BY时的问题。 #37093 (Azat Khuzhin). - (实验性 WINDOW VIEW)修复 WindowView 中的
addDependency。该问题可按 #37237 的方式复现。#37224(vxider)。 - 修复 ORDER BY ... WITH FILL 功能中的不一致行为。包含 ORDER BY ... WITH FILL 的查询在存在多个 WITH FILL 列时可能会生成多余的行。#38074(Yakov Olkhovskiy)。
- 此 PR 将
addDependency从构造函数移动到startup(),以避免向已删除的表添加依赖关系,从而修复 #37237。#37243(vxider)。 - 修复在列式格式中为缺失值插入默认值的方式。此前,缺失列会使用类型的默认值填充,而不是使用列的默认值。#37253(Kruglov Pavel)。
- (实验性 Object 类型)修复了某些将嵌套数组插入到
Object类型列时的问题。#37305 (Anton Popov)。 - 修复在聚合函数、
prewhere和join中由常量字符串冲突引起的意外错误。关闭 #36891。#37336(Vladimir C)。 - 修复在查询中使用 GROUP/ORDER BY 时的 projection 以及
optimize_aggregation_in_order的问题(此前由于仅在最终阶段执行排序,导致结果不正确)。 #37342 (Azat Khuzhin). - 修复了在 S3 中键名包含特殊符号时出现的错误。修复了 #33009。#37344(Vladimir Chebotarev)。
- 当 GROUPING SETS 与 ROLLUP 或 CUBE 一起使用时抛出异常。 #37367 (Dmitry Novik).
- 修复在合并过程中
getMaxSourcePartsSizeForMerge中出现的 LOGICAL_ERROR(当在config.xml(新的方式)中而不是在已弃用的users.xml中配置了非标准且更大的background_pool_size/background_merges_mutations_concurrency_ratio值时)。#37413(Azat Khuzhin)。 - 不再在 RowBinary 格式中删除 UTF-8 BOM。 #37428 (Paul Loyd). #37428 (Paul Loyd).
- clickhouse-keeper 缺陷修复:修复单节点集群的强制恢复。#37440 (Antonio Andelic).
- 修正
normalizeUTF8函数中的逻辑错误,关闭 #37298。#37443(Maksim Kita)。 - 修复 JoinSwitcher 中对 Nullable 的 LowCardinality 类型转换问题,关闭 #37385。#37453(Vladimir C)。
- 修复 ORC/Arrow/Parquet 格式中命名元组的输出。#37458(Kruglov Pavel)。
- 修复在包含 GROUPING SETS 的情况下对 ORDER BY 子句中单调函数的优化。修复了 #37401。#37493(Dmitry Novik)。
- 修复在特定条件下使用字典进行 JOIN 时出现的错误。关闭 #37386。#37530(Vladimir C)。
- 禁止在使用
GROUPING SETS时启用optimize_aggregation_in_order(修复LOGICAL_ERROR错误)。 #37542 (Azat Khuzhin). - 修复 ActionsDAG 错误的转储信息。#37587(zhanglistar)。
- 修复 UNION 查询中的类型转换问题(此前可能会触发 LOGICAL_ERROR)。 #37593 (Azat Khuzhin).
- 修复在
STEP子句中使用负区间时的WITH FILL修饰符。修复了问题 #37514。#37600(Anton Popov)。 - 修复在
join_use_nulls = 1时非法使用 joinGet 数组的问题。修复了 #37562。#37650(Amos Bird)。 - 修复 CROSS JOIN 中列数不匹配的问题,关闭 #37561。#37653(Vladimir C)。
- 修复在配置了命名集合(named collections)的 MySQL 数据库上执行
show create table时发生的段错误。关闭 #37683。#37690(Kseniia Sumarokova)。 - 修复了在创建 RabbitMQ 存储时未使用
SETTINGS子句的情况下,服务器重启后该存储无法启动的问题。关闭 #37463。#37691(Kseniia Sumarokova)。 - SQL 用户自定义函数在只读模式下禁止执行 CREATE/DROP 操作。修复了 #37280。#37699(Maksim Kita)。
- 修正可执行用户自定义函数中
Nullable参数的格式处理。关闭 #35897。#37711(Maksim Kita)。 - 修复了在分布式查询中通过设置
optimize_monotonous_functions_in_order_by启用的优化问题。修复了 #36037。#37724(Anton Popov)。 - 修复
values表函数中可能出现的逻辑错误:Invalid Field get from type UInt64 to type Float64。已关闭 #37602。#37754(Kruglov Pavel)。 - 修复在
SchemaReader构造函数抛出异常时,模式推断中可能发生的段错误(segfault)。关闭 #37680。#37760(Kruglov Pavel)。 - 修复内部
cast函数对cast_ipv4_ipv6_default_on_conversion_error设置的处理。关闭 #35156。#37761(Maksim Kita)。 - 修复 DatatypeDate32 中的 toString 错误。#37775 (LiuNeng)。
- clickhouse-keeper 设置
dead_session_check_period_ms被转换为微秒(乘以 1000),导致死会话要在几分钟后才会被清理(而不是 500ms 之后)。#37824(Michael Lex)。 - 修复在
async_socket_for_remote/use_hedged_requests被禁用时,分布式查询中可能出现的 "No more packets are available" 错误。#37826 (Azat Khuzhin)。 - (实验性 WINDOW VIEW)在 WindowView 中执行
ALTER TABLE ... MODIFY QUERY时不再删除内部目标表。 #37879 (vxider)。 - 修正 clickhouse-keeper Docker 镜像中协调目录的所有权。修复 #37914。#37915(James Maidment)。
- 修复了 Dictionaries 在自定义查询的更新字段中使用
{condition}时的问题。关闭 #33746。#37947(Maksim Kita)。 - 修复在需要在
WITH FILL结果之后再应用ORDER BY的情况下(例如在外层查询中)执行SELECT ... WITH FILL可能产生错误结果的问题。错误结果是由针对ORDER BY表达式的优化引起的(#35623)。关闭 #37904。#37959(Yakov Olkhovskiy)。 - (实验性 WINDOW VIEW)在 WindowView 中向目标表写入数据时补全缺失的默认列,修复 #37815。#37965(vxider)。
- 修复了因为栈帧过大而导致的编译失败问题。 #37996 (Han Shukai).
- 在开启 enable_filesystem_query_cache_limit 时,如果发生此情况会抛出错误 “Reserved cache size exceeds the remaining cache size(预留的缓存大小超过剩余的缓存大小)”。 #38004 (xiedeyantu).
- 修复 UNION 查询中的类型转换问题(可能会导致 LOGICAL_ERROR)。 #34775 (Azat Khuzhin).
- 如果 BackgroundExecutor 繁忙,TTL merge 可能不会再次被调度。--merges_with_ttl_counter 会在 selectPartsToMerge() 中增加;如果 BackgroundExecutor 繁忙,--merge 任务将被忽略;--merges_with_ttl_counter 不会被减少。 #36387 (lthaooo).
- 修复
normalize_function_names设置值被覆盖的问题。#36937(李扬)。 - 修复了指数时间衰减窗口函数的问题,现已正确遵守窗口边界。#36944(Vladimir Chebotarev)。
- 修复在读取 system.projection_parts 和 system.projection_parts_columns 时可能出现的 heap-use-after-free 错误。此更改修复了 #37184。#37185(Amos Bird)。
- 修复了 Unix 纪元之前
DateTime64小数秒的处理行为。 #37697 (Andrey Zvonov). #37039 (李扬).
ClickHouse 发行版 22.5,2022-05-19
升级说明
- 现在,后台合并、变更(mutations)以及
OPTIMIZE将不再增加SelectedRows和SelectedBytes指标。它们(仍然)会像之前一样增加MergedRows和MergedUncompressedBytes。这只会影响指标值,并使其更合理。此更改不会引入任何不兼容性,但你可能会对指标变化感到疑惑,因此我们将其归类在本节中。#37040(Nikolai Kochetov)。 - 将 BoringSSL 模块更新为官方符合 FIPS 要求的版本。这使得 ClickHouse 符合 FIPS 规范。#35914(Meena-Renganathan)。由于
aes-192-cfb128和aes-256-cfb128密码套件未包含在通过 FIPS 认证的 BoringSSL 版本中,因此已被移除。 - 从
users.xml中的默认用户配置文件中移除了max_memory_usage设置。这为查询提供了灵活的内存限制,而不是之前固定的 10 GB 上限。 - 默认禁用
log_query_threads设置。它控制是否记录参与查询执行的每个线程的统计信息。在支持异步读取之后,不同线程 ID 的总数量变得过大,对query_thread_log的记录开销变得过大。#37077(Alexey Milovidov)。 - 移除了存在缺陷的函数
groupArraySorted。#36822(Alexey Milovidov)。
新特性
- 默认启用内存超额分配(overcommit)。#35921 (Dmitry Novik).
- 在
GROUP BY子句中添加对GROUPING SETS的支持。本实现支持对 grouping sets 的并行处理。#33631 (Dmitry Novik). - 新增
system.certificates表。#37142 (Yakov Olkhovskiy). - 新增
h3Line、h3Distance和h3HexRing函数。#37030 (Bharat Nallan). - 新增单一二进制诊断工具
clickhouse-diagnostics。#36705 (Dale McDiarmid). - 新增输出格式
Prometheus。#36051。#36206 (Vladimir C). - 新增
MySQLDump输入格式。它会从 dump 中属于同一张表的所有INSERT查询中读取数据。如果存在多张表,默认只从第一张表读取数据。#36667 (Kruglov Pavel). - 在
system.tables中为临时表显示total_rows和total_bytes字段。#36401。#36439 (xiedeyantu). - 允许通过查询级别设置覆盖
parts_to_delay_insert和parts_to_throw_insert。如果在查询级别定义,它们将覆盖表级别设置。#36371 (Memo).
实验特性
- 为数组实现了 L1、L2、Linf、余弦距离函数,以及为数组实现了 L1、L2、Linf 范数函数。 #37033 (qieqieplus). 注意:这些函数后续将被重命名。
- 改进 WindowView 中的
WATCH查询:1. 通过调用fire_condition信号,降低提供查询结果的延迟。2. 通过更频繁地检查isCancelled(),加快取消查询操作(Ctrl+C)。 #37226 (vxider). - 为移除文件系统缓存提供自省功能。 #36802 (Han Shukai).
- 为 SQL 新增哈希函数
wyHash64。 #36467 (olevino). - 针对复制数据库(Replicated)的改进:新增
SYSTEM SYNC DATABASE REPLICA查询,用于在 Replicated 数据库内部同步表的元数据,因为当前同步过程是异步的。 #35944 (Nikita Mikhaylov). - 针对远程文件系统缓存的改进:提升从缓存读取的效率。 #37054 (Kseniia Sumarokova). 改进
SYSTEM DROP FILESYSTEM CACHE查询:新增<path>选项和FORCE选项。 #36639 (Kseniia Sumarokova). - 针对半结构化数据的改进:允许将类型为
Object(...)的列转换为Object(Nullable(...))。 #36564 (awakeljw). - 针对并行副本的改进:当我们希望在本地副本(localhost replica)上执行查询时,会创建本地解释器。但在多个副本上执行查询时,会依赖已有连接,使副本可以与协调者通信。现在进行了改进,本地副本可以在同一进程中直接与协调者通信。 #36281 (Nikita Mikhaylov).
性能改进
- 在未使用 GROUP BY 表达式时,提高
avg、sum聚合函数的性能。#37257 (Maksim Kita)。 - 通过动态分派提高一元算术函数(
bitCount、bitNot、abs、intExp2、intExp10、negate、roundAge、roundDuration、roundToExp2、sign)的性能。#37289 (Maksim Kita)。 - 通过对排序列比较器进行 JIT 编译,提高 ORDER BY、MergeJoin 以及向 MergeTree 插入数据的性能。#34469 (Maksim Kita)。
- 修改
system.asynchronous_metric_log的结构。其占用的空间将减少大约 10 倍。这关闭了 #36357。字段event_time_microseconds已被移除,因为它没有用处。#36360 (Alexey Milovidov)。 - 在读取宽部件(wide parts)时,仅为必要的列加载标记信息。#36879 (Anton Kozlov)。
- 通过缩小互斥锁作用范围,提升文件描述符缓存的性能。#36682 (Anton Kozlov)。
- 在路径包含通配符且匹配目录包含大量文件的情况下,提高从存储
File和表函数file读取时的性能。#36647 (Anton Popov)。 - 对输入格式
HiveText启用并行解析,在读取本地文件时可以将 HiveText 解析速度提升至 2 倍。#36650 (李扬)。 - 默认的
HashJoin在向右表插入行时不是线程安全的,因此会在单线程中运行。当右表很大时,连接过程会过于缓慢且 CPU 利用率较低。#36415 (lgbo)。 - 允许将
select countDistinct(a) from t重写为select count(1) from (select a from t GROUP BY a)。#35993 (zhanglistar)。 - 将 OR LIKE 链转换为 multiMatchAny。在我们对其工作情况有更充分信心后再启用。#34932 (Daniel Kutenin)。
- 通过内联优化提高部分函数的性能。#34544 (Daniel Kutenin)。
- 添加一个分支以避免在 readBig 中不必要的 memcpy,从而在一定程度上提升性能。#36095 (jasperzhu)。
- 为
optimize_aggregation_in_order实现部分 GROUP BY 键。#35111 (Azat Khuzhin)。
改进
- 在执行表函数
file、s3和url时,如发生解析错误,将显示出错的文件名。#36314 (Anton Popov). - 如果在顶层配置中指定了相关参数,则允许在运行时增加用于执行后台操作(合并、变更、移动和拉取)的线程数量。#36425 (Nikita Mikhaylov)。
- 现在,日期时间转换函数在生成早于 1970-01-01 00:00:00 且带有非整小时/分钟时区的时间时,将会被饱和为零,而不是发生溢出。此更改是对 https://github.com/ClickHouse/ClickHouse/pull/29953 的延续,用于解决 https://github.com/ClickHouse/ClickHouse/pull/29953#discussion_r800550280 中提出的问题。将其标记为“改进”,是因为这是实现定义的行为(且是极少见的情况),我们可以对其进行不兼容变更。#36656(Amos Bird)。
- 如果有人使用日志级别 "test" 运行 clickhouse-server,则添加一个警告。日志级别 "test" 是最近新增的,由于会导致不可避免、无法规避、致命且严重威胁系统稳定性的性能下降,不能在生产环境中使用。#36824 (Alexey Milovidov)。
- 在 CREATE TABLE 中解析排序规则,抛出异常或忽略。修复 #35892 问题。#36271(yuuch)。
- 选项
compatibility_ignore_auto_increment_in_create_table允许在列定义中忽略AUTO_INCREMENT关键字,以简化从 MySQL 迁移。#37178(Igor Nikonov)。 - 为
JSONEachRow添加别名JSONLines和NDJSON。关闭 #36303。#36327(flynn)。 - 限制每个 Hive 表可查询的最大分区数,以避免资源过载。#37281 (lgbo)。
- 为
h3kRing函数的第二个参数添加了隐式类型转换,以提高易用性。解决了 #35432。#37189(Maksim Kita)。 - 修复
clickhouse-local中针对任意查询的INSERT SELECT进度显示,以及客户端中文件进度的显示,使文件进度更加准确。 #37075 (Kseniia Sumarokova). - 修复了一个错误:在删除数据部件时如果发生文件系统故障,可能导致 MergeTree 表引擎系列中已过期的部件被遗留未删除。在修复之前,这些部件只会在首次服务器重启后才会被删除。 #37014 (alesapin).
- 实现了一种新的行策略处理模式,可在主配置中启用,从而允许未配置宽松行策略的用户读取数据行。#36997 (Vitaly Baranov)。
- Play UI:可为空值的数值将在表格单元格中右对齐。此更改修复了 #36982。#36988(Alexey Milovidov)。
- Play UI:如果结果中只有一行且列数较多时,则以纵向方式展示结果。延续 #36811。#36842(Alexey Milovidov)。
- 清理了 Play UI 中的 CSS,使像素分布更加均匀,并提升了表格单元格中长内容的使用体验。#36569 (Alexey Milovidov).
- 在发生异常时提前完成写入缓冲区的收尾工作,以避免在析构函数中执行该操作。希望能修复:#36907。#36979(Kruglov Pavel)。
- 自 #36425 起,
background_fetches_pool_size等设置已被废弃,但仍可能出现在顶层配置中,此时 ClickHouse 会抛出类似Error updating configuration from '/etc/clickhouse-server/config.xml' config.: Code: 137. DB::Exception: A setting 'background_fetches_pool_size' appeared at top level in config /etc/clickhouse-server/config.xml.的异常。此问题已修复。#36917(Nikita Mikhaylov)。 - 在将异常发送至其他服务器时(如果适用),添加额外的诊断信息。#36872 (tavplubix)。
- 允许对
Array(Tuple(..))类型的参数执行哈希函数。 #36812 (Anton Popov). - 新增了
user_defined_path配置项。#36753 (Maksim Kita)。 - 在
s3Cluster表函数中允许使用 cluster 宏。 #36726 (Vadim Volodin). - 在
clickhouse-client/clickhouse-local中正确取消 INSERT 查询。#36710 (Azat Khuzhin)。 - 允许在
MySQLHandler中取消查询的同时,仍然保留合理的查询 ID。#36699 (Amos Bird). - 将
is_all_data_sent列添加到system.processes中,并基于该列改进内部测试中的加固检查。#36649 (Azat Khuzhin)。 - 现在用于统计从 S3 读取所花时间的相关指标现已被正确计算。关闭 #35483。#36572(Alexey Milovidov)。
- 在 clickhouse-local 中运行时,允许在表函数
file中使用文件描述符。 #36562 (wuxiaobai24). - 允许元组元素的名称以数字开头。#36544(Anton Popov)。
- 现在,clickhouse-benchmark 可以从环境变量中读取身份验证信息。#36497(Anton Kozlov)。
clickhouse-keeper改进:新增对强制恢复(force recovery)的支持,允许在没有 quorum 的情况下重新配置集群。#36258(Antonio Andelic)。- 改进 JSON 对象的模式推断。#36207 (Kruglov Pavel).
- 重构了基于 glob 的 schema 推断相关代码。仅在确有必要时才从 glob 中尝试下一个文件(此前是只要出现任何错误就会尝试下一个文件)。同时修复了 #36317。#36205(Kruglov Pavel)。
- 添加单独的
CLUSTER授权(以及access_control_improvements.on_cluster_queries_require_cluster_grant配置指令,为保持向后兼容性,其默认值为false)。#35767 (Azat Khuzhin)。 - 如果在选定查询被停止之前,可用内存恢复到了所需的大小,所有处于等待状态的查询将继续执行。现在,如果在选定查询获知被取消之前内存已经被释放,我们不会再停止任何查询。#35637 (Dmitry Novik).
- 在 protobuf 中检测 Nullable 值。在 proto3 中,默认值不会在网络上传输。这使得在 Nullable 列中区分 null 和默认值变得不太直观。处理这一问题的标准方式是使用 Google wrappers,将目标值嵌套在内部消息中(参见 https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto)。在这种情况下,缺失的字段被解释为 null 值,存在但内部值缺失的字段被解释为默认值,而具有普通值的字段则按普通值解释。
- 在预定义和静态 HTTP 处理器配置中支持指定
content_type。#34916(Roman Nikonov)。 - 在使用
clickhouse-client --file但未事先指定--external时发出适当的警告。关闭 #34747。#34765(李扬)。 - 改进 MySQL 数据库引擎,使其兼容 binary(0) 数据类型。 #37232 (zzsmdfj)。
- 改进
clickhouse-benchmark生成的 JSON 报告。 #36473 (Tian Xinhui). - 如果无法解析外部 ClickHouse 字典的主机名,服务器可能会拒绝启动。该问题已修复,修复了 #36451。#36463(tavplubix)。
构建 / 测试 / 打包改进
- 现在
x86_64架构的clickhouse-keeper使用 musl 进行静态链接构建,不再依赖任何系统库。#31833(Alexey Milovidov)。 - 现在可以通过通用安装脚本
curl https://clickhouse.com/ | sh,以及直接链接https://builds.clickhouse.com/master/powerpc64le/clickhouse获取适用于PowerPC64LE架构的 ClickHouse 构建。#37095(Alexey Milovidov)。 - 将 PowerPC 代码生成限制为 Power8,以获得更好的兼容性。这解决了 #36025。#36529(Alexey Milovidov)。
- 简化性能测试,以便我们能够真正使用它。#36769(Alexey Milovidov)。
- 如果报告中存在错误,则让性能对比失败。#34797(Mikhail f. Shiryaev)。
- 为 Arrow 添加 ZSTD 支持。这修复了 #35283。#35486(Sean Lafferty)。
Bug 修复
- 如果 URI 中存在 Version ID,则从中提取并将请求添加到 AWS HTTP URI。关闭 #31221。- [x] 如果存在,从 URI 中提取
Version ID,并在去掉该部分后重新组装 URI。- [x] 使用该请求配置AWS HTTP URI对象。- [x] 单元测试:gtest_s3_uri- [x] 移除埋点相关提交。#34571 (Saad Ur Rahman)。 - 将 system.opentelemetry_span_log 的 attribute.values 别名从 keys 更正为 values。 #37275 (Aleksandr Razumov).
- 修复
Nullable(String)向Nullable(Bool/IPv4/IPv6)的转换问题。关闭 #37221。#37270(Kruglov Pavel)。 - 实验性功能:修复在包含
Object类型列的表中执行变更操作(mutations)时的行为。现在允许在UPDATE或DELETE查询的WHERE表达式中使用Object类型的子列,也允许对单独子列执行(DROP、MODIFY)操作。修复了 #37205。#37266(Anton Popov)。 - Kafka 在生产端不需要配置
group.id。在控制台日志中,你可以看到描述此问题的警告:2022.05.15 17:59:13.270227 [ 137 ] {} <Warning> StorageKafka (topic-name): [rdk:CONFWARN] [thrd:app]: Configuration property group.id is a consumer property and will be ignored by this producer instance。#37228(Mark Andreev)。 - 实验性特性 (WindowView):在数据块实际触发之后再更新
max_fired_watermark,以避免误删尚未触发的数据。#37225 (vxider). - 修复在包含 LIMIT BY 的分布式查询中出现的 "Cannot create column of type Set" 错误。#37193 (Azat Khuzhin).
- 实验性功能:现在 WindowView 的
WATCH EVENTS查询将不再因为在WindowViewSource.h:58中创建的非空 Chunk 而终止。#37182 (vxider)。 - 为子查询启用
enable_global_with_statement,并关闭问题 #37141。#37166(Vladimir C)。 - 修复 optimize_skip_unused_shards_rewrite_in 中的隐式类型转换问题。#37153 (Azat Khuzhin).
- 在 FixedString 列上使用 ILIKE 函数时,可能会返回错误结果(即匹配的结果少于预期)。 #37117 (Robert Schulze).
- 修复
GROUP BY中的AggregateFunction(即当对具有AggregateFunction类型的列执行GROUP BY时)。 #37093 (Azat Khuzhin)。 - 实验性功能:修复在使用前缀 GROUP BY 且包含 *Array 聚合函数时的 optimize_aggregation_in_order。 #37050 (Azat Khuzhin).
- 修复了某些包含隐式聚合的
INSERT SELECT查询的性能下降问题。修复了 #36792。#37047(tavplubix)。 - 实验性特性:修复在有序
GROUP BY(optimize_aggregation_in_order=1)下使用*Array(groupArrayArray/...)聚合函数的问题。#37046(Azat Khuzhin)。 - 修复了当索引类型不是 UInt8 时 LowCardinality->ArrowDictionary 生成的无效输出(关闭 #36832)。#37043(Kruglov Pavel)。
- 修复了
quantileTDigest中处理无穷大值(inf)的问题。修复了 #32107。#37021(Vladimir Chebotarev)。 - 修复在 HedgedConnections 中,当 max_parallel_replicas != 1 时发送外部表数据的问题。 #36981 (Kruglov Pavel).
- 修复了在
Replicated数据库中执行TRUNCATE查询时的逻辑错误,解决了 #33747。#36976(tavplubix)。 - 实验性功能:修复在 WindowView 中删除源表时出现卡死的问题。关闭 #35678。#36967(vxider)。
- 实验功能(RocksDB 缓存):修复问题:#36671。#36929(李扬)。
- 实验特性:通过添加转换操作,修复在 WindowView 中使用多列时的 bug,使得可以在模式略有差异时调用
writeIntoWindowView。#36928(vxider)。 - 修复 clickhouse-keeper 中的一个缺陷,该缺陷在负载较低并发生重启时可能导致压缩日志文件损坏。 #36910 (alesapin).
- 修复在进行常量聚合时产生错误查询结果的问题。该修复解决了 #36728 。#36888 (Amos Bird)。
- 实验性功能:修复缓存中的
current_size计数。#36887 (Kseniia Sumarokova)。 - 实验特性:修复在窗口视图中使用 hop window 时的触发问题 #34044。#36861 (vxider)。
- 实验性功能:修复远程文件系统缓存缓冲区中的错误类型转换。 #36809 (Kseniia Sumarokova).
- 修复在
flatten_nested = 0时创建表的问题。此前未展开的Nested列在服务器重启后可能会被自动展开。#36803(Anton Popov)。 - 修复了在异步从远程文件系统读取 LowCardinality 数据时出现的一些问题。 #36763 (Kseniia Sumarokova).
- 实验性功能:修复了从多个文件向
Object类型列插入数据的问题,例如通过带通配符(glob)的表函数file。#36762 (Anton Popov)。 - 修复 Hedged 请求中的超时问题。连接在发送远程查询后就挂起,可能会导致无限期等待。 #36749 (Kruglov Pavel).
- 实验性功能:修复了分布式表上
groupBitmapAndState/groupBitmapOrState/groupBitmapXorState的一个缺陷。#36739 (Zhang Yifan). - 实验性特性:在 PR 的测试过程中,我发现某个 cache 类被初始化了两次,从而抛出异常。虽然目前还不清楚问题的根本原因,但 ClickHouse 中应该存在重复加载磁盘的逻辑,因此我们需要针对这种情况做特殊处理。#36737(Han Shukai)。
- 修复宽数据分片中的纵向合并问题。此前在合并过程中可能会抛出异常
There is no column。 #36707 (Anton Popov). - 在端口变更时修复服务器重新加载行为(不再等待查询上下文中的现有连接)。#36700(Azat Khuzhin)。
- 实验性特性:在之前的 PR 中,我发现测试(stateless tests、flaky check(address, actions))会发生超时。此外,在本地运行测试时也可能触发偶发的系统死锁。在使用 master 分支的最新源码时,该问题仍然存在。#36697(Han Shukai)。
- 实验性功能:修复在更改缓存配置后服务器无法重启的问题。#36685 (Kseniia Sumarokova)。
- 修复模式推断中可能出现的 heap-use-after-free 问题。解决 #36661。#36679(Kruglov Pavel)。
- 修复了在
CREATE查询中未指定引擎时对查询设置的解析问题。修复了 https://github.com/ClickHouse/ClickHouse/pull/34187#issuecomment-1103812419。#36642(tavplubix)。 - 实验性特性:修复合并包含
Object类型的宽数据部分的问题。#36637(Anton Popov)。 - 修复在默认表达式跟在 EPHEMERAL 而非字面量之后时出现的格式化崩溃。关闭 #36618。#36633(flynn)。
- 修复在
ENGINE = MergeTree表上使用INTERPOLATE时可能出现的Missing column异常。#36549 (Yakov Olkhovskiy)。 - 修复在 JOIN 查询的
WHERE子句中使用字面量时的潜在错误。关闭 #36279。#36542(Vladimir C)。 - 修复
ReadBufferFromEncryptedFile中的偏移量更新问题,该问题可能导致未定义行为。 #36493 (Kseniia Sumarokova). - 修复 Keeper 集群配置中的主机名合理性检查。新增
keeper_server.host_checks_enabled配置项,用于启用或禁用这些检查。#36492(Antonio Andelic)。 - 修复了在 GROUP BY 中使用可执行用户自定义函数的问题。此前,可执行用户自定义函数无法作为 GROUP BY 子句中的表达式使用。修复 #36448。#36486(Maksim Kita)。
- 修复客户端在处理来自服务器的未知数据包时可能发生的异常。 #36481 (Kseniia Sumarokova).
- 实验性功能(请务必不要使用
system.session_log,该表即将被移除):在 system.session_log 表中补充缺失的枚举值。修复 #36474。#36480(Memo)。 - 修复了
s3Cluster表结构推断中的一个错误,该错误导致通过s3Cluster执行SELECT查询时未能读取全部数据。此错误是在 https://github.com/ClickHouse/ClickHouse/pull/35544 中引入的。 #36434 (Kruglov Pavel)。 - 修复 JOIN 和 COLUMNS 匹配器中的 nullptr 解引用问题。修复了 #36416。对应的合并请求为 https://github.com/ClickHouse/ClickHouse/pull/36417。#36430(Amos Bird)。
- 修复当
ClickHouseDictionarySource包含标量子查询时的字典重新加载问题。 #36390 (lthaooo). - 修复 JOIN 中的断言问题,关闭 #36199。#36201(Vladimir C)。
- 在特殊运算符中包含别名的查询会返回解析错误(这是在 22.1 版本中引入的问题)。示例:
SELECT substring('test' AS t, 1, 1)。#36167(Maksim Kita)。 - 实验性功能:修复将包含嵌套数组的复杂 JSON 数据插入到
Object类型列时的问题。 #36077 (Anton Popov)。 - 修复在存在 compact 部件的情况下对嵌套列执行 ALTER DROP COLUMN 的问题(即在存在列
n.d时执行ALTER TABLE x DROP COLUMN n的情况)。#35797 (Azat Khuzhin). - 修复在
offset和length为负常量且s非常量时,substring 函数区间长度计算错误的问题。 #33861 (RogerYK).
ClickHouse 发行版 22.4,2022-04-19
向后不兼容变更
- 不允许在 INSERT 查询的 FORMAT 之后使用 SETTINGS(可以通过兼容性设置
allow_settings_after_format_in_insert来接受此类查询,但该设置默认关闭)。#35883 (Azat Khuzhin)。 - 函数
yandexConsistentHash(由 Konstantin "kostik" Oblakov 提出的一致性哈希算法)已重命名为kostikConsistentHash。旧名称仍作为兼容性别名保留。尽管此更改是向后兼容的,但我们可能会在后续版本中移除该别名,因此建议您在应用中更新对此函数的使用。#35553 (Alexey Milovidov)。
新特性
- 为
ORDER BY ... WITH FILL添加了INTERPOLATE扩展,并关闭了问题 #34903。#35349(Yakov Olkhovskiy)。 - 在处理器级别进行性能分析(启用
log_processors_profiles设置后,ClickHouse 会将各处理器在执行/等待数据期间消耗的时间写入system.processors_profile_log表)。#34355 (Azat Khuzhin). - 新增函数 makeDate(year, month, day)、makeDate32(year, month, day)。#35628(Alexander Gololobov)。实现了 makeDateTime() 和 makeDateTime64() 函数。#35934(Alexander Gololobov)。
- 支持新的配额类型
WRITTEN BYTES,用于限制在 INSERT 查询期间写入的字节数。 #35736 (Anton Popov). - 新增函数
flattenTuple。它接收嵌套且带名称的Tuple作为参数,并返回一个扁平化后的Tuple,其元素对应于原始Tuple中字段的路径。例如:Tuple(a Int, Tuple(b Int, c Int)) -> Tuple(a Int, b Int, c Int)。flattenTuple可用于将Object类型中的所有路径选择为单独的列。#35690 (Anton Popov). - 新增函数
arrayFirstOrNull、arrayLastOrNull。修复 #35238。#35414(Maksim Kita)。 - 新增函数
minSampleSizeContinous和minSampleSizeConversion。作者 achimbab。#35360(Maksim Kita)。 - 新增了 minSampleSizeContinous 和 minSampleSizeConversion 两个函数。#34354 (achimbab).
- 引入格式
ProtobufList(在输出 Protobuf 中将所有记录表示为 repeated 消息)。修复并关闭 #16436。#35152(Nikolai Kochetov)。 - 添加
h3PointDistM、h3PointDistKm、h3PointDistRads、h3GetRes0Indexes、h3GetPentagonIndexes函数。#34568(Bharat Nallan)。 - 添加
toLastDayOfMonth函数,用于将日期或日期时间值向上取整到所在月份的最后一天。#33501。#34394(Habibullah Oladepo)。 - 为 [Zoo]Keeper 客户端新增了负载均衡设置。修复了 #29617。#30325 (小路)。
- 添加一种名为
simple的新类型的行策略。在此 PR 之前,我们有两种行策略类型:permissive和restrictive。simple行策略只是在表上添加一个新的过滤条件,不会像permissive和restrictive策略那样产生任何副作用。#35345(Vitaly Baranov)。 - 在复制数据库中新增了指定集群密钥的功能。 #35333 (Nikita Mikhaylov).
- 在服务器启动时增加了合理性检查(可用内存和磁盘空间、最大线程数等)。#34566 (Sergei Trifonov)。
- INTERVAL 功能改进 —— 现在可以与
[MILLI|MICRO|NANO]SECOND一起使用。新增toStartOf[Milli|Micro|Nano]second()函数。新增[add|subtract][Milli|Micro|Nano]seconds()。#34353 (Andrey Zvonov)。
实验功能
- 为简单的
MergeTree表增加了事务支持。该功能目前高度实验性,不建议在生产环境中使用。属于 #22086 的一部分。#24258(tavplubix)。 - 在
JSONEachRow格式下支持对Object类型的模式推断。允许将Map类型的列转换为Object类型的列。#35629(Anton Popov)。 - 允许在所有写操作中写入远程文件系统缓存。新增
system.remote_filesystem_cache表。新增drop remote filesystem cache查询。新增通过system.remote_data_paths表检查 S3 元数据的功能。修复 #34021。通过添加模式read_from_filesystem_cache_if_exists_otherwise_bypass_cache为合并操作增加缓存选项(对合并默认开启,也可以通过同名查询设置开启)。重命名与缓存相关的设置(remote_fs_enable_cache -> enable_filesystem_cache等)。#35475(Kseniia Sumarokova)。 - 新增将数据 part 元数据存储在 RocksDB 中的选项。加速 MergeTree 数据 part 的加载过程,从而加快 clickhouse-server 的启动。通过这一改进,在存在 70 万个 MergeTree 数据 part 的情况下,clickhouse-server 的启动时间从 75 分钟缩短到 20 秒。#32928(李扬)。
性能改进
- 新的查询计划优化。在可能的情况下在
ORDER BY之后再计算函数。比如,对于查询SELECT sipHash64(number) FROM numbers(1e8) ORDER BY number LIMIT 5,函数sipHash64会在ORDER BY和LIMIT之后才被计算,这可以带来约 20 倍的加速。#35623(Nikita Taranov)。 - 现在会收集聚合过程中使用的哈希表大小,并在后续查询中利用这些信息来避免哈希表调整大小。#33439(Nikita Taranov)。
- 使用 SIMD 指令(SSE 和 AVX2)改进
hasAll函数。#27653(youennL-cs)。#35723(Maksim Kita)。 - 多项变更以提升 ASOF JOIN 的性能(提升 1.2–1.6 倍)。同时新增对使用大整数的支持。#34733(Raúl Marín)。
- 当键为原生整数类型时提升 ASOF JOIN 的性能。#35525(Maksim Kita)。
- 实现对 S3 存储的分段上传并行化。#35343(Sergei Trifonov)。
- 如果端点支持 HTTP Range,
URL存储引擎现在会并行下载多个数据块。新增两个设置:max_download_threads和max_download_buffer_size,分别用于控制单个查询可以用来下载文件的最大线程数,以及每个线程可以处理的最大字节数。#35150(Antonio Andelic)。 - 使用多个线程从 S3 下载对象。下载行为可以通过
max_download_threads和max_download_buffer_size设置进行控制。#35571(Antonio Andelic)。 - 与 HDFS 交互时缩小互斥锁的作用范围。相关 issue 见 #35292。#35646(shuchaome)。
- 仅在表级 TTL 发生变更时才需要执行 mutation。#35953(Azat Khuzhin)。
改进
- 对 schema 推断进行了多项改进。通过一些优化和启发式规则,在 CSV、TSV 和 TSVRaw 数据格式中识别数字、字符串、数组、Tuple 和 Map。为 CSV 格式新增设置
input_format_csv_use_best_effort_in_schema_inference,用于启用或禁用这些启发式规则;如果禁用,则将所有内容都视为字符串。为 TSV/TSVRaw 格式新增类似设置input_format_tsv_use_best_effort_in_schema_inference。这些设置默认启用。- 为 Values 格式的 schema 推断添加 Map 类型支持。- 修复了 Values 格式中 schema 推断可能出现的段错误。- 允许在 Arrow/ORC/Parquet 格式中跳过具有不受支持类型的列,并为此添加了相应设置:input_format_{parquet|orc|arrow}_skip_columns_with_unsupported_types_in_schema_inference。这些设置默认关闭。- 允许在 Arrow/Parquet 格式中将类型为 Null 的列转换为包含全部 NULL 值的 Nullable 列。- 允许通过设置column_names_for_schema_inference,在不包含列名的格式(如 CSV、TSV、JSONCompactEachRow 等)中为 schema 推断显式指定列名。- 修复了 ORC/Arrow/Parquet 格式在处理 Nullable 列时的 schema 推断问题。之前所有推断出的类型都不是 Nullable,从而阻止从数据中读取 Nullable 列;现在已修复,所有推断出的类型始终为 Nullable(因为仅通过读取 schema 无法判断列是否为 Nullable)。- 修复了在使用 CSV 转义规则的 Template 格式中的 schema 推断问题。#35582(Kruglov Pavel)。 - 为格式
JSONAsObject添加并行解析和模式推断。 #35592 (Anton Popov). - 为
s3Cluster表函数添加了对自动模式推断的支持,并同步了s3与s3Cluster的函数签名。 #35544 (Nikita Mikhaylov)。 - 为
hdfsCluster添加了 schema 推断支持。#35602 (Nikita Mikhaylov)。 - 新增设置
input_format_json_read_bools_as_numbers,允许在 JSON 输入格式中将布尔值推断并解析为数字。该设置默认启用。由 @alexey-milovidov 提出。#35735(Kruglov Pavel)。 - 改进对 TSKV 和 JSONEachRow 格式进行模式推断时的列顺序,修复 #35640。在对 TSKV 和 JSONEachRow 格式进行模式推断时,读取到空行时不要停止模式推断。#35724 (Kruglov Pavel)。
- 新增设置
input_format_orc_case_insensitive_column_matching、input_format_arrow_case_insensitive_column_matching和input_format_parquet_case_insensitive_column_matching,使 ClickHouse 在从 ORC、Arrow 或 Parquet 文件读取数据时支持对列名进行大小写不敏感匹配。#35459 (Antonio Andelic)。 - 向
system.query_log添加了is_secure列,用于指示客户端是否通过 TCP 或 HTTP 使用安全连接。#35705 (Antonio Andelic). - 现在在资源较少的机器(少于 16 个物理核心)上,
kafka_num_consumers可以大于该机器的物理核心数量。#35926(alesapin)。 - 添加了一些基本指标用于监控使用 engine=Kafka 的表。#35916 (filimonov)。
- 现在,不再允许对 MergeTree 系列引擎中不存在的设置执行
ALTER TABLE ... RESET SETTING。修复了 #35816。#35884(alesapin)。 - 现在,部分针对
Array和Nullable类型的ALTER MODIFY COLUMN查询可以在元数据层完成,而无需执行 mutation 操作。比如,可以将Array(Enum8('Option1'=1))修改为Array(Enum8('Option1'=1, 'Option2'=2))。 #35882 (alesapin). - 为沙漏图标添加了动画,以提示用户查询正在运行。#35860 (peledni)。
- 支持 ALTER TABLE t DETACH PARTITION (ALL) 语法。 #35794 (awakeljw).
- 改进投影分析以优化诸如
count()之类的简单查询。#35788 (Amos Bird). - 为使用
input表函数的 insert select 操作提供模式推断支持。在对支持模式推断的表函数执行 insert select 时,从插入目标表获取模式,而不是从数据中推断模式。修复 #35639。#35760(Kruglov Pavel)。 - 在 Hive 表中遵循
remote_url_allow_hosts配置。 #35743 (李扬). - 在 clickhouse-local 中实现
send_logs_level。关闭了 #35653。#35716(Kseniia Sumarokova)。 - 关闭 #35641:允许在没有显式默认表达式的情况下使用
EPHEMERAL列。 #35706 (Yakov Olkhovskiy)。 - 添加 profile 事件计数器
AsyncInsertBytes,用于统计异步 INSERT 的数据大小。 #35644 (Alexey Milovidov). - 改进 JOIN 的流水线描述。#35612 (何李夫).
- 推导出 HDFS 配置的绝对路径。 #35572 (李扬).
- 改进 clickhouse-client 的粘贴性能和兼容性。这有助于解决 #35501。#35541(Amos Bird)。
- 在解析嵌套层级非常深的数据类型时,如果设置项
async_socket_for_remote和use_hedged_requests中的任意一个被启用(至少在调试构建中),分布式查询中可能会发生栈溢出。修复了 #35509。#35524(Kruglov Pavel)。 - 在
system.parts_columns表中新增子列大小信息。#35488 (Anton Popov)。 - 在查询计划和管道中为扫描节点添加显式表信息。 #35460 (何李夫).
- 允许服务器绑定到低号端口(例如 443)。ClickHouse 安装脚本会为该二进制文件设置
cap_net_bind_service。#35451 (Alexey Milovidov)。 - 修复 INSERT INTO table FROM INFILE 未显示进度条的问题。#35429 (xiedeyantu).
- 为
clickhouse-diagnostics工具新增--user、--password、--host、--port参数。#35422(李扬)。 - 为 Postgres 引擎添加对 UUID 的支持。关闭 #35384。#35403(Kseniia Sumarokova)。
- 对于表函数
s3cluster、HDFSCluster或hive,我们无法通过StorageFactory::instance().getSourceAccessType(getStorageTypeName())获取正确的AccessType。此 PR 修复了该问题。#35365 (李扬)。 - 移除 clickhouse-client 的
--testmode选项,并始终启用该模式。#35354 (Kseniia Sumarokova). - 不允许为 clickhouse-keeper 执行
wchc操作(四字命令)。#35320 (zhangyuli1). - 添加函数
getTypeSerializationStreams。对于指定的类型(从列中检测出),它返回一个包含所有序列化子流路径的数组。此函数主要供开发者使用。#35290(李扬)。 - 如果在集群配置中未指定
port,将使用默认服务器端口。这修复了 #34769。#34772(Alexey Milovidov)。 - 在 Hive 引擎中对 ORC/Parquet 文件使用
minmax索引。相关 PR:https://github.com/ClickHouse/arrow/pull/10。#34631(李扬)。 - 系统日志表现在允许在 ENGINE 声明中指定 COMMENT。修复了问题 #33768。#34536(Maksim Kita)。
- 在按照排序键的顺序读取且指定了
LIMIT的情况下,现已正确支持设置max_rows_to_read。此前,即便查询实际只需要读取更少的行,也可能抛出Limit for rows or bytes to read exceeded异常。#33230 (Anton Popov)。 - 仅考虑来自 cgroup 的配额和周期,忽略 shares(它们并不能真正限制可用的 CPU 核心数量)。 #35815 (filimonov).
构建/测试/打包改进
- 在功能测试中添加了新一批随机化设置。#35047 (Kruglov Pavel).
- 在压力测试中添加向后兼容性检查。关闭了 #25088。#27928 (Kruglov Pavel).
- 将包构建迁移到
nfpm—— 弃用release脚本,改用packages/build—— 在 clickhouse/binary-builder 镜像中构建所有内容(清理:clickhouse/deb-builder)—— 在 CMake 中添加符号剥离(待办:使用 bin_dir/clickhouse/$binary.debug)—— 修复 DWARF 符号问题 —— 添加 Alpine APK 包 —— 将alien重命名为additional_pkgs。#33664 (Mikhail f. Shiryaev). - 为 Coverity 添加夜间扫描和上传任务。#34895 (Boris Kuschel).
- 为
clickhouse-keeper提供一个独立的小包。#35308 (Mikhail f. Shiryaev). - 使用 podman 运行时会失败:其会报错称同一卷被指定了两次。#35978 (Roman Nikonov).
- 对 contrib/krb5 构建配置进行了小幅改进。#35832 (Anton Kozlov).
- 为每个镜像添加标签,以区分其构建任务。#35583 (Mikhail f. Shiryaev).
- 将
black格式化器应用于 Python 代码,并添加逐提交检查。#35466 (Mikhail f. Shiryaev). - 重新构建 Alpine 镜像以使用精简的 Dockerfile。在 tests/ci 中创建脚本,同时构建 Ubuntu 和 Alpine 镜像。添加 clickhouse-keeper 镜像(cc @nikitamikhaylov)。在 PullRequestCI 中添加构建检查。在 ReleaseCI 中添加一个任务。在 MasterCI 中添加一个任务,为每个合并的 PR 构建并推送
clickhouse/clickhouse-server:head和clickhouse/clickhouse-keeper:head镜像。#35211 (Mikhail f. Shiryaev). - 修复 CI 中的压力测试报告,现在我们只上传一次包含已启动压力测试信息的运行日志。#35093 (Mikhail f. Shiryaev).
- 切换到来自 LLVM 14 的 libcxx / libcxxabi。#34906 (Raúl Marín).
- 更新 unixODBC 以缓解 CVE-2018-7485。注意:该 CVE 与 ClickHouse 无关,因为 ClickHouse 为 ODBC 实现了自己的隔离层。#35943 (Mikhail f. Shiryaev).
缺陷修复
- 新增设置
input_format_ipv4_default_on_conversion_error和input_format_ipv6_default_on_conversion_error,从而允许在插入数据时将无效的 IP 地址值按默认值写入表中。关闭了 #35726。#35733(Maksim Kita)。 - 在从 Hive 读取数据时,避免因列不存在而从数据块中删除该列。#35393 (lgbo).
- 在创建物化视图时增加类型检查。关闭:#23684。#24896(hexiaoting)。
- 修复 INSERT INFILE 查询语句的格式(缺少引号)。 #35886 (Azat Khuzhin).
- 因为通过 fuzzing 发现了内存安全问题,已禁用
session_log。参见 #35714、#35873(Alexey Milovidov)。 - 避免对列级 TTL 进行重复处理。 #35820 (Azat Khuzhin).
- 修复在一次插入查询中包含多个分区数据时向
Object类型列插入数据的问题。#35806 (Anton Popov). - 修复 -WithNames 格式中未出现列的索引错误,当列数超过 256 时会导致报错
INCORRECT_NUMBER_OF_COLUMNS。关闭 #35793。 #35803 (Kruglov Pavel). - 修复 #35751。#35799(Nikolay Degterinsky)。
- 修复以 Snappy 格式从 HDFS 读取时的问题。 #35771 (shuchaome)。
- 修复了从自定义类型转换为字符串时的缺陷,该缺陷可能导致段错误或意外的错误信息。关闭 #35752。#35755(Kruglov Pavel)。
- 修复 ANY/ALL 子查询的实现。关闭 #35489。#35727(Kseniia Sumarokova)。
- 修复在 clickhouse-local 中删除非空数据库的问题。关闭 #35692。#35711(Kseniia Sumarokova)。
- 修复了服务器重启后带子查询的物化视图创建相关的错误。服务器重启后,对基础表执行插入操作时,物化视图不会更新。关闭 #35511。#35691(Kruglov Pavel)。
- 修复在读取实验性类型
Object的子列时可能出现的Can't adjust last granule异常。 #35687 (Anton Popov). - 默认启用支持 JIT 编译的构建。 #35683 (Maksim Kita).
- 修复实验性类型
Object中可能出现的子列丢失问题。#35682(Anton Popov)。 - 修复 ASOF JOIN 键可空性检查,关闭 #35565。#35674(Vladimir C)。
- 修复带有 projection 的 part 的检查逻辑。当 projection 与主 part 的类型不同时会产生错误。这与 https://github.com/ClickHouse/ClickHouse/pull/33774 类似。该缺陷已由 @caoyang10 修复。#35667(Amos Bird)。
- 修复在向
format函数传入大量参数时导致的服务器崩溃。请参考测试文件了解如何复现该崩溃。#35651 (Amos Bird). - 修复异步插入中的配额使用问题。#35645 (Anton Popov).
- 修复带别名的位置参数。关闭问题 #35600。#35620(Kseniia Sumarokova)。
- 在 URL 引擎中进行 schema 推断之前检查
remote_url_allow_hosts。修复了 #35064。#35619(Kruglov Pavel)。 - 修复在使用
LowCardinality类型列时的HashJoin问题。此更改关闭了 #35548。#35616(Antonio Andelic)。 - 修复 MaterializedPostgreSQL 中可能出现的段错误:如果在将内存中收集的数据同步到底层表时发生异常,可能会触发该段错误。已关闭 #35611。#35614(Kseniia Sumarokova)。
- 当此前分离的表仍在使用时,为
ATTACH TABLE查询设置database_atomic_wait_for_drop_and_detach_synchronously的行为不正确,现已修复。 #35594 (tavplubix). - 修复带命名集合的 HTTP 头部,并添加 compression_method。关闭 #35273。关闭 #35269。#35593(Kseniia Sumarokova)。
- 修复 S3 引擎获取虚拟列的问题。解决 #35411。#35586(Kseniia Sumarokova)。
- 修复了
caseWithExpression的返回类型推断。现在会正确考虑 ELSE 分支的类型。#35576 (Antonio Andelic)。 - 修复对长度超过 39 个字符的 IPv6 地址的解析。关闭 #34022。#35539(Maksim Kita)。
- 修复在 IN 子句中将值转换为 IPv4、IPv6 地址时的行为。修复了 #35528。#35534(Maksim Kita)。
- 修复在短路求值函数执行时,当其中一个参数为可空常量时发生的崩溃问题。关闭 #35497。关闭 #35496。#35502(Maksim Kita)。
- 修复在使用常量参数时函数
throwIf崩溃的问题。#35500 (Maksim Kita)。 - 修复了 Keeper 中可能导致客户端连接不稳定的缺陷。该问题在 #35031 中被引入。#35498 (alesapin)。
- 修复函数
if中的一个 bug:当结果列类型与结果数据类型不一致时,会导致诸如Logical error: 'Bad cast from type DB::ColumnVector<int> to DB::ColumnVector<long>'.之类的逻辑错误。修复关闭了 #35367。#35476(Kruglov Pavel)。 - 修复在使用 S3 作为 MergeTree 的后端或作为单独的表引擎/函数时日志过多的问题。修复了 #30559。#35434(alesapin)。
- 现在使用零拷贝复制(实验特性)执行的合并操作,将不再在日志中大量记录消息
Found parts with the same min block and with the same max block as the missing part _ on replica _. Hoping that it will eventually appear as a result of a merge.。#35430 (alesapin)。 - 在 GroupingAggregatedTransform 中出现空 chunk 时,跳过可能产生的异常。 #35417 (Nikita Taranov).
- 修复在 Arrow/Parquet/ORC 格式下处理查询中未使用列的方式,当文件包含不受支持类型的列且该列未在查询中使用时,可避免出现
Unsupported <format> type <type> of an input column <column_name>之类的潜在错误。 #35406 (Kruglov Pavel). - 修复远程文件系统本地缓存(实验性功能)在某些极端高并发场景下的问题。#35381(Kseniia Sumarokova)。修复缓存中可能出现的死锁。#35378(Kseniia Sumarokova)。
- 修复在
WHERE子句中与常量比较时的分区裁剪问题。如果列与常量的类型不同,则可能发生溢出,从而导致查询错误地返回空结果。此修复解决了 #35304。#35334(Amos Bird)。 - 修复在使用较小
max_read_buffer_size时对 TSKV 格式的模式推断问题。 #35332 (Kruglov Pavel). - 修复在启用了稀疏列的表中的变更操作。 #35284 (Anton Popov).
- 默认情况下不再延迟最终 part 的写入(通过新增
max_insert_delayed_streams_for_parallel_write参数修复了INSERT期间可能出现的Memory limit exceeded错误:对写入 S3 的场景默认值为 1000,其他情况下与之前一样保持禁用)。 #34780 (Azat Khuzhin).
ClickHouse 发布 v22.3-lts,2022-03-17
不向后兼容的变更
- 使
arrayCompact函数的行为与其他高阶函数一致:不是对 lambda 函数的结果进行压缩,而是对原始数组进行压缩。如果你在arrayCompact中使用了较为复杂的 lambda 函数,可以通过将传入arrayCompact的参数再包一层arrayMap来恢复旧行为。修复 #34010 #18535 #14778。#34795(Alexandre Snarskii)。 - 修改
toDatetime函数在溢出时的特定实现行为。现在会饱和到 datetime 支持范围内最近的最小/最大时间点,而不再发生回绕(wraparound)。之所以将该变更标记为“不向后兼容”,是因为可能有人无意中依赖了旧行为。#32898(HaiBo Li)。 - 使
cast(value, 'IPv4')、cast(value, 'IPv6')的行为与toIPv4、toIPv6函数相同。更改了向toIPv4、toIPv6函数传入不正确 IP 地址时的行为,现在如果向这些函数传入无效 IP 地址,将会抛出异常;之前这些函数会返回默认值。新增函数IPv4StringToNumOrDefault、IPv4StringToNumOrNull、IPv6StringToNumOrDefault、IPv6StringOrNull、toIPv4OrDefault、toIPv4OrNull、toIPv6OrDefault、toIPv6OrNull。如果之前的逻辑依赖IPv4StringToNum、toIPv4、toIPv6在无效地址时返回默认值,则应使用IPv4StringToNumOrDefault、toIPv4OrDefault、toIPv6OrDefault。新增设置项cast_ipv4_ipv6_default_on_conversion_error,如果启用该设置,则 IP 地址转换函数将保持原有行为。修复 #22825。修复 #5799。修复 #35156。#35240(Maksim Kita)。
新功能
- 支持为远程文件系统本地缓存数据。可在
s3磁盘上启用。已关闭 #28961。#33717(Kseniia Sumarokova)。与此同时,我们在 s3 文件系统上启用了测试套件,目前不存在已知问题,因此其已基本可以用于生产环境。 - 新增表函数
hive。可以如下使用:hive('<hive metastore url>', '<hive database>', '<hive table name>', '<columns definition>', '<partition columns>'),例如SELECT * FROM hive('thrift://hivetest:9083', 'test', 'demo', 'id Nullable(String), score Nullable(Int32), day Nullable(String)', 'day')。#34946(lgbo)。 - 支持通过用户的 X.509 证书对经由 SSL 连接的用户进行认证。#31484(eungenue)。
- 支持在向表函数
file/hdfs/s3/url插入数据时自动推断 schema。#34732(Kruglov Pavel)。 - 现在可以在不对路径或
like表达式施加限制的情况下读取system.zookeeper表。此类读取可能会对 zookeeper 产生较大负载,因此若要启用此能力,必须先启用设置allow_unrestricted_reads_from_keeper。#34609(Sergei Trifonov)。 - 在 clickhouse-local 中展示 CPU 和内存指标。已关闭 #34545。#34605(李扬)。
- 为数组实现
startsWith和endsWith函数,已关闭 #33982。#34368(usurai)。 - 为 Map 数据类型新增三个函数:1.
mapReplace(map1, map2)—— 使用 map2 中对应键的值替换 map1 中相同键的值;并为 map1 中不存在的键添加来自 map2 的键。2.mapFilter3.mapMap。mapFilter和mapMap是高阶函数,接受两个参数,第一个参数是以 k、v 键值对为参数的 lambda 函数,第二个参数是 Map 类型的列。#33698(hexiaoting)。 - 允许从环境变量
CLICKHOUSE_USER和CLICKHOUSE_PASSWORD中获取 clickhouse-client 的默认用户和密码。已关闭 #34538。#34947(DR)。
实验特性
- 新的数据类型
Object(<schema_format>),支持存储半结构化数据(目前仅支持 JSON)。数据以字符串形式写入该类型。随后会根据半结构化数据的格式抽取所有路径,并以能够存储其所有值的最优类型写入为单独的列。这些列可以通过与源数据路径匹配的名称进行查询,例如data.key1.key2,或使用强制转换操作符data.key1.key2::Int64。 - 新增
database_replicated_allow_only_replicated_engine设置。启用后,在Replicated数据库中只允许创建Replicated表或无状态引擎的表。#35214(Nikolai Kochetov)。请注意,Replicated数据库仍然是实验性特性。
性能改进
- 通过优化排序提升向
MergeTree表插入的性能。在真实基准测试中可实现最高 2 倍的性能提升。#34750 (Maksim Kita)。 - 从 URL 和 S3 读取 Parquet、ORC 和 Arrow 文件时进行列裁剪。修复 #34163。#34849 (Kseniia Sumarokova)。
- 从 Hive 读取 Parquet、ORC 和 Arrow 文件时进行列裁剪。#34954 (lgbo)。
- 来自性能“超级英雄”的一系列性能优化:提升包含大型
IN子句的查询处理性能;当direct字典的来源为ClickHouse时提升其性能;提升detectCharset、detectLanguageUnknown函数的性能。#34888 (Maksim Kita)。 - 通过增加批处理提升
any聚合函数的性能。#34760 (Raúl Marín)。 - 多项
clickhouse-keeper性能改进:减少加锁 #35010 (zhanglistar),通过对快照进行流式读写而非完整拷贝来降低内存占用 #34584 (zhanglistar),优化 RAFT 实现中日志存储的压缩 #34534 (zhanglistar),以及内部数据结构的版本管理 #34486 (zhanglistar)。
改进
- 支持对表函数的异步插入。修复 #34864。#34866(Anton Popov)。
- 为函数
dictGetHierarchy、dictIsIn、dictGetChildren、dictGetDescendants的键参数添加了隐式类型转换。修复了 #34970。#35027(Maksim Kita)。 EXPLAIN AST查询可以以 Graphviz 图形格式输出 AST:EXPLAIN AST graph = 1 SELECT * FROM system.parts。 #35173 (李扬)。- 当使用
s3表函数或表引擎写入大文件时,由于 AWS SDK 中的一个缺陷,这些文件的内容类型(Content-Type)被错误地设置为application/xml。此修复关闭了 #33964。#34433(Alexey Milovidov)。 - 对限制性行策略进行了小幅调整,使其在简单场景下更易作为宽松策略的替代方案。如果某个表仅存在限制性策略(没有宽松策略),用户仍然能够看到部分行。此外,
SHOW CREATE ROW POLICY在行策略定义中将始终显示AS permissive或AS restrictive。#34596(Vitaly Baranov)。 - 通过在 File/S3/HDFS/URL 引擎中使用 glob 模式改进 schema 推断。如果出错,则尝试使用下一个路径进行 schema 推断。#34465 (Kruglov Pavel).
- Play UI 现在可以正确检测并遵循操作系统中的首选浅色或深色主题。#35068 (peledni)。
- 已添加
date_time_input_format = 'best_effort_us'。关闭了 #34799。#34982(WenYao)。 - 在服务器配置中新增了两个名为
allow_plaintext_password和allow_no_password的设置,用于开启或关闭在某些环境下可能不安全的身份验证类型。默认情况下它们是启用的。#34738 (Heena Bansal)。 - 在
Arrow格式中添加对DateTime64数据类型的支持,并关闭 #8280 和 #28574。#34561(李扬)。 - 在配置更新时重新加载
remote_url_allow_hosts(用于过滤出站连接)。#35294(Nikolai Kochetov)。 - 为
clickhouse-local新增对--testmode参数的支持。该参数用于解释我们在功能测试中使用的测试提示。#35264 (Kseniia Sumarokova)。 - 在查询日志中添加
distributed_depth。它类似于is_initial_query的更详细版本 #35207(李扬)。 - 使
MySQL和PostgreSQL表函数遵守remote_url_allow_hosts设置。 #35191 (Heena Bansal). - 向
system.part_log添加了disk_name字段。 #35178 (Artyom Yurkov). - 在查询远程 URL 时,不要对不可重试的错误进行重试。关闭了 #35161。#35172(Kseniia Sumarokova)。
- 通过设置
parallel_distributed_insert_select,支持在表函数view()中执行分布式 INSERT SELECT 查询。#35132 (Azat Khuzhin). - 在将数据
INSERT到包含AggregateFunction的Buffer时,实现了更精确的内存跟踪。 #35072 (Azat Khuzhin). - 在 Linux 内核存在缺陷的情况下,避免在 Query Profiler 中发生除零错误。关闭 #34787。#35032(Alexey Milovidov)。
- 为 keeper 配置添加了更多合理性检查:现在不允许将 localhost 与非本地服务器混用,并且增加了对内部 Raft 端口与 keeper 客户端端口相同情况的检查。#35004 (alesapin)。
- 当前情况下,如果用户修改系统表的设置,会产生大量日志,并且 ClickHouse 会每分钟重命名这些表。本更改修复了 #34929。#34949(Nikita Mikhaylov)。
- 为 Hive metastore 客户端启用连接池。#34940 (lgbo).
- 在
CREATE TABLE AS中,如果新表的表引擎不支持按列TTL(即表引擎不属于MergeTree系列),则会忽略该按列TTL设置。 #34938 (Azat Khuzhin). - 允许在
ngrambf_v1/tokenbf_v1索引中使用LowCardinality字符串列。修复 #21865。#34911(Lars Hiller Eidnes)。 - 如果文件不存在,也允许打开一个空的 SQLite 数据库。关闭 #33367。#34907(Kseniia Sumarokova)。
- 为 FreeBSD 实现内存统计,以便
max_server_memory_usage能够正常工作。#34902 (Alexandre Snarskii)。 - 在早期版本中,
clickhouse-client中的进度条有时会在没有任何原因的情况下突然向前跳到接近 50%。此更改修复了问题 #34324。#34801(Alexey Milovidov)。 - 现在,当
columnX是ALIAS列时,在MergeTree表引擎上执行的ALTER TABLE DROP COLUMN columnX查询将会立即完成。修复了 #34660。#34786(alesapin)。 - 当用户拼错数据跳过索引名称时显示提示信息。修复了 #29698。#34764(flynn)。
parallel_distributed_insert_select现在支持remote()/cluster()表函数。#34728 (Azat Khuzhin)。- 当配置文件中相应配置为空时,不要重置通过
--log-file/--errorlog-file命令行选项配置的日志。 #34718 (Amos Bird). - 仅在创建表时提取一次 schema,并禁止在每次服务器启动时通过读取本地文件或外部源来提取 schema。#34684 (Kruglov Pavel).
- 允许为可执行 UDF 指定参数名称。对于参数名称是序列化一部分的格式(例如
Native、JSONEachRow),这是必要的。关闭 #34604。#34653(Maksim Kita)。 MaterializedMySQL(实验性功能)现在支持materialized_mysql_tables_list(一个以逗号分隔的 MySQL 数据库表名列表,这些表将由 MaterializedMySQL 数据库引擎复制。默认值:空列表 — 表示将复制所有表),详见 #32977。#34487(zzsmdfj)。- 改进在分布式表上执行 INSERT 操作时的 OpenTelemetry span 日志。#34480 (Frank Chen).
- 使 ClickHouse Keeper 中各服务器上的 znode
ctime和mtime保持一致。#33441 (小路).
构建/测试/打包改进
- 将软件包仓库迁移到 JFrog Artifactory(Mikhail f. Shiryaev)。
- 在功能测试中随机化部分设置,以便覆盖更多可能的配置组合。这是另一种模糊测试方法,用于提升测试覆盖率。已关闭 #32268。#34092(Kruglov Pavel)。
- 在我们的 CI 中移除 PVS-Studio。#34680(Mikhail f. Shiryaev)。
- 新增通过 CMake 构建精简二进制文件的能力。在之前的版本中,这是通过 dh-tools 完成的。#35196(alesapin)。
- 体积更小的“精简版”
clickhouse-keeper构建。#35031(alesapin)。 - 对于类似 https://github.com/ClickHouse/ClickHouse/pull/34685 的 PR,使用 @robot-clickhouse 作为作者和提交者。#34793(Mikhail f. Shiryaev)。
- 将调试信息的 DWARF 版本上限限制为 4,因为我们的内部栈符号解析器无法解析 DWARF 版本 5。如果你使用 clang-15 编译 ClickHouse,这样做是有意义的。#34777(Alexey Milovidov)。
- 移除
clickhouse-testdebian 软件包,以避免不必要的复杂性。CI 使用来自代码仓库的测试,通过 deb 包进行的独立测试不再受支持。#34606(Ilya Yatsishin)。
Bug 修复(在官方 stable 或 prestable 版本中对用户可见的异常行为)
- 针对 HDFS 集成的修复:当内部缓冲区大小过小时,
HadoopSnappyDecoder中的 NEED_MORE_INPUT 会针对同一个压缩块被触发多次(>=3 次)。这会导致输入数据被拷贝到HadoopSnappyDecoder::buffer中错误的位置。#35116 (lgbo)。 - 在 ATTACH GRANT 语句中忽略过时的授权。本 PR 修复了 #34815。#34855(Vitaly Baranov)。
- 修复在 Postgres 数据库中,当数据库是使用命名集合创建时,获取
CREATE TABLE查询会导致的段错误(segfault)问题。关闭 #35312。#35313(Kseniia Sumarokova)。 - 修复部分合并连接中产生重复行的 Bug,关闭 #31009。#35311(Vladimir C)。
- 修复在使用 bzip2 压缩且
max_read_buffer_size设置值较小时,可能出现的Assertion 'position() != working_buffer.end()' failed问题。该 bug 在 https://github.com/ClickHouse/ClickHouse/pull/35047 中被发现。#35300(Kruglov Pavel)。修复在使用 lz4 压缩且max_read_buffer_size设置值较小时可能出现的问题。#35296(Kruglov Pavel)。修复在使用 lzma 压缩且max_read_buffer_size设置值较小时可能出现的问题。#35295(Kruglov Pavel)。修复在使用brotli压缩且max_read_buffer_size设置值较小时可能出现的问题。该 bug 在 https://github.com/ClickHouse/ClickHouse/pull/35047 中被发现。#35281(Kruglov Pavel)。 - 修复
JSONEachRow模式推断时可能出现的段错误。 #35291 (Kruglov Pavel)。 - 修复在表中启用稀疏列时的
CHECK TABLE查询。 #35274 (Anton Popov). - 在从远程 VFS 读取出现异常时,避免调用
std::terminate。 #35257 (Azat Khuzhin). - 修复从配置文件读取端口的逻辑,关闭 #34776。#35193(Vladimir C)。
- 修复了在包含
WITH TOTALS的查询中,当HAVING返回空结果时发生的错误。此更改修复了 #33711。#35186(Amos Bird)。 - 修复
replaceRegexpAll的一个边界条件问题,关闭 #35117。#35182(Vladimir C)。 - 在使用
INSERT INTO FUNCTION s3(...) FROM ...的情况下,Schema 推断未正常工作,它尝试从 s3 文件中读取 Schema,而不是从 SELECT 查询中读取。 #35176 (Kruglov Pavel). - 修复 MaterializedPostgreSQL(实验性特性)中
table overrides(用于 partition by 等)的行为。关闭 #35048。#35162(Kseniia Sumarokova)。 - 修复 MaterializedPostgreSQL(实验特性)在手动移除表(DETACH TABLE)后,再通过将新表加入复制(ATTACH TABLE)时的行为问题。关闭 #33800。关闭 #34922。关闭 #34315。#35158(Kseniia Sumarokova)。
- 修复在与 IN 运算符配合使用非单调函数时出现的分区裁剪错误。这修复了 #35136。#35146(Amos Bird)。
- 修复了将 YAML 配置转换为 XML 时的一些轻微错误。#35135 (Miel Donkers).
- 修复
optimize_skip_unused_shards_rewrite_in在有符号列和负值上的问题。 #35134 (Azat Khuzhin). update_lag外部字典配置选项不可用,会显示错误信息Unexpected key `update_lag` in dictionary source configuration。 #35089 (Jason Chu).- 在服务器关闭时避免可能发生的死锁。 #35081 (Azat Khuzhin).
- 修复在启用
optimize_functions_to_subcolumns设置时,函数被优化为子列后导致别名缺失的问题。修复了 #33798。#35079(qieqieplus)。 - 修复在存在针对表函数的异步插入操作时,从
system.asynchronous_inserts表中读取的问题。 #35050 (Anton Popov). - 修复可能出现的异常
Reading for MergeTree family tables must be done with last position boundary(与在远程 VFS 上执行的操作相关)。修复 #34979。#35001(Kseniia Sumarokova)。 - 修复在窗口帧中使用 -State 类型聚合函数时产生的非预期结果。#34999 (metahys).
- 修复 FileLog 中可能发生的段错误(实验性功能)。关闭 #30749。#34996(Kseniia Sumarokova)。
- 修复一个可能会出现的罕见错误
Cannot push block to port which already has data。 #34993 (Nikolai Kochetov). - 修复 CSV 中未加引号日期的 schema 误判。关闭 #34768。#34961(Kruglov Pavel)。
- Integration with Hive: 修复在 Hive 查询的
WHERE子句中使用IN时出现的意外结果。#34945 (lgbo)。 - 避免 ClickHouse Keeper 在查找待删除的 changelog 文件时进行忙轮询。 #34931 (Azat Khuzhin).
- 修复从 PostgreSQL 到 DateTime64 的转换。关闭 #33364。#34910(Kseniia Sumarokova)。
- 修复在向基于 S3 上 VFS 的 MergeTree 表执行
INSERT时可能出现的 "Part directory doesn't exist" 错误。#34876 (Azat Khuzhin). - 支持在跨副本集群上执行 CREATE USER 等 DDL。 #34860 (Jianmei Zhang).
- 修复在
WindowView(实验性功能)中使用多列 GROUP BY 时的错误。 #34859 (vxider). - 修复在查询包含 const 列时 S2 函数中可能出现的错误。#34745 (Bharat Nallan).
- 修复 H3 函数在包含常量列时导致查询失败的错误。#34743(Bharat Nallan)。
- 修复在启用
fsync_part_directory和垂直合并(vertical merge)时出现的No such file or directory错误。#34739 (Azat Khuzhin). - 修复在配合
ON CLUSTER使用时,系统查询RELOAD MODEL、RELOAD FUNCTION、RESTART DISK的序列化/打印问题。修复了 #34514。#34696(Maksim Kita)。 - 使用
enable_global_with_statement修复allow_experimental_projection_optimization(此前在WITH子句中包含多个表达式时,可能会导致Stack size too large错误,并且会重复执行标量子查询,因此现在将更加高效)。 #34650 (Azat Khuzhin). - 当其他副本已经为
ReplatedMergeTree引擎更新事务日志时,停止选择要执行 mutate 的数据片段。#34633 (Jianmei Zhang)。 - 修复在使用数据分片移动功能时,简单的
count查询返回结果不正确的问题 #34089。#34385 (nvartolomei)。 - 修复分布式子查询中
max_query_size限制行为不一致的问题。#34078(Chao Ma)。
ClickHouse 发布 v22.2,2022-02-17
升级说明
- 在带有 FINAL 的查询中使用 data skipping 索引可能会产生错误结果。在此版本中,我们默认在带有 FINAL 的查询中禁用 data skipping 索引(引入了一个新的设置
use_skip_indexes_if_final,且默认关闭)。#34243 (Azat Khuzhin)。
新特性
- Projections 现已可用于生产环境。将
allow_experimental_projection_optimization默认开启,并弃用该设置。#34456 (Nikolai Kochetov)。 - 为
File/S3/HDFS引擎在插入时提供创建新文件的选项。允许在HDFS中覆盖文件。默认情况下,尝试覆盖S3中的文件时会抛出异常。尝试向使用带后缀名(因而不支持追加,如Parquet、ORC)的格式的文件追加数据时会抛出异常。关闭 #31640、#31622、#23862、#15022、#16674。#33302(Kruglov Pavel)。 - 在
MergeTree/ReplicatedMergeTree中新增一个设置项,允许用户提供自定义去重语义。如果提供了该设置,将使用其指定的值而不是数据摘要来生成块 ID。这样,例如在每条 INSERT 语句中为该设置提供一个唯一值,用户就可以避免对相同的插入数据进行去重。此更改关闭了 #7461。#32304(Igor Nikonov)。 - 为 INSERT 语句添加对
DEFAULT关键字的支持。修复 #6331。#33141(Andrii Buriachevskyi)。 - 在
CREATE TABLE查询中添加了EPHEMERAL列修饰符。已关闭 #9436。 #34424 (yakov-olkhovskiy)。 - 为
TTL expr TO [DISK|VOLUME] [IF EXISTS] 'xxx'功能增加对IF EXISTS子句的支持。只有当对应磁盘或卷在副本上实际存在时,数据部分才会被移动到该磁盘或卷,因此MOVE TTL规则能够依据各副本当前的存储策略,在不同副本上表现出不同的行为。解决 #34455。#34504(Anton Popov)。 - 允许设置默认表引擎,并在未指定 ENGINE 时创建表。#34187 (Ilya Yatsishin)。
- 新增表函数
format(format_name, data)。 #34125 (Kruglov Pavel)。 - 即使从 stdin 接收数据,
clickhouse-local也能根据文件名检测格式。#33829 (Kruglov Pavel). - 为
values表函数添加 schema 推断功能。修复 #33811。 #34017(Kruglov Pavel)。 - 在重新加载配置时动态刷新服务器 TLS 证书。修复了 #15764。#15765(johnskopis)。#31257(Filatenkov Artur)。
- 现在,ReplicatedMergeTree 在部分磁盘损坏时也能恢复数据。#13544(Amos Bird)。
- clickhouse-client 中的容错连接:
clickhouse-client ... --host host1 --host host2 --port port2 --host host3 --port port --host host4。#34490 (Kruglov Pavel)。#33824 (Filippov Denis)。 - 为实现 MySQL 兼容性,新增
DEGREES和RADIANS函数。#33769 (Bharat Nallan). - 添加
h3ToCenterChild函数。 #33313 (Bharat Nallan)。新增 h3 杂项函数:edgeLengthKm,exactEdgeLengthKm,exactEdgeLengthM,exactEdgeLengthRads,numHexagons。 #33621 (Bharat Nallan)。 - 添加函数
bitSlice,用于从 String/FixedString 中提取位子序列。 #33360 (RogerYK)。 - 已实现
meanZTest聚合函数。#33354 (achimbab)。 - 为 T 检验类聚合函数添加置信区间。 #33260 (achimbab).
- 添加函数
addressToLineWithInlines。关闭 #26211。#33467(SuperDJY)。 - 添加了对将
#!和#识别为单行注释起始标记的支持。解决了 #34138。#34230(Aaron Katz)。
实验性功能
- 用于文本分类的函数:语言和字符集检测。参见 #23271。#33314(Nikolay Degterinsky)。
- 为
MemoryTracker添加内存超额分配支持。新增用于内存限制的guaranteed设置,用于表示软内存限制。当达到硬内存限制时,MemoryTracker尝试取消超额分配最多的查询。新的设置memory_usage_overcommit_max_wait_microseconds指定查询在等待其他查询停止时最多可以等待多长时间。关闭了 #28375。#31182(Dmitry Novik)。 - 在 WindowView 中启用流与表之间的 JOIN。#33729(vxider)。
- 在
MaterializedMySQL中支持SET、YEAR、TIME和GEOMETRY数据类型(实验性功能)。修复 #18091、#21536、#26361。#33429(zzsmdfj)。 - 修复在默认启用投影时的各种问题。每个问题都在单独的提交中进行了说明。针对 #33678,并修复了 #34273。#34305(Amos Bird)。
性能改进
- 当排序键的前缀已经排好序时,支持使用
optimize_read_in_order。例如,如果表中的排序键为ORDER BY (a, b),并且查询包含WHERE a = const ORDER BY b子句,现在将会按照排序键的顺序读取数据,而不是执行完整排序。#32748 (Anton Popov)。 - 提升向表函数
URL、S3、File、HDFS执行分区插入操作时的性能。关闭 #34348。#34510 (Maksim Kita)。 - 对 clickhouse-keeper 进行了多项性能改进。 #34484 #34587 (zhanglistar).
FlatDictionary提高了字典数据加载性能。#33871 (Maksim Kita)。- 提升
mapPopulateSeries函数的性能。关闭 #33944。#34318(Maksim Kita)。 - 在类文件型表引擎中,
_file和_path虚拟列被设置为LowCardinality,从而加速对多个文件的查询。解决了 #34300。#34317(flynn)。 - 加速数据部分的加载。之前该过程没有并行化:设置
part_loading_threads不会产生任何效果。参见 #4699。#34310(alexey-milovidov)。 - 提升
LineAsString格式的性能。解决了 #34303。#34306(alexey-milovidov)。 - 优化
quantilesExact{Low,High},改为使用nth_element替代sort。#34287(Danila Kutenin)。 - 略微优化
Regexp格式的性能。#34202 (alexey-milovidov). - 对标量子查询的分析进行了小幅改进。 #34128 (Federico Rodriguez).
- 让对元组列执行 ORDER BY 的速度几乎与对普通列执行 ORDER BY 一样快。我们针对多列 ORDER BY 做了特殊优化:https://github.com/ClickHouse/ClickHouse/pull/10831。将这些优化同样应用到元组列上也很有益处。#34060 (Amos Bird)。
- 重构并重新在物化视图的执行中引入标量子查询缓存。#33958 (Raúl Marín)。
- 通过为
memcmpSmall函数添加 x86-64 AVX-512 支持以加速内存比较,略微提升ORDER BY的性能。仅在自行编译 ClickHouse 时有效。#33706 (hanqf-git)。 - 在某个键对应大量区间时,提升
range_hashed字典的性能。修复 #23821。#33516(Maksim Kita)。 - 对于针对 S3 的插入和合并操作,尽可能并行写入文件(TODO:检查是否已合并)。#33291 (Nikolai Kochetov)。
- 提升
clickhouse-keeper的性能,并修复 NuRaft 库中的多处内存泄漏。#33329 (alesapin).
改进
- 在
clickhouse-client中支持对包含内联数据的查询进行异步插入。#34267 (Anton Popov)。 - 函数
dictGet、dictHas会在键参数类型与字典键结构类型不同时,隐式将键参数转换为字典键结构类型。#33672(Maksim Kita)。 - 对
range_hashed字典进行了改进。在存在多个属性时提升了加载性能。允许创建没有属性的字典。新增选项用于指定当区间的start和end为Nullable类型时的策略,convert_null_range_bound_to_open的默认值为true。修复了 #29791。允许将Float、Decimal、DateTime64、Int128、Int256、UInt128、UInt256用作区间类型。RangeHashedDictionary增加了对超出Int64类型范围的区间值的支持。修复了 #28322。新增选项range_lookup_strategy用于指定区间查找类型(min或max),默认值为min。修复了 #21647。修正了已分配字节数的计算。修正了在ComplexKeyHashedDictionary场景下system.dictionaries中的类型名称。#33927 (Maksim Kita)。 - 现在,
flat、hashed、hashed_array字典支持在属性为空时创建,并支持读取键以及使用dictHas。修复了 #33820。#33918(Maksim Kita)。 - 在字典中新增了对
DateTime64数据类型的支持。#33914(Maksim Kita)。 - 支持写成
s3(url, access_key_id, secret_access_key)(会自动检测数据格式和表结构,但需要显式提供凭证)。 #34503 (Kruglov Pavel). - 按照 #34362 的建议,新增了将输出格式回传给客户端的功能,方式与 HTTP 协议相同。关闭 #34362。#34499(Vitaly Baranov)。
- 在执行 INSERT SELECT 查询时发送 ProfileEvents 统计信息(用于在
clickhouse-client中显示此类查询的查询指标)。 #34498 (Dmitry Novik). - 为 JSONEachRow 格式支持
.jsonl扩展名。#34496 (Kruglov Pavel)。 - 改进了 clickhouse-local 中的表结构推断。现在可以直接运行
clickhouse-local -q "select * from table" < data.format。 #34495 (Kruglov Pavel). - 现在可以在表级、
database.*级别以及全局*.*级别授予 CREATE/ALTER/DROP ROW POLICY 权限。#34489(Vitaly Baranov)。 - 允许将任意大的文件导出到
s3。添加两个新设置项:s3_upload_part_size_multiply_factor和s3_upload_part_size_multiply_parts_count_threshold。现在,每当从单个查询向 S3 上传的分片数量达到s3_upload_part_size_multiply_parts_count_threshold时,就会将s3_min_upload_part_size乘以s3_upload_part_size_multiply_factor。修复 #34244。#34422(alesapin)。 - 在使用 URL 存储 / 表函数配合通配符(glob)时,允许跳过返回 404(未找到)的 URL。同时修复了 #34359。#34392(Kseniia Sumarokova)。
- 为
clickhouse-local设置默认的输入和输出格式,可通过 --input-format 和 --output-format 覆盖。关闭 #30631。#34352 (李扬)。 - 为
clickhouse-format添加选项,从而解决 #30528 中的max_query_size和max_parser_depth问题。#34349 (李扬)。 - 在客户端启动前更好地处理预先输入。相关问题:#34308。#34336(Amos Bird)。
- 为了与 PostgreSQL 兼容,添加
REGEXP_MATCHES和REGEXP_REPLACE函数别名。关闭 #30885。#34334(李扬)。 - 某些服务器要求 HTTP 请求中包含
User-Agent头部字段。已在 HTTP 请求中添加形式如下的User-Agent头部字段:User-Agent: ClickHouse/VERSION_STRING。 #34330 (Saad Ur Rahman)。 - 在获取
TRUNCATE查询所需的表锁之前取消合并操作,以在某些情况下避免出现DEADLOCK_AVOIDED错误。修复了 #34302。#34304(tavplubix)。 - 更改日志中“Cancelled merging parts”消息的严重性级别,因为它并不是错误。这解决了 #34148。#34232(alexey-milovidov)。
- 添加对将 PostgreSQL 风格的类型转换运算符
::与使用[]和.运算符(数组和元组索引)的表达式组合使用的支持。#34229 (Nikolay Degterinsky)。 - 在
parseDateTimeBestEffort函数中支持识别YYYYMMDD-hhmmss格式。修复了 #34206。 #34208(alexey-milovidov)。 - 在使用
Regexp格式进行解析时,允许在行内出现回车符。此更改关闭了 #34200。 #34205(alexey-milovidov)。 - 允许将字典的
PRIMARY KEY解析为PRIMARY KEY (id, value);之前只支持PRIMARY KEY id, value。关闭 #34135。#34141(Maksim Kita)。 - 为
splitByChar添加一个可选参数,以限制生成元素的数量。关闭 #34081。#34140 (李扬)。 - 改进 clickhouse-client 的多行编辑使用体验。这是对 #31123 的后续更新。#34114(Amos Bird)。
- 在
MsgPack输入/输出格式中添加对UUID的支持。#34065 (Kruglov Pavel)。 - 用于 OpenTelemetry 的跟踪上下文现在会通过 gRPC 客户端元数据进行传递(此更改适用于 gRPC 客户端-服务器协议)。 #34064 (andremarianiello).
- 支持所有类型、带有
ON CLUSTER子句的SYSTEM查询。 #34005 (小路). - 改进对内存占用低于
max_untracker_memory的查询的内存记账。 #34001 (Azat Khuzhin). - 修复了 UTF-8 字符串在进行不区分大小写搜索时的错误:当同一字符的大写和小写使用不同字节数表示时会出错,例如
ẞ和ß。此修复关闭了 #7334。#33992(Harry Lee)。 - 在
clickhouse-local中支持从stdin自动检测格式和 schema。 #33960 (Kruglov Pavel)。 - 正确处理多个磁盘在文件系统上使用相同路径时的错误配置情况。#29072。#33905(zhongyuankai)。
- 在获取 S3 代理时尝试每个解析得到的 IP 地址。S3 代理很少被使用,主要用于 Yandex Cloud。#33862(Nikolai Kochetov)。
- 支持对
EXPLAIN AST CREATE FUNCTION查询,例如EXPLAIN AST CREATE FUNCTION mycast AS (n) -> cast(n as String)将返回EXPLAIN AST CREATE FUNCTION mycast AS n -> CAST(n, 'String')。#33819 (李扬)。 - 新增支持从
Map(Key, Value)到Array(Tuple(Key, Value))的类型转换。 #33794 (Maksim Kita). - 对
Bool数据类型进行了一些改进和修复。修复了 #33244。#33737(Kruglov Pavel)。 - 以大端序解析并存储 OpenTelemetry trace-id。#33723(Frank Chen)。
- 改进了
fromUnixTimestamp64系列函数。它们现在可以接受任何可转换为Int64的整数值。相关问题已关闭:#14648。#33505(Andrey Zvonov)。 - 将
_shard_num的常量实现(参见 #7624)改为使用shardNum()函数(参见 #27020),以避免潜在问题(例如在 #16947 中发现的问题)。#33392(Azat Khuzhin)。 - 在 Decimal 和 Float 类型之间启用二元算术运算(加、减、乘、除、least、greatest)。 #33355 (flynn)。
- 在
max_threads自动检测时考虑 cgroups 限制。#33342 (JaySon). - 新增 clickhouse-keeper 设置项
min_session_timeout_ms。现在 clickhouse-keeper 会根据min_session_timeout_ms和session_timeout_ms这两个设置来确定客户端会话超时时间。#33288 (JackyWoo). - 为函数
hex和bin新增了对UUID数据类型的支持。#32170 (Frank Chen). - 修复了对名称中包含点号的子列的读取逻辑。尤其是,当
Nested列的元素名称包含点号时的读取问题(例如Nested(`keys.name` String, `keys.id` UInt64, values UInt64))。#34228(Anton Popov)。 - 修复了在使用
VALUES子句向表中插入数据时parallel_view_processing = 0不生效的问题。- 修复了query_views_log中物化视图的view_duration_ms未正确设置的问题。#34067 (Raúl Marín). - 修复从 ZooKeeper 解析表结构的问题:现在会将来自 ZooKeeper 的元数据与本地元数据的规范形式进行比较。当不同 ClickHouse 版本之间的规范函数名发生变化时,这将有所帮助。#33933 (sunny)。
- 为与 LDAP 交互,对某些字符进行正确转义。#33401 (IlyaTsoi).
构建 / 测试 / 打包改进
- 移除非捆绑构建(unbundled build)支持。#33690 (Azat Khuzhin).
- 确保测试不依赖于对相等元素进行不稳定排序的结果。在调试构建中,在排序完成后对相等元素所在区间进行随机化,以避免在依赖相等元素排序顺序时出现问题。#34393 (Maksim Kita).
- 为样式检查增加详细输出。#34289 (Mikhail f. Shiryaev).
- 移除已过时的
clickhouse-testDebian 包。#33948 (Ilya Yatsishin). - 对构建系统进行多项改进,消除偶然使用操作系统软件包的可能性,并强制实现封闭(hermetic)构建。#33695 (Amos Bird).
Bug 修复(在官方 stable 或 prestable 版本中用户可见的异常行为)
- 修复了在使用
allow_experimental_parallel_reading_from_replicas且max_parallel_replicas等于 1 时出现的断言失败问题。此修复解决了 #34525。#34613(Nikita Mikhaylov)。 - 修复在读取空数组时的一个罕见 bug,该 bug 可能会导致
Data compressed with different methods错误。如果数据中大部分是空数组,在某些情况下(但并非总是)就可能复现该问题,并且读取是按 ORDER BY ... DESC 倒序进行时才会触发。此错误发生的概率极低。#34327(Anton Popov)。 - 修复在对窄整数类型的整数值进行取整时,
round/roundBankers返回错误结果的问题。修复 #33267。#34562(李扬)。 - 有时在从 S3 或 HDFS 读取多个文件时,取消查询操作不会立即生效。修复 #34301,相关问题 #34397。#34539(Dmitry Novik)。
- 修复在
optimize_aggregation_in_order = 1且distributed_aggregation_memory_efficient = 0时出现的异常Chunk should have AggregatedChunkInfo in MergingAggregatedTransform。修复问题 #34526。#34532(Anton Popov)。 - 修复索引分析中整数与浮点数比较的问题。此前该问题可能会导致在读取时错误跳过某些 granule。修复了 #34493。#34528(Anton Popov)。
- 修复 URL 引擎对压缩的支持。 #34524 (Frank Chen).
- 修复在文件 schema 自动检测中可能出现的错误 'file_size: Operation not supported'。#34479 (Kruglov Pavel)。
- 修复了在删除表时可能出现的潜在竞争条件。#34416 (Kseniia Sumarokova)。
- 修复在短路函数求值过程中可能出现的
Cannot convert column Function to mask错误。关闭 #34171。#34415(Kruglov Pavel)。 - 修复了基于 URL 源进行 schema 推断时可能出现的崩溃。关闭 #34147。#34405(Kruglov Pavel)。
- 此前对 UDF 的访问权限检查错误地在数据库级别进行,而不是按应有的在全局级别进行。修复了 #34281。#34404(Maksim Kita)。
- 修复了在针对使用
Memory引擎的数据库执行SHOW CREATE DATABASE查询时,结果中错误的引擎语法。此更改解决了 #34335。#34345(alexey-milovidov)。 - 修复了几个极少出现的竞争条件,这些情况可能导致复制队列状态异常并触发“intersecting parts”错误。 #34297 (tavplubix).
- 修复进度条宽度。此前错误地被四舍五入为整数个字符。#34275(alexey-milovidov)。
- 修复用于服务器间通信的
current_user/current_address客户端信息字段(在此补丁之前,current_user/current_address会沿用上一条查询的值)。 #34263 (Azat Khuzhin)。 - 修复在使用
optimize_aggregation_in_order=1进行查询处理时出现异常时的内存泄漏问题。#34234 (Azat Khuzhin). - 修复度量指标
Query,该指标用于显示正在执行的查询数量,但在最近几个版本中其值始终为 0。#34224 (Anton Popov)。 - 修复表函数
s3的模式推断。 #34186 (Kruglov Pavel). - 修复
HDFS、S3和URL存储引擎中一种罕见且无害的竞争条件,该问题可能会导致建立额外的连接。#34172 (alesapin)。 - 修复一个罕见的错误:在读取将数据存储在远程文件系统(例如 S3)上的 MergeTree 表引擎族的 LowCardinality 列时,可能会导致出现 “Cannot read all data” 错误(基于 S3 的虚拟文件系统是处于实验阶段、尚未准备好用于生产环境的特性)。 #34139 (alesapin).
- 在更改原生协议时修复向分布式表插入数据的问题。上一次更改是在 22.1 版本中,因此在升级到该版本后,向分布式表插入数据可能会出现一些失败。#34132(Anton Popov)。
- 修复在
File表引擎中由 #33960 引入的潜在数据竞争问题。关闭 #34111。#34113(Kruglov Pavel)。 - 修复了一个较小的竞态条件,该问题在 ZooKeeper 连接丢失后极少数情况下可能导致“intersecting parts”错误。 #34096 (tavplubix).
- 修复使用
Native格式的异步插入。#34068(Anton Popov)。 - 修复了一个错误,该错误会导致在同时使用 replicated access storage 和 keeper(嵌入在 clickhouse-server 中)时服务器无法启动。为 keeper 的 socket 超时时间新增了两个配置,用于替代默认用户中的相关设置:
keeper_server.socket_receive_timeout_sec和keeper_server.socket_send_timeout_sec。修复了 #33973。#33988(alesapin)。 - 修复在解析页脚已损坏的 ORC 文件时出现的段错误。关闭 #33797。#33984(Kruglov Pavel)。
- 修复了从查询参数(预处理语句)解析 IPv6 的问题,并修复了 IPv6 转换为字符串的问题。关闭了 #33928。#33971(Kruglov Pavel)。
- 修复在读取嵌套元组时发生的崩溃。修复了 #33838。#33956(Anton Popov)。
- 修复在分布式查询中对带字面量参数的
array和tuple函数的使用处理。此前可能会导致抛出Not found columns异常。#33938 (Anton Popov). - 聚合函数组合器
-If无法正确处理作为过滤条件的Nullable参数。已修复 #27073。#33920(alexey-milovidov)。 - 修复在进行远程磁盘读取时可能出现的竞态条件(基于 S3 的虚拟文件系统是实验性特性,尚未准备好用于生产环境)。#33912 (Amos Bird)。
- 修复在使用具有非标识符参数的 lambda 创建 SQL UDF 时发生的崩溃问题。修复 #33866。#33868(Maksim Kita)。
- 修复稀疏列的使用(可通过实验性设置
ratio_of_defaults_for_sparse_serialization启用)。#33849(Anton Popov)。 - 修复了在副本实际为只读时,执行
SYSTEM RESTORE REPLICA查询却返回逻辑错误replica is not readonly的问题。修复了 #33806。#33847(tavplubix)。 - 修复在启用压缩(默认)时
clickhouse-keeper中的内存泄漏。#33840 (Azat Khuzhin). - 修复在没有可用通用类型时的索引分析问题。#33833 (Amos Bird).
- 修复
JSONEachRow和JSONCompactEachRow的模式推断问题。 #33830 (Kruglov Pavel). - 修复在使用
redis源且键数量较大时外部字典的相关问题。#33804 (Anton Popov)。 - 修复客户端中的 bug,该 bug 会导致服务端出现 'Connection reset by peer' 错误。关闭 #33309。#33790(Kruglov Pavel)。
- 修复对 INSERT INTO ... VALUES SETTINGS ... (...), ... 查询的解析 (#33776) (Kruglov Pavel).
- 修复在使用宽格式和 Projection 创建数据部分时对表进行检查时的 bug。 #33774 (李扬).
- 修复 MergeTree 中
count()与INSERT/合并/... 操作之间的轻微竞态条件(在启用optimize_trivial_count_query的SELECT查询中,可能会返回不正确的行数)。 #33753 (Azat Khuzhin). - 当 storage HDFS 中的目录列举请求失败时抛出异常。#33724 (LiuNeng)。
- 修复在包含 projections 的表上执行 mutation 时的问题。修复了 #33010。修复了 #33275。#33679(Amos Bird)。
- 在命名 HTTP 会话中执行
CREATE TEMPORARY TABLE AS SELECT查询时,能够正确确定当前数据库。这是一个极少见的场景。修复了 #8340。#33676(alexey-milovidov)。 - 允许某些包含排序、LIMIT BY、ARRAY JOIN 和 lambda 函数的查询。这修复了 #7462。#33675(alexey-milovidov)。
- 修复“zero copy replication”中的一个缺陷(该功能仍在开发中,不应在生产环境中使用),该缺陷会在执行 TTL 移动操作时导致数据重复。修复 #33643。#33642(alesapin)。
- 修复在
optimize_aggregation_in_order = 1情况下,GroupingAggregatedTransform中的Chunk应包含AggregatedChunkInfo却未包含的问题。 #33637 (Azat Khuzhin). - 修复错误
Bad cast from type ... to DB::DataTypeArray,该错误可能在表中存在名称中包含点的Nested列且为其生成默认值时发生(例如在插入数据时,当未在列列表中指定该列)。这是对 #28762 的延续。#33588(Alexey Pavlenko)。 - 导出为
lz4文件的功能已修复。已关闭 #31421。#31862(Kruglov Pavel)。 - 修复在
group_by_overflow_mode被设置为any(近似 GROUP BY),且按单个LowCardinality类型列进行聚合时的潜在崩溃问题。 #34506 (DR). - 修复通过 gRPC 客户端-服务端协议向临时表插入数据的问题。修复了 #34347 中的
#2号问题。 #34364(Vitaly Baranov)。 - 修复问题 #19429。#34225(Vitaly Baranov)。
- 修复问题 #18206。#33977(Vitaly Baranov)。
- 此 PR 允许在同一个用户目录列表中使用多个 LDAP 存储。此前该功能是可用的,但后来由于 LDAP 测试被禁用(它们属于 TestFlows 测试的一部分)而失效。#33574 (Vitaly Baranov)。
ClickHouse 发布 v22.1,2022-01-18
升级说明
left和right函数之前只是在解析器中实现的,现在已实现为完整功能的函数。包含未使用别名的left或right函数的分布式查询,如果集群中包含不同版本的 clickhouse-server,可能会抛出异常。如果在升级集群时遇到该错误,应先完成整个集群的升级,以确保所有节点运行相同版本。也可以在查询中为列添加别名(AS something)以避免此问题。#33407(alexey-milovidov)。- 从该版本开始,将完整统计标量子查询的资源使用情况。随着这一更改,在标量子查询中读取的行数现在会记录到 query_log 中。如果标量子查询被缓存(重复或针对多行调用),则读取的行数只会被统计一次。此更改使得在执行标量子查询期间可以使用 KILL 终止查询并报告其执行进度。#32271(Raúl Marín)。
新特性
- 为输入格式实现数据模式推断。允许在表函数
file、url、s3、hdfs以及clickhouse-local的参数中省略结构(或仅写auto)。允许在为表引擎File、HDFS、S3、URL、Merge、Buffer、Distributed和ReplicatedMergeTree(在新增副本时)编写 CREATE 语句时省略结构。 #32455 (Kruglov Pavel). - 在
file/hdfs/s3/url表函数以及HDFS/S3/URL表引擎中,并且同样在SELECT INTO OUTFILE和INSERT FROM INFILE中,支持基于文件扩展名自动检测格式 #33565 (Kruglov Pavel)。关闭了 #30918。#33443 (OnePiece)。 - 用于在需要技术支持时收集诊断数据的工具。#33175 (Alexander Burmak)。
- 通过 Zoo/Keeper 实现集群自动发现。这样就可以在不更改每台服务器配置的情况下向集群添加副本。 #31442 (vdimir)。
- 实现 Hive 表引擎,使 ClickHouse 能访问 Apache Hive。该实现对应问题 #29245 和 PR #31104(taiyang-li)。
- 新增聚合函数
cramersV、cramersVBiasCorrected、theilsU和contingency。这些函数用于计算分类值之间的依赖程度(关联性度量)。所有这些函数的实现都基于交叉表(成对直方图)。可将其理解为适用于任意离散值(不一定是数字)的相关系数。#33366(alexey-milovidov)。初始实现由 Vanyok-All-is-OK 和 antikvist 完成。 - 新增了表函数
hdfsCluster,可在指定集群的多个节点上并行处理来自 HDFS 的文件,类似于s3Cluster。 #32400 (Zhichang Yu). - 新增对基于 Azure Blob Storage 的磁盘的支持,其方式类似于之前对基于 AWS S3 的磁盘的支持。#31505(Jakub Kuklis)。
- 在
CREATE VIEW中允许使用COMMENT(适用于所有视图类型)。#31062 (Vasily Nemkov)。 - 在配置发生变更时动态重新初始化监听端口和协议。#30549 (Kevin Michel)。
- 新增了
left、right、leftUTF8、rightUTF8函数。修复了substringUTF8函数在使用负偏移量(从字符串末尾开始计算的偏移)时的实现错误。#33407 (alexey-milovidov)。 - 为
H3坐标系新增函数:h3HexAreaKm2、h3CellAreaM2、h3CellAreaRads2。 #33479(Bharat Nallan)。 - 新增
MONTHNAME函数。 #33436 (usurai). - 新增函数
arrayLast,关闭了 #33390。#33415 新增函数arrayLastIndex。#33465(Maksim Kita)。 - 新增函数
decodeURLFormComponent,与decodeURLComponent略有不同。关闭 #10298。 #33451 (SuperDJY)。 - 允许将
GraphiteMergeTree的汇总规则按普通/带标签指标进行拆分(可选的rule_type字段)。#33494(Michail Safronov)。
性能改进
- 如果
Merge引擎的所有底层表都支持PREWHERE,则支持将条件移动到PREWHERE(设置optimize_move_to_prewhere)。#33300 (Anton Popov). - 更高效地处理用于 URL 存储的 glob 通配符。现在可以轻松地并行查询上百万个 URL,并支持重试机制。关闭 #32866。#32907 (Kseniia Sumarokova).
- 避免解析器中的指数级回溯。已关闭 #20158。#33481 (alexey-milovidov).
- 滥用
untuple函数会导致查询分析的复杂度呈指数级增长(由 fuzzer 发现)。已关闭 #33297。#33445 (alexey-milovidov). - 减少带有字符串属性的字典所分配的内存。#33466 (Maksim Kita).
- 略微提升
reinterpret函数的性能。#32587 (alexey-milovidov). - 无显著影响的更改。在极其罕见的情况下,当每个副本上的数据部分都丢失,并且在对某些数据部分进行合并之后,后续查询在执行分区裁剪时可能会少跳过一些分区。这几乎不会产生任何影响。#32220 (Azat Khuzhin).
- 通过优化大小计算逻辑,提高
clickhouse-keeper的写入性能。#32366 (zhanglistar). - 优化单个数据部分的投影物化过程。已关闭 #31669。#31885 (Amos Bird).
- 提升 system 表的查询性能。#33312 (OnePiece).
- 优化可在卷之间移动的 MergeTree 数据部分的选择逻辑。#33225 (OnePiece).
- 修复在键值连续时
sparse_hashed字典的性能问题(错误的哈希函数)。#32536 (Azat Khuzhin).
实验性特性
- 在不使用 sample key 的情况下,在分布式查询期间支持从分片内的多个副本并行读取。要启用此功能,将
allow_experimental_parallel_reading_from_replicas设为1,并将max_parallel_replicas设置为任意数值。由此关闭了 #26748。#29279(Nikita Mikhaylov)。 - 实现了稀疏序列化(sparse serialization)。对于包含大量默认值(零值)的列,它可以减少磁盘空间占用并提升部分查询的性能。可以通过设置
ratio_for_sparse_serialization来启用。对于某列,如果其默认值数量与全部值数量的比率高于该阈值,将为其动态选择稀疏序列化。每个 part 中的每一列会固定采用某种序列化方式(默认或稀疏),但不同 part 之间可能不同。#22535(Anton Popov)。 - 为自定义 MaterializedMySQL 表结构新增 "TABLE OVERRIDE" 功能。#32325(Stig Bakken)。
- 新增
EXPLAIN TABLE OVERRIDE查询。#32836(Stig Bakken)。 - 为 MaterializedPostgreSQL 支持 TABLE OVERRIDE 子句。RFC:#31480。#32749(Kseniia Sumarokova)。
- 更改共享数据零拷贝标记的 ZooKeeper 路径。请注意,“zero-copy replication” 是一个非生产特性(仍处于早期开发阶段),无论如何都不应在生产中使用。但如果你已经使用了它,请务必留意此变更。#32061(ianton-ru)。
- 为 WINDOW VIEW 的 watch 查询新增 Events 子句支持。#32607(vxider)。
- 修复
clickhouse-keeper中带有显式 digest 哈希的 ACL 问题:现在行为与 ZooKeeper 保持一致,并且生成的摘要始终会被接受。#33249(小路)。#33246。 - 修复在分离 parts 时意外删除 projection 的问题。#32067(Amos Bird)。
改进
- 现在,对于生成早于
1970-01-01 00:00:00的时间值的日期时间转换函数,将不会再发生溢出,而是会将结果饱和为零。#29953(Amos Bird)。这还修复了索引分析中的一个错误:当日期截断函数产生 Unix 纪元之前的结果时会触发该错误。 - 在客户端中始终显示资源使用情况(总 CPU 使用率、总内存使用量以及每个主机的最大内存使用量)。#33271 (alexey-milovidov).
- 改进
Bool类型的序列化与反序列化行为,并检查其取值范围。 #32984 (Kruglov Pavel). - 如果通过
SET查询或在 HTTP 请求的查询参数中定义了无效设置,错误信息将包含与该无效设置名称相近的设置建议(如果有)。 #32946 (Antonio Andelic)。 - 为 clickhouse-client 和 clickhouse-local 中拼写错误的设置名称提供提示支持。修复 #32237。#32841(凌涛)。
- 支持在物化视图中使用虚拟列。关闭 #11210。#33482 (OnePiece)。
- 在需要时为 clickhouse-keeper 添加禁用 IPv6 的配置。此更改解决了 #33381。#33450(Wu Xueyang)。
- 向
system.build_options添加更多关于当前 Git 修订版本的信息。#33431 (taiyang-li)。 clickhouse-local:在使用--max_memory_usage_in_client选项时跟踪内存。#33341 (Azat Khuzhin)。- 允许在函数
intervalLengthSum中使用负区间,其长度也会被一并加总。此更改关闭了 #33323。#33335(alexey-milovidov)。 LineAsString可以作为输出格式使用。此更改关闭了 issue #30919。#33331(Sergei Trifonov)。- 在集群配置中支持
<secure/>,作为<secure>1</secure>的替代形式。关闭了 #33270。#33330(SuperDJY)。 - 连续按两次 Ctrl+C 将立即终止
clickhouse-benchmark,而不会等待正在执行中的查询完成。这解决了 #32586。#33303(alexey-milovidov)。 - 在
parseDateTimeBestEffort函数中支持解析带毫秒的 Unix 时间戳。 #33276 (Ben)。 - 允许在从外部表读取以下格式的数据时取消查询:
Arrow/Parquet/ORC—— 在处理大文件并将 input_format_allow_seeks 设置为 false 时,之前无法取消查询。修复了 #29678。#33238(Kseniia Sumarokova)。 - 如果表引擎支持
SETTINGS子句,则允许以键值对形式或通过配置传递这些设置。为 MySQL 添加此支持。#33231 (Kseniia Sumarokova)。 - 在必要时正确阻止使用 Nullable 主键。这对应于 #32780。#33218(Amos Bird)。
- 为
PostgreSQL连接添加重试机制,以便在尚未获取到任何数据时重试。关闭 #33199。#33209(Kseniia Sumarokova)。 - 校验外部字典的配置键。 #33095。 #33130 (Kseniia Sumarokova)。
- 在
clickhouse-local中发送 profile 信息。修复 #33093。#33097(Kseniia Sumarokova)。 - 短路求值:新增对函数
throwIf的支持。修复 #32969。#32973(Maksim Kita)。 - (仅影响非官方构建)。修复了在向压缩的 Decimal、String、FixedString 和 Array 列插入数据时可能发生的段错误。已关闭 #32939。 #32940(N. Kolotov)。
- 新增支持在 SQL 用户自定义函数中指定子查询。例如:
CREATE FUNCTION test AS () -> (SELECT 1)。修复了 #30755。#32758(Maksim Kita)。 - 改进 gRPC 压缩支持,解决 #28671。#32747(Vitaly Baranov)。
- 在关闭服务器或分离表时,如果未启用 WAL,则刷新所有内存中的数据部件。 #32742 (nauta).
- 允许控制 MySQL 的连接超时(此前仅支持字典源)。修复 #16669。此前默认的 connect_timeout 值较小,现在可以进行配置。#32734 (Kseniia Sumarokova)。
- 为
MongoDB存储添加对authSource选项的支持。关闭了 #32594。#32702(Kseniia Sumarokova)。 - 在
genarateRandom表函数中添加对Date32类型的支持。#32643 (nauta). - 新增设置
max_concurrent_select_queries和max_concurrent_insert_queries,用于按查询类型控制并发查询。关闭 #3575。 #32609 (SuperDJY)。 - 在读取
Protobuf格式数据时,改进对存在缺失列的嵌套结构的处理。这是对 https://github.com/ClickHouse/ClickHouse/pull/31988 的后续改进。#32531(Vitaly Baranov)。 - 允许为
MongoDB引擎使用空凭证。修复 #26267。#32460(Kseniia Sumarokova)。 - 禁用窗口函数中某些可能导致异常的优化。修复 #31535。修复 #31620。#32453(Kseniia Sumarokova)。
- 支持连接 MongoDB 5.0。关闭了 #31483、#32416(Kseniia Sumarokova)。
- 启用
Decimal与Float之间的比较。解决了 #22626 问题。#31966(flynn)。 - 为
StorageExecutable、StorageExecutablePool、ExecutableDictionary、ExecutablePoolDictionary、ExecutableUserDefinedFunctions新增了设置项command_read_timeout和command_write_timeout。设置项command_read_timeout控制从命令 stdout 读取数据的超时时间,单位为毫秒。设置项command_write_timeout控制向命令 stdin 写入数据的超时时间,单位为毫秒。为ExecutableUserDefinedFunction、ExecutableDictionary、StorageExecutable新增了设置项command_termination_timeout。为ExecutableUserDefinedFunction新增了设置项execute_direct,默认值为 true。为ExecutableDictionary、ExecutablePoolDictionary新增了设置项execute_direct,默认值为 false。#30957 (Maksim Kita)。 - Bitmap 聚合函数在参数超出范围时将返回正确结果,而不会发生数值回绕。 #33127 (DR).
- 修复对使用
FROM INFILE语句的查询的错误解析。#33521 (Kruglov Pavel)。 - 如果路径包含通配符,则不允许写入
S3。#33142 (Kruglov Pavel). - 在批处理模式下执行单个查询时,
clickhouse-client未使用--echo选项。#32843 (N. Kolotov)。 - 在 clickhouse-local 中使用
--database选项。 #32797 (Kseniia Sumarokova). - 修复了 SQL 普通函数
file中出乎意料糟糕的代码,现在它支持符号链接(symlinks)。#32640 (alexey-milovidov). - 在移动数据分片后,更新
system.parts表中该分片的modification_time。#32964。#32965(save-my-heart)。 - 存在潜在问题,但无法被利用:在数组调整大小时可能发生整数溢出。#33024 (varadarajkumar)。
构建 / 测试 / 打包改进
- 为 ClickHouse 的 AArch64(ARM)版本添加软件包、功能测试和 Docker 构建。#32911(Mikhail f. Shiryaev)。#32415
- 为使用 musl-libc 构建 ClickHouse 做好准备。该选项默认未启用。#33134(alexey-milovidov)。
- 使安装脚本能够在 FreeBSD 上运行。此更改关闭了 #33384。#33418(alexey-milovidov)。
- 为 GitHub Actions 工作流添加
actionlint,并通过act --list校验工作流文件,以检查工作流语法是否正确。#33612(Mikhail f. Shiryaev)。 - 为可为空主键功能添加更多测试。补充针对不同类型和 MergeTree 系列的测试,以及随机生成数据的测试。#33228(Amos Bird)。
- 添加一个简单工具,用于在网页浏览器中可视化不稳定(flaky)测试。#33185(alexey-milovidov)。
- 为共享构建启用 hermetic build。此更改主要面向开发人员。#32968(Amos Bird)。
- 将
libc++和libc++abi更新到最新版本。#32484(Raúl Marín)。 - 为外部 .NET 客户端(ClickHouse.Client)添加集成测试。#23230(Oleg V. Kozlyuk)。
- 将 git 信息注入 ClickHouse 可执行文件,以便可以从 ClickHouse 二进制文件中轻松获取源代码修订版本。#33124(taiyang-li)。
- 从 ConfigProcessor 中移除过时代码。Yandex 相关的特定代码已不再使用。这段代码包含一个次要缺陷,该缺陷由 Mallik Hassan 在 #33032 中报告。此更改关闭了 #33032。#33026(alexey-milovidov)。
Bug 修复(官方 stable 或 prestable 版本中用户可见的错误行为)
- 对格式解析进行了多项修复。如果
clickhouse-server向攻击者开放写入权限,则会受到影响。特意构造的Native格式输入数据可能导致读取未初始化内存或进程崩溃。如果clickhouse-server向攻击者开放写入权限,则会受到影响。#33050(Heena Bansal)。修复了 Apache Avro 二进制格式中 Apache Avro Union 类型索引越界的问题。#33022(Harry Lee)。修复了在 Native 格式反序列化LowCardinality数据时LowCardinality数据中的空指针解引用问题。#33021(Harry Lee)。 - 在发送响应后,ClickHouse Keeper 处理程序会正确移除该操作。#32988 (JackyWoo).
- 配额可能存在 off-by-one 计算错误:尚未达到配额上限,却被判定为已超出限制。此修复解决了 #31174。#31656(sunny)。
- 修复了从 String 到 IPv4 或 IPv6 及其反向转换的 CAST 转换。修复了在转换失败时的错误信息。#29224 (Dmitry Novik) #27914 (Vasily Nemkov).
- 修复了在远程服务器执行时出现的
Unknown aggregate function nothing异常,解决了 #16689。#26074(hexiaoting)。 - 修复分布式查询中对未显式指定数据库的 JOIN 使用错误数据库的问题(修复:#10471)。#33611(Azat Khuzhin)。
- 修复在第二次向文件插入数据后出现在 Apache
Avro格式中的段错误。 #33566 (Kruglov Pavel). - 修复当模式包含
Dictionary类型时 ApacheArrow格式发生的段错误问题。关闭 #33507。#33529(Kruglov Pavel)。 - 对于视图来说,额外指定的
offset和limit设置可能会被错误地应用。已修复 #33289 #33518(hexiaoting)。 - 修复在向包含默认嵌套
LowCardinality列的表中插入数据时可能出现的异常Block structure mismatch。修复 #33028。#33504(Nikolai Kochetov)。 - 修复了使用 DDL 创建时
range_hashed字典中 range min 和 range max 属性的表达式。关闭 #30809。#33478(Maksim Kita)。 - 修复在并发执行 DROP 操作时,向物化视图执行 INSERT 可能导致的 use-after-free(释放后使用)问题(Azat Khuzhin)。
- 不要尝试读取超过 EOF 的数据(这是为规避 Linux 内核中的一个 bug),该 bug 可在内核版本(3.14..5.9)上复现,并且需要
index_granularity_bytes=0(即关闭自适应索引粒度)。#33372 (Azat Khuzhin)。 - 命令
SYSTEM SUSPEND和SYSTEM ... THREAD FUZZER此前缺少访问控制,现已修复。作者:Kevin Michel。#33333 (alexey-milovidov)。 - 修复字典的
COMMENT未在system.tables、system.dictionaries中显示的问题。支持修改Dictionary引擎的注释。关闭 #33251。#33261(Maksim Kita)。 - 将异步插入(在启用
async_insert设置时)添加到查询日志中。此前这类查询不会记录在查询日志中。#33239 (Anton Popov)。 - 修复在向外部数据库发出查询时发送
WHERE 1 = 0表达式的问题。解决 #33152。#33214(Kseniia Sumarokova)。 - 修复 MaterializedPostgreSQL 的 DDL 校验。修复
materialized_postgresql_allow_automatic_update设置,关闭 #29535。#33200(Kseniia Sumarokova)。确保始终清理未使用的复制槽。见 #26952。#33187(Kseniia Sumarokova)。修复 MaterializedPostreSQL 在分离/附加(从复制中移除/加入复制)具有非默认 schema 的表时的行为。见 #29535。#33179(Kseniia Sumarokova)。修复 DROP MaterializedPostgreSQL 数据库。#33468(Kseniia Sumarokova)。 - 指标
StorageBufferBytes有时会出现计算错误。#33159 (xuyatian)。 - 修复在启用
local_filesystem_read_prefetch或remote_filesystem_read_prefetch时,从LowCardinality列读取时出现的错误Invalid version for SerializationLowCardinality key column。 #33046 (Nikolai Kochetov). - 修复
s3表函数在读取空文件时的问题。关闭 #33008。#33037(Kseniia Sumarokova)。 - 修复在 cancel_http_readonly_queries_on_client_close 情况下的 Context 泄漏问题(即已上传到服务器的外部表和其他资源发生泄漏)。 #32982 (Azat Khuzhin).
- 修复在使用自定义 CSV 分隔符时
CSV格式下元组输出错误的问题。#32981 (Kruglov Pavel)。 - 修复了 HDFS URL 校验的问题,该问题导致无法使用 HA NameNode 地址。该缺陷是在 https://github.com/ClickHouse/ClickHouse/pull/31042 中引入的。#32976(Kruglov Pavel)。
- 修复在处理非位置参数时错误抛出“位置参数越界”之类的异常。关闭 #31173#event-5789668239。 #32961 (Kseniia Sumarokova).
- 修复了在通过 HTTP 查询向
set填充数据时,遇到意外 EOF 时的未定义行为(例如客户端在中途中断,如执行timeout 0.15s curl -Ss -F '[email protected];' 'http://127.0.0.1:8123/?s_structure=key+Int&query=SELECT+dummy+IN+s'且t.csv足够大时)。 #32955 (Azat Khuzhin). - 修复
replaceRegexpAll函数中的一个回归缺陷。当匹配到的子字符串为空时,该函数的行为不正确。此更改关闭了 #32777。此更改关闭了 #30245。#32945(alexey-milovidov)。 - 修复
ORC格式 stripe 的读取。#32929 (kreuzerkrieg). topKWeightedState在某些输入类型下会失败。#32487。#32914(vdimir)。- 修复物化视图中出现的异常
Single chunk is expected from view inner query (LOGICAL_ERROR)。修复 #31419。#32862(Nikolai Kochetov)。 - 修复了从远程文件系统进行异步读取时的惰性 seek 优化。关闭 #32803。#32835(Kseniia Sumarokova)。
MergeTree表引擎在运行中的变更过多或内存占用过高时,可能会静默跳过部分变更,此问题已修复。修复 #17882。#32814(tavplubix)。- 在处理 MV 块时避免重用标量子查询缓存。这样修复了当标量子查询引用源表时出现的一个错误,但也意味着会为每个块重新计算 MV 定义中的所有标量子查询。 #32811 (Raúl Marín).
- 当使用
MySQL引擎的数据库无法连接到 MySQL 服务器时,服务端可能无法启动,现已修复。修复了 #14441。#32802 (tavplubix)。 - 修复了使用
fuzzBits函数时发生的崩溃,关闭了 #32737。#32755(SuperDJY)。 - 修复在基于
Kafka/RabbitMQ的物化视图(MV)中使用GROUP BY (list of columns)(会被解析成GROUP BY tuple(...))时出现的错误Column is not under aggregate function。修复了 #32668 和 #32744。#32751(Nikolai Kochetov)。 - 修复
ALTER TABLE ... MATERIALIZE TTL查询在TTL ... DELETE WHERE ...和TTL ... GROUP BY ...模式下的问题。 #32695 (Anton Popov). - 修复在表引擎为
Distributed或Merge,且其底层MergeTree表在排序键前缀中使用单调函数时optimize_read_in_order优化的问题。#32670 (Anton Popov)。 - 修复当物化视图的目标表为 JOIN 或 SET 表时抛出的 LOGICAL_ERROR 异常。#32669 (Raúl Marín)。
- 使用 multipart 方式通过 Google Cloud Storage 向 S3 插入数据时,可能会触发中止操作。#32504。#32649 (vdimir)。
- 在
RabbitMQ存储启动时,通过延迟创建通道来修复可能出现的异常。#32584 (Kseniia Sumarokova). - 在并行执行 DROP TABLE 和 INSERT 时,修复表生命周期管理问题(即可能出现 use-after-free)。#32572 (Azat Khuzhin).
- 修复了使用
CustomSeparated、Template、Regexp、MsgPack和JSONAsString格式的异步插入问题。此前,使用这些格式进行异步插入时不会读取任何数据。#32530(Kruglov Pavel)。 - 修复在分布式表上的
groupBitmapAnd函数。#32529 (minhthucdao). - 修复由模糊测试发现的 JOIN 崩溃,关闭 #32458。#32508(vdimir)。
- 正确处理 Apache Arrow 列重复的情况。#32507(Dmitriy Mokhnatkin)。
- 修复分布式查询中查询格式化存在歧义的问题,当某些表的列名为
ALL或DISTINCT时会导致错误。此更改修复了 #32391 中描述的问题。#32490(alexey-milovidov)。 - 修复查询在尝试使用尚未物化的跳过索引时出现的失败问题。修复了 #32292 和 #30343。#32359(Anton Popov)。
- 修复在同一列上存在超过 2 个行策略时,从同一会话中的第二条查询起会出现的
SELECT查询错误。#31606。#32291(SuperDJY)。 - 修复将带小数的 Unix 时间戳转换为
DateTime64时的问题:对于负的 Unix 时间戳(早于 1970-01-01),其小数部分会被颠倒。#32240 (Ben). - 复制队列中的某些条目可能会因
temporary_directories_lifetime(默认 1 天)而长时间处于挂起状态,并出现Directory tmp_merge_<part_name>或Part ... (state Deleting) already exists, but it will be deleted soon等类似错误。该问题已修复。修复了 #29616。#32201(tavplubix)。 - 修复对
APPLY lambda列转换器的解析错误,该错误可能导致客户端或服务器崩溃。#32138 (Kruglov Pavel)。 - 修复
base64Encode在短字符串上会添加多余字节的问题。#31797 (Kevin Michel)。 - 修复当窗口函数的参数为
LowCardinality时可能发生的崩溃或错误结果。修复了 #31114。#31888(Nikolai Kochetov)。 - 修复在执行命令
DROP TABLE system.query_log sync时出现的挂起问题。#33293 (zhanghuajie).