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

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'。当不兼容版本在集群中与旧版本或新版本共同工作时,该问题同样会影响分布式查询。#43038Alexander Tokmakov, Raúl Marín)。注意:所有官方 ClickHouse 构建版本已经包含此修复补丁。对于应当避免使用的非官方第三方构建,则不一定如此。

新功能

  • 添加 BSONEachRow 输入/输出格式。在这种格式下,ClickHouse 将每一行格式化/解析为单独的 BSON 文档,并将每一列格式化/解析为一个以列名为键的 BSON 字段。#42033 (mark-polokhov)。
  • 新增 grace_hash JOIN 算法,可通过 SET join_algorithm = 'grace_hash' 启用。#38191 (BigRedEye, Vladimir C).
  • 允许在创建或修改用户时配置密码复杂度规则和校验。#43719Nikolay Degterinsky)。
  • 在日志中对敏感信息进行掩码处理;在 SHOW CREATE TABLESELECT FROM system.tables 查询的输出中对敏感部分进行掩码处理。同时解决了 #41418#43227Vitaly Baranov)。
  • 新增 GROUP BY ALL 语法:#37631#42265刘陶峰)。
  • 添加对 FROM table SELECT column 语法的支持。#41095 (Nikolay Degterinsky).
  • 新增了函数 concatWithSeparator,并将 concat_ws 作为其别名,以提高对 Spark SQL 的兼容性。新增了函数 concatWithSeparatorAssumeInjective 作为变体,用于启用 GROUP BY 优化,其方式与 concatAssumeInjective 类似。#43749 (李扬)。
  • 添加了用于固定精度 Decimal 运算的 multiplyDecimaldivideDecimal 函数。 #42438 (Andrey Zvonov).
  • 添加了 system.moves 表,用于列出当前正在移动的数据部分。 #42660 (Sergei Trifonov)。
  • 为 ClickHouse Keeper 添加对内置 Prometheus 端点的支持。 #43087 (Antonio Andelic).
  • 支持使用 _ 作为分隔符的数值字面量,例如 1_000_000#43925 (jh0x)。
  • cutURLParameter 函数新增了将数组作为第二个参数的支持,从而可以删除多个参数。关闭 #6827#43788Roman Vasin)。
  • system.data_skipping_indices 表中添加一个用于保存索引表达式的列。#43308 (Guillaume Tassery)。
  • 向系统表 databases 添加列 engine_full,以便用户可以通过系统表访问数据库的完整引擎定义。 #43468 (凌涛).
  • 新增哈希函数 xxh3。同时,得益于库的更新,在 ARM 平台上 xxHash32xxHash64 的性能也得到了提升。#43411Nikita Taranov)。
  • 添加了对为 MergeTree 设置定义约束的支持。例如,你可以禁止用户修改 storage_policy#43903Sergei Trifonov)。
  • 新增一个设置 input_format_json_read_objects_as_strings,允许在所有 JSON 输入格式中将嵌套 JSON 对象解析为字符串。该设置默认禁用。#44052 (Kruglov Pavel)。

实验性特性

  • 支持异步插入的去重。在此变更之前,异步插入不支持去重,因为多个小的插入请求会被合并到同一个插入批次中。修复 #38075#43304Han Fei)。
  • 为实验性的 Annoy(向量相似度搜索)索引添加余弦距离支持。#42778Filatenkov Artur)。
  • 新增 CREATE / ALTER / DROP NAMED COLLECTION 查询。#43252Kseniia Sumarokova)。该特性仍在开发中,截至 22.12 版本这些查询尚未生效。本变更日志条目仅为避免混淆而添加。将命名集合的默认访问权限限制为 config 中定义的用户。若要查看它们,需要设置 show_named_collections = 1#43325Kseniia Sumarokova)。引入了 system.named_collections 表。#43147Kseniia Sumarokova)。

性能改进

  • 添加设置 max_streams_for_merge_tree_readingallow_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_ratiomax_streams_for_merge_tree_reading 一起使用,这可以提升 I/O 受限查询的性能。#43260Nikolai 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 中已经进行了这样的处理),这在使用远程文件系统时可能导致高内存使用。#43965Nikolai Kochetov)。
  • 在选择要合并的数据分片时,优化了对 ZooKeeper 或 ClickHouse Keeper 的 list 请求数量。此前在某些情况下可能会产生成千上万次请求。修复 #43647#43675Alexander Tokmakov)。
  • 如果 max_size_to_preallocate_for_aggregation 的值过小,现在将跳过该优化。该设置的默认值已提升至 10^8#43945Nikita Taranov)。
  • 通过避免清理旧数据分片来加速服务器关闭,因为在 https://github.com/ClickHouse/ClickHouse/pull/41145 之后,这一步已不再必要。#43760Sema Checherinda)。
  • 当设置了 enable_memory_bound_merging_of_aggregation_results 时,在发起端进行的合并现在会采用与本地聚合结果合并相同的内存受限方式。#40879Nikita Taranov)。
  • Keeper 改进:尝试在复制的同时并行地将日志同步到磁盘。#43450Antonio Andelic)。
  • Keeper 改进:更频繁地对请求进行批处理。批处理可以通过新设置 max_requests_quick_batch_size 进行控制。#43686Antonio Andelic)。

改进

  • 在从备份恢复时,实现引用依赖,并利用其按正确顺序创建数据表。#43834 (Vitaly Baranov)。
  • CREATE 查询中替换 UDF,以避免在启动加载阶段出现失败。此外,现在可以将 UDF 用作列的 DEFAULT 表达式。#43539Antonio Andelic)。
  • 更改以下查询删除数据分片的行为:TRUNCATE TABLE、ALTER TABLE DROP PART、ALTER TABLE DROP PARTITION。现在,这些查询会创建覆盖旧分片的空分片。这样可以使 TRUNCATE 查询在无需后续获取独占锁的情况下执行,也就意味着并发读不会被阻塞。同时,这些查询都实现了持久性:如果请求成功,则之后不会出现“复活”的分片。请注意,原子性仅能在事务作用域内得到保证。#41145Sema Checherinda)。
  • SET param_x 查询不再需要手动将参数值序列化为字符串。例如,以前需要写成 SET param_a = '[\'a\', \'b\']' 的查询,现在可以写成 SET param_a = ['a', 'b']#41874 (Nikolay Degterinsky)。
  • 在通过客户端的 STDIN 读取数据时,在进度指示中显示已读取的行数。修复 #43423#43442Kseniia Sumarokova)。
  • 从 S3 表函数/引擎读取数据时显示进度条。#43454 (Kseniia Sumarokova).
  • 进度条会显示读取和写入的行数。#43496Ilya Yatsishin)。
  • filesystemAvailable 及相关函数现在支持一个可选的磁盘名称参数,并将 filesystemFree 更名为 filesystemUnreserved。修复 #35076#42064flynn)。
  • 与 LDAP 的集成:将 search_limit 的默认值提升到 256,并新增 LDAP 服务器配置选项,可将其设置为任意值。修复问题:#42276#42461Vasily Nemkov)。
  • 现在也支持从异常消息中移除敏感信息(参见配置文件中的 query_masking_rules)。修复了 #41418#42940filimonov)。
  • 支持类似 SHOW FULL TABLES ... 的查询以兼容 MySQL。#43910 (Filatenkov Artur).
  • Keeper 优化:新增 4lw 命令 rqld,用于手动将某个节点指定为 leader。#43026JackyWoo)。
  • 对 Distributed 表的异步 INSERT 应用查询中指定的连接超时设置。#43156 (Azat Khuzhin).
  • unhex 函数现已支持 FixedString 类型参数。issue42369#43207DR)。
  • 根据 TTL 规则优先删除已完全过期的数据片段,参见 #42869#43222zhongyuankai)。
  • 在 clickhouse-client 中提供更精确且响应更及时的 CPU 负载显示。#43307 (Sergei Trifonov)。
  • 支持从 S3 存储和表函数 s3 中以 ParquetArrowORC 格式读取嵌套类型的子列。#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。#43592Nikolai Kochetov)。
  • 允许在每次递增时,将 trace_type = 'ProfileEvent' 的 profile 事件连同当前调用栈、profile 事件名称和递增的数值一起收集到 system.trace_log 中。可以通过设置 trace_profile_events 启用此功能,用于分析查询性能。#43639Anton Popov)。
  • 新增设置 input_format_max_binary_string_size,用于限制 RowBinary 格式中字符串的最大长度。#43842 (Kruglov Pavel)。
  • 当 ClickHouse 向远程 HTTP 服务器发出请求且对方返回错误时,异常信息中未正确显示数字形式的 HTTP 状态码。修复该问题,关闭 #43919#43920Alexey Milovidov)。
  • 即使在进行多个 JOIN 的优化时,也能正确报告查询中的错误。#43583 (Salvatore)。

构建/测试/打包改进

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#43253chen)。
  • 修复函数 arrayFirstOrNullarrayLastOrNull 在数组包含 Nullable 元素时对 null 的处理问题。#43274Duc Canh Le)。
  • 修复与 Kafka 表相关的 UserTimeMicroseconds/SystemTimeMicroseconds 统计不正确的问题。#42791Azat Khuzhin)。
  • 不要在 web 磁盘中抑制异常。修复 web 磁盘的重试机制。#42800 (Azat Khuzhin).
  • 修复了 INSERT 与删除物化视图之间的(逻辑)竞态条件。当在执行 INSERT 的同时删除物化视图时,会发生竞态:在执行之初,这些物化视图作为该 INSERT 的依赖存在,但当插入链尝试访问它们时,相应的表已经被删除,从而产生 UNKNOWN_TABLETABLE_IS_DROPPED 异常,并中止插入。此更改之后,如果依赖已经消失,我们会避免抛出这些异常,而是继续执行插入。#43161 (AlfVII)。
  • 修复 quantiles 函数中的未定义行为,该行为可能导致使用未初始化的内存。由模糊测试(fuzzer)发现。此更改关闭了 #44066#44067Alexey Milovidov)。
  • 针对未压缩大小为零的情况,在 CompressionCodecDelta 中增加了额外检查。 #43255 (Nikita Taranov)。
  • 从 Parquet 中展平数组,以避免数组中数据不一致的问题。这些不正确的文件可能由 Apache Iceberg 生成。#43297 (Arthur Passos)。
  • 修复在函数短路执行时,对 LowCardinality 列进行错误类型转换的问题。 #43311 (Kruglov Pavel).
  • 修复了在使用 Merge 引擎的表上,带有 SAMPLE BY 并启用 prewhere 优化的查询。#43315 (Antonio Andelic)。
  • 检查并比较 MergeTreeDataformat_version 文件的内容,以便即使在存储策略发生变更的情况下也能加载表。#43328 (Antonio Andelic)。
  • 修复在向 Buffer 表执行 INSERT 时可能出现的(几乎不可能发生的)“No column to rollback” 逻辑错误。 #43336 (Azat Khuzhin).
  • 修复了一个缺陷:在启用 allow_function_parameters 时,解析器会错误地将任意数量的圆括号解析到同一个函数中。#43350Nikolay Degterinsky)。
  • MaterializeMySQL(实验性功能)支持 DDL:drop table t1, t2,并与 MySQL 中的大多数 DROP DDL 语句兼容。 #43366 (zzsmdfj)。
  • session_log(实验功能):修复了在极少数设置配置文件紊乱的情况下,由于无法创建 session_log 条目而导致无法登录的问题。#42641Vasily Nemkov)。
  • 修复了在 if/multiIf 函数中可能出现的 Cannot create non-empty column with type Nothing 错误,关闭了 #43356#43368Kruglov Pavel)。
  • 修复当行级过滤器使用列默认值时的错误。#43387Alexander Gololobov)。
  • 使用 DISTINCT + LIMIT BY + LIMIT 的查询可能返回的行数少于预期。修复了 #43377#43410Igor Nikonov)。
  • 修复针对 Nullable(Decimal(...))sumMap#43414 (Azat Khuzhin).
  • 修复 macOS 上针对小时/分钟的 date_diff。关闭 #42742#43466zzsmdfj)。
  • 修复因 merges/mutations 导致的内存核算错误。 #43516 (Azat Khuzhin).
  • 修复了包含 toString(enum) 条件的主键分析。#43596Nikita Taranov)。此错误由 @tisonkun 发现。
  • 在分区附加完成后,确保 clickhouse-copier 在 Keeper 中更新状态和 attach_is_done 时保持一致性。#43602 (lzydmxy)。
  • 在恢复丢失的 Replicated 数据库副本(实验性功能)时,可能会出现需要以原子方式交换两个表名的情况(使用 EXCHANGE)。之前我们尝试使用两个 RENAME 查询,这显然行不通,而且还会导致整个数据库副本的恢复过程失败。#43628Nikita Mikhaylov)。
  • 修复 s3Cluster 函数抛出 NOT_FOUND_COLUMN_IN_BLOCK 错误的问题。关闭 #43534#43629chen)。
  • 修复在解析包含相同键名但嵌套层级不同的数组的 JSON 对象时可能出现的 Array sizes mismatched 逻辑错误。修复了 #43569#43693Kruglov Pavel)。
  • 修复了在分布式 GROUP BY 中,当聚合键中包含 ALIAS 列时可能发生的异常。#43709 (Nikita Taranov)。
  • 修复在启用并使用零拷贝复制(实验特性)时可能导致投影损坏的 Bug。 #43764 (alesapin).
  • 修复在 AWS S3 中对超大对象使用分段上传的问题。#43824 (ianton-ru)。
  • 修复了带有 ON CLUSTERALTER ... RESET SETTING 语句之前可能只会应用到单个副本的问题。修复了 #43843#43848Elena Torró)。
  • 修复在右侧使用 Join 表引擎并使用 USING 子句时的 JOIN 逻辑错误。#43963Vladimir C)。修复 Join 表引擎中键顺序不正确的问题。#44012Vladimir C)。
  • Keeper 修复:当 Raft 的 interserver 端口已被占用时抛出异常。 #43984 (Antonio Andelic).
  • 修复在对子查询进行列裁剪时对基于位置的 ORDER BY 参数(例如 ORDER BY 1, 2)的处理问题。关闭 #43964#43987Kseniia Sumarokova)。
  • 修复了当子查询包含 HAVING 但不包含任何聚合时出现的异常。#44051Nikita Taranov)。
  • 修复了 S3 分段上传中的竞态条件。该竞态条件可能会在从备份恢复时导致错误 Part number must be an integer between 1 and 10000, inclusive. (S3_ERROR)#44065 (Vitaly Baranov)。

ClickHouse 发布 22.11,2022-11-17

向后不兼容的更改

新功能

  • 在与 ClickHouse Keeper 的会话丢失时,为向 ReplicatedMergeTree 插入数据的 INSERT 操作添加了重试支持。除了提高容错能力之外,此功能还旨在提供更好的用户体验——在 Keeper 重启(例如由于升级)时,避免在插入过程中向用户返回错误。#42607 (Igor Nikonov)。
  • 新增 HudiDeltaLake 只读表引擎,仅适用于 S3 上的表。#41054 (Daniil Rubin, Kseniia Sumarokova)。
  • 新增表函数 hudideltaLake#43080 (flynn)。
  • 支持复合时间间隔。1. 现在可以对 Interval 执行加、减和取反运算。如果 Interval 的类型不同,它们将被转换为由这些类型组成的 Tuple。2. 可以将一个由多个 Interval 组成的 Tuple 加到或减去一个 Date/DateTime 字段。3. 新增对不同类型 Interval 的解析,例如:INTERVAL '1 HOUR 1 MINUTE 1 SECOND'#42195Nikolay Degterinsky)。
  • 新增对 ** 通配符的支持,用于递归遍历文件系统和 S3 的目录。修复 #36316#42376SmitaRKulkarni)。
  • 为只写一次、多次读取的操作引入 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#37681hongbin)。
  • 添加 min_age_to_force_merge_on_partition_only 设置,以仅对整个分区的旧数据块进行优化。#42659 (Antonio Andelic)。
  • 为任意结构的具名集合、访问类型以及 system.named_collections 添加通用实现。#43147Kseniia Sumarokova)。

性能改进

  • 若条件是基于字符串前缀,match 函数可以利用索引。修复了 #37333#42458clarkcaoliu)。
  • 在顺序组合时提升 AND 和 OR 运算符的性能。#42214Zhiguo Zhou)。
  • LineAsString 输入格式提供并行解析支持。仅略微提升性能。修复了 #42502#42780Kruglov Pavel)。
  • ClickHouse Keeper 性能改进:在许多不同节点存在未提交状态的场景下提升提交性能。这应有助于解决 follower 节点无法足够快同步的情况。#42926Antonio Andelic)。
  • NOT LIKE 'prefix%' 这样的条件可以使用主索引。#42209Duc Canh Le)。

实验特性

  • 支持在其他类型中使用 Object 类型,例如 Array(JSON)#36969Anton Popov)。
  • 对于 MaterializedMySQL,忽略 MySQL binlog 的 SAVEPOINT 事件。#42931zzsmdfj)。在 MaterializedMySQL 中处理(忽略)SAVEPOINT 查询。#43086Stig Bakken)。

改进

  • 带有较小 LIMIT 的简单查询将能够正确预估需要读取的行数,从而能够正确执行阈值检查。关闭了 #7071#42580Han Fei)。
  • 为 INSERT VALUES 查询添加对交互参数的支持。#43077Nikolay 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#43194Alexey 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#42003Alexey Milovidov)。
  • 为 base64 编码函数增加对 FixedString 输入的支持。#42285 (ltrk2).
  • system.detached_parts 新增 bytes_on_diskpath 列。修复 #42264#42303chen)。
  • 改进了在表函数中使用插入表结构的机制,现在 use_structure_from_insertion_table_in_table_functions 设置新增了一个取值 2,表示 ClickHouse 将自动尝试判断是否可以使用插入表的结构。修复了 #40028#42320Kruglov Pavel)。
  • 修复 INSERT FROM INFILE 无进度显示的问题。关闭 #42548#42634chen)。
  • 重构函数 tokens,以支持为相关函数设置返回的最大 token 数量(默认禁用)。#42673李扬)。
  • 支持在 formatDateTimeFROM_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/235https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1995209#42796Alexey Milovidov)。
  • 为异步插入添加 FailedAsyncInsertQuery 事件指标。#42814 (Krzysztof Góralski)。
  • 在查询计划层实现 read-in-order 优化。该优化默认启用。将 query_plan_read_in_order 设为 0 以使用之前基于 AST 的版本。#42829Nikolai Kochetov)。
  • 以指数方式增大备份到 S3 时的上传分块大小,以避免触发 S3 分块上传最多 10 000 个分块数量限制相关的错误。#42833 (Vitaly Baranov).
  • 当合并任务持续繁忙且磁盘空间不足时,完全过期的 Part 无法被选中并删除,从而导致磁盘空间持续不足。我的想法是,当整个 Part 过期时,无需再预留额外的磁盘空间,也应保证 TTL 能正常执行。 #42869 (zhongyuankai).
  • 添加 oss 函数和 OSS 表引擎(方便用户使用)。oss 与 S3 完全兼容。#43155 (zzsmdfj)。
  • 改进 system.asynchronous_metrics 表在收集操作系统相关信息时的错误报告。#43192Alexey Milovidov)。
  • INFORMATION_SCHEMA 表进行了修改,使 ClickHouse 可以通过 MySQL 兼容协议连接到自身。改为添加列而不是使用别名(相关问题见 #9769)。这将提升与各类 MySQL 客户端的兼容性。#43198Filatenkov Artur)。
  • 为 PowerBI 在通过 MySQL 协议连接时添加了一些兼容性函数 #42612 (Filatenkov Artur)。
  • 在执行更改时提升 Dashboard 的易用性 #42872 (Vladimir C).

构建/测试/打包改进

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#41979Kruglov Pavel)。
  • 修复从 URL 表引擎 / 表函数读取时的重试逻辑(可重试错误可能被过度重试,不可重试错误会在代码中导致断言失败)。#42224 (Kseniia Sumarokova).
  • 已发现并修复了一个与 DNS 和 c-ares 相关的段错误。#42234 (Arthur Passos)。
  • 修复在 PK 分析(单调性检查)中可能出现的 LOGICAL_ERRORArguments of 'plus' have incorrect data types。修复对首个参数为常量的单调二元函数的错误 PK 分析。#42410Nikolai Kochetov)。
  • 修复在键类型不能为 Nullable 时的错误键解析。修复了 #42456#42469Amos Bird)。
  • 修复了设置名称中的拼写错误,该错误在使用设置 input_format_csv_use_best_effort_in_schema_inference 时导致 schema 推断缓存被错误使用。关闭 #41735#42536Kruglov Pavel)。
  • 修复在数据类型为 LowCardinality 时创建 Set 时使用错误 header 的问题。关闭了 #42460#42579flynn)。
  • (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 添加到枚举值中。#42782Miel 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#42876Vladimir C)。
  • 在对“三表连接”执行 select if as 时会产生空指针异常。例如,下面这条 SQL 查询:#42883zzsmdfj)。
  • 修复 Cluster Discovery 中的 MemorySanitizer 报告,关闭 #42763#42905Vladimir C)。
  • 在遇到空字符串时改进对 DateTime 架构的推断。#42911 (Kruglov Pavel)。
  • 修复在理论上可以使用 projection 但实际没有可用 projection 时,偶发出现的 NOT_FOUND_COLUMN_IN_BLOCK 错误。此修复解决了 #42771 中的问题。该缺陷最初在 https://github.com/ClickHouse/ClickHouse/pull/25563 中被引入。#42938Amos Bird)。
  • 修复 PostgreSQL 数据库引擎中,当表包含 DATETIME 数据类型时的 ATTACH TABLE 操作。关闭 #42817#42960Kseniia Sumarokova)。
  • 修复 lambda 解析。关闭问题 #41848#42979Nikolay Degterinsky)。
  • 修复在可为空的键出现在超矩形中间时的键分析错误。此更改修复了 #43111#43133Amos Bird)。
  • 修复了在对精心构造的聚合函数状态进行反序列化时出现的多个缓冲区越界读取问题。 #43159 (Raúl Marín).
  • 修复在处理 NULL 和常量 Nullable 参数时的 if 函数。关闭 #43069#43178Kruglov Pavel)。
  • 修复在使用 “best effort” 算法解析 DateTime 时出现的十进制运算溢出问题。关闭 #43061#43180Kruglov Pavel)。
  • git-import 工具生成的 indent 字段计算有误。参见 https://clickhouse.com/docs/getting-started/example-datasets/github/#43191Alexey Milovidov)。
  • 修复了在子查询和类型转换中使用 Interval 类型时的非预期行为。#43193 (jh0x)。

ClickHouse 发行版 22.10,2022-10-25

不向后兼容的变更

  • 重命名缓存相关命令:show caches -> show filesystem cachesdescribe cache -> describe filesystem cache#41508Kseniia Sumarokova)。
  • 移除对 LIVE VIEWWITH TIMEOUT 部分的支持。解决了 #40557#42173Alexey Milovidov)。
  • 从客户端提示符中移除对 {database} 宏的支持。如果未指定数据库,该宏显示不正确,并且在执行 USE 语句时不会更新。解决了 #25891#42508Alexey Milovidov)。

新功能

  • 已添加组合式协议配置。现在可以为不同协议配置不同的监听主机地址。像 PROXYv1 这样的协议封装器可以叠加配置在任意其他协议(TCP、TCP secure、MySQL、Postgres)之上。#41198Yakov Olkhovskiy)。
  • S3 添加为一种新的备份目标类型。支持按原有路径/数据结构执行到 S3 的 BACKUP。#42333 (Vitaly Baranov), #42232 (Azat Khuzhin).
  • 新增了函数(randUniformrandNormalrandLogNormalrandExponentialrandChiSquaredrandStudentTrandFisherFrandBernoullirandBinomialrandNegativeBinomialrandPoisson),用于按指定分布生成随机值,由此关闭了 #21834#42411Nikita Mikhaylov)。
  • 对 ClickHouse Keeper 的一项改进:新增对将快照上传到 S3 的支持。S3 相关信息可以在 keeper_server.s3_snapshot 中定义。#41342Antonio Andelic)。
  • 添加了聚合函数 analysisOfVarianceanova),用于对多个正态分布的观测组进行统计检验,以判断各组的均值是否相同。原始 PR #37872#42131Nikita 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)。#41484Frank Chen)。
  • 新增系统表 asynchronous_insert_log。其中包含关于异步插入的信息(包括 fire-and-forget 模式(wait_for_async_insert=0)下查询的结果),便于更好地进行排查和分析。 #42040 (Anton Popov)。
  • 在 HTTP 的 Accept-Encoding 首部中新增对 lz4bz2snappy 方法的支持,这是对 HTTP 协议的一项非标准扩展。#42071Nikolay Degterinsky)。
  • 添加了 Morton 编码(ZCurve)编解码函数。#41753Constantine Peresypkin)。
  • 添加对 SET setting_name = DEFAULT 的支持。#42187Filatenkov 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 建立新连接的过程响应更加及时。此前是由一个默认每分钟触发一次的任务来完成这一操作,因此表可能会在最长约一分钟内处于只读状态。#41092Nikita Mikhaylov)。
  • 现在可以将 projection 与零拷贝复制一起使用(零拷贝复制目前为非生产特性)。 #41147 (alesapin)。
  • 在子查询中支持使用 (EXPLAIN SELECT ...) 表达式。类似 SELECT * FROM (EXPLAIN PIPELINE SELECT col FROM TABLE ORDER BY col) 的查询现在是有效的。#40630Vladimir C)。
  • 允许在查询范围内修改 async_insert_max_data_sizeasync_insert_busy_timeout_ms。例如,用户只需要偶尔插入数据,但又无法访问服务器配置来调整默认设置。#40668Nikita Mikhaylov)。
  • 改进了从远程文件系统读取数据的性能,并将读写操作的线程池大小改为可配置。修复了 #41070#41011Kseniia Sumarokova)。
  • 在 WindowTransform/arratReduce*/initializeAggregation/aggregate 函数版本中支持所有组合子(combinator)的任意组合。此前,ForEach/Resample/Map 等组合子在这些场景下不受支持,使用它们会抛出类似 State function ... inserts results into non-state column 的异常。 #41107 (Kruglov Pavel).
  • 添加函数 tryDecrypt,在解密失败时(例如使用错误密钥解密)返回 NULL,而不是抛出异常。#41206Duc 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)。#41688Kseniia 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 类似。#41824Robert Schulze)。
  • 改进在使用不同主键替换分区时的反馈信息。修复了 #34798#41838Salvatore)。
  • 修复并行解析:segmentator 现在会检查 max_block_size。这修复了在并行解析且 LIMIT 较小时出现的内存过度分配问题。#41852 (Vitaly Baranov)。
  • 如果在从系统表执行 SELECT 时发生且已被忽略,则不要将 “TABLE_IS_DROPPED” 异常添加到 system.errors#41908 (AlfVII).
  • 改进选项 enable_extended_results_for_datetime_functions,使其对函数 toStartOfDaytoStartOfHourtoStartOfFifteenMinutestoStartOfTenMinutestoStartOfFiveMinutestoStartOfMinutetimeSlot 返回 DateTime64 类型的结果。#41910Roman Vasin)。
  • 改进了文本格式中 DateTime 类型的推断行为。现在会遵循 date_time_input_format 设置,并且不再尝试将数字按时间戳解析为日期时间。关闭 #41389 关闭 #42206#41912Kruglov Pavel)。
  • 当使用 perform_ttl_move_on_insert = false 执行插入时,删除令人困惑的警告。#41980 (Vitaly Baranov).
  • 允许用户像使用 count(*) 一样使用 countState(*)。从而关闭了 #9338#41983Amos Bird)。
  • 修复 rankCorr 的大小溢出问题。#42020Duc Canh Le)。
  • 在 Sentry 的配置中新增了一个选项,可以将任意字符串指定为环境名称,以便生成更方便的报告。#42037 (Nikita Mikhaylov)。
  • 修复从 CSV 中解析超出范围的 Date 值的问题。#42044Andrey 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 秒。#42321filimonov)。
  • 修复了在使用 Decimal 等复杂类型时,聚合状态类型在极少数情况下发生的无效类型转换问题。此变更修复了 #42408#42417Amos Bird)。
  • 支持在 dateName 函数中使用 Date32 类型的参数。#42554Roman Vasin)。
  • 现在在索引分析阶段也会使用包含 NULL 字面量的过滤条件。#34063#41842Amos Bird)。
  • 如果范围内的所有部分都早于某个阈值,则合并这些部分。该阈值可以通过 min_age_to_force_merge_seconds 来设置。此更改解决了 #35836#42423Antonio Andelic)。这是对 @fastio 实现了大部分逻辑的 #39550i 的延续。
  • allow_experimental_analyzer 设置下新增了用于查询分析和计划的基础设施。#31796 (Maksim Kita)。
  • 缩短恢复丢失 keeper 连接所需的时间。#42541 (Raúl Marín).

构建/测试/打包改进

  • 为数据表定义添加模糊测试工具(fuzzer)#40096Anton Popov)。这是今年迄今为止 ClickHouse 测试方面最大的一项进展。
  • 发布 ClickHouse Cloud 服务的测试版:https://console.clickhouse.cloud/。它提供了使用 ClickHouse 的最简便方式(甚至比单命令安装还要稍微简单一些)。
  • 为 AST Fuzzer 增加了对 WHERE 子句生成的支持,并支持添加或删除 ORDER BYWHERE 子句。#38519Ilya Yatsishin)。
  • Aarch64 二进制文件现在至少需要 ARMv8.2(2016 年发布)。最值得注意的是,这使得可以使用 ARM LSE,即原生原子操作。同时增加了 CMake 构建选项 "NO_ARMV81_OR_HIGHER",以便为较旧的 ARMv8.0 硬件(例如 Raspberry Pi 4)编译二进制文件。#41610Robert Schulze)。
  • 允许使用 Musl 构建 ClickHouse(在其已被支持但后来失效后进行的小改动)。#41987Alexey Milovidov)。
  • 增加对 $CLICKHOUSE_CRONFILE 文件的检查,以避免在安装时运行 sed 命令后才得到“文件未找到”的错误。#42081Chun-Sheng, Li)。
  • 将 cctz 更新到 2022e 以支持新的时区变更。巴勒斯坦的时区切换现在为星期六 02:00。将乌克兰的三个时区合并为一个。约旦和叙利亚从 +02/+03 加夏令时(DST)的模式切换为全年 +03。(https://data.iana.org/time-zones/tzdb/NEWS)。此变更关闭了 #42252#42327Alexey Milovidov)。#42273Dom Del Nano)。
  • 为 ClickHouse 添加对 Rust 代码的支持,并以 BLAKE3 哈希函数库作为示例。#33435BoloniniD)。

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_orderoptimize_aggregation_in_order)时,当对排序键前缀中的列套用单调函数并在查询中使用 ORDER BYGROUP BY 所导致的错误查询结果。#41701 (Anton Popov).
  • 修复在启用 optimize_monotonous_functions_in_order_by 设置时,从 Merge 表执行 SELECT 语句可能导致的崩溃问题。修复 #41269#41740Nikolai Kochetov)。
  • 修复了在极其罕见情况下可能出现的 “Part ... intersects part ...” 错误:当副本在刚刚将某个 part 作为损坏数据进行 detach 之后立即重启时,可能会触发该错误。#41741 (Alexander Tokmakov)。
  • 不允许创建或修改具有列名 _row_exists 的 MergeTree 表,该列名是为轻量级删除保留的。已修复 #41716#41763Jianmei Zhang)。
  • 修复某些 HTTP 响应未包含 CORS 头部的问题。#41792Frank Chen)。
  • 如果某个 ReplicatedMergeTree 表是由 20.3 或更早版本创建且从未进行过修改,则在 22.9 中启动该表时可能会失败,此问题已修复。修复了 #41742#41796Alexander Tokmakov)。
  • 当批量发送因某些原因失败后,无法自动恢复,如果不及时处理,会导致数据积压,打印的错误信息会越来越长,从而导致 http 线程阻塞。#41813 (zhongyuankai)。
  • 修复了在设置压缩标记时的 compact parts 问题。修复了 #41783#41746#41823alesapin)。
  • 较旧版本的 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#41981Alexander Tokmakov)。
  • toDateTime64 现在对于负整数和浮点数参数返回一致的输出。#42025Robert Schulze)。
  • 修复向 azure_blob_storage 写入的问题。部分解决 #41754#42034Kseniia 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#42106Alexander Tokmakov)。
  • 修复在启用文件系统缓存时使用 remote_filesystem_read_method=read 所导致的严重效率低下问题。关闭 #42125#42129Kseniia 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#42198Alexey Milovidov)。
  • 修复从 Buffer 表按降序读取数据时的读取问题。#42236Duc Canh Le)。
  • 修复了一个错误:当在默认 profile 中设置了 background_pool_size 但未设置 background_merges_mutations_concurrency_ratio 时,会导致 ClickHouse 无法启动的问题。#42315 (nvartolomei)。
  • 对列与表结构不同的附加数据部分执行 ALTER UPDATE,可能会在磁盘上生成无效的 columns.txt 元数据。从此类数据部分读取数据时可能会报错或返回无效数据。修复了 #42161#42319Nikolai Kochetov)。
  • additional_table_filters 设置未应用到 Distributed 存储。修复了 #41692#42322Nikolai Kochetov)。
  • 修复查询完成/取消逻辑中的数据竞争问题。关闭 #42346#42362Alexey Milovidov)。
  • 此次变更回滚了 #40217,该变更在日期/时间函数中引入了一个回归缺陷。#42367Alexey Milovidov)。
  • 修复在假条件下进行 join 时的 assert 类型转换问题,关闭 #42380#42407Vladimir C)。
  • 修复了在处理 Decimal 数据类型时的缓冲区溢出问题。此更改解决了 #42451#42465Alexey Milovidov)。
  • AggregateFunctionQuantile 现在可以正确处理 UInt128 列。之前,分位数状态会将 UInt128 列解释为 Int128,这可能导致结果不正确。#42473 (Antonio Andelic)。
  • 修复在对非 Float32 列的 Annoy 索引执行 INSERT 操作时触发的 bad_cast 断言。Annoy 索引是一个实验性功能。#42485Robert Schulze)。
  • 在使用 Date 或 DateTime 与 128 或 256 位整数进行算术运算时,会引用未初始化内存。#42453#42573Alexey Milovidov)。
  • 修复在服务器升级期间,分区键包含别名函数名称时出现的意外表加载错误。 #36379 (Amos Bird).

ClickHouse 版本 22.9,2022-09-22

向后不兼容的变更

  • 如果存在任何 ReplicatedMergeTree 表,从 20.3 及更早版本升级到 22.9 及更新版本时,应通过一个中间版本进行升级,否则新版本的服务器将无法启动。#40641Alexander Tokmakov)。
  • 移除函数 accurate_Castaccurate_CastOrNull(它们与 accurateCastaccurateCastOrNull 的区别在于名称中的下划线,并且不受 cast_keep_nullable 设置值的影响)。这些函数未被记录在文档中、未测试、未使用且并非必需,仅由于代码泛化而保留存在。#40682Alexey Milovidov)。
  • 添加测试以确保每一个新的表函数都会在文档中进行说明。参见 #40649。将表函数 MeiliSearch 重命名为 meilisearch#40709Alexey Milovidov)。
  • 添加测试以确保每一个新的函数都会在文档中进行说明。参见 #40649。函数 lemmatizesynonymsstem 之前由于失误是大小写不敏感的,现在改为大小写敏感。#40711Alexey Milovidov)。
  • 出于安全性和稳定性的考虑,catboost 模型将不再在 ClickHouse 服务器内部进行评估。相反,现在在 clickhouse-library-bridge 中完成评估,该独立进程加载 catboost 库,并通过 HTTP 与服务器进程通信。#40897Robert Schulze)。
  • 使 YAML 配置的解释方式更加符合常规习惯。#41044Vitaly Baranov)。

新功能

  • 支持将 insert_quorum = 'auto' 设置为使用多数副本数。#39970Sachin)。
  • 向 ClickHouse 服务器添加内置仪表板。该示例项目展示了如何使用 ClickHouse 特性以 1% 的工作量实现 90% 的效果。#40461Alexey Milovidov)。
  • 添加新的设置约束可写性类型 changeable_in_readonly#40631Sergei Trifonov)。
  • 增加对 INTERSECT DISTINCTEXCEPT DISTINCT 的支持。#40792Duc 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。#40910Kruglov Pavel)。
  • 在 DESCRIBE TABLE 查询中支持查询参数。#40952Nikita Taranov)。
  • 通过转换为 DateTime64,增加对 Parquet Time32/64 的支持。Parquet time32/64 表示自午夜起经过的时间,而 DateTime32/64 表示实际的 Unix 时间戳。转换只是简单地从 0 偏移。#41333Arthur Passos)。
  • 在 Apache Datasketches 上实现集合操作。#39919Fangyuan Deng)。注意:没有必要使用 Apache Datasketches,其效果不如 ClickHouse,本身只有在与其他系统集成时才有意义。
  • 在读取文本格式(CSVTSV)时允许将错误记录到指定文件。#40516zjial)。

实验性功能

  • 基于 Annoy 添加 ANN(近似最近邻)索引。#40818Filatenkov Artur)。#37215VVMak)。
  • 新增存储引擎 KeeperMap,使用 ClickHouse Keeper 或 ZooKeeper 作为键值存储。#39976Antonio Andelic)。该存储引擎用于存储少量元数据。
  • 内存数据部分的改进:移除已完全处理的 WAL 文件。#40592Azat 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 控制,默认启用。#39304Nikita Taranov)。
  • 在应用 WHERE 子句后,如果某些排序键列的值始终为常量,则对 optimize_read_in_order 提供了更好的支持。例如查询 SELECT ... FROM table WHERE a = 'x' ORDER BY a, b,其中 table 的存储定义为:MergeTree ORDER BY (a, b)#38715Anton Popov)。
  • 在排序之前,使用于 full_sorting_join 的连接流相互过滤。#39418Vladimir C)。
  • 通过跳过空字面量的处理优化了 LZ4 解压缩。 #40142 (Nikita Taranov).
  • 在可能的情况下使用原生 copy 操作加快备份过程,而不是通过 clickhouse-server 内存中转复制。#40395 (alesapin)。
  • 不再为每个 INSERT 块获取存储快照(可略微提升性能)。 #40638 (Azat Khuzhin)。
  • 为具有多个可为 NULL 参数的聚合函数实现批量处理。#41058 (Raúl Marín).
  • 加快读取 UniquesHashSet 的速度(例如从磁盘读取 uniqState 时)。#41089Raúl Marín)。
  • 修复了在包含大量列的表中对 compact parts 执行 mutation 时出现的高内存占用问题。#41122 (lthaooo)。
  • 在 ARM 上启用 vectorscan 库,以加速正则表达式匹配。#41033Robert Schulze)。
  • 将 vectorscan 升级到 5.4.8,该版本包含多项性能优化,可加速正则表达式匹配。#41270 (Robert Schulze)。
  • 修复在并发级别极高时出现的错误回退逻辑,该逻辑会跳过针对 VFS(如 S3)的本地文件系统缓存。#40420Kseniia Sumarokova)。
  • 如果行策略过滤器始终为 false,则无需读取任何数据即可立即返回空结果。这一更改关闭了 #24012#40740Amos 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'。#41214Roman Vasin)。
  • 出于安全性和稳定性的考虑,CatBoost 模型不再在 ClickHouse 服务器内部进行评估。相反,现在的评估在 clickhouse-library-bridge 中完成,它是一个独立进程,用于加载 catboost 库并通过 HTTP 与服务器进程通信。函数 modelEvaluate() 已被 catboostEvaluate() 所取代。#40897Robert Schulze)。#39629Robert Schulze)。
  • 为磁盘上的临时数据添加更多指标,关闭 #40206#40239Vladimir C)。
  • 添加配置选项 warning_supress_regexp,解决 #40330#40548Vladimir 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 中新增两个指标:NumberOfDetachedPartsNumberOfDetachedByUserParts#40779Sema Checherinda)。
  • 允许为 ODBC 和 JDBC 表使用 CONSTRAINT 约束。 #34551 (Alexey Milovidov).
  • 在格式化查询时,如果 SETTINGS 在原始查询中没有多次出现,则不要多次打印它。 #38900 (Raúl Marín).
  • 改进 OpenTelemetry 跟踪上下文在线程间的传播。#39010 (Frank Chen).
  • ClickHouse Keeper:仅在显式指定时才在 Keeper 中为 interserver_listen_host 添加监听器。#39973Antonio Andelic)。
  • 改进 Replicated 用户访问存储在出错后的恢复过程。#39977 (Vitaly Baranov).
  • EmbeddedRocksDB 中添加对 TTL 的支持。#39986 (Lloyd-Pottiger)。
  • clickhouse-obfuscator 添加结构自动推断功能,因此不再需要 --structure 参数。#40120Nikolay Degterinsky)。
  • 改进并修复 Arrow 格式中的字典处理。#40173 (Kruglov Pavel).
  • Date32DateTime64Date 向更窄类型的转换行为进行了更自然的处理:当值超出正常范围时,会采用正常范围的上界或下界值。#40217 (Andrey Zvonov)。
  • 修复在基于 ViewMerge 表无法使用索引的情况。#40233Duc Canh Le)。
  • JSON 服务器日志的自定义键名。#40251Mallik Hassan)。
  • 现在可以为函数 throwIf 抛出的异常设置自定义错误码。#40319 (Robert Schulze)。
  • 改进模式推断缓存,并考虑到可能改变模式的格式设置。#40414Kruglov Pavel)。
  • 支持将 Date 解析为 DateTimeDateTime64。此更改实现了在 #36949 中提出的改进。#40474Alexey Milovidov)。
  • 支持将包含 DateTime64(如 2022-08-22 01:02:03.456)的 String 转换为 DateDate32。支持将包含 DateTime(如 2022-08-22 01:02:03)的 String 转换为 Date32。关闭了 #39598#40475Alexey Milovidov)。
  • 改进对 Parquet 格式中嵌套数据结构的支持 #40485Arthur Passos)。
  • 在 Avro 中支持将 Array(Record) 读取为展平的嵌套表。#40534 (Kruglov Pavel)。
  • EmbeddedRocksDB 添加只读支持。#40543 (Lloyd-Pottiger)。
  • 验证 URL 表引擎的压缩方式参数。#40600 (Frank Chen).
  • 在文件名后带查询字符串的情况下,为 url 表函数/引擎提供更好的格式检测。修复 #40315#40636Kruglov Pavel)。
  • 在使用 grouping set 时禁用 projection。此前会生成错误结果。本次修复了 #40635#40726Amos Bird)。
  • 修复 APPLY 列转换器格式不正确的问题,该问题在用于表定义时可能破坏元数据。此修复对应 #37590#40727Amos Bird)。
  • formatDateTime 中增加对使用 %z 描述符格式化时区偏移量的支持。 #40736 (Cory Levy).
  • clickhouse-client 的交互模式现在会将 ./ 视为“重新执行上一条命令”。 #40750 (Robert Schulze)。
  • 修复在 MySQL 数据库引擎和 MySQL 表函数中传递 MySQL 超时参数的问题。修复 #34168#40751Kseniia Sumarokova)。
  • 为文件系统缓存目录创建状态文件,以确保缓存目录不会在不同服务器或不同缓存之间共享。#40820 (Kseniia Sumarokova)。
  • EmbeddedRocksDB 存储引擎添加对 DELETEUPDATE 的支持。#40853 (Antonio Andelic)。
  • ClickHouse Keeper:修复在长时间提交过程中的关闭问题,并增大允许的请求大小。#40941Antonio 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#41162Kruglov Pavel)。
  • 无需重启服务器即可即时对 HTTP 处理程序应用更改。#41177 (Azat Khuzhin).
  • ClickHouse Keeper:在关闭时正确结束活动会话。#41215Antonio 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).

构建/测试/打包改进

缺陷修复

  • 修复由 AWS SDK 中的一个 bug 导致的潜在数据丢失问题。该 bug 仅会在 ClickHouse 通过 S3 使用时被触发。#40506alesapin)。这个 bug 在 AWS SDK 中已存在 5 年之久,并在我们报告之后才被关闭。
  • Native 格式的恶意数据可能会导致崩溃。#41441 (Alexey Milovidov)。
  • 聚合函数 categorialInformationValue 的属性定义不正确,这可能在运行时导致空指针解引用。本变更关闭了 #41443#41449 (Alexey Milovidov)。
  • 以 Apache ORC 格式写入数据可能会导致缓冲区溢出。#41458Alexey Milovidov)。
  • 如果将 Nullable 的 Array 作为参数使用,会修复函数 encryptcontingency 的内存安全问题。此更改修复了 #41004#40195Alexey Milovidov)。
  • 修复在 'not_processed' 非空时 MergeJoin 中的缺陷。#40335 (liql2007)。
  • 修复在使用 IN 运算符时因小数精度丢失而导致结果不正确的问题,参见 #41125#41130Vladimir C)。
  • 修复多级 Nested 列填充时的遗漏问题。 #37152 (Anton Popov).
  • 修复针对 Ordinary(已弃用)数据库的 SYSTEM UNFREEZE 查询。这是对 https://github.com/ClickHouse/ClickHouse/pull/36424 的修复。 #38262Vadim Volodin)。
  • 修复了由 WITH 语句引入的未使用的未知列问题。此修复对应 #37812#39131Amos Bird)。
  • 在存在窗口函数的情况下,修正对 ORDER BY 的查询分析。修复了 #38741#24892#39354Dmitry 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:修复在安装快照时访问日志时出现的竞争条件。#40627Antonio Andelic)。
  • 修复 toFixedString 函数中的短路执行问题。部分解决 #40622#40628Kruglov Pavel)。
  • 修复了在 ClickHouse 中将 SQLite 的 int8 列转换为 int64 列时的错误。修复了 #40639#40642Barum Rho)。
  • 修复了递归 Buffer 表中的栈溢出。关闭 #40637#40643Alexey Milovidov)。
  • 在向 ProcessList 插入新查询时会发生内存分配。如果在这些内存分配期间达到了内存限制,我们无法使用 OvercommitTracker,因为此时已经持有 ProcessList::mutex。修复了 #40611#40677Dmitry 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#40759Kseniia Sumarokova)。
  • 使 GROUPING 函数的结果与 SQL 及其他 DBMS 中的一致。 #40762 (Dmitry Novik).
  • #40595 中,有用户报告称 host_regexp 功能在配合 /etc/hosts 中的名称解析为地址时工作不正常。该问题已修复。#40769Arthur Passos)。
  • 修复 Log 系列表引擎的增量备份问题。#40827 (Vitaly Baranov).
  • 修复一个极其罕见的错误,可能在零拷贝复制中导致数据丢失。 #40844 (alesapin).
  • 修复在针对不同列构建出的集合表达式相同时,键条件分析发生崩溃的问题。 #40850 (Duc Canh Le).
  • 修复嵌套 JSON 对象的 schema 推断。#40851 (Kruglov Pavel).
  • 修复了文件系统缓存文件的三位数字前缀目录在为空时未被删除的问题。关闭 #40797#40867Kseniia Sumarokova)。
  • 修复在连接副本失败时未捕获的 DNS_ERROR 问题。 #40881 (Robert Coelho).
  • 修复在子查询中删除不需要的列时的 bug。#40884 (luocongkai)。
  • 修复远程读取缓冲区中多余的内存分配。 #40896 (Kseniia Sumarokova).
  • 修复了这样一个问题:即使用户被显式撤销了删除数据库的权限,仍然可以删除数据库。#40906 (Nikita Mikhaylov)。
  • 针对 ClickHouse Keeper 的修复:在写请求中正确比较路径与 Keeper 内部系统节点路径。#40918Antonio 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#41083Kruglov Pavel)。
  • 修复 Window 视图下的 query_views_log 问题。#41132 (Raúl Marín).
  • 默认禁用 optimize_monotonous_functions_in_order_by,以缓解相关问题:#40094#41136Denny Crane)。
  • 修复了在将数据库引擎从 Ordinary 自动转换为 Atomic 时出现的 “possible deadlock avoided” 错误。#41146Alexander Tokmakov)。
  • 修复 SortedBlocksWriter 在处理空 block 时出现的 SIGSEGV(在启用 optimize_aggregation_in_orderjoin_algorithm=auto 时可能发生)。#41154 (Azat Khuzhin)。
  • 修复了在启用 trivial count 优化且使用 ARRAY JOIN 时出现的查询结果错误。修复了 #39431#41158Denny Crane)。
  • 修复 GetPriorityForLoadBalancing::getPriorityFunc() 中的 stack-use-after-return 问题。 #41159 (Azat Khuzhin).
  • 修复位置参数越界(Positional argument out of bounds)异常。修复 #40634#41189Kseniia Sumarokova)。
  • 修复后台清理损坏的分离 part 的逻辑。 #41190 (Kseniia Sumarokova).
  • 修复在存在大量带有 WHERE 条件的交叉连接时查询重写复杂度呈指数级增长的问题,并关闭 #21557#41223Vladimir C)。
  • 修复写穿缓存中可能存在的逻辑错误,该错误是由于未按要求处理所有类型的异常而导致的。关闭 #41208#41232Kseniia Sumarokova)。
  • 修复 system.filesystem_cache_log 中的 String 类型日志条目。 #41233 (jmimbrero).
  • 在子查询中包含 OFFSET 子句且在外层查询中包含 WHERE 子句的查询可能返回不正确的结果,此问题已修复。修复了 #40416#41280Alexander Tokmakov)。
  • 修复在启用 query_plan_optimize_primary_key 时可能产生的错误查询结果。对应修复 #40599#41281Nikolai Kochetov)。
  • 不要让无效序列影响 lowerUTF8/upperUTF8 中的其他行。#41286 (Azat Khuzhin).
  • 修复包含 Object 类型列的 ALTER &lt;table&gt; ADD COLUMN 语句。#41290Anton Popov)。
  • 修复了在配置中没有 distributed_ddl.path 时,从 system.distributed_ddl_queue 查询时出现 “No node” 错误的问题。修复了 #41096#41296young scott)。
  • 修复磁盘对象存储中错误抛出的 Expected relative path 逻辑错误。相关 issue:#41246#41297Kseniia Sumarokova)。
  • 在 MsgPack 格式中插入 UUID 之前添加列类型检查。#41309Kruglov 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#41388Denny Crane)。
  • 自 22.8 版本起,如果数据库是 Replicated 且集群名与数据库名相同,则会忽略 ON CLUSTER 子句。由于这一行为,DROP PARTITION ON CLUSTER 在与 Replicated 一起使用时表现与预期不符。该问题已修复,现在只对在数据库级别被复制的查询忽略 ON CLUSTER 子句。修复了 #41299#41390Alexander Tokmakov)。
  • 修复在取消查询(KILL QUERY)或服务器关闭时可能出现的挂起/死锁问题。#41467 (Azat Khuzhin).
  • 修复在使用 JBOD 功能时可能导致服务器崩溃的问题。该修复解决了 #41365#41483Amos Bird)。
  • 修复从可空固定字符串到字符串的转换。 #41541 (Duc Canh Le).
  • 防止在向 groupBitmap* 传递错误聚合状态时发生崩溃。 #41563 (Raúl Marín).
  • 带有 ORDER BY 且满足 1500 <= LIMIT <= max_block_size 的查询,可能会返回结果开头缺少若干行的不正确结果。修复了 #41182#41576Nikolai Kochetov)。
  • 修复在使用物化视图时 X-ClickHouse-Summary 中读取字节数/行数的统计。#41586Raúl Marín)。
  • 修复在带有 OFFSET 的查询中可能出现的 pipeline stuck(流水线卡住)异常。该错误是在 enable_optimize_predicate_expression = 0WHERE 中条件恒为假时被发现的。修复了 #41383#41588Nikolai Kochetov)。

ClickHouse 22.8 版发布,2022-08-18

向后不兼容的变更

  • 扩展了 Date32DateTime64 的范围,以支持从 1900 年到 2299 年的日期。在之前的版本中,仅支持从 1925 年到 2283 年的区间。实现采用的是前推格里高利历(符合 ISO 8601:2004(第 3.2.1 条“格里高利历”)),而不是考虑从儒略历到格里高利历的历史过渡。此变更会影响超出范围参数的特定实现行为。例如,在之前的版本中,值 1899-01-01 会被截断为 1925-01-01,在新版本中则会被截断为 1900-01-01。如果你传入 INTERVAL 3 QUARTERtoStartOfInterval 的舍入行为最多会改变一个季度,因为区间是从一个与实现相关的时间点开始计数的。关闭 #28216,改进 #38393#39425Roman Vasin)。
  • 现在,所有相关的字典源都会遵守 remote_url_allow_hosts 设置。此前已对 HTTP、Cassandra、Redis 生效。新增对 ClickHouse、MongoDB、MySQL、PostgreSQL 的支持。仅对通过 DDL 创建的字典进行主机检查。#39184Nikolai Kochetov)。
  • 预构建的 ClickHouse x86 二进制文件现在要求支持 AVX 指令,即 CPU 至少为 2011 年发布的 Intel Sandy Bridge / AMD Bulldozer 及之后的型号。#39000Robert 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 的支持,目标表使用 DistributedReplicated 引擎。#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。注意:不存在 now64InBlocktodayInBlock 函数。#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)。
  • 新增格式 PrettyMonoBlockPrettyNoEscapesMonoBlockPrettyCompactNoEscapesPrettyCompactNoEscapesMonoBlockPrettySpaceNoEscapesPrettySpaceMonoBlockPrettySpaceNoEscapesMonoBlock#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 时:根据输入流的排序描述推导出排序方式,如果输入流已经有序则跳过排序。#38719Igor Nikonov)。显著改进内存使用和查询执行时间,并在 DISTINCT 列与 ORDER BY 列匹配时,对最终的 DISTINCT 使用 DistinctSortedChunkTransform,但在 EXPLAIN PIPELINE 中将其重命名为 DistinctSortedStreamTransform → 这显著改善了内存使用情况,同时移除 DistinctSortedChunkTransform 的热点循环中不必要的分配。#39432Igor Nikonov)。仅当排序描述适用于 DISTINCT 列时才使用 DistinctSortedTransform,否则回退到普通的 DISTINCT 实现;这同时也减少了在执行 DistinctSortedTransform 期间所需的检查次数。#39528Igor Nikonov)。修复:DistinctSortedTransform 之前没有利用排序带来的优势。由于 clearing_columns 检测错误(始终为空),它从不清空 HashSet,因此基本上和普通 DISTINCTDistinctTransform)的行为一样。该修复显著降低了内存使用。#39538Igor Nikonov)。
  • 在执行 cluster 及类似的表函数时,优先使用本地节点获取远程表的结构。 #39440 (Mingliang Pan).
  • 使用 AVX512VBMI2 压缩存储优化数值列过滤。#39633Guo Wangyang)。对于支持 AVX512 VBMI2 的系统,此 PR 在 SSB 基准测试中,对 3.1、3.2 和 3.3 号查询(SF=100)的性能提升约 6%。在 Intel Ice Lake Xeon 8380 双路服务器上进行了测试。#40033Robert Schulze)。
  • 使用函数表达式优化多线程场景下的索引分析。 #39812 (Guo Wangyang).
  • 针对复杂查询的优化:如果没有注册任何 UDF,则不要遍历 AST。#40069Raúl Marín)。优化 CurrentMemoryTracker 的内存分配和释放。#40078Raúl Marín)。
  • 改进了 Base58 编码和解码功能。#39292Andrey 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#39420Amos Bird)。具有相同状态的函数可以在物化视图中互换使用。
  • 重构并简化 system.backups 表,删除 internal 列,允许用户设置操作 ID,新增列 num_filesuncompressed_sizecompressed_sizestart_timeend_time#39503Vitaly 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#37198Alexander 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 SEMILEFT ANTI 直接 JOIN 操作的支持。#38956 (Vladimir C).
  • 为 fsync 操作添加 profile_events 事件。#39179 (Azat Khuzhin).
  • 为普通函数 file(path[, default]) 添加第二个参数,当文件不存在时,函数返回该参数指定的值。 #39218 (Nikolay Degterinsky).
  • 针对通过 HTTP 读取进行了一些小修复,在返回 200 OK 时允许对部分内容进行重试。#39244Kseniia Sumarokova)。
  • 支持执行形如 CREATE TEMPORARY TABLE ... (&lt;list of columns&gt;) AS ... 的查询。 #39462 (Kruglov Pavel).
  • 为自定义 TLD 添加对 !/*(感叹号/星号)的支持(cutToFirstSignificantSubdomainCustom()/cutToFirstSignificantSubdomainCustomWithWWW()/firstSignificantSubdomainCustom())。 #39496 (Azat Khuzhin).
  • 为 NATS 新增对 TLS 连接的支持。实现了 #39525#39527Constantine Peresypkin)。
  • clickhouse-obfuscator(用于数据库脱敏,以进行测试和负载生成的工具)现在新增了 --save--load 参数,可与预训练模型配合使用。此更改关闭了 #39534#39541Alexey Milovidov)。
  • 修复重启时日志轮转行为不正确的问题。 #39558 (Nikolay Degterinsky).
  • 修复在启用外部聚合时构建聚合投影的问题。标记为改进项,因为这种情况较为罕见,并且可以通过修改设置这一简单变通方案来修复。此更改修复了 #39667#39671Amos 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_filteradditional_filter 进行主键分析。这也有助于修复类似 #37454 的问题。#39826Amos Bird)。
  • 修复 Play UI 中的两个可用性问题:- 由于多余的圆角和边距,在 iPad 上无法实现像素级精确显示;- 在首次查询之后的后续查询中不再显示进度指示。此更改关闭 #39957。此更改关闭 #39960#39961Alexey Milovidov)。
  • Play UI:添加行号;点击单元格时支持选中;为表格单元格添加滞后处理。#39962 (Alexey Milovidov)。
  • Play UI:在 textarea 中识别 Tab 键,同时不影响 Tab 导航。#40053Alexey Milovidov)。
  • 客户端将显示服务器端耗时。这对于比较远程数据中心中 ClickHouse 服务的性能非常重要。此更改关闭了 #38070。有关动机参见此处#39968Alexey Milovidov)。
  • 添加了 parseDateTime64BestEffortUSparseDateTime64BestEffortUSOrNullparseDateTime64BestEffortUSOrZero 函数,从而关闭了 #37492#40015Tanya 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 = breakthrow 分别提供独立计数器。例如,如果你设置了 max_rows_to_readread_overflow_mode = 'break',通过查看 OverflowBreak 计数器的值,可以区分不完整的结果。#40205Alexey Milovidov)。
  • 修复在出现 "Memory limit exceeded" 错误时的内存统计问题(此前 [peak] 内存使用量会将分配失败的内存也计入)。#40249 (Azat Khuzhin).
  • 为文件系统缓存新增指标:FilesystemCacheSizeFilesystemCacheElements#40260Kseniia 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 生效。#39430Azat Khuzhin)。
  • 由于 TSAN 在 clang-14 中存在问题(https://github.com/google/sanitizers/issues/1552https://github.com/google/sanitizers/issues/1540),这里我们使用 clang-15 构建 TSAN 二进制文件。#39450Mikhail f. Shiryaev)。
  • 移除将 ClickHouse 工具构建为独立可执行程序的选项。修复了 #37847#39520Alexey 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#40181Alexey Milovidov)。
  • 为在 CI 中运行准备 RISC-V 64 构建。这是针对 #40141#40197Alexey Milovidov)。
  • 简化了函数注册宏接口(FUNCTION_REGISTER*),从而省去了在 registerFunctions.cpp 中添加并调用 extern 函数的步骤,同时也加快了新函数的增量编译速度。#38615 (Li Yin)。
  • Docker:现在 Docker 镜像中的 entrypoint.sh 会为在多磁盘(multidisk)配置中找到的所有文件夹生成并执行 chown 命令 #17717#39121Nikita Mikhaylov)。

错误修复

  • 修复 CapnProto 输入格式中可能出现的段错误。该缺陷由 kiojj 发现并通过 ClickHouse 漏洞赏金计划提交。#40241Kruglov Pavel)。
  • 修复数组下标运算符在极少数情况下的错误行为。此更改关闭了 #28720#40185Alexey Milovidov)。
  • 修复了加密函数中参数检查不足的问题(由 query fuzzer 发现),从而关闭了 #39987#40194Alexey Milovidov)。
  • 修复在将 IN 运算符与包含多列的 ENGINE = Set 表一起使用时,列顺序可能不正确的问题。此修复解决了 #13014#40225Alexey Milovidov)。
  • 修复从加密磁盘读取数据时的 seek 行为。本 PR 修复了 #38381#39687Vitaly Baranov)。
  • 修复 JOIN 计划中的重复列。最终解决 #26809#40009Vladimir C)。
  • 修复了在对包含不同日期/时间类型的列执行带有 ORDER BY WITH FILL 的 SELECT 查询时发生的挂起问题。 #37849 (Yakov Olkhovskiy).
  • 修复当 ORDER BY 与投影的 ORDER BY 相匹配时的行为(此前会返回未排序的结果)。#38725Azat Khuzhin)。
  • 如果 GROUP BY 语句中的函数会与某个表列或表达式同名(shadow)从而将其遮蔽,则不要对这些函数进行优化。修复了 #37032#39103Anton Kozlov)。
  • 在执行 RENAME TABLE 后修正日志中的错误表名。此更改修复了 #38018#39227 (Amos Bird)。
  • 在进行查询优化时,修复在列裁剪情况下的位置参数处理问题。关闭 #38433#39293Kseniia 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#39384Kseniia Sumarokova)。
  • 修复在取消执行 INSERT INTO FUNCTION 时的 WriteBuffer finalize 行为(在早期版本中可能会导致调用 std::terminate)。#39458Kruglov Pavel)。
  • 修复在稀疏序列化中对 Object 类型列的存储。#39464Anton Popov)。
  • 修复在使用投影时可能出现的 "Not found column in block" 异常。该修复关闭了 #39469#39470小路)。
  • 修复 DROP 和 INSERT 与物化视图之间竞态时的异常。 #39477 (Azat Khuzhin).
  • Apache Avro 库中的一个缺陷:修复 Avro 格式中的数据竞争以及可能出现的堆缓冲区溢出问题。关闭了 #39094#33652#39498Kruglov 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#39556Vladimir C)。
  • 修复了在 ON CLUSTERReplicated 数据库中针对 ReplicatedMergeTree 执行 CREATE/DROP INDEX 查询时的问题。此前这些查询会在所有副本上执行(导致报错或 DDL 队列卡住)。修复了 #39511#39565Alexander Tokmakov)。
  • 修复在进行 join 下推时出现的 "column not found" 错误,关闭 #39505#39575Vladimir C)。
  • 修复 REGEXP_REPLACE 的错误别名。此更改修复了 https://github.com/ClickHouse/ClickBench/issues/9#39592Alexey 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)来检测。#39600Andrey Zvonov)。
  • 修复设置 output_format_arrow_string_as_stringoutput_format_arrow_low_cardinality_as_dictionary 在组合使用时的行为。关闭了 #39624#39647Kruglov Pavel)。
  • 修复了分布式表读取中默认数据库解析的问题。#39674Anton Kozlov)。
  • (仅在已废弃的 Ordinary 类型数据库中)在使用 mmap I/O 缓存、数据库引擎为 Ordinary 且创建了与已删除表同名的新表时,SELECT 可能会读取到已删除表的数据。该问题已修复。#39708 (Alexander Tokmakov)。
  • 修复可能出现的错误 Invalid column type for ColumnUnique::insertRangeFrom. Expected String, got ColumnLowCardinality,对应修复了 #38460#39716Arthur Passos)。
  • JSON 格式中 meta 部分的字段名被错误地进行了双重转义处理。已关闭 #39693#39747Alexey Milovidov)。
  • 修复在使用元组和运算符 IN 时的错误索引分析,可能导致查询结果不正确。 #39752 (Anton Popov).
  • 修复 EmbeddedRocksDB 表在使用参数按键进行过滤时的错误。 #39757 (Antonio Andelic).
  • 修复因 ARRAY JOIN 优化导致的错误 Invalid number of columns in chunk pushed to OutputPort,解决了 #39164#39799Nikolai Kochetov)。
  • 针对 Linux 内核中一个 bug 的变通方案。通过将 local_filesystem_read_method 设置为 pread_threadpool 来修复 CANNOT_READ_ALL_DATA 异常。根据 man,此 bug 仅影响 Linux 内核 5.9 和 5.10 这两个版本。#39800Anton Popov)。
  • (仅限 NFS) 修复在启用 root-squash 的卷上 NFS mkdir 失败的问题。 #39898 (Constantine Peresypkin).
  • 在执行 DETACH/DROP 时,从 Prometheus 指标中移除字典。 #39926 (Azat Khuzhin).
  • 修复对带有虚拟列的 StorageFile 的读取,关闭 #39907#39943flynn)。
  • 修复在获取数据时过高的内存占用。修复了 #39915#39990Nikolai Kochetov)。
  • (实验性特性)修复 hashId 崩溃以及 salt 参数没有被使用的问题。#40002 (Raúl Marín)。
  • 在使用特定组合的常量列和非常量列时,EXCEPTINTERSECT 运算符可能会导致崩溃。 #40020 (Duc Canh Le).
  • 修复了在 INSERT 过慢或合并 / mutation 过程耗时过长时出现的 “Part directory doesn't exist” 和 “tmp_&lt;part_name&gt; ... No such file or directory” 错误。还修复了这样一种情况:如果之前获取数据片段(part)的尝试失败,但未清理 tmp-fetch_&lt;part_name&gt; 目录,则可能导致某些复制队列条目卡住,而在日志中没有任何错误或警告。 #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#40095Jianmei 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 子句中列位置的引用。如需恢复旧行为,请禁用该设置。#38204Alexey Milovidov)。
  • 默认禁用 format_csv_allow_single_quotes。参见 #37096。(Kruglov Pavel)。
  • Ordinary 数据库引擎以及用于 *MergeTree 表的旧存储定义语法已弃用。默认情况下,不允许使用 Ordinary 引擎创建新的数据库。如果 system 数据库使用 Ordinary 引擎,它将在服务器启动时自动转换为 Atomic。可以通过设置(allow_deprecated_database_ordinaryallow_deprecated_syntax_for_merge_tree)保留旧行为,但这些设置可能会在未来版本中移除。#38335Alexander Tokmakov)。
  • 默认强制将逗号 join 重写为 INNER JOIN(将默认值设置为 cross_to_inner_join_rewrite = 2)。如需旧行为,请设置 cross_to_inner_join_rewrite = 1#39326Vladimir C)。如遇任何不兼容问题,可以将该设置恢复为之前的值。

新功能

  • 支持包含窗口函数的表达式。修复 #19857#37848Dmitry Novik)。
  • EmbeddedRocksDB 表添加新的 direct JOIN 算法,参见 #33582#35363Vladimir C)。
  • 新增了全排序合并 JOIN 算法。 #35796 (Vladimir C).
  • 实现了 NATS 表引擎,支持与 NATS 之间的发布/订阅(pub/sub)。关闭了 #32388#37171tchepavel)。(Kseniia Sumarokova
  • 实现 mongodb 表函数,允许向 MongoDB 存储 / 表函数写入数据。 #37213 (aaapetrenko). (Kseniia Sumarokova)
  • 新增 SQLInsert 输出格式。关闭了 #38441#38477Kruglov 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#38475Nikolai Kochetov)。
  • 添加 compatibility 设置和 system.settings_changes 系统表,用于记录跨 ClickHouse 版本的设置变更信息。关闭 #35972#38957Kruglov Pavel)。
  • 添加函数 translate(string, from_string, to_string)translateUTF8(string, from_string, to_string),用于将部分字符替换为其他字符。#38935Nikolay Degterinsky)。
  • 支持 parseTimeDelta 函数。使用该函数时, ;-+,: 可以用作分隔符,例如:1yr-2mo2m:6sSELECT parseTimeDelta('1yr-2mo-4w + 12 days, 3 hours : 1 minute ; 33 seconds')#39071jiahui-97)。
  • 新增 CREATE TABLE ... EMPTY AS SELECT 查询。它会自动根据 SELECT 查询推断表结构,但在创建后不会向表中填充数据。解决了 #38049#38272Alexander Tokmakov)。
  • 添加了用于限制远程存储 IO 操作的配置项:max_remote_read_network_bandwidth_for_servermax_remote_write_network_bandwidth_for_server#39095Sergei Trifonov)。
  • 添加 group_by_use_nulls 设置,使在使用 ROLLUP、CUBE 和 GROUPING SETS 时聚合键列可以为 Nullable。关闭问题 #37359#38642Dmitry Novik)。
  • 新增在数据导出时指定压缩级别的功能。#38907 (Nikolay Degterinsky).
  • 新增选项,要求必须显式授予权限才能对 system 数据库执行 SELECT。详情:#38970Vitaly Baranov)。
  • 函数 multiMatchAnymultiMatchAnyIndexmultiMatchAllIndices 及其模糊匹配变体现在可以接受非常量的模式数组参数。#38485Robert Schulze)。SQL 函数 multiSearchAllPositions 现在可以接受非常量的 needle 参数。#39167Robert Schulze)。
  • 新增设置项 zstd_window_log_max,用于在导入外部文件时配置 zstd 解码的最大内存占用。修复 #35693#37015wuxiaobai24)。
  • 添加 send_logs_source_regexp 设置。发送服务器文本日志时,使用指定的正则表达式匹配日志源名称。留空表示匹配所有来源。#39161 (Amos Bird)。
  • 支持对 Hive 表执行 ALTER 操作。#38214 (lgbo)。
  • 支持 isNullable 函数。该函数用于检查其参数是否可为空,并返回 1 或 0。修复 #38611#38841lokax)。
  • 新增了 base58 编码/解码函数。#38159 (Andrey Zvonov)。
  • 在 Play UI 中添加图表可视化功能。#38197 (Alexey Milovidov)。
  • 为数组和元组新增了 L2 平方距离和范数函数。#38545 (Julian Gilyadov)。
  • 支持通过 SQL 将 HTTP 头传递给 url 表函数 / 表引擎。修复 #37897#38176Kseniia Sumarokova)。
  • clickhouse-diagnostics 二进制文件添加到软件包中。#38647 (Mikhail f. Shiryaev)。

实验性功能

  • 新增设置项 implicit_transaction,用于将单条查询作为一个事务来运行。它会自动处理事务的创建和结束(如果查询成功则执行 COMMIT,如果失败则执行 ROLLBACK)。#38344Raúl Marín)。

性能优化

  • 针对已排序列的 distinct 优化。当输入流按照 distinct 中的列进行排序时,使用专门的 distinct 转换。该优化可应用于前置 distinct、最终 distinct,或同时应用于二者。首个实现由 @dimarub2000 完成。#37803Igor Nikonov)。
  • 通过使用 BinaryHeap 的批处理版本,提升 ORDER BYMergeTree 合并以及窗口函数的性能。#38022Maksim Kita)。
  • 为使用 FINAL 的查询提供了更高的并行执行度 #36396Nikita Taranov)。
  • 修复了在 #35616 中引入的严重 join 性能退化问题。有趣的是,像 ssb 查询这样常见的 join 查询在将近 3 个月里一直慢了 10 倍,却没有人反馈。#38052Amos Bird)。
  • 从 Intel Hyperscan 库迁移到 vectorscan,这在非 x86 平台上能加速大量字符串匹配操作。#38171Robert Schulze)。
  • 提高了聚合之后执行的查询计划各步骤的并行度。 #38295 (Nikita Taranov).
  • 提升向 JSON 类型列插入数据时的性能。 #38320 (Anton Popov).
  • 对 HashTable 的插入和查找进行了优化。#38413 (Nikita Taranov).
  • 修复由 #32493 引起的性能退化问题。#38417Alexey 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 秒钟。#38929Constantine Peresypkin)。
  • 当未选择所有列时,优化对 system.stack_trace 表的访问。#39177 (Azat Khuzhin)。
  • 优化 isNullable/isConstant/isNull/isNotNull 在 LowCardinality 参数上的性能。 #39192 (Kruglov Pavel).
  • 对窗口函数中的 ORDER BY 处理进行了优化。#34632Vladimir Chebotarev)。
  • system.asynchronous_metric_log 在存储空间方面进行了进一步优化,从而解决了 #38134。详见 YouTube 视频#38428Alexey Milovidov)。

改进

  • 支持 SQL 标准的 CREATE INDEX 和 DROP INDEX 语法。 #35166 (Jianmei Zhang).
  • 支持为 INSERT 查询发送 ProfileEvents 事件(此前仅支持 SELECT)。#37391 (Azat Khuzhin).
  • 为完全物化投影实现按顺序聚合(optimize_aggregation_in_order)。#37469 (Azat Khuzhin)。
  • 移除通过子进程执行的 Kerberos 初始化。新增集成测试。关闭 #27651#38105Roman Vasin)。
    • 添加配置项 multiple_joins_try_to_keep_original_names,从而在多重 JOIN 重写时不再重写标识符名称,关闭问题 #34697#38149Vladimir C)。
  • 改进了 trace visualizer 的用户体验。 #38169 (Sergei Trifonov).
  • 在 AArch64 上启用堆栈跟踪采集和查询分析器。 #38181 (Maksim Kita).
  • 在加载 SQL 用户自定义函数时,不再跳过 user_defined 目录下的符号链接。修复了 #38042#38184Maksim Kita)。
  • store/ 中新增了子目录的后台清理功能。在某些情况下,clickhouse-server 可能会在 store/ 中留下无效子目录(例如在建表失败时),而这些目录此前不会被自动删除。修复 #33710#38265Alexander Tokmakov)。
  • 添加 DESCRIBE CACHE 查询,用于显示配置中的缓存设置。添加 SHOW CACHES 查询,以显示可用的文件系统缓存列表。#38279 (Kseniia Sumarokova)。
  • system drop filesystem cache 添加访问权限检查,并支持 ON CLUSTER。#38319 (Kseniia Sumarokova)。
  • 修复从 21.3 升级到 22.3 时出现的 PostgreSQL 数据库引擎不兼容问题,解决了 #36659#38369Kseniia Sumarokova)。
  • filesystemAvailable 等函数现在可以在 clickhouse-local 中使用,从而解决了 #38423#38424Alexey 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#38440chen)。
  • parallel_hash JOIN 方法进行了缺陷修复和性能优化。#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 功能不可用。对 DeleteObjects S3 API 进行自动检测,因为 GCS 不支持该 API。这样就可以在配置中不必显式设置 support_batch_delete=0 也能使用 GCS。#37882Vladimir Chebotarev)。
  • 暴露与 ClickHouse Keeper 相关的基本监控数据(通过 ProfileEvents 和 CurrentMetrics)。 #38072 (lingpeng0314).
  • 为 PostgreSQL 引擎连接添加对 auto_close 选项的支持。修复 #31486#38363Kseniia 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 服务器的元信息持久化到磁盘。#39069Antonio Andelic)。这将使在需要同时关闭或重启所有 keeper 节点时的运维更加简单。
  • 在使用文件系统缓存时,当磁盘空间不足时不再抛出异常,而是继续运行。 #39106 (Kseniia Sumarokova).
  • 处理来自 k8s 的 SIGTERM 信号。 #39130 (Timur Solodovnikov).
  • 在 system.part_log 中新增 merge_algorithm 列(取值:Undecided、Horizontal、Vertical)。#39181 (Azat Khuzhin).
  • 当磁盘为非旋转介质时,不要在 system.errors 中递增计数器。#39216Raúl Marín)。
  • system.query_log 中,针对 INSERT 查询的指标 result_bytes 表示插入的字节数。此前该值不正确,而是存储了与 result_rows 相同的数值。#39225Ilya Yatsishin)。
  • clickhouse-client 中的 CPU 使用率指标将以更直观的方式展示。修复了 #38756#39280Sergei Trifonov)。
  • 在服务器启动过程中初始化文件系统缓存时重新抛出异常,并提供更清晰的错误信息。#39386Kseniia Sumarokova)。
  • OpenTelemetry 现在默认收集 traces 时不会包含 Processors spans(因为数量过多)。要启用 Processors spans 的收集,请通过设置 opentelemetry_trace_processors 来实现。#39170 (Ilya Yatsishin).
  • 函数 multiMatch[Fuzzy](AllIndices/Any/AnyIndex) - 当 needle 参数为空时将不再抛出逻辑错误。#39012 (Robert Schulze).
  • 允许声明不带默认参数 x-max-lengthx-overflowRabbitMQ 队列。#39259 (rnbondarenko)。

构建/测试/打包改进

错误修复(官方稳定版或预发布版本中用户可见的异常行为)

  • 修复 Decimal128/Decimal256 在小数位(scale)超过 19 位时的舍入问题。#38027Igor Nikonov)。
  • 修复了由于 Hive 存储引擎(集成表引擎)中的数据竞争导致的崩溃。#38887 (lgbo)。
  • 修复在执行带有 ON CLUSTER 的 GRANT ALL ON *.* 时发生的崩溃。该问题是在 https://github.com/ClickHouse/ClickHouse/pull/35767 中引入的。此更改关闭了 #38618#38674Vitaly Baranov)。
  • {0..10} 这种形式下正确进行 glob 展开。修复了 #38498。当前实现与 shell 的行为类似,如 @rschu1ze 在这里提到的那样。#38502Heena Bansal)。
  • 修复了在使用常量 map 参数时 mapUpdatemapFilter 函数发生的崩溃问题。关闭 #38547#38553hexiaoting)。
  • 修复用于查询优化的 toHour 单调性信息,该问题可能导致错误的索引分析并产生不正确的查询结果。此修复对应 #38333#38675Amos Bird)。
  • 修复检查 S3 存储是否支持并行写入的逻辑,从而导致的 S3 并行写入无法工作的问题。#38792 (chen).
  • 使用并行读取缓冲区修复 S3 可随机读取(影响了查询期间的内存使用)。关闭 #38258#38802Kseniia Sumarokova)。
  • 更新 simdjson。此更新修复了 #38621 —— 在配备最新、支持 AVX-512 VBMI 的 Intel CPU 的机器上出现的缓冲区溢出问题。#38838Alexey Milovidov)。
  • 修复 Vertical merges 中潜在的逻辑错误。 #38859 (Maksim Kita).
  • 修复设置配置文件中的秒单位。#38896Raúl Marín)。
  • 修复了在分区键为 Nullable 时分区裁剪不正确的问题。注意:你很可能没有在使用 Nullable 分区键——这是一个非常小众的特性,你不应该使用。Nullable 键本身并不合理,这个特性只是为了满足一些极端用例才存在。本次修复了 #38941#38946Amos Bird)。
  • 改进用于拉取操作的 fsync_part_directory#38993 (Azat Khuzhin).
  • 修复 OvercommitTracker 中可能出现的死锁。对应问题 #37794#39030Dmitry Novik)。
  • 修复了文件系统缓存中的一个错误,该错误可能在某些边缘情况下、且恰逢缓存容量达到上限时触发。关闭 #39066#39070Kseniia Sumarokova)。
  • 修复窗口表达式参数解析的一些边缘情况。修复 #38538,允许在窗口表达式中使用高阶函数。#39112 (Dmitry Novik)。
  • tuple 函数中保留 LowCardinality 类型。此前,LowCardinality 类型会被丢弃,新创建的 tuple 中各元素将使用 LowCardinality 的底层类型。#39113Anton Popov)。
  • 修复了在向附加了物化视图的表执行 INSERT 且启用了设置 extremes = 1 时可能出现的 Block structure mismatch 错误。关闭了 #29759#38729#39125Nikolai Kochetov)。
  • 修复在同时将 optimize_trivial_count_queryempty_result_for_aggregation_by_empty_set 设为 true 时出现的意外查询结果。此更改修复了问题 #39140#39155Amos 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#39283Kseniia Sumarokova)。
  • 修复当聚合键被嵌套在其他函数中时的投影异常。此更改修复了 #37151#37155Amos Bird)。
  • 修复某些函数中可能出现的逻辑错误:... with argument with type Nothing and default implementation for Nothing is expected to return result with type Nothing, got ...。关闭:#37610 关闭:#37741#37759Kruglov Pavel)。
  • 修复 UNION 子查询的列顺序不正确问题(当子查询中存在重复列时,可能导致结果不正确)。#37887 (Azat Khuzhin).
  • 修复当列名包含点号时 MODIFY ALTER Column 工作不正确的问题。关闭 #37907#37971Kruglov Pavel)。
  • 修复从将数据存储在 S3 上的 MergeTree 表中读取稀疏列时的问题。#37978 (Anton Popov).
  • 修复在从配置中移除副本时,Distributed 表上的异步插入操作可能发生崩溃的问题。#38029 (Nikolai Kochetov).
  • 修复在对未指定别名的 CTE 执行 GLOBAL JOIN 时出现的 "Missing columns" 错误。#38056Azat Khuzhin)。
  • 在向后兼容模式下,将 tuple 函数重写为元组字面量。#38096 (Anton Kozlov)。
  • 修复在执行 ORDER BY 时为输出数据块进行冗余内存预留的问题。 #38127 (iyupeng).
  • 修复数组映射函数中可能出现的逻辑错误 Bad cast from type DB::IColumn* to DB::ColumnNullable*,并关闭 #38006#38132Kruglov Pavel)。
  • 修复部分合并连接中的临时名称冲突,关闭 #37928#38135Vladimir C)。
  • 修复了针对类似 CREATE TABLE nested_name_tuples (a Tuple(x String, y Tuple(i Int32, j String))) ENGINE = Memory; 的查询的一些小问题 #38136 (lgbo)。
  • 修复了嵌套短路函数中的一个 bug,该 bug 会导致在条件为 false 时仍然执行参数。关闭了 #38040#38173Kruglov Pavel)。
  • (Window View 是一项实验性功能)修复结构不正确的 WINDOW VIEW 导致的 LOGICAL_ERROR。 #38205 (Azat Khuzhin)。
  • 更新 librdkafka 子模块,修复在设置了 OAUTHBEARER 刷新回调时出现的崩溃问题。#38225Rafael 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#38365Kseniia Sumarokova)。
  • 修复 PostgreSQL 引擎在获取数组维度大小时未使用 PostgreSQL 模式(schema)的问题。关闭 #36755。关闭 #36772#38366Kseniia Sumarokova)。
  • 修正包含 DISTINCTLIMIT 的分布式查询可能产生的不正确结果。修复了 #38282#38371Anton Popov)。
  • 修复对包含 0 字节的模式使用 countSubstrings() 和 position() 时产生错误结果的问题。#38589 (Robert Schulze)。
  • 现在可以启动 ClickHouse 服务器,并且即使是 IPv4/IPv6 表示值不正确的表,也可以执行表的 attach/detach 操作。这是对问题 #35156 的妥善修复。#38590 (alesapin)。
  • 当某些参数为 NaN 时,rankCorr 函数现在也能正确工作。这修复了 #38396#38722Alexey Milovidov)。
  • 修复 parallel_view_processing=1optimize_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。#37765Yakov Olkhovskiy)。
  • 更改对类型为 seconds 的设置项的解析方式,以支持浮点数值(例如:max_execution_time=0.5)。Infinity 或 NaN 值将抛出异常。#37187Raúl Marín)。
  • 更改实验性类型 Object 列的二进制序列化格式。新格式更便于第三方客户端实现。#37482Anton Popov)。
  • 默认开启设置 output_format_json_named_tuples_as_objects。这允许在 JSON 格式中将具名元组序列化为 JSON 对象。#37756Anton Popov)。
  • 现在不再允许使用以转义字符('\')结尾的 LIKE 模式串(符合 SQL 标准要求)。#37764Robert Schulze)。
  • 如果你在具有 AArch64 CPU 的集群上运行不同版本的 ClickHouse,或者在一个集群中混用 AArch64 和 amd64,并且在使用分布式查询、对多个定长类型键进行 GROUP BY 时,这些键可以容纳在 256 位中但不能容纳在 64 位中,而且查询结果集非常大,那么在升级期间,这些查询的结果数据将不会被完全聚合。变通方案:使用停机升级,而不是滚动升级。

新功能

  • 添加 GROUPING 函数,用于在包含 ROLLUPCUBEGROUPING SETS 的查询中对记录进行消歧。修复 #19426#37163 (Dmitry Novik)。
  • 用于浮点数据压缩的全新编解码算法 FPC#37553 (Mikhail Guzov)。
  • 新增以下列式 JSON 格式:JSONColumnsJSONCompactColumnsJSONColumnsWithMetadata。关闭 #36338#34509#36975Kruglov Pavel)。
  • 添加了一个基于 D3.js 的 OpenTelemetry Trace 可视化工具。#37810 (Sergei Trifonov)。
  • 新增对向 system.zookeeper 表执行 INSERT 的支持。关闭 #22130#37596Han Fei)。
  • 支持 LIKEILIKEmatch 函数使用非常量模式参数。 #37251 (Robert Schulze).
  • 可执行用户自定义函数现在支持参数。例如:SELECT test_function(parameters)(arguments)。修复了 #37578#37720Maksim Kita)。
  • system.part_log 表添加 merge_reason 列。 #36912 (Sema Checherinda)。
  • 为 Avro 格式添加对 Map 和 Record 类型的支持。新增设置 input_format_avro_null_as_default,允许在 Avro 格式中将 null 作为默认值插入。关闭 #18925#37378#32899#37525Kruglov Pavel)。
  • 添加 clickhouse-disks 工具,用于检查和操作为 ClickHouse 配置的虚拟文件系统。#36060Artyom Yurkov)。
  • 添加 H3 单向边函数。#36843Bharat 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 格式文件中跳过开头指定数量的行。#37537Kruglov Pavel)。
  • showCertificate 函数用于显示当前服务器的 SSL 证书。#37540 (Yakov Olkhovskiy)。
  • Named Collections 中的 Data Dictionaries 现已支持 HTTP 源。#37581Yakov Olkhovskiy)。
  • 新增窗口函数 nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL x SECOND])#37628 (Andrey Zvonov).
  • 实现了修改 ReplicatedMergeTree 表注释的功能。#37416Vasily Nemkov)。
  • 新增了 SYSTEM UNFREEZE 查询,可删除整个备份,而不管相应的表是否已被删除。#36424 (Vadim Volodin).

实验性功能

  • WINDOW VIEW 启用 POPULATE#36945 (vxider).
  • 添加对 WINDOW VIEWALTER TABLE ... MODIFY QUERY 的支持。 #37188 (vxider).
  • 此 PR 更改了 WINDOW VIEWENGINE 语法的行为,使其与 MATERIALIZED VIEW 中的行为一致。 #37214 (vxider).

性能优化

  • 为 ARM NEON 添加了多项优化 #38093Daniel KuteninAlexandra 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).
  • 提升 dictGetDescendantsdictGetChildren 函数的性能:在查询期间按查询创建一次临时父子层级索引,而不是在查询过程中为每次函数调用都创建。允许为 HIERARHICAL 属性指定 BIDIRECTIONAL,字典会在内存中维护父到子的索引,这样 dictGetDescendantsdictGetChildren 函数在每个查询时就不需要再创建临时索引。修复并关闭 #32481#37148Maksim 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 组合时的性能。#37481Maksim Kita)。
  • 使用动态分派基础设施改进 hasAll 函数的性能。#37484 (Maksim Kita)。
  • 提升 greatCircleAnglegreatCircleDistancegeoDistance 函数的性能。#37524 (Maksim Kita)。
  • ORDER BY 包含多列时,提高向 MergeTree 插入数据的性能。#35762Maksim Kita)。
  • 修复在表很多时后台 CPU 过高占用的问题。#38028Maksim Kita)。
  • 使用动态分派优化 not 函数的性能。#38058 (Maksim Kita)。
  • 对 re2 模式的内部缓存进行了优化,这些模式会出现在 LIKE 和 MATCH 等函数中。#37544Robert Schulze)。
  • 使用 AVX-512 指令改进并统一过滤位掩码生成函数的实现。 #37588 (yaqi-zhao).
  • 为 Hive 集成引擎启用 threadpool 读取方式。这将显著加快读取速度。#36328李扬)。
  • 当要读取的所有列均为分区键时,通过文件的行号构造列,无需实际读取 Hive 文件。#37103 (lgbo)。
  • 支持为 Hive 文件缓存使用多个磁盘。 #37279 (lgbo).
  • 对每个查询设置最大缓存使用上限,可以有效防止缓存池被污染。相关 Issue#37859Han Shukai)。
  • 目前,ClickHouse 会将所有远程文件直接下载到本地缓存(即使只读取一次),这会频繁触发本地磁盘的 I/O。在某些场景下,这些 I/O 可能并非必要,且容易导致负向优化。如下图所示,当我们运行 SSB Q1–Q4 时,缓存机制的表现已经造成了负向优化。#37516Han Shukai)。
  • 允许在从 S3 读取数据时,通过 _file_path 等虚拟列对文件列表进行筛选。对应 #37174#23494#37356Amos Bird)。
  • 在函数 CompressedWriteBuffer::nextImpl() 中,在插入数据时会频繁执行一个不必要的写入拷贝步骤。下面展示了应用此补丁前后的差异: - 之前: 1. 将 "working_buffer" 压缩到 "compressed_buffer" 2. 写入拷贝到 "out" - 之后: 直接将 "working_buffer" 压缩到 "out"。

改进

  • 在 ROLLUP、CUBE 和 GROUPING SETS 中支持具有非标准默认值的类型。修复了 #37360#37667Dmitry Novik)。
  • 修复 ARM 架构上的堆栈跟踪采集。关闭 #37044。关闭 #15638#37797Maksim Kita)。
  • 客户端会依次尝试 DNS 解析得到的每个 IP 地址,直到成功建立连接为止。#37273 (Yakov Olkhovskiy).
  • 允许在 Arrow/Parquet/ORC 格式中使用 String 类型而非 Binary 类型。此 PR 为此引入了 3 个新设置项:output_format_arrow_string_as_stringoutput_format_parquet_string_as_stringoutput_format_orc_string_as_string。所有这些设置的默认值均为 false#37327Kruglov 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#36953Nikita 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#37048Kruglov 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 #37415Memo)。
  • 修复在零拷贝复制中拉取数据分片(part)时极其罕见的死锁问题。修复 #37423#37424metahys)。
  • 禁止创建使用未知数据格式的存储。#37450 (Kruglov Pavel).
  • global_memory_usage_overcommit_max_wait_microseconds 的默认值设置为 5 秒。在 OOM 异常信息中添加 OvercommitTracker 的相关信息。新增 MemoryOvercommitWaitTimeMicroseconds profile 事件。#37460Dmitry Novik)。
  • 在 clickhouse-client 中不再显示 -0.0 CPU 时间。该现象可能是由舍入误差导致的。由此关闭了 #38003。由此关闭了 #38038#38064Alexey Milovidov)。
  • Play UI:当页面水平滚动时保持控件位置不变。即使表格很宽并且已经向右滚动很远,也能让编辑更加方便。该特性由 CaspianDB 的 Maksym Tereshchenko 提出。#37470Alexey 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}PartsMergedInto{Wide/Compact/InMemory}Parts)。在 system.part_log 中新增 part_type 列。解决了 #37495#37536Anton Popov)。
  • clickhouse-keeper 改进:将损坏的日志文件移动到带时间戳的文件夹中。#37565 (Antonio Andelic).
  • 在后续合并中不再写入 TTL 已过期的列(此前只有对该数据片段的首次 merge/optimize 不会写入 TTL 已过期的列,之后的所有操作都会写入)。 #37570 (Azat Khuzhin).
  • 当存在 LowCardinality 或 Sparse 列时,dumpColumnStructure 杂项函数的结果现在更加精确。在之前的版本中,该函数会在返回结果前将参数转换为完整列。此更改是为了解答 #6935 中的问题所必需的。#37633Alexey 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 中增加一个选项,用于禁用连接池功能。#37705Anton Kozlov)。
  • 函数 dictGetHierarchydictIsIndictGetChildrendictGetDescendants 新增了对字典中可为空(nullable)的 HIERARCHICAL 属性的支持。修复了 #35521#37805Maksim Kita)。
  • system.build_options 表中公开 BoringSSL 版本相关信息。#37850Bharat Nallan)。
  • 现在,clickhouse-server 在服务器启动时会删除 delete_tmp 目录。修复了 #26503#37906alesapin)。
  • 在超时后清理损坏的已分离数据部分。修复 #25195#37975Kseniia 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#38017Vitaly Baranov)。

构建 / 测试 / 打包改进

  • 在构建中使用 clang-14 和 LLVM 基础设施版本 14。解决了 #34681#34754Alexey Milovidov)。注意:clang-14 在 ThreadSanitizer 中存在一个 bug,会降低我们的 CI 效率。
  • 允许在启动时放弃特权(降权)。这简化了 Docker 镜像。解决了 #36293#36341Alexey Milovidov)。
  • 在 CI 中新增文档拼写检查。#37790Vladimir C)。
  • 修复过于激进的 strip 过程导致移除了用于检查可执行文件一致性的嵌入哈希的问题。#37993Robert Schulze)。

Bug 修复

  • 修复包含常量字符串类型的 SELECT ... INTERSECTEXCEPT SELECT 语句。#37738 (Antonio Andelic)。
  • 修复在对具有 AggregateFunction 类型的列执行 GROUP BY 时的问题。 #37093 (Azat Khuzhin).
  • (实验性 WINDOW VIEW)修复 WindowView 中的 addDependency。该问题可按 #37237 的方式复现。#37224vxider)。
  • 修复 ORDER BY ... WITH FILL 功能中的不一致行为。包含 ORDER BY ... WITH FILL 的查询在存在多个 WITH FILL 列时可能会生成多余的行。#38074Yakov Olkhovskiy)。
  • 此 PR 将 addDependency 从构造函数移动到 startup(),以避免向已删除的表添加依赖关系,从而修复 #37237#37243vxider)。
  • 修复在列式格式中为缺失值插入默认值的方式。此前,缺失列会使用类型的默认值填充,而不是使用列的默认值。#37253Kruglov Pavel)。
  • (实验性 Object 类型)修复了某些将嵌套数组插入到 Object 类型列时的问题。#37305 (Anton Popov)。
  • 修复在聚合函数、prewherejoin 中由常量字符串冲突引起的意外错误。关闭 #36891#37336Vladimir C)。
  • 修复在查询中使用 GROUP/ORDER BY 时的 projection 以及 optimize_aggregation_in_order 的问题(此前由于仅在最终阶段执行排序,导致结果不正确)。 #37342 (Azat Khuzhin).
  • 修复了在 S3 中键名包含特殊符号时出现的错误。修复了 #33009#37344Vladimir Chebotarev)。
  • 当 GROUPING SETS 与 ROLLUP 或 CUBE 一起使用时抛出异常。 #37367 (Dmitry Novik).
  • 修复在合并过程中 getMaxSourcePartsSizeForMerge 中出现的 LOGICAL_ERROR(当在 config.xml(新的方式)中而不是在已弃用的 users.xml 中配置了非标准且更大的 background_pool_size / background_merges_mutations_concurrency_ratio 值时)。#37413Azat Khuzhin)。
  • 不再在 RowBinary 格式中删除 UTF-8 BOM。 #37428 (Paul Loyd). #37428 (Paul Loyd).
  • clickhouse-keeper 缺陷修复:修复单节点集群的强制恢复。#37440 (Antonio Andelic).
  • 修正 normalizeUTF8 函数中的逻辑错误,关闭 #37298#37443Maksim Kita)。
  • 修复 JoinSwitcher 中对 Nullable 的 LowCardinality 类型转换问题,关闭 #37385#37453Vladimir C)。
  • 修复 ORC/Arrow/Parquet 格式中命名元组的输出。#37458Kruglov Pavel)。
  • 修复在包含 GROUPING SETS 的情况下对 ORDER BY 子句中单调函数的优化。修复了 #37401#37493Dmitry Novik)。
  • 修复在特定条件下使用字典进行 JOIN 时出现的错误。关闭 #37386#37530Vladimir C)。
  • 禁止在使用 GROUPING SETS 时启用 optimize_aggregation_in_order(修复 LOGICAL_ERROR 错误)。 #37542 (Azat Khuzhin).
  • 修复 ActionsDAG 错误的转储信息。#37587zhanglistar)。
  • 修复 UNION 查询中的类型转换问题(此前可能会触发 LOGICAL_ERROR)。 #37593 (Azat Khuzhin).
  • 修复在 STEP 子句中使用负区间时的 WITH FILL 修饰符。修复了问题 #37514#37600Anton Popov)。
  • 修复在 join_use_nulls = 1 时非法使用 joinGet 数组的问题。修复了 #37562#37650Amos Bird)。
  • 修复 CROSS JOIN 中列数不匹配的问题,关闭 #37561#37653Vladimir C)。
  • 修复在配置了命名集合(named collections)的 MySQL 数据库上执行 show create table 时发生的段错误。关闭 #37683#37690Kseniia Sumarokova)。
  • 修复了在创建 RabbitMQ 存储时未使用 SETTINGS 子句的情况下,服务器重启后该存储无法启动的问题。关闭 #37463#37691Kseniia Sumarokova)。
  • SQL 用户自定义函数在只读模式下禁止执行 CREATE/DROP 操作。修复了 #37280#37699Maksim Kita)。
  • 修正可执行用户自定义函数中 Nullable 参数的格式处理。关闭 #35897#37711Maksim Kita)。
  • 修复了在分布式查询中通过设置 optimize_monotonous_functions_in_order_by 启用的优化问题。修复了 #36037#37724Anton Popov)。
  • 修复 values 表函数中可能出现的逻辑错误:Invalid Field get from type UInt64 to type Float64。已关闭 #37602#37754Kruglov Pavel)。
  • 修复在 SchemaReader 构造函数抛出异常时,模式推断中可能发生的段错误(segfault)。关闭 #37680#37760Kruglov Pavel)。
  • 修复内部 cast 函数对 cast_ipv4_ipv6_default_on_conversion_error 设置的处理。关闭 #35156#37761Maksim Kita)。
  • 修复 DatatypeDate32 中的 toString 错误。#37775 (LiuNeng)。
  • clickhouse-keeper 设置 dead_session_check_period_ms 被转换为微秒(乘以 1000),导致死会话要在几分钟后才会被清理(而不是 500ms 之后)。#37824Michael 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#37915James Maidment)。
  • 修复了 Dictionaries 在自定义查询的更新字段中使用 {condition} 时的问题。关闭 #33746#37947Maksim Kita)。
  • 修复在需要在 WITH FILL 结果之后再应用 ORDER BY 的情况下(例如在外层查询中)执行 SELECT ... WITH FILL 可能产生错误结果的问题。错误结果是由针对 ORDER BY 表达式的优化引起的(#35623)。关闭 #37904#37959Yakov Olkhovskiy)。
  • (实验性 WINDOW VIEW)在 WindowView 中向目标表写入数据时补全缺失的默认列,修复 #37815#37965vxider)。
  • 修复了因为栈帧过大而导致的编译失败问题。 #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李扬)。
  • 修复了指数时间衰减窗口函数的问题,现已正确遵守窗口边界。#36944Vladimir Chebotarev)。
  • 修复在读取 system.projection_parts 和 system.projection_parts_columns 时可能出现的 heap-use-after-free 错误。此更改修复了 #37184#37185Amos Bird)。
  • 修复了 Unix 纪元之前 DateTime64 小数秒的处理行为。 #37697 (Andrey Zvonov). #37039 (李扬).

ClickHouse 发行版 22.5,2022-05-19

升级说明

  • 现在,后台合并、变更(mutations)以及 OPTIMIZE 将不再增加 SelectedRowsSelectedBytes 指标。它们(仍然)会像之前一样增加 MergedRowsMergedUncompressedBytes。这只会影响指标值,并使其更合理。此更改不会引入任何不兼容性,但你可能会对指标变化感到疑惑,因此我们将其归类在本节中。#37040Nikolai Kochetov)。
  • 将 BoringSSL 模块更新为官方符合 FIPS 要求的版本。这使得 ClickHouse 符合 FIPS 规范。#35914Meena-Renganathan)。由于 aes-192-cfb128aes-256-cfb128 密码套件未包含在通过 FIPS 认证的 BoringSSL 版本中,因此已被移除。
  • users.xml 中的默认用户配置文件中移除了 max_memory_usage 设置。这为查询提供了灵活的内存限制,而不是之前固定的 10 GB 上限。
  • 默认禁用 log_query_threads 设置。它控制是否记录参与查询执行的每个线程的统计信息。在支持异步读取之后,不同线程 ID 的总数量变得过大,对 query_thread_log 的记录开销变得过大。#37077Alexey Milovidov)。
  • 移除了存在缺陷的函数 groupArraySorted#36822Alexey Milovidov)。

新特性

  • 默认启用内存超额分配(overcommit)。#35921 (Dmitry Novik).
  • GROUP BY 子句中添加对 GROUPING SETS 的支持。本实现支持对 grouping sets 的并行处理。#33631 (Dmitry Novik).
  • 新增 system.certificates 表。#37142 (Yakov Olkhovskiy).
  • 新增 h3Lineh3Distanceh3HexRing 函数。#37030 (Bharat Nallan).
  • 新增单一二进制诊断工具 clickhouse-diagnostics#36705 (Dale McDiarmid).
  • 新增输出格式 Prometheus#36051#36206 (Vladimir C).
  • 新增 MySQLDump 输入格式。它会从 dump 中属于同一张表的所有 INSERT 查询中读取数据。如果存在多张表,默认只从第一张表读取数据。#36667 (Kruglov Pavel).
  • system.tables 中为临时表显示 total_rowstotal_bytes 字段。#36401#36439 (xiedeyantu).
  • 允许通过查询级别设置覆盖 parts_to_delay_insertparts_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 表达式时,提高 avgsum 聚合函数的性能。#37257 (Maksim Kita)。
  • 通过动态分派提高一元算术函数(bitCountbitNotabsintExp2intExp10negateroundAgeroundDurationroundToExp2sign)的性能。#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)。

改进

  • 在执行表函数 files3url 时,如发生解析错误,将显示出错的文件名。#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 中提出的问题。将其标记为“改进”,是因为这是实现定义的行为(且是极少见的情况),我们可以对其进行不兼容变更。#36656Amos Bird)。
  • 如果有人使用日志级别 "test" 运行 clickhouse-server,则添加一个警告。日志级别 "test" 是最近新增的,由于会导致不可避免、无法规避、致命且严重威胁系统稳定性的性能下降,不能在生产环境中使用。#36824 (Alexey Milovidov)。
  • 在 CREATE TABLE 中解析排序规则,抛出异常或忽略。修复 #35892 问题。#36271yuuch)。
  • 选项 compatibility_ignore_auto_increment_in_create_table 允许在列定义中忽略 AUTO_INCREMENT 关键字,以简化从 MySQL 迁移。#37178Igor Nikonov)。
  • JSONEachRow 添加别名 JSONLinesNDJSON。关闭 #36303#36327flynn)。
  • 限制每个 Hive 表可查询的最大分区数,以避免资源过载。#37281 (lgbo)。
  • h3kRing 函数的第二个参数添加了隐式类型转换,以提高易用性。解决了 #35432#37189Maksim Kita)。
  • 修复 clickhouse-local 中针对任意查询的 INSERT SELECT 进度显示,以及客户端中文件进度的显示,使文件进度更加准确。 #37075 (Kseniia Sumarokova).
  • 修复了一个错误:在删除数据部件时如果发生文件系统故障,可能导致 MergeTree 表引擎系列中已过期的部件被遗留未删除。在修复之前,这些部件只会在首次服务器重启后才会被删除。 #37014 (alesapin).
  • 实现了一种新的行策略处理模式,可在主配置中启用,从而允许未配置宽松行策略的用户读取数据行。#36997 (Vitaly Baranov)。
  • Play UI:可为空值的数值将在表格单元格中右对齐。此更改修复了 #36982#36988Alexey Milovidov)。
  • Play UI:如果结果中只有一行且列数较多时,则以纵向方式展示结果。延续 #36811#36842Alexey Milovidov)。
  • 清理了 Play UI 中的 CSS,使像素分布更加均匀,并提升了表格单元格中长内容的使用体验。#36569 (Alexey Milovidov).
  • 在发生异常时提前完成写入缓冲区的收尾工作,以避免在析构函数中执行该操作。希望能修复:#36907#36979Kruglov 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. 的异常。此问题已修复。#36917Nikita 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#36572Alexey Milovidov)。
  • 在 clickhouse-local 中运行时,允许在表函数 file 中使用文件描述符。 #36562 (wuxiaobai24).
  • 允许元组元素的名称以数字开头。#36544Anton Popov)。
  • 现在,clickhouse-benchmark 可以从环境变量中读取身份验证信息。#36497Anton Kozlov)。
  • clickhouse-keeper 改进:新增对强制恢复(force recovery)的支持,允许在没有 quorum 的情况下重新配置集群。#36258Antonio Andelic)。
  • 改进 JSON 对象的模式推断。#36207 (Kruglov Pavel).
  • 重构了基于 glob 的 schema 推断相关代码。仅在确有必要时才从 glob 中尝试下一个文件(此前是只要出现任何错误就会尝试下一个文件)。同时修复了 #36317#36205Kruglov 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#34916Roman Nikonov)。
  • 在使用 clickhouse-client --file 但未事先指定 --external 时发出适当的警告。关闭 #34747#34765李扬)。
  • 改进 MySQL 数据库引擎,使其兼容 binary(0) 数据类型。 #37232 (zzsmdfj)。
  • 改进 clickhouse-benchmark 生成的 JSON 报告。 #36473 (Tian Xinhui).
  • 如果无法解析外部 ClickHouse 字典的主机名,服务器可能会拒绝启动。该问题已修复,修复了 #36451#36463tavplubix)。

构建 / 测试 / 打包改进

  • 现在 x86_64 架构的 clickhouse-keeper 使用 musl 进行静态链接构建,不再依赖任何系统库。#31833Alexey Milovidov)。
  • 现在可以通过通用安装脚本 curl https://clickhouse.com/ | sh,以及直接链接 https://builds.clickhouse.com/master/powerpc64le/clickhouse 获取适用于 PowerPC64LE 架构的 ClickHouse 构建。#37095Alexey Milovidov)。
  • 将 PowerPC 代码生成限制为 Power8,以获得更好的兼容性。这解决了 #36025#36529Alexey Milovidov)。
  • 简化性能测试,以便我们能够真正使用它。#36769Alexey Milovidov)。
  • 如果报告中存在错误,则让性能对比失败。#34797Mikhail f. Shiryaev)。
  • 为 Arrow 添加 ZSTD 支持。这修复了 #35283#35486Sean 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#37270Kruglov Pavel)。
  • 实验性功能:修复在包含 Object 类型列的表中执行变更操作(mutations)时的行为。现在允许在 UPDATEDELETE 查询的 WHERE 表达式中使用 Object 类型的子列,也允许对单独子列执行(DROPMODIFY)操作。修复了 #37205#37266Anton 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#37228Mark 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#37166Vladimir 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#37047tavplubix)。
  • 实验性特性:修复在有序 GROUP BYoptimize_aggregation_in_order=1)下使用 *ArraygroupArrayArray/...)聚合函数的问题。#37046Azat Khuzhin)。
  • 修复了当索引类型不是 UInt8 时 LowCardinality->ArrowDictionary 生成的无效输出(关闭 #36832)。#37043Kruglov Pavel)。
  • 修复了 quantileTDigest 中处理无穷大值(inf)的问题。修复了 #32107#37021Vladimir Chebotarev)。
  • 修复在 HedgedConnections 中,当 max_parallel_replicas != 1 时发送外部表数据的问题。 #36981 (Kruglov Pavel).
  • 修复了在 Replicated 数据库中执行 TRUNCATE 查询时的逻辑错误,解决了 #33747#36976tavplubix)。
  • 实验性功能:修复在 WindowView 中删除源表时出现卡死的问题。关闭 #35678#36967vxider)。
  • 实验功能(RocksDB 缓存):修复问题:#36671#36929李扬)。
  • 实验特性:通过添加转换操作,修复在 WindowView 中使用多列时的 bug,使得可以在模式略有差异时调用 writeIntoWindowView#36928vxider)。
  • 修复 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 列在服务器重启后可能会被自动展开。#36803Anton Popov)。
  • 修复了在异步从远程文件系统读取 LowCardinality 数据时出现的一些问题。 #36763 (Kseniia Sumarokova).
  • 实验性功能:修复了从多个文件向 Object 类型列插入数据的问题,例如通过带通配符(glob)的表函数 file#36762 (Anton Popov)。
  • 修复 Hedged 请求中的超时问题。连接在发送远程查询后就挂起,可能会导致无限期等待。 #36749 (Kruglov Pavel).
  • 实验性功能:修复了分布式表上 groupBitmapAndState/groupBitmapOrState/groupBitmapXorState 的一个缺陷。#36739 (Zhang Yifan).
  • 实验性特性:在 PR测试过程中,我发现某个 cache 类被初始化了两次,从而抛出异常。虽然目前还不清楚问题的根本原因,但 ClickHouse 中应该存在重复加载磁盘的逻辑,因此我们需要针对这种情况做特殊处理。#36737Han Shukai)。
  • 修复宽数据分片中的纵向合并问题。此前在合并过程中可能会抛出异常 There is no column#36707 (Anton Popov).
  • 在端口变更时修复服务器重新加载行为(不再等待查询上下文中的现有连接)。#36700Azat Khuzhin)。
  • 实验性特性:在之前的 PR 中,我发现测试(stateless tests、flaky check(address, actions))会发生超时。此外,在本地运行测试时也可能触发偶发的系统死锁。在使用 master 分支的最新源码时,该问题仍然存在。#36697Han Shukai)。
  • 实验性功能:修复在更改缓存配置后服务器无法重启的问题。#36685 (Kseniia Sumarokova)。
  • 修复模式推断中可能出现的 heap-use-after-free 问题。解决 #36661#36679Kruglov Pavel)。
  • 修复了在 CREATE 查询中未指定引擎时对查询设置的解析问题。修复了 https://github.com/ClickHouse/ClickHouse/pull/34187#issuecomment-1103812419#36642tavplubix)。
  • 实验性特性:修复合并包含 Object 类型的宽数据部分的问题。#36637Anton Popov)。
  • 修复在默认表达式跟在 EPHEMERAL 而非字面量之后时出现的格式化崩溃。关闭 #36618#36633flynn)。
  • 修复在 ENGINE = MergeTree 表上使用 INTERPOLATE 时可能出现的 Missing column 异常。#36549 (Yakov Olkhovskiy)。
  • 修复在 JOIN 查询的 WHERE 子句中使用字面量时的潜在错误。关闭 #36279#36542Vladimir C)。
  • 修复 ReadBufferFromEncryptedFile 中的偏移量更新问题,该问题可能导致未定义行为。 #36493 (Kseniia Sumarokova).
  • 修复 Keeper 集群配置中的主机名合理性检查。新增 keeper_server.host_checks_enabled 配置项,用于启用或禁用这些检查。#36492Antonio Andelic)。
  • 修复了在 GROUP BY 中使用可执行用户自定义函数的问题。此前,可执行用户自定义函数无法作为 GROUP BY 子句中的表达式使用。修复 #36448#36486Maksim Kita)。
  • 修复客户端在处理来自服务器的未知数据包时可能发生的异常。 #36481 (Kseniia Sumarokova).
  • 实验性功能(请务必不要使用 system.session_log,该表即将被移除):在 system.session_log 表中补充缺失的枚举值。修复 #36474#36480Memo)。
  • 修复了 s3Cluster 表结构推断中的一个错误,该错误导致通过 s3Cluster 执行 SELECT 查询时未能读取全部数据。此错误是在 https://github.com/ClickHouse/ClickHouse/pull/35544 中引入的。 #36434 (Kruglov Pavel)。
  • 修复 JOIN 和 COLUMNS 匹配器中的 nullptr 解引用问题。修复了 #36416。对应的合并请求为 https://github.com/ClickHouse/ClickHouse/pull/36417#36430Amos Bird)。
  • 修复当 ClickHouseDictionarySource 包含标量子查询时的字典重新加载问题。 #36390 (lthaooo).
  • 修复 JOIN 中的断言问题,关闭 #36199#36201Vladimir C)。
  • 在特殊运算符中包含别名的查询会返回解析错误(这是在 22.1 版本中引入的问题)。示例:SELECT substring('test' AS t, 1, 1)#36167Maksim Kita)。
  • 实验性功能:修复将包含嵌套数组的复杂 JSON 数据插入到 Object 类型列时的问题。 #36077 (Anton Popov)。
  • 修复在存在 compact 部件的情况下对嵌套列执行 ALTER DROP COLUMN 的问题(即在存在列 n.d 时执行 ALTER TABLE x DROP COLUMN n 的情况)。#35797 (Azat Khuzhin).
  • 修复在 offsetlength 为负常量且 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#35349Yakov Olkhovskiy)。
  • 在处理器级别进行性能分析(启用 log_processors_profiles 设置后,ClickHouse 会将各处理器在执行/等待数据期间消耗的时间写入 system.processors_profile_log 表)。#34355 (Azat Khuzhin).
  • 新增函数 makeDate(year, month, day)、makeDate32(year, month, day)。#35628Alexander Gololobov)。实现了 makeDateTime() 和 makeDateTime64() 函数。#35934Alexander 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).
  • 新增函数 arrayFirstOrNullarrayLastOrNull。修复 #35238#35414Maksim Kita)。
  • 新增函数 minSampleSizeContinousminSampleSizeConversion。作者 achimbab#35360Maksim Kita)。
  • 新增了 minSampleSizeContinous 和 minSampleSizeConversion 两个函数。#34354 (achimbab).
  • 引入格式 ProtobufList(在输出 Protobuf 中将所有记录表示为 repeated 消息)。修复并关闭 #16436#35152Nikolai Kochetov)。
  • 添加 h3PointDistMh3PointDistKmh3PointDistRadsh3GetRes0Indexesh3GetPentagonIndexes 函数。#34568Bharat Nallan)。
  • 添加 toLastDayOfMonth 函数,用于将日期或日期时间值向上取整到所在月份的最后一天。#33501#34394Habibullah Oladepo)。
  • 为 [Zoo]Keeper 客户端新增了负载均衡设置。修复了 #29617#30325 (小路)。
  • 添加一种名为 simple 的新类型的行策略。在此 PR 之前,我们有两种行策略类型:permissiverestrictivesimple 行策略只是在表上添加一个新的过滤条件,不会像 permissiverestrictive 策略那样产生任何副作用。#35345Vitaly 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 的一部分。#24258tavplubix)。
  • JSONEachRow 格式下支持对 Object 类型的模式推断。允许将 Map 类型的列转换为 Object 类型的列。#35629Anton 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 等)。#35475Kseniia 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 BYLIMIT 之后才被计算,这可以带来约 20 倍的加速。#35623Nikita Taranov)。
  • 现在会收集聚合过程中使用的哈希表大小,并在后续查询中利用这些信息来避免哈希表调整大小。#33439Nikita Taranov)。
  • 使用 SIMD 指令(SSE 和 AVX2)改进 hasAll 函数。#27653youennL-cs)。#35723Maksim Kita)。
  • 多项变更以提升 ASOF JOIN 的性能(提升 1.2–1.6 倍)。同时新增对使用大整数的支持。#34733Raúl Marín)。
  • 当键为原生整数类型时提升 ASOF JOIN 的性能。#35525Maksim Kita)。
  • 实现对 S3 存储的分段上传并行化。#35343Sergei Trifonov)。
  • 如果端点支持 HTTP Range,URL 存储引擎现在会并行下载多个数据块。新增两个设置:max_download_threadsmax_download_buffer_size,分别用于控制单个查询可以用来下载文件的最大线程数,以及每个线程可以处理的最大字节数。#35150Antonio Andelic)。
  • 使用多个线程从 S3 下载对象。下载行为可以通过 max_download_threadsmax_download_buffer_size 设置进行控制。#35571Antonio Andelic)。
  • 与 HDFS 交互时缩小互斥锁的作用范围。相关 issue 见 #35292#35646shuchaome)。
  • 仅在表级 TTL 发生变更时才需要执行 mutation。#35953Azat 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 推断问题。#35582Kruglov Pavel)。
  • 为格式 JSONAsObject 添加并行解析和模式推断。 #35592 (Anton Popov).
  • s3Cluster 表函数添加了对自动模式推断的支持,并同步了 s3s3Cluster 的函数签名。 #35544 (Nikita Mikhaylov)。
  • hdfsCluster 添加了 schema 推断支持。#35602 (Nikita Mikhaylov)。
  • 新增设置 input_format_json_read_bools_as_numbers,允许在 JSON 输入格式中将布尔值推断并解析为数字。该设置默认启用。由 @alexey-milovidov 提出。#35735Kruglov Pavel)。
  • 改进对 TSKV 和 JSONEachRow 格式进行模式推断时的列顺序,修复 #35640。在对 TSKV 和 JSONEachRow 格式进行模式推断时,读取到空行时不要停止模式推断。#35724 (Kruglov Pavel)。
  • 新增设置 input_format_orc_case_insensitive_column_matchinginput_format_arrow_case_insensitive_column_matchinginput_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 可以大于该机器的物理核心数量。#35926alesapin)。
  • 添加了一些基本指标用于监控使用 engine=Kafka 的表。#35916 (filimonov)。
  • 现在,不再允许对 MergeTree 系列引擎中不存在的设置执行 ALTER TABLE ... RESET SETTING。修复了 #35816#35884alesapin)。
  • 现在,部分针对 ArrayNullable 类型的 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#35760Kruglov Pavel)。
  • 在 Hive 表中遵循 remote_url_allow_hosts 配置。 #35743 (李扬).
  • 在 clickhouse-local 中实现 send_logs_level。关闭了 #35653#35716Kseniia Sumarokova)。
  • 关闭 #35641:允许在没有显式默认表达式的情况下使用 EPHEMERAL 列。 #35706 (Yakov Olkhovskiy)。
  • 添加 profile 事件计数器 AsyncInsertBytes,用于统计异步 INSERT 的数据大小。 #35644 (Alexey Milovidov).
  • 改进 JOIN 的流水线描述。#35612 (何李夫).
  • 推导出 HDFS 配置的绝对路径。 #35572 (李扬).
  • 改进 clickhouse-client 的粘贴性能和兼容性。这有助于解决 #35501#35541Amos Bird)。
  • 在解析嵌套层级非常深的数据类型时,如果设置项 async_socket_for_remoteuse_hedged_requests 中的任意一个被启用(至少在调试构建中),分布式查询中可能会发生栈溢出。修复了 #35509#35524Kruglov 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#35403Kseniia Sumarokova)。
  • 对于表函数 s3clusterHDFSClusterhive,我们无法通过 StorageFactory::instance().getSourceAccessType(getStorageTypeName()) 获取正确的 AccessType。此 PR 修复了该问题。#35365 (李扬)。
  • 移除 clickhouse-client 的 --testmode 选项,并始终启用该模式。#35354 (Kseniia Sumarokova).
  • 不允许为 clickhouse-keeper 执行 wchc 操作(四字命令)。#35320 (zhangyuli1).
  • 添加函数 getTypeSerializationStreams。对于指定的类型(从列中检测出),它返回一个包含所有序列化子流路径的数组。此函数主要供开发者使用。#35290李扬)。
  • 如果在集群配置中未指定 port,将使用默认服务器端口。这修复了 #34769#34772Alexey Milovidov)。
  • 在 Hive 引擎中对 ORC/Parquet 文件使用 minmax 索引。相关 PR:https://github.com/ClickHouse/arrow/pull/10#34631李扬)。
  • 系统日志表现在允许在 ENGINE 声明中指定 COMMENT。修复了问题 #33768#34536Maksim 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 中添加符号剥离(待办:使用 prefix/lib/prefix/lib/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:headclickhouse/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_errorinput_format_ipv6_default_on_conversion_error,从而允许在插入数据时将无效的 IP 地址值按默认值写入表中。关闭了 #35726#35733Maksim Kita)。
  • 在从 Hive 读取数据时,避免因列不存在而从数据块中删除该列。#35393 (lgbo).
  • 在创建物化视图时增加类型检查。关闭:#23684#24896hexiaoting)。
  • 修复 INSERT INFILE 查询语句的格式(缺少引号)。 #35886 (Azat Khuzhin).
  • 因为通过 fuzzing 发现了内存安全问题,已禁用 session_log。参见 #35714#35873Alexey Milovidov)。
  • 避免对列级 TTL 进行重复处理。 #35820 (Azat Khuzhin).
  • 修复在一次插入查询中包含多个分区数据时向 Object 类型列插入数据的问题。#35806 (Anton Popov).
  • 修复 -WithNames 格式中未出现列的索引错误,当列数超过 256 时会导致报错 INCORRECT_NUMBER_OF_COLUMNS。关闭 #35793#35803 (Kruglov Pavel).
  • 修复 #35751#35799Nikolay Degterinsky)。
  • 修复以 Snappy 格式从 HDFS 读取时的问题。 #35771 (shuchaome)。
  • 修复了从自定义类型转换为字符串时的缺陷,该缺陷可能导致段错误或意外的错误信息。关闭 #35752#35755Kruglov Pavel)。
  • 修复 ANY/ALL 子查询的实现。关闭 #35489#35727Kseniia Sumarokova)。
  • 修复在 clickhouse-local 中删除非空数据库的问题。关闭 #35692#35711Kseniia Sumarokova)。
  • 修复了服务器重启后带子查询的物化视图创建相关的错误。服务器重启后,对基础表执行插入操作时,物化视图不会更新。关闭 #35511#35691Kruglov Pavel)。
  • 修复在读取实验性类型 Object 的子列时可能出现的 Can't adjust last granule 异常。 #35687 (Anton Popov).
  • 默认启用支持 JIT 编译的构建。 #35683 (Maksim Kita).
  • 修复实验性类型 Object 中可能出现的子列丢失问题。#35682Anton Popov)。
  • 修复 ASOF JOIN 键可空性检查,关闭 #35565#35674Vladimir C)。
  • 修复带有 projection 的 part 的检查逻辑。当 projection 与主 part 的类型不同时会产生错误。这与 https://github.com/ClickHouse/ClickHouse/pull/33774 类似。该缺陷已由 @caoyang10 修复。#35667Amos Bird)。
  • 修复在向 format 函数传入大量参数时导致的服务器崩溃。请参考测试文件了解如何复现该崩溃。#35651 (Amos Bird).
  • 修复异步插入中的配额使用问题。#35645 (Anton Popov).
  • 修复带别名的位置参数。关闭问题 #35600#35620Kseniia Sumarokova)。
  • 在 URL 引擎中进行 schema 推断之前检查 remote_url_allow_hosts。修复了 #35064#35619Kruglov Pavel)。
  • 修复在使用 LowCardinality 类型列时的 HashJoin 问题。此更改关闭了 #35548#35616Antonio Andelic)。
  • 修复 MaterializedPostgreSQL 中可能出现的段错误:如果在将内存中收集的数据同步到底层表时发生异常,可能会触发该段错误。已关闭 #35611#35614Kseniia Sumarokova)。
  • 当此前分离的表仍在使用时,为 ATTACH TABLE 查询设置 database_atomic_wait_for_drop_and_detach_synchronously 的行为不正确,现已修复。 #35594 (tavplubix).
  • 修复带命名集合的 HTTP 头部,并添加 compression_method。关闭 #35273。关闭 #35269#35593Kseniia Sumarokova)。
  • 修复 S3 引擎获取虚拟列的问题。解决 #35411#35586Kseniia Sumarokova)。
  • 修复了 caseWithExpression 的返回类型推断。现在会正确考虑 ELSE 分支的类型。#35576 (Antonio Andelic)。
  • 修复对长度超过 39 个字符的 IPv6 地址的解析。关闭 #34022#35539Maksim Kita)。
  • 修复在 IN 子句中将值转换为 IPv4、IPv6 地址时的行为。修复了 #35528#35534Maksim Kita)。
  • 修复在短路求值函数执行时,当其中一个参数为可空常量时发生的崩溃问题。关闭 #35497。关闭 #35496#35502Maksim 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#35476Kruglov Pavel)。
  • 修复在使用 S3 作为 MergeTree 的后端或作为单独的表引擎/函数时日志过多的问题。修复了 #30559#35434alesapin)。
  • 现在使用零拷贝复制(实验特性)执行的合并操作,将不再在日志中大量记录消息 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 &lt;format&gt; type &lt;type&gt; of an input column &lt;column_name&gt; 之类的潜在错误。 #35406 (Kruglov Pavel).
  • 修复远程文件系统本地缓存(实验性功能)在某些极端高并发场景下的问题。#35381Kseniia Sumarokova)。修复缓存中可能出现的死锁。#35378Kseniia Sumarokova)。
  • 修复在 WHERE 子句中与常量比较时的分区裁剪问题。如果列与常量的类型不同,则可能发生溢出,从而导致查询错误地返回空结果。此修复解决了 #35304#35334Amos 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#34795Alexandre Snarskii)。
  • 修改 toDatetime 函数在溢出时的特定实现行为。现在会饱和到 datetime 支持范围内最近的最小/最大时间点,而不再发生回绕(wraparound)。之所以将该变更标记为“不向后兼容”,是因为可能有人无意中依赖了旧行为。#32898HaiBo Li)。
  • 使 cast(value, 'IPv4')cast(value, 'IPv6') 的行为与 toIPv4toIPv6 函数相同。更改了向 toIPv4toIPv6 函数传入不正确 IP 地址时的行为,现在如果向这些函数传入无效 IP 地址,将会抛出异常;之前这些函数会返回默认值。新增函数 IPv4StringToNumOrDefaultIPv4StringToNumOrNullIPv6StringToNumOrDefaultIPv6StringOrNulltoIPv4OrDefaulttoIPv4OrNulltoIPv6OrDefaulttoIPv6OrNull。如果之前的逻辑依赖 IPv4StringToNumtoIPv4toIPv6 在无效地址时返回默认值,则应使用 IPv4StringToNumOrDefaulttoIPv4OrDefaulttoIPv6OrDefault。新增设置项 cast_ipv4_ipv6_default_on_conversion_error,如果启用该设置,则 IP 地址转换函数将保持原有行为。修复 #22825。修复 #5799。修复 #35156#35240Maksim Kita)。

新功能

  • 支持为远程文件系统本地缓存数据。可在 s3 磁盘上启用。已关闭 #28961#33717Kseniia 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')#34946lgbo)。
  • 支持通过用户的 X.509 证书对经由 SSL 连接的用户进行认证。#31484eungenue)。
  • 支持在向表函数 file/hdfs/s3/url 插入数据时自动推断 schema。#34732Kruglov Pavel)。
  • 现在可以在不对路径或 like 表达式施加限制的情况下读取 system.zookeeper 表。此类读取可能会对 zookeeper 产生较大负载,因此若要启用此能力,必须先启用设置 allow_unrestricted_reads_from_keeper#34609Sergei Trifonov)。
  • 在 clickhouse-local 中展示 CPU 和内存指标。已关闭 #34545#34605李扬)。
  • 为数组实现 startsWithendsWith 函数,已关闭 #33982#34368usurai)。
  • 为 Map 数据类型新增三个函数:1. mapReplace(map1, map2) —— 使用 map2 中对应键的值替换 map1 中相同键的值;并为 map1 中不存在的键添加来自 map2 的键。2. mapFilter 3. mapMapmapFiltermapMap 是高阶函数,接受两个参数,第一个参数是以 k、v 键值对为参数的 lambda 函数,第二个参数是 Map 类型的列。#33698hexiaoting)。
  • 允许从环境变量 CLICKHOUSE_USERCLICKHOUSE_PASSWORD 中获取 clickhouse-client 的默认用户和密码。已关闭 #34538#34947DR)。

实验特性

  • 新的数据类型 Object(<schema_format>),支持存储半结构化数据(目前仅支持 JSON)。数据以字符串形式写入该类型。随后会根据半结构化数据的格式抽取所有路径,并以能够存储其所有值的最优类型写入为单独的列。这些列可以通过与源数据路径匹配的名称进行查询,例如 data.key1.key2,或使用强制转换操作符 data.key1.key2::Int64
  • 新增 database_replicated_allow_only_replicated_engine 设置。启用后,在 Replicated 数据库中只允许创建 Replicated 表或无状态引擎的表。#35214Nikolai 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 时提升其性能;提升 detectCharsetdetectLanguageUnknown 函数的性能。#34888 (Maksim Kita)。
  • 通过增加批处理提升 any 聚合函数的性能。#34760 (Raúl Marín)。
  • 多项 clickhouse-keeper 性能改进:减少加锁 #35010 (zhanglistar),通过对快照进行流式读写而非完整拷贝来降低内存占用 #34584 (zhanglistar),优化 RAFT 实现中日志存储的压缩 #34534 (zhanglistar),以及内部数据结构的版本管理 #34486 (zhanglistar)。

改进

  • 支持对表函数的异步插入。修复 #34864#34866Anton Popov)。
  • 为函数 dictGetHierarchydictIsIndictGetChildrendictGetDescendants 的键参数添加了隐式类型转换。修复了 #34970#35027Maksim Kita)。
  • EXPLAIN AST 查询可以以 Graphviz 图形格式输出 AST:EXPLAIN AST graph = 1 SELECT * FROM system.parts#35173 (李扬)。
  • 当使用 s3 表函数或表引擎写入大文件时,由于 AWS SDK 中的一个缺陷,这些文件的内容类型(Content-Type)被错误地设置为 application/xml。此修复关闭了 #33964#34433Alexey Milovidov)。
  • 对限制性行策略进行了小幅调整,使其在简单场景下更易作为宽松策略的替代方案。如果某个表仅存在限制性策略(没有宽松策略),用户仍然能够看到部分行。此外,SHOW CREATE ROW POLICY 在行策略定义中将始终显示 AS permissiveAS restrictive#34596Vitaly Baranov)。
  • 通过在 File/S3/HDFS/URL 引擎中使用 glob 模式改进 schema 推断。如果出错,则尝试使用下一个路径进行 schema 推断。#34465 (Kruglov Pavel).
  • Play UI 现在可以正确检测并遵循操作系统中的首选浅色或深色主题。#35068 (peledni)。
  • 已添加 date_time_input_format = 'best_effort_us'。关闭了 #34799#34982WenYao)。
  • 在服务器配置中新增了两个名为 allow_plaintext_passwordallow_no_password 的设置,用于开启或关闭在某些环境下可能不安全的身份验证类型。默认情况下它们是启用的。#34738 (Heena Bansal)。
  • Arrow 格式中添加对 DateTime64 数据类型的支持,并关闭 #8280#28574#34561李扬)。
  • 在配置更新时重新加载 remote_url_allow_hosts(用于过滤出站连接)。#35294Nikolai Kochetov)。
  • clickhouse-local 新增对 --testmode 参数的支持。该参数用于解释我们在功能测试中使用的测试提示。#35264 (Kseniia Sumarokova)。
  • 在查询日志中添加 distributed_depth。它类似于 is_initial_query 的更详细版本 #35207李扬)。
  • 使 MySQLPostgreSQL 表函数遵守 remote_url_allow_hosts 设置。 #35191 (Heena Bansal).
  • system.part_log 添加了 disk_name 字段。 #35178 (Artyom Yurkov).
  • 在查询远程 URL 时,不要对不可重试的错误进行重试。关闭了 #35161#35172Kseniia Sumarokova)。
  • 通过设置 parallel_distributed_insert_select,支持在表函数 view() 中执行分布式 INSERT SELECT 查询。#35132 (Azat Khuzhin).
  • 在将数据 INSERT 到包含 AggregateFunctionBuffer 时,实现了更精确的内存跟踪。 #35072 (Azat Khuzhin).
  • 在 Linux 内核存在缺陷的情况下,避免在 Query Profiler 中发生除零错误。关闭 #34787#35032Alexey Milovidov)。
  • 为 keeper 配置添加了更多合理性检查:现在不允许将 localhost 与非本地服务器混用,并且增加了对内部 Raft 端口与 keeper 客户端端口相同情况的检查。#35004 (alesapin)。
  • 当前情况下,如果用户修改系统表的设置,会产生大量日志,并且 ClickHouse 会每分钟重命名这些表。本更改修复了 #34929#34949Nikita Mikhaylov)。
  • 为 Hive metastore 客户端启用连接池。#34940 (lgbo).
  • CREATE TABLE AS 中,如果新表的表引擎不支持按列 TTL(即表引擎不属于 MergeTree 系列),则会忽略该按列 TTL 设置。 #34938 (Azat Khuzhin).
  • 允许在 ngrambf_v1/tokenbf_v1 索引中使用 LowCardinality 字符串列。修复 #21865#34911Lars Hiller Eidnes)。
  • 如果文件不存在,也允许打开一个空的 SQLite 数据库。关闭 #33367#34907Kseniia Sumarokova)。
  • 为 FreeBSD 实现内存统计,以便 max_server_memory_usage 能够正常工作。#34902 (Alexandre Snarskii)。
  • 在早期版本中,clickhouse-client 中的进度条有时会在没有任何原因的情况下突然向前跳到接近 50%。此更改修复了问题 #34324#34801Alexey Milovidov)。
  • 现在,当 columnXALIAS 列时,在 MergeTree 表引擎上执行的 ALTER TABLE DROP COLUMN columnX 查询将会立即完成。修复了 #34660#34786alesapin)。
  • 当用户拼错数据跳过索引名称时显示提示信息。修复了 #29698#34764flynn)。
  • parallel_distributed_insert_select 现在支持 remote()/cluster() 表函数。#34728 (Azat Khuzhin)。
  • 当配置文件中相应配置为空时,不要重置通过 --log-file/--errorlog-file 命令行选项配置的日志。 #34718 (Amos Bird).
  • 仅在创建表时提取一次 schema,并禁止在每次服务器启动时通过读取本地文件或外部源来提取 schema。#34684 (Kruglov Pavel).
  • 允许为可执行 UDF 指定参数名称。对于参数名称是序列化一部分的格式(例如 NativeJSONEachRow),这是必要的。关闭 #34604#34653Maksim Kita)。
  • MaterializedMySQL(实验性功能)现在支持 materialized_mysql_tables_list(一个以逗号分隔的 MySQL 数据库表名列表,这些表将由 MaterializedMySQL 数据库引擎复制。默认值:空列表 — 表示将复制所有表),详见 #32977#34487zzsmdfj)。
  • 改进在分布式表上执行 INSERT 操作时的 OpenTelemetry span 日志。#34480 (Frank Chen).
  • 使 ClickHouse Keeper 中各服务器上的 znode ctimemtime 保持一致。#33441 (小路).

构建/测试/打包改进

  • 将软件包仓库迁移到 JFrog Artifactory(Mikhail f. Shiryaev)。
  • 在功能测试中随机化部分设置,以便覆盖更多可能的配置组合。这是另一种模糊测试方法,用于提升测试覆盖率。已关闭 #32268#34092Kruglov Pavel)。
  • 在我们的 CI 中移除 PVS-Studio。#34680Mikhail f. Shiryaev)。
  • 新增通过 CMake 构建精简二进制文件的能力。在之前的版本中,这是通过 dh-tools 完成的。#35196alesapin)。
  • 体积更小的“精简版” clickhouse-keeper 构建。#35031alesapin)。
  • 对于类似 https://github.com/ClickHouse/ClickHouse/pull/34685 的 PR,使用 @robot-clickhouse 作为作者和提交者。#34793Mikhail f. Shiryaev)。
  • 将调试信息的 DWARF 版本上限限制为 4,因为我们的内部栈符号解析器无法解析 DWARF 版本 5。如果你使用 clang-15 编译 ClickHouse,这样做是有意义的。#34777Alexey Milovidov)。
  • 移除 clickhouse-test debian 软件包,以避免不必要的复杂性。CI 使用来自代码仓库的测试,通过 deb 包进行的独立测试不再受支持。#34606Ilya Yatsishin)。

Bug 修复(在官方 stable 或 prestable 版本中对用户可见的异常行为)

  • 针对 HDFS 集成的修复:当内部缓冲区大小过小时,HadoopSnappyDecoder 中的 NEED_MORE_INPUT 会针对同一个压缩块被触发多次(>=3 次)。这会导致输入数据被拷贝到 HadoopSnappyDecoder::buffer 中错误的位置。#35116 (lgbo)。
  • 在 ATTACH GRANT 语句中忽略过时的授权。本 PR 修复了 #34815#34855Vitaly Baranov)。
  • 修复在 Postgres 数据库中,当数据库是使用命名集合创建时,获取 CREATE TABLE 查询会导致的段错误(segfault)问题。关闭 #35312#35313Kseniia Sumarokova)。
  • 修复部分合并连接中产生重复行的 Bug,关闭 #31009#35311Vladimir C)。
  • 修复在使用 bzip2 压缩且 max_read_buffer_size 设置值较小时,可能出现的 Assertion 'position() != working_buffer.end()' failed 问题。该 bug 在 https://github.com/ClickHouse/ClickHouse/pull/35047 中被发现。#35300Kruglov Pavel)。修复在使用 lz4 压缩且 max_read_buffer_size 设置值较小时可能出现的问题。#35296Kruglov Pavel)。修复在使用 lzma 压缩且 max_read_buffer_size 设置值较小时可能出现的问题。#35295Kruglov Pavel)。修复在使用 brotli 压缩且 max_read_buffer_size 设置值较小时可能出现的问题。该 bug 在 https://github.com/ClickHouse/ClickHouse/pull/35047 中被发现。#35281Kruglov Pavel)。
  • 修复 JSONEachRow 模式推断时可能出现的段错误。 #35291 (Kruglov Pavel)。
  • 修复在表中启用稀疏列时的 CHECK TABLE 查询。 #35274 (Anton Popov).
  • 在从远程 VFS 读取出现异常时,避免调用 std::terminate#35257 (Azat Khuzhin).
  • 修复从配置文件读取端口的逻辑,关闭 #34776#35193Vladimir C)。
  • 修复了在包含 WITH TOTALS 的查询中,当 HAVING 返回空结果时发生的错误。此更改修复了 #33711#35186Amos Bird)。
  • 修复 replaceRegexpAll 的一个边界条件问题,关闭 #35117#35182Vladimir C)。
  • 在使用 INSERT INTO FUNCTION s3(...) FROM ... 的情况下,Schema 推断未正常工作,它尝试从 s3 文件中读取 Schema,而不是从 SELECT 查询中读取。 #35176 (Kruglov Pavel).
  • 修复 MaterializedPostgreSQL(实验性特性)中 table overrides(用于 partition by 等)的行为。关闭 #35048#35162Kseniia Sumarokova)。
  • 修复 MaterializedPostgreSQL(实验特性)在手动移除表(DETACH TABLE)后,再通过将新表加入复制(ATTACH TABLE)时的行为问题。关闭 #33800。关闭 #34922。关闭 #34315#35158Kseniia Sumarokova)。
  • 修复在与 IN 运算符配合使用非单调函数时出现的分区裁剪错误。这修复了 #35136#35146Amos 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#35079qieqieplus)。
  • 修复在存在针对表函数的异步插入操作时,从 system.asynchronous_inserts 表中读取的问题。 #35050 (Anton Popov).
  • 修复可能出现的异常 Reading for MergeTree family tables must be done with last position boundary(与在远程 VFS 上执行的操作相关)。修复 #34979#35001Kseniia Sumarokova)。
  • 修复在窗口帧中使用 -State 类型聚合函数时产生的非预期结果。#34999 (metahys).
  • 修复 FileLog 中可能发生的段错误(实验性功能)。关闭 #30749#34996Kseniia Sumarokova)。
  • 修复一个可能会出现的罕见错误 Cannot push block to port which already has data#34993 (Nikolai Kochetov).
  • 修复 CSV 中未加引号日期的 schema 误判。关闭 #34768#34961Kruglov Pavel)。
  • Integration with Hive: 修复在 Hive 查询的 WHERE 子句中使用 IN 时出现的意外结果。#34945 (lgbo)。
  • 避免 ClickHouse Keeper 在查找待删除的 changelog 文件时进行忙轮询。 #34931 (Azat Khuzhin).
  • 修复从 PostgreSQL 到 DateTime64 的转换。关闭 #33364#34910Kseniia 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 函数在包含常量列时导致查询失败的错误。#34743Bharat Nallan)。
  • 修复在启用 fsync_part_directory 和垂直合并(vertical merge)时出现的 No such file or directory 错误。#34739 (Azat Khuzhin).
  • 修复在配合 ON CLUSTER 使用时,系统查询 RELOAD MODELRELOAD FUNCTIONRESTART DISK 的序列化/打印问题。修复了 #34514#34696Maksim 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 限制行为不一致的问题。#34078Chao 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 中的文件时会抛出异常。尝试向使用带后缀名(因而不支持追加,如 ParquetORC)的格式的文件追加数据时会抛出异常。关闭 #31640#31622#23862#15022#16674#33302Kruglov Pavel)。
  • MergeTree/ReplicatedMergeTree 中新增一个设置项,允许用户提供自定义去重语义。如果提供了该设置,将使用其指定的值而不是数据摘要来生成块 ID。这样,例如在每条 INSERT 语句中为该设置提供一个唯一值,用户就可以避免对相同的插入数据进行去重。此更改关闭了 #7461#32304Igor Nikonov)。
  • 为 INSERT 语句添加对 DEFAULT 关键字的支持。修复 #6331#33141Andrii Buriachevskyi)。
  • CREATE TABLE 查询中添加了 EPHEMERAL 列修饰符。已关闭 #9436#34424 (yakov-olkhovskiy)。
  • TTL expr TO [DISK|VOLUME] [IF EXISTS] 'xxx' 功能增加对 IF EXISTS 子句的支持。只有当对应磁盘或卷在副本上实际存在时,数据部分才会被移动到该磁盘或卷,因此 MOVE TTL 规则能够依据各副本当前的存储策略,在不同副本上表现出不同的行为。解决 #34455#34504Anton Popov)。
  • 允许设置默认表引擎,并在未指定 ENGINE 时创建表。#34187 (Ilya Yatsishin)。
  • 新增表函数 format(format_name, data)#34125 (Kruglov Pavel)。
  • 即使从 stdin 接收数据,clickhouse-local 也能根据文件名检测格式。#33829 (Kruglov Pavel).
  • values 表函数添加 schema 推断功能。修复 #33811#34017Kruglov Pavel)。
  • 在重新加载配置时动态刷新服务器 TLS 证书。修复了 #15764#15765johnskopis)。#31257Filatenkov Artur)。
  • 现在,ReplicatedMergeTree 在部分磁盘损坏时也能恢复数据。#13544Amos Bird)。
  • clickhouse-client 中的容错连接:clickhouse-client ... --host host1 --host host2 --port port2 --host host3 --port port --host host4#34490 (Kruglov Pavel)。#33824 (Filippov Denis)。
  • 为实现 MySQL 兼容性,新增 DEGREESRADIANS 函数。#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#33467SuperDJY)。
  • 添加了对将 #!# 识别为单行注释起始标记的支持。解决了 #34138#34230Aaron Katz)。

实验性功能

  • 用于文本分类的函数:语言和字符集检测。参见 #23271#33314Nikolay Degterinsky)。
  • MemoryTracker 添加内存超额分配支持。新增用于内存限制的 guaranteed 设置,用于表示软内存限制。当达到硬内存限制时,MemoryTracker 尝试取消超额分配最多的查询。新的设置 memory_usage_overcommit_max_wait_microseconds 指定查询在等待其他查询停止时最多可以等待多长时间。关闭了 #28375#31182Dmitry Novik)。
  • 在 WindowView 中启用流与表之间的 JOIN。#33729vxider)。
  • MaterializedMySQL 中支持 SETYEARTIMEGEOMETRY 数据类型(实验性功能)。修复 #18091#21536#26361#33429zzsmdfj)。
  • 修复在默认启用投影时的各种问题。每个问题都在单独的提交中进行了说明。针对 #33678,并修复了 #34273#34305Amos Bird)。

性能改进

  • 当排序键的前缀已经排好序时,支持使用 optimize_read_in_order。例如,如果表中的排序键为 ORDER BY (a, b),并且查询包含 WHERE a = const ORDER BY b 子句,现在将会按照排序键的顺序读取数据,而不是执行完整排序。#32748 (Anton Popov)。
  • 提升向表函数 URLS3FileHDFS 执行分区插入操作时的性能。关闭 #34348#34510 (Maksim Kita)。
  • 对 clickhouse-keeper 进行了多项性能改进。 #34484 #34587 (zhanglistar).
  • FlatDictionary 提高了字典数据加载性能。#33871 (Maksim Kita)。
  • 提升 mapPopulateSeries 函数的性能。关闭 #33944#34318Maksim Kita)。
  • 在类文件型表引擎中,_file_path 虚拟列被设置为 LowCardinality,从而加速对多个文件的查询。解决了 #34300#34317flynn)。
  • 加速数据部分的加载。之前该过程没有并行化:设置 part_loading_threads 不会产生任何效果。参见 #4699#34310alexey-milovidov)。
  • 提升 LineAsString 格式的性能。解决了 #34303#34306alexey-milovidov)。
  • 优化 quantilesExact{Low,High},改为使用 nth_element 替代 sort#34287Danila 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#33516Maksim Kita)。
  • 对于针对 S3 的插入和合并操作,尽可能并行写入文件(TODO:检查是否已合并)。#33291 (Nikolai Kochetov)。
  • 提升 clickhouse-keeper 的性能,并修复 NuRaft 库中的多处内存泄漏。#33329 (alesapin).

改进

  • clickhouse-client 中支持对包含内联数据的查询进行异步插入。#34267 (Anton Popov)。
  • 函数 dictGetdictHas 会在键参数类型与字典键结构类型不同时,隐式将键参数转换为字典键结构类型。#33672Maksim Kita)。
  • range_hashed 字典进行了改进。在存在多个属性时提升了加载性能。允许创建没有属性的字典。新增选项用于指定当区间的 startendNullable 类型时的策略,convert_null_range_bound_to_open 的默认值为 true。修复了 #29791。允许将 FloatDecimalDateTime64Int128Int256UInt128UInt256 用作区间类型。RangeHashedDictionary 增加了对超出 Int64 类型范围的区间值的支持。修复了 #28322。新增选项 range_lookup_strategy 用于指定区间查找类型(minmax),默认值为 min。修复了 #21647。修正了已分配字节数的计算。修正了在 ComplexKeyHashedDictionary 场景下 system.dictionaries 中的类型名称。#33927 (Maksim Kita)。
  • 现在,flathashedhashed_array 字典支持在属性为空时创建,并支持读取键以及使用 dictHas。修复了 #33820#33918Maksim Kita)。
  • 在字典中新增了对 DateTime64 数据类型的支持。#33914Maksim Kita)。
  • 支持写成 s3(url, access_key_id, secret_access_key)(会自动检测数据格式和表结构,但需要显式提供凭证)。 #34503 (Kruglov Pavel).
  • 按照 #34362 的建议,新增了将输出格式回传给客户端的功能,方式与 HTTP 协议相同。关闭 #34362#34499Vitaly 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 权限。#34489Vitaly Baranov)。
  • 允许将任意大的文件导出到 s3。添加两个新设置项:s3_upload_part_size_multiply_factors3_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#34422alesapin)。
  • 在使用 URL 存储 / 表函数配合通配符(glob)时,允许跳过返回 404(未找到)的 URL。同时修复了 #34359#34392Kseniia Sumarokova)。
  • clickhouse-local 设置默认的输入和输出格式,可通过 --input-format 和 --output-format 覆盖。关闭 #30631#34352 (李扬)。
  • clickhouse-format 添加选项,从而解决 #30528 中的 max_query_sizemax_parser_depth 问题。#34349 (李扬)。
  • 在客户端启动前更好地处理预先输入。相关问题:#34308#34336Amos Bird)。
  • 为了与 PostgreSQL 兼容,添加 REGEXP_MATCHESREGEXP_REPLACE 函数别名。关闭 #30885#34334李扬)。
  • 某些服务器要求 HTTP 请求中包含 User-Agent 头部字段。已在 HTTP 请求中添加形式如下的 User-Agent 头部字段:User-Agent: ClickHouse/VERSION_STRING。 #34330 (Saad Ur Rahman)。
  • 在获取 TRUNCATE 查询所需的表锁之前取消合并操作,以在某些情况下避免出现 DEADLOCK_AVOIDED 错误。修复了 #34302#34304tavplubix)。
  • 更改日志中“Cancelled merging parts”消息的严重性级别,因为它并不是错误。这解决了 #34148#34232alexey-milovidov)。
  • 添加对将 PostgreSQL 风格的类型转换运算符 :: 与使用 []. 运算符(数组和元组索引)的表达式组合使用的支持。#34229 (Nikolay Degterinsky)。
  • parseDateTimeBestEffort 函数中支持识别 YYYYMMDD-hhmmss 格式。修复了 #34206#34208alexey-milovidov)。
  • 在使用 Regexp 格式进行解析时,允许在行内出现回车符。此更改关闭了 #34200#34205alexey-milovidov)。
  • 允许将字典的 PRIMARY KEY 解析为 PRIMARY KEY (id, value);之前只支持 PRIMARY KEY id, value。关闭 #34135#34141Maksim Kita)。
  • splitByChar 添加一个可选参数,以限制生成元素的数量。关闭 #34081#34140 (李扬)。
  • 改进 clickhouse-client 的多行编辑使用体验。这是对 #31123 的后续更新。#34114Amos Bird)。
  • MsgPack 输入/输出格式中添加对 UUID 的支持。#34065 (Kruglov Pavel)。
  • 用于 OpenTelemetry 的跟踪上下文现在会通过 gRPC 客户端元数据进行传递(此更改适用于 gRPC 客户端-服务器协议)。 #34064 (andremarianiello).
  • 支持所有类型、带有 ON CLUSTER 子句的 SYSTEM 查询。 #34005 (小路).
  • 改进对内存占用低于 max_untracker_memory 的查询的内存记账。 #34001 (Azat Khuzhin).
  • 修复了 UTF-8 字符串在进行不区分大小写搜索时的错误:当同一字符的大写和小写使用不同字节数表示时会出错,例如 ß。此修复关闭了 #7334#33992Harry Lee)。
  • clickhouse-local 中支持从 stdin 自动检测格式和 schema。 #33960 (Kruglov Pavel)。
  • 正确处理多个磁盘在文件系统上使用相同路径时的错误配置情况。#29072#33905zhongyuankai)。
  • 在获取 S3 代理时尝试每个解析得到的 IP 地址。S3 代理很少被使用,主要用于 Yandex Cloud。#33862Nikolai 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#33737Kruglov Pavel)。
  • 以大端序解析并存储 OpenTelemetry trace-id。#33723Frank Chen)。
  • 改进了 fromUnixTimestamp64 系列函数。它们现在可以接受任何可转换为 Int64 的整数值。相关问题已关闭:#14648#33505Andrey Zvonov)。
  • _shard_num 的常量实现(参见 #7624)改为使用 shardNum() 函数(参见 #27020),以避免潜在问题(例如在 #16947 中发现的问题)。#33392Azat Khuzhin)。
  • 在 Decimal 和 Float 类型之间启用二元算术运算(加、减、乘、除、least、greatest)。 #33355 (flynn)。
  • max_threads 自动检测时考虑 cgroups 限制。#33342 (JaySon).
  • 新增 clickhouse-keeper 设置项 min_session_timeout_ms。现在 clickhouse-keeper 会根据 min_session_timeout_mssession_timeout_ms 这两个设置来确定客户端会话超时时间。#33288 (JackyWoo).
  • 为函数 hexbin 新增了对 UUID 数据类型的支持。#32170 (Frank Chen).
  • 修复了对名称中包含点号的子列的读取逻辑。尤其是,当 Nested 列的元素名称包含点号时的读取问题(例如 Nested(`keys.name` String, `keys.id` UInt64, values UInt64))。#34228Anton 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-test Debian 包。#33948 (Ilya Yatsishin).
  • 对构建系统进行多项改进,消除偶然使用操作系统软件包的可能性,并强制实现封闭(hermetic)构建。#33695 (Amos Bird).

Bug 修复(在官方 stable 或 prestable 版本中用户可见的异常行为)

  • 修复了在使用 allow_experimental_parallel_reading_from_replicasmax_parallel_replicas 等于 1 时出现的断言失败问题。此修复解决了 #34525#34613Nikita Mikhaylov)。
  • 修复在读取空数组时的一个罕见 bug,该 bug 可能会导致 Data compressed with different methods 错误。如果数据中大部分是空数组,在某些情况下(但并非总是)就可能复现该问题,并且读取是按 ORDER BY ... DESC 倒序进行时才会触发。此错误发生的概率极低。#34327Anton Popov)。
  • 修复在对窄整数类型的整数值进行取整时,round/roundBankers 返回错误结果的问题。修复 #33267#34562李扬)。
  • 有时在从 S3 或 HDFS 读取多个文件时,取消查询操作不会立即生效。修复 #34301,相关问题 #34397#34539Dmitry Novik)。
  • 修复在 optimize_aggregation_in_order = 1distributed_aggregation_memory_efficient = 0 时出现的异常 Chunk should have AggregatedChunkInfo in MergingAggregatedTransform。修复问题 #34526#34532Anton Popov)。
  • 修复索引分析中整数与浮点数比较的问题。此前该问题可能会导致在读取时错误跳过某些 granule。修复了 #34493#34528Anton Popov)。
  • 修复 URL 引擎对压缩的支持。 #34524 (Frank Chen).
  • 修复在文件 schema 自动检测中可能出现的错误 'file_size: Operation not supported'。#34479 (Kruglov Pavel)。
  • 修复了在删除表时可能出现的潜在竞争条件。#34416 (Kseniia Sumarokova)。
  • 修复在短路函数求值过程中可能出现的 Cannot convert column Function to mask 错误。关闭 #34171#34415Kruglov Pavel)。
  • 修复了基于 URL 源进行 schema 推断时可能出现的崩溃。关闭 #34147#34405Kruglov Pavel)。
  • 此前对 UDF 的访问权限检查错误地在数据库级别进行,而不是按应有的在全局级别进行。修复了 #34281#34404Maksim Kita)。
  • 修复了在针对使用 Memory 引擎的数据库执行 SHOW CREATE DATABASE 查询时,结果中错误的引擎语法。此更改解决了 #34335#34345alexey-milovidov)。
  • 修复了几个极少出现的竞争条件,这些情况可能导致复制队列状态异常并触发“intersecting parts”错误。 #34297 (tavplubix).
  • 修复进度条宽度。此前错误地被四舍五入为整数个字符。#34275alexey-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).
  • 修复 HDFSS3URL 存储引擎中一种罕见且无害的竞争条件,该问题可能会导致建立额外的连接。#34172 (alesapin)。
  • 修复一个罕见的错误:在读取将数据存储在远程文件系统(例如 S3)上的 MergeTree 表引擎族的 LowCardinality 列时,可能会导致出现 “Cannot read all data” 错误(基于 S3 的虚拟文件系统是处于实验阶段、尚未准备好用于生产环境的特性)。 #34139 (alesapin).
  • 在更改原生协议时修复向分布式表插入数据的问题。上一次更改是在 22.1 版本中,因此在升级到该版本后,向分布式表插入数据可能会出现一些失败。#34132Anton Popov)。
  • 修复在 File 表引擎中由 #33960 引入的潜在数据竞争问题。关闭 #34111#34113Kruglov Pavel)。
  • 修复了一个较小的竞态条件,该问题在 ZooKeeper 连接丢失后极少数情况下可能导致“intersecting parts”错误。 #34096 (tavplubix).
  • 修复使用 Native 格式的异步插入。#34068Anton Popov)。
  • 修复了一个错误,该错误会导致在同时使用 replicated access storage 和 keeper(嵌入在 clickhouse-server 中)时服务器无法启动。为 keeper 的 socket 超时时间新增了两个配置,用于替代默认用户中的相关设置:keeper_server.socket_receive_timeout_seckeeper_server.socket_send_timeout_sec。修复了 #33973#33988alesapin)。
  • 修复在解析页脚已损坏的 ORC 文件时出现的段错误。关闭 #33797#33984Kruglov Pavel)。
  • 修复了从查询参数(预处理语句)解析 IPv6 的问题,并修复了 IPv6 转换为字符串的问题。关闭了 #33928#33971Kruglov Pavel)。
  • 修复在读取嵌套元组时发生的崩溃。修复了 #33838#33956Anton Popov)。
  • 修复在分布式查询中对带字面量参数的 arraytuple 函数的使用处理。此前可能会导致抛出 Not found columns 异常。#33938 (Anton Popov).
  • 聚合函数组合器 -If 无法正确处理作为过滤条件的 Nullable 参数。已修复 #27073#33920alexey-milovidov)。
  • 修复在进行远程磁盘读取时可能出现的竞态条件(基于 S3 的虚拟文件系统是实验性特性,尚未准备好用于生产环境)。#33912 (Amos Bird)。
  • 修复在使用具有非标识符参数的 lambda 创建 SQL UDF 时发生的崩溃问题。修复 #33866#33868Maksim Kita)。
  • 修复稀疏列的使用(可通过实验性设置 ratio_of_defaults_for_sparse_serialization 启用)。#33849Anton Popov)。
  • 修复了在副本实际为只读时,执行 SYSTEM RESTORE REPLICA 查询却返回逻辑错误 replica is not readonly 的问题。修复了 #33806#33847tavplubix)。
  • 修复在启用压缩(默认)时 clickhouse-keeper 中的内存泄漏。#33840 (Azat Khuzhin).
  • 修复在没有可用通用类型时的索引分析问题。#33833 (Amos Bird).
  • 修复 JSONEachRowJSONCompactEachRow 的模式推断问题。 #33830 (Kruglov Pavel).
  • 修复在使用 redis 源且键数量较大时外部字典的相关问题。#33804 (Anton Popov)。
  • 修复客户端中的 bug,该 bug 会导致服务端出现 'Connection reset by peer' 错误。关闭 #33309#33790Kruglov Pavel)。
  • 修复对 INSERT INTO ... VALUES SETTINGS ... (...), ... 查询的解析 (#33776) (Kruglov Pavel).
  • 修复在使用宽格式和 Projection 创建数据部分时对表进行检查时的 bug。 #33774 (李扬).
  • 修复 MergeTree 中 count()INSERT/合并/... 操作之间的轻微竞态条件(在启用 optimize_trivial_count_querySELECT 查询中,可能会返回不正确的行数)。 #33753 (Azat Khuzhin).
  • 当 storage HDFS 中的目录列举请求失败时抛出异常。#33724 (LiuNeng)。
  • 修复在包含 projections 的表上执行 mutation 时的问题。修复了 #33010。修复了 #33275#33679Amos Bird)。
  • 在命名 HTTP 会话中执行 CREATE TEMPORARY TABLE AS SELECT 查询时,能够正确确定当前数据库。这是一个极少见的场景。修复了 #8340#33676alexey-milovidov)。
  • 允许某些包含排序、LIMIT BY、ARRAY JOIN 和 lambda 函数的查询。这修复了 #7462#33675alexey-milovidov)。
  • 修复“zero copy replication”中的一个缺陷(该功能仍在开发中,不应在生产环境中使用),该缺陷会在执行 TTL 移动操作时导致数据重复。修复 #33643#33642alesapin)。
  • 修复在 optimize_aggregation_in_order = 1 情况下,GroupingAggregatedTransform 中的 Chunk 应包含 AggregatedChunkInfo 却未包含的问题。 #33637 (Azat Khuzhin).
  • 修复错误 Bad cast from type ... to DB::DataTypeArray,该错误可能在表中存在名称中包含点的 Nested 列且为其生成默认值时发生(例如在插入数据时,当未在列列表中指定该列)。这是对 #28762 的延续。#33588Alexey Pavlenko)。
  • 导出为 lz4 文件的功能已修复。已关闭 #31421#31862Kruglov Pavel)。
  • 修复在 group_by_overflow_mode 被设置为 any(近似 GROUP BY),且按单个 LowCardinality 类型列进行聚合时的潜在崩溃问题。 #34506 (DR).
  • 修复通过 gRPC 客户端-服务端协议向临时表插入数据的问题。修复了 #34347 中的 #2 号问题。 #34364Vitaly Baranov)。
  • 修复问题 #19429#34225Vitaly Baranov)。
  • 修复问题 #18206#33977Vitaly Baranov)。
  • 此 PR 允许在同一个用户目录列表中使用多个 LDAP 存储。此前该功能是可用的,但后来由于 LDAP 测试被禁用(它们属于 TestFlows 测试的一部分)而失效。#33574 (Vitaly Baranov)。

ClickHouse 发布 v22.1,2022-01-18

升级说明

  • leftright 函数之前只是在解析器中实现的,现在已实现为完整功能的函数。包含未使用别名的 leftright 函数的分布式查询,如果集群中包含不同版本的 clickhouse-server,可能会抛出异常。如果在升级集群时遇到该错误,应先完成整个集群的升级,以确保所有节点运行相同版本。也可以在查询中为列添加别名(AS something)以避免此问题。#33407alexey-milovidov)。
  • 从该版本开始,将完整统计标量子查询的资源使用情况。随着这一更改,在标量子查询中读取的行数现在会记录到 query_log 中。如果标量子查询被缓存(重复或针对多行调用),则读取的行数只会被统计一次。此更改使得在执行标量子查询期间可以使用 KILL 终止查询并报告其执行进度。#32271Raúl Marín)。

新特性

  • 为输入格式实现数据模式推断。允许在表函数 fileurls3hdfs 以及 clickhouse-local 的参数中省略结构(或仅写 auto)。允许在为表引擎 FileHDFSS3URLMergeBufferDistributedReplicatedMergeTree(在新增副本时)编写 CREATE 语句时省略结构。 #32455 (Kruglov Pavel).
  • file/hdfs/s3/url 表函数以及 HDFS/S3/URL 表引擎中,并且同样在 SELECT INTO OUTFILEINSERT FROM INFILE 中,支持基于文件扩展名自动检测格式 #33565 (Kruglov Pavel)。关闭了 #30918#33443 (OnePiece)。
  • 用于在需要技术支持时收集诊断数据的工具。#33175 (Alexander Burmak)。
  • 通过 Zoo/Keeper 实现集群自动发现。这样就可以在不更改每台服务器配置的情况下向集群添加副本。 #31442 (vdimir)。
  • 实现 Hive 表引擎,使 ClickHouse 能访问 Apache Hive。该实现对应问题 #29245 和 PR #31104taiyang-li)。
  • 新增聚合函数 cramersVcramersVBiasCorrectedtheilsUcontingency。这些函数用于计算分类值之间的依赖程度(关联性度量)。所有这些函数的实现都基于交叉表(成对直方图)。可将其理解为适用于任意离散值(不一定是数字)的相关系数。#33366alexey-milovidov)。初始实现由 Vanyok-All-is-OKantikvist 完成。
  • 新增了表函数 hdfsCluster,可在指定集群的多个节点上并行处理来自 HDFS 的文件,类似于 s3Cluster#32400 (Zhichang Yu).
  • 新增对基于 Azure Blob Storage 的磁盘的支持,其方式类似于之前对基于 AWS S3 的磁盘的支持。#31505Jakub Kuklis)。
  • CREATE VIEW 中允许使用 COMMENT(适用于所有视图类型)。#31062 (Vasily Nemkov)。
  • 在配置发生变更时动态重新初始化监听端口和协议。#30549 (Kevin Michel)。
  • 新增了 leftrightleftUTF8rightUTF8 函数。修复了 substringUTF8 函数在使用负偏移量(从字符串末尾开始计算的偏移)时的实现错误。#33407 (alexey-milovidov)。
  • H3 坐标系新增函数:h3HexAreaKm2h3CellAreaM2h3CellAreaRads2#33479Bharat Nallan)。
  • 新增 MONTHNAME 函数。 #33436 (usurai).
  • 新增函数 arrayLast,关闭了 #33390#33415 新增函数 arrayLastIndex#33465Maksim Kita)。
  • 新增函数 decodeURLFormComponent,与 decodeURLComponent 略有不同。关闭 #10298#33451 (SuperDJY)。
  • 允许将 GraphiteMergeTree 的汇总规则按普通/带标签指标进行拆分(可选的 rule_type 字段)。#33494Michail 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#29279Nikita Mikhaylov)。
  • 实现了稀疏序列化(sparse serialization)。对于包含大量默认值(零值)的列,它可以减少磁盘空间占用并提升部分查询的性能。可以通过设置 ratio_for_sparse_serialization 来启用。对于某列,如果其默认值数量与全部值数量的比率高于该阈值,将为其动态选择稀疏序列化。每个 part 中的每一列会固定采用某种序列化方式(默认或稀疏),但不同 part 之间可能不同。#22535Anton Popov)。
  • 为自定义 MaterializedMySQL 表结构新增 "TABLE OVERRIDE" 功能。#32325Stig Bakken)。
  • 新增 EXPLAIN TABLE OVERRIDE 查询。#32836Stig Bakken)。
  • 为 MaterializedPostgreSQL 支持 TABLE OVERRIDE 子句。RFC:#31480#32749Kseniia Sumarokova)。
  • 更改共享数据零拷贝标记的 ZooKeeper 路径。请注意,“zero-copy replication” 是一个非生产特性(仍处于早期开发阶段),无论如何都不应在生产中使用。但如果你已经使用了它,请务必留意此变更。#32061ianton-ru)。
  • 为 WINDOW VIEW 的 watch 查询新增 Events 子句支持。#32607vxider)。
  • 修复 clickhouse-keeper 中带有显式 digest 哈希的 ACL 问题:现在行为与 ZooKeeper 保持一致,并且生成的摘要始终会被接受。#33249小路)。#33246
  • 修复在分离 parts 时意外删除 projection 的问题。#32067Amos Bird)。

改进

  • 现在,对于生成早于 1970-01-01 00:00:00 的时间值的日期时间转换函数,将不会再发生溢出,而是会将结果饱和为零。#29953Amos 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#33450Wu Xueyang)。
  • system.build_options 添加更多关于当前 Git 修订版本的信息。#33431 (taiyang-li)。
  • clickhouse-local:在使用 --max_memory_usage_in_client 选项时跟踪内存。#33341 (Azat Khuzhin)。
  • 允许在函数 intervalLengthSum 中使用负区间,其长度也会被一并加总。此更改关闭了 #33323#33335alexey-milovidov)。
  • LineAsString 可以作为输出格式使用。此更改关闭了 issue #30919#33331Sergei Trifonov)。
  • 在集群配置中支持 <secure/>,作为 <secure>1</secure> 的替代形式。关闭了 #33270#33330SuperDJY)。
  • 连续按两次 Ctrl+C 将立即终止 clickhouse-benchmark,而不会等待正在执行中的查询完成。这解决了 #32586#33303alexey-milovidov)。
  • parseDateTimeBestEffort 函数中支持解析带毫秒的 Unix 时间戳。 #33276 (Ben)。
  • 允许在从外部表读取以下格式的数据时取消查询:Arrow / Parquet / ORC —— 在处理大文件并将 input_format_allow_seeks 设置为 false 时,之前无法取消查询。修复了 #29678#33238Kseniia Sumarokova)。
  • 如果表引擎支持 SETTINGS 子句,则允许以键值对形式或通过配置传递这些设置。为 MySQL 添加此支持。#33231 (Kseniia Sumarokova)。
  • 在必要时正确阻止使用 Nullable 主键。这对应于 #32780#33218Amos Bird)。
  • PostgreSQL 连接添加重试机制,以便在尚未获取到任何数据时重试。关闭 #33199#33209Kseniia Sumarokova)。
  • 校验外部字典的配置键。 #33095#33130 (Kseniia Sumarokova)。
  • clickhouse-local 中发送 profile 信息。修复 #33093#33097Kseniia Sumarokova)。
  • 短路求值:新增对函数 throwIf 的支持。修复 #32969#32973Maksim Kita)。
  • (仅影响非官方构建)。修复了在向压缩的 Decimal、String、FixedString 和 Array 列插入数据时可能发生的段错误。已关闭 #32939#32940N. Kolotov)。
  • 新增支持在 SQL 用户自定义函数中指定子查询。例如:CREATE FUNCTION test AS () -> (SELECT 1)。修复了 #30755#32758Maksim Kita)。
  • 改进 gRPC 压缩支持,解决 #28671#32747Vitaly Baranov)。
  • 在关闭服务器或分离表时,如果未启用 WAL,则刷新所有内存中的数据部件。 #32742 (nauta).
  • 允许控制 MySQL 的连接超时(此前仅支持字典源)。修复 #16669。此前默认的 connect_timeout 值较小,现在可以进行配置。#32734 (Kseniia Sumarokova)。
  • MongoDB 存储添加对 authSource 选项的支持。关闭了 #32594#32702Kseniia Sumarokova)。
  • genarateRandom 表函数中添加对 Date32 类型的支持。#32643 (nauta).
  • 新增设置 max_concurrent_select_queriesmax_concurrent_insert_queries,用于按查询类型控制并发查询。关闭 #3575#32609 (SuperDJY)。
  • 在读取 Protobuf 格式数据时,改进对存在缺失列的嵌套结构的处理。这是对 https://github.com/ClickHouse/ClickHouse/pull/31988 的后续改进。#32531Vitaly Baranov)。
  • 允许为 MongoDB 引擎使用空凭证。修复 #26267#32460Kseniia Sumarokova)。
  • 禁用窗口函数中某些可能导致异常的优化。修复 #31535。修复 #31620#32453Kseniia Sumarokova)。
  • 支持连接 MongoDB 5.0。关闭了 #31483#32416Kseniia Sumarokova)。
  • 启用 DecimalFloat 之间的比较。解决了 #22626 问题。#31966flynn)。
  • StorageExecutableStorageExecutablePoolExecutableDictionaryExecutablePoolDictionaryExecutableUserDefinedFunctions 新增了设置项 command_read_timeoutcommand_write_timeout。设置项 command_read_timeout 控制从命令 stdout 读取数据的超时时间,单位为毫秒。设置项 command_write_timeout 控制向命令 stdin 写入数据的超时时间,单位为毫秒。为 ExecutableUserDefinedFunctionExecutableDictionaryStorageExecutable 新增了设置项 command_termination_timeout。为 ExecutableUserDefinedFunction 新增了设置项 execute_direct,默认值为 true。为 ExecutableDictionaryExecutablePoolDictionary 新增了设置项 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#32965save-my-heart)。
  • 存在潜在问题,但无法被利用:在数组调整大小时可能发生整数溢出。#33024 (varadarajkumar)。

构建 / 测试 / 打包改进

  • 为 ClickHouse 的 AArch64(ARM)版本添加软件包、功能测试和 Docker 构建。#32911Mikhail f. Shiryaev)。#32415
  • 为使用 musl-libc 构建 ClickHouse 做好准备。该选项默认未启用。#33134alexey-milovidov)。
  • 使安装脚本能够在 FreeBSD 上运行。此更改关闭了 #33384#33418alexey-milovidov)。
  • 为 GitHub Actions 工作流添加 actionlint,并通过 act --list 校验工作流文件,以检查工作流语法是否正确。#33612Mikhail f. Shiryaev)。
  • 为可为空主键功能添加更多测试。补充针对不同类型和 MergeTree 系列的测试,以及随机生成数据的测试。#33228Amos Bird)。
  • 添加一个简单工具,用于在网页浏览器中可视化不稳定(flaky)测试。#33185alexey-milovidov)。
  • 为共享构建启用 hermetic build。此更改主要面向开发人员。#32968Amos Bird)。
  • libc++libc++abi 更新到最新版本。#32484Raúl Marín)。
  • 为外部 .NET 客户端(ClickHouse.Client)添加集成测试。#23230Oleg V. Kozlyuk)。
  • 将 git 信息注入 ClickHouse 可执行文件,以便可以从 ClickHouse 二进制文件中轻松获取源代码修订版本。#33124taiyang-li)。
  • 从 ConfigProcessor 中移除过时代码。Yandex 相关的特定代码已不再使用。这段代码包含一个次要缺陷,该缺陷由 Mallik Hassan#33032 中报告。此更改关闭了 #33032#33026alexey-milovidov)。

Bug 修复(官方 stable 或 prestable 版本中用户可见的错误行为)

  • 对格式解析进行了多项修复。如果 clickhouse-server 向攻击者开放写入权限,则会受到影响。特意构造的 Native 格式输入数据可能导致读取未初始化内存或进程崩溃。如果 clickhouse-server 向攻击者开放写入权限,则会受到影响。#33050Heena Bansal)。修复了 Apache Avro 二进制格式中 Apache Avro Union 类型索引越界的问题。#33022Harry Lee)。修复了在 Native 格式反序列化 LowCardinality 数据时 LowCardinality 数据中的空指针解引用问题。#33021Harry Lee)。
  • 在发送响应后,ClickHouse Keeper 处理程序会正确移除该操作。#32988 (JackyWoo).
  • 配额可能存在 off-by-one 计算错误:尚未达到配额上限,却被判定为已超出限制。此修复解决了 #31174#31656sunny)。
  • 修复了从 String 到 IPv4 或 IPv6 及其反向转换的 CAST 转换。修复了在转换失败时的错误信息。#29224 (Dmitry Novik) #27914 (Vasily Nemkov).
  • 修复了在远程服务器执行时出现的 Unknown aggregate function nothing 异常,解决了 #16689#26074hexiaoting)。
  • 修复分布式查询中对未显式指定数据库的 JOIN 使用错误数据库的问题(修复:#10471)。#33611Azat Khuzhin)。
  • 修复在第二次向文件插入数据后出现在 Apache Avro 格式中的段错误。 #33566 (Kruglov Pavel).
  • 修复当模式包含 Dictionary 类型时 Apache Arrow 格式发生的段错误问题。关闭 #33507#33529Kruglov Pavel)。
  • 对于视图来说,额外指定的 offsetlimit 设置可能会被错误地应用。已修复 #33289 #33518hexiaoting)。
  • 修复在向包含默认嵌套 LowCardinality 列的表中插入数据时可能出现的异常 Block structure mismatch。修复 #33028#33504Nikolai Kochetov)。
  • 修复了使用 DDL 创建时 range_hashed 字典中 range min 和 range max 属性的表达式。关闭 #30809#33478Maksim Kita)。
  • 修复在并发执行 DROP 操作时,向物化视图执行 INSERT 可能导致的 use-after-free(释放后使用)问题(Azat Khuzhin)。
  • 不要尝试读取超过 EOF 的数据(这是为规避 Linux 内核中的一个 bug),该 bug 可在内核版本(3.14..5.9)上复现,并且需要 index_granularity_bytes=0(即关闭自适应索引粒度)。#33372 (Azat Khuzhin)。
  • 命令 SYSTEM SUSPENDSYSTEM ... THREAD FUZZER 此前缺少访问控制,现已修复。作者:Kevin Michel。#33333 (alexey-milovidov)。
  • 修复字典的 COMMENT 未在 system.tablessystem.dictionaries 中显示的问题。支持修改 Dictionary 引擎的注释。关闭 #33251#33261Maksim Kita)。
  • 将异步插入(在启用 async_insert 设置时)添加到查询日志中。此前这类查询不会记录在查询日志中。#33239 (Anton Popov)。
  • 修复在向外部数据库发出查询时发送 WHERE 1 = 0 表达式的问题。解决 #33152#33214Kseniia Sumarokova)。
  • 修复 MaterializedPostgreSQL 的 DDL 校验。修复 materialized_postgresql_allow_automatic_update 设置,关闭 #29535#33200Kseniia Sumarokova)。确保始终清理未使用的复制槽。见 #26952#33187Kseniia Sumarokova)。修复 MaterializedPostreSQL 在分离/附加(从复制中移除/加入复制)具有非默认 schema 的表时的行为。见 #29535#33179Kseniia Sumarokova)。修复 DROP MaterializedPostgreSQL 数据库。#33468Kseniia Sumarokova)。
  • 指标 StorageBufferBytes 有时会出现计算错误。#33159 (xuyatian)。
  • 修复在启用 local_filesystem_read_prefetchremote_filesystem_read_prefetch 时,从 LowCardinality 列读取时出现的错误 Invalid version for SerializationLowCardinality key column#33046 (Nikolai Kochetov).
  • 修复 s3 表函数在读取空文件时的问题。关闭 #33008#33037Kseniia 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 中引入的。#32976Kruglov 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#32945alexey-milovidov)。
  • 修复 ORC 格式 stripe 的读取。#32929 (kreuzerkrieg).
  • topKWeightedState 在某些输入类型下会失败。#32487#32914vdimir)。
  • 修复物化视图中出现的异常 Single chunk is expected from view inner query (LOGICAL_ERROR)。修复 #31419#32862Nikolai Kochetov)。
  • 修复了从远程文件系统进行异步读取时的惰性 seek 优化。关闭 #32803#32835Kseniia Sumarokova)。
  • MergeTree 表引擎在运行中的变更过多或内存占用过高时,可能会静默跳过部分变更,此问题已修复。修复 #17882#32814tavplubix)。
  • 在处理 MV 块时避免重用标量子查询缓存。这样修复了当标量子查询引用源表时出现的一个错误,但也意味着会为每个块重新计算 MV 定义中的所有标量子查询。 #32811 (Raúl Marín).
  • 当使用 MySQL 引擎的数据库无法连接到 MySQL 服务器时,服务端可能无法启动,现已修复。修复了 #14441#32802 (tavplubix)。
  • 修复了使用 fuzzBits 函数时发生的崩溃,关闭了 #32737#32755SuperDJY)。
  • 修复在基于 Kafka/RabbitMQ 的物化视图(MV)中使用 GROUP BY (list of columns)(会被解析成 GROUP BY tuple(...))时出现的错误 Column is not under aggregate function。修复了 #32668#32744#32751Nikolai Kochetov)。
  • 修复 ALTER TABLE ... MATERIALIZE TTL 查询在 TTL ... DELETE WHERE ...TTL ... GROUP BY ... 模式下的问题。 #32695 (Anton Popov).
  • 修复在表引擎为 DistributedMerge,且其底层 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).
  • 修复了使用 CustomSeparatedTemplateRegexpMsgPackJSONAsString 格式的异步插入问题。此前,使用这些格式进行异步插入时不会读取任何数据。#32530Kruglov Pavel)。
  • 修复在分布式表上的 groupBitmapAnd 函数。#32529 (minhthucdao).
  • 修复由模糊测试发现的 JOIN 崩溃,关闭 #32458#32508vdimir)。
  • 正确处理 Apache Arrow 列重复的情况。#32507Dmitriy Mokhnatkin)。
  • 修复分布式查询中查询格式化存在歧义的问题,当某些表的列名为 ALLDISTINCT 时会导致错误。此更改修复了 #32391 中描述的问题。#32490alexey-milovidov)。
  • 修复查询在尝试使用尚未物化的跳过索引时出现的失败问题。修复了 #32292#30343#32359Anton Popov)。
  • 修复在同一列上存在超过 2 个行策略时,从同一会话中的第二条查询起会出现的 SELECT 查询错误。#31606#32291SuperDJY)。
  • 修复将带小数的 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#32201tavplubix)。
  • 修复对 APPLY lambda 列转换器的解析错误,该错误可能导致客户端或服务器崩溃。#32138 (Kruglov Pavel)。
  • 修复 base64Encode 在短字符串上会添加多余字节的问题。#31797 (Kevin Michel)。
  • 修复当窗口函数的参数为 LowCardinality 时可能发生的崩溃或错误结果。修复了 #31114#31888Nikolai Kochetov)。
  • 修复在执行命令 DROP TABLE system.query_log sync 时出现的挂起问题。#33293 (zhanghuajie).

2021 年变更日志

  • ClickHouse 22.12 版发布,2022-12-15
  • ClickHouse 发布 22.11,2022-11-17
  • ClickHouse 发行版 22.10,2022-10-25
  • ClickHouse 版本 22.9,2022-09-22
  • ClickHouse 22.8 版发布,2022-08-18
  • ClickHouse 发布 22.7,2022-07-21
  • ClickHouse 发布 22.6,2022-06-16
  • ClickHouse 发行版 22.5,2022-05-19
  • ClickHouse 发行版 22.4,2022-04-19
  • ClickHouse 发布 v22.3-lts,2022-03-17
  • ClickHouse 发布 v22.2,2022-02-17
  • ClickHouse 发布 v22.1,2022-01-18
  • 2021 年变更日志